[Title] [gstreamer] GstBus signal watch should be removed on clean up
[Issues] NA
[Problem] Memory leak fix in WebAudio.
[Solution] Cherry picked.
[Cherry-Picker] Praveen R Jadhav <praveen.j@samsung.com>
https://bugs.webkit.org/show_bug.cgi?id=107544
Reviewed by Philippe Normand.
Our gstreamer backend code currently calls gst_bus_add_signal_watch()
on GstBus to add a signal watch. As per the gstreamer documentation,
"To clean up, the caller is responsible for calling
gst_bus_remove_signal_watch() as many times as this function is
called". This is because gst_bus_add_signal_watch() causes the GstBus
object to be ref'd and gst_bus_remove_signal_watch() needs to be
called to properly unref it.
This patch makes sure that gst_bus_remove_signal_watch() is called
on the GstBus object when cleaning up. This patch also uses smart
pointers for GstBus objects for consistency.
No new tests, no behavior change for layout tests.
* platform/audio/gstreamer/AudioDestinationGStreamer.cpp:
(WebCore::AudioDestinationGStreamer::AudioDestinationGStreamer):
(WebCore::AudioDestinationGStreamer::~AudioDestinationGStreamer):
* platform/audio/gstreamer/AudioFileReaderGStreamer.cpp:
(WebCore::AudioFileReader::~AudioFileReader):
(WebCore::AudioFileReader::decodeAudioForBusCreation):
* platform/graphics/gstreamer/GStreamerGWorld.cpp:
(WebCore::GStreamerGWorld::GStreamerGWorld):
* platform/graphics/gstreamer/GStreamerVersioning.cpp:
(webkitGstPipelineGetBus):
* platform/graphics/gstreamer/GStreamerVersioning.h:
* platform/graphics/gstreamer/MediaPlayerPrivateGStreamer.cpp:
(WebCore::MediaPlayerPrivateGStreamer::~MediaPlayerPrivateGStreamer):
git-svn-id: http://svn.webkit.org/repository/webkit/trunk@140443
268f45cc-cd09-0410-ab3c-
d52691b4dbfc
Conflicts:
Source/WebCore/ChangeLog
Source/WebCore/platform/graphics/gstreamer/GStreamerGWorld.cpp
Source/WebCore/platform/graphics/gstreamer/MediaPlayerPrivateGStreamer.cpp
Change-Id: Ib1142fe97c9641e7c40cdba75f5e7a4ba2d28ff0
, m_audioSessionManager(AudioSessionManagerGStreamerTizen::createAudioSessionManager())
#endif
{
-#if !ENABLE(TIZEN_WEB_AUDIO)
- static bool gstInitialized = false;
- if (!gstInitialized)
- gstInitialized = gst_init_check(0, 0, 0);
- ASSERT_WITH_MESSAGE(gstInitialized, "GStreamer initialization failed");
-#endif
#if ENABLE(TIZEN_GSTREAMER_AUDIO)
if (m_audioSessionManager)
m_audioSessionManager->registerAudioSessionManager(MM_SESSION_TYPE_SHARE, AudioDestinationAudioSessionNotifyCallback, this);
#endif
m_pipeline = gst_pipeline_new("play");
- GstBus* bus = gst_pipeline_get_bus(GST_PIPELINE(m_pipeline));
+ GRefPtr<GstBus> bus = webkitGstPipelineGetBus(GST_PIPELINE(m_pipeline));
ASSERT(bus);
- gst_bus_add_signal_watch(bus);
- g_signal_connect(bus, "message", G_CALLBACK(messageCallback), this);
- gst_object_unref(bus);
+ gst_bus_add_signal_watch(bus.get());
+ g_signal_connect(bus.get(), "message", G_CALLBACK(messageCallback), this);
GstElement* webkitAudioSrc = reinterpret_cast<GstElement*>(g_object_new(WEBKIT_TYPE_WEB_AUDIO_SRC,
"rate", sampleRate,
AudioDestinationGStreamer::~AudioDestinationGStreamer()
{
- GstBus* bus = gst_pipeline_get_bus(GST_PIPELINE(m_pipeline));
+ GRefPtr<GstBus> bus = webkitGstPipelineGetBus(GST_PIPELINE(m_pipeline));
ASSERT(bus);
- g_signal_handlers_disconnect_by_func(bus, reinterpret_cast<gpointer>(messageCallback), this);
- gst_object_unref(bus);
+ g_signal_handlers_disconnect_by_func(bus.get(), reinterpret_cast<gpointer>(messageCallback), this);
+ gst_bus_remove_signal_watch(bus.get());
+
gst_element_set_state(m_pipeline, GST_STATE_NULL);
#if ENABLE(TIZEN_GSTREAMER_AUDIO)
AudioFileReader::~AudioFileReader()
{
if (m_pipeline) {
- GstBus* bus = gst_pipeline_get_bus(GST_PIPELINE(m_pipeline));
+ GRefPtr<GstBus> bus = webkitGstPipelineGetBus(GST_PIPELINE(m_pipeline));
ASSERT(bus);
- g_signal_handlers_disconnect_by_func(bus, reinterpret_cast<gpointer>(messageCallback), this);
- gst_object_unref(bus);
+ g_signal_handlers_disconnect_by_func(bus.get(), reinterpret_cast<gpointer>(messageCallback), this);
+ gst_bus_remove_signal_watch(bus.get());
+
gst_element_set_state(m_pipeline, GST_STATE_NULL);
gst_object_unref(GST_OBJECT(m_pipeline));
}
// A deinterleave element is added once a src pad becomes available in decodebin.
m_pipeline = gst_pipeline_new(0);
- GstBus* bus = gst_pipeline_get_bus(GST_PIPELINE(m_pipeline));
+ GRefPtr<GstBus> bus = webkitGstPipelineGetBus(GST_PIPELINE(m_pipeline));
ASSERT(bus);
- gst_bus_add_signal_watch(bus);
- g_signal_connect(bus, "message", G_CALLBACK(messageCallback), this);
- gst_object_unref(bus);
+ gst_bus_add_signal_watch(bus.get());
+ g_signal_connect(bus.get(), "message", G_CALLBACK(messageCallback), this);
GstElement* source;
if (m_data) {
{
m_sampleRate = sampleRate;
-#if !ENABLE(TIZEN_WEB_AUDIO)
- static bool gstInitialized = false;
- if (!gstInitialized)
- gstInitialized = gst_init_check(0, 0, 0);
-
- if (!gstInitialized)
- return nullptr;
-#endif
-
m_frontLeftBuffers = gst_buffer_list_new();
m_frontRightBuffers = gst_buffer_list_new();