[banshee/gapless-ng: 190/836] [libbanshee]Fix video playback with playbin2



commit 75105342186deb69e2f59bf778f095736c61a98b
Author: Christopher James Halse Rogers <raof ubuntu com>
Date:   Wed Oct 7 15:29:57 2009 +1100

    [libbanshee]Fix video playback with playbin2
    
    This works around a deadlock in playbin2 when g_object_get is called in bp_video_find_xoverlay.
    Since the videosink (should) never changes, add a reference to it in BansheePlayer and initialise
    it when setting up the video pipeline.

 libbanshee/banshee-player-private.h |    1 +
 libbanshee/banshee-player-video.c   |   16 +++++++---------
 2 files changed, 8 insertions(+), 9 deletions(-)
---
diff --git a/libbanshee/banshee-player-private.h b/libbanshee/banshee-player-private.h
index 5d12aab..1512a84 100644
--- a/libbanshee/banshee-player-private.h
+++ b/libbanshee/banshee-player-private.h
@@ -111,6 +111,7 @@ struct BansheePlayer {
     GstElement *audiobin;
     GstElement *equalizer;
     GstElement *preamp;
+    GstElement *videosink;
     gint equalizer_status;
     gdouble current_volume;
     
diff --git a/libbanshee/banshee-player-video.c b/libbanshee/banshee-player-video.c
index 21bc0ce..4adcdfc 100644
--- a/libbanshee/banshee-player-video.c
+++ b/libbanshee/banshee-player-video.c
@@ -37,15 +37,14 @@
 static gboolean
 bp_video_find_xoverlay (BansheePlayer *player)
 {
-    GstElement *video_sink = NULL;
     GstElement *xoverlay;
     GstXOverlay *previous_xoverlay;
 
-    previous_xoverlay = player->xoverlay;
+    g_return_val_if_fail (IS_BANSHEE_PLAYER (player), FALSE);
     
-    g_object_get (player->playbin, "video-sink", &video_sink, NULL);
+    previous_xoverlay = player->xoverlay;
     
-    if (video_sink == NULL) {
+    if (player->videosink == NULL) {
         player->xoverlay = NULL;
         if (previous_xoverlay != NULL) {
             gst_object_unref (previous_xoverlay);
@@ -54,9 +53,9 @@ bp_video_find_xoverlay (BansheePlayer *player)
         return FALSE;
     }
     
-    xoverlay = GST_IS_BIN (video_sink)
-        ? gst_bin_get_by_interface (GST_BIN (video_sink), GST_TYPE_X_OVERLAY)
-        : video_sink;
+    xoverlay = GST_IS_BIN (player->videosink)
+        ? gst_bin_get_by_interface (GST_BIN (player->videosink), GST_TYPE_X_OVERLAY)
+        : player->videosink;
     
     player->xoverlay = GST_IS_X_OVERLAY (xoverlay) ? GST_X_OVERLAY (xoverlay) : NULL;
     
@@ -74,8 +73,6 @@ bp_video_find_xoverlay (BansheePlayer *player)
         g_object_set (G_OBJECT (player->xoverlay), "handle-events", FALSE, NULL);
     }
 
-    gst_object_unref (video_sink);
-
     return player->xoverlay != NULL;
 }
 
@@ -178,6 +175,7 @@ _bp_video_pipeline_setup (BansheePlayer *player, GstBus *bus)
     #endif
     
     #endif
+    player->videosink = videosink;
 }
 
 P_INVOKE void



[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]