|
@@ -159,11 +159,16 @@ struct v4l2_format32 {
|
|
|
} fmt;
|
|
|
};
|
|
|
|
|
|
-static int get_v4l2_format32(struct v4l2_format *kp, struct v4l2_format32 __user *up)
|
|
|
+struct v4l2_create_buffers32 {
|
|
|
+ __u32 index; /* output: buffers index...index + count - 1 have been created */
|
|
|
+ __u32 count;
|
|
|
+ enum v4l2_memory memory;
|
|
|
+ struct v4l2_format32 format; /* filled in by the user, plane sizes calculated by the driver */
|
|
|
+ __u32 reserved[8];
|
|
|
+};
|
|
|
+
|
|
|
+static int __get_v4l2_format32(struct v4l2_format *kp, struct v4l2_format32 __user *up)
|
|
|
{
|
|
|
- if (!access_ok(VERIFY_READ, up, sizeof(struct v4l2_format32)) ||
|
|
|
- get_user(kp->type, &up->type))
|
|
|
- return -EFAULT;
|
|
|
switch (kp->type) {
|
|
|
case V4L2_BUF_TYPE_VIDEO_CAPTURE:
|
|
|
case V4L2_BUF_TYPE_VIDEO_OUTPUT:
|
|
@@ -192,11 +197,24 @@ static int get_v4l2_format32(struct v4l2_format *kp, struct v4l2_format32 __user
|
|
|
}
|
|
|
}
|
|
|
|
|
|
-static int put_v4l2_format32(struct v4l2_format *kp, struct v4l2_format32 __user *up)
|
|
|
+static int get_v4l2_format32(struct v4l2_format *kp, struct v4l2_format32 __user *up)
|
|
|
+{
|
|
|
+ if (!access_ok(VERIFY_READ, up, sizeof(struct v4l2_format32)) ||
|
|
|
+ get_user(kp->type, &up->type))
|
|
|
+ return -EFAULT;
|
|
|
+ return __get_v4l2_format32(kp, up);
|
|
|
+}
|
|
|
+
|
|
|
+static int get_v4l2_create32(struct v4l2_create_buffers *kp, struct v4l2_create_buffers32 __user *up)
|
|
|
+{
|
|
|
+ if (!access_ok(VERIFY_READ, up, sizeof(struct v4l2_create_buffers32)) ||
|
|
|
+ copy_from_user(kp, up, offsetof(struct v4l2_create_buffers32, format.fmt)))
|
|
|
+ return -EFAULT;
|
|
|
+ return __get_v4l2_format32(&kp->format, &up->format);
|
|
|
+}
|
|
|
+
|
|
|
+static int __put_v4l2_format32(struct v4l2_format *kp, struct v4l2_format32 __user *up)
|
|
|
{
|
|
|
- if (!access_ok(VERIFY_WRITE, up, sizeof(struct v4l2_format32)) ||
|
|
|
- put_user(kp->type, &up->type))
|
|
|
- return -EFAULT;
|
|
|
switch (kp->type) {
|
|
|
case V4L2_BUF_TYPE_VIDEO_CAPTURE:
|
|
|
case V4L2_BUF_TYPE_VIDEO_OUTPUT:
|
|
@@ -225,6 +243,22 @@ static int put_v4l2_format32(struct v4l2_format *kp, struct v4l2_format32 __user
|
|
|
}
|
|
|
}
|
|
|
|
|
|
+static int put_v4l2_format32(struct v4l2_format *kp, struct v4l2_format32 __user *up)
|
|
|
+{
|
|
|
+ if (!access_ok(VERIFY_WRITE, up, sizeof(struct v4l2_format32)) ||
|
|
|
+ put_user(kp->type, &up->type))
|
|
|
+ return -EFAULT;
|
|
|
+ return __put_v4l2_format32(kp, up);
|
|
|
+}
|
|
|
+
|
|
|
+static int put_v4l2_create32(struct v4l2_create_buffers *kp, struct v4l2_create_buffers32 __user *up)
|
|
|
+{
|
|
|
+ if (!access_ok(VERIFY_WRITE, up, sizeof(struct v4l2_create_buffers32)) ||
|
|
|
+ copy_to_user(up, kp, offsetof(struct v4l2_create_buffers32, format.fmt)))
|
|
|
+ return -EFAULT;
|
|
|
+ return __put_v4l2_format32(&kp->format, &up->format);
|
|
|
+}
|
|
|
+
|
|
|
struct v4l2_standard32 {
|
|
|
__u32 index;
|
|
|
__u32 id[2]; /* __u64 would get the alignment wrong */
|
|
@@ -702,6 +736,8 @@ static int put_v4l2_event32(struct v4l2_event *kp, struct v4l2_event32 __user *u
|
|
|
#define VIDIOC_S_EXT_CTRLS32 _IOWR('V', 72, struct v4l2_ext_controls32)
|
|
|
#define VIDIOC_TRY_EXT_CTRLS32 _IOWR('V', 73, struct v4l2_ext_controls32)
|
|
|
#define VIDIOC_DQEVENT32 _IOR ('V', 89, struct v4l2_event32)
|
|
|
+#define VIDIOC_CREATE_BUFS32 _IOWR('V', 92, struct v4l2_create_buffers32)
|
|
|
+#define VIDIOC_PREPARE_BUF32 _IOWR('V', 93, struct v4l2_buffer32)
|
|
|
|
|
|
#define VIDIOC_OVERLAY32 _IOW ('V', 14, s32)
|
|
|
#define VIDIOC_STREAMON32 _IOW ('V', 18, s32)
|
|
@@ -721,6 +757,7 @@ static long do_video_ioctl(struct file *file, unsigned int cmd, unsigned long ar
|
|
|
struct v4l2_standard v2s;
|
|
|
struct v4l2_ext_controls v2ecs;
|
|
|
struct v4l2_event v2ev;
|
|
|
+ struct v4l2_create_buffers v2crt;
|
|
|
unsigned long vx;
|
|
|
int vi;
|
|
|
} karg;
|
|
@@ -751,6 +788,8 @@ static long do_video_ioctl(struct file *file, unsigned int cmd, unsigned long ar
|
|
|
case VIDIOC_S_INPUT32: cmd = VIDIOC_S_INPUT; break;
|
|
|
case VIDIOC_G_OUTPUT32: cmd = VIDIOC_G_OUTPUT; break;
|
|
|
case VIDIOC_S_OUTPUT32: cmd = VIDIOC_S_OUTPUT; break;
|
|
|
+ case VIDIOC_CREATE_BUFS32: cmd = VIDIOC_CREATE_BUFS; break;
|
|
|
+ case VIDIOC_PREPARE_BUF32: cmd = VIDIOC_PREPARE_BUF; break;
|
|
|
}
|
|
|
|
|
|
switch (cmd) {
|
|
@@ -775,6 +814,12 @@ static long do_video_ioctl(struct file *file, unsigned int cmd, unsigned long ar
|
|
|
compatible_arg = 0;
|
|
|
break;
|
|
|
|
|
|
+ case VIDIOC_CREATE_BUFS:
|
|
|
+ err = get_v4l2_create32(&karg.v2crt, up);
|
|
|
+ compatible_arg = 0;
|
|
|
+ break;
|
|
|
+
|
|
|
+ case VIDIOC_PREPARE_BUF:
|
|
|
case VIDIOC_QUERYBUF:
|
|
|
case VIDIOC_QBUF:
|
|
|
case VIDIOC_DQBUF:
|
|
@@ -860,6 +905,10 @@ static long do_video_ioctl(struct file *file, unsigned int cmd, unsigned long ar
|
|
|
err = put_v4l2_format32(&karg.v2f, up);
|
|
|
break;
|
|
|
|
|
|
+ case VIDIOC_CREATE_BUFS:
|
|
|
+ err = put_v4l2_create32(&karg.v2crt, up);
|
|
|
+ break;
|
|
|
+
|
|
|
case VIDIOC_QUERYBUF:
|
|
|
case VIDIOC_QBUF:
|
|
|
case VIDIOC_DQBUF:
|
|
@@ -959,6 +1008,8 @@ long v4l2_compat_ioctl32(struct file *file, unsigned int cmd, unsigned long arg)
|
|
|
case VIDIOC_DQEVENT32:
|
|
|
case VIDIOC_SUBSCRIBE_EVENT:
|
|
|
case VIDIOC_UNSUBSCRIBE_EVENT:
|
|
|
+ case VIDIOC_CREATE_BUFS32:
|
|
|
+ case VIDIOC_PREPARE_BUF32:
|
|
|
ret = do_video_ioctl(file, cmd, arg);
|
|
|
break;
|
|
|
|