[banshee] Fix a crash when playing videos in queue (bgo#590085)
- From: Alexander Kojevnikov <alexk src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [banshee] Fix a crash when playing videos in queue (bgo#590085)
- Date: Fri, 19 Feb 2010 00:59:55 +0000 (UTC)
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]