Blob Blame History Raw
From eb21b6827e25b2c943025a662cde2049c0454a6b Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Caol=C3=A1n=20McNamara?= <caolanm@redhat.com>
Date: Fri, 15 Aug 2014 15:59:58 +0100
Subject: [PATCH] Related: rhbz#1130264 plausible fix for reported crash

Change-Id: I4ccdf19bfc7986881f7022109f22f47a0f493591
---
 avmedia/source/gstreamer/gstplayer.cxx | 20 ++++++++++++++++----
 avmedia/source/gstreamer/gstplayer.hxx |  3 +++
 2 files changed, 19 insertions(+), 4 deletions(-)

diff --git a/avmedia/source/gstreamer/gstplayer.cxx b/avmedia/source/gstreamer/gstplayer.cxx
index ceea8e2..836e89e 100644
--- a/avmedia/source/gstreamer/gstplayer.cxx
+++ b/avmedia/source/gstreamer/gstplayer.cxx
@@ -74,7 +74,9 @@ Player::Player( const uno::Reference< lang::XMultiServiceFactory >& rxMgr ) :
     mpXOverlay( NULL ),
     mnDuration( 0 ),
     mnWidth( 0 ),
-    mnHeight( 0 )
+    mnHeight( 0 ),
+    mnWatchID( 0 ),
+    mbWatchID( false )
 {
     // Initialize GStreamer library
     int argc = 1;
@@ -127,11 +129,15 @@ void SAL_CALL Player::disposing()
             g_object_unref( G_OBJECT ( mpXOverlay ) );
             mpXOverlay = NULL;
         }
+
+    }
+    if (mbWatchID)
+    {
+        g_source_remove(mnWatchID);
+        mbWatchID = false;
     }
 }
 
-// ------------------------------------------------------------------------------
-
 static gboolean pipeline_bus_callback( GstBus *, GstMessage *message, gpointer data )
 {
     Player* pPlayer = static_cast<Player*>(data);
@@ -357,7 +363,13 @@ void Player::preparePlaybin( const OUString& rURL, GstElement *pSink )
         g_object_set( G_OBJECT( mpPlaybin ), "uri", ascURL.getStr() , NULL );
 
         pBus = gst_element_get_bus( mpPlaybin );
-        gst_bus_add_watch( pBus, pipeline_bus_callback, this );
+        if (mbWatchID)
+        {
+            g_source_remove(mnWatchID);
+            mbWatchID = false;
+        }
+        mnWatchID = gst_bus_add_watch( pBus, pipeline_bus_callback, this );
+        mbWatchID = true;
         DBG( "%p set sync handler", this );
 #ifdef AVMEDIA_GST_0_10
         gst_bus_set_sync_handler( pBus, pipeline_bus_sync_handler, this );
diff --git a/avmedia/source/gstreamer/gstplayer.hxx b/avmedia/source/gstreamer/gstplayer.hxx
index 2426eed..33c9e4d 100644
--- a/avmedia/source/gstreamer/gstplayer.hxx
+++ b/avmedia/source/gstreamer/gstplayer.hxx
@@ -97,6 +97,9 @@ protected:
     int                     mnWidth;
     int                     mnHeight;
 
+    guint                   mnWatchID;
+    bool                    mbWatchID;
+
     osl::Condition          maSizeCondition;
 };
 
-- 
1.9.3