media: cx18: properly report pixelformats
authorHans Verkuil <hverkuil-cisco@xs4all.nl>
Wed, 1 Feb 2023 11:50:30 +0000 (12:50 +0100)
committerMauro Carvalho Chehab <mchehab@kernel.org>
Sun, 19 Mar 2023 21:12:13 +0000 (22:12 +0100)
The MPEG device reported non-MPEG pixelformats, and the YUV device reported
the MPEG pixelformat as well.

Separate the two: either report MPEG or HM12/UYUV, not all three.

Signed-off-by: Hans Verkuil <hverkuil-cisco@xs4all.nl>
Signed-off-by: Mauro Carvalho Chehab <mchehab@kernel.org>
drivers/media/pci/cx18/cx18-ioctl.c

index af6e72f..549aa5e 100644 (file)
 #include <media/tveeprom.h>
 #include <media/v4l2-event.h>
 
+static const struct v4l2_fmtdesc cx18_formats_yuv[] = {
+       {
+               .index = 0,
+               .type = V4L2_BUF_TYPE_VIDEO_CAPTURE,
+               .pixelformat = V4L2_PIX_FMT_NV12_16L16,
+       },
+       {
+               .index = 1,
+               .type = V4L2_BUF_TYPE_VIDEO_CAPTURE,
+               .pixelformat = V4L2_PIX_FMT_UYVY,
+       },
+};
+
+static const struct v4l2_fmtdesc cx18_formats_mpeg[] = {
+       {
+               .index = 0,
+               .type = V4L2_BUF_TYPE_VIDEO_CAPTURE,
+               .flags = V4L2_FMT_FLAG_COMPRESSED,
+               .pixelformat = V4L2_PIX_FMT_MPEG,
+       },
+};
+
 u16 cx18_service2vbi(int type)
 {
        switch (type) {
@@ -210,11 +232,18 @@ static int cx18_try_fmt_vid_cap(struct file *file, void *fh,
 
        w = min(w, 720);
        w = max(w, 2);
+
        if (id->type == CX18_ENC_STREAM_TYPE_YUV) {
+               if (fmt->fmt.pix.pixelformat != V4L2_PIX_FMT_NV12_16L16 &&
+                   fmt->fmt.pix.pixelformat != V4L2_PIX_FMT_UYVY)
+                       fmt->fmt.pix.pixelformat = V4L2_PIX_FMT_UYVY;
                /* YUV height must be a multiple of 32 */
                h &= ~0x1f;
                min_h = 32;
+       } else {
+               fmt->fmt.pix.pixelformat = V4L2_PIX_FMT_MPEG;
        }
+
        h = min(h, cx->is_50hz ? 576 : 480);
        h = max(h, min_h);
 
@@ -463,31 +492,17 @@ static int cx18_g_selection(struct file *file, void *fh,
 static int cx18_enum_fmt_vid_cap(struct file *file, void *fh,
                                        struct v4l2_fmtdesc *fmt)
 {
-       static const struct v4l2_fmtdesc formats[] = {
-               {
-                       .index = 0,
-                       .type = V4L2_BUF_TYPE_VIDEO_CAPTURE,
-                       .description = "HM12 (YUV 4:1:1)",
-                       .pixelformat = V4L2_PIX_FMT_NV12_16L16,
-               },
-               {
-                       .index = 1,
-                       .type = V4L2_BUF_TYPE_VIDEO_CAPTURE,
-                       .flags = V4L2_FMT_FLAG_COMPRESSED,
-                       .description = "MPEG",
-                       .pixelformat = V4L2_PIX_FMT_MPEG,
-               },
-               {
-                       .index = 2,
-                       .type = V4L2_BUF_TYPE_VIDEO_CAPTURE,
-                       .description = "UYVY 4:2:2",
-                       .pixelformat = V4L2_PIX_FMT_UYVY,
-               },
-       };
+       struct cx18_open_id *id = fh2id(fh);
 
-       if (fmt->index > ARRAY_SIZE(formats) - 1)
+       if (id->type == CX18_ENC_STREAM_TYPE_YUV) {
+               if (fmt->index >= ARRAY_SIZE(cx18_formats_yuv))
+                       return -EINVAL;
+               *fmt = cx18_formats_yuv[fmt->index];
+               return 0;
+       }
+       if (fmt->index)
                return -EINVAL;
-       *fmt = formats[fmt->index];
+       *fmt = cx18_formats_mpeg[0];
        return 0;
 }