playsink: Fix volume element leak
authorVineeth TM <vineeth.tm@samsung.com>
Thu, 15 Oct 2015 01:01:38 +0000 (10:01 +0900)
committerSebastian Dröge <sebastian@centricular.com>
Sat, 17 Oct 2015 08:03:50 +0000 (11:03 +0300)
In case sink implements a streamvolume interface, volume element is being got
from the sink. But this is transfer full. So the memory should be freed before
setting it to NULL. This was resulting in major memory leaks

https://bugzilla.gnome.org/show_bug.cgi?id=755867

gst/playback/gstplaysink.c

index aa43111..6250134 100644 (file)
@@ -3472,6 +3472,8 @@ gst_play_sink_do_reconfigure (GstPlaySink * playsink)
 
         activate_chain (GST_PLAY_CHAIN (playsink->audiochain), FALSE);
         disconnect_audio_chain (playsink->audiochain, playsink);
+        if (playsink->audiochain->volume)
+          gst_object_unref (playsink->audiochain->volume);
         playsink->audiochain->volume = NULL;
         if (playsink->audiochain->ts_offset)
           gst_object_unref (playsink->audiochain->ts_offset);
@@ -3580,6 +3582,8 @@ gst_play_sink_do_reconfigure (GstPlaySink * playsink)
 
       if (playsink->audiochain->sink_volume) {
         disconnect_audio_chain (playsink->audiochain, playsink);
+        if (playsink->audiochain->volume)
+          gst_object_unref (playsink->audiochain->volume);
         playsink->audiochain->volume = NULL;
         if (playsink->audiochain->ts_offset)
           gst_object_unref (playsink->audiochain->ts_offset);
@@ -4786,6 +4790,8 @@ gst_play_sink_change_state (GstElement * element, GstStateChange transition)
         /* remove our links to the volume elements when they were
          * provided by a sink */
         disconnect_audio_chain (playsink->audiochain, playsink);
+        if (playsink->audiochain->volume)
+          gst_object_unref (playsink->audiochain->volume);
         playsink->audiochain->volume = NULL;
       }