[media] ivtv: fix format enumeration: don't show invalid formats
authorHans Verkuil <hans.verkuil@cisco.com>
Mon, 1 Oct 2012 10:22:06 +0000 (07:22 -0300)
committerMauro Carvalho Chehab <mchehab@redhat.com>
Mon, 1 Oct 2012 20:24:19 +0000 (17:24 -0300)
Depending on the device node only the compressed or the uncompressed format
should be shown, not both.

Signed-off-by: Hans Verkuil <hans.verkuil@cisco.com>
Signed-off-by: Mauro Carvalho Chehab <mchehab@redhat.com>
drivers/media/pci/ivtv/ivtv-ioctl.c

index 3b32518dbc02b1997433a6d174aa85ac113d9416..949ae230e119b80caae93490186613d51bd5e151 100644 (file)
@@ -928,51 +928,53 @@ static int ivtv_g_crop(struct file *file, void *fh, struct v4l2_crop *crop)
 
 static int ivtv_enum_fmt_vid_cap(struct file *file, void *fh, struct v4l2_fmtdesc *fmt)
 {
-       static struct v4l2_fmtdesc formats[] = {
-               { 0, 0, 0,
-                 "HM12 (YUV 4:2:0)", V4L2_PIX_FMT_HM12,
-                 { 0, 0, 0, 0 }
-               },
-               { 1, 0, V4L2_FMT_FLAG_COMPRESSED,
-                 "MPEG", V4L2_PIX_FMT_MPEG,
-                 { 0, 0, 0, 0 }
-               }
+       static const struct v4l2_fmtdesc hm12 = {
+               0, V4L2_BUF_TYPE_VIDEO_CAPTURE, 0,
+               "HM12 (YUV 4:2:0)", V4L2_PIX_FMT_HM12,
+               { 0, 0, 0, 0 }
+       };
+       static const struct v4l2_fmtdesc mpeg = {
+               0, V4L2_BUF_TYPE_VIDEO_CAPTURE, V4L2_FMT_FLAG_COMPRESSED,
+               "MPEG", V4L2_PIX_FMT_MPEG,
+               { 0, 0, 0, 0 }
        };
-       enum v4l2_buf_type type = fmt->type;
+       struct ivtv *itv = fh2id(fh)->itv;
+       struct ivtv_stream *s = &itv->streams[fh2id(fh)->type];
 
-       if (fmt->index > 1)
+       if (fmt->index)
+               return -EINVAL;
+       if (s->type == IVTV_ENC_STREAM_TYPE_MPG)
+               *fmt = mpeg;
+       else if (s->type == IVTV_ENC_STREAM_TYPE_YUV)
+               *fmt = hm12;
+       else
                return -EINVAL;
-
-       *fmt = formats[fmt->index];
-       fmt->type = type;
        return 0;
 }
 
 static int ivtv_enum_fmt_vid_out(struct file *file, void *fh, struct v4l2_fmtdesc *fmt)
 {
-       struct ivtv *itv = fh2id(fh)->itv;
-
-       static struct v4l2_fmtdesc formats[] = {
-               { 0, 0, 0,
-                 "HM12 (YUV 4:2:0)", V4L2_PIX_FMT_HM12,
-                 { 0, 0, 0, 0 }
-               },
-               { 1, 0, V4L2_FMT_FLAG_COMPRESSED,
-                 "MPEG", V4L2_PIX_FMT_MPEG,
-                 { 0, 0, 0, 0 }
-               }
+       static const struct v4l2_fmtdesc hm12 = {
+               0, V4L2_BUF_TYPE_VIDEO_OUTPUT, 0,
+               "HM12 (YUV 4:2:0)", V4L2_PIX_FMT_HM12,
+               { 0, 0, 0, 0 }
+       };
+       static const struct v4l2_fmtdesc mpeg = {
+               0, V4L2_BUF_TYPE_VIDEO_OUTPUT, V4L2_FMT_FLAG_COMPRESSED,
+               "MPEG", V4L2_PIX_FMT_MPEG,
+               { 0, 0, 0, 0 }
        };
-       enum v4l2_buf_type type = fmt->type;
+       struct ivtv *itv = fh2id(fh)->itv;
+       struct ivtv_stream *s = &itv->streams[fh2id(fh)->type];
 
-       if (!(itv->v4l2_cap & V4L2_CAP_VIDEO_OUTPUT))
+       if (fmt->index)
                return -EINVAL;
-
-       if (fmt->index > 1)
+       if (s->type == IVTV_DEC_STREAM_TYPE_MPG)
+               *fmt = mpeg;
+       else if (s->type == IVTV_DEC_STREAM_TYPE_YUV)
+               *fmt = hm12;
+       else
                return -EINVAL;
-
-       *fmt = formats[fmt->index];
-       fmt->type = type;
-
        return 0;
 }