From 537e7d873a1cad282d689c8d6b0c83a3db4132f4 Mon Sep 17 00:00:00 2001 From: Jan Schmidt Date: Thu, 29 Oct 2020 02:38:16 +1100 Subject: [PATCH] qtmux: Chain up when releasing pad, and fix some locking. Release pads by calling up into aggregator so it can do the right things. Don't clean up the pad until after that. Add some missing locks around some accesses to shared pad state. Part-of: --- gst/isomp4/gstqtmux.c | 17 +++++++++++++---- 1 file changed, 13 insertions(+), 4 deletions(-) diff --git a/gst/isomp4/gstqtmux.c b/gst/isomp4/gstqtmux.c index 8de89e8875..8971a5e442 100644 --- a/gst/isomp4/gstqtmux.c +++ b/gst/isomp4/gstqtmux.c @@ -3371,6 +3371,7 @@ gst_qt_mux_start_file (GstQTMux * qtmux) gst_aggregator_update_segment (GST_AGGREGATOR (qtmux), &segment); } + GST_OBJECT_LOCK (qtmux); qtmux->current_chunk_size = 0; qtmux->current_chunk_duration = 0; qtmux->current_chunk_offset = -1; @@ -3378,7 +3379,6 @@ gst_qt_mux_start_file (GstQTMux * qtmux) qtmux->current_pad = NULL; qtmux->longest_chunk = GST_CLOCK_TIME_NONE; - GST_OBJECT_LOCK (qtmux); for (l = GST_ELEMENT_CAST (qtmux)->sinkpads; l; l = l->next) { GstQTMuxPad *qtpad = (GstQTMuxPad *) l->data; @@ -6904,17 +6904,21 @@ gst_qt_mux_release_pad (GstElement * element, GstPad * pad) GST_DEBUG_OBJECT (element, "Releasing %s:%s", GST_DEBUG_PAD_NAME (pad)); - gst_qt_mux_pad_reset (muxpad); + /* Take a ref to the pad so we can clean it up after removing it from the element */ + pad = gst_object_ref (pad); - gst_element_remove_pad (element, pad); + /* Do aggregate level cleanup */ + GST_ELEMENT_CLASS (parent_class)->release_pad (element, pad); + GST_OBJECT_LOCK (mux); if (mux->current_pad && GST_PAD (mux->current_pad) == pad) { mux->current_pad = NULL; mux->current_chunk_size = 0; mux->current_chunk_duration = 0; } - GST_OBJECT_LOCK (mux); + gst_qt_mux_pad_reset (muxpad); + if (GST_ELEMENT (mux)->sinkpads == NULL) { /* No more outstanding request pads, reset our counters */ mux->video_pads = 0; @@ -6922,6 +6926,8 @@ gst_qt_mux_release_pad (GstElement * element, GstPad * pad) mux->subtitle_pads = 0; } GST_OBJECT_UNLOCK (mux); + + gst_object_unref (pad); } static GstAggregatorPad * @@ -6989,9 +6995,12 @@ gst_qt_mux_request_new_pad (GstElement * element, g_free (name); /* set up pad */ + GST_OBJECT_LOCK (qtmux); gst_qt_mux_pad_reset (qtpad); qtpad->trak = atom_trak_new (qtmux->context); + atom_moov_add_trak (qtmux->moov, qtpad->trak); + GST_OBJECT_UNLOCK (qtmux); /* set up pad functions */ qtpad->set_caps = setcaps_func;