assrender: Consume text buffers if they're to be displayed in the next 500ms
authorSebastian Dröge <sebastian.droege@collabora.co.uk>
Sat, 27 Feb 2010 10:23:14 +0000 (11:23 +0100)
committerSebastian Dröge <sebastian.droege@collabora.co.uk>
Sat, 27 Feb 2010 10:43:49 +0000 (11:43 +0100)
Instead of only consuming them if they're to be display now. Consuming
them then might make following buffers with the same timestamp to
be too late.

ext/assrender/gstassrender.c

index 771be41..8a5603e 100644 (file)
@@ -988,12 +988,7 @@ gst_ass_render_chain_video (GstPad * pad, GstBuffer * buffer)
         gst_segment_to_running_time (&render->video_segment, GST_FORMAT_TIME,
         GST_BUFFER_TIMESTAMP (buffer) + GST_BUFFER_DURATION (buffer));
 
-    if (sub_running_time <= vid_running_time_end) {
-      gst_ass_render_process_text (render, render->subtitle_pending,
-          sub_running_time, sub_running_time_end - sub_running_time);
-      render->subtitle_pending = NULL;
-      g_cond_signal (render->subtitle_cond);
-    } else if (sub_running_time_end < vid_running_time) {
+    if (sub_running_time_end < vid_running_time) {
       gst_buffer_unref (render->subtitle_pending);
       GST_DEBUG_OBJECT (render,
           "Too late text buffer, dropping (%" GST_TIME_FORMAT " < %"
@@ -1001,6 +996,11 @@ gst_ass_render_chain_video (GstPad * pad, GstBuffer * buffer)
           GST_TIME_ARGS (vid_running_time));
       render->subtitle_pending = NULL;
       g_cond_signal (render->subtitle_cond);
+    } else if (sub_running_time <= vid_running_time_end + GST_SECOND / 2) {
+      gst_ass_render_process_text (render, render->subtitle_pending,
+          sub_running_time, sub_running_time_end - sub_running_time);
+      render->subtitle_pending = NULL;
+      g_cond_signal (render->subtitle_cond);
     }
   }
   g_mutex_unlock (render->subtitle_mutex);
@@ -1100,7 +1100,7 @@ gst_ass_render_chain_text (GstPad * pad, GstBuffer * buffer)
     vid_running_time +=
         gst_util_uint64_scale (GST_SECOND, render->fps_d, render->fps_n);
 
-  if (sub_running_time > vid_running_time) {
+  if (sub_running_time > vid_running_time + GST_SECOND / 2) {
     g_assert (render->subtitle_pending == NULL);
     g_mutex_lock (render->subtitle_mutex);
     if (G_UNLIKELY (render->subtitle_flushing)) {