|
@@ -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,
|