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: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1207>
This commit is contained in:
Mathieu Duponchelle 2020-04-22 16:53:00 +02:00 committed by Sebastian Dröge
parent f02300eef5
commit 62d1a3a143
2 changed files with 16 additions and 4 deletions

View file

@ -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;
}

View file

@ -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;