[meta-freescale] [meta-fsl-arm][PATCH v2 2/2] gstreamer1.0-plugins-base: Make memory copy when video buffer's memory is read only

Carlos Rafael Giani dv at pseudoterminal.org
Tue Mar 29 00:05:58 PDT 2016


I do see the reason behind the patch. As you explained earlier, the 
VPU's output buffers are re-used as references, so they should not be 
modified.

Before I give this patch an Ack however, I need to know if the 
suggestions from https://bugzilla.gnome.org/show_bug.cgi?id=747495 
regarding the NO_SHARE flag were tried out. They seem less invasive to 
me while accomplishing the same end result.

On 2016-01-29 10:41, Yuqing Zhu wrote:
> The VPU decoder need the output framebuffer as a reference buffer for decoding.
> The output buffer shouldn’t be changed, if we blend the subtitle on the buffer directly,
> then the decoded video frame will have artificial jitter around the subtitle.
>
> Since gst_buffer_make_writable just lookup the refcount to determine if
> a buffer is writable, and it will use _gst_buffer_copy() which don't
> perform a deep memory copy even if the flag of a memory is set to
> GST_MEMORY_FLAG_READONLY. So, we detect the memory flag and use
> gst_buffer_copy_region with GST_BUFFER_COPY_DEEP parameter to perform
> deep memory copy. if the allocator of a memory don't support mem_copy
> interface, then it will return NULL, if this case, we can use
> gst_buffer_make_writable() to get a shared memory buffer or the orignal
> buffer if the buffer's refcount is 1.
>
> Signed-off-by: Yuqing Zhu <b54851 at freescale.com>
> ---
>   ...rlay-make-memory-copy-when-video-buffer-s.patch | 82 ++++++++++++++++++++++
>   .../gstreamer/gstreamer1.0-plugins-base_%.bbappend |  1 +
>   2 files changed, 83 insertions(+)
>   create mode 100755 recipes-multimedia/gstreamer/gstreamer1.0-plugins-base/0002-basetextoverlay-make-memory-copy-when-video-buffer-s.patch
>
> diff --git a/recipes-multimedia/gstreamer/gstreamer1.0-plugins-base/0002-basetextoverlay-make-memory-copy-when-video-buffer-s.patch b/recipes-multimedia/gstreamer/gstreamer1.0-plugins-base/0002-basetextoverlay-make-memory-copy-when-video-buffer-s.patch
> new file mode 100755
> index 0000000..33628c9
> --- /dev/null
> +++ b/recipes-multimedia/gstreamer/gstreamer1.0-plugins-base/0002-basetextoverlay-make-memory-copy-when-video-buffer-s.patch
> @@ -0,0 +1,82 @@
> +From 0092d07195aa5d950bc10dfb05bd9547f67028a3 Mon Sep 17 00:00:00 2001
> +From: Mingke Wang <mingke.wang at freescale.com>
> +Date: Fri, 16 Oct 2015 19:31:32 +0800
> +Subject: [PATCH 1/9] basetextoverlay: make memory copy when video buffer's
> + memory is ready only
> +
> +1. since gst_buffer_make_writable just lookup the refcount to determine if
> +   a buffer is writable, and it will use _gst_buffer_copy() which don't
> +   perform a deep memory copy even if the flag of a memory is set to
> +   GST_MEMORY_FLAG_READONLY. So, we detect the memory flag and use
> +   gst_buffer_copy_region with GST_BUFFER_COPY_DEEP parameter to perform
> +   deep memory copy. if the allocator of a memory don't support mem_copy
> +   interface, the it will return NULL, if this case, we can use
> +   gst_buffer_make_writable() to get a shared memory buffer or the orignal
> +   buffer if the buffer's refcount is 1.
> +
> +https://bugzilla.gnome.org/show_bug.cgi?id=747495
> +
> +Upstream-Status: Inappropriate [i.MX specific]
> +
> +Signed-off-by: Mingke Wang <mingke.wang at freescale.com>
> +---
> + ext/pango/gstbasetextoverlay.c | 32 ++++++++++++++++++++++++++++++--
> + 1 file changed, 30 insertions(+), 2 deletions(-)
> + mode change 100644 => 100755 ext/pango/gstbasetextoverlay.c
> +
> +diff --git a/ext/pango/gstbasetextoverlay.c b/ext/pango/gstbasetextoverlay.c
> +old mode 100644
> +new mode 100755
> +index bde4303..3e98aa1
> +--- a/ext/pango/gstbasetextoverlay.c
> ++++ b/ext/pango/gstbasetextoverlay.c
> +@@ -2085,16 +2085,44 @@ gst_base_text_overlay_push_frame (GstBaseTextOverlay * overlay,
> +   if (gst_pad_check_reconfigure (overlay->srcpad))
> +     gst_base_text_overlay_negotiate (overlay, NULL);
> +
> +-  video_frame = gst_buffer_make_writable (video_frame);
> +-
> +   if (overlay->attach_compo_to_buffer) {
> +     GST_DEBUG_OBJECT (overlay, "Attaching text overlay image to video buffer");
> ++    video_frame = gst_buffer_make_writable (video_frame);
> +     gst_buffer_add_video_overlay_composition_meta (video_frame,
> +         overlay->composition);
> +     /* FIXME: emulate shaded background box if want_shading=true */
> +     goto done;
> +   }
> +
> ++  gint idx = 0;
> ++  gboolean mem_rdonly = FALSE;
> ++  GstMemory *mem;
> ++  guint n = gst_buffer_n_memory(video_frame);
> ++  while ((idx < n) && (mem = gst_buffer_get_memory(video_frame, idx++))) {
> ++    if (GST_MEMORY_IS_READONLY(mem)) {
> ++      gst_memory_unref (mem);
> ++      mem_rdonly = TRUE;
> ++      break;
> ++    }
> ++    gst_memory_unref (mem);
> ++  }
> ++
> ++  if (mem_rdonly) {
> ++    GstBuffer *new_buf = gst_buffer_copy_region (video_frame,
> ++        GST_BUFFER_COPY_ALL | GST_BUFFER_COPY_DEEP, 0, -1);
> ++
> ++    if (!new_buf) {
> ++      GST_WARNING_OBJECT(overlay,
> ++                "buffer memory read only, but copy memory failed");
> ++      goto done;
> ++    } else {
> ++      gst_buffer_unref (video_frame);
> ++      video_frame = new_buf;
> ++    }
> ++  } else {
> ++    video_frame = gst_buffer_make_writable (video_frame);
> ++  }
> ++
> +   if (!gst_video_frame_map (&frame, &overlay->info, video_frame,
> +           GST_MAP_READWRITE))
> +     goto invalid_frame;
> +--
> +1.9.1
> +
> diff --git a/recipes-multimedia/gstreamer/gstreamer1.0-plugins-base_%.bbappend b/recipes-multimedia/gstreamer/gstreamer1.0-plugins-base_%.bbappend
> index f1992c3..4ad87bb 100644
> --- a/recipes-multimedia/gstreamer/gstreamer1.0-plugins-base_%.bbappend
> +++ b/recipes-multimedia/gstreamer/gstreamer1.0-plugins-base_%.bbappend
> @@ -2,6 +2,7 @@ FILESEXTRAPATHS_prepend := "${THISDIR}/${PN}:"
>   
>   IMX_PATCHES = " file://gstplaybin-remove-flag-deinterlace.patch \
>                   file://0001-MMFMWK-7030-Linux_MX6QP_ARD-IMXCameraApp-When-Enable.patch \
> +                file://0002-basetextoverlay-make-memory-copy-when-video-buffer-s.patch \
>   "
>   
>   SRC_URI_append_mx6 = "${IMX_PATCHES}"



More information about the meta-freescale mailing list