mirror of
https://gitlab.freedesktop.org/gstreamer/gstreamer.git
synced 2024-11-24 02:31:03 +00:00
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:
parent
f02300eef5
commit
62d1a3a143
2 changed files with 16 additions and 4 deletions
|
@ -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;
|
||||
}
|
||||
|
|
|
@ -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;
|
||||
|
|
Loading…
Reference in a new issue