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

Yuqing Zhu b54851 at freescale.com
Fri Jan 29 01:41:56 PST 2016


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}"
-- 
1.9.1



More information about the meta-freescale mailing list