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: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/2848>
This commit is contained in:
Seungha Yang 2022-08-07 23:24:04 +09:00 committed by GStreamer Marge Bot
parent a75e88fdd2
commit 05dae94352
5 changed files with 33 additions and 112 deletions

View file

@ -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;

View file

@ -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;
}

View file

@ -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);
}
/**

View file

@ -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;
}

View file

@ -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);