From 62d1a3a14301f23d1b4538310be67e7aefee33dd Mon Sep 17 00:00:00 2001 From: Mathieu Duponchelle Date: Wed, 22 Apr 2020 16:53:00 +0200 Subject: [PATCH] cccombiner: don't drop buffers on video timestamp discontinuities If we receive video buffers with non-perfect timestamps, the caption buffers' timestamps might fall in the interval between the end of one video buffer and the start of the next one. Make our criteria for dropping that the caption buffer has a timestamp older than the end of the previous video buffer, not older than the start of the new one, unless of course this is the first video buffer. Part-of: --- ext/closedcaption/gstcccombiner.c | 19 +++++++++++++++---- ext/closedcaption/gstcccombiner.h | 1 + 2 files changed, 16 insertions(+), 4 deletions(-) diff --git a/ext/closedcaption/gstcccombiner.c b/ext/closedcaption/gstcccombiner.c index a8adb78452..fbcf865693 100644 --- a/ext/closedcaption/gstcccombiner.c +++ b/ext/closedcaption/gstcccombiner.c @@ -175,8 +175,17 @@ gst_cc_combiner_collect_captions (GstCCCombiner * self, gboolean timeout) if (caption_time >= self->current_video_running_time_end) { gst_buffer_unref (caption_buf); break; + } else if (GST_CLOCK_TIME_IS_VALID (self->previous_video_running_time_end)) { + if (caption_time < self->previous_video_running_time_end) { + GST_WARNING_OBJECT (self, + "Caption buffer before end of last video frame, dropping"); + + gst_aggregator_pad_drop_buffer (caption_pad); + gst_buffer_unref (caption_buf); + continue; + } } else if (caption_time < self->current_video_running_time) { - GST_DEBUG_OBJECT (self, + GST_WARNING_OBJECT (self, "Caption buffer before current video frame, dropping"); gst_aggregator_pad_drop_buffer (caption_pad); @@ -359,6 +368,8 @@ gst_cc_combiner_aggregate (GstAggregator * aggregator, gboolean timeout) flow_ret = GST_FLOW_OK; } else { gst_buffer_replace (&self->current_video_buffer, NULL); + self->previous_video_running_time_end = + self->current_video_running_time_end; self->current_video_running_time = self->current_video_running_time_end = GST_CLOCK_TIME_NONE; } @@ -419,7 +430,7 @@ gst_cc_combiner_stop (GstAggregator * aggregator) self->video_fps_n = self->video_fps_d = 0; self->current_video_running_time = self->current_video_running_time_end = - GST_CLOCK_TIME_NONE; + self->previous_video_running_time_end = GST_CLOCK_TIME_NONE; gst_buffer_replace (&self->current_video_buffer, NULL); g_array_set_size (self->current_frame_captions, 0); @@ -436,7 +447,7 @@ gst_cc_combiner_flush (GstAggregator * aggregator) GST_AGGREGATOR_PAD (GST_AGGREGATOR_SRC_PAD (aggregator)); self->current_video_running_time = self->current_video_running_time_end = - GST_CLOCK_TIME_NONE; + self->previous_video_running_time_end = GST_CLOCK_TIME_NONE; gst_buffer_replace (&self->current_video_buffer, NULL); g_array_set_size (self->current_frame_captions, 0); @@ -630,7 +641,7 @@ gst_cc_combiner_init (GstCCCombiner * self) (GDestroyNotify) caption_data_clear); self->current_video_running_time = self->current_video_running_time_end = - GST_CLOCK_TIME_NONE; + self->previous_video_running_time_end = GST_CLOCK_TIME_NONE; self->current_caption_type = GST_VIDEO_CAPTION_TYPE_UNKNOWN; } diff --git a/ext/closedcaption/gstcccombiner.h b/ext/closedcaption/gstcccombiner.h index df3dff0c24..93f3d85fa6 100644 --- a/ext/closedcaption/gstcccombiner.h +++ b/ext/closedcaption/gstcccombiner.h @@ -45,6 +45,7 @@ struct _GstCCCombiner GstAggregator parent; gint video_fps_n, video_fps_d; + GstClockTime previous_video_running_time_end; GstClockTime current_video_running_time; GstClockTime current_video_running_time_end; GstBuffer *current_video_buffer;