diff options
author | Seungha Yang <seungha@centricular.com> | 2020-05-27 01:52:59 +0900 |
---|---|---|
committer | Seungha Yang <seungha@centricular.com> | 2020-05-27 04:59:50 +0900 |
commit | afe941249ece4263e7b206599c8ba95dc61f6e9a (patch) | |
tree | eee8297df7ace73fce465ff43a2005ce267c6111 /sys | |
parent | 8ce4980273fc18db5276b26619e819f1e4ed85d7 (diff) | |
download | gstreamer-plugins-bad-afe941249ece4263e7b206599c8ba95dc61f6e9a.tar.gz |
d3d11window: Add unprepare method to clear internal resource
GObject::dispose method can be called multiple times. As win32 d3d11window
has an internal thread and because GObject::dispose method could be called from the
thread, it might cause problems such as trying to join self-thread
Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1299>
Diffstat (limited to 'sys')
-rw-r--r-- | sys/d3d11/gstd3d11videosink.c | 3 | ||||
-rw-r--r-- | sys/d3d11/gstd3d11window.cpp | 13 | ||||
-rw-r--r-- | sys/d3d11/gstd3d11window.h | 4 | ||||
-rw-r--r-- | sys/d3d11/gstd3d11window_corewindow.cpp | 16 | ||||
-rw-r--r-- | sys/d3d11/gstd3d11window_swapchainpanel.cpp | 17 | ||||
-rw-r--r-- | sys/d3d11/gstd3d11window_win32.cpp | 17 |
6 files changed, 60 insertions, 10 deletions
diff --git a/sys/d3d11/gstd3d11videosink.c b/sys/d3d11/gstd3d11videosink.c index 95ce206d7..2cf4611de 100644 --- a/sys/d3d11/gstd3d11videosink.c +++ b/sys/d3d11/gstd3d11videosink.c @@ -594,6 +594,9 @@ gst_d3d11_video_sink_stop (GstBaseSink * sink) self->fallback_pool = NULL; } + if (self->window) + gst_d3d11_window_unprepare (self->window); + gst_clear_object (&self->device); gst_clear_object (&self->window); diff --git a/sys/d3d11/gstd3d11window.cpp b/sys/d3d11/gstd3d11window.cpp index e6756a1f3..d9c66baf1 100644 --- a/sys/d3d11/gstd3d11window.cpp +++ b/sys/d3d11/gstd3d11window.cpp @@ -999,6 +999,19 @@ gst_d3d11_window_unlock_stop (GstD3D11Window * window) return ret; } +void +gst_d3d11_window_unprepare (GstD3D11Window * window) +{ + GstD3D11WindowClass *klass; + + g_return_if_fail (GST_IS_D3D11_WINDOW (window)); + + klass = GST_D3D11_WINDOW_GET_CLASS (window); + + if (klass->unprepare) + klass->unprepare (window); +} + GstD3D11WindowNativeType gst_d3d11_window_get_native_type_from_handle (guintptr handle) { diff --git a/sys/d3d11/gstd3d11window.h b/sys/d3d11/gstd3d11window.h index 6817dcefb..6ca6024e1 100644 --- a/sys/d3d11/gstd3d11window.h +++ b/sys/d3d11/gstd3d11window.h @@ -132,6 +132,8 @@ struct _GstD3D11WindowClass void (*on_resize) (GstD3D11Window * window, guint width, guint height); + + void (*unprepare) (GstD3D11Window * window); }; GType gst_d3d11_window_get_type (void); @@ -157,6 +159,8 @@ gboolean gst_d3d11_window_unlock (GstD3D11Window * window); gboolean gst_d3d11_window_unlock_stop (GstD3D11Window * window); +void gst_d3d11_window_unprepare (GstD3D11Window * window); + void gst_d3d11_window_on_key_event (GstD3D11Window * window, const gchar * event, const gchar * key); diff --git a/sys/d3d11/gstd3d11window_corewindow.cpp b/sys/d3d11/gstd3d11window_corewindow.cpp index 0bf8394db..2ee62d932 100644 --- a/sys/d3d11/gstd3d11window_corewindow.cpp +++ b/sys/d3d11/gstd3d11window_corewindow.cpp @@ -98,6 +98,8 @@ gst_d3d11_window_core_window_on_resize (GstD3D11Window * window, guint width, guint height); static void gst_d3d11_window_core_window_on_resize_sync (GstD3D11Window * window); +static void +gst_d3d11_window_core_window_unprepare (GstD3D11Window * window); static float get_logical_dpi (void) @@ -259,6 +261,8 @@ gst_d3d11_window_core_window_class_init (GstD3D11WindowCoreWindowClass * klass) GST_DEBUG_FUNCPTR (gst_d3d11_window_core_window_unlock_stop); window_class->on_resize = GST_DEBUG_FUNCPTR (gst_d3d11_window_core_window_on_resize); + window_class->unprepare = + GST_DEBUG_FUNCPTR (gst_d3d11_window_core_window_unprepare); } static void @@ -333,7 +337,15 @@ error: static void gst_d3d11_window_core_window_dispose (GObject * object) { - GstD3D11WindowCoreWindow *self = GST_D3D11_WINDOW_CORE_WINDOW (object); + gst_d3d11_window_core_window_unprepare (GST_D3D11_WINDOW (object)); + + G_OBJECT_CLASS (parent_class)->dispose (object); +} + +static void +gst_d3d11_window_core_window_unprepare (GstD3D11Window * window) +{ + GstD3D11WindowCoreWindow *self = GST_D3D11_WINDOW_CORE_WINDOW (window); CoreWindowWinRTStorage *storage = self->storage; if (storage) { @@ -356,8 +368,6 @@ gst_d3d11_window_core_window_dispose (GObject * object) } self->storage = NULL; - - G_OBJECT_CLASS (parent_class)->dispose (object); } static gboolean diff --git a/sys/d3d11/gstd3d11window_swapchainpanel.cpp b/sys/d3d11/gstd3d11window_swapchainpanel.cpp index f3c3a0eb2..8c99e08ef 100644 --- a/sys/d3d11/gstd3d11window_swapchainpanel.cpp +++ b/sys/d3d11/gstd3d11window_swapchainpanel.cpp @@ -96,6 +96,9 @@ gst_d3d11_window_swap_chain_panel_on_resize (GstD3D11Window * window, static void gst_d3d11_window_swap_chain_panel_on_resize_sync (GstD3D11Window * window); +static void +gst_d3d11_window_swap_chain_panel_unprepare (GstD3D11Window * window); + class PanelResizeHandler : public RuntimeClass<RuntimeClassFlags<ClassicCom>, Xaml::ISizeChangedEventHandler> @@ -224,6 +227,8 @@ gst_d3d11_window_swap_chain_panel_class_init (GstD3D11WindowSwapChainPanelClass GST_DEBUG_FUNCPTR (gst_d3d11_window_swap_chain_panel_unlock_stop); window_class->on_resize = GST_DEBUG_FUNCPTR (gst_d3d11_window_swap_chain_panel_on_resize); + window_class->unprepare = + GST_DEBUG_FUNCPTR (gst_d3d11_window_swap_chain_panel_unprepare); } static void @@ -304,8 +309,16 @@ error: static void gst_d3d11_window_swap_chain_panel_dispose (GObject * object) { + gst_d3d11_window_swap_chain_panel_unprepare (GST_D3D11_WINDOW (object)); + + G_OBJECT_CLASS (parent_class)->dispose (object); +} + +static void +gst_d3d11_window_swap_chain_panel_unprepare (GstD3D11Window * window) +{ GstD3D11WindowSwapChainPanel *self = - GST_D3D11_WINDOW_SWAP_CHAIN_PANEL (object); + GST_D3D11_WINDOW_SWAP_CHAIN_PANEL (window); SwapChainPanelWinRTStorage *storage = self->storage; if (storage) { @@ -329,8 +342,6 @@ gst_d3d11_window_swap_chain_panel_dispose (GObject * object) } self->storage = NULL; - - G_OBJECT_CLASS (parent_class)->dispose (object); } static gboolean diff --git a/sys/d3d11/gstd3d11window_win32.cpp b/sys/d3d11/gstd3d11window_win32.cpp index 762b92177..3c0de1254 100644 --- a/sys/d3d11/gstd3d11window_win32.cpp +++ b/sys/d3d11/gstd3d11window_win32.cpp @@ -118,6 +118,7 @@ gst_d3d11_window_win32_set_window_handle (GstD3D11WindowWin32 * self, static void gst_d3d11_window_win32_on_resize (GstD3D11Window * window, guint width, guint height); +static void gst_d3d11_window_win32_unprepare (GstD3D11Window * window); static void gst_d3d11_window_win32_class_init (GstD3D11WindowWin32Class * klass) @@ -139,6 +140,8 @@ gst_d3d11_window_win32_class_init (GstD3D11WindowWin32Class * klass) window_class->present = GST_DEBUG_FUNCPTR (gst_d3d11_window_win32_present); window_class->on_resize = GST_DEBUG_FUNCPTR (gst_d3d11_window_win32_on_resize); + window_class->unprepare = + GST_DEBUG_FUNCPTR (gst_d3d11_window_win32_unprepare); } static void @@ -171,11 +174,19 @@ gst_d3d11_window_win32_constructed (GObject * object) static void gst_d3d11_window_win32_dispose (GObject * object) { - GstD3D11WindowWin32 *self = GST_D3D11_WINDOW_WIN32 (object); + gst_d3d11_window_win32_unprepare (GST_D3D11_WINDOW (object)); + + G_OBJECT_CLASS (parent_class)->dispose (object); +} + +static void +gst_d3d11_window_win32_unprepare (GstD3D11Window * window) +{ + GstD3D11WindowWin32 *self = GST_D3D11_WINDOW_WIN32 (window); gst_d3d11_window_win32_release_external_handle (self); - if (self->loop) { + if (self->loop) { g_main_loop_quit (self->loop); } @@ -193,8 +204,6 @@ gst_d3d11_window_win32_dispose (GObject * object) g_main_context_unref (self->main_context); self->main_context = NULL; } - - G_OBJECT_CLASS (parent_class)->dispose (object); } static void |