|
@@ -876,52 +876,59 @@ static int check_ext_ctrls(struct v4l2_ext_controls *c, int allow_priv)
|
|
|
return 1;
|
|
|
}
|
|
|
|
|
|
-static int check_fmt(const struct v4l2_ioctl_ops *ops, enum v4l2_buf_type type)
|
|
|
+static int check_fmt(struct file *file, enum v4l2_buf_type type)
|
|
|
{
|
|
|
+ struct video_device *vfd = video_devdata(file);
|
|
|
+ const struct v4l2_ioctl_ops *ops = vfd->ioctl_ops;
|
|
|
+ bool is_vid = vfd->vfl_type == VFL_TYPE_GRABBER;
|
|
|
+ bool is_vbi = vfd->vfl_type == VFL_TYPE_VBI;
|
|
|
+ bool is_rx = vfd->vfl_dir != VFL_DIR_TX;
|
|
|
+ bool is_tx = vfd->vfl_dir != VFL_DIR_RX;
|
|
|
+
|
|
|
if (ops == NULL)
|
|
|
return -EINVAL;
|
|
|
|
|
|
switch (type) {
|
|
|
case V4L2_BUF_TYPE_VIDEO_CAPTURE:
|
|
|
- if (ops->vidioc_g_fmt_vid_cap ||
|
|
|
- ops->vidioc_g_fmt_vid_cap_mplane)
|
|
|
+ if (is_vid && is_rx &&
|
|
|
+ (ops->vidioc_g_fmt_vid_cap || ops->vidioc_g_fmt_vid_cap_mplane))
|
|
|
return 0;
|
|
|
break;
|
|
|
case V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE:
|
|
|
- if (ops->vidioc_g_fmt_vid_cap_mplane)
|
|
|
+ if (is_vid && is_rx && ops->vidioc_g_fmt_vid_cap_mplane)
|
|
|
return 0;
|
|
|
break;
|
|
|
case V4L2_BUF_TYPE_VIDEO_OVERLAY:
|
|
|
- if (ops->vidioc_g_fmt_vid_overlay)
|
|
|
+ if (is_vid && is_rx && ops->vidioc_g_fmt_vid_overlay)
|
|
|
return 0;
|
|
|
break;
|
|
|
case V4L2_BUF_TYPE_VIDEO_OUTPUT:
|
|
|
- if (ops->vidioc_g_fmt_vid_out ||
|
|
|
- ops->vidioc_g_fmt_vid_out_mplane)
|
|
|
+ if (is_vid && is_tx &&
|
|
|
+ (ops->vidioc_g_fmt_vid_out || ops->vidioc_g_fmt_vid_out_mplane))
|
|
|
return 0;
|
|
|
break;
|
|
|
case V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE:
|
|
|
- if (ops->vidioc_g_fmt_vid_out_mplane)
|
|
|
+ if (is_vid && is_tx && ops->vidioc_g_fmt_vid_out_mplane)
|
|
|
return 0;
|
|
|
break;
|
|
|
case V4L2_BUF_TYPE_VIDEO_OUTPUT_OVERLAY:
|
|
|
- if (ops->vidioc_g_fmt_vid_out_overlay)
|
|
|
+ if (is_vid && is_tx && ops->vidioc_g_fmt_vid_out_overlay)
|
|
|
return 0;
|
|
|
break;
|
|
|
case V4L2_BUF_TYPE_VBI_CAPTURE:
|
|
|
- if (ops->vidioc_g_fmt_vbi_cap)
|
|
|
+ if (is_vbi && is_rx && ops->vidioc_g_fmt_vbi_cap)
|
|
|
return 0;
|
|
|
break;
|
|
|
case V4L2_BUF_TYPE_VBI_OUTPUT:
|
|
|
- if (ops->vidioc_g_fmt_vbi_out)
|
|
|
+ if (is_vbi && is_tx && ops->vidioc_g_fmt_vbi_out)
|
|
|
return 0;
|
|
|
break;
|
|
|
case V4L2_BUF_TYPE_SLICED_VBI_CAPTURE:
|
|
|
- if (ops->vidioc_g_fmt_sliced_vbi_cap)
|
|
|
+ if (is_vbi && is_rx && ops->vidioc_g_fmt_sliced_vbi_cap)
|
|
|
return 0;
|
|
|
break;
|
|
|
case V4L2_BUF_TYPE_SLICED_VBI_OUTPUT:
|
|
|
- if (ops->vidioc_g_fmt_sliced_vbi_out)
|
|
|
+ if (is_vbi && is_tx && ops->vidioc_g_fmt_sliced_vbi_out)
|
|
|
return 0;
|
|
|
break;
|
|
|
default:
|
|
@@ -1024,26 +1031,29 @@ static int v4l_enum_fmt(const struct v4l2_ioctl_ops *ops,
|
|
|
struct file *file, void *fh, void *arg)
|
|
|
{
|
|
|
struct v4l2_fmtdesc *p = arg;
|
|
|
+ struct video_device *vfd = video_devdata(file);
|
|
|
+ bool is_rx = vfd->vfl_dir != VFL_DIR_TX;
|
|
|
+ bool is_tx = vfd->vfl_dir != VFL_DIR_RX;
|
|
|
|
|
|
switch (p->type) {
|
|
|
case V4L2_BUF_TYPE_VIDEO_CAPTURE:
|
|
|
- if (unlikely(!ops->vidioc_enum_fmt_vid_cap))
|
|
|
+ if (unlikely(!is_rx || !ops->vidioc_enum_fmt_vid_cap))
|
|
|
break;
|
|
|
return ops->vidioc_enum_fmt_vid_cap(file, fh, arg);
|
|
|
case V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE:
|
|
|
- if (unlikely(!ops->vidioc_enum_fmt_vid_cap_mplane))
|
|
|
+ if (unlikely(!is_rx || !ops->vidioc_enum_fmt_vid_cap_mplane))
|
|
|
break;
|
|
|
return ops->vidioc_enum_fmt_vid_cap_mplane(file, fh, arg);
|
|
|
case V4L2_BUF_TYPE_VIDEO_OVERLAY:
|
|
|
- if (unlikely(!ops->vidioc_enum_fmt_vid_overlay))
|
|
|
+ if (unlikely(!is_rx || !ops->vidioc_enum_fmt_vid_overlay))
|
|
|
break;
|
|
|
return ops->vidioc_enum_fmt_vid_overlay(file, fh, arg);
|
|
|
case V4L2_BUF_TYPE_VIDEO_OUTPUT:
|
|
|
- if (unlikely(!ops->vidioc_enum_fmt_vid_out))
|
|
|
+ if (unlikely(!is_tx || !ops->vidioc_enum_fmt_vid_out))
|
|
|
break;
|
|
|
return ops->vidioc_enum_fmt_vid_out(file, fh, arg);
|
|
|
case V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE:
|
|
|
- if (unlikely(!ops->vidioc_enum_fmt_vid_out_mplane))
|
|
|
+ if (unlikely(!is_tx || !ops->vidioc_enum_fmt_vid_out_mplane))
|
|
|
break;
|
|
|
return ops->vidioc_enum_fmt_vid_out_mplane(file, fh, arg);
|
|
|
}
|
|
@@ -1054,46 +1064,50 @@ static int v4l_g_fmt(const struct v4l2_ioctl_ops *ops,
|
|
|
struct file *file, void *fh, void *arg)
|
|
|
{
|
|
|
struct v4l2_format *p = arg;
|
|
|
+ struct video_device *vfd = video_devdata(file);
|
|
|
+ bool is_vid = vfd->vfl_type == VFL_TYPE_GRABBER;
|
|
|
+ bool is_rx = vfd->vfl_dir != VFL_DIR_TX;
|
|
|
+ bool is_tx = vfd->vfl_dir != VFL_DIR_RX;
|
|
|
|
|
|
switch (p->type) {
|
|
|
case V4L2_BUF_TYPE_VIDEO_CAPTURE:
|
|
|
- if (unlikely(!ops->vidioc_g_fmt_vid_cap))
|
|
|
+ if (unlikely(!is_rx || !is_vid || !ops->vidioc_g_fmt_vid_cap))
|
|
|
break;
|
|
|
return ops->vidioc_g_fmt_vid_cap(file, fh, arg);
|
|
|
case V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE:
|
|
|
- if (unlikely(!ops->vidioc_g_fmt_vid_cap_mplane))
|
|
|
+ if (unlikely(!is_rx || !is_vid || !ops->vidioc_g_fmt_vid_cap_mplane))
|
|
|
break;
|
|
|
return ops->vidioc_g_fmt_vid_cap_mplane(file, fh, arg);
|
|
|
case V4L2_BUF_TYPE_VIDEO_OVERLAY:
|
|
|
- if (unlikely(!ops->vidioc_g_fmt_vid_overlay))
|
|
|
+ if (unlikely(!is_rx || !is_vid || !ops->vidioc_g_fmt_vid_overlay))
|
|
|
break;
|
|
|
return ops->vidioc_g_fmt_vid_overlay(file, fh, arg);
|
|
|
+ case V4L2_BUF_TYPE_VBI_CAPTURE:
|
|
|
+ if (unlikely(!is_rx || is_vid || !ops->vidioc_g_fmt_vbi_cap))
|
|
|
+ break;
|
|
|
+ return ops->vidioc_g_fmt_vbi_cap(file, fh, arg);
|
|
|
+ case V4L2_BUF_TYPE_SLICED_VBI_CAPTURE:
|
|
|
+ if (unlikely(!is_rx || is_vid || !ops->vidioc_g_fmt_sliced_vbi_cap))
|
|
|
+ break;
|
|
|
+ return ops->vidioc_g_fmt_sliced_vbi_cap(file, fh, arg);
|
|
|
case V4L2_BUF_TYPE_VIDEO_OUTPUT:
|
|
|
- if (unlikely(!ops->vidioc_g_fmt_vid_out))
|
|
|
+ if (unlikely(!is_tx || !is_vid || !ops->vidioc_g_fmt_vid_out))
|
|
|
break;
|
|
|
return ops->vidioc_g_fmt_vid_out(file, fh, arg);
|
|
|
case V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE:
|
|
|
- if (unlikely(!ops->vidioc_g_fmt_vid_out_mplane))
|
|
|
+ if (unlikely(!is_tx || !is_vid || !ops->vidioc_g_fmt_vid_out_mplane))
|
|
|
break;
|
|
|
return ops->vidioc_g_fmt_vid_out_mplane(file, fh, arg);
|
|
|
case V4L2_BUF_TYPE_VIDEO_OUTPUT_OVERLAY:
|
|
|
- if (unlikely(!ops->vidioc_g_fmt_vid_out_overlay))
|
|
|
+ if (unlikely(!is_tx || !is_vid || !ops->vidioc_g_fmt_vid_out_overlay))
|
|
|
break;
|
|
|
return ops->vidioc_g_fmt_vid_out_overlay(file, fh, arg);
|
|
|
- case V4L2_BUF_TYPE_VBI_CAPTURE:
|
|
|
- if (unlikely(!ops->vidioc_g_fmt_vbi_cap))
|
|
|
- break;
|
|
|
- return ops->vidioc_g_fmt_vbi_cap(file, fh, arg);
|
|
|
case V4L2_BUF_TYPE_VBI_OUTPUT:
|
|
|
- if (unlikely(!ops->vidioc_g_fmt_vbi_out))
|
|
|
+ if (unlikely(!is_tx || is_vid || !ops->vidioc_g_fmt_vbi_out))
|
|
|
break;
|
|
|
return ops->vidioc_g_fmt_vbi_out(file, fh, arg);
|
|
|
- case V4L2_BUF_TYPE_SLICED_VBI_CAPTURE:
|
|
|
- if (unlikely(!ops->vidioc_g_fmt_sliced_vbi_cap))
|
|
|
- break;
|
|
|
- return ops->vidioc_g_fmt_sliced_vbi_cap(file, fh, arg);
|
|
|
case V4L2_BUF_TYPE_SLICED_VBI_OUTPUT:
|
|
|
- if (unlikely(!ops->vidioc_g_fmt_sliced_vbi_out))
|
|
|
+ if (unlikely(!is_tx || is_vid || !ops->vidioc_g_fmt_sliced_vbi_out))
|
|
|
break;
|
|
|
return ops->vidioc_g_fmt_sliced_vbi_out(file, fh, arg);
|
|
|
}
|
|
@@ -1104,55 +1118,59 @@ static int v4l_s_fmt(const struct v4l2_ioctl_ops *ops,
|
|
|
struct file *file, void *fh, void *arg)
|
|
|
{
|
|
|
struct v4l2_format *p = arg;
|
|
|
+ struct video_device *vfd = video_devdata(file);
|
|
|
+ bool is_vid = vfd->vfl_type == VFL_TYPE_GRABBER;
|
|
|
+ bool is_rx = vfd->vfl_dir != VFL_DIR_TX;
|
|
|
+ bool is_tx = vfd->vfl_dir != VFL_DIR_RX;
|
|
|
|
|
|
switch (p->type) {
|
|
|
case V4L2_BUF_TYPE_VIDEO_CAPTURE:
|
|
|
- if (unlikely(!ops->vidioc_s_fmt_vid_cap))
|
|
|
+ if (unlikely(!is_rx || !is_vid || !ops->vidioc_s_fmt_vid_cap))
|
|
|
break;
|
|
|
CLEAR_AFTER_FIELD(p, fmt.pix);
|
|
|
return ops->vidioc_s_fmt_vid_cap(file, fh, arg);
|
|
|
case V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE:
|
|
|
- if (unlikely(!ops->vidioc_s_fmt_vid_cap_mplane))
|
|
|
+ if (unlikely(!is_rx || !is_vid || !ops->vidioc_s_fmt_vid_cap_mplane))
|
|
|
break;
|
|
|
CLEAR_AFTER_FIELD(p, fmt.pix_mp);
|
|
|
return ops->vidioc_s_fmt_vid_cap_mplane(file, fh, arg);
|
|
|
case V4L2_BUF_TYPE_VIDEO_OVERLAY:
|
|
|
- if (unlikely(!ops->vidioc_s_fmt_vid_overlay))
|
|
|
+ if (unlikely(!is_rx || !is_vid || !ops->vidioc_s_fmt_vid_overlay))
|
|
|
break;
|
|
|
CLEAR_AFTER_FIELD(p, fmt.win);
|
|
|
return ops->vidioc_s_fmt_vid_overlay(file, fh, arg);
|
|
|
+ case V4L2_BUF_TYPE_VBI_CAPTURE:
|
|
|
+ if (unlikely(!is_rx || is_vid || !ops->vidioc_s_fmt_vbi_cap))
|
|
|
+ break;
|
|
|
+ CLEAR_AFTER_FIELD(p, fmt.vbi);
|
|
|
+ return ops->vidioc_s_fmt_vbi_cap(file, fh, arg);
|
|
|
+ case V4L2_BUF_TYPE_SLICED_VBI_CAPTURE:
|
|
|
+ if (unlikely(!is_rx || is_vid || !ops->vidioc_s_fmt_sliced_vbi_cap))
|
|
|
+ break;
|
|
|
+ CLEAR_AFTER_FIELD(p, fmt.sliced);
|
|
|
+ return ops->vidioc_s_fmt_sliced_vbi_cap(file, fh, arg);
|
|
|
case V4L2_BUF_TYPE_VIDEO_OUTPUT:
|
|
|
- if (unlikely(!ops->vidioc_s_fmt_vid_out))
|
|
|
+ if (unlikely(!is_tx || !is_vid || !ops->vidioc_s_fmt_vid_out))
|
|
|
break;
|
|
|
CLEAR_AFTER_FIELD(p, fmt.pix);
|
|
|
return ops->vidioc_s_fmt_vid_out(file, fh, arg);
|
|
|
case V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE:
|
|
|
- if (unlikely(!ops->vidioc_s_fmt_vid_out_mplane))
|
|
|
+ if (unlikely(!is_tx || !is_vid || !ops->vidioc_s_fmt_vid_out_mplane))
|
|
|
break;
|
|
|
CLEAR_AFTER_FIELD(p, fmt.pix_mp);
|
|
|
return ops->vidioc_s_fmt_vid_out_mplane(file, fh, arg);
|
|
|
case V4L2_BUF_TYPE_VIDEO_OUTPUT_OVERLAY:
|
|
|
- if (unlikely(!ops->vidioc_s_fmt_vid_out_overlay))
|
|
|
+ if (unlikely(!is_tx || !is_vid || !ops->vidioc_s_fmt_vid_out_overlay))
|
|
|
break;
|
|
|
CLEAR_AFTER_FIELD(p, fmt.win);
|
|
|
return ops->vidioc_s_fmt_vid_out_overlay(file, fh, arg);
|
|
|
- case V4L2_BUF_TYPE_VBI_CAPTURE:
|
|
|
- if (unlikely(!ops->vidioc_s_fmt_vbi_cap))
|
|
|
- break;
|
|
|
- CLEAR_AFTER_FIELD(p, fmt.vbi);
|
|
|
- return ops->vidioc_s_fmt_vbi_cap(file, fh, arg);
|
|
|
case V4L2_BUF_TYPE_VBI_OUTPUT:
|
|
|
- if (unlikely(!ops->vidioc_s_fmt_vbi_out))
|
|
|
+ if (unlikely(!is_tx || is_vid || !ops->vidioc_s_fmt_vbi_out))
|
|
|
break;
|
|
|
CLEAR_AFTER_FIELD(p, fmt.vbi);
|
|
|
return ops->vidioc_s_fmt_vbi_out(file, fh, arg);
|
|
|
- case V4L2_BUF_TYPE_SLICED_VBI_CAPTURE:
|
|
|
- if (unlikely(!ops->vidioc_s_fmt_sliced_vbi_cap))
|
|
|
- break;
|
|
|
- CLEAR_AFTER_FIELD(p, fmt.sliced);
|
|
|
- return ops->vidioc_s_fmt_sliced_vbi_cap(file, fh, arg);
|
|
|
case V4L2_BUF_TYPE_SLICED_VBI_OUTPUT:
|
|
|
- if (unlikely(!ops->vidioc_s_fmt_sliced_vbi_out))
|
|
|
+ if (unlikely(!is_tx || is_vid || !ops->vidioc_s_fmt_sliced_vbi_out))
|
|
|
break;
|
|
|
CLEAR_AFTER_FIELD(p, fmt.sliced);
|
|
|
return ops->vidioc_s_fmt_sliced_vbi_out(file, fh, arg);
|
|
@@ -1164,55 +1182,59 @@ static int v4l_try_fmt(const struct v4l2_ioctl_ops *ops,
|
|
|
struct file *file, void *fh, void *arg)
|
|
|
{
|
|
|
struct v4l2_format *p = arg;
|
|
|
+ struct video_device *vfd = video_devdata(file);
|
|
|
+ bool is_vid = vfd->vfl_type == VFL_TYPE_GRABBER;
|
|
|
+ bool is_rx = vfd->vfl_dir != VFL_DIR_TX;
|
|
|
+ bool is_tx = vfd->vfl_dir != VFL_DIR_RX;
|
|
|
|
|
|
switch (p->type) {
|
|
|
case V4L2_BUF_TYPE_VIDEO_CAPTURE:
|
|
|
- if (unlikely(!ops->vidioc_try_fmt_vid_cap))
|
|
|
+ if (unlikely(!is_rx || !is_vid || !ops->vidioc_try_fmt_vid_cap))
|
|
|
break;
|
|
|
CLEAR_AFTER_FIELD(p, fmt.pix);
|
|
|
return ops->vidioc_try_fmt_vid_cap(file, fh, arg);
|
|
|
case V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE:
|
|
|
- if (unlikely(!ops->vidioc_try_fmt_vid_cap_mplane))
|
|
|
+ if (unlikely(!is_rx || !is_vid || !ops->vidioc_try_fmt_vid_cap_mplane))
|
|
|
break;
|
|
|
CLEAR_AFTER_FIELD(p, fmt.pix_mp);
|
|
|
return ops->vidioc_try_fmt_vid_cap_mplane(file, fh, arg);
|
|
|
case V4L2_BUF_TYPE_VIDEO_OVERLAY:
|
|
|
- if (unlikely(!ops->vidioc_try_fmt_vid_overlay))
|
|
|
+ if (unlikely(!is_rx || !is_vid || !ops->vidioc_try_fmt_vid_overlay))
|
|
|
break;
|
|
|
CLEAR_AFTER_FIELD(p, fmt.win);
|
|
|
return ops->vidioc_try_fmt_vid_overlay(file, fh, arg);
|
|
|
+ case V4L2_BUF_TYPE_VBI_CAPTURE:
|
|
|
+ if (unlikely(!is_rx || is_vid || !ops->vidioc_try_fmt_vbi_cap))
|
|
|
+ break;
|
|
|
+ CLEAR_AFTER_FIELD(p, fmt.vbi);
|
|
|
+ return ops->vidioc_try_fmt_vbi_cap(file, fh, arg);
|
|
|
+ case V4L2_BUF_TYPE_SLICED_VBI_CAPTURE:
|
|
|
+ if (unlikely(!is_rx || is_vid || !ops->vidioc_try_fmt_sliced_vbi_cap))
|
|
|
+ break;
|
|
|
+ CLEAR_AFTER_FIELD(p, fmt.sliced);
|
|
|
+ return ops->vidioc_try_fmt_sliced_vbi_cap(file, fh, arg);
|
|
|
case V4L2_BUF_TYPE_VIDEO_OUTPUT:
|
|
|
- if (unlikely(!ops->vidioc_try_fmt_vid_out))
|
|
|
+ if (unlikely(!is_tx || !is_vid || !ops->vidioc_try_fmt_vid_out))
|
|
|
break;
|
|
|
CLEAR_AFTER_FIELD(p, fmt.pix);
|
|
|
return ops->vidioc_try_fmt_vid_out(file, fh, arg);
|
|
|
case V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE:
|
|
|
- if (unlikely(!ops->vidioc_try_fmt_vid_out_mplane))
|
|
|
+ if (unlikely(!is_tx || !is_vid || !ops->vidioc_try_fmt_vid_out_mplane))
|
|
|
break;
|
|
|
CLEAR_AFTER_FIELD(p, fmt.pix_mp);
|
|
|
return ops->vidioc_try_fmt_vid_out_mplane(file, fh, arg);
|
|
|
case V4L2_BUF_TYPE_VIDEO_OUTPUT_OVERLAY:
|
|
|
- if (unlikely(!ops->vidioc_try_fmt_vid_out_overlay))
|
|
|
+ if (unlikely(!is_tx || !is_vid || !ops->vidioc_try_fmt_vid_out_overlay))
|
|
|
break;
|
|
|
CLEAR_AFTER_FIELD(p, fmt.win);
|
|
|
return ops->vidioc_try_fmt_vid_out_overlay(file, fh, arg);
|
|
|
- case V4L2_BUF_TYPE_VBI_CAPTURE:
|
|
|
- if (unlikely(!ops->vidioc_try_fmt_vbi_cap))
|
|
|
- break;
|
|
|
- CLEAR_AFTER_FIELD(p, fmt.vbi);
|
|
|
- return ops->vidioc_try_fmt_vbi_cap(file, fh, arg);
|
|
|
case V4L2_BUF_TYPE_VBI_OUTPUT:
|
|
|
- if (unlikely(!ops->vidioc_try_fmt_vbi_out))
|
|
|
+ if (unlikely(!is_tx || is_vid || !ops->vidioc_try_fmt_vbi_out))
|
|
|
break;
|
|
|
CLEAR_AFTER_FIELD(p, fmt.vbi);
|
|
|
return ops->vidioc_try_fmt_vbi_out(file, fh, arg);
|
|
|
- case V4L2_BUF_TYPE_SLICED_VBI_CAPTURE:
|
|
|
- if (unlikely(!ops->vidioc_try_fmt_sliced_vbi_cap))
|
|
|
- break;
|
|
|
- CLEAR_AFTER_FIELD(p, fmt.sliced);
|
|
|
- return ops->vidioc_try_fmt_sliced_vbi_cap(file, fh, arg);
|
|
|
case V4L2_BUF_TYPE_SLICED_VBI_OUTPUT:
|
|
|
- if (unlikely(!ops->vidioc_try_fmt_sliced_vbi_out))
|
|
|
+ if (unlikely(!is_tx || is_vid || !ops->vidioc_try_fmt_sliced_vbi_out))
|
|
|
break;
|
|
|
CLEAR_AFTER_FIELD(p, fmt.sliced);
|
|
|
return ops->vidioc_try_fmt_sliced_vbi_out(file, fh, arg);
|
|
@@ -1404,7 +1426,7 @@ static int v4l_reqbufs(const struct v4l2_ioctl_ops *ops,
|
|
|
struct file *file, void *fh, void *arg)
|
|
|
{
|
|
|
struct v4l2_requestbuffers *p = arg;
|
|
|
- int ret = check_fmt(ops, p->type);
|
|
|
+ int ret = check_fmt(file, p->type);
|
|
|
|
|
|
if (ret)
|
|
|
return ret;
|
|
@@ -1418,7 +1440,7 @@ static int v4l_querybuf(const struct v4l2_ioctl_ops *ops,
|
|
|
struct file *file, void *fh, void *arg)
|
|
|
{
|
|
|
struct v4l2_buffer *p = arg;
|
|
|
- int ret = check_fmt(ops, p->type);
|
|
|
+ int ret = check_fmt(file, p->type);
|
|
|
|
|
|
return ret ? ret : ops->vidioc_querybuf(file, fh, p);
|
|
|
}
|
|
@@ -1427,7 +1449,7 @@ static int v4l_qbuf(const struct v4l2_ioctl_ops *ops,
|
|
|
struct file *file, void *fh, void *arg)
|
|
|
{
|
|
|
struct v4l2_buffer *p = arg;
|
|
|
- int ret = check_fmt(ops, p->type);
|
|
|
+ int ret = check_fmt(file, p->type);
|
|
|
|
|
|
return ret ? ret : ops->vidioc_qbuf(file, fh, p);
|
|
|
}
|
|
@@ -1436,7 +1458,7 @@ static int v4l_dqbuf(const struct v4l2_ioctl_ops *ops,
|
|
|
struct file *file, void *fh, void *arg)
|
|
|
{
|
|
|
struct v4l2_buffer *p = arg;
|
|
|
- int ret = check_fmt(ops, p->type);
|
|
|
+ int ret = check_fmt(file, p->type);
|
|
|
|
|
|
return ret ? ret : ops->vidioc_dqbuf(file, fh, p);
|
|
|
}
|
|
@@ -1445,7 +1467,7 @@ static int v4l_create_bufs(const struct v4l2_ioctl_ops *ops,
|
|
|
struct file *file, void *fh, void *arg)
|
|
|
{
|
|
|
struct v4l2_create_buffers *create = arg;
|
|
|
- int ret = check_fmt(ops, create->format.type);
|
|
|
+ int ret = check_fmt(file, create->format.type);
|
|
|
|
|
|
return ret ? ret : ops->vidioc_create_bufs(file, fh, create);
|
|
|
}
|
|
@@ -1454,7 +1476,7 @@ static int v4l_prepare_buf(const struct v4l2_ioctl_ops *ops,
|
|
|
struct file *file, void *fh, void *arg)
|
|
|
{
|
|
|
struct v4l2_buffer *b = arg;
|
|
|
- int ret = check_fmt(ops, b->type);
|
|
|
+ int ret = check_fmt(file, b->type);
|
|
|
|
|
|
return ret ? ret : ops->vidioc_prepare_buf(file, fh, b);
|
|
|
}
|
|
@@ -1465,7 +1487,7 @@ static int v4l_g_parm(const struct v4l2_ioctl_ops *ops,
|
|
|
struct video_device *vfd = video_devdata(file);
|
|
|
struct v4l2_streamparm *p = arg;
|
|
|
v4l2_std_id std;
|
|
|
- int ret = check_fmt(ops, p->type);
|
|
|
+ int ret = check_fmt(file, p->type);
|
|
|
|
|
|
if (ret)
|
|
|
return ret;
|
|
@@ -1488,7 +1510,7 @@ static int v4l_s_parm(const struct v4l2_ioctl_ops *ops,
|
|
|
struct file *file, void *fh, void *arg)
|
|
|
{
|
|
|
struct v4l2_streamparm *p = arg;
|
|
|
- int ret = check_fmt(ops, p->type);
|
|
|
+ int ret = check_fmt(file, p->type);
|
|
|
|
|
|
return ret ? ret : ops->vidioc_s_parm(file, fh, p);
|
|
|
}
|
|
@@ -1810,6 +1832,10 @@ static int v4l_g_sliced_vbi_cap(const struct v4l2_ioctl_ops *ops,
|
|
|
struct file *file, void *fh, void *arg)
|
|
|
{
|
|
|
struct v4l2_sliced_vbi_cap *p = arg;
|
|
|
+ int ret = check_fmt(file, p->type);
|
|
|
+
|
|
|
+ if (ret)
|
|
|
+ return ret;
|
|
|
|
|
|
/* Clear up to type, everything after type is zeroed already */
|
|
|
memset(p, 0, offsetof(struct v4l2_sliced_vbi_cap, type));
|