baseaudio: avoid taking extra ref on sink/src
Don't take an extra ref on the sink and source because that creates a reference cycle. Instead, use the invalidate method of the clock when the sink and source are freed. This way, we don't call into the time function anymore after the objects are disposed.
This commit is contained in:
parent
c7972692d3
commit
24226284b8
@ -272,9 +272,8 @@ gst_base_audio_sink_init (GstBaseAudioSink * baseaudiosink,
|
||||
baseaudiosink->provide_clock = DEFAULT_PROVIDE_CLOCK;
|
||||
baseaudiosink->priv->slave_method = DEFAULT_SLAVE_METHOD;
|
||||
|
||||
baseaudiosink->provided_clock = gst_audio_clock_new_full ("GstAudioSinkClock",
|
||||
(GstAudioClockGetTimeFunc) gst_base_audio_sink_get_time,
|
||||
gst_object_ref (baseaudiosink), (GDestroyNotify) gst_object_unref);
|
||||
baseaudiosink->provided_clock = gst_audio_clock_new ("GstAudioSinkClock",
|
||||
(GstAudioClockGetTimeFunc) gst_base_audio_sink_get_time, baseaudiosink);
|
||||
|
||||
GST_BASE_SINK (baseaudiosink)->can_activate_push = TRUE;
|
||||
GST_BASE_SINK (baseaudiosink)->can_activate_pull = DEFAULT_CAN_ACTIVATE_PULL;
|
||||
@ -311,9 +310,11 @@ gst_base_audio_sink_dispose (GObject * object)
|
||||
|
||||
sink = GST_BASE_AUDIO_SINK (object);
|
||||
|
||||
if (sink->provided_clock)
|
||||
if (sink->provided_clock) {
|
||||
gst_audio_clock_invalidate (sink->provided_clock);
|
||||
gst_object_unref (sink->provided_clock);
|
||||
sink->provided_clock = NULL;
|
||||
sink->provided_clock = NULL;
|
||||
}
|
||||
|
||||
if (sink->ringbuffer) {
|
||||
gst_object_unparent (GST_OBJECT_CAST (sink->ringbuffer));
|
||||
|
@ -250,9 +250,8 @@ gst_base_audio_src_init (GstBaseAudioSrc * baseaudiosrc,
|
||||
* value based on negotiated format. */
|
||||
GST_BASE_SRC (baseaudiosrc)->blocksize = 0;
|
||||
|
||||
baseaudiosrc->clock = gst_audio_clock_new_full ("GstAudioSrcClock",
|
||||
(GstAudioClockGetTimeFunc) gst_base_audio_src_get_time,
|
||||
gst_object_ref (baseaudiosrc), (GDestroyNotify) gst_object_unref);
|
||||
baseaudiosrc->clock = gst_audio_clock_new ("GstAudioSrcClock",
|
||||
(GstAudioClockGetTimeFunc) gst_base_audio_src_get_time, baseaudiosrc);
|
||||
|
||||
/* we are always a live source */
|
||||
gst_base_src_set_live (GST_BASE_SRC (baseaudiosrc), TRUE);
|
||||
@ -268,9 +267,11 @@ gst_base_audio_src_dispose (GObject * object)
|
||||
src = GST_BASE_AUDIO_SRC (object);
|
||||
|
||||
GST_OBJECT_LOCK (src);
|
||||
if (src->clock)
|
||||
if (src->clock) {
|
||||
gst_audio_clock_invalidate (src->clock);
|
||||
gst_object_unref (src->clock);
|
||||
src->clock = NULL;
|
||||
src->clock = NULL;
|
||||
}
|
||||
|
||||
if (src->ringbuffer) {
|
||||
gst_object_unparent (GST_OBJECT_CAST (src->ringbuffer));
|
||||
|
Loading…
x
Reference in New Issue
Block a user