From 2e574a80d94f7358cac36061db8810c64ec3ffae Mon Sep 17 00:00:00 2001 From: Seungha Yang Date: Thu, 29 Dec 2022 02:25:52 +0900 Subject: [PATCH] d3d11: Don't use g_alloca() _alloca CRT function is deprecated. Moreover, stack allocation for string is not a good idea. We can use _malloca inline function instead, but all use of _alloca in d3d11 library/plugin are not performance critical path at all. Part-of: --- .../gst-libs/gst/d3d11/gstd3d11device.cpp | 6 ++++-- .../sys/d3d11/gstd3d11decoder.cpp | 21 ++++++++++++------- .../sys/d3d11/gstd3d11screencapturedevice.cpp | 20 +++++++++++------- 3 files changed, 30 insertions(+), 17 deletions(-) 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 a97643a635..2a5c77b9df 100644 --- a/subprojects/gst-plugins-bad/gst-libs/gst/d3d11/gstd3d11device.cpp +++ b/subprojects/gst-plugins-bad/gst-libs/gst/d3d11/gstd3d11device.cpp @@ -225,7 +225,7 @@ gst_d3d11_device_d3d11_debug (GstD3D11Device * device, return; } - msg = (D3D11_MESSAGE *) g_alloca (msg_len); + msg = (D3D11_MESSAGE *) g_malloc0 (msg_len); hr = info_queue->GetMessage (i, msg, &msg_len); level = d3d11_message_severity_to_gst (msg->Severity); @@ -238,6 +238,7 @@ gst_d3d11_device_d3d11_debug (GstD3D11Device * device, gst_debug_log (gst_d3d11_debug_layer_debug, level, file, function, line, G_OBJECT (device), "D3D11InfoQueue: %s", msg->pDescription); + g_free (msg); } info_queue->ClearStoredMessages (); @@ -336,12 +337,13 @@ gst_d3d11_device_dxgi_debug (GstD3D11Device * device, return; } - msg = (DXGI_INFO_QUEUE_MESSAGE *) g_alloca (msg_len); + msg = (DXGI_INFO_QUEUE_MESSAGE *) g_malloc0 (msg_len); hr = info_queue->GetMessage (DXGI_DEBUG_ALL, i, msg, &msg_len); level = dxgi_info_queue_message_severity_to_gst (msg->Severity); gst_debug_log (gst_d3d11_debug_layer_debug, level, file, function, line, G_OBJECT (device), "DXGIInfoQueue: %s", msg->pDescription); + g_free (msg); } info_queue->ClearStoredMessages (DXGI_DEBUG_ALL); diff --git a/subprojects/gst-plugins-bad/sys/d3d11/gstd3d11decoder.cpp b/subprojects/gst-plugins-bad/sys/d3d11/gstd3d11decoder.cpp index c9190726e5..e7a9196f9f 100644 --- a/subprojects/gst-plugins-bad/sys/d3d11/gstd3d11decoder.cpp +++ b/subprojects/gst-plugins-bad/sys/d3d11/gstd3d11decoder.cpp @@ -644,6 +644,7 @@ gst_d3d11_decoder_get_supported_decoder_profile (GstD3D11Device * device, ID3D11VideoDevice *video_device; const GUID **profile_list = nullptr; guint profile_size = 0; + gboolean ret = FALSE; g_return_val_if_fail (GST_IS_D3D11_DEVICE (device), FALSE); g_return_val_if_fail (selected_profile != nullptr, FALSE); @@ -713,13 +714,13 @@ gst_d3d11_decoder_get_supported_decoder_profile (GstD3D11Device * device, GST_DEBUG_OBJECT (device, "Have %u available decoder profiles", available_profile_count); - guid_list = (GUID *) g_alloca (sizeof (GUID) * available_profile_count); + guid_list = g_new0 (GUID, available_profile_count); for (i = 0; i < available_profile_count; i++) { hr = video_device->GetVideoDecoderProfile (i, &guid_list[i]); if (!gst_d3d11_result (hr, device)) { GST_WARNING_OBJECT (device, "Failed to get %d th decoder profile", i); - return FALSE; + goto out; } } @@ -759,7 +760,7 @@ gst_d3d11_decoder_get_supported_decoder_profile (GstD3D11Device * device, if (!profile) { GST_INFO_OBJECT (device, "No supported decoder profile for %s codec", gst_dxva_codec_to_string (codec)); - return FALSE; + goto out; } *selected_profile = profile; @@ -772,7 +773,11 @@ gst_d3d11_decoder_get_supported_decoder_profile (GstD3D11Device * device, profile->Data4[3], profile->Data4[4], profile->Data4[5], profile->Data4[6], profile->Data4[7]); - return TRUE; + ret = TRUE; + +out: + g_free (guid_list); + return ret; } gboolean @@ -894,7 +899,7 @@ gst_d3d11_decoder_open (GstD3D11Decoder * self) HRESULT hr; BOOL can_support = FALSE; guint config_count; - D3D11_VIDEO_DECODER_CONFIG *config_list; + D3D11_VIDEO_DECODER_CONFIG *config_list = NULL; D3D11_VIDEO_DECODER_CONFIG *best_config = NULL; D3D11_VIDEO_DECODER_DESC decoder_desc = { 0, }; const GUID *selected_profile = NULL; @@ -995,9 +1000,7 @@ gst_d3d11_decoder_open (GstD3D11Decoder * self) GST_DEBUG_OBJECT (self, "Total %d config available", config_count); - config_list = (D3D11_VIDEO_DECODER_CONFIG *) - g_alloca (sizeof (D3D11_VIDEO_DECODER_CONFIG) * config_count); - + config_list = g_new0 (D3D11_VIDEO_DECODER_CONFIG, config_count); for (i = 0; i < config_count; i++) { hr = video_device->GetVideoDecoderConfig (&decoder_desc, i, &config_list[i]); @@ -1074,10 +1077,12 @@ gst_d3d11_decoder_open (GstD3D11Decoder * self) self->opened = TRUE; gst_d3d11_decoder_enable_high_precision_timer (self); + g_free (config_list); return TRUE; error: + g_free (config_list); gst_d3d11_decoder_reset (self); return FALSE; diff --git a/subprojects/gst-plugins-bad/sys/d3d11/gstd3d11screencapturedevice.cpp b/subprojects/gst-plugins-bad/sys/d3d11/gstd3d11screencapturedevice.cpp index 01a87b2312..baf588a9de 100644 --- a/subprojects/gst-plugins-bad/sys/d3d11/gstd3d11screencapturedevice.cpp +++ b/subprojects/gst-plugins-bad/sys/d3d11/gstd3d11screencapturedevice.cpp @@ -175,6 +175,9 @@ get_monitor_name (const MONITORINFOEXW * info, UINT32 num_path = 0; UINT32 num_mode = 0; LONG query_ret; + DISPLAYCONFIG_PATH_INFO *path_infos = nullptr; + DISPLAYCONFIG_MODE_INFO *mode_infos = nullptr; + gboolean ret = FALSE; memset (target, 0, sizeof (DISPLAYCONFIG_TARGET_DEVICE_NAME)); @@ -183,15 +186,13 @@ get_monitor_name (const MONITORINFOEXW * info, if (query_ret != ERROR_SUCCESS || num_path == 0 || num_mode == 0) return FALSE; - DISPLAYCONFIG_PATH_INFO *path_infos = (DISPLAYCONFIG_PATH_INFO *) - g_alloca (num_path * sizeof (DISPLAYCONFIG_PATH_INFO)); - DISPLAYCONFIG_MODE_INFO *mode_infos = (DISPLAYCONFIG_MODE_INFO *) - g_alloca (num_mode * sizeof (DISPLAYCONFIG_MODE_INFO)); + path_infos = g_new0 (DISPLAYCONFIG_PATH_INFO, num_path); + mode_infos = g_new0 (DISPLAYCONFIG_MODE_INFO, num_mode); query_ret = QueryDisplayConfig (QDC_ONLY_ACTIVE_PATHS, &num_path, path_infos, &num_mode, mode_infos, nullptr); if (query_ret != ERROR_SUCCESS) - return FALSE; + goto out; for (UINT32 i = 0; i < num_path; i++) { DISPLAYCONFIG_PATH_INFO *p = &path_infos[i]; @@ -226,10 +227,15 @@ get_monitor_name (const MONITORINFOEXW * info, memcpy (target, &tmp, sizeof (DISPLAYCONFIG_TARGET_DEVICE_NAME)); - return TRUE; + ret = TRUE; + break; } - return FALSE; +out: + g_free (path_infos); + g_free (mode_infos); + + return ret; } /* XXX: please bump MinGW toolchain version,