Commit ce71bbc9 authored by Hans Verkuil's avatar Hans Verkuil Committed by Mauro Carvalho Chehab

[media] v4l2-ioctl.c: check vfl_type in ENUM_FMT

The other format ioctls (g/s/try_fmt) all check if the passed buffer type
makes sense for the device node's vfl_type. E.g. it makes no sense for a
VBI buffer type to be passed through a video node instead of a vbi node.

But this check was missing in ENUM_FMT which can cause a problem if you
have both video and sdr device nodes.
Signed-off-by: default avatarHans Verkuil <hans.verkuil@cisco.com>
Signed-off-by: default avatarMauro Carvalho Chehab <m.chehab@samsung.com>
parent d9cdebd0
...@@ -1098,32 +1098,34 @@ static int v4l_enum_fmt(const struct v4l2_ioctl_ops *ops, ...@@ -1098,32 +1098,34 @@ static int v4l_enum_fmt(const struct v4l2_ioctl_ops *ops,
{ {
struct v4l2_fmtdesc *p = arg; struct v4l2_fmtdesc *p = arg;
struct video_device *vfd = video_devdata(file); struct video_device *vfd = video_devdata(file);
bool is_vid = vfd->vfl_type == VFL_TYPE_GRABBER;
bool is_sdr = vfd->vfl_type == VFL_TYPE_SDR;
bool is_rx = vfd->vfl_dir != VFL_DIR_TX; bool is_rx = vfd->vfl_dir != VFL_DIR_TX;
bool is_tx = vfd->vfl_dir != VFL_DIR_RX; bool is_tx = vfd->vfl_dir != VFL_DIR_RX;
switch (p->type) { switch (p->type) {
case V4L2_BUF_TYPE_VIDEO_CAPTURE: case V4L2_BUF_TYPE_VIDEO_CAPTURE:
if (unlikely(!is_rx || !ops->vidioc_enum_fmt_vid_cap)) if (unlikely(!is_rx || !is_vid || !ops->vidioc_enum_fmt_vid_cap))
break; break;
return ops->vidioc_enum_fmt_vid_cap(file, fh, arg); return ops->vidioc_enum_fmt_vid_cap(file, fh, arg);
case V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE: case V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE:
if (unlikely(!is_rx || !ops->vidioc_enum_fmt_vid_cap_mplane)) if (unlikely(!is_rx || !is_vid || !ops->vidioc_enum_fmt_vid_cap_mplane))
break; break;
return ops->vidioc_enum_fmt_vid_cap_mplane(file, fh, arg); return ops->vidioc_enum_fmt_vid_cap_mplane(file, fh, arg);
case V4L2_BUF_TYPE_VIDEO_OVERLAY: case V4L2_BUF_TYPE_VIDEO_OVERLAY:
if (unlikely(!is_rx || !ops->vidioc_enum_fmt_vid_overlay)) if (unlikely(!is_rx || !is_vid || !ops->vidioc_enum_fmt_vid_overlay))
break; break;
return ops->vidioc_enum_fmt_vid_overlay(file, fh, arg); return ops->vidioc_enum_fmt_vid_overlay(file, fh, arg);
case V4L2_BUF_TYPE_VIDEO_OUTPUT: case V4L2_BUF_TYPE_VIDEO_OUTPUT:
if (unlikely(!is_tx || !ops->vidioc_enum_fmt_vid_out)) if (unlikely(!is_tx || !is_vid || !ops->vidioc_enum_fmt_vid_out))
break; break;
return ops->vidioc_enum_fmt_vid_out(file, fh, arg); return ops->vidioc_enum_fmt_vid_out(file, fh, arg);
case V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE: case V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE:
if (unlikely(!is_tx || !ops->vidioc_enum_fmt_vid_out_mplane)) if (unlikely(!is_tx || !is_vid || !ops->vidioc_enum_fmt_vid_out_mplane))
break; break;
return ops->vidioc_enum_fmt_vid_out_mplane(file, fh, arg); return ops->vidioc_enum_fmt_vid_out_mplane(file, fh, arg);
case V4L2_BUF_TYPE_SDR_CAPTURE: case V4L2_BUF_TYPE_SDR_CAPTURE:
if (unlikely(!is_rx || !ops->vidioc_enum_fmt_sdr_cap)) if (unlikely(!is_rx || !is_sdr || !ops->vidioc_enum_fmt_sdr_cap))
break; break;
return ops->vidioc_enum_fmt_sdr_cap(file, fh, arg); return ops->vidioc_enum_fmt_sdr_cap(file, fh, arg);
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment