From 38beda2b8efb4a00a50eafa985511e58d80d84a2 Mon Sep 17 00:00:00 2001 From: Edward Hervey Date: Thu, 9 Feb 2023 14:54:27 +0100 Subject: [PATCH] adaptivedemux2: Handle return in seek handling Various code path were repeating the same logic, and risk forgetting a lock release. Unify all of them Part-of: --- .../ext/adaptivedemux2/gstadaptivedemux.c | 51 +++++----------------- 1 file changed, 11 insertions(+), 40 deletions(-) diff --git a/subprojects/gst-plugins-good/ext/adaptivedemux2/gstadaptivedemux.c b/subprojects/gst-plugins-good/ext/adaptivedemux2/gstadaptivedemux.c index fddc3de..1bd192b 100644 --- a/subprojects/gst-plugins-good/ext/adaptivedemux2/gstadaptivedemux.c +++ b/subprojects/gst-plugins-good/ext/adaptivedemux2/gstadaptivedemux.c @@ -2010,7 +2010,7 @@ gst_adaptive_demux_handle_seek_event (GstAdaptiveDemux * demux, gint64 start, stop; guint32 seqnum; gboolean update; - gboolean ret; + gboolean ret = FALSE; GstSegment oldsegment; GstEvent *flush_event; @@ -2058,9 +2058,7 @@ gst_adaptive_demux_handle_seek_event (GstAdaptiveDemux * demux, GST_ERROR_OBJECT (demux, "Instant rate change seeks only supported in the " "same direction, without flushing and position change"); - GST_ADAPTIVE_SCHEDULER_UNLOCK (demux); - GST_API_UNLOCK (demux); - return FALSE; + goto unlock_return; } rate_multiplier = rate / demux->segment.rate; @@ -2076,32 +2074,17 @@ gst_adaptive_demux_handle_seek_event (GstAdaptiveDemux * demux, demux->instant_rate_multiplier = rate_multiplier; GST_ADAPTIVE_DEMUX_SEGMENT_UNLOCK (demux); } - - GST_ADAPTIVE_SCHEDULER_UNLOCK (demux); - GST_API_UNLOCK (demux); - gst_event_unref (event); - - return ret; + goto unlock_return; } - if (!gst_adaptive_demux_can_seek (demux)) { - GST_ADAPTIVE_SCHEDULER_UNLOCK (demux); - - GST_API_UNLOCK (demux); - gst_event_unref (event); - return FALSE; - } + if (!gst_adaptive_demux_can_seek (demux)) + goto unlock_return; /* We can only accept flushing seeks from this point onward */ if (!(flags & GST_SEEK_FLAG_FLUSH)) { GST_ERROR_OBJECT (demux, "Non-flushing non-instant-rate seeks are not possible"); - - GST_ADAPTIVE_SCHEDULER_UNLOCK (demux); - - GST_API_UNLOCK (demux); - gst_event_unref (event); - return FALSE; + goto unlock_return; } if (gst_adaptive_demux_is_live (demux)) { @@ -2111,11 +2094,8 @@ gst_adaptive_demux_handle_seek_event (GstAdaptiveDemux * demux, if (!gst_adaptive_demux_get_live_seek_range (demux, &range_start, &range_stop)) { - GST_ADAPTIVE_SCHEDULER_UNLOCK (demux); - GST_API_UNLOCK (demux); - gst_event_unref (event); GST_WARNING_OBJECT (demux, "Failure getting the live seek ranges"); - return FALSE; + goto unlock_return; } GST_DEBUG_OBJECT (demux, @@ -2177,12 +2157,8 @@ gst_adaptive_demux_handle_seek_event (GstAdaptiveDemux * demux, } /* If the seek position is still outside of the seekable range, refuse the seek */ - if (!start_valid || !stop_valid) { - GST_ADAPTIVE_SCHEDULER_UNLOCK (demux); - GST_API_UNLOCK (demux); - gst_event_unref (event); - return FALSE; - } + if (!start_valid || !stop_valid) + goto unlock_return; /* Re-create seek event with changed/updated values */ if (changed) { @@ -2267,14 +2243,8 @@ gst_adaptive_demux_handle_seek_event (GstAdaptiveDemux * demux, if (gst_adaptive_demux2_stream_seek (stream, rate >= 0, stream_seek_flags, ts, &ts) != GST_FLOW_OK) { - GST_ADAPTIVE_SCHEDULER_UNLOCK (demux); GST_ADAPTIVE_DEMUX_SEGMENT_UNLOCK (demux); - - GST_API_UNLOCK (demux); - - gst_event_unref (event); - - return FALSE; + goto unlock_return; } /* replace event with a new one without snapping to seek on all streams */ gst_event_unref (event); @@ -2339,6 +2309,7 @@ gst_adaptive_demux_handle_seek_event (GstAdaptiveDemux * demux, /* Restart the demux */ gst_adaptive_demux_start_tasks (demux); +unlock_return: GST_ADAPTIVE_SCHEDULER_UNLOCK (demux); GST_API_UNLOCK (demux); gst_event_unref (event); -- 2.7.4