[banshee] Fix a crash when playing videos in queue (bgo#590085)



commit 5ca411e145a4684d70b1eb77aae7a71dd34c4164
Author: Christopher Halse Rogers <chalserogers gmail com>
Date:   Fri Feb 19 11:57:05 2010 +1100

    Fix a crash when playing videos in queue (bgo#590085)
    
    Signed-off-by: Alexander Kojevnikov <alexander kojevnikov com>

 libbanshee/banshee-player-private.h                |    1 +
 libbanshee/banshee-player-video.c                  |   28 +++++++++++++++----
 .../Banshee.GStreamer/PlayerEngine.cs              |    8 +++++
 .../Banshee.MediaEngine/PlayerEngine.cs            |    5 +++
 .../Banshee.MediaEngine/PlayerEngineService.cs     |    5 +++
 .../Banshee.NowPlaying/XOverlayVideoDisplay.cs     |    1 +
 6 files changed, 42 insertions(+), 6 deletions(-)
---
diff --git a/libbanshee/banshee-player-private.h b/libbanshee/banshee-player-private.h
index 6528060..5085ca1 100644
--- a/libbanshee/banshee-player-private.h
+++ b/libbanshee/banshee-player-private.h
@@ -116,6 +116,7 @@ struct BansheePlayer {
     #ifdef GDK_WINDOWING_X11
     GstXOverlay *xoverlay;
     GdkWindow *video_window;
+    XID video_window_xid;
     #endif
        
     // Visualization State
diff --git a/libbanshee/banshee-player-video.c b/libbanshee/banshee-player-video.c
index 21bc0ce..cb36fd6 100644
--- a/libbanshee/banshee-player-video.c
+++ b/libbanshee/banshee-player-video.c
@@ -111,7 +111,7 @@ bp_video_bus_element_sync_message (GstBus *bus, GstMessage *message, BansheePlay
     g_mutex_unlock (player->mutex);
 
     if (found_xoverlay) {
-        gst_x_overlay_set_xwindow_id (player->xoverlay, GDK_WINDOW_XWINDOW (player->video_window));
+        gst_x_overlay_set_xwindow_id (player->xoverlay, player->video_window_xid);
     }
 
     #endif
@@ -223,8 +223,6 @@ bp_video_get_display_context (BansheePlayer *player)
 P_INVOKE void
 bp_video_window_expose (BansheePlayer *player, GdkWindow *window, gboolean direct)
 {
-    XID window_id;
-    
     g_return_if_fail (IS_BANSHEE_PLAYER (player));
     
     if (direct && player->xoverlay != NULL && GST_IS_X_OVERLAY (player->xoverlay)) {
@@ -242,14 +240,32 @@ bp_video_window_expose (BansheePlayer *player, GdkWindow *window, gboolean direc
     gst_object_ref (player->xoverlay);
     g_mutex_unlock (player->mutex);
 
-    window_id = GDK_WINDOW_XWINDOW (window);
-
-    gst_x_overlay_set_xwindow_id (player->xoverlay, window_id);
+    gst_x_overlay_set_xwindow_id (player->xoverlay, player->video_window_xid);
     gst_x_overlay_expose (player->xoverlay);
 
     gst_object_unref (player->xoverlay);
 }
 
+// MUST be called from the GTK main thread; calling it in OnRealized will do the right thing.
+P_INVOKE void
+bp_video_window_realize (BansheePlayer *player, GdkWindow *window)
+{
+    g_return_if_fail (IS_BANSHEE_PLAYER (player));
+
+// Code commented out - this requires including gtk/gtk.h for GTK_CHECK_VERSION, which requires too many
+// buildsystem changes for the benefit of a single debug message in the failure case.
+//
+//#if GTK_CHECK_VERSION(2,18,0)
+//    //Explicitly create the native window.  GDK_WINDOW_XWINDOW will call this
+//    //function anyway, but this way we can raise a more useful message should it fail.
+//    if (!gdk_window_ensure_native (window)) {
+//        banshee_log (BANSHEE_LOG_TYPE_ERROR, "player-video", "Couldn't create native window needed for GstXOverlay!");
+//    }
+//#endif
+
+    player->video_window_xid = GDK_WINDOW_XID (window);
+}
+
 #else /* GDK_WINDOWING_X11 */
 
 P_INVOKE BpVideoDisplayContextType
diff --git a/src/Backends/Banshee.GStreamer/Banshee.GStreamer/PlayerEngine.cs b/src/Backends/Banshee.GStreamer/Banshee.GStreamer/PlayerEngine.cs
index b608722..e8933b3 100644
--- a/src/Backends/Banshee.GStreamer/Banshee.GStreamer/PlayerEngine.cs
+++ b/src/Backends/Banshee.GStreamer/Banshee.GStreamer/PlayerEngine.cs
@@ -220,6 +220,11 @@ namespace Banshee.GStreamer
             bp_video_window_expose (handle, window, direct);
         }
 
+        public override void VideoWindowRealize (IntPtr window)
+        {
+            bp_video_window_realize (handle, window);
+        }
+
         public override IntPtr [] GetBaseElements ()
         {
             IntPtr [] elements = new IntPtr[3];
@@ -671,6 +676,9 @@ namespace Banshee.GStreamer
         private static extern void bp_video_window_expose (HandleRef player, IntPtr displayContext, bool direct);
 
         [DllImport ("libbanshee.dll")]
+        private static extern void bp_video_window_realize (HandleRef player, IntPtr window);
+
+        [DllImport ("libbanshee.dll")]
         private static extern void bp_get_error_quarks (out uint core, out uint library,
             out uint resource, out uint stream);
 
diff --git a/src/Core/Banshee.Services/Banshee.MediaEngine/PlayerEngine.cs b/src/Core/Banshee.Services/Banshee.MediaEngine/PlayerEngine.cs
index b074d2b..76a2ec9 100644
--- a/src/Core/Banshee.Services/Banshee.MediaEngine/PlayerEngine.cs
+++ b/src/Core/Banshee.Services/Banshee.MediaEngine/PlayerEngine.cs
@@ -122,6 +122,11 @@ namespace Banshee.MediaEngine
             throw new NotImplementedException ("Engine must implement VideoExpose since this method only gets called when SupportsVideo is true");
         }
 
+        public virtual void VideoWindowRealize (IntPtr displayContext)
+        {
+            throw new NotImplementedException ("Engine must implement VideoWindowRealize since this method only gets called when SupportsVideo is true");
+        }
+
         public virtual IntPtr [] GetBaseElements ()
         {
             return null;
diff --git a/src/Core/Banshee.Services/Banshee.MediaEngine/PlayerEngineService.cs b/src/Core/Banshee.Services/Banshee.MediaEngine/PlayerEngineService.cs
index a72dbfd..300fd64 100644
--- a/src/Core/Banshee.Services/Banshee.MediaEngine/PlayerEngineService.cs
+++ b/src/Core/Banshee.Services/Banshee.MediaEngine/PlayerEngineService.cs
@@ -458,6 +458,11 @@ namespace Banshee.MediaEngine
             active_engine.VideoExpose (displayContext, direct);
         }
 
+        public void VideoWindowRealize (IntPtr displayContext)
+        {
+            active_engine.VideoWindowRealize (displayContext);
+        }
+
         public IntPtr VideoDisplayContext {
             set { active_engine.VideoDisplayContext = value; }
             get { return active_engine.VideoDisplayContext; }
diff --git a/src/Extensions/Banshee.NowPlaying/Banshee.NowPlaying/XOverlayVideoDisplay.cs b/src/Extensions/Banshee.NowPlaying/Banshee.NowPlaying/XOverlayVideoDisplay.cs
index b0a4a87..c365db5 100644
--- a/src/Extensions/Banshee.NowPlaying/Banshee.NowPlaying/XOverlayVideoDisplay.cs
+++ b/src/Extensions/Banshee.NowPlaying/Banshee.NowPlaying/XOverlayVideoDisplay.cs
@@ -83,6 +83,7 @@ namespace Banshee.NowPlaying
 
             if (ServiceManager.PlayerEngine.VideoDisplayContextType == VideoDisplayContextType.GdkWindow) {
                 ServiceManager.PlayerEngine.VideoDisplayContext = video_window.Handle;
+                ServiceManager.PlayerEngine.VideoWindowRealize (video_window.Handle);
             } else {
                 ServiceManager.PlayerEngine.VideoDisplayContext = IntPtr.Zero;
             }



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