diff --git a/src/v4l2.c b/src/v4l2.c index a3b41be..f45de1c 100644 --- a/src/v4l2.c +++ b/src/v4l2.c @@ -253,6 +253,34 @@ int v4l2_dequeue_buffer(int video_fd, int request_fd, unsigned int type, return 0; } +int v4l2_export_buffer(int video_fd, unsigned int type, unsigned int index, + unsigned int flags, int *export_fds, + unsigned int export_fds_count) +{ + struct v4l2_exportbuffer exportbuffer; + unsigned int i; + int rc; + + for (i = 0; i < export_fds_count; i++) { + memset(&exportbuffer, 0, sizeof(exportbuffer)); + exportbuffer.type = type; + exportbuffer.index = index; + exportbuffer.plane = i; + exportbuffer.flags = flags; + + rc = ioctl(video_fd, VIDIOC_EXPBUF, &exportbuffer); + if (rc < 0) { + sunxi_cedrus_log("Unable to export buffer: %s\n", + strerror(errno)); + return -1; + } + + export_fds[i] = exportbuffer.fd; + } + + return 0; +} + int v4l2_set_control(int video_fd, int request_fd, unsigned int id, void *data, unsigned int size) { diff --git a/src/v4l2.h b/src/v4l2.h index 5bd2537..1d28037 100644 --- a/src/v4l2.h +++ b/src/v4l2.h @@ -46,6 +46,9 @@ int v4l2_queue_buffer(int video_fd, int request_fd, unsigned int type, unsigned int buffers_count); int v4l2_dequeue_buffer(int video_fd, int request_fd, unsigned int type, unsigned int index, unsigned int buffers_count); +int v4l2_export_buffer(int video_fd, unsigned int type, unsigned int index, + unsigned int flags, int *export_fds, + unsigned int export_fds_count); int v4l2_set_control(int video_fd, int request_fd, unsigned int id, void *data, unsigned int size); int v4l2_set_stream(int video_fd, unsigned int type, bool enable);