mirror of
https://gitlab.freedesktop.org/gstreamer/gstreamer.git
synced 2025-03-30 20:59:44 +00:00
sys/directdraw/gstdirectdrawsink.c (gst_directdraw_sink_show_frame,
Original commit message from CVS: patch by: Haakon Sporsheim <haakon.sporsheim at tandberg com> * 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.
This commit is contained in:
parent
da78d8dced
commit
dd1f932e3e
2 changed files with 34 additions and 19 deletions
11
ChangeLog
11
ChangeLog
|
@ -1,3 +1,14 @@
|
||||||
|
2008-05-07 Ole André Vadla Ravnås <ole.andre.ravnas at tandberg com>
|
||||||
|
|
||||||
|
patch by: Haakon Sporsheim <haakon.sporsheim at tandberg com>
|
||||||
|
|
||||||
|
* 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 <ole.andre.ravnas at tandberg com>
|
2008-05-07 Ole André Vadla Ravnås <ole.andre.ravnas at tandberg com>
|
||||||
|
|
||||||
patch by: Haakon Sporsheim <haakon.sporsheim at tandberg com>
|
patch by: Haakon Sporsheim <haakon.sporsheim at tandberg com>
|
||||||
|
|
|
@ -810,8 +810,14 @@ gst_directdraw_sink_show_frame (GstBaseSink * bsink, GstBuffer * buf)
|
||||||
/* use last buffer */
|
/* use last buffer */
|
||||||
buf = ddrawsink->last_buffer;
|
buf = ddrawsink->last_buffer;
|
||||||
}
|
}
|
||||||
if (buf == NULL)
|
|
||||||
|
if (buf == NULL) {
|
||||||
|
GST_ERROR_OBJECT (ddrawsink, "No buffer to render.");
|
||||||
return GST_FLOW_ERROR;
|
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 */
|
/* get the video window position */
|
||||||
GST_OBJECT_LOCK (ddrawsink);
|
GST_OBJECT_LOCK (ddrawsink);
|
||||||
|
@ -1314,13 +1320,13 @@ WndProc (HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
|
||||||
switch (message) {
|
switch (message) {
|
||||||
case WM_ERASEBKGND:
|
case WM_ERASEBKGND:
|
||||||
return TRUE;
|
return TRUE;
|
||||||
case WM_DESTROY:
|
|
||||||
PostQuitMessage (0);
|
|
||||||
break;
|
|
||||||
case WM_CLOSE:
|
case WM_CLOSE:
|
||||||
DestroyWindow (hWnd);
|
DestroyWindow (hWnd);
|
||||||
|
case WM_DESTROY:
|
||||||
|
PostQuitMessage (0);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
return DefWindowProc (hWnd, message, wParam, lParam);
|
return DefWindowProc (hWnd, message, wParam, lParam);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1328,6 +1334,7 @@ static gpointer
|
||||||
gst_directdraw_sink_window_thread (GstDirectDrawSink * ddrawsink)
|
gst_directdraw_sink_window_thread (GstDirectDrawSink * ddrawsink)
|
||||||
{
|
{
|
||||||
WNDCLASS WndClass;
|
WNDCLASS WndClass;
|
||||||
|
MSG msg;
|
||||||
|
|
||||||
memset (&WndClass, 0, sizeof (WNDCLASS));
|
memset (&WndClass, 0, sizeof (WNDCLASS));
|
||||||
WndClass.style = CS_HREDRAW | CS_VREDRAW;
|
WndClass.style = CS_HREDRAW | CS_VREDRAW;
|
||||||
|
@ -1357,24 +1364,21 @@ gst_directdraw_sink_window_thread (GstDirectDrawSink * ddrawsink)
|
||||||
ReleaseSemaphore (ddrawsink->window_created_signal, 1, NULL);
|
ReleaseSemaphore (ddrawsink->window_created_signal, 1, NULL);
|
||||||
|
|
||||||
/* start message loop processing our default window messages */
|
/* start message loop processing our default window messages */
|
||||||
while (1) {
|
while (GetMessage (&msg, NULL, 0, 0) != FALSE) {
|
||||||
MSG msg;
|
TranslateMessage (&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;
|
|
||||||
}
|
|
||||||
DispatchMessage (&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;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue