summaryrefslogtreecommitdiff
path: root/sys
diff options
context:
space:
mode:
authorSeungha Yang <seungha@centricular.com>2020-05-27 01:52:59 +0900
committerSeungha Yang <seungha@centricular.com>2020-05-27 04:59:50 +0900
commitafe941249ece4263e7b206599c8ba95dc61f6e9a (patch)
treeeee8297df7ace73fce465ff43a2005ce267c6111 /sys
parent8ce4980273fc18db5276b26619e819f1e4ed85d7 (diff)
downloadgstreamer-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.c3
-rw-r--r--sys/d3d11/gstd3d11window.cpp13
-rw-r--r--sys/d3d11/gstd3d11window.h4
-rw-r--r--sys/d3d11/gstd3d11window_corewindow.cpp16
-rw-r--r--sys/d3d11/gstd3d11window_swapchainpanel.cpp17
-rw-r--r--sys/d3d11/gstd3d11window_win32.cpp17
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