From: Seungha Yang Date: Sun, 7 Aug 2022 14:24:04 +0000 (+0900) Subject: d3d11: Use WIN32 API directly for locking with RAII pattern X-Git-Tag: 1.22.0~1139 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=05dae94352f60e415ebafd5da563f9cbd02123cb;p=platform%2Fupstream%2Fgstreamer.git d3d11: Use WIN32 API directly for locking with RAII pattern Such abstraction is unnecessary for this library/plugin. Use WIN32 API directly instead of GLib wrappers. Part-of: --- diff --git a/subprojects/gst-plugins-bad/gst-libs/gst/d3d11/gstd3d11converter.cpp b/subprojects/gst-plugins-bad/gst-libs/gst/d3d11/gstd3d11converter.cpp index e17c222..49af140 100644 --- a/subprojects/gst-plugins-bad/gst-libs/gst/d3d11/gstd3d11converter.cpp +++ b/subprojects/gst-plugins-bad/gst-libs/gst/d3d11/gstd3d11converter.cpp @@ -626,7 +626,7 @@ struct _GstD3D11ConverterPrivate GstVideoOrientationMethod video_direction; - GMutex prop_lock; + SRWLOCK prop_lock; /* properties */ gint src_x; @@ -762,7 +762,6 @@ gst_d3d11_converter_init (GstD3D11Converter * self) { self->priv = (GstD3D11ConverterPrivate *) gst_d3d11_converter_get_instance_private (self); - g_mutex_init (&self->priv->prop_lock); } static void @@ -813,8 +812,6 @@ gst_d3d11_converter_finalize (GObject * object) g_free (priv->in_cll_str); g_free (priv->out_cll_str); - g_mutex_clear (&priv->prop_lock); - G_OBJECT_CLASS (parent_class)->finalize (object); } @@ -867,7 +864,7 @@ gst_d3d11_converter_set_property (GObject * object, guint prop_id, GstD3D11Converter *self = GST_D3D11_CONVERTER (object); GstD3D11ConverterPrivate *priv = self->priv; - g_mutex_lock (&priv->prop_lock); + GstD3D11SRWLockGuard (&priv->prop_lock); switch (prop_id) { case PROP_SRC_X: update_src_rect (self, &priv->src_x, value); @@ -974,7 +971,6 @@ gst_d3d11_converter_set_property (GObject * object, guint prop_id, G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); break; } - g_mutex_unlock (&priv->prop_lock); } static void @@ -984,7 +980,7 @@ gst_d3d11_converter_get_property (GObject * object, guint prop_id, GstD3D11Converter *self = GST_D3D11_CONVERTER (object); GstD3D11ConverterPrivate *priv = self->priv; - g_mutex_lock (&priv->prop_lock); + GstD3D11SRWLockGuard (&priv->prop_lock); switch (prop_id) { case PROP_SRC_X: g_value_set_int (value, priv->src_x); @@ -1056,7 +1052,6 @@ gst_d3d11_converter_get_property (GObject * object, guint prop_id, G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); break; } - g_mutex_unlock (&priv->prop_lock); } static gboolean @@ -3096,7 +3091,6 @@ gst_d3d11_converter_convert_internal (GstD3D11Converter * self, UINT offsets = 0; UINT vertex_stride = sizeof (VertexData); ID3D11ShaderResourceView *clear_view[GST_VIDEO_MAX_PLANES] = { nullptr, }; - gboolean ret = TRUE; priv = self->priv; cinfo = &priv->convert_info; @@ -3107,11 +3101,9 @@ gst_d3d11_converter_convert_internal (GstD3D11Converter * self, resource.As (&texture); texture->GetDesc (&desc); - g_mutex_lock (&priv->prop_lock); if (priv->update_dest_rect && !gst_d3d11_converter_update_dest_rect (self)) { GST_ERROR_OBJECT (self, "Failed to update dest rect"); - ret = FALSE; - goto out; + return FALSE; } if (priv->update_src_rect || @@ -3125,8 +3117,7 @@ gst_d3d11_converter_convert_internal (GstD3D11Converter * self, if (!gst_d3d11_converter_update_src_rect (self)) { GST_ERROR_OBJECT (self, "Cannot update src rect"); - ret = FALSE; - goto out; + return FALSE; } } @@ -3140,8 +3131,7 @@ gst_d3d11_converter_convert_internal (GstD3D11Converter * self, if (!gst_d3d11_result (hr, self->device)) { GST_ERROR_OBJECT (self, "Couldn't map constant buffer, hr: 0x%x", (guint) hr); - ret = FALSE; - goto out; + return FALSE; } const_buffer = (PSConstBuffer *) map.pData; @@ -3197,10 +3187,7 @@ gst_d3d11_converter_convert_internal (GstD3D11Converter * self, context->PSSetShaderResources (0, 4, clear_view); context->OMSetRenderTargets (0, nullptr, nullptr); -out: - g_mutex_unlock (&priv->prop_lock); - - return ret; + return TRUE; } static gboolean @@ -3652,7 +3639,7 @@ gst_d3d11_converter_convert_buffer_internal (GstD3D11Converter * self, return FALSE; } - g_mutex_lock (&priv->prop_lock); + GstD3D11SRWLockGuard (&priv->prop_lock); gst_d3d11_converter_update_hdr10_meta (self); if (priv->blend && priv->blend_desc.RenderTarget[0].BlendEnable) { @@ -3706,14 +3693,12 @@ gst_d3d11_converter_convert_buffer_internal (GstD3D11Converter * self, if (use_processor) { if (!pov) { GST_ERROR_OBJECT (self, "POV is unavailable"); - g_mutex_unlock (&priv->prop_lock); goto out; } if (!piv) { if (!gst_d3d11_converter_ensure_fallback_inbuf (self, in_buf, in_info)) { GST_ERROR_OBJECT (self, "Couldn't copy into fallback texture"); - g_mutex_unlock (&priv->prop_lock); goto out; } @@ -3723,7 +3708,6 @@ gst_d3d11_converter_convert_buffer_internal (GstD3D11Converter * self, if (!gst_d3d11_converter_map_buffer (self, in_buf, in_info, (GstMapFlags) (GST_MAP_READ | GST_MAP_D3D11))) { GST_ERROR_OBJECT (self, "Couldn't map fallback buffer"); - g_mutex_unlock (&priv->prop_lock); in_buf = nullptr; goto out; } @@ -3733,7 +3717,6 @@ gst_d3d11_converter_convert_buffer_internal (GstD3D11Converter * self, priv->video_device, priv->enumerator); if (!piv) { GST_ERROR_OBJECT (self, "Couldn't get POV from fallback buffer"); - g_mutex_unlock (&priv->prop_lock); goto out; } } @@ -3748,13 +3731,11 @@ gst_d3d11_converter_convert_buffer_internal (GstD3D11Converter * self, if (priv->update_dest_rect && !gst_d3d11_converter_update_dest_rect (self)) { GST_ERROR_OBJECT (self, "Failed to update dest rect"); - g_mutex_unlock (&priv->prop_lock); goto out; } if (priv->update_src_rect && !gst_d3d11_converter_update_src_rect (self)) { GST_ERROR_OBJECT (self, "Cannot update src rect"); - g_mutex_unlock (&priv->prop_lock); goto out; } @@ -3807,14 +3788,11 @@ gst_d3d11_converter_convert_buffer_internal (GstD3D11Converter * self, GST_TRACE_OBJECT (self, "Converting using processor"); hr = video_ctx->VideoProcessorBlt (proc, pov, 0, 1, &stream); - g_mutex_unlock (&priv->prop_lock); - ret = gst_d3d11_result (hr, self->device);; + ret = gst_d3d11_result (hr, self->device); goto out; } - g_mutex_unlock (&priv->prop_lock); - if ((priv->supported_backend & GST_D3D11_CONVERTER_BACKEND_SHADER) == 0) { GST_ERROR_OBJECT (self, "Conversion is not supported"); goto out; diff --git a/subprojects/gst-plugins-bad/gst-libs/gst/d3d11/gstd3d11device.cpp b/subprojects/gst-plugins-bad/gst-libs/gst/d3d11/gstd3d11device.cpp index 41df918..b537f6d 100644 --- a/subprojects/gst-plugins-bad/gst-libs/gst/d3d11/gstd3d11device.cpp +++ b/subprojects/gst-plugins-bad/gst-libs/gst/d3d11/gstd3d11device.cpp @@ -114,7 +114,7 @@ struct _GstD3D11DevicePrivate GArray *format_table; CRITICAL_SECTION extern_lock; - GMutex resource_lock; + SRWLOCK resource_lock; LARGE_INTEGER frequency; @@ -411,7 +411,6 @@ gst_d3d11_device_init (GstD3D11Device * self) sizeof (GstD3D11Format), GST_D3D11_N_FORMATS); InitializeCriticalSection (&priv->extern_lock); - g_mutex_init (&priv->resource_lock); self->priv = priv; } @@ -740,7 +739,6 @@ gst_d3d11_device_finalize (GObject * object) g_array_unref (priv->format_table); DeleteCriticalSection (&priv->extern_lock); - g_mutex_clear (&priv->resource_lock); g_free (priv->description); G_OBJECT_CLASS (parent_class)->finalize (object); @@ -1253,7 +1251,7 @@ gst_d3d11_device_get_video_device_handle (GstD3D11Device * device) g_return_val_if_fail (GST_IS_D3D11_DEVICE (device), NULL); priv = device->priv; - g_mutex_lock (&priv->resource_lock); + GstD3D11SRWLockGuard lk (&priv->resource_lock); if (!priv->video_device) { HRESULT hr; ID3D11VideoDevice *video_device = NULL; @@ -1262,7 +1260,6 @@ gst_d3d11_device_get_video_device_handle (GstD3D11Device * device) if (gst_d3d11_result (hr, device)) priv->video_device = video_device; } - g_mutex_unlock (&priv->resource_lock); return priv->video_device; } @@ -1287,7 +1284,7 @@ gst_d3d11_device_get_video_context_handle (GstD3D11Device * device) g_return_val_if_fail (GST_IS_D3D11_DEVICE (device), NULL); priv = device->priv; - g_mutex_lock (&priv->resource_lock); + GstD3D11SRWLockGuard lk (&priv->resource_lock); if (!priv->video_context) { HRESULT hr; ID3D11VideoContext *video_context = NULL; @@ -1296,7 +1293,6 @@ gst_d3d11_device_get_video_context_handle (GstD3D11Device * device) if (gst_d3d11_result (hr, device)) priv->video_context = video_context; } - g_mutex_unlock (&priv->resource_lock); return priv->video_context; } diff --git a/subprojects/gst-plugins-bad/sys/d3d11/gstd3d11convert.cpp b/subprojects/gst-plugins-bad/sys/d3d11/gstd3d11convert.cpp index 62923e7..4604239 100644 --- a/subprojects/gst-plugins-bad/sys/d3d11/gstd3d11convert.cpp +++ b/subprojects/gst-plugins-bad/sys/d3d11/gstd3d11convert.cpp @@ -85,7 +85,7 @@ struct _GstD3D11BaseConvert /* method previously selected and used for negotiation */ GstVideoOrientationMethod active_method; - GMutex lock; + SRWLOCK lock; }; /** @@ -102,7 +102,6 @@ G_DEFINE_ABSTRACT_TYPE_WITH_CODE (GstD3D11BaseConvert, gst_d3d11_base_convert, "d3d11convert")); static void gst_d3d11_base_convert_dispose (GObject * object); -static void gst_d3d11_base_convert_finalize (GObject * object); static GstCaps *gst_d3d11_base_convert_transform_caps (GstBaseTransform * trans, GstPadDirection direction, GstCaps * caps, GstCaps * filter); static GstCaps *gst_d3d11_base_convert_fixate_caps (GstBaseTransform * @@ -259,7 +258,6 @@ gst_d3d11_base_convert_class_init (GstD3D11BaseConvertClass * klass) GstCaps *caps; gobject_class->dispose = gst_d3d11_base_convert_dispose; - gobject_class->finalize = gst_d3d11_base_convert_finalize; caps = gst_d3d11_get_updated_template_caps (&sink_template_caps); gst_element_class_add_pad_template (element_class, @@ -300,8 +298,6 @@ gst_d3d11_base_convert_init (GstD3D11BaseConvert * self) self->border_color = DEFAULT_BORDER_COLOR; self->gamma_mode = DEFAULT_GAMMA_MODE; self->primaries_mode = DEFAULT_PRIMARIES_MODE; - - g_mutex_init (&self->lock); } static void @@ -309,23 +305,11 @@ gst_d3d11_base_convert_dispose (GObject * object) { GstD3D11BaseConvert *self = GST_D3D11_BASE_CONVERT (object); - g_mutex_lock (&self->lock); gst_clear_object (&self->converter); - g_mutex_unlock (&self->lock); G_OBJECT_CLASS (parent_class)->dispose (object); } -static void -gst_d3d11_base_convert_finalize (GObject * object) -{ - GstD3D11BaseConvert *self = GST_D3D11_BASE_CONVERT (object); - - g_mutex_clear (&self->lock); - - G_OBJECT_CLASS (parent_class)->finalize (object); -} - static GstCaps * gst_d3d11_base_convert_transform_caps (GstBaseTransform * trans, GstPadDirection direction, GstCaps * caps, GstCaps * filter) @@ -687,7 +671,7 @@ gst_d3d11_base_convert_fixate_size (GstBaseTransform * base, * assume that missing PAR on the sinkpad means 1/1 and * missing PAR on the srcpad means undefined */ - g_mutex_lock (&self->lock); + GstD3D11SRWLockGuard lk (&self->lock); switch (self->selected_method) { case GST_VIDEO_ORIENTATION_90R: case GST_VIDEO_ORIENTATION_90L: @@ -1140,7 +1124,6 @@ done: g_value_unset (&fpar); if (to_par == &tpar) g_value_unset (&tpar); - g_mutex_unlock (&self->lock); return othercaps; } @@ -1465,7 +1448,7 @@ gst_d3d11_base_convert_set_info (GstD3D11BaseFilter * filter, gint in_width, in_height, in_par_n, in_par_d; GstStructure *config; - g_mutex_lock (&self->lock); + GstD3D11SRWLockGuard lk (&self->lock); self->active_method = self->selected_method; if (self->active_method != GST_VIDEO_ORIENTATION_IDENTITY) @@ -1473,7 +1456,6 @@ gst_d3d11_base_convert_set_info (GstD3D11BaseFilter * filter, if (!need_flip && gst_caps_is_equal (incaps, outcaps)) { self->same_caps = TRUE; - g_mutex_unlock (&self->lock); return TRUE; } else { self->same_caps = FALSE; @@ -1544,7 +1526,6 @@ gst_d3d11_base_convert_set_info (GstD3D11BaseFilter * filter, /* if present, these must match */ if (in_info->interlace_mode != out_info->interlace_mode) { GST_ERROR_OBJECT (self, "input and output formats do not match"); - g_mutex_unlock (&self->lock); return FALSE; } @@ -1553,7 +1534,6 @@ gst_d3d11_base_convert_set_info (GstD3D11BaseFilter * filter, self->borders_h == 0 && !need_flip && !gst_d3d11_base_convert_needs_color_convert (self, in_info, out_info)) { self->same_caps = TRUE; - g_mutex_unlock (&self->lock); return TRUE; } @@ -1567,7 +1547,6 @@ gst_d3d11_base_convert_set_info (GstD3D11BaseFilter * filter, config); if (!self->converter) { GST_ERROR_OBJECT (self, "Couldn't create converter"); - g_mutex_unlock (&self->lock); return FALSE; } @@ -1614,8 +1593,6 @@ gst_d3d11_base_convert_set_info (GstD3D11BaseFilter * filter, self->border_color, nullptr); } - g_mutex_unlock (&self->lock); - return TRUE; } @@ -1923,11 +1900,10 @@ static void gst_d3d11_base_convert_set_border_color (GstD3D11BaseConvert * self, guint64 border_color) { - g_mutex_lock (&self->lock); + GstD3D11SRWLockGuard lk (&self->lock); self->border_color = border_color; if (self->converter) g_object_set (self->converter, "border-color", self->border_color, nullptr); - g_mutex_unlock (&self->lock); } static void @@ -1939,7 +1915,7 @@ gst_d3d11_base_convert_set_orientation (GstD3D11BaseConvert * self, return; } - g_mutex_lock (&self->lock); + GstD3D11SRWLockGuard lk (&self->lock); if (from_tag) self->tag_method = method; else @@ -1957,28 +1933,25 @@ gst_d3d11_base_convert_set_orientation (GstD3D11BaseConvert * self, gst_base_transform_reconfigure_src (GST_BASE_TRANSFORM (self)); } - - g_mutex_unlock (&self->lock); } static void gst_d3d11_base_convert_set_gamma_mode (GstD3D11BaseConvert * self, GstVideoGammaMode mode) { - g_mutex_lock (&self->lock); + GstD3D11SRWLockGuard lk (&self->lock); if (self->gamma_mode != mode) { GST_DEBUG_OBJECT (self, "Gamma mode %d -> %d", self->gamma_mode, mode); self->gamma_mode = mode; gst_base_transform_reconfigure_src (GST_BASE_TRANSFORM (self)); } - g_mutex_unlock (&self->lock); } static void gst_d3d11_base_convert_set_primaries_mode (GstD3D11BaseConvert * self, GstVideoPrimariesMode mode) { - g_mutex_lock (&self->lock); + GstD3D11SRWLockGuard lk (&self->lock); if (self->primaries_mode != mode) { gboolean prev_enabled = TRUE; gboolean new_enabled = TRUE; @@ -1997,7 +1970,6 @@ gst_d3d11_base_convert_set_primaries_mode (GstD3D11BaseConvert * self, if (prev_enabled != new_enabled) gst_base_transform_reconfigure_src (GST_BASE_TRANSFORM (self)); } - g_mutex_unlock (&self->lock); } /** diff --git a/subprojects/gst-plugins-bad/sys/d3d11/gstd3d11decoder.cpp b/subprojects/gst-plugins-bad/sys/d3d11/gstd3d11decoder.cpp index eb74d19..2458dc4 100644 --- a/subprojects/gst-plugins-bad/sys/d3d11/gstd3d11decoder.cpp +++ b/subprojects/gst-plugins-bad/sys/d3d11/gstd3d11decoder.cpp @@ -159,7 +159,7 @@ struct _GstD3D11Decoder GstVideoCodecState *output_state; /* Protect internal pool */ - GMutex internal_pool_lock; + SRWLOCK internal_pool_lock; GstBufferPool *internal_pool; /* Internal pool params */ @@ -221,7 +221,6 @@ gst_d3d11_decoder_class_init (GstD3D11DecoderClass * klass) static void gst_d3d11_decoder_init (GstD3D11Decoder * self) { - g_mutex_init (&self->internal_pool_lock); } static void @@ -292,12 +291,11 @@ gst_d3d11_decoder_get_property (GObject * object, guint prop_id, static void gst_d3d11_decoder_clear_resource (GstD3D11Decoder * self) { - g_mutex_lock (&self->internal_pool_lock); + GstD3D11SRWLockGuard lk (&self->internal_pool_lock); if (self->internal_pool) { gst_buffer_pool_set_active (self->internal_pool, FALSE); gst_clear_object (&self->internal_pool); } - g_mutex_unlock (&self->internal_pool_lock); GST_D3D11_CLEAR_COM (self->decoder_handle); GST_D3D11_CLEAR_COM (self->staging); @@ -339,16 +337,14 @@ gst_d3d11_decoder_dispose (GObject * obj) static void gst_d3d11_decoder_finalize (GObject * obj) { +#if HAVE_WINMM GstD3D11Decoder *self = GST_D3D11_DECODER (obj); -#if HAVE_WINMM /* Restore clock precision */ if (self->timer_resolution) timeEndPeriod (self->timer_resolution); #endif - g_mutex_clear (&self->internal_pool_lock); - G_OBJECT_CLASS (parent_class)->finalize (obj); } @@ -447,12 +443,11 @@ gst_d3d11_decoder_prepare_output_view_pool (GstD3D11Decoder * self) GstVideoInfo *info = &self->info; guint pool_size; - g_mutex_lock (&self->internal_pool_lock); + GstD3D11SRWLockGuard lk (&self->internal_pool_lock); if (self->internal_pool) { gst_buffer_pool_set_active (self->internal_pool, FALSE); gst_clear_object (&self->internal_pool); } - g_mutex_unlock (&self->internal_pool_lock); if (!self->use_array_of_texture) { alloc_flags = GST_D3D11_ALLOCATION_FLAG_TEXTURE_ARRAY; @@ -516,9 +511,7 @@ gst_d3d11_decoder_prepare_output_view_pool (GstD3D11Decoder * self) goto error; } - g_mutex_lock (&self->internal_pool_lock); self->internal_pool = pool; - g_mutex_unlock (&self->internal_pool_lock); return TRUE; @@ -1860,10 +1853,9 @@ gst_d3d11_decoder_set_flushing (GstD3D11Decoder * decoder, { g_return_val_if_fail (GST_IS_D3D11_DECODER (decoder), FALSE); - g_mutex_lock (&decoder->internal_pool_lock); + GstD3D11SRWLockGuard lk (&decoder->internal_pool_lock); if (decoder->internal_pool) gst_buffer_pool_set_flushing (decoder->internal_pool, flushing); - g_mutex_unlock (&decoder->internal_pool_lock); return TRUE; } diff --git a/subprojects/gst-plugins-bad/sys/d3d11/gstd3d11window_win32.cpp b/subprojects/gst-plugins-bad/sys/d3d11/gstd3d11window_win32.cpp index 2cbd11a..5843778 100644 --- a/subprojects/gst-plugins-bad/sys/d3d11/gstd3d11window_win32.cpp +++ b/subprojects/gst-plugins-bad/sys/d3d11/gstd3d11window_win32.cpp @@ -60,8 +60,8 @@ struct _GstD3D11WindowWin32 { GstD3D11Window parent; - GMutex lock; - GCond cond; + SRWLOCK lock; + CONDITION_VARIABLE cond; GMainContext *main_context; GMainLoop *loop; @@ -101,7 +101,6 @@ G_DEFINE_TYPE (GstD3D11WindowWin32, gst_d3d11_window_win32, static void gst_d3d11_window_win32_constructed (GObject * object); static void gst_d3d11_window_win32_dispose (GObject * object); -static void gst_d3d11_window_win32_finalize (GObject * object); static void gst_d3d11_window_win32_show (GstD3D11Window * window); static void gst_d3d11_window_win32_update_swap_chain (GstD3D11Window * window); @@ -140,7 +139,6 @@ gst_d3d11_window_win32_class_init (GstD3D11WindowWin32Class * klass) gobject_class->constructed = gst_d3d11_window_win32_constructed; gobject_class->dispose = gst_d3d11_window_win32_dispose; - gobject_class->finalize = gst_d3d11_window_win32_finalize; window_class->show = GST_DEBUG_FUNCPTR (gst_d3d11_window_win32_show); window_class->update_swap_chain = @@ -163,9 +161,6 @@ gst_d3d11_window_win32_class_init (GstD3D11WindowWin32Class * klass) static void gst_d3d11_window_win32_init (GstD3D11WindowWin32 * self) { - g_mutex_init (&self->lock); - g_cond_init (&self->cond); - self->main_context = g_main_context_new (); } @@ -180,13 +175,13 @@ gst_d3d11_window_win32_constructed (GObject * object) goto done; } - g_mutex_lock (&self->lock); + AcquireSRWLockExclusive (&self->lock); self->loop = g_main_loop_new (self->main_context, FALSE); self->thread = g_thread_new ("GstD3D11WindowWin32", (GThreadFunc) gst_d3d11_window_win32_thread_func, self); while (!g_main_loop_is_running (self->loop)) - g_cond_wait (&self->cond, &self->lock); - g_mutex_unlock (&self->lock); + SleepConditionVariableSRW (&self->cond, &self->lock, INFINITE, 0); + ReleaseSRWLockExclusive (&self->lock); done: G_OBJECT_CLASS (parent_class)->constructed (object); @@ -299,17 +294,6 @@ gst_d3d11_window_win32_set_title (GstD3D11Window * window, const gchar * title) } } -static void -gst_d3d11_window_win32_finalize (GObject * object) -{ - GstD3D11WindowWin32 *self = GST_D3D11_WINDOW_WIN32 (object); - - g_mutex_clear (&self->lock); - g_cond_clear (&self->cond); - - G_OBJECT_CLASS (parent_class)->finalize (object); -} - static gboolean running_cb (gpointer user_data) { @@ -317,9 +301,9 @@ running_cb (gpointer user_data) GST_TRACE_OBJECT (self, "Main loop running now"); - g_mutex_lock (&self->lock); - g_cond_signal (&self->cond); - g_mutex_unlock (&self->lock); + AcquireSRWLockExclusive (&self->lock); + WakeConditionVariable (&self->cond); + ReleaseSRWLockExclusive (&self->lock); return G_SOURCE_REMOVE; } @@ -834,7 +818,7 @@ sub_class_proc (HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam) MoveWindow (self->internal_hwnd, 0, 0, LOWORD (lParam), HIWORD (lParam), FALSE); } else if (uMsg == WM_CLOSE || uMsg == WM_DESTROY) { - g_mutex_lock (&self->lock); + GstD3D11SRWLockGuard lk (&self->lock); GST_WARNING_OBJECT (self, "external window is closing"); gst_d3d11_window_win32_release_external_handle (self->external_hwnd); self->external_hwnd = NULL; @@ -846,7 +830,6 @@ sub_class_proc (HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam) self->internal_hwnd_thread = NULL; self->overlay_state = GST_D3D11_WINDOW_WIN32_OVERLAY_STATE_CLOSED; - g_mutex_unlock (&self->lock); } else { gst_d3d11_window_win32_handle_window_proc (self, hWnd, uMsg, wParam, lParam);