[meta-freescale] [meta-fsl-arm][PATCH 1/3] gstreamer1.0-plugins-base: Make memory copy when video buffer's memory is read only
Yuqing Zhu
b54851 at freescale.com
Mon Jan 18 01:34:00 PST 2016
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.
Signed-off-by: Yuqing Zhu <b54851 at freescale.com>
---
...rlay-make-memory-copy-when-video-buffer-s.patch | 80 ++++++++++++++++++++++
.../gstreamer/gstreamer1.0-plugins-base_%.bbappend | 7 +-
2 files changed, 85 insertions(+), 2 deletions(-)
create mode 100755 recipes-multimedia/gstreamer/gstreamer1.0-plugins-base/0001-basetextoverlay-make-memory-copy-when-video-buffer-s.patch
diff --git a/recipes-multimedia/gstreamer/gstreamer1.0-plugins-base/0001-basetextoverlay-make-memory-copy-when-video-buffer-s.patch b/recipes-multimedia/gstreamer/gstreamer1.0-plugins-base/0001-basetextoverlay-make-memory-copy-when-video-buffer-s.patch
new file mode 100755
index 0000000..eaff00f
--- /dev/null
+++ b/recipes-multimedia/gstreamer/gstreamer1.0-plugins-base/0001-basetextoverlay-make-memory-copy-when-video-buffer-s.patch
@@ -0,0 +1,80 @@
+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.
+
+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 ff4d77b..3e72175 100644
--- a/recipes-multimedia/gstreamer/gstreamer1.0-plugins-base_%.bbappend
+++ b/recipes-multimedia/gstreamer/gstreamer1.0-plugins-base_%.bbappend
@@ -1,7 +1,10 @@
FILESEXTRAPATHS_prepend := "${THISDIR}/${PN}:"
-SRC_URI_append_mx6 = " file://gstplaybin-remove-flag-deinterlace.patch"
-SRC_URI_append_mx7 = " file://gstplaybin-remove-flag-deinterlace.patch"
+IMX_PATCHES = " file://gstplaybin-remove-flag-deinterlace.patch \
+ file://0001-basetextoverlay-make-memory-copy-when-video-buffer-s.patch \
+"
+SRC_URI_append_mx6 = "${IMX_PATCHES}"
+SRC_URI_append_mx7 = "${IMX_PATCHES}"
PACKAGE_ARCH_mx6 = "${MACHINE_SOCARCH}"
PACKAGE_ARCH_mx7 = "${MACHINE_SOCARCH}"
--
1.9.1
More information about the meta-freescale
mailing list