From dd1f932e3e667f3ed43ef83f333b2c2e6cd63cff Mon Sep 17 00:00:00 2001 From: Haakon Sporsheim Date: Wed, 7 May 2008 15:19:47 +0000 Subject: [PATCH] sys/directdraw/gstdirectdrawsink.c (gst_directdraw_sink_show_frame, Original commit message from CVS: patch by: Haakon Sporsheim * sys/directdraw/gstdirectdrawsink.c (gst_directdraw_sink_show_frame, WndProc, gst_directdraw_sink_window_thread): Improved Windows message loop and fixed window destruction issue. When the window which DirectDraw is rendering to is destroyed, the render/show_frame function will return GST_FLOW_ERROR. Partially fixes #520885. --- ChangeLog | 11 ++++++++ sys/directdraw/gstdirectdrawsink.c | 42 ++++++++++++++++-------------- 2 files changed, 34 insertions(+), 19 deletions(-) diff --git a/ChangeLog b/ChangeLog index b9e54a09e3..77d7bf82d0 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,14 @@ +2008-05-07 Ole André Vadla Ravnås + + patch by: Haakon Sporsheim + + * sys/directdraw/gstdirectdrawsink.c (gst_directdraw_sink_show_frame, + WndProc, gst_directdraw_sink_window_thread): + Improved Windows message loop and fixed window destruction issue. + When the window which DirectDraw is rendering to is destroyed, the + render/show_frame function will return GST_FLOW_ERROR. + Partially fixes #520885. + 2008-05-07 Ole André Vadla Ravnås patch by: Haakon Sporsheim diff --git a/sys/directdraw/gstdirectdrawsink.c b/sys/directdraw/gstdirectdrawsink.c index d049c57543..a0df1c57b2 100644 --- a/sys/directdraw/gstdirectdrawsink.c +++ b/sys/directdraw/gstdirectdrawsink.c @@ -810,8 +810,14 @@ gst_directdraw_sink_show_frame (GstBaseSink * bsink, GstBuffer * buf) /* use last buffer */ buf = ddrawsink->last_buffer; } - if (buf == NULL) + + if (buf == NULL) { + GST_ERROR_OBJECT (ddrawsink, "No buffer to render."); return GST_FLOW_ERROR; + } else if (!ddrawsink->video_window) { + GST_WARNING_OBJECT (ddrawsink, "No video window to render to."); + return GST_FLOW_ERROR; + } /* get the video window position */ GST_OBJECT_LOCK (ddrawsink); @@ -1314,13 +1320,13 @@ WndProc (HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) switch (message) { case WM_ERASEBKGND: return TRUE; - case WM_DESTROY: - PostQuitMessage (0); - break; case WM_CLOSE: DestroyWindow (hWnd); + case WM_DESTROY: + PostQuitMessage (0); return 0; } + return DefWindowProc (hWnd, message, wParam, lParam); } @@ -1328,6 +1334,7 @@ static gpointer gst_directdraw_sink_window_thread (GstDirectDrawSink * ddrawsink) { WNDCLASS WndClass; + MSG msg; memset (&WndClass, 0, sizeof (WNDCLASS)); WndClass.style = CS_HREDRAW | CS_VREDRAW; @@ -1357,24 +1364,21 @@ gst_directdraw_sink_window_thread (GstDirectDrawSink * ddrawsink) ReleaseSemaphore (ddrawsink->window_created_signal, 1, NULL); /* start message loop processing our default window messages */ - while (1) { - MSG msg; - - if (GetMessage (&msg, ddrawsink->video_window, 0, 0) <= 0) { - GST_CAT_LOG_OBJECT (directdrawsink_debug, ddrawsink, - "our window received WM_QUIT or error."); - /* The window could have changed, if it is not ours anymore we don't - * overwrite the current video window with NULL */ - if (ddrawsink->our_video_window) { - GST_OBJECT_LOCK (ddrawsink); - ddrawsink->video_window = NULL; - GST_OBJECT_UNLOCK (ddrawsink); - } - break; - } + while (GetMessage (&msg, NULL, 0, 0) != FALSE) { + TranslateMessage (&msg); DispatchMessage (&msg); } + GST_CAT_LOG_OBJECT (directdrawsink_debug, ddrawsink, + "our window received WM_QUIT or error."); + /* The window could have changed, if it is not ours anymore we don't + * overwrite the current video window with NULL */ + if (ddrawsink->our_video_window) { + GST_OBJECT_LOCK (ddrawsink); + ddrawsink->video_window = NULL; + GST_OBJECT_UNLOCK (ddrawsink); + } + return NULL; }