History

media: videodev2.h: Add request_fd field to v4l2_buffer

When queuing buffers allow for passing the request that should be associated with this buffer. If V4L2_BUF_FLAG_REQUEST_FD is set, then request_fd is used as the file descriptor. If a buffer is stored in a request, but not yet queued to the driver, then V4L2_BUF_FLAG_IN_REQUEST is set.

Hans Verkuil committed 8 years ago

Commit 62fed261 parent 55028695 files · +19 −8Browse files

Unified · Split

5 files
  1. drivers/media/common/videobuf2/videobuf2-v4l2.c +1 −1
  2. drivers/media/usb/cpia2/cpia2_v4l.c +1 −1
  3. drivers/media/v4l2-core/v4l2-compat-ioctl32.c +6 −3
  4. drivers/media/v4l2-core/v4l2-ioctl.c +2 −2
  5. include/uapi/linux/videodev2.h +9 −1
drivers/media/common/videobuf2/videobuf2-v4l2.c+1−1
@@ -384,7 +384,7 @@ static void __fill_v4l2_buffer(struct vb2_buffer *vb, void *pb) · 383 unmodified lines
384384 b->timecode = vbuf->timecode;
385385 b->sequence = vbuf->sequence;
386386 b->reserved2 = 0;
387− b->reserved = 0;
387+ b->request_fd = 0;
388388
389389 if (q->is_multiplanar) {
390390 /*
drivers/media/usb/cpia2/cpia2_v4l.c+1−1
@@ -949,7 +949,7 @@ static int cpia2_dqbuf(struct file *file, void *fh, struct v4l2_buffer *buf) · 948 unmodified lines
949949 buf->m.offset = cam->buffers[buf->index].data - cam->frame_buffer;
950950 buf->length = cam->frame_size;
951951 buf->reserved2 = 0;
952− buf->reserved = 0;
952+ buf->request_fd = 0;
953953 memset(&buf->timecode, 0, sizeof(buf->timecode));
954954
955955 DBG("DQBUF #%d status:%d seq:%d length:%d\n", buf->index,
drivers/media/v4l2-core/v4l2-compat-ioctl32.c+6−3
@@ -482,7 +482,7 @@ struct v4l2_buffer32 { · 481 unmodified lines
482482 } m;
483483 __u32 length;
484484 __u32 reserved2;
485− __u32 reserved;
485+ __s32 request_fd;
486486 };
487487
488488 static int get_v4l2_plane32(struct v4l2_plane __user *p64,
@@ -581,6 +581,7 @@ static int get_v4l2_buffer32(struct v4l2_buffer __user *p64, · 92 unmodified lines
581581 {
582582 u32 type;
583583 u32 length;
584+ s32 request_fd;
584585 enum v4l2_memory memory;
585586 struct v4l2_plane32 __user *uplane32;
586587 struct v4l2_plane __user *uplane;
@@ -595,7 +596,9 @@ static int get_v4l2_buffer32(struct v4l2_buffer __user *p64, · 8 unmodified lines
595596 get_user(memory, &p32->memory) ||
596597 put_user(memory, &p64->memory) ||
597598 get_user(length, &p32->length) ||
598− put_user(length, &p64->length))
599+ put_user(length, &p64->length) ||
600+ get_user(request_fd, &p32->request_fd) ||
601+ put_user(request_fd, &p64->request_fd))
599602 return -EFAULT;
600603
601604 if (V4L2_TYPE_IS_OUTPUT(type))
@@ -699,7 +702,7 @@ static int put_v4l2_buffer32(struct v4l2_buffer __user *p64, · 97 unmodified lines
699702 copy_in_user(&p32->timecode, &p64->timecode, sizeof(p64->timecode)) ||
700703 assign_in_user(&p32->sequence, &p64->sequence) ||
701704 assign_in_user(&p32->reserved2, &p64->reserved2) ||
702− assign_in_user(&p32->reserved, &p64->reserved) ||
705+ assign_in_user(&p32->request_fd, &p64->request_fd) ||
703706 get_user(length, &p64->length) ||
704707 put_user(length, &p32->length))
705708 return -EFAULT;
drivers/media/v4l2-core/v4l2-ioctl.c+2−2
@@ -474,13 +474,13 @@ static void v4l_print_buffer(const void *arg, bool write_only) · 473 unmodified lines
474474 const struct v4l2_plane *plane;
475475 int i;
476476
477− pr_cont("%02ld:%02d:%02d.%08ld index=%d, type=%s, flags=0x%08x, field=%s, sequence=%d, memory=%s",
477+ pr_cont("%02ld:%02d:%02d.%08ld index=%d, type=%s, request_fd=%d, flags=0x%08x, field=%s, sequence=%d, memory=%s",
478478 p->timestamp.tv_sec / 3600,
479479 (int)(p->timestamp.tv_sec / 60) % 60,
480480 (int)(p->timestamp.tv_sec % 60),
481481 (long)p->timestamp.tv_usec,
482482 p->index,
483− prt_names(p->type, v4l2_type_names),
483+ prt_names(p->type, v4l2_type_names), p->request_fd,
484484 p->flags, prt_names(p->field, v4l2_field_names),
485485 p->sequence, prt_names(p->memory, v4l2_memory_names));
486486
include/uapi/linux/videodev2.h+9−1
@@ -917,6 +917,7 @@ struct v4l2_plane { · 916 unmodified lines
917917 * @length: size in bytes of the buffer (NOT its payload) for single-plane
918918 * buffers (when type != *_MPLANE); number of elements in the
919919 * planes array for multi-plane buffers
920+ * @request_fd: fd of the request that this buffer should use
920921 *
921922 * Contains data exchanged by application and driver using one of the Streaming
922923 * I/O methods.
@@ -941,7 +942,10 @@ struct v4l2_buffer { · 18 unmodified lines
941942 } m;
942943 __u32 length;
943944 __u32 reserved2;
944− __u32 reserved;
945+ union {
946+ __s32 request_fd;
947+ __u32 reserved;
948+ };
945949 };
946950
947951 /* Flags for 'flags' field */
@@ -959,6 +963,8 @@ struct v4l2_buffer { · 11 unmodified lines
959963 #define V4L2_BUF_FLAG_BFRAME 0x00000020
960964 /* Buffer is ready, but the data contained within is corrupted. */
961965 #define V4L2_BUF_FLAG_ERROR 0x00000040
966+/* Buffer is added to an unqueued request */
967+#define V4L2_BUF_FLAG_IN_REQUEST 0x00000080
962968 /* timecode field is valid */
963969 #define V4L2_BUF_FLAG_TIMECODE 0x00000100
964970 /* Buffer is prepared for queuing */
@@ -977,6 +983,8 @@ struct v4l2_buffer { · 12 unmodified lines
977983 #define V4L2_BUF_FLAG_TSTAMP_SRC_SOE 0x00010000
978984 /* mem2mem encoder/decoder */
979985 #define V4L2_BUF_FLAG_LAST 0x00100000
986+/* request_fd is valid */
987+#define V4L2_BUF_FLAG_REQUEST_FD 0x00800000
980988
981989 /**
982990 * struct v4l2_exportbuffer - export of video buffer as DMABUF file descriptor