X-Git-Url: https://gerrit.automotivelinux.org/gerrit/gitweb?a=blobdiff_plain;f=recipes-graphics%2Fwayland%2Fweston%2F0003-gst-recorder-Use-USERPTR-instead-of-DMABUF-for-VSP-o.patch;fp=recipes-graphics%2Fwayland%2Fweston%2F0003-gst-recorder-Use-USERPTR-instead-of-DMABUF-for-VSP-o.patch;h=0000000000000000000000000000000000000000;hb=c58cb01cb560da122ea64ba76d6b68a183e2f457;hp=6f8d1dc94e4ac77ae22f5eed6db6e3838c3d75d6;hpb=23492d46ea0fd81aa05528ad423bb5e1a10e111b;p=AGL%2Fmeta-agl-demo.git diff --git a/recipes-graphics/wayland/weston/0003-gst-recorder-Use-USERPTR-instead-of-DMABUF-for-VSP-o.patch b/recipes-graphics/wayland/weston/0003-gst-recorder-Use-USERPTR-instead-of-DMABUF-for-VSP-o.patch deleted file mode 100644 index 6f8d1dc94..000000000 --- a/recipes-graphics/wayland/weston/0003-gst-recorder-Use-USERPTR-instead-of-DMABUF-for-VSP-o.patch +++ /dev/null @@ -1,261 +0,0 @@ -From f450d78f49ab55149b6b64251dd4c4f1ad04c9aa Mon Sep 17 00:00:00 2001 -From: Damian Hobson-Garcia -Date: Thu, 11 May 2017 12:05:56 +0900 -Subject: [PATCH 3/4] gst-recorder: Use USERPTR instead of DMABUF for VSP - output - -The RCar-Gen3 encoder requires buffers to be allocated and managed -externally when using dmabuf buffers. Since different sized buffers -are required for each output, the VSP cannot allocate these buffers -externally. The encoder provides its own buffers in USERPTR mode, so -switch to that. ---- - libweston/gst-recorder.c | 100 +++++++++++++++++++++++++++++------------------ - 1 file changed, 63 insertions(+), 37 deletions(-) - -diff --git a/libweston/gst-recorder.c b/libweston/gst-recorder.c -index d46d4f0..d2cf8dc 100644 ---- a/libweston/gst-recorder.c -+++ b/libweston/gst-recorder.c -@@ -311,7 +311,7 @@ vsp_init(const char *devname) - weston_log("failed to open subdev '%s'\n", buf); - goto error_media; - } -- else if ((vsp->output.fd = open(media_entity_get_devname(entity), O_RDWR | O_NONBLOCK)) < 0) -+ else if ((vsp->output.fd = open(media_entity_get_devname(entity), O_RDWR )) < 0) - { - weston_log("failed to open device '%s'\n", media_entity_get_devname(entity)); - goto error_media; -@@ -464,7 +464,8 @@ vsp_request_buffers(vsp_data_t *vsp, vsp_port_n port, unsigned int num) - memset(&reqbuf, 0, sizeof(reqbuf)); - reqbuf.type = (port == VSP_PORT_INPUT) ? - V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE : V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE; -- reqbuf.memory = V4L2_MEMORY_DMABUF; -+ reqbuf.memory = (port == VSP_PORT_INPUT) ? -+ V4L2_MEMORY_DMABUF : V4L2_MEMORY_USERPTR; - reqbuf.count = num; - if (ioctl(fd, VIDIOC_REQBUFS, &reqbuf) < 0) { - weston_log("VSP: %s REQBUFS failed: %d\n", -@@ -536,7 +537,8 @@ vsp_input_buffer_dequeue_dmafd(vsp_data_t *vsp) - - /* ...enqueue output buffer */ - static int --vsp_output_buffer_queue_dmafd(vsp_data_t *vsp, int i, int dmafd[]) -+vsp_output_buffer_queue_userptr(vsp_data_t *vsp, int i, void * omx_mem, -+ int y_plane_size, int c_plane_size) - { - vsp_media_pad_t *pad = &vsp->output; - struct v4l2_plane planes[2]; -@@ -546,16 +548,23 @@ vsp_output_buffer_queue_dmafd(vsp_data_t *vsp, int i, int dmafd[]) - memset(&buf, 0, sizeof(buf)); - memset(planes, 0, sizeof(planes)); - buf.type = V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE; -- buf.memory = V4L2_MEMORY_DMABUF; -+ buf.memory = V4L2_MEMORY_USERPTR; - buf.index = i; - buf.m.planes = planes; - buf.length = VSP_OUTPUT_BUFFERS_PLANE; -- buf.m.planes[0].m.fd = dmafd[0]; -- buf.m.planes[1].m.fd = dmafd[1]; -+ -+ buf.m.planes[0].m.userptr = (unsigned long) omx_mem; -+ buf.m.planes[1].m.userptr = (unsigned long) omx_mem + y_plane_size; -+ -+ buf.m.planes[0].bytesused = y_plane_size; -+ buf.m.planes[0].length = y_plane_size; -+ -+ buf.m.planes[1].bytesused = c_plane_size; -+ buf.m.planes[1].length = c_plane_size; - - /* ...submit buffer */ - if (ioctl(pad->fd, VIDIOC_QBUF, &buf) < 0) { -- weston_log("VSP: output dmafd queue failed: %d\n", errno); -+ weston_log("VSP: output buffer queue failed: %d\n", errno); - return -1; - } - -@@ -564,7 +573,7 @@ vsp_output_buffer_queue_dmafd(vsp_data_t *vsp, int i, int dmafd[]) - - /* ...dequeue output buffer */ - static int --vsp_output_buffer_dequeue_dmafd(vsp_data_t *vsp) -+vsp_output_buffer_dequeue_userptr(vsp_data_t *vsp) - { - vsp_media_pad_t *pad = &vsp->output; - struct v4l2_buffer buf; -@@ -574,12 +583,12 @@ vsp_output_buffer_dequeue_dmafd(vsp_data_t *vsp) - memset(&buf, 0, sizeof(buf)); - memset(planes, 0, sizeof(planes)); - buf.type = V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE; -- buf.memory = V4L2_MEMORY_DMABUF; -+ buf.memory = V4L2_MEMORY_USERPTR; - buf.m.planes = planes; - buf.length = VSP_OUTPUT_BUFFERS_PLANE; - - if (ioctl(pad->fd, VIDIOC_DQBUF, &buf) < 0) { -- weston_log("VSP: output dmafd de-queue failed: %d\n", errno); -+ weston_log("VSP: output buffer de-queue failed: %d\n", errno); - return -1; - } - -@@ -876,33 +885,25 @@ err: - } - - static int --gst_recorder_omx_buffer_acquire(struct gst_recorder *r, GstBuffer **ret_buf, int fd[]) -+gst_recorder_omx_buffer_acquire(struct gst_recorder *r, GstBuffer **ret_buf, GstMapInfo *info) - { -- unsigned int i; - GstFlowReturn ret; - GstBuffer *buf; -- guint n_mem; -- GstMemory *mem; - - ret = gst_buffer_pool_acquire_buffer(r->omx_pool, &buf, NULL); - if (ret != GST_FLOW_OK) { -- weston_log("OMX buffer acquire failed\n"); -- return -1; -+ weston_log("GStreamer buffer acquire failed\n"); -+ goto err_release; - } - -- n_mem = gst_buffer_n_memory(buf); -- if (n_mem < 1) { -- weston_log("Buffer with no mem!\n"); -+ if (!gst_buffer_is_writable(buf)) { -+ weston_log("GStreamer buffer not writable\n"); - goto err_release; - } - -- for (i = 0; i < n_mem; i++) { -- mem = gst_buffer_peek_memory (buf, i); -- if (!gst_is_dmabuf_memory (mem)) { -- weston_log("Mem not dmabuf\n"); -- goto err_release; -- } -- fd[i] = gst_dmabuf_memory_get_fd (mem); -+ if (!gst_buffer_map(buf, info, GST_MAP_WRITE)) { -+ weston_log("Cannot map GStreamer buffer\n"); -+ goto err_release; - } - - *ret_buf = buf; -@@ -956,7 +957,7 @@ gst_recorder_create(struct gst_recorder_settings *settings) - - /* omx */ - ptr += sprintf(ptr, -- "omxh264enc target-bitrate=%d control-rate=2 name=my_encoder ! " -+ "omxh264enc target-bitrate=%d control-rate=2 no-copy=true name=my_encoder ! " - "video/x-h264,width=%d,height=%d ! ", - r->set->bitrate, r->set->crop.width, r->set->crop.height); - -@@ -1009,6 +1010,12 @@ gst_recorder_create(struct gst_recorder_settings *settings) - "framerate", GST_TYPE_FRACTION, 0, DEFAULT_FPS, - NULL), NULL); - -+ g_object_set(G_OBJECT(r->appsrc), -+ "stream-type", 0, -+ "format", GST_FORMAT_TIME, -+ "is-live", TRUE, -+ NULL); -+ - r->appsrc_pad = gst_element_get_static_pad(GST_ELEMENT_CAST(r->appsrc), "src"); - if (!r->appsrc_pad) - weston_log("Failed to get src0 pad of appsrc\n"); -@@ -1088,14 +1095,23 @@ gst_recorder_process_dmafd(struct gst_recorder *r, int fd, int stride) - { - int ret; - GstBuffer *buf; -- int omx_fd[2]; -+ GstMapInfo info; -+ int ysize; -+ int csize; - - /* get GST buffer */ -- if (gst_recorder_omx_buffer_acquire(r, &buf, omx_fd) < 0) { -+ if (gst_recorder_omx_buffer_acquire(r, &buf, &info) < 0) { - weston_log("VSP: can not acquire GST buffer, dropping frame\n"); - return 0; - } - -+ ysize = r->set->crop.width * r->set->crop.height; -+#ifdef VSP_OUTPUT_NV16 -+ csize = ysize; -+#else -+ csize = ysize / 2; -+#endif -+ - pthread_mutex_lock(&r->vsp->mutex); - /* setup vsp */ - if (vsp_set_formats(r->vsp, r->set->width, r->set->height, &r->set->crop) < 0) { -@@ -1116,7 +1132,7 @@ gst_recorder_process_dmafd(struct gst_recorder *r, int fd, int stride) - } - - /* queue output biffer */ -- if (vsp_output_buffer_queue_dmafd(r->vsp, 0, omx_fd) < 0) { -+ if (vsp_output_buffer_queue_userptr(r->vsp, 0, info.data, ysize, csize) < 0) { - weston_log("can not queue OMX buffer %d to VSP\n", 0); - gst_recorder_omx_buffer_release(r, buf); - goto err_vsp; -@@ -1147,11 +1163,15 @@ gst_recorder_process_dmafd(struct gst_recorder *r, int fd, int stride) - } - - /* dequeue output */ -- if (vsp_output_buffer_dequeue_dmafd(r->vsp) < 0) { -- weston_log("VSP: failed to dequeu output buffer\n"); -+ if (vsp_output_buffer_dequeue_userptr(r->vsp) < 0) { -+ weston_log("VSP: failed to dequeue output buffer\n"); -+ gst_buffer_unmap(buf, &info); - gst_recorder_omx_buffer_release(r, buf); -- /* fall through */ - } else { -+ -+ gst_buffer_unmap(buf, &info); -+ gst_buffer_set_size(buf, ysize + csize); -+ - /* set timestamp */ - gst_recorder_set_timestamp(r, buf); - -@@ -1174,6 +1194,7 @@ gst_recorder_process_dmafd(struct gst_recorder *r, int fd, int stride) - vsp_request_buffers(r->vsp, VSP_PORT_OUTPUT, 0); - - pthread_mutex_unlock(&r->vsp->mutex); -+ close(fd); - return 0; - - err_vsp: -@@ -1181,6 +1202,7 @@ err_vsp: - /* finish vsp here */ - err: - pthread_mutex_unlock(&r->vsp->mutex); -+ close(fd); - return -1; - } - -@@ -1197,9 +1219,13 @@ gst_recorder_frame_dmafd(struct gst_recorder *r, int fd, int stride) - goto unlock; - } - -- /* The mutex is never released while encoding, so this point should -- * never be reached if input.valid is true. */ -- assert(!r->input.valid); -+ /* It is possible that the frame callback can be called mutiple -+ * times before the worker thread wakes up. In this case -+ * drop all buf the first frame */ -+ if(r->input.valid) { -+ close(fd); -+ goto unlock; -+ } - - r->input.prime_fd = fd; - r->input.stride = stride; -@@ -1209,5 +1235,5 @@ gst_recorder_frame_dmafd(struct gst_recorder *r, int fd, int stride) - unlock: - pthread_mutex_unlock(&r->mutex); - -- return 0; -+ return ret; - } --- -2.9.2 -