Fixed issue including basetextoverlay gstplaysink ssaparse subparse encodebin and gstplaybin
-[basetextoverlay plugin] Make memory copy when video buffer's memory is ready only -[gstplaysink plugin] Don't set async of custom text-sink to false -[ssaparse plugin] Enhance SSA text lines parsing -[subparse plugin] Set need_segment after sink pad received GST_EVENT_SEGMENT -[gststreamsynchronizer plugin] Send EOS event insterd of GAP event as GAP event has issue when A/V have different duration -[gststreamsynchronizer plugin] Stop sending second track EOS event if send the first track EOS return fail -[encodebin plugin] Need more buffers in output queue for better performance -[gstplaybin plugin] Remove default deinterlace flag Signed-off-by: Yuqing Zhu <b54...@freescale.com> --- ...rlay-make-memory-copy-when-video-buffer-s.patch | 129 ++++++++++++ ...-don-t-set-async-of-custom-text-sink-to-f.patch | 31 +++ ...3-ssaparse-enhance-SSA-text-lines-parsing.patch | 225 +++++++++++++++++++++ ...t-need_segment-after-sink-pad-received-GS.patch | 69 +++++++ .../do-not-change-eos-event-to-gap-event2.patch | 51 +++++ .../do-not-change-eos-event-to-gap-event3.patch | 33 +++ ...eed-more-buffers-in-output-queue-for-bett.patch | 34 ++++ ...ch => gstplaybin-remove-flag-deinterlace.patch} | 8 +- .../gstreamer/gstreamer1.0-plugins-base_%.bbappend | 16 +- 9 files changed, 588 insertions(+), 8 deletions(-) create mode 100644 recipes-multimedia/gstreamer/gstreamer1.0-plugins-base/0001-basetextoverlay-make-memory-copy-when-video-buffer-s.patch create mode 100644 recipes-multimedia/gstreamer/gstreamer1.0-plugins-base/0002-gstplaysink-don-t-set-async-of-custom-text-sink-to-f.patch create mode 100644 recipes-multimedia/gstreamer/gstreamer1.0-plugins-base/0003-ssaparse-enhance-SSA-text-lines-parsing.patch create mode 100644 recipes-multimedia/gstreamer/gstreamer1.0-plugins-base/0004-subparse-set-need_segment-after-sink-pad-received-GS.patch create mode 100755 recipes-multimedia/gstreamer/gstreamer1.0-plugins-base/do-not-change-eos-event-to-gap-event2.patch create mode 100755 recipes-multimedia/gstreamer/gstreamer1.0-plugins-base/do-not-change-eos-event-to-gap-event3.patch create mode 100644 recipes-multimedia/gstreamer/gstreamer1.0-plugins-base/encodebin-Need-more-buffers-in-output-queue-for-bett.patch rename recipes-multimedia/gstreamer/gstreamer1.0-plugins-base/{gstplaybin-enable-native-video.patch => gstplaybin-remove-flag-deinterlace.patch} (84%) 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 100644 index 0000000..0206b79 --- /dev/null +++ b/recipes-multimedia/gstreamer/gstreamer1.0-plugins-base/0001-basetextoverlay-make-memory-copy-when-video-buffer-s.patch @@ -0,0 +1,129 @@ +From 3781d40940d46d7e6a502092d24aac7997f6da5b Mon Sep 17 00:00:00 2001 +From: Mingke Wang <mingke.w...@freescale.com> +Date: Thu, 5 Mar 2015 12:06:23 +0800 +Subject: [PATCH 1/4] 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. +2. new feature is no added if caps has no feature during caps negotiation + +Upstream Status: Inappropriate [i.MX specific] + +Signed-off-by: Mingke Wang <mingke.w...@freescale.com> + +diff --git a/ext/pango/gstbasetextoverlay.c b/ext/pango/gstbasetextoverlay.c +index c919861..3c0a1d7 100755 +--- a/ext/pango/gstbasetextoverlay.c ++++ b/ext/pango/gstbasetextoverlay.c +@@ -747,6 +747,7 @@ gst_base_text_overlay_negotiate (GstBaseTextOverlay * overlay, GstCaps * caps) + if (f == NULL) { + f = gst_caps_features_new + (GST_CAPS_FEATURE_META_GST_VIDEO_OVERLAY_COMPOSITION, NULL); ++ gst_caps_set_features(overlay_caps, 0, f); + } else { + gst_caps_features_add (f, + GST_CAPS_FEATURE_META_GST_VIDEO_OVERLAY_COMPOSITION); +@@ -1890,16 +1891,71 @@ 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 m = gst_buffer_n_memory(video_frame); ++ gboolean mem_rdonly = FALSE; ++ GstMemory *mem; ++ GstBuffer *orig = video_frame; ++ ++ while (--m>=0) { ++ mem = gst_buffer_get_memory(video_frame, m); ++ if (GST_MEMORY_IS_READONLY(mem)) { ++ mem_rdonly = TRUE; ++ gst_memory_unref (mem); ++ break; ++ } ++ gst_memory_unref (mem); ++ } ++ ++ if (mem_rdonly) { ++ // 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. ++ GstBuffer *new_buf = gst_buffer_copy_region (video_frame, ++ GST_BUFFER_COPY_ALL | GST_BUFFER_COPY_DEEP, 0, -1); ++ ++ GST_DEBUG_OBJECT (overlay, "copy %s video frame buffer %p -> %p", ++ g_type_name (GST_MINI_OBJECT_TYPE (video_frame)), video_frame, new_buf); ++ ++ if (!new_buf) { ++ //maybe the allocator don't support mem_copy interface, the we just use ++ //gst_buffer_make_writable() to get a writable buffer. ++ video_frame = gst_buffer_make_writable (video_frame); ++ } else { ++ gst_mini_object_unref (video_frame); ++ GST_BUFFER_FLAG_UNSET (new_buf, GST_BUFFER_FLAG_TAG_MEMORY); ++ video_frame = new_buf; ++ } ++ ++ if (!video_frame) { ++ GST_WARNING_OBJECT (overlay, "make writable buffer failed"); ++ return GST_FLOW_OK; ++ } ++ ++ m = gst_buffer_n_memory(video_frame); ++ while (--m>=0) { ++ mem = gst_buffer_get_memory(video_frame, m); ++ GST_MEMORY_FLAG_UNSET (mem, GST_MEMORY_FLAG_READONLY); ++ gst_memory_unref (mem); ++ } ++ } 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; +@@ -1918,6 +1974,18 @@ gst_base_text_overlay_push_frame (GstBaseTextOverlay * overlay, + + gst_video_frame_unmap (&frame); + ++ if (mem_rdonly && orig == video_frame) { ++ //if we used the original buffer and it's mem is set to read only, ++ //recover the memory ready only flag since we unset it before ++ // gst_video_frame_map () ++ m = gst_buffer_n_memory(video_frame); ++ while (--m>=0) { ++ mem = gst_buffer_get_memory(video_frame, m); ++ GST_MEMORY_FLAGS(mem) |= (GST_MEMORY_FLAG_READONLY); ++ gst_memory_unref (mem); ++ } ++ } ++ + done: + + return gst_pad_push (overlay->srcpad, video_frame); +-- +1.7.9.5 + diff --git a/recipes-multimedia/gstreamer/gstreamer1.0-plugins-base/0002-gstplaysink-don-t-set-async-of-custom-text-sink-to-f.patch b/recipes-multimedia/gstreamer/gstreamer1.0-plugins-base/0002-gstplaysink-don-t-set-async-of-custom-text-sink-to-f.patch new file mode 100644 index 0000000..cd25f0a --- /dev/null +++ b/recipes-multimedia/gstreamer/gstreamer1.0-plugins-base/0002-gstplaysink-don-t-set-async-of-custom-text-sink-to-f.patch @@ -0,0 +1,31 @@ +From 0a78555ea6c8c2f1ee27ee4707e8d7aa00ab7a66 Mon Sep 17 00:00:00 2001 +From: Mingke Wang <mingke.w...@freescale.com> +Date: Thu, 19 Mar 2015 14:15:25 +0800 +Subject: [PATCH 2/4] gstplaysink: don't set async of custom text-sink to + false + +set async to false lead to A/V sync problem when seeking. +the preroll need use GAP event instead of set async to false. + +Upstream Status: Inappropriate [i.MX specific] + +Signed-off-by: Mingke Wang <mingke.w...@freescale.com> + +diff --git a/gst/playback/gstplaysink.c b/gst/playback/gstplaysink.c +old mode 100644 +new mode 100755 +index f5a2d42..fba0172 +--- a/gst/playback/gstplaysink.c ++++ b/gst/playback/gstplaysink.c +@@ -2408,7 +2408,7 @@ gen_text_chain (GstPlaySink * playsink) + G_TYPE_BOOLEAN); + if (elem) { + /* make sure the sparse subtitles don't participate in the preroll */ +- g_object_set (elem, "async", FALSE, NULL); ++ //g_object_set (elem, "async", FALSE, NULL); + GST_DEBUG_OBJECT (playsink, "adding custom text sink"); + gst_bin_add (bin, chain->sink); + /* NOTE streamsynchronizer needs streams decoupled */ +-- +1.7.9.5 + diff --git a/recipes-multimedia/gstreamer/gstreamer1.0-plugins-base/0003-ssaparse-enhance-SSA-text-lines-parsing.patch b/recipes-multimedia/gstreamer/gstreamer1.0-plugins-base/0003-ssaparse-enhance-SSA-text-lines-parsing.patch new file mode 100644 index 0000000..c3ce289 --- /dev/null +++ b/recipes-multimedia/gstreamer/gstreamer1.0-plugins-base/0003-ssaparse-enhance-SSA-text-lines-parsing.patch @@ -0,0 +1,225 @@ +From be6163cfa3a255493f9d75bad9541cbfe1723fee Mon Sep 17 00:00:00 2001 +From: Mingke Wang <mingke.w...@freescale.com> +Date: Thu, 19 Mar 2015 14:17:10 +0800 +Subject: [PATCH 3/4] ssaparse: enhance SSA text lines parsing. + +some parser will pass in the original ssa text line which starts with "Dialog:" +and there's are maybe multiple Dialog lines in one input buffer. + +Upstream Status: Inappropriate [i.MX specific] + +Signed-off-by: Mingke Wang <mingke.w...@freescale.com> + +diff --git a/gst/subparse/gstssaparse.c b/gst/subparse/gstssaparse.c +old mode 100644 +new mode 100755 +index 06ecef9..0ab5dce +--- a/gst/subparse/gstssaparse.c ++++ b/gst/subparse/gstssaparse.c +@@ -260,6 +260,7 @@ gst_ssa_parse_remove_override_codes (GstSsaParse * parse, gchar * txt) + * gst_ssa_parse_push_line: + * @parse: caller element + * @txt: text to push ++ * @size: text size need to be parse + * @start: timestamp for the buffer + * @duration: duration for the buffer + * +@@ -269,27 +270,133 @@ gst_ssa_parse_remove_override_codes (GstSsaParse * parse, gchar * txt) + * Returns: result of the push of the created buffer + */ + static GstFlowReturn +-gst_ssa_parse_push_line (GstSsaParse * parse, gchar * txt, ++gst_ssa_parse_push_line (GstSsaParse * parse, gchar * txt, gint size, + GstClockTime start, GstClockTime duration) + { + GstFlowReturn ret; + GstBuffer *buf; +- gchar *t, *escaped; ++ gchar *t, *text, *p, *escaped, *p_start, *p_end; + gint num, i, len; ++ GstClockTime start_time = G_MAXUINT64, end_time = 0; + +- num = atoi (txt); +- GST_LOG_OBJECT (parse, "Parsing line #%d at %" GST_TIME_FORMAT, +- num, GST_TIME_ARGS (start)); +- +- /* skip all non-text fields before the actual text */ ++ p = text = g_malloc(size + 1); ++ *p = '\0'; + t = txt; +- for (i = 0; i < 8; ++i) { +- t = strchr (t, ','); ++ ++ /* there are may have multiple dialogue lines at a time */ ++ while (*t) { ++ /* ignore leading white space characters */ ++ while (isspace(*t)) ++ t++; ++ ++ /* ignore Format: and Style: lines */ ++ if (strncmp(t, "Format:", 7) == 0 || strncmp(t, "Style:", 6) == 0) { ++ while (*t != '\0' && *t != '\n') { ++ t++; ++ } ++ } ++ ++ if (*t == '\0') ++ break; ++ ++ /* continue with next line */ ++ if (*t == '\n') { ++ t++; ++ continue; ++ } ++ ++ if(strncmp(t, "Dialogue:", 9) != 0) { ++ /* not started with "Dialogue:", it must be a line trimmed by demuxer */ ++ num = atoi (t); ++ GST_LOG_OBJECT (parse, "Parsing line #%d at %" GST_TIME_FORMAT, ++ num, GST_TIME_ARGS (start)); ++ ++ /* skip all non-text fields before the actual text */ ++ for (i = 0; i < 8; ++i) { ++ t = strchr (t, ','); ++ if (t == NULL) ++ break; ++ ++t; ++ } ++ } else { ++ /* started with "Dialogue:", update timestamp and duration */ ++ /* time format are like Dialog:Mark,0:00:01.02,0:00:03.04,xx,xxx,... */ ++ guint hour, min, sec, msec, len; ++ GstClockTime tmp; ++ gchar t_str[12] = {0}; ++ ++ /* find the first ',' */ ++ p_start = strchr (t, ','); ++ if (p_start) ++ p_end = strchr (++p_start, ','); ++ ++ if (p_start && p_end) { ++ /* copy text between first ',' and second ',' */ ++ strncpy(t_str, p_start, p_end - p_start); ++ if (sscanf (t_str, "%u:%u:%u.%u", &hour, &min, &sec, &msec) == 4) { ++ tmp = ((hour*3600) + (min*60) + sec) * GST_SECOND + msec*GST_MSECOND; ++ GST_DEBUG_OBJECT (parse, "Get start time:%02d:%02d:%02d:%03d\n", ++ hour, min, sec, msec); ++ if (start_time > tmp) ++ start_time = tmp; ++ } else { ++ GST_WARNING_OBJECT (parse, ++ "failed to parse ssa start timestamp string :%s", t_str); ++ } ++ ++ p_start = p_end; ++ p_end = strchr (++p_start, ','); ++ if (p_end) { ++ /* copy text between second ',' and third ',' */ ++ strncpy(t_str, p_start, p_end - p_start); ++ if (sscanf (t_str, "%u:%u:%u.%u", &hour, &min, &sec, &msec) == 4) { ++ tmp = ((hour*3600) + (min*60) + sec)*GST_SECOND + msec*GST_MSECOND; ++ GST_DEBUG_OBJECT(parse, "Get end time:%02d:%02d:%02d:%03d\n", ++ hour, min, sec, msec); ++ if (end_time < tmp) ++ end_time = tmp; ++ } else { ++ GST_WARNING_OBJECT (parse, ++ "failed to parse ssa end timestamp string :%s", t_str); ++ } ++ } ++ } ++ ++ /* now skip all non-text fields before the actual text */ ++ for (i = 0; i <= 8; ++i) { ++ t = strchr (t, ','); ++ if (t == NULL) ++ break; ++ ++t; ++ } ++ } ++ ++ /* line end before expected number of ',', not a Dialogue line */ + if (t == NULL) +- return GST_FLOW_ERROR; +- ++t; ++ break; ++ ++ /* if not the first line, and the last character of previous line is '\0', ++ * then replace it with '\N' */ ++ if (p != text && *p == '\0') { ++ *p++ = '\\'; ++ *p++ = 'N'; ++ } ++ ++ /* copy all actual text of this line */ ++ while ((*t != '\0') && (*t != '\n')) ++ *p++ = *t++; ++ ++ /* add a terminator at the end */ ++ *p = '\0'; ++ } ++ ++ /* not valid text found in this buffer return OK to let caller unref buffer */ ++ if (strlen(text) <= 0) { ++ GST_WARNING_OBJECT (parse, "Not valid text found in this buffer\n"); ++ return GST_FLOW_ERROR; + } + ++ t = text; + GST_LOG_OBJECT (parse, "Text : %s", t); + + if (gst_ssa_parse_remove_override_codes (parse, t)) { +@@ -307,13 +414,22 @@ gst_ssa_parse_push_line (GstSsaParse * parse, gchar * txt, + gst_buffer_fill (buf, 0, escaped, len + 1); + gst_buffer_set_size (buf, len); + g_free (escaped); ++ g_free(t); ++ ++ if (start_time != G_MAXUINT64) ++ GST_BUFFER_TIMESTAMP (buf) = start_time; ++ else ++ GST_BUFFER_TIMESTAMP (buf) = start; + +- GST_BUFFER_TIMESTAMP (buf) = start; +- GST_BUFFER_DURATION (buf) = duration; ++ if (end_time > start_time) ++ GST_BUFFER_DURATION (buf) = end_time - start_time; ++ else ++ GST_BUFFER_DURATION (buf) = duration; + + GST_LOG_OBJECT (parse, "Pushing buffer with timestamp %" GST_TIME_FORMAT +- " and duration %" GST_TIME_FORMAT, GST_TIME_ARGS (start), +- GST_TIME_ARGS (duration)); ++ " and duration %" GST_TIME_FORMAT, ++ GST_TIME_ARGS (GST_BUFFER_TIMESTAMP (buf)), ++ GST_TIME_ARGS (GST_BUFFER_DURATION (buf))); + + ret = gst_pad_push (parse->srcpad, buf); + +@@ -333,6 +449,7 @@ gst_ssa_parse_chain (GstPad * sinkpad, GstObject * parent, GstBuffer * buf) + GstClockTime ts; + gchar *txt; + GstMapInfo map; ++ gint size; + + if (G_UNLIKELY (!parse->framed)) + goto not_framed; +@@ -350,13 +467,14 @@ gst_ssa_parse_chain (GstPad * sinkpad, GstObject * parent, GstBuffer * buf) + /* make double-sure it's 0-terminated and all */ + gst_buffer_map (buf, &map, GST_MAP_READ); + txt = g_strndup ((gchar *) map.data, map.size); ++ size = map.size; + gst_buffer_unmap (buf, &map); + + if (txt == NULL) + goto empty_text; + + ts = GST_BUFFER_TIMESTAMP (buf); +- ret = gst_ssa_parse_push_line (parse, txt, ts, GST_BUFFER_DURATION (buf)); ++ ret = gst_ssa_parse_push_line (parse, txt, size, ts, GST_BUFFER_DURATION (buf)); + + if (ret != GST_FLOW_OK && GST_CLOCK_TIME_IS_VALID (ts)) { + GstSegment segment; +-- +1.7.9.5 + diff --git a/recipes-multimedia/gstreamer/gstreamer1.0-plugins-base/0004-subparse-set-need_segment-after-sink-pad-received-GS.patch b/recipes-multimedia/gstreamer/gstreamer1.0-plugins-base/0004-subparse-set-need_segment-after-sink-pad-received-GS.patch new file mode 100644 index 0000000..39d8ad3 --- /dev/null +++ b/recipes-multimedia/gstreamer/gstreamer1.0-plugins-base/0004-subparse-set-need_segment-after-sink-pad-received-GS.patch @@ -0,0 +1,69 @@ +From ed09c8fd2c9c2b5384b72cc70af3728be6694e64 Mon Sep 17 00:00:00 2001 +From: Mingke Wang <mingke.w...@freescale.com> +Date: Thu, 19 Mar 2015 14:20:26 +0800 +Subject: [PATCH 4/4] subparse: set need_segment after sink pad received + GST_EVENT_SEGMENT + +subparse works in push mode, chain funciton will be called once +up stream element finished the seeking and flushing. +if set need_segment flag in src pad event handler, the segment +event will be pushed earlier, result in the subtitle text will +be send out to down stream from the beginning. + +Upstream Status: Inappropriate [i.MX specific] + +Signed-off-by: Mingke Wang <mingke.w...@freescale.com> + +diff --git a/gst/subparse/gstsubparse.c b/gst/subparse/gstsubparse.c +old mode 100644 +new mode 100755 +index b565e93..7741ccc +--- a/gst/subparse/gstsubparse.c ++++ b/gst/subparse/gstsubparse.c +@@ -266,22 +266,20 @@ gst_sub_parse_src_event (GstPad * pad, GstObject * parent, GstEvent * event) + goto beach; + } + ++ /* Apply the seek to our segment */ ++ gst_segment_do_seek (&self->segment, rate, format, flags, ++ start_type, start, stop_type, stop, &update); ++ ++ GST_DEBUG_OBJECT (self, "segment after seek: %" GST_SEGMENT_FORMAT, ++ &self->segment); ++ + /* Convert that seek to a seeking in bytes at position 0, + FIXME: could use an index */ + ret = gst_pad_push_event (self->sinkpad, + gst_event_new_seek (rate, GST_FORMAT_BYTES, flags, + GST_SEEK_TYPE_SET, 0, GST_SEEK_TYPE_NONE, 0)); + +- if (ret) { +- /* Apply the seek to our segment */ +- gst_segment_do_seek (&self->segment, rate, format, flags, +- start_type, start, stop_type, stop, &update); +- +- GST_DEBUG_OBJECT (self, "segment after seek: %" GST_SEGMENT_FORMAT, +- &self->segment); +- +- self->need_segment = TRUE; +- } else { ++ if (!ret) { + GST_WARNING_OBJECT (self, "seek to 0 bytes failed"); + } + +@@ -1632,8 +1630,10 @@ gst_sub_parse_sink_event (GstPad * pad, GstObject * parent, GstEvent * event) + gst_event_parse_segment (event, &s); + if (s->format == GST_FORMAT_TIME) + gst_event_copy_segment (event, &self->segment); +- GST_DEBUG_OBJECT (self, "newsegment (%s)", +- gst_format_get_name (self->segment.format)); ++ GST_DEBUG_OBJECT (self, "newsegment (%s) %" GST_SEGMENT_FORMAT, ++ gst_format_get_name (self->segment.format), &self->segment); ++ ++ self->need_segment = TRUE; + + /* if not time format, we'll either start with a 0 timestamp anyway or + * it's following a seek in which case we'll have saved the requested +-- +1.7.9.5 + diff --git a/recipes-multimedia/gstreamer/gstreamer1.0-plugins-base/do-not-change-eos-event-to-gap-event2.patch b/recipes-multimedia/gstreamer/gstreamer1.0-plugins-base/do-not-change-eos-event-to-gap-event2.patch new file mode 100755 index 0000000..5b5b949 --- /dev/null +++ b/recipes-multimedia/gstreamer/gstreamer1.0-plugins-base/do-not-change-eos-event-to-gap-event2.patch @@ -0,0 +1,51 @@ +commit f9536544f5ad182b4f78d0143d1daa45dd64e624 +Author: Song Bing <b06...@freescale.com> +Date: Thu Oct 9 17:37:43 2014 +0800 + +[gststreamsynchronizer] send EOS event insterd of GAP event as GAP +event has issue when A/V have different duration. + +send EOS event insterd of GAP event as GAP event has issue when A/V have different duration. + +https://bugzilla.gnome.org/show_bug.cgi?id=736655 + +Upstream Status: Inappropriate [platform specific] + +Signed-off-by: Song Bing <b06...@freescale.com> + +diff --git a/gst/playback/gststreamsynchronizer.c b/gst/playback/gststreamsynchronizer.c +index 3e17c55..ff42d72 100644 +--- a/gst/playback/gststreamsynchronizer.c ++++ b/gst/playback/gststreamsynchronizer.c +@@ -488,19 +488,24 @@ gst_stream_synchronizer_sink_event (GstPad * pad, GstObject * parent, + } + g_slist_free (pads); + } else { +- /* if EOS, but no data has passed, then send EOS event */ ++ /* if EOS, but no data has passed, then send something to replace EOS ++ * for preroll purposes */ + if (!seen_data) { +- GstEvent *gap_event; ++ GstEvent *eos_event; + +- gap_event = gst_event_new_eos (); +- ret = gst_pad_push_event (srcpad, gap_event); ++ /* FIXME: change to EOS event as GAP event has issue when A/V have ++ * different duration */ ++ eos_event = gst_event_new_eos (); ++ ret = gst_pad_push_event (srcpad, eos_event); + } else { +- GstEvent *gap_event; ++ GstEvent *eos_event; + + /* FIXME: Also send a GAP event to let audio sinks start their + * clock in case they did not have enough data yet */ +- gap_event = gst_event_new_gap (timestamp, GST_CLOCK_TIME_NONE); +- ret = gst_pad_push_event (srcpad, gap_event); ++ /* FIXME: change to EOS event as GAP event has issue when A/V have ++ * different duration */ ++ eos_event = gst_event_new_eos (); ++ ret = gst_pad_push_event (srcpad, eos_event); + } + } + gst_object_unref (srcpad); diff --git a/recipes-multimedia/gstreamer/gstreamer1.0-plugins-base/do-not-change-eos-event-to-gap-event3.patch b/recipes-multimedia/gstreamer/gstreamer1.0-plugins-base/do-not-change-eos-event-to-gap-event3.patch new file mode 100755 index 0000000..4a8b23c --- /dev/null +++ b/recipes-multimedia/gstreamer/gstreamer1.0-plugins-base/do-not-change-eos-event-to-gap-event3.patch @@ -0,0 +1,33 @@ +commit 3f7052aac5e0118a9a9e09fff2f65091be448972 +Author: Song Bing <b06...@freescale.com> +Date: Thu Oct 23 13:35:13 2014 +0800 + +[streamsynchronizer] One stream can finish playback. + +As changed GAP event EOS event, so EOS will send more times, which will +cause send function return error. +Streamsynchronizer will don’t send second track EOS event if send the +first track EOS return fail. Fixed by ignore the return error. + +https://bugzilla.gnome.org/show_bug.cgi?id=736655 + +Upstream Status: Inappropriate [platform specific] + +Signed-off-by: Song Bing b06...@freescale.com + +diff --git a/gst/playback/gststreamsynchronizer.c b/gst/playback/gststreamsynchronizer.c +index ff42d72..d1732c3 100644 +--- a/gst/playback/gststreamsynchronizer.c ++++ b/gst/playback/gststreamsynchronizer.c +@@ -482,7 +482,10 @@ gst_stream_synchronizer_sink_event (GstPad * pad, GstObject * parent, + while (epad) { + pad = epad->data; + GST_DEBUG_OBJECT (pad, "Pushing EOS"); +- ret = ret && gst_pad_push_event (pad, gst_event_new_eos ()); ++ /* FIXME: remove error check as GAP changed to EOS will send EOS ++ * more times, which will cause return error and then don't send ++ * EOS event to following tracks. */ ++ gst_pad_push_event (pad, gst_event_new_eos ()); + gst_object_unref (pad); + epad = g_slist_next (epad); + } diff --git a/recipes-multimedia/gstreamer/gstreamer1.0-plugins-base/encodebin-Need-more-buffers-in-output-queue-for-bett.patch b/recipes-multimedia/gstreamer/gstreamer1.0-plugins-base/encodebin-Need-more-buffers-in-output-queue-for-bett.patch new file mode 100644 index 0000000..570a513 --- /dev/null +++ b/recipes-multimedia/gstreamer/gstreamer1.0-plugins-base/encodebin-Need-more-buffers-in-output-queue-for-bett.patch @@ -0,0 +1,34 @@ +From 540e02c92c75e08b90326863dc787fa5cadf9da6 Mon Sep 17 00:00:00 2001 +From: Song Bing <b06...@freescale.com> +Date: Fri, 13 Mar 2015 18:04:31 +0800 +Subject: [PATCH] encodebin: Need more buffers in output queue for better + performance + +Need more buffers in output queue for better performance + +https://bugzilla.gnome.org/show_bug.cgi?id=744191 + +Upstream Status: Inappropriate [i.MX specific] + +Signed-off-by: Song Bing <b06...@freescale.com> +--- + gst/encoding/gstencodebin.c | 3 +-- + 1 file changed, 1 insertion(+), 2 deletions(-) + +diff --git a/gst/encoding/gstencodebin.c b/gst/encoding/gstencodebin.c +index 6728e58..32daae4 100644 +--- a/gst/encoding/gstencodebin.c ++++ b/gst/encoding/gstencodebin.c +@@ -1138,8 +1138,7 @@ _create_stream_group (GstEncodeBin * ebin, GstEncodingProfile * sprof, + * We only use a 1buffer long queue here, the actual queueing will be done + * in the input queue */ + last = sgroup->outqueue = gst_element_factory_make ("queue", NULL); +- g_object_set (sgroup->outqueue, "max-size-buffers", (guint32) 1, +- "max-size-bytes", (guint32) 0, "max-size-time", (guint64) 0, ++ g_object_set (sgroup->outqueue, "max-size-time", (guint64) 0, + "silent", TRUE, NULL); + + gst_bin_add (GST_BIN (ebin), sgroup->outqueue); +-- +1.7.9.5 + diff --git a/recipes-multimedia/gstreamer/gstreamer1.0-plugins-base/gstplaybin-enable-native-video.patch b/recipes-multimedia/gstreamer/gstreamer1.0-plugins-base/gstplaybin-remove-flag-deinterlace.patch similarity index 84% rename from recipes-multimedia/gstreamer/gstreamer1.0-plugins-base/gstplaybin-enable-native-video.patch rename to recipes-multimedia/gstreamer/gstreamer1.0-plugins-base/gstplaybin-remove-flag-deinterlace.patch index 15322bd..ab6d4b1 100644 --- a/recipes-multimedia/gstreamer/gstreamer1.0-plugins-base/gstplaybin-enable-native-video.patch +++ b/recipes-multimedia/gstreamer/gstreamer1.0-plugins-base/gstplaybin-remove-flag-deinterlace.patch @@ -1,9 +1,9 @@ From 9cfb86cd100904f0ef2626f348695bd2d3416c6a Mon Sep 17 00:00:00 2001 From: Jian Li <jian...@freescale.com> Date: Mon, 23 Jun 2014 14:14:07 +0800 -Subject: [PATCH] gstplaybin enable native video +Subject: [PATCH] gstplaybin remove default deinterlace flag -- use native video patch in playbin for i.MX SoCs +- remove default deinterlace flag in playbin for i.MX SoCs Upstream Status: Inappropriate [platform specific] @@ -22,10 +22,10 @@ index fc02ca3..c342438 100644 #define DEFAULT_FLAGS GST_PLAY_FLAG_AUDIO | GST_PLAY_FLAG_VIDEO | GST_PLAY_FLAG_TEXT | \ - GST_PLAY_FLAG_SOFT_VOLUME | GST_PLAY_FLAG_DEINTERLACE | \ - GST_PLAY_FLAG_SOFT_COLORBALANCE -+ GST_PLAY_FLAG_SOFT_VOLUME | GST_PLAY_FLAG_NATIVE_VIDEO ++ GST_PLAY_FLAG_SOFT_VOLUME #define DEFAULT_N_VIDEO 0 #define DEFAULT_CURRENT_VIDEO -1 #define DEFAULT_N_AUDIO 0 --- +-- 1.7.9.5 diff --git a/recipes-multimedia/gstreamer/gstreamer1.0-plugins-base_%.bbappend b/recipes-multimedia/gstreamer/gstreamer1.0-plugins-base_%.bbappend index 5b939d4..d1659e3 100644 --- a/recipes-multimedia/gstreamer/gstreamer1.0-plugins-base_%.bbappend +++ b/recipes-multimedia/gstreamer/gstreamer1.0-plugins-base_%.bbappend @@ -1,9 +1,17 @@ - FILESEXTRAPATHS_prepend := "${THISDIR}/${PN}:" -SRC_URI_append_mxs = " file://gstplaybin-enable-native-video.patch" -SRC_URI_append_mx5 = " file://gstplaybin-enable-native-video.patch" -SRC_URI_append_mx6 = " file://gstplaybin-enable-native-video.patch" +SRC_URI_append = " file://gstplaybin-remove-flag-deinterlace.patch \ + file://do-not-change-eos-event-to-gap-event2.patch \ + file://do-not-change-eos-event-to-gap-event3.patch \ + file://0001-basetextoverlay-make-memory-copy-when-video-buffer-s.patch \ + file://0002-gstplaysink-don-t-set-async-of-custom-text-sink-to-f.patch \ + file://0003-ssaparse-enhance-SSA-text-lines-parsing.patch \ + file://0004-subparse-set-need_segment-after-sink-pad-received-GS.patch \ + file://encodebin-Need-more-buffers-in-output-queue-for-bett.patch \ +" + +# Enable pango lib +PACKAGECONFIG_append = " pango " PACKAGE_ARCH_mxs = "${MACHINE_SOCARCH}" PACKAGE_ARCH_mx5 = "${MACHINE_SOCARCH}" -- 1.9.1 -- _______________________________________________ meta-freescale mailing list meta-freescale@yoctoproject.org https://lists.yoctoproject.org/listinfo/meta-freescale