From: Sebastian Dröge Date: Mon, 29 Mar 2021 09:15:18 +0000 (+0300) Subject: avwait: Don't reset time tracking when receiving the same segment again X-Git-Tag: 1.19.3~507^2~599 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=5bcfb2dda011d4ce55798c6c8eea7d9e904dbcfa;p=platform%2Fupstream%2Fgstreamer.git avwait: Don't reset time tracking when receiving the same segment again This causes avwait to go back into "dropping" mode until audio and video are synced again, which is unnecessary when the segment didn't actually change. Part-of: --- diff --git a/gst/timecode/gstavwait.c b/gst/timecode/gstavwait.c index be391d0..eff57f1 100644 --- a/gst/timecode/gstavwait.c +++ b/gst/timecode/gstavwait.c @@ -616,26 +616,32 @@ gst_avwait_vsink_event (GstPad * pad, GstObject * parent, GstEvent * event) switch (GST_EVENT_TYPE (event)) { case GST_EVENT_SEGMENT:{ + const GstSegment *segment; gboolean send_message = FALSE; + gboolean segment_changed; g_mutex_lock (&self->mutex); - gst_event_copy_segment (event, &self->vsegment); + gst_event_parse_segment (event, &segment); + segment_changed = !gst_segment_is_equal (segment, &self->vsegment); + self->vsegment = *segment; if (self->vsegment.format != GST_FORMAT_TIME) { GST_ERROR_OBJECT (self, "Invalid segment format"); g_mutex_unlock (&self->mutex); gst_event_unref (event); return FALSE; } - GST_DEBUG_OBJECT (self, "First time reset in video segment"); - self->running_time_to_wait_for = GST_CLOCK_TIME_NONE; - self->running_time_to_end_at = GST_CLOCK_TIME_NONE; - self->audio_running_time_to_wait_for = GST_CLOCK_TIME_NONE; - self->audio_running_time_to_end_at = GST_CLOCK_TIME_NONE; - if (!self->dropping) { - self->dropping = TRUE; - send_message = TRUE; + if (segment_changed) { + GST_DEBUG_OBJECT (self, "First time reset in video segment"); + self->running_time_to_wait_for = GST_CLOCK_TIME_NONE; + self->running_time_to_end_at = GST_CLOCK_TIME_NONE; + self->audio_running_time_to_wait_for = GST_CLOCK_TIME_NONE; + self->audio_running_time_to_end_at = GST_CLOCK_TIME_NONE; + if (!self->dropping) { + self->dropping = TRUE; + send_message = TRUE; + } + self->vsegment.position = GST_CLOCK_TIME_NONE; } - self->vsegment.position = GST_CLOCK_TIME_NONE; g_mutex_unlock (&self->mutex); if (send_message) @@ -750,18 +756,28 @@ gst_avwait_asink_event (GstPad * pad, GstObject * parent, GstEvent * event) GST_LOG_OBJECT (pad, "Got %s event", GST_EVENT_TYPE_NAME (event)); switch (GST_EVENT_TYPE (event)) { - case GST_EVENT_SEGMENT: + case GST_EVENT_SEGMENT:{ + const GstSegment *segment; + gboolean segment_changed; + g_mutex_lock (&self->mutex); - gst_event_copy_segment (event, &self->asegment); + gst_event_parse_segment (event, &segment); + segment_changed = !gst_segment_is_equal (segment, &self->asegment); + self->asegment = *segment; + if (self->asegment.format != GST_FORMAT_TIME) { GST_ERROR_OBJECT (self, "Invalid segment format"); g_mutex_unlock (&self->mutex); gst_event_unref (event); return FALSE; } - self->asegment.position = GST_CLOCK_TIME_NONE; + + if (segment_changed) { + self->asegment.position = GST_CLOCK_TIME_NONE; + } g_mutex_unlock (&self->mutex); break; + } case GST_EVENT_FLUSH_START: g_mutex_lock (&self->mutex); self->audio_flush_flag = TRUE;