From: Jan Schmidt Date: Wed, 28 Oct 2020 15:38:16 +0000 (+1100) Subject: qtmux: Chain up when releasing pad, and fix some locking. X-Git-Tag: 1.19.3~509^2~365 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=537e7d873a1cad282d689c8d6b0c83a3db4132f4;p=platform%2Fupstream%2Fgstreamer.git 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: --- diff --git a/gst/isomp4/gstqtmux.c b/gst/isomp4/gstqtmux.c index 8de89e8..8971a5e 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;