summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTim-Philipp Müller <tim@centricular.com>2019-04-06 14:39:22 +0100
committerTim-Philipp Müller <tim@centricular.com>2019-05-02 11:04:12 +0100
commitd9f112ba63767215086aedba3774feec7c146bf3 (patch)
treeff574ad723f2857fcd89ebdea51a8f531dd6cec8
parent5898acce9f4144c6e9ca2d9bacc408f859f50e3a (diff)
downloadgstreamer-plugins-bad-d9f112ba63767215086aedba3774feec7c146bf3.tar.gz
assrender: fix seeking backwards
Use proper API to flush libass events when we do a flushing seek, and also do it in FLUSH_STOP rather than FLUSH_START, so we can be sure streaming has stopped. Fixes seeking back in time. Something seems to have changed in libass that renders the old manual way of flushing events ineffective and libass then seems to ignore timestamps that are older than the ones last seen then if we do it the old way. Fixes #916
-rw-r--r--ext/assrender/gstassrender.c17
1 files changed, 5 insertions, 12 deletions
diff --git a/ext/assrender/gstassrender.c b/ext/assrender/gstassrender.c
index 07e33d452..f0ee846fb 100644
--- a/ext/assrender/gstassrender.c
+++ b/ext/assrender/gstassrender.c
@@ -1713,7 +1713,6 @@ gst_ass_render_query_video (GstPad * pad, GstObject * parent, GstQuery * query)
static gboolean
gst_ass_render_event_text (GstPad * pad, GstObject * parent, GstEvent * event)
{
- gint i;
gboolean ret = FALSE;
GstAssRender *render = GST_ASS_RENDER (parent);
@@ -1784,6 +1783,11 @@ gst_ass_render_event_text (GstPad * pad, GstObject * parent, GstEvent * event)
break;
}
case GST_EVENT_FLUSH_STOP:
+ g_mutex_lock (&render->ass_mutex);
+ if (render->ass_track) {
+ ass_flush_events (render->ass_track);
+ }
+ g_mutex_unlock (&render->ass_mutex);
GST_ASS_RENDER_LOCK (render);
GST_INFO_OBJECT (render, "text flush stop");
render->subtitle_flushing = FALSE;
@@ -1796,17 +1800,6 @@ gst_ass_render_event_text (GstPad * pad, GstObject * parent, GstEvent * event)
break;
case GST_EVENT_FLUSH_START:
GST_DEBUG_OBJECT (render, "text flush start");
- g_mutex_lock (&render->ass_mutex);
- if (render->ass_track) {
- /* delete any events on the ass_track */
- for (i = 0; i < render->ass_track->n_events; i++) {
- GST_DEBUG_OBJECT (render, "deleted event with eid %i", i);
- ass_free_event (render->ass_track, i);
- }
- render->ass_track->n_events = 0;
- GST_DEBUG_OBJECT (render, "done flushing");
- }
- g_mutex_unlock (&render->ass_mutex);
GST_ASS_RENDER_LOCK (render);
render->subtitle_flushing = TRUE;
GST_ASS_RENDER_BROADCAST (render);