mirror of
https://mirrors.bfsu.edu.cn/git/linux.git
synced 2024-11-13 14:24:11 +08:00
media: v4l2-ioctl: create helper to fill in v4l2_standard for ENUMSTD
Prepare for adding a new IOCTL VIDIOC_SUBDEV_ENUMSTD which would enumerate the standards for a subdevice by breaking out the code which could be shared between the video and subdevice versions of this IOCTL. Signed-off-by: Niklas Söderlund <niklas.soderlund+renesas@ragnatech.se> Signed-off-by: Hans Verkuil <hans.verkuil@cisco.com> [hans.verkuil@cisco.com: fixed 'sdandard' typos in v4l2-ioctl.h] Signed-off-by: Mauro Carvalho Chehab <mchehab+samsung@kernel.org>
This commit is contained in:
parent
39fb993038
commit
aa2f887127
@ -125,6 +125,42 @@ int v4l2_video_std_construct(struct v4l2_standard *vs,
|
||||
}
|
||||
EXPORT_SYMBOL(v4l2_video_std_construct);
|
||||
|
||||
/* Fill in the fields of a v4l2_standard structure according to the
|
||||
* 'id' and 'vs->index' parameters. Returns negative on error. */
|
||||
int v4l_video_std_enumstd(struct v4l2_standard *vs, v4l2_std_id id)
|
||||
{
|
||||
v4l2_std_id curr_id = 0;
|
||||
unsigned int index = vs->index, i, j = 0;
|
||||
const char *descr = "";
|
||||
|
||||
/* Return -ENODATA if the id for the current input
|
||||
or output is 0, meaning that it doesn't support this API. */
|
||||
if (id == 0)
|
||||
return -ENODATA;
|
||||
|
||||
/* Return norm array in a canonical way */
|
||||
for (i = 0; i <= index && id; i++) {
|
||||
/* last std value in the standards array is 0, so this
|
||||
while always ends there since (id & 0) == 0. */
|
||||
while ((id & standards[j].std) != standards[j].std)
|
||||
j++;
|
||||
curr_id = standards[j].std;
|
||||
descr = standards[j].descr;
|
||||
j++;
|
||||
if (curr_id == 0)
|
||||
break;
|
||||
if (curr_id != V4L2_STD_PAL &&
|
||||
curr_id != V4L2_STD_SECAM &&
|
||||
curr_id != V4L2_STD_NTSC)
|
||||
id &= ~curr_id;
|
||||
}
|
||||
if (i <= index)
|
||||
return -EINVAL;
|
||||
|
||||
v4l2_video_std_construct(vs, curr_id, descr);
|
||||
return 0;
|
||||
}
|
||||
|
||||
/* ----------------------------------------------------------------- */
|
||||
/* some arrays for pretty-printing debug messages of enum types */
|
||||
|
||||
@ -1753,36 +1789,8 @@ static int v4l_enumstd(const struct v4l2_ioctl_ops *ops,
|
||||
{
|
||||
struct video_device *vfd = video_devdata(file);
|
||||
struct v4l2_standard *p = arg;
|
||||
v4l2_std_id id = vfd->tvnorms, curr_id = 0;
|
||||
unsigned int index = p->index, i, j = 0;
|
||||
const char *descr = "";
|
||||
|
||||
/* Return -ENODATA if the tvnorms for the current input
|
||||
or output is 0, meaning that it doesn't support this API. */
|
||||
if (id == 0)
|
||||
return -ENODATA;
|
||||
|
||||
/* Return norm array in a canonical way */
|
||||
for (i = 0; i <= index && id; i++) {
|
||||
/* last std value in the standards array is 0, so this
|
||||
while always ends there since (id & 0) == 0. */
|
||||
while ((id & standards[j].std) != standards[j].std)
|
||||
j++;
|
||||
curr_id = standards[j].std;
|
||||
descr = standards[j].descr;
|
||||
j++;
|
||||
if (curr_id == 0)
|
||||
break;
|
||||
if (curr_id != V4L2_STD_PAL &&
|
||||
curr_id != V4L2_STD_SECAM &&
|
||||
curr_id != V4L2_STD_NTSC)
|
||||
id &= ~curr_id;
|
||||
}
|
||||
if (i <= index)
|
||||
return -EINVAL;
|
||||
|
||||
v4l2_video_std_construct(p, curr_id, descr);
|
||||
return 0;
|
||||
return v4l_video_std_enumstd(p, vfd->tvnorms);
|
||||
}
|
||||
|
||||
static int v4l_s_std(const struct v4l2_ioctl_ops *ops,
|
||||
|
@ -621,7 +621,7 @@ const char *v4l2_norm_to_name(v4l2_std_id id);
|
||||
* v4l2_video_std_frame_period - Ancillary routine that fills a
|
||||
* struct &v4l2_fract pointer with the default framerate fraction.
|
||||
*
|
||||
* @id: analog TV sdandard ID.
|
||||
* @id: analog TV standard ID.
|
||||
* @frameperiod: struct &v4l2_fract pointer to be filled
|
||||
*
|
||||
*/
|
||||
@ -632,7 +632,7 @@ void v4l2_video_std_frame_period(int id, struct v4l2_fract *frameperiod);
|
||||
* a &v4l2_standard structure according to the @id parameter.
|
||||
*
|
||||
* @vs: struct &v4l2_standard pointer to be filled
|
||||
* @id: analog TV sdandard ID.
|
||||
* @id: analog TV standard ID.
|
||||
* @name: name of the standard to be used
|
||||
*
|
||||
* .. note::
|
||||
@ -642,6 +642,17 @@ void v4l2_video_std_frame_period(int id, struct v4l2_fract *frameperiod);
|
||||
int v4l2_video_std_construct(struct v4l2_standard *vs,
|
||||
int id, const char *name);
|
||||
|
||||
/**
|
||||
* v4l_video_std_enumstd - Ancillary routine that fills in the fields of
|
||||
* a &v4l2_standard structure according to the @id and @vs->index
|
||||
* parameters.
|
||||
*
|
||||
* @vs: struct &v4l2_standard pointer to be filled.
|
||||
* @id: analog TV standard ID.
|
||||
*
|
||||
*/
|
||||
int v4l_video_std_enumstd(struct v4l2_standard *vs, v4l2_std_id id);
|
||||
|
||||
/**
|
||||
* v4l_printk_ioctl - Ancillary routine that prints the ioctl in a
|
||||
* human-readable format.
|
||||
|
Loading…
Reference in New Issue
Block a user