• Home
  • Raw
  • Download

Lines Matching refs:sink

43 static gboolean d3d_window_wndproc_set (GstD3DVideoSink * sink);
44 static void d3d_window_wndproc_unset (GstD3DVideoSink * sink);
45 static gboolean d3d_init_swap_chain (GstD3DVideoSink * sink, HWND hWnd);
46 static gboolean d3d_release_swap_chain (GstD3DVideoSink * sink);
47 static gboolean d3d_resize_swap_chain (GstD3DVideoSink * sink);
48 static gboolean d3d_present_swap_chain (GstD3DVideoSink * sink);
49 static gboolean d3d_copy_buffer (GstD3DVideoSink * sink,
51 static gboolean d3d_stretch_and_copy (GstD3DVideoSink * sink,
53 static HWND d3d_create_internal_window (GstD3DVideoSink * sink);
55 static void d3d_class_notify_device_lost (GstD3DVideoSink * sink);
92 #define CASE_HR_DBG_ERR_END(sink, gst_err_msg, level) \ argument
98 GST_CAT_LEVEL_LOG(GST_CAT_DEFAULT, level, sink, "%s HRESULT: %s", t1?t1:"", str_err);
99 #define CASE_HR_ERR_END(sink, gst_err_msg) \ argument
100 CASE_HR_DBG_ERR_END(sink, gst_err_msg, GST_LEVEL_ERROR)
101 #define CASE_HR_DBG_END(sink, gst_err_msg) \ argument
102 CASE_HR_DBG_ERR_END(sink, gst_err_msg, GST_LEVEL_DEBUG)
104 #define CHECK_REF_COUNT(klass, sink, goto_label) \ argument
106 GST_ERROR_OBJECT(sink, "Direct3D object ref count = 0"); \
109 #define CHECK_D3D_DEVICE(klass, sink, goto_label) \ argument
111 GST_ERROR_OBJECT(sink, "Direct3D device or object does not exist"); \
114 #define CHECK_D3D_SWAPCHAIN(sink, goto_label) \ argument
115 if(!sink->d3d.swapchain) { \
116 GST_ERROR_OBJECT(sink, "Direct3D swap chain does not exist"); \
119 #define CHECK_D3D_SURFACE(sink, goto_label) \ argument
120 if(!sink->d3d.surface) { \
121 GST_ERROR_OBJECT(sink, "NULL D3D offscreen surface"); \
124 #define CHECK_WINDOW_HANDLE(sink, goto_label, is_error) \ argument
125 if(!sink->d3d.window_handle) { \
128 sink, "No window handle is set"); \
359 GstD3DVideoSink *sink; member
391 gst_object_unref (dmem->sink); in gst_d3d_surface_memory_allocator_free()
512 gst_d3dsurface_buffer_pool_new (GstD3DVideoSink * sink) in gst_d3dsurface_buffer_pool_new() argument
518 pool->sink = gst_object_ref (sink); in gst_d3dsurface_buffer_pool_new()
532 gst_object_unref (pool->sink); in gst_d3dsurface_buffer_pool_finalize()
615 GstD3DVideoSink *sink = pool->sink; in gst_d3dsurface_buffer_pool_set_config() local
616 GstD3DVideoSinkClass *klass = GST_D3DVIDEOSINK_GET_CLASS (sink); in gst_d3dsurface_buffer_pool_set_config()
650 LOCK_CLASS (sink, klass); in gst_d3dsurface_buffer_pool_set_config()
651 CHECK_REF_COUNT (klass, sink, error); in gst_d3dsurface_buffer_pool_set_config()
652 CHECK_D3D_DEVICE (klass, sink, error); in gst_d3dsurface_buffer_pool_set_config()
657 UNLOCK_CLASS (sink, klass); in gst_d3dsurface_buffer_pool_set_config()
659 GST_ERROR_OBJECT (sink, "Failed to create D3D surface"); in gst_d3dsurface_buffer_pool_set_config()
665 GST_ERROR_OBJECT (sink, "Failed to lock D3D surface"); in gst_d3dsurface_buffer_pool_set_config()
671 GST_ERROR_OBJECT (sink, "Failed to get buffer size"); in gst_d3dsurface_buffer_pool_set_config()
698 UNLOCK_CLASS (sink, klass); in gst_d3dsurface_buffer_pool_set_config()
707 GstD3DVideoSink *sink = pool->sink; in gst_d3dsurface_buffer_pool_alloc_buffer() local
708 GstD3DVideoSinkClass *klass = GST_D3DVIDEOSINK_GET_CLASS (sink); in gst_d3dsurface_buffer_pool_alloc_buffer()
726 LOCK_CLASS (sink, klass); in gst_d3dsurface_buffer_pool_alloc_buffer()
727 CHECK_REF_COUNT (klass, sink, error); in gst_d3dsurface_buffer_pool_alloc_buffer()
728 CHECK_D3D_DEVICE (klass, sink, error); in gst_d3dsurface_buffer_pool_alloc_buffer()
733 UNLOCK_CLASS (sink, klass); in gst_d3dsurface_buffer_pool_alloc_buffer()
735 GST_ERROR_OBJECT (sink, "Failed to create D3D surface"); in gst_d3dsurface_buffer_pool_alloc_buffer()
741 GST_ERROR_OBJECT (sink, "Failed to lock D3D surface"); in gst_d3dsurface_buffer_pool_alloc_buffer()
747 GST_ERROR_OBJECT (sink, "Failed to get buffer size"); in gst_d3dsurface_buffer_pool_alloc_buffer()
767 mem->sink = gst_object_ref (sink); in gst_d3dsurface_buffer_pool_alloc_buffer()
785 UNLOCK_CLASS (sink, klass); in gst_d3dsurface_buffer_pool_alloc_buffer()
808 d3d_supported_caps (GstD3DVideoSink * sink) in d3d_supported_caps() argument
810 GstD3DVideoSinkClass *klass = GST_D3DVIDEOSINK_GET_CLASS (sink); in d3d_supported_caps()
816 g_return_val_if_fail (GST_IS_D3DVIDEOSINK (sink), NULL); in d3d_supported_caps()
817 LOCK_SINK (sink); in d3d_supported_caps()
819 if (sink->supported_caps) { in d3d_supported_caps()
820 caps = gst_caps_ref (sink->supported_caps); in d3d_supported_caps()
824 LOCK_CLASS (sink, klass); in d3d_supported_caps()
826 UNLOCK_CLASS (sink, klass); in d3d_supported_caps()
830 GST_DEBUG_OBJECT (sink, "Supported Caps:"); in d3d_supported_caps()
838 GST_DEBUG_OBJECT (sink, "%s -> %s %s", in d3d_supported_caps()
844 UNLOCK_CLASS (sink, klass); in d3d_supported_caps()
848 (sink))); in d3d_supported_caps()
854 sink->supported_caps = gst_caps_ref (caps); in d3d_supported_caps()
858 GST_DEBUG_OBJECT (sink, "Supported caps: %" GST_PTR_FORMAT, caps); in d3d_supported_caps()
863 UNLOCK_SINK (sink); in d3d_supported_caps()
869 d3d_set_render_format (GstD3DVideoSink * sink) in d3d_set_render_format() argument
871 GstD3DVideoSinkClass *klass = GST_D3DVIDEOSINK_GET_CLASS (sink); in d3d_set_render_format()
875 g_return_val_if_fail (GST_IS_D3DVIDEOSINK (sink), FALSE); in d3d_set_render_format()
876 LOCK_SINK (sink); in d3d_set_render_format()
878 fmt = gst_video_format_to_d3d_format (sink->format); in d3d_set_render_format()
880 GST_ERROR_OBJECT (sink, "Unsupported video format %s", in d3d_set_render_format()
881 gst_video_format_to_string (sink->format)); in d3d_set_render_format()
886 GST_ERROR_OBJECT (sink, "Failed to query a D3D render format for %s", in d3d_set_render_format()
887 gst_video_format_to_string (sink->format)); in d3d_set_render_format()
891 GST_DEBUG_OBJECT (sink, "Selected %s -> %s", in d3d_set_render_format()
892 gst_video_format_to_string (sink->format), d3d_format_to_string (fmt)); in d3d_set_render_format()
894 sink->d3d.format = fmt; in d3d_set_render_format()
899 UNLOCK_SINK (sink); in d3d_set_render_format()
952 d3d_get_render_coordinates (GstD3DVideoSink * sink, gint in_x, gint in_y, in d3d_get_render_coordinates() argument
961 g_return_val_if_fail (GST_IS_D3DVIDEOSINK (sink), FALSE); in d3d_get_render_coordinates()
963 LOCK_SINK (sink); in d3d_get_render_coordinates()
964 CHECK_WINDOW_HANDLE (sink, end, FALSE); in d3d_get_render_coordinates()
967 if (sink->d3d.render_rect) { in d3d_get_render_coordinates()
968 memcpy (&r_area, sink->d3d.render_rect, sizeof (r_area)); in d3d_get_render_coordinates()
971 d3d_get_hwnd_window_size (sink->d3d.window_handle, &r_area.w, &r_area.h); in d3d_get_render_coordinates()
980 if (sink->force_aspect_ratio) { in d3d_get_render_coordinates()
984 tmp.w = GST_VIDEO_SINK_WIDTH (sink); in d3d_get_render_coordinates()
985 tmp.h = GST_VIDEO_SINK_HEIGHT (sink); in d3d_get_render_coordinates()
1000 if (r_area.w == GST_VIDEO_SINK_WIDTH (sink)) in d3d_get_render_coordinates()
1002 else if (r_area.w > GST_VIDEO_SINK_WIDTH (sink)) in d3d_get_render_coordinates()
1005 (gdouble) GST_VIDEO_SINK_WIDTH (sink))); in d3d_get_render_coordinates()
1008 ((gdouble) GST_VIDEO_SINK_WIDTH (sink) / (gdouble) r_area.w) * in d3d_get_render_coordinates()
1012 if (r_area.h == GST_VIDEO_SINK_HEIGHT (sink)) in d3d_get_render_coordinates()
1014 else if (r_area.h > GST_VIDEO_SINK_HEIGHT (sink)) in d3d_get_render_coordinates()
1017 (gdouble) GST_VIDEO_SINK_HEIGHT (sink))); in d3d_get_render_coordinates()
1020 ((gdouble) GST_VIDEO_SINK_HEIGHT (sink) / (gdouble) r_area.h) * in d3d_get_render_coordinates()
1025 UNLOCK_SINK (sink); in d3d_get_render_coordinates()
1032 d3d_window_wndproc_unset (GstD3DVideoSink * sink) in d3d_window_wndproc_unset() argument
1036 g_return_if_fail (GST_IS_D3DVIDEOSINK (sink)); in d3d_window_wndproc_unset()
1037 LOCK_SINK (sink); in d3d_window_wndproc_unset()
1039 GST_DEBUG_OBJECT (sink, " "); in d3d_window_wndproc_unset()
1041 if (sink->d3d.window_handle == NULL) { in d3d_window_wndproc_unset()
1042 GST_WARNING_OBJECT (sink, "D3D window_handle is NULL"); in d3d_window_wndproc_unset()
1047 (WNDPROC) GetWindowLongPtr (sink->d3d.window_handle, GWLP_WNDPROC); in d3d_window_wndproc_unset()
1050 GST_WARNING_OBJECT (sink, "D3D window proc is not set on current window"); in d3d_window_wndproc_unset()
1054 if (sink->d3d.orig_wnd_proc == NULL) { in d3d_window_wndproc_unset()
1055 GST_WARNING_OBJECT (sink, "D3D orig window proc is NULL, can not restore"); in d3d_window_wndproc_unset()
1060 if (!SetWindowLongPtr (sink->d3d.window_handle, GWLP_WNDPROC, in d3d_window_wndproc_unset()
1061 (LONG_PTR) sink->d3d.orig_wnd_proc)) { in d3d_window_wndproc_unset()
1062 GST_WARNING_OBJECT (sink, "D3D failed to set original WndProc"); in d3d_window_wndproc_unset()
1067 sink->d3d.orig_wnd_proc = NULL; in d3d_window_wndproc_unset()
1068 sink->d3d.window_handle = NULL; in d3d_window_wndproc_unset()
1070 UNLOCK_SINK (sink); in d3d_window_wndproc_unset()
1074 d3d_window_wndproc_set (GstD3DVideoSink * sink) in d3d_window_wndproc_set() argument
1079 g_return_val_if_fail (GST_IS_D3DVIDEOSINK (sink), FALSE); in d3d_window_wndproc_set()
1080 LOCK_SINK (sink); in d3d_window_wndproc_set()
1083 (WNDPROC) GetWindowLongPtr (sink->d3d.window_handle, GWLP_WNDPROC); in d3d_window_wndproc_set()
1086 GST_DEBUG_OBJECT (sink, in d3d_window_wndproc_set()
1093 sink->d3d.orig_wnd_proc = in d3d_window_wndproc_set()
1094 (WNDPROC) SetWindowLongPtr (sink->d3d.window_handle, GWLP_WNDPROC, in d3d_window_wndproc_set()
1098 if (sink->d3d.orig_wnd_proc == NULL) { in d3d_window_wndproc_set()
1099 GST_ERROR_OBJECT (sink, in d3d_window_wndproc_set()
1106 SetProp (sink->d3d.window_handle, TEXT ("GstD3DVideoSink"), sink); in d3d_window_wndproc_set()
1111 UNLOCK_SINK (sink); in d3d_window_wndproc_set()
1116 d3d_prepare_render_window (GstD3DVideoSink * sink) in d3d_prepare_render_window() argument
1118 g_return_if_fail (GST_IS_D3DVIDEOSINK (sink)); in d3d_prepare_render_window()
1119 LOCK_SINK (sink); in d3d_prepare_render_window()
1121 if (sink->d3d.window_handle == NULL) { in d3d_prepare_render_window()
1122 GST_DEBUG_OBJECT (sink, "No window handle has been set."); in d3d_prepare_render_window()
1126 if (sink->d3d.device_lost) { in d3d_prepare_render_window()
1127 GST_DEBUG_OBJECT (sink, "Device is lost, waiting for reset."); in d3d_prepare_render_window()
1131 if (d3d_init_swap_chain (sink, sink->d3d.window_handle)) { in d3d_prepare_render_window()
1132 d3d_window_wndproc_set (sink); in d3d_prepare_render_window()
1133 sink->d3d.renderable = TRUE; in d3d_prepare_render_window()
1134 GST_DEBUG_OBJECT (sink, "Prepared window for render [HWND:%p]", in d3d_prepare_render_window()
1135 sink->d3d.window_handle); in d3d_prepare_render_window()
1137 GST_ERROR_OBJECT (sink, "Failed preparing window for render [HWND:%p]", in d3d_prepare_render_window()
1138 sink->d3d.window_handle); in d3d_prepare_render_window()
1142 UNLOCK_SINK (sink); in d3d_prepare_render_window()
1147 d3d_set_window_handle (GstD3DVideoSink * sink, guintptr window_id, in d3d_set_window_handle() argument
1150 g_return_if_fail (sink != NULL); in d3d_set_window_handle()
1151 LOCK_SINK (sink); in d3d_set_window_handle()
1153 if (sink->d3d.window_handle == (HWND) window_id) { in d3d_set_window_handle()
1155 GST_WARNING_OBJECT (sink, in d3d_set_window_handle()
1161 if (sink->d3d.window_handle != NULL) { in d3d_set_window_handle()
1162 PostMessage (sink->d3d.window_handle, WM_QUIT_THREAD, 0, 0); in d3d_set_window_handle()
1163 GST_DEBUG_OBJECT (sink, "Unsetting window [HWND:%p]", in d3d_set_window_handle()
1164 sink->d3d.window_handle); in d3d_set_window_handle()
1165 d3d_window_wndproc_unset (sink); in d3d_set_window_handle()
1166 d3d_release_swap_chain (sink); in d3d_set_window_handle()
1167 sink->d3d.window_handle = NULL; in d3d_set_window_handle()
1168 sink->d3d.window_is_internal = FALSE; in d3d_set_window_handle()
1169 sink->d3d.renderable = FALSE; in d3d_set_window_handle()
1174 sink->d3d.window_handle = (HWND) window_id; in d3d_set_window_handle()
1175 sink->d3d.window_is_internal = is_internal; in d3d_set_window_handle()
1177 sink->d3d.external_window_handle = sink->d3d.window_handle; in d3d_set_window_handle()
1179 if (sink->format != 0) in d3d_set_window_handle()
1180 d3d_prepare_render_window (sink); in d3d_set_window_handle()
1184 UNLOCK_SINK (sink); in d3d_set_window_handle()
1188 d3d_set_render_rectangle (GstD3DVideoSink * sink) in d3d_set_render_rectangle() argument
1190 g_return_if_fail (sink != NULL); in d3d_set_render_rectangle()
1191 LOCK_SINK (sink); in d3d_set_render_rectangle()
1193 sink->d3d.render_rect = &sink->render_rect; in d3d_set_render_rectangle()
1194 d3d_resize_swap_chain (sink); in d3d_set_render_rectangle()
1195 d3d_present_swap_chain (sink); in d3d_set_render_rectangle()
1196 UNLOCK_SINK (sink); in d3d_set_render_rectangle()
1200 d3d_expose_window (GstD3DVideoSink * sink) in d3d_expose_window() argument
1202 GST_DEBUG_OBJECT (sink, "EXPOSE"); in d3d_expose_window()
1203 d3d_present_swap_chain (sink); in d3d_expose_window()
1207 d3d_prepare_window (GstD3DVideoSink * sink) in d3d_prepare_window() argument
1212 g_return_val_if_fail (GST_IS_D3DVIDEOSINK (sink), FALSE); in d3d_prepare_window()
1213 LOCK_SINK (sink); in d3d_prepare_window()
1216 if (sink->d3d.external_window_handle) in d3d_prepare_window()
1217 sink->d3d.window_handle = sink->d3d.external_window_handle; in d3d_prepare_window()
1220 if (!sink->d3d.window_handle) in d3d_prepare_window()
1221 gst_video_overlay_prepare_window_handle (GST_VIDEO_OVERLAY (sink)); in d3d_prepare_window()
1224 if (!sink->d3d.window_handle) { in d3d_prepare_window()
1225 if (sink->create_internal_window) { in d3d_prepare_window()
1226 if ((hWnd = d3d_create_internal_window (sink))) { in d3d_prepare_window()
1227 GST_DEBUG_OBJECT (sink, in d3d_prepare_window()
1229 d3d_set_window_handle (sink, (guintptr) hWnd, TRUE); in d3d_prepare_window()
1231 GST_ERROR_OBJECT (sink, "Failed to create internal window"); in d3d_prepare_window()
1235 GST_DEBUG_OBJECT (sink, "No window id is set.."); in d3d_prepare_window()
1239 d3d_prepare_render_window (sink); in d3d_prepare_window()
1245 UNLOCK_SINK (sink); in d3d_prepare_window()
1251 d3d_stop (GstD3DVideoSink * sink) in d3d_stop() argument
1253 if (sink->pool) in d3d_stop()
1254 gst_buffer_pool_set_active (sink->pool, FALSE); in d3d_stop()
1255 if (sink->fallback_pool) in d3d_stop()
1256 gst_buffer_pool_set_active (sink->fallback_pool, FALSE); in d3d_stop()
1257 gst_object_replace ((GstObject **) & sink->pool, NULL); in d3d_stop()
1258 gst_object_replace ((GstObject **) & sink->fallback_pool, NULL); in d3d_stop()
1259 gst_buffer_replace (&sink->fallback_buffer, NULL); in d3d_stop()
1262 d3d_set_window_handle (sink, 0, FALSE); in d3d_stop()
1264 if (sink->internal_window_thread) { in d3d_stop()
1265 g_thread_join (sink->internal_window_thread); in d3d_stop()
1266 sink->internal_window_thread = NULL; in d3d_stop()
1275 d3d_notify_device_lost (GstD3DVideoSink * sink) in d3d_notify_device_lost() argument
1279 g_return_if_fail (GST_IS_D3DVIDEOSINK (sink)); in d3d_notify_device_lost()
1281 LOCK_SINK (sink); in d3d_notify_device_lost()
1283 if (!sink->d3d.device_lost) { in d3d_notify_device_lost()
1284 GST_WARNING_OBJECT (sink, "D3D Device has been lost. Clean up resources."); in d3d_notify_device_lost()
1287 sink->d3d.device_lost = TRUE; in d3d_notify_device_lost()
1290 d3d_release_swap_chain (sink); in d3d_notify_device_lost()
1296 UNLOCK_SINK (sink); in d3d_notify_device_lost()
1299 d3d_class_notify_device_lost (sink); in d3d_notify_device_lost()
1303 d3d_notify_device_reset (GstD3DVideoSink * sink) in d3d_notify_device_reset() argument
1305 g_return_if_fail (GST_IS_D3DVIDEOSINK (sink)); in d3d_notify_device_reset()
1306 LOCK_SINK (sink); in d3d_notify_device_reset()
1308 if (sink->d3d.device_lost) { in d3d_notify_device_reset()
1309 GST_DEBUG_OBJECT (sink, in d3d_notify_device_reset()
1312 if (sink->d3d.window_handle != NULL) in d3d_notify_device_reset()
1313 d3d_init_swap_chain (sink, sink->d3d.window_handle); in d3d_notify_device_reset()
1314 sink->d3d.device_lost = FALSE; in d3d_notify_device_reset()
1317 UNLOCK_SINK (sink); in d3d_notify_device_reset()
1323 d3d_init_swap_chain (GstD3DVideoSink * sink, HWND hWnd) in d3d_init_swap_chain() argument
1332 g_return_val_if_fail (sink != NULL, FALSE); in d3d_init_swap_chain()
1333 klass = GST_D3DVIDEOSINK_GET_CLASS (sink); in d3d_init_swap_chain()
1336 LOCK_SINK (sink); in d3d_init_swap_chain()
1337 LOCK_CLASS (sink, klass); in d3d_init_swap_chain()
1338 CHECK_REF_COUNT (klass, sink, error); in d3d_init_swap_chain()
1341 CHECK_D3D_DEVICE (klass, sink, error); in d3d_init_swap_chain()
1345 GST_DEBUG ("Direct3D back buffer size: %dx%d", GST_VIDEO_SINK_WIDTH (sink), in d3d_init_swap_chain()
1346 GST_VIDEO_SINK_HEIGHT (sink)); in d3d_init_swap_chain()
1363 CASE_HR_ERR_END (sink, "Error creating D3D swapchian"); in d3d_init_swap_chain()
1375 D3DUSAGE_QUERY_FILTER, D3DRTYPE_TEXTURE, sink->d3d.format); in d3d_init_swap_chain()
1383 sink->d3d.filtertype = d3d_filtertype; in d3d_init_swap_chain()
1385 if (sink->d3d.swapchain != NULL) in d3d_init_swap_chain()
1386 IDirect3DSwapChain9_Release (sink->d3d.swapchain); in d3d_init_swap_chain()
1388 sink->d3d.swapchain = d3d_swapchain; in d3d_init_swap_chain()
1398 UNLOCK_CLASS (sink, klass); in d3d_init_swap_chain()
1399 UNLOCK_SINK (sink); in d3d_init_swap_chain()
1405 d3d_release_swap_chain (GstD3DVideoSink * sink) in d3d_release_swap_chain() argument
1410 g_return_val_if_fail (GST_IS_D3DVIDEOSINK (sink), FALSE); in d3d_release_swap_chain()
1411 LOCK_SINK (sink); in d3d_release_swap_chain()
1413 GST_DEBUG_OBJECT (sink, "Releasing Direct3D swap chain"); in d3d_release_swap_chain()
1416 if (!sink->d3d.swapchain) { in d3d_release_swap_chain()
1421 gst_buffer_replace (&sink->fallback_buffer, NULL); in d3d_release_swap_chain()
1422 if (sink->fallback_pool) in d3d_release_swap_chain()
1423 gst_buffer_pool_set_active (sink->fallback_pool, FALSE); in d3d_release_swap_chain()
1425 if (sink->d3d.swapchain) { in d3d_release_swap_chain()
1426 ref_count = IDirect3DSwapChain9_Release (sink->d3d.swapchain); in d3d_release_swap_chain()
1427 sink->d3d.swapchain = NULL; in d3d_release_swap_chain()
1428 GST_DEBUG_OBJECT (sink, "D3D swapchain released. Ref count: %d", ref_count); in d3d_release_swap_chain()
1431 if (sink->d3d.surface) { in d3d_release_swap_chain()
1432 ref_count = IDirect3DSurface9_Release (sink->d3d.surface); in d3d_release_swap_chain()
1433 sink->d3d.surface = NULL; in d3d_release_swap_chain()
1434 GST_DEBUG_OBJECT (sink, "D3D surface released. Ref count: %d", ref_count); in d3d_release_swap_chain()
1437 gst_d3d9_overlay_free (sink); in d3d_release_swap_chain()
1441 UNLOCK_SINK (sink); in d3d_release_swap_chain()
1447 d3d_resize_swap_chain (GstD3DVideoSink * sink) in d3d_resize_swap_chain() argument
1460 g_return_val_if_fail (sink != NULL, FALSE); in d3d_resize_swap_chain()
1461 klass = GST_D3DVIDEOSINK_GET_CLASS (sink); in d3d_resize_swap_chain()
1464 LOCK_SINK (sink); in d3d_resize_swap_chain()
1466 if (!sink->d3d.renderable || sink->d3d.device_lost) { in d3d_resize_swap_chain()
1467 UNLOCK_SINK (sink); in d3d_resize_swap_chain()
1471 LOCK_CLASS (sink, klass); in d3d_resize_swap_chain()
1473 CHECK_REF_COUNT (klass, sink, end); in d3d_resize_swap_chain()
1474 CHECK_WINDOW_HANDLE (sink, end, FALSE); in d3d_resize_swap_chain()
1475 CHECK_D3D_DEVICE (klass, sink, end); in d3d_resize_swap_chain()
1476 CHECK_D3D_SWAPCHAIN (sink, end); in d3d_resize_swap_chain()
1478 handle_hdc = GetDC (sink->d3d.window_handle); in d3d_resize_swap_chain()
1480 ReleaseDC (sink->d3d.window_handle, handle_hdc); in d3d_resize_swap_chain()
1482 GST_DEBUG_OBJECT (sink, "Window is hidden, not resizing swapchain"); in d3d_resize_swap_chain()
1483 UNLOCK_CLASS (sink, klass); in d3d_resize_swap_chain()
1484 UNLOCK_SINK (sink); in d3d_resize_swap_chain()
1488 d3d_get_hwnd_window_size (sink->d3d.window_handle, &w, &h); in d3d_resize_swap_chain()
1492 hr = IDirect3DSwapChain9_GetPresentParameters (sink->d3d.swapchain, &d3d_pp); in d3d_resize_swap_chain()
1494 GST_ERROR_OBJECT (sink, in d3d_resize_swap_chain()
1504 if ((d3d_pp.SwapEffect != D3DSWAPEFFECT_COPY && sink->d3d.render_rect) || in d3d_resize_swap_chain()
1506 && sink->d3d.render_rect == NULL)) { in d3d_resize_swap_chain()
1508 (sink->d3d.render_rect == in d3d_resize_swap_chain()
1510 GST_DEBUG_OBJECT (sink, "Setting SwapEffect: %s", in d3d_resize_swap_chain()
1511 sink->d3d.render_rect ? "COPY" : "DISCARD"); in d3d_resize_swap_chain()
1520 GST_DEBUG_OBJECT (sink, "Resizing swapchain %dx%d to %dx%d", in d3d_resize_swap_chain()
1531 if (sink->d3d.swapchain != NULL) { in d3d_resize_swap_chain()
1532 ref_count = IDirect3DSwapChain9_Release (sink->d3d.swapchain); in d3d_resize_swap_chain()
1534 GST_WARNING_OBJECT (sink, "Release swapchain refcount: %d", ref_count); in d3d_resize_swap_chain()
1536 sink->d3d.swapchain = NULL; in d3d_resize_swap_chain()
1547 CASE_HR_ERR_END (sink, "Error creating swapchian"); in d3d_resize_swap_chain()
1551 sink->d3d.swapchain = swapchain; in d3d_resize_swap_chain()
1552 sink->d3d.overlay_needs_resize = TRUE; in d3d_resize_swap_chain()
1556 UNLOCK_CLASS (sink, klass); in d3d_resize_swap_chain()
1557 UNLOCK_SINK (sink); in d3d_resize_swap_chain()
1563 d3d_copy_buffer (GstD3DVideoSink * sink, GstBuffer * from, GstBuffer * to) in d3d_copy_buffer() argument
1571 g_return_val_if_fail (GST_IS_D3DVIDEOSINK (sink), FALSE); in d3d_copy_buffer()
1572 LOCK_SINK (sink); in d3d_copy_buffer()
1574 if (!sink->d3d.renderable || sink->d3d.device_lost) in d3d_copy_buffer()
1577 if (!gst_video_frame_map (&from_frame, &sink->info, from, GST_MAP_READ) || in d3d_copy_buffer()
1578 !gst_video_frame_map (&to_frame, &sink->info, to, GST_MAP_WRITE)) { in d3d_copy_buffer()
1579 GST_ERROR_OBJECT (sink, "NULL GstBuffer"); in d3d_copy_buffer()
1583 switch (sink->format) { in d3d_copy_buffer()
1732 UNLOCK_SINK (sink); in d3d_copy_buffer()
1736 GST_ERROR_OBJECT (sink, in d3d_copy_buffer()
1738 gst_video_format_to_string (sink->format), in d3d_copy_buffer()
1739 d3d_format_to_string (sink->d3d.format)); in d3d_copy_buffer()
1745 d3d_present_swap_chain (GstD3DVideoSink * sink) in d3d_present_swap_chain() argument
1747 GstD3DVideoSinkClass *klass = GST_D3DVIDEOSINK_GET_CLASS (sink); in d3d_present_swap_chain()
1753 g_return_val_if_fail (GST_IS_D3DVIDEOSINK (sink), FALSE); in d3d_present_swap_chain()
1754 LOCK_SINK (sink); in d3d_present_swap_chain()
1756 if (!sink->d3d.renderable || sink->d3d.device_lost) { in d3d_present_swap_chain()
1757 UNLOCK_SINK (sink); in d3d_present_swap_chain()
1761 LOCK_CLASS (sink, klass); in d3d_present_swap_chain()
1763 CHECK_REF_COUNT (klass, sink, end); in d3d_present_swap_chain()
1764 CHECK_WINDOW_HANDLE (sink, end, FALSE); in d3d_present_swap_chain()
1765 CHECK_D3D_DEVICE (klass, sink, end); in d3d_present_swap_chain()
1766 CHECK_D3D_SWAPCHAIN (sink, end); in d3d_present_swap_chain()
1769 hr = IDirect3DSwapChain9_GetBackBuffer (sink->d3d.swapchain, 0, in d3d_present_swap_chain()
1773 CASE_HR_ERR_END (sink, "IDirect3DSwapChain9_GetBackBuffer"); in d3d_present_swap_chain()
1780 CASE_HR_ERR_END (sink, "IDirect3DDevice9_SetRenderTarget"); in d3d_present_swap_chain()
1786 CASE_HR_ERR_END (sink, "IDirect3DSurface9_Release"); in d3d_present_swap_chain()
1795 CASE_HR_ERR_END (sink, "IDirect3DDevice9_Clear"); in d3d_present_swap_chain()
1802 CASE_HR_ERR_END (sink, "IDirect3DDevice9_BeginScene"); in d3d_present_swap_chain()
1806 if (!gst_d3d9_overlay_set_render_state (sink)) { in d3d_present_swap_chain()
1814 if (!d3d_stretch_and_copy (sink, back_buffer) || in d3d_present_swap_chain()
1815 !gst_d3d9_overlay_render (sink)) { in d3d_present_swap_chain()
1823 CASE_HR_ERR_END (sink, "IDirect3DDevice9_EndScene"); in d3d_present_swap_chain()
1827 if (d3d_get_render_rects (sink->d3d.render_rect, &dstr, &srcr)) { in d3d_present_swap_chain()
1835 hr = IDirect3DSwapChain9_Present (sink->d3d.swapchain, pSrcRect, pDestRect, in d3d_present_swap_chain()
1838 d3d_notify_device_lost (sink); in d3d_present_swap_chain()
1848 CASE_HR_DBG_END (sink, "IDirect3DSwapChain9_Present failure"); in d3d_present_swap_chain()
1855 UNLOCK_SINK (sink); in d3d_present_swap_chain()
1856 UNLOCK_CLASS (sink, klass); in d3d_present_swap_chain()
1861 d3d_stretch_and_copy (GstD3DVideoSink * sink, LPDIRECT3DSURFACE9 back_buffer) in d3d_stretch_and_copy() argument
1863 GstD3DVideoSinkClass *klass = GST_D3DVIDEOSINK_GET_CLASS (sink); in d3d_stretch_and_copy()
1870 g_return_val_if_fail (GST_IS_D3DVIDEOSINK (sink), FALSE); in d3d_stretch_and_copy()
1871 LOCK_SINK (sink); in d3d_stretch_and_copy()
1873 CHECK_WINDOW_HANDLE (sink, end, FALSE); in d3d_stretch_and_copy()
1874 CHECK_D3D_DEVICE (klass, sink, end); in d3d_stretch_and_copy()
1875 CHECK_D3D_SURFACE (sink, end); in d3d_stretch_and_copy()
1877 render_rect = sink->d3d.render_rect; in d3d_stretch_and_copy()
1879 if (sink->force_aspect_ratio) { in d3d_stretch_and_copy()
1893 d3d_get_hwnd_window_size (sink->d3d.window_handle, &window_width, in d3d_stretch_and_copy()
1899 src.w = GST_VIDEO_SINK_WIDTH (sink); in d3d_stretch_and_copy()
1900 src.h = GST_VIDEO_SINK_HEIGHT (sink); in d3d_stretch_and_copy()
1917 s.left = sink->crop_rect.x; in d3d_stretch_and_copy()
1918 s.top = sink->crop_rect.y; in d3d_stretch_and_copy()
1919 s.right = sink->crop_rect.x + sink->crop_rect.w; in d3d_stretch_and_copy()
1920 s.bottom = sink->crop_rect.y + sink->crop_rect.h; in d3d_stretch_and_copy()
1927 …hr = IDirect3DDevice9_StretchRect (klass->d3d.device.d3d_device, sink->d3d.surface, /* Source Su… in d3d_stretch_and_copy()
1936 GST_ERROR_OBJECT (sink, "Failure calling Direct3DDevice9_StretchRect"); in d3d_stretch_and_copy()
1940 UNLOCK_SINK (sink); in d3d_stretch_and_copy()
1946 d3d_render_buffer (GstD3DVideoSink * sink, GstBuffer * buf) in d3d_render_buffer() argument
1959 g_return_val_if_fail (GST_IS_D3DVIDEOSINK (sink), GST_FLOW_ERROR); in d3d_render_buffer()
1960 LOCK_SINK (sink); in d3d_render_buffer()
1962 if (!sink->d3d.window_handle) { in d3d_render_buffer()
1963 if (sink->stream_stop_on_close) { in d3d_render_buffer()
1965 GST_ELEMENT_ERROR (sink, RESOURCE, NOT_FOUND, in d3d_render_buffer()
1972 if (sink->d3d.device_lost) { in d3d_render_buffer()
1973 GST_LOG_OBJECT (sink, "Device lost, waiting for reset.."); in d3d_render_buffer()
1979 handle_hdc = GetDC (sink->d3d.window_handle); in d3d_render_buffer()
1980 GetClientRect (sink->d3d.window_handle, &handle_rectangle); in d3d_render_buffer()
1982 ReleaseDC (sink->d3d.window_handle, handle_hdc); in d3d_render_buffer()
2003 GST_DEBUG_OBJECT (sink, "Hidden hwnd, skipping frame rendering..."); in d3d_render_buffer()
2007 GST_INFO_OBJECT (sink, "%s %" GST_TIME_FORMAT, in d3d_render_buffer()
2008 (sink->d3d.window_handle != NULL) ? "Render" : "No Win", in d3d_render_buffer()
2013 sink->crop_rect.x = crop->x; in d3d_render_buffer()
2014 sink->crop_rect.y = crop->y; in d3d_render_buffer()
2015 sink->crop_rect.w = crop->width; in d3d_render_buffer()
2016 sink->crop_rect.h = crop->height; in d3d_render_buffer()
2018 sink->crop_rect.x = 0; in d3d_render_buffer()
2019 sink->crop_rect.y = 0; in d3d_render_buffer()
2020 sink->crop_rect.w = sink->info.width; in d3d_render_buffer()
2021 sink->crop_rect.h = sink->info.height; in d3d_render_buffer()
2025 if (!d3d_resize_swap_chain (sink)) { in d3d_render_buffer()
2036 if (!sink->fallback_pool in d3d_render_buffer()
2037 || !gst_buffer_pool_set_active (sink->fallback_pool, TRUE)) { in d3d_render_buffer()
2046 ret = gst_buffer_pool_acquire_buffer (sink->fallback_pool, &tmp, &params); in d3d_render_buffer()
2050 if (sink->fallback_buffer) { in d3d_render_buffer()
2051 gst_buffer_unref (sink->fallback_buffer); in d3d_render_buffer()
2052 sink->fallback_buffer = NULL; in d3d_render_buffer()
2061 d3d_copy_buffer (sink, buf, tmp); in d3d_render_buffer()
2068 sink->fallback_buffer = buf; in d3d_render_buffer()
2073 if (sink->fallback_buffer) { in d3d_render_buffer()
2074 gst_buffer_unref (sink->fallback_buffer); in d3d_render_buffer()
2075 sink->fallback_buffer = NULL; in d3d_render_buffer()
2079 if (sink->d3d.surface) in d3d_render_buffer()
2080 IDirect3DSurface9_Release (sink->d3d.surface); in d3d_render_buffer()
2082 sink->d3d.surface = surface; in d3d_render_buffer()
2084 if (!d3d_present_swap_chain (sink)) { in d3d_render_buffer()
2090 UNLOCK_SINK (sink); in d3d_render_buffer()
2100 GstD3DVideoSink *sink = in d3d_wnd_proc() local
2107 if (!sink) in d3d_wnd_proc()
2110 LOCK_SINK (sink); in d3d_wnd_proc()
2111 proc = sink->d3d.orig_wnd_proc; in d3d_wnd_proc()
2112 UNLOCK_SINK (sink); in d3d_wnd_proc()
2121 d3d_present_swap_chain (sink); in d3d_wnd_proc()
2132 d3d_resize_swap_chain (sink); in d3d_wnd_proc()
2137 if (sink->enable_navigation_events) { in d3d_wnd_proc()
2143 gst_navigation_send_key_event (GST_NAVIGATION (sink), "key-press", in d3d_wnd_proc()
2146 gst_navigation_send_key_event (GST_NAVIGATION (sink), in d3d_wnd_proc()
2161 if (sink->enable_navigation_events in d3d_wnd_proc()
2162 && d3d_get_render_coordinates (sink, LOWORD (lParam), HIWORD (lParam), in d3d_wnd_proc()
2200 gst_navigation_send_mouse_event (GST_NAVIGATION (sink), action, in d3d_wnd_proc()
2207 d3d_set_window_handle (sink, 0, FALSE); in d3d_wnd_proc()
2240 _d3d_create_internal_window (GstD3DVideoSink * sink) in _d3d_create_internal_window() argument
2242 GstD3DVideoSinkClass *klass = GST_D3DVIDEOSINK_GET_CLASS (sink); in _d3d_create_internal_window()
2256 width = GST_VIDEO_SINK_WIDTH (sink) + GetSystemMetrics (SM_CXSIZEFRAME) * 2; in _d3d_create_internal_window()
2258 GST_VIDEO_SINK_HEIGHT (sink) + GetSystemMetrics (SM_CYCAPTION) + in _d3d_create_internal_window()
2286 NULL, NULL, klass->d3d.wnd_class.hInstance, sink); in _d3d_create_internal_window()
2289 GST_ERROR_OBJECT (sink, "Failed to create internal window: %lu", in _d3d_create_internal_window()
2305 GstD3DVideoSink *sink; member
2315 GstD3DVideoSink *sink; in d3d_internal_window_thread() local
2321 sink = dat->sink; in d3d_internal_window_thread()
2322 GST_DEBUG_OBJECT (sink, "Entering internal window thread: %p", in d3d_internal_window_thread()
2326 hWnd = _d3d_create_internal_window (sink); in d3d_internal_window_thread()
2330 GST_ERROR_OBJECT (sink, "Failed to create internal window"); in d3d_internal_window_thread()
2353 GST_DEBUG_OBJECT (sink, "Exiting internal window thread: %p", in d3d_internal_window_thread()
2359 d3d_create_internal_window (GstD3DVideoSink * sink) in d3d_create_internal_window() argument
2364 dat.sink = sink; in d3d_create_internal_window()
2378 sink->internal_window_thread = thread; in d3d_create_internal_window()
2387 GST_DEBUG_OBJECT (sink, "Created window: %p (error: %d)", in d3d_create_internal_window()
2402 d3d_class_init (GstD3DVideoSink * sink) in d3d_class_init() argument
2404 GstD3DVideoSinkClass *klass = GST_D3DVIDEOSINK_GET_CLASS (sink); in d3d_class_init()
2410 LOCK_CLASS (sink, klass); in d3d_class_init()
2414 klass->d3d.sink_list = g_list_append (klass->d3d.sink_list, sink); in d3d_class_init()
2481 d3d_class_destroy (sink); in d3d_class_init()
2486 UNLOCK_CLASS (sink, klass); in d3d_class_init()
2492 d3d_class_destroy (GstD3DVideoSink * sink) in d3d_class_destroy() argument
2494 GstD3DVideoSinkClass *klass = GST_D3DVIDEOSINK_GET_CLASS (sink); in d3d_class_destroy()
2498 LOCK_CLASS (sink, klass); in d3d_class_destroy()
2504 klass->d3d.sink_list = g_list_remove (klass->d3d.sink_list, sink); in d3d_class_destroy()
2528 UNLOCK_CLASS (sink, klass); in d3d_class_destroy()
2671 d3d_class_notify_device_lost (GstD3DVideoSink * sink) in d3d_class_notify_device_lost() argument
2673 GstD3DVideoSinkClass *klass = GST_D3DVIDEOSINK_GET_CLASS (sink); in d3d_class_notify_device_lost()
2699 GstD3DVideoSink *sink = (GstD3DVideoSink *) lst->data; in d3d_class_notify_device_lost_all() local
2700 if (!sink) in d3d_class_notify_device_lost_all()
2702 d3d_notify_device_lost (sink); in d3d_class_notify_device_lost_all()