static gint WM_D3DVIDEO_NOTIFY_DEVICE_LOST = 0;
#define IDT_DEVICE_RESET_TIMER 0
+#define WM_QUIT_THREAD WM_USER+0
+
/** Helpers **/
#define ERROR_CHECK_HR(hr) \
/* Unset current window */
if (sink->d3d.window_handle != NULL) {
+ PostMessage (sink->d3d.window_handle, WM_QUIT_THREAD, NULL, NULL);
GST_DEBUG_OBJECT (sink, "Unsetting window [HWND:%p]",
sink->d3d.window_handle);
d3d_window_wndproc_unset (sink);
if (window_id) {
sink->d3d.window_handle = (HWND) window_id;
sink->d3d.window_is_internal = is_internal;
+ if (!is_internal)
+ sink->d3d.external_window_handle = sink->d3d.window_handle;
/* If caps have been set.. prepare window */
if (sink->format != 0)
d3d_prepare_render_window (sink);
LOCK_SINK (sink);
+ /* if we already had an external window, then use it again */
+ if (sink->d3d.external_window_handle)
+ sink->d3d.window_handle = sink->d3d.external_window_handle;
+
/* Give the app a last chance to set a window id */
if (!sink->d3d.window_handle)
gst_video_overlay_prepare_window_handle (GST_VIDEO_OVERLAY (sink));
GstD3DVideoSink *sink;
HWND hWnd;
MSG msg;
+ BOOL fGetMsg;
g_return_val_if_fail (dat != NULL, NULL);
/*
* Internal window message loop
*/
+
while (GetMessage (&msg, NULL, 0, 0)) {
+ if (msg.message == WM_QUIT_THREAD)
+ break;
TranslateMessage (&msg);
DispatchMessage (&msg);
}
if (!ret)
klass->d3d.error_exit = TRUE;
if (hWnd) {
+ PostMessage (hWnd, WM_DESTROY, NULL, NULL);
DestroyWindow (hWnd);
klass->d3d.hidden_window = 0;
}