d3d12: Add A420, A422 and A444 format support

Adding A420/A422/A444 and its 10/12/16 bits format support

Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/7093>
This commit is contained in:
Seungha Yang 2024-06-24 00:29:23 +09:00
parent 52bc28c93d
commit bb0f95a67f
4 changed files with 388 additions and 10 deletions

View file

@ -49,6 +49,8 @@
/* both SRV and RTV are supported */
#define GST_D3D12_TIER_1_FORMATS \
"AYUV64, GBRA_12LE, GBRA_10LE, AYUV, ABGR, ARGB, GBRA, Y444_16LE, " \
"A444_16LE, A444_12LE, A444_10LE, A444, " \
"A422_16LE, A422_12LE, A422_10LE, A422, A420_16LE, A420_12LE, A420_10LE, A420, " \
"GBR_16LE, Y444_12LE, GBR_12LE, I422_12LE, I420_12LE, Y444_10LE, GBR_10LE, " \
"I422_10LE, I420_10LE, Y444, BGRP, GBR, RGBP, xBGR, xRGB, Y42B, NV21, " \
"I420, YV12, Y41B, YUV9, YVU9, GRAY16_LE, GRAY8"

View file

@ -1197,7 +1197,8 @@ gst_d3d12_converter_update_dest_rect (GstD3D12Converter * self)
gst_d3d12_converter_update_clear_background (self);
switch (GST_VIDEO_INFO_FORMAT (&priv->out_info)) {
auto format = GST_VIDEO_INFO_FORMAT (&priv->out_info);
switch (format) {
case GST_VIDEO_FORMAT_YUV9:
case GST_VIDEO_FORMAT_YVU9:
priv->viewport[1].TopLeftX = priv->viewport[0].TopLeftX / 4;
@ -1238,6 +1239,10 @@ gst_d3d12_converter_update_dest_rect (GstD3D12Converter * self)
case GST_VIDEO_FORMAT_YV12:
case GST_VIDEO_FORMAT_I420_10LE:
case GST_VIDEO_FORMAT_I420_12LE:
case GST_VIDEO_FORMAT_A420:
case GST_VIDEO_FORMAT_A420_10LE:
case GST_VIDEO_FORMAT_A420_12LE:
case GST_VIDEO_FORMAT_A420_16LE:
priv->viewport[1].TopLeftX = priv->viewport[0].TopLeftX / 2;
priv->viewport[1].TopLeftY = priv->viewport[0].TopLeftY / 2;
priv->viewport[1].Width = priv->viewport[0].Width / 2;
@ -1256,6 +1261,10 @@ gst_d3d12_converter_update_dest_rect (GstD3D12Converter * self)
case GST_VIDEO_FORMAT_Y42B:
case GST_VIDEO_FORMAT_I422_10LE:
case GST_VIDEO_FORMAT_I422_12LE:
case GST_VIDEO_FORMAT_A422:
case GST_VIDEO_FORMAT_A422_10LE:
case GST_VIDEO_FORMAT_A422_12LE:
case GST_VIDEO_FORMAT_A422_16LE:
priv->viewport[1].TopLeftX = priv->viewport[0].TopLeftX / 2;
priv->viewport[1].TopLeftY = priv->viewport[0].TopLeftY;
priv->viewport[1].Width = priv->viewport[0].Width / 2;
@ -1284,6 +1293,10 @@ gst_d3d12_converter_update_dest_rect (GstD3D12Converter * self)
case GST_VIDEO_FORMAT_GBRA:
case GST_VIDEO_FORMAT_GBRA_10LE:
case GST_VIDEO_FORMAT_GBRA_12LE:
case GST_VIDEO_FORMAT_A444:
case GST_VIDEO_FORMAT_A444_10LE:
case GST_VIDEO_FORMAT_A444_12LE:
case GST_VIDEO_FORMAT_A444_16LE:
for (guint i = 1; i < GST_VIDEO_INFO_N_PLANES (&priv->out_info); i++) {
priv->viewport[i] = priv->viewport[0];
priv->scissor_rect[i] = priv->scissor_rect[0];
@ -1513,6 +1526,9 @@ gst_d3d12_converter_calculate_border_color (GstD3D12Converter * self)
case GST_VIDEO_FORMAT_Y444_10LE:
case GST_VIDEO_FORMAT_GBR_10LE:
case GST_VIDEO_FORMAT_GBRA_10LE:
case GST_VIDEO_FORMAT_A420_10LE:
case GST_VIDEO_FORMAT_A422_10LE:
case GST_VIDEO_FORMAT_A444_10LE:
for (guint i = 0; i < 3; i++) {
converted[i] /= 64.0;
}
@ -1523,6 +1539,9 @@ gst_d3d12_converter_calculate_border_color (GstD3D12Converter * self)
case GST_VIDEO_FORMAT_Y444_12LE:
case GST_VIDEO_FORMAT_GBR_12LE:
case GST_VIDEO_FORMAT_GBRA_12LE:
case GST_VIDEO_FORMAT_A420_12LE:
case GST_VIDEO_FORMAT_A422_12LE:
case GST_VIDEO_FORMAT_A444_12LE:
for (guint i = 0; i < 3; i++) {
converted[i] /= 16.0;
}
@ -1624,6 +1643,23 @@ gst_d3d12_converter_calculate_border_color (GstD3D12Converter * self)
priv->clear_color[2][2] = 0;
priv->clear_color[2][3] = 1.0;
break;
case GST_VIDEO_FORMAT_A420:
case GST_VIDEO_FORMAT_A420_10LE:
case GST_VIDEO_FORMAT_A420_12LE:
case GST_VIDEO_FORMAT_A420_16LE:
case GST_VIDEO_FORMAT_A422:
case GST_VIDEO_FORMAT_A422_10LE:
case GST_VIDEO_FORMAT_A422_12LE:
case GST_VIDEO_FORMAT_A422_16LE:
case GST_VIDEO_FORMAT_A444:
case GST_VIDEO_FORMAT_A444_10LE:
case GST_VIDEO_FORMAT_A444_12LE:
case GST_VIDEO_FORMAT_A444_16LE:
priv->clear_color[0][0] = converted[0];
priv->clear_color[1][0] = converted[1];
priv->clear_color[2][0] = converted[2];
priv->clear_color[3][0] = a;
break;
case GST_VIDEO_FORMAT_RGBP:
priv->clear_color[0][0] = converted[0];
priv->clear_color[1][0] = converted[1];
@ -1917,6 +1953,32 @@ gst_d3d12_converter_update_pso (GstD3D12Converter * self)
return TRUE;
}
static void
reorder_rtv_handles (GstVideoFormat output_format,
D3D12_CPU_DESCRIPTOR_HANDLE * src, D3D12_CPU_DESCRIPTOR_HANDLE * dst)
{
switch (output_format) {
case GST_VIDEO_FORMAT_A420:
case GST_VIDEO_FORMAT_A420_10LE:
case GST_VIDEO_FORMAT_A420_12LE:
case GST_VIDEO_FORMAT_A420_16LE:
case GST_VIDEO_FORMAT_A422:
case GST_VIDEO_FORMAT_A422_10LE:
case GST_VIDEO_FORMAT_A422_12LE:
case GST_VIDEO_FORMAT_A422_16LE:
dst[0] = src[0];
dst[1] = src[3];
dst[2] = src[1];
dst[3] = src[2];
return;
default:
break;
}
for (guint i = 0; i < GST_VIDEO_MAX_PLANES; i++)
dst[i] = src[i];
}
static gboolean
gst_d3d12_converter_execute (GstD3D12Converter * self, GstD3D12Frame * in_frame,
GstD3D12Frame * out_frame, GstD3D12FenceData * fence_data,
@ -2014,6 +2076,10 @@ gst_d3d12_converter_execute (GstD3D12Converter * self, GstD3D12Frame * in_frame,
}
}
D3D12_CPU_DESCRIPTOR_HANDLE reordered_rtv_handle[GST_VIDEO_MAX_PLANES];
reorder_rtv_handles (GST_VIDEO_INFO_FORMAT (&priv->out_info),
out_frame->rtv_desc_handle, reordered_rtv_handle);
auto pso = priv->quad_data[0].pso.Get ();
cl->SetGraphicsRootSignature (priv->rs.Get ());
@ -2033,10 +2099,10 @@ gst_d3d12_converter_execute (GstD3D12Converter * self, GstD3D12Frame * in_frame,
cl->IASetIndexBuffer (&priv->idv);
cl->IASetVertexBuffers (0, 1, &priv->vbv);
cl->IASetPrimitiveTopology (D3D_PRIMITIVE_TOPOLOGY_TRIANGLELIST);
cl->RSSetViewports (priv->quad_data[0].num_rtv, priv->viewport);
cl->RSSetScissorRects (priv->quad_data[0].num_rtv, priv->scissor_rect);
cl->RSSetViewports (1, priv->viewport);
cl->RSSetScissorRects (1, priv->scissor_rect);
cl->OMSetRenderTargets (priv->quad_data[0].num_rtv,
out_frame->rtv_desc_handle, FALSE, nullptr);
reordered_rtv_handle, FALSE, nullptr);
cl->OMSetBlendFactor (priv->blend_factor);
cl->DrawIndexedInstanced (6, 1, 0, 0, 0);
@ -2048,11 +2114,10 @@ gst_d3d12_converter_execute (GstD3D12Converter * self, GstD3D12Frame * in_frame,
pso = priv->quad_data[1].pso.Get ();
cl->SetPipelineState (pso);
cl->RSSetViewports (priv->quad_data[1].num_rtv, &priv->viewport[offset]);
cl->RSSetScissorRects (priv->quad_data[1].num_rtv,
&priv->scissor_rect[offset]);
cl->RSSetViewports (1, &priv->viewport[offset]);
cl->RSSetScissorRects (1, &priv->scissor_rect[offset]);
cl->OMSetRenderTargets (priv->quad_data[1].num_rtv,
out_frame->rtv_desc_handle + offset, FALSE, nullptr);
reordered_rtv_handle + offset, FALSE, nullptr);
cl->DrawIndexedInstanced (6, 1, 0, 0, 0);
pso->AddRef ();

View file

@ -73,6 +73,12 @@ struct PS_OUTPUT_CHROMA_PLANAR
float4 Plane1: SV_TARGET1;
};
struct PS_OUTPUT_LUMA_ALPHA
{
float4 Plane0: SV_TARGET0;
float4 Plane1: SV_TARGET1;
};
struct PS_OUTPUT_PLANAR
{
float4 Plane0: SV_TARGET0;
@ -206,6 +212,45 @@ class SamplerI420_12 : ISampler
}
};
class SamplerA420 : ISampler
{
float4 Execute (float2 uv)
{
float4 sample;
sample.x = shaderTexture_0.Sample(samplerState, uv).x;
sample.y = shaderTexture_1.Sample(samplerState, uv).x;
sample.z = shaderTexture_2.Sample(samplerState, uv).x;
sample.a = shaderTexture_3.Sample(samplerState, uv).x;
return sample;
}
};
class SamplerA420_10 : ISampler
{
float4 Execute (float2 uv)
{
float4 sample;
sample.x = shaderTexture_0.Sample(samplerState, uv).x;
sample.y = shaderTexture_1.Sample(samplerState, uv).x;
sample.z = shaderTexture_2.Sample(samplerState, uv).x;
sample.a = shaderTexture_3.Sample(samplerState, uv).x;
return float4 (saturate (sample * 64.0));
}
};
class SamplerA420_12 : ISampler
{
float4 Execute (float2 uv)
{
float4 sample;
sample.x = shaderTexture_0.Sample(samplerState, uv).x;
sample.y = shaderTexture_1.Sample(samplerState, uv).x;
sample.z = shaderTexture_2.Sample(samplerState, uv).x;
sample.a = shaderTexture_3.Sample(samplerState, uv).x;
return float4 (saturate (sample * 16.0));
}
};
class SamplerVUYA : ISampler
{
float4 Execute (float2 uv)
@ -749,7 +794,8 @@ class OutputChromaNV21 : IOutputChroma
};
interface IOutputChromaPlanar
{ PS_OUTPUT_CHROMA_PLANAR Build (float4 sample);
{
PS_OUTPUT_CHROMA_PLANAR Build (float4 sample);
};
class OutputChromaI420 : IOutputChromaPlanar
@ -798,6 +844,48 @@ class OutputChromaI420_12 : IOutputChromaPlanar
}
};
interface IOutputLumaAlpha
{
PS_OUTPUT_LUMA_ALPHA Build (float4 sample);
};
class OutputLumaAlphaA420 : IOutputLumaAlpha
{
PS_OUTPUT_LUMA_ALPHA Build (float4 sample)
{
PS_OUTPUT_LUMA_ALPHA output;
output.Plane0 = float4 (sample.x, 0, 0, 0);
output.Plane1 = float4 (sample.a * alphaFactor, 0, 0, 0);
return output;
}
};
class OutputLumaAlphaA420_10 : IOutputLumaAlpha
{
PS_OUTPUT_LUMA_ALPHA Build (float4 sample)
{
PS_OUTPUT_LUMA_ALPHA output;
sample.a *= alphaFactor;
float2 scaled = UnormTo10bit (sample.xw);
output.Plane0 = float4 (scaled.x, 0, 0, 0);
output.Plane1 = float4 (scaled.y, 0, 0, 0);
return output;
}
};
class OutputLumaAlphaA420_12 : IOutputLumaAlpha
{
PS_OUTPUT_LUMA_ALPHA Build (float4 sample)
{
PS_OUTPUT_LUMA_ALPHA output;
sample.a *= alphaFactor;
float2 scaled = UnormTo12bit (sample.xw);
output.Plane0 = float4 (scaled.x, 0, 0, 0);
output.Plane1 = float4 (scaled.y, 0, 0, 0);
return output;
}
};
interface IOutputPlanar
{
PS_OUTPUT_PLANAR Build (float4 sample);
@ -1001,6 +1089,51 @@ class OutputGBRAPremul_12 : IOutputPlanarFull
}
};
class OutputA444 : IOutputPlanarFull
{
PS_OUTPUT_PLANAR_FULL Build (float4 sample)
{
PS_OUTPUT_PLANAR_FULL output;
output.Plane0 = float4 (sample.x, 0, 0, 0);
output.Plane1 = float4 (sample.y, 0, 0, 0);
output.Plane2 = float4 (sample.z, 0, 0, 0);
output.Plane3 = float4 (sample.a * alphaFactor, 0, 0, 0);
return output;
}
};
class OutputA444_10 : IOutputPlanarFull
{
PS_OUTPUT_PLANAR_FULL Build (float4 sample)
{
PS_OUTPUT_PLANAR_FULL output;
float4 scaled;
sample.a *= alphaFactor;
scaled = UnormTo10bit (sample);
output.Plane0 = float4 (scaled.x, 0, 0, 0);
output.Plane1 = float4 (scaled.y, 0, 0, 0);
output.Plane2 = float4 (scaled.z, 0, 0, 0);
output.Plane3 = float4 (scaled.a, 0, 0, 0);
return output;
}
};
class OutputA444_12 : IOutputPlanarFull
{
PS_OUTPUT_PLANAR_FULL Build (float4 sample)
{
PS_OUTPUT_PLANAR_FULL output;
float4 scaled;
sample.a *= alphaFactor;
scaled = UnormTo12bit (sample);
output.Plane0 = float4 (scaled.x, 0, 0, 0);
output.Plane1 = float4 (scaled.y, 0, 0, 0);
output.Plane2 = float4 (scaled.z, 0, 0, 0);
output.Plane3 = float4 (scaled.a, 0, 0, 0);
return output;
}
};
interface IOutputPacked
{
PS_OUTPUT_PACKED Build (float4 sample);
@ -1267,6 +1400,12 @@ static const char str_PSMain_converter[] =
" float4 Plane1: SV_TARGET1;\n"
"};\n"
"\n"
"struct PS_OUTPUT_LUMA_ALPHA\n"
"{\n"
" float4 Plane0: SV_TARGET0;\n"
" float4 Plane1: SV_TARGET1;\n"
"};\n"
"\n"
"struct PS_OUTPUT_PLANAR\n"
"{\n"
" float4 Plane0: SV_TARGET0;\n"
@ -1400,6 +1539,45 @@ static const char str_PSMain_converter[] =
" }\n"
"};\n"
"\n"
"class SamplerA420 : ISampler\n"
"{\n"
" float4 Execute (float2 uv)\n"
" {\n"
" float4 sample;\n"
" sample.x = shaderTexture_0.Sample(samplerState, uv).x;\n"
" sample.y = shaderTexture_1.Sample(samplerState, uv).x;\n"
" sample.z = shaderTexture_2.Sample(samplerState, uv).x;\n"
" sample.a = shaderTexture_3.Sample(samplerState, uv).x;\n"
" return sample;\n"
" }\n"
"};\n"
"\n"
"class SamplerA420_10 : ISampler\n"
"{\n"
" float4 Execute (float2 uv)\n"
" {\n"
" float4 sample;\n"
" sample.x = shaderTexture_0.Sample(samplerState, uv).x;\n"
" sample.y = shaderTexture_1.Sample(samplerState, uv).x;\n"
" sample.z = shaderTexture_2.Sample(samplerState, uv).x;\n"
" sample.a = shaderTexture_3.Sample(samplerState, uv).x;\n"
" return float4 (saturate (sample * 64.0));\n"
" }\n"
"};\n"
"\n"
"class SamplerA420_12 : ISampler\n"
"{\n"
" float4 Execute (float2 uv)\n"
" {\n"
" float4 sample;\n"
" sample.x = shaderTexture_0.Sample(samplerState, uv).x;\n"
" sample.y = shaderTexture_1.Sample(samplerState, uv).x;\n"
" sample.z = shaderTexture_2.Sample(samplerState, uv).x;\n"
" sample.a = shaderTexture_3.Sample(samplerState, uv).x;\n"
" return float4 (saturate (sample * 16.0));\n"
" }\n"
"};\n"
"\n"
"class SamplerVUYA : ISampler\n"
"{\n"
" float4 Execute (float2 uv)\n"
@ -1943,7 +2121,8 @@ static const char str_PSMain_converter[] =
"};\n"
"\n"
"interface IOutputChromaPlanar\n"
"{ PS_OUTPUT_CHROMA_PLANAR Build (float4 sample);\n"
"{\n"
" PS_OUTPUT_CHROMA_PLANAR Build (float4 sample);\n"
"};\n"
"\n"
"class OutputChromaI420 : IOutputChromaPlanar\n"
@ -1992,6 +2171,47 @@ static const char str_PSMain_converter[] =
" }\n"
"};\n"
"\n"
"interface IOutputLumaAlpha\n"
"{\n"
" PS_OUTPUT_LUMA_ALPHA Build (float4 sample);\n"
"};\n"
"\n"
"class OutputLumaAlphaA420 : IOutputLumaAlpha\n"
"{\n"
" PS_OUTPUT_LUMA_ALPHA Build (float4 sample)\n"
" {\n"
" PS_OUTPUT_LUMA_ALPHA output;\n"
" output.Plane0 = float4 (sample.x, 0, 0, 0);\n"
" output.Plane1 = float4 (sample.a * alphaFactor, 0, 0, 0);\n"
" return output;\n"
" }\n"
"};\n"
"\n"
"class OutputLumaAlphaA420_10 : IOutputLumaAlpha\n"
"{\n"
" PS_OUTPUT_LUMA_ALPHA Build (float4 sample)\n"
" {\n"
" PS_OUTPUT_LUMA_ALPHA output;\n"
" sample.a *= alphaFactor;\n"
" float2 scaled = UnormTo10bit (sample.xw);\n"
" output.Plane0 = float4 (scaled.x, 0, 0, 0);\n"
" output.Plane1 = float4 (scaled.y, 0, 0, 0);\n"
" return output;\n"
" }\n"
"};\n"
"\n"
"class OutputLumaAlphaA420_12 : IOutputLumaAlpha\n"
"{\n"
" PS_OUTPUT_LUMA_ALPHA Build (float4 sample)\n"
" {\n"
" PS_OUTPUT_LUMA_ALPHA output;\n"
" sample.a *= alphaFactor;\n"
" float2 scaled = UnormTo12bit (sample.xw);\n"
" output.Plane0 = float4 (scaled.x, 0, 0, 0);\n"
" output.Plane1 = float4 (scaled.y, 0, 0, 0);\n"
" return output;\n"
" }\n"
"};\n"
"interface IOutputPlanar\n"
"{\n"
" PS_OUTPUT_PLANAR Build (float4 sample);\n"
@ -2195,6 +2415,51 @@ static const char str_PSMain_converter[] =
" }\n"
"};\n"
"\n"
"class OutputA444 : IOutputPlanarFull\n"
"{\n"
" PS_OUTPUT_PLANAR_FULL Build (float4 sample)\n"
" {\n"
" PS_OUTPUT_PLANAR_FULL output;\n"
" output.Plane0 = float4 (sample.x, 0, 0, 0);\n"
" output.Plane1 = float4 (sample.y, 0, 0, 0);\n"
" output.Plane2 = float4 (sample.z, 0, 0, 0);\n"
" output.Plane3 = float4 (sample.a * alphaFactor, 0, 0, 0);\n"
" return output;\n"
" }\n"
"};\n"
"\n"
"class OutputA444_10 : IOutputPlanarFull\n"
"{\n"
" PS_OUTPUT_PLANAR_FULL Build (float4 sample)\n"
" {\n"
" PS_OUTPUT_PLANAR_FULL output;\n"
" float4 scaled;\n"
" sample.a *= alphaFactor;\n"
" scaled = UnormTo10bit (sample);\n"
" output.Plane0 = float4 (scaled.x, 0, 0, 0);\n"
" output.Plane1 = float4 (scaled.y, 0, 0, 0);\n"
" output.Plane2 = float4 (scaled.z, 0, 0, 0);\n"
" output.Plane3 = float4 (scaled.a, 0, 0, 0);\n"
" return output;\n"
" }\n"
"};\n"
"\n"
"class OutputA444_12 : IOutputPlanarFull\n"
"{\n"
" PS_OUTPUT_PLANAR_FULL Build (float4 sample)\n"
" {\n"
" PS_OUTPUT_PLANAR_FULL output;\n"
" float4 scaled;\n"
" sample.a *= alphaFactor;\n"
" scaled = UnormTo12bit (sample);\n"
" output.Plane0 = float4 (scaled.x, 0, 0, 0);\n"
" output.Plane1 = float4 (scaled.y, 0, 0, 0);\n"
" output.Plane2 = float4 (scaled.z, 0, 0, 0);\n"
" output.Plane3 = float4 (scaled.a, 0, 0, 0);\n"
" return output;\n"
" }\n"
"};\n"
"\n"
"interface IOutputPacked\n"
"{\n"
" PS_OUTPUT_PACKED Build (float4 sample);\n"

View file

@ -560,6 +560,7 @@ enum class PS_OUTPUT
LUMA,
CHROMA,
CHROMA_PLANAR,
LUMA_ALPHA,
PLANAR,
PLANAR_FULL,
};
@ -576,6 +577,8 @@ ps_output_to_string (PS_OUTPUT output)
return "PS_OUTPUT_CHROMA";
case PS_OUTPUT::CHROMA_PLANAR:
return "PS_OUTPUT_CHROMA_PLANAR";
case PS_OUTPUT::LUMA_ALPHA:
return "PS_OUTPUT_LUMA_ALPHA";
case PS_OUTPUT::PLANAR:
return "PS_OUTPUT_PLANAR";
case PS_OUTPUT::PLANAR_FULL:
@ -597,6 +600,7 @@ ps_output_get_num_rtv (PS_OUTPUT output)
case PS_OUTPUT::CHROMA:
return 1;
case PS_OUTPUT::CHROMA_PLANAR:
case PS_OUTPUT::LUMA_ALPHA:
return 2;
case PS_OUTPUT::PLANAR:
return 3;
@ -719,6 +723,21 @@ conv_ps_make_input (GstVideoFormat format, gboolean premul)
return "RGB15";
case GST_VIDEO_FORMAT_BGR15:
return "BGR15";
case GST_VIDEO_FORMAT_A420:
case GST_VIDEO_FORMAT_A420_16LE:
case GST_VIDEO_FORMAT_A422:
case GST_VIDEO_FORMAT_A422_16LE:
case GST_VIDEO_FORMAT_A444:
case GST_VIDEO_FORMAT_A444_16LE:
return "A420";
case GST_VIDEO_FORMAT_A420_10LE:
case GST_VIDEO_FORMAT_A422_10LE:
case GST_VIDEO_FORMAT_A444_10LE:
return "A420_10";
case GST_VIDEO_FORMAT_A420_12LE:
case GST_VIDEO_FORMAT_A422_12LE:
case GST_VIDEO_FORMAT_A444_12LE:
return "A420_12";
default:
g_assert_not_reached ();
break;
@ -806,6 +825,23 @@ conv_ps_make_output (GstVideoFormat format, gboolean premul)
ret.push_back({PS_OUTPUT::LUMA, "Luma_10"});
ret.push_back({PS_OUTPUT::CHROMA_PLANAR, "ChromaI420_10"});
break;
case GST_VIDEO_FORMAT_A420:
case GST_VIDEO_FORMAT_A420_16LE:
case GST_VIDEO_FORMAT_A422:
case GST_VIDEO_FORMAT_A422_16LE:
ret.push_back({PS_OUTPUT::LUMA_ALPHA, "LumaAlphaA420"});
ret.push_back({PS_OUTPUT::CHROMA_PLANAR, "ChromaI420"});
break;
case GST_VIDEO_FORMAT_A420_10LE:
case GST_VIDEO_FORMAT_A422_10LE:
ret.push_back({PS_OUTPUT::LUMA_ALPHA, "LumaAlphaA420_10"});
ret.push_back({PS_OUTPUT::CHROMA_PLANAR, "ChromaI420_10"});
break;
case GST_VIDEO_FORMAT_A420_12LE:
case GST_VIDEO_FORMAT_A422_12LE:
ret.push_back({PS_OUTPUT::LUMA_ALPHA, "LumaAlphaA420_12"});
ret.push_back({PS_OUTPUT::CHROMA_PLANAR, "ChromaI420_12"});
break;
case GST_VIDEO_FORMAT_Y444_10LE:
ret.push_back({PS_OUTPUT::PLANAR, "Y444_10"});
break;
@ -855,6 +891,16 @@ conv_ps_make_output (GstVideoFormat format, gboolean premul)
else
ret.push_back({PS_OUTPUT::PLANAR_FULL, "GBRA_12"});
break;
case GST_VIDEO_FORMAT_A444:
case GST_VIDEO_FORMAT_A444_16LE:
ret.push_back({PS_OUTPUT::PLANAR_FULL, "A444"});
break;
case GST_VIDEO_FORMAT_A444_10LE:
ret.push_back({PS_OUTPUT::PLANAR_FULL, "A444_10"});
break;
case GST_VIDEO_FORMAT_A444_12LE:
ret.push_back({PS_OUTPUT::PLANAR_FULL, "A444_12"});
break;
case GST_VIDEO_FORMAT_RBGA:
if (premul)
ret.push_back({PS_OUTPUT::PACKED, "RBGAPremul"});