diff options
author | Hans Verkuil <hverkuil-cisco@xs4all.nl> | 2023-02-01 12:50:30 +0100 |
---|---|---|
committer | Mauro Carvalho Chehab <mchehab@kernel.org> | 2023-03-19 22:12:13 +0100 |
commit | 651640f6534c81685e1811e23d2808cb95be11da (patch) | |
tree | 7a055b1e6f7026857d4bd5f3c1280b2fed730f9a /drivers/media/pci/cx18/cx18-ioctl.c | |
parent | media: cx18: fix incorrect input counting (diff) | |
download | linux-651640f6534c81685e1811e23d2808cb95be11da.tar.xz linux-651640f6534c81685e1811e23d2808cb95be11da.zip |
media: cx18: properly report pixelformats
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>
Diffstat (limited to 'drivers/media/pci/cx18/cx18-ioctl.c')
-rw-r--r-- | drivers/media/pci/cx18/cx18-ioctl.c | 61 |
1 files changed, 38 insertions, 23 deletions
diff --git a/drivers/media/pci/cx18/cx18-ioctl.c b/drivers/media/pci/cx18/cx18-ioctl.c index af6e72ffe4b7..549aa5e3c898 100644 --- a/drivers/media/pci/cx18/cx18-ioctl.c +++ b/drivers/media/pci/cx18/cx18-ioctl.c @@ -27,6 +27,28 @@ #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; } |