diff --git a/subprojects/gst-plugins-base/gst/playback/gststreamsynchronizer.c b/subprojects/gst-plugins-base/gst/playback/gststreamsynchronizer.c index cd7115ef5b..ec50263072 100644 --- a/subprojects/gst-plugins-base/gst/playback/gststreamsynchronizer.c +++ b/subprojects/gst-plugins-base/gst/playback/gststreamsynchronizer.c @@ -257,6 +257,35 @@ gst_stream_synchronizer_iterate_internal_links (GstPad * pad, return it; } +static GstEvent * +set_event_rt_offset (GstStreamSynchronizer * self, GstPad * pad, + GstEvent * event) +{ + gint64 running_time_diff; + GstSyncStream *stream; + + GST_STREAM_SYNCHRONIZER_LOCK (self); + stream = gst_streamsync_pad_get_stream (pad); + running_time_diff = stream->segment.base; + gst_syncstream_unref (stream); + GST_STREAM_SYNCHRONIZER_UNLOCK (self); + + if (running_time_diff != -1) { + gint64 offset; + + event = gst_event_make_writable (event); + offset = gst_event_get_running_time_offset (event); + if (GST_PAD_IS_SRC (pad)) + offset -= running_time_diff; + else + offset += running_time_diff; + + gst_event_set_running_time_offset (event, offset); + } + + return event; +} + /* srcpad functions */ static gboolean gst_stream_synchronizer_src_event (GstPad * pad, GstObject * parent, @@ -268,59 +297,10 @@ gst_stream_synchronizer_src_event (GstPad * pad, GstObject * parent, GST_LOG_OBJECT (pad, "Handling event %s: %" GST_PTR_FORMAT, GST_EVENT_TYPE_NAME (event), event); - switch (GST_EVENT_TYPE (event)) { - case GST_EVENT_QOS:{ - gdouble proportion; - GstClockTimeDiff diff; - GstClockTime timestamp; - gint64 running_time_diff = -1; - GstSyncStream *stream; - - gst_event_parse_qos (event, NULL, &proportion, &diff, ×tamp); - gst_event_unref (event); - - GST_STREAM_SYNCHRONIZER_LOCK (self); - stream = gst_streamsync_pad_get_stream (pad); - running_time_diff = stream->segment.base; - gst_syncstream_unref (stream); - GST_STREAM_SYNCHRONIZER_UNLOCK (self); - - if (running_time_diff == -1) { - GST_WARNING_OBJECT (pad, "QOS event before group start"); - goto out; - } - if (timestamp < running_time_diff) { - GST_DEBUG_OBJECT (pad, "QOS event from previous group"); - goto out; - } - - GST_LOG_OBJECT (pad, - "Adjusting QOS event: %" GST_TIME_FORMAT " - %" GST_TIME_FORMAT " = %" - GST_TIME_FORMAT, GST_TIME_ARGS (timestamp), - GST_TIME_ARGS (running_time_diff), - GST_TIME_ARGS (timestamp - running_time_diff)); - - timestamp -= running_time_diff; - - /* That case is invalid for QoS events */ - if (diff < 0 && -diff > timestamp) { - GST_DEBUG_OBJECT (pad, "QOS event from previous group"); - ret = TRUE; - goto out; - } - - event = - gst_event_new_qos (GST_QOS_TYPE_UNDERFLOW, proportion, diff, - timestamp); - break; - } - default: - break; - } + event = set_event_rt_offset (self, pad, event); ret = gst_pad_event_default (pad, parent, event); -out: return ret; } @@ -763,6 +743,8 @@ gst_stream_synchronizer_sink_event (GstPad * pad, GstObject * parent, break; } + event = set_event_rt_offset (self, pad, event); + ret = gst_pad_event_default (pad, parent, event); done: