From ca14eeeeaa52ce361c424342dfc21b4cd23fe07e Mon Sep 17 00:00:00 2001 From: Seungha Yang Date: Sat, 18 Nov 2023 22:51:41 +0900 Subject: [PATCH] d3d11convert: Add support for YUY2 and Y410 output Part-of: --- .../gst-libs/gst/d3d11/gstd3d11-private.h | 9 +++---- .../sys/d3d11/gstd3d11convert.cpp | 24 +++++++++++++++---- 2 files changed, 22 insertions(+), 11 deletions(-) diff --git a/subprojects/gst-plugins-bad/gst-libs/gst/d3d11/gstd3d11-private.h b/subprojects/gst-plugins-bad/gst-libs/gst/d3d11/gstd3d11-private.h index 4006b5fec4..2bec861e6c 100644 --- a/subprojects/gst-plugins-bad/gst-libs/gst/d3d11/gstd3d11-private.h +++ b/subprojects/gst-plugins-bad/gst-libs/gst/d3d11/gstd3d11-private.h @@ -32,21 +32,18 @@ G_BEGIN_DECLS #define GST_D3D11_COMMON_FORMATS \ "RGBA64_LE, RGB10A2_LE, BGRA, RGBA, BGRx, RGBx, VUYA, NV12, NV21, " \ "P010_10LE, P012_LE, P016_LE, I420, YV12, I420_10LE, I420_12LE, " \ - "Y42B, I422_10LE, I422_12LE, Y444, Y444_10LE, Y444_12LE, Y444_16LE, " \ + "Y42B, I422_10LE, I422_12LE, Y444, Y444_10LE, Y444_12LE, Y444_16LE, YUY2, Y410, " \ "GRAY8, GRAY16_LE, AYUV, AYUV64, RGBP, BGRP, GBR, GBR_10LE, GBR_12LE, " \ "GBR_16LE, GBRA, GBRA_10LE, GBRA_12LE" -#define GST_D3D11_EXTRA_IN_FORMATS \ - "Y410, YUY2" - #define GST_D3D11_SINK_FORMATS \ - "{ " GST_D3D11_COMMON_FORMATS " ," GST_D3D11_EXTRA_IN_FORMATS " }" + "{ " GST_D3D11_COMMON_FORMATS " }" #define GST_D3D11_SRC_FORMATS \ "{ " GST_D3D11_COMMON_FORMATS " }" #define GST_D3D11_ALL_FORMATS \ - "{ " GST_D3D11_COMMON_FORMATS " ," GST_D3D11_EXTRA_IN_FORMATS " }" + "{ " GST_D3D11_COMMON_FORMATS " }" #define GST_TYPE_D3D11_FORMAT_SUPPORT (gst_d3d11_format_support_get_type()) GType gst_d3d11_format_support_get_type (void); diff --git a/subprojects/gst-plugins-bad/sys/d3d11/gstd3d11convert.cpp b/subprojects/gst-plugins-bad/sys/d3d11/gstd3d11convert.cpp index 01b6324733..278adba965 100644 --- a/subprojects/gst-plugins-bad/sys/d3d11/gstd3d11convert.cpp +++ b/subprojects/gst-plugins-bad/sys/d3d11/gstd3d11convert.cpp @@ -1446,7 +1446,7 @@ gst_d3d11_base_convert_decide_allocation (GstBaseTransform * trans, GstVideoInfo info; guint i; GstD3D11Format d3d11_format; - guint bind_flags = D3D11_BIND_RENDER_TARGET; + guint bind_flags = 0; DXGI_FORMAT dxgi_format = DXGI_FORMAT_UNKNOWN; UINT supported = 0; HRESULT hr; @@ -1481,12 +1481,26 @@ gst_d3d11_base_convert_decide_allocation (GstBaseTransform * trans, device_handle = gst_d3d11_device_get_device_handle (filter->device); hr = device_handle->CheckFormatSupport (dxgi_format, &supported); - if (gst_d3d11_result (hr, filter->device) && - (supported & D3D11_FORMAT_SUPPORT_SHADER_SAMPLE) == - D3D11_FORMAT_SUPPORT_SHADER_SAMPLE) { - bind_flags |= D3D11_BIND_SHADER_RESOURCE; + if (!gst_d3d11_result (hr, filter->device)) { + GST_ERROR_OBJECT (self, "CheckFormatSupport failed"); + return FALSE; } + if ((supported & D3D11_FORMAT_SUPPORT_RENDER_TARGET) != 0) { + bind_flags |= D3D11_BIND_RENDER_TARGET; + } else { + if (d3d11_format.dxgi_format != DXGI_FORMAT_UNKNOWN && + (supported & D3D11_FORMAT_SUPPORT_VIDEO_PROCESSOR_OUTPUT) != 0) { + bind_flags |= D3D11_BIND_RENDER_TARGET; + } + + if ((supported & D3D11_FORMAT_SUPPORT_TYPED_UNORDERED_ACCESS_VIEW) != 0) + bind_flags |= D3D11_BIND_UNORDERED_ACCESS; + } + + if ((supported & D3D11_FORMAT_SUPPORT_SHADER_SAMPLE) != 0) + bind_flags |= D3D11_BIND_SHADER_RESOURCE; + size = GST_VIDEO_INFO_SIZE (&info); if (gst_query_get_n_allocation_pools (query) > 0) {