diff options
author | Hans Verkuil <hverkuil@xs4all.nl> | 2014-07-17 17:45:45 -0400 |
---|---|---|
committer | Mauro Carvalho Chehab <m.chehab@samsung.com> | 2014-07-17 18:38:06 -0400 |
commit | e5ce558a6157e49374ba762471b77ce89ada4df0 (patch) | |
tree | d94e062ab9b8e01e394cec860414f990efb03166 /drivers/media/v4l2-core/v4l2-ioctl.c | |
parent | 9409945c7ff7ba39727df8ede2551bd22e76b58b (diff) |
[media] v4l2-ioctl: clips, clipcount and bitmap should not be zeroed
Otherwise you cannot get the current clip and bitmap information from
an overlay.
Signed-off-by: Hans Verkuil <hans.verkuil@cisco.com>
Signed-off-by: Mauro Carvalho Chehab <m.chehab@samsung.com>
Diffstat (limited to 'drivers/media/v4l2-core/v4l2-ioctl.c')
-rw-r--r-- | drivers/media/v4l2-core/v4l2-ioctl.c | 26 |
1 files changed, 25 insertions, 1 deletions
diff --git a/drivers/media/v4l2-core/v4l2-ioctl.c b/drivers/media/v4l2-core/v4l2-ioctl.c index 46f45f087a83..e620387b29ca 100644 --- a/drivers/media/v4l2-core/v4l2-ioctl.c +++ b/drivers/media/v4l2-core/v4l2-ioctl.c | |||
@@ -1145,6 +1145,30 @@ static int v4l_g_fmt(const struct v4l2_ioctl_ops *ops, | |||
1145 | 1145 | ||
1146 | p->fmt.pix.priv = V4L2_PIX_FMT_PRIV_MAGIC; | 1146 | p->fmt.pix.priv = V4L2_PIX_FMT_PRIV_MAGIC; |
1147 | 1147 | ||
1148 | /* | ||
1149 | * fmt can't be cleared for these overlay types due to the 'clips' | ||
1150 | * 'clipcount' and 'bitmap' pointers in struct v4l2_window. | ||
1151 | * Those are provided by the user. So handle these two overlay types | ||
1152 | * first, and then just do a simple memset for the other types. | ||
1153 | */ | ||
1154 | switch (p->type) { | ||
1155 | case V4L2_BUF_TYPE_VIDEO_OVERLAY: | ||
1156 | case V4L2_BUF_TYPE_VIDEO_OUTPUT_OVERLAY: { | ||
1157 | struct v4l2_clip *clips = p->fmt.win.clips; | ||
1158 | u32 clipcount = p->fmt.win.clipcount; | ||
1159 | void *bitmap = p->fmt.win.bitmap; | ||
1160 | |||
1161 | memset(&p->fmt, 0, sizeof(p->fmt)); | ||
1162 | p->fmt.win.clips = clips; | ||
1163 | p->fmt.win.clipcount = clipcount; | ||
1164 | p->fmt.win.bitmap = bitmap; | ||
1165 | break; | ||
1166 | } | ||
1167 | default: | ||
1168 | memset(&p->fmt, 0, sizeof(p->fmt)); | ||
1169 | break; | ||
1170 | } | ||
1171 | |||
1148 | switch (p->type) { | 1172 | switch (p->type) { |
1149 | case V4L2_BUF_TYPE_VIDEO_CAPTURE: | 1173 | case V4L2_BUF_TYPE_VIDEO_CAPTURE: |
1150 | if (unlikely(!is_rx || !is_vid || !ops->vidioc_g_fmt_vid_cap)) | 1174 | if (unlikely(!is_rx || !is_vid || !ops->vidioc_g_fmt_vid_cap)) |
@@ -2140,7 +2164,7 @@ struct v4l2_ioctl_info { | |||
2140 | static struct v4l2_ioctl_info v4l2_ioctls[] = { | 2164 | static struct v4l2_ioctl_info v4l2_ioctls[] = { |
2141 | IOCTL_INFO_FNC(VIDIOC_QUERYCAP, v4l_querycap, v4l_print_querycap, 0), | 2165 | IOCTL_INFO_FNC(VIDIOC_QUERYCAP, v4l_querycap, v4l_print_querycap, 0), |
2142 | IOCTL_INFO_FNC(VIDIOC_ENUM_FMT, v4l_enum_fmt, v4l_print_fmtdesc, INFO_FL_CLEAR(v4l2_fmtdesc, type)), | 2166 | IOCTL_INFO_FNC(VIDIOC_ENUM_FMT, v4l_enum_fmt, v4l_print_fmtdesc, INFO_FL_CLEAR(v4l2_fmtdesc, type)), |
2143 | IOCTL_INFO_FNC(VIDIOC_G_FMT, v4l_g_fmt, v4l_print_format, INFO_FL_CLEAR(v4l2_format, type)), | 2167 | IOCTL_INFO_FNC(VIDIOC_G_FMT, v4l_g_fmt, v4l_print_format, 0), |
2144 | IOCTL_INFO_FNC(VIDIOC_S_FMT, v4l_s_fmt, v4l_print_format, INFO_FL_PRIO), | 2168 | IOCTL_INFO_FNC(VIDIOC_S_FMT, v4l_s_fmt, v4l_print_format, INFO_FL_PRIO), |
2145 | IOCTL_INFO_FNC(VIDIOC_REQBUFS, v4l_reqbufs, v4l_print_requestbuffers, INFO_FL_PRIO | INFO_FL_QUEUE), | 2169 | IOCTL_INFO_FNC(VIDIOC_REQBUFS, v4l_reqbufs, v4l_print_requestbuffers, INFO_FL_PRIO | INFO_FL_QUEUE), |
2146 | IOCTL_INFO_FNC(VIDIOC_QUERYBUF, v4l_querybuf, v4l_print_buffer, INFO_FL_QUEUE | INFO_FL_CLEAR(v4l2_buffer, length)), | 2170 | IOCTL_INFO_FNC(VIDIOC_QUERYBUF, v4l_querybuf, v4l_print_buffer, INFO_FL_QUEUE | INFO_FL_CLEAR(v4l2_buffer, length)), |