From 4e309644e82531028d0dace0715f1803e6bfdaf6 Mon Sep 17 00:00:00 2001 From: Haakon Sporsheim Date: Wed, 7 May 2008 15:19:47 +0000 Subject: [MOVED FROM GOOD] 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. --- sys/directdraw/gstdirectdrawsink.c | 42 +++++++++++++++++++++----------------- 1 file changed, 23 insertions(+), 19 deletions(-) (limited to 'sys') diff --git a/sys/directdraw/gstdirectdrawsink.c b/sys/directdraw/gstdirectdrawsink.c index d049c5754..a0df1c57b 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; } -- cgit v1.2.3