1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
|
From f54f1c28272913a216e91868ce0270e6c0d99b2e Mon Sep 17 00:00:00 2001
From: Mingke Wang <mingke.wang@freescale.com>
Date: Fri, 16 Oct 2015 19:31:32 +0800
Subject: [PATCH 01/16] 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.
Signed-off-by: Mingke Wang <mingke.wang@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 44f5f52..c08e3b0
--- a/ext/pango/gstbasetextoverlay.c
+++ b/ext/pango/gstbasetextoverlay.c
@@ -2227,16 +2227,44 @@ gst_base_text_overlay_push_frame (GstBaseTextOverlay * overlay,
}
}
- 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;
+
+ while (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
|