d3d11: Store device format in struct

Holding pointer to struct was unsafe approach because
the pointer to d3d11 format will be invalidated once d3d11 device
object is released

Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/1699>
This commit is contained in:
Seungha Yang 2022-02-13 04:36:39 +09:00 committed by GStreamer Marge Bot
parent 04f3a2bd22
commit dd906f9610
16 changed files with 131 additions and 118 deletions

View file

@ -299,8 +299,7 @@ gst_d3d11_buffer_pool_set_config (GstBufferPool * pool, GstStructure * config)
gst_memory_unref (mem); gst_memory_unref (mem);
} }
g_assert (priv->d3d11_params->d3d11_format != NULL); format = &priv->d3d11_params->d3d11_format;
format = priv->d3d11_params->d3d11_format;
/* single texture semi-planar formats */ /* single texture semi-planar formats */
if (format->dxgi_format != DXGI_FORMAT_UNKNOWN && if (format->dxgi_format != DXGI_FORMAT_UNKNOWN &&
GST_VIDEO_INFO_N_PLANES (&info) == 2) { GST_VIDEO_INFO_N_PLANES (&info) == 2) {

View file

@ -1419,30 +1419,40 @@ gst_d3d11_device_unlock (GstD3D11Device * device)
} }
/** /**
* gst_d3d11_device_format_from_gst: * gst_d3d11_device_get_format:
* @device: a #GstD3D11Device * @device: a #GstD3D11Device
* @format: a #GstVideoFormat * @format: a #GstVideoFormat
* @device_format: (out caller-allocates) (nullable): a #GstD3D11Format
* *
* Returns: (transfer none) (nullable): a pointer to #GstD3D11Format * Converts @format to #GstD3D11Format if the @format is supported
* or %NULL if @format is not supported by @device * by device
* *
* Since: 1.20 * Returns: %TRUE if @format is supported by @device
*
* Since: 1.22
*/ */
const GstD3D11Format * gboolean
gst_d3d11_device_format_from_gst (GstD3D11Device * device, gst_d3d11_device_get_format (GstD3D11Device * device, GstVideoFormat format,
GstVideoFormat format) GstD3D11Format * device_format)
{ {
GstD3D11DevicePrivate *priv; GstD3D11DevicePrivate *priv;
guint i;
g_return_val_if_fail (GST_IS_D3D11_DEVICE (device), NULL); g_return_val_if_fail (GST_IS_D3D11_DEVICE (device), FALSE);
priv = device->priv; priv = device->priv;
for (i = 0; i < G_N_ELEMENTS (priv->format_table); i++) { for (guint i = 0; i < G_N_ELEMENTS (priv->format_table); i++) {
if (priv->format_table[i].format == format) if (priv->format_table[i].format != format)
return &priv->format_table[i]; continue;
if (device_format)
*device_format = priv->format_table[i];
return TRUE;
} }
return NULL; if (device_format)
gst_d3d11_format_init (device_format);
return FALSE;
} }

View file

@ -91,8 +91,9 @@ GST_D3D11_API
void gst_d3d11_device_unlock (GstD3D11Device * device); void gst_d3d11_device_unlock (GstD3D11Device * device);
GST_D3D11_API GST_D3D11_API
const GstD3D11Format * gst_d3d11_device_format_from_gst (GstD3D11Device * device, gboolean gst_d3d11_device_get_format (GstD3D11Device * device,
GstVideoFormat format); GstVideoFormat format,
GstD3D11Format * device_format);
G_END_DECLS G_END_DECLS

View file

@ -192,3 +192,19 @@ gst_d3d11_dxgi_format_to_gst (DXGI_FORMAT format)
return GST_VIDEO_FORMAT_UNKNOWN; return GST_VIDEO_FORMAT_UNKNOWN;
} }
/**
* gst_d3d11_format_init:
* @format: (out caller-allocates): a #GstD3D11Format
*
* Initialize @format with default values.
*
* Since: 1.22
*/
void
gst_d3d11_format_init (GstD3D11Format * format)
{
g_return_if_fail (format != nullptr);
memset (format, 0, sizeof (GstD3D11Format));
}

View file

@ -73,6 +73,9 @@ gboolean gst_d3d11_dxgi_format_get_size (DXGI_FORMAT format,
GST_D3D11_API GST_D3D11_API
GstVideoFormat gst_d3d11_dxgi_format_to_gst (DXGI_FORMAT format); GstVideoFormat gst_d3d11_dxgi_format_to_gst (DXGI_FORMAT format);
GST_D3D11_API
void gst_d3d11_format_init (GstD3D11Format * format);
G_END_DECLS G_END_DECLS
#endif /* __GST_D3D11_FORMAT_H__ */ #endif /* __GST_D3D11_FORMAT_H__ */

View file

@ -61,14 +61,13 @@ gst_d3d11_allocation_params_new (GstD3D11Device * device, GstVideoInfo * info,
GstD3D11AllocationFlags flags, guint bind_flags) GstD3D11AllocationFlags flags, guint bind_flags)
{ {
GstD3D11AllocationParams *ret; GstD3D11AllocationParams *ret;
const GstD3D11Format *d3d11_format; GstD3D11Format d3d11_format;
guint i; guint i;
g_return_val_if_fail (info != NULL, NULL); g_return_val_if_fail (info != NULL, NULL);
d3d11_format = gst_d3d11_device_format_from_gst (device, if (!gst_d3d11_device_get_format (device, GST_VIDEO_INFO_FORMAT (info),
GST_VIDEO_INFO_FORMAT (info)); &d3d11_format)) {
if (!d3d11_format) {
GST_WARNING ("Couldn't get d3d11 format"); GST_WARNING ("Couldn't get d3d11 format");
return NULL; return NULL;
} }
@ -93,15 +92,15 @@ gst_d3d11_allocation_params_new (GstD3D11Device * device, GstVideoInfo * info,
*/ */
/* If corresponding dxgi format is undefined, use resource format instead */ /* If corresponding dxgi format is undefined, use resource format instead */
if (d3d11_format->dxgi_format == DXGI_FORMAT_UNKNOWN) { if (d3d11_format.dxgi_format == DXGI_FORMAT_UNKNOWN) {
for (i = 0; i < GST_VIDEO_INFO_N_PLANES (info); i++) { for (i = 0; i < GST_VIDEO_INFO_N_PLANES (info); i++) {
g_assert (d3d11_format->resource_format[i] != DXGI_FORMAT_UNKNOWN); g_assert (d3d11_format.resource_format[i] != DXGI_FORMAT_UNKNOWN);
ret->desc[i].Width = GST_VIDEO_INFO_COMP_WIDTH (info, i); ret->desc[i].Width = GST_VIDEO_INFO_COMP_WIDTH (info, i);
ret->desc[i].Height = GST_VIDEO_INFO_COMP_HEIGHT (info, i); ret->desc[i].Height = GST_VIDEO_INFO_COMP_HEIGHT (info, i);
ret->desc[i].MipLevels = 1; ret->desc[i].MipLevels = 1;
ret->desc[i].ArraySize = 1; ret->desc[i].ArraySize = 1;
ret->desc[i].Format = d3d11_format->resource_format[i]; ret->desc[i].Format = d3d11_format.resource_format[i];
ret->desc[i].SampleDesc.Count = 1; ret->desc[i].SampleDesc.Count = 1;
ret->desc[i].SampleDesc.Quality = 0; ret->desc[i].SampleDesc.Quality = 0;
ret->desc[i].Usage = D3D11_USAGE_DEFAULT; ret->desc[i].Usage = D3D11_USAGE_DEFAULT;
@ -112,7 +111,7 @@ gst_d3d11_allocation_params_new (GstD3D11Device * device, GstVideoInfo * info,
ret->desc[0].Height = GST_VIDEO_INFO_HEIGHT (info); ret->desc[0].Height = GST_VIDEO_INFO_HEIGHT (info);
ret->desc[0].MipLevels = 1; ret->desc[0].MipLevels = 1;
ret->desc[0].ArraySize = 1; ret->desc[0].ArraySize = 1;
ret->desc[0].Format = d3d11_format->dxgi_format; ret->desc[0].Format = d3d11_format.dxgi_format;
ret->desc[0].SampleDesc.Count = 1; ret->desc[0].SampleDesc.Count = 1;
ret->desc[0].SampleDesc.Quality = 0; ret->desc[0].SampleDesc.Quality = 0;
ret->desc[0].Usage = D3D11_USAGE_DEFAULT; ret->desc[0].Usage = D3D11_USAGE_DEFAULT;

View file

@ -128,7 +128,7 @@ struct _GstD3D11AllocationParams
GstVideoInfo info; GstVideoInfo info;
GstVideoInfo aligned_info; GstVideoInfo aligned_info;
const GstD3D11Format *d3d11_format; GstD3D11Format d3d11_format;
GstD3D11AllocationFlags flags; GstD3D11AllocationFlags flags;

View file

@ -126,7 +126,7 @@ gst_d3d11_staging_buffer_pool_set_config (GstBufferPool * pool,
GstCaps *caps = nullptr; GstCaps *caps = nullptr;
guint min_buffers, max_buffers; guint min_buffers, max_buffers;
D3D11_TEXTURE2D_DESC *desc; D3D11_TEXTURE2D_DESC *desc;
const GstD3D11Format *format; GstD3D11Format format;
gsize offset = 0; gsize offset = 0;
if (!gst_buffer_pool_config_get_params (config, &caps, nullptr, &min_buffers, if (!gst_buffer_pool_config_get_params (config, &caps, nullptr, &min_buffers,
@ -140,10 +140,10 @@ gst_d3d11_staging_buffer_pool_set_config (GstBufferPool * pool,
if (!gst_video_info_from_caps (&info, caps)) if (!gst_video_info_from_caps (&info, caps))
goto wrong_caps; goto wrong_caps;
format = gst_d3d11_device_format_from_gst (self->device, if (!gst_d3d11_device_get_format (self->device, GST_VIDEO_INFO_FORMAT (&info),
GST_VIDEO_INFO_FORMAT (&info)); &format)) {
if (!format)
goto wrong_caps; goto wrong_caps;
}
GST_LOG_OBJECT (pool, "%dx%d, caps %" GST_PTR_FORMAT, info.width, info.height, GST_LOG_OBJECT (pool, "%dx%d, caps %" GST_PTR_FORMAT, info.width, info.height,
caps); caps);
@ -154,7 +154,7 @@ gst_d3d11_staging_buffer_pool_set_config (GstBufferPool * pool,
memset (priv->offset, 0, sizeof (priv->offset)); memset (priv->offset, 0, sizeof (priv->offset));
memset (priv->desc, 0, sizeof (priv->desc)); memset (priv->desc, 0, sizeof (priv->desc));
if (format->dxgi_format == DXGI_FORMAT_UNKNOWN) { if (format.dxgi_format == DXGI_FORMAT_UNKNOWN) {
for (guint i = 0; i < GST_VIDEO_INFO_N_PLANES (&info); i++) { for (guint i = 0; i < GST_VIDEO_INFO_N_PLANES (&info); i++) {
desc = &priv->desc[i]; desc = &priv->desc[i];
@ -162,7 +162,7 @@ gst_d3d11_staging_buffer_pool_set_config (GstBufferPool * pool,
desc->Height = GST_VIDEO_INFO_COMP_HEIGHT (&info, i); desc->Height = GST_VIDEO_INFO_COMP_HEIGHT (&info, i);
desc->MipLevels = 1; desc->MipLevels = 1;
desc->ArraySize = 1; desc->ArraySize = 1;
desc->Format = format->resource_format[i]; desc->Format = format.resource_format[i];
desc->SampleDesc.Count = 1; desc->SampleDesc.Count = 1;
desc->Usage = D3D11_USAGE_STAGING; desc->Usage = D3D11_USAGE_STAGING;
desc->CPUAccessFlags = D3D11_CPU_ACCESS_READ | D3D11_CPU_ACCESS_WRITE; desc->CPUAccessFlags = D3D11_CPU_ACCESS_READ | D3D11_CPU_ACCESS_WRITE;
@ -176,7 +176,7 @@ gst_d3d11_staging_buffer_pool_set_config (GstBufferPool * pool,
height = GST_VIDEO_INFO_HEIGHT (&info); height = GST_VIDEO_INFO_HEIGHT (&info);
/* resolution of semi-planar formats must be multiple of 2 */ /* resolution of semi-planar formats must be multiple of 2 */
switch (format->dxgi_format) { switch (format.dxgi_format) {
case DXGI_FORMAT_NV12: case DXGI_FORMAT_NV12:
case DXGI_FORMAT_P010: case DXGI_FORMAT_P010:
case DXGI_FORMAT_P016: case DXGI_FORMAT_P016:
@ -191,7 +191,7 @@ gst_d3d11_staging_buffer_pool_set_config (GstBufferPool * pool,
desc->Height = height; desc->Height = height;
desc->MipLevels = 1; desc->MipLevels = 1;
desc->ArraySize = 1; desc->ArraySize = 1;
desc->Format = format->dxgi_format; desc->Format = format.dxgi_format;
desc->SampleDesc.Count = 1; desc->SampleDesc.Count = 1;
desc->Usage = D3D11_USAGE_STAGING; desc->Usage = D3D11_USAGE_STAGING;
desc->CPUAccessFlags = D3D11_CPU_ACCESS_READ | D3D11_CPU_ACCESS_WRITE; desc->CPUAccessFlags = D3D11_CPU_ACCESS_READ | D3D11_CPU_ACCESS_WRITE;
@ -247,7 +247,7 @@ gst_d3d11_staging_buffer_pool_set_config (GstBufferPool * pool,
} }
/* single texture semi-planar formats */ /* single texture semi-planar formats */
if (format->dxgi_format != DXGI_FORMAT_UNKNOWN && if (format.dxgi_format != DXGI_FORMAT_UNKNOWN &&
GST_VIDEO_INFO_N_PLANES (&info) == 2) { GST_VIDEO_INFO_N_PLANES (&info) == 2) {
priv->stride[1] = priv->stride[0]; priv->stride[1] = priv->stride[0];
priv->offset[1] = priv->stride[0] * priv->desc[0].Height; priv->offset[1] = priv->stride[0] * priv->desc[0].Height;

View file

@ -56,8 +56,8 @@ struct _GstD3D11BaseConvert
{ {
GstD3D11BaseFilter parent; GstD3D11BaseFilter parent;
const GstD3D11Format *in_d3d11_format; GstD3D11Format in_d3d11_format;
const GstD3D11Format *out_d3d11_format; GstD3D11Format out_d3d11_format;
ID3D11Texture2D *in_texture[GST_VIDEO_MAX_PLANES]; ID3D11Texture2D *in_texture[GST_VIDEO_MAX_PLANES];
ID3D11ShaderResourceView *shader_resource_view[GST_VIDEO_MAX_PLANES]; ID3D11ShaderResourceView *shader_resource_view[GST_VIDEO_MAX_PLANES];
@ -1168,7 +1168,7 @@ gst_d3d11_base_convert_propose_allocation (GstBaseTransform * trans,
GstStructure *config; GstStructure *config;
guint size; guint size;
GstD3D11AllocationParams *d3d11_params; GstD3D11AllocationParams *d3d11_params;
const GstD3D11Format *d3d11_format; GstD3D11Format d3d11_format;
guint bind_flags = D3D11_BIND_SHADER_RESOURCE; guint bind_flags = D3D11_BIND_SHADER_RESOURCE;
DXGI_FORMAT dxgi_format = DXGI_FORMAT_UNKNOWN; DXGI_FORMAT dxgi_format = DXGI_FORMAT_UNKNOWN;
UINT supported = 0; UINT supported = 0;
@ -1193,17 +1193,16 @@ gst_d3d11_base_convert_propose_allocation (GstBaseTransform * trans,
return FALSE; return FALSE;
} }
d3d11_format = gst_d3d11_device_format_from_gst (filter->device, if (!gst_d3d11_device_get_format (filter->device,
GST_VIDEO_INFO_FORMAT (&info)); GST_VIDEO_INFO_FORMAT (&info), &d3d11_format)) {
if (!d3d11_format) {
GST_ERROR_OBJECT (filter, "Unknown format caps %" GST_PTR_FORMAT, caps); GST_ERROR_OBJECT (filter, "Unknown format caps %" GST_PTR_FORMAT, caps);
return FALSE; return FALSE;
} }
if (d3d11_format->dxgi_format == DXGI_FORMAT_UNKNOWN) { if (d3d11_format.dxgi_format == DXGI_FORMAT_UNKNOWN) {
dxgi_format = d3d11_format->resource_format[0]; dxgi_format = d3d11_format.resource_format[0];
} else { } else {
dxgi_format = d3d11_format->dxgi_format; dxgi_format = d3d11_format.dxgi_format;
} }
device_handle = gst_d3d11_device_get_device_handle (filter->device); device_handle = gst_d3d11_device_get_device_handle (filter->device);
@ -1292,7 +1291,7 @@ gst_d3d11_base_convert_decide_allocation (GstBaseTransform * trans,
gboolean update_pool = FALSE; gboolean update_pool = FALSE;
GstVideoInfo info; GstVideoInfo info;
guint i; guint i;
const GstD3D11Format *d3d11_format; GstD3D11Format d3d11_format;
guint bind_flags = D3D11_BIND_RENDER_TARGET; guint bind_flags = D3D11_BIND_RENDER_TARGET;
DXGI_FORMAT dxgi_format = DXGI_FORMAT_UNKNOWN; DXGI_FORMAT dxgi_format = DXGI_FORMAT_UNKNOWN;
UINT supported = 0; UINT supported = 0;
@ -1309,17 +1308,16 @@ gst_d3d11_base_convert_decide_allocation (GstBaseTransform * trans,
return FALSE; return FALSE;
} }
d3d11_format = gst_d3d11_device_format_from_gst (filter->device, if (!gst_d3d11_device_get_format (filter->device,
GST_VIDEO_INFO_FORMAT (&info)); GST_VIDEO_INFO_FORMAT (&info), &d3d11_format)) {
if (!d3d11_format) {
GST_ERROR_OBJECT (filter, "Unknown format caps %" GST_PTR_FORMAT, outcaps); GST_ERROR_OBJECT (filter, "Unknown format caps %" GST_PTR_FORMAT, outcaps);
return FALSE; return FALSE;
} }
if (d3d11_format->dxgi_format == DXGI_FORMAT_UNKNOWN) { if (d3d11_format.dxgi_format == DXGI_FORMAT_UNKNOWN) {
dxgi_format = d3d11_format->resource_format[0]; dxgi_format = d3d11_format.resource_format[0];
} else { } else {
dxgi_format = d3d11_format->dxgi_format; dxgi_format = d3d11_format.dxgi_format;
} }
device_handle = gst_d3d11_device_get_device_handle (filter->device); device_handle = gst_d3d11_device_get_device_handle (filter->device);
@ -1787,18 +1785,14 @@ gst_d3d11_base_convert_set_info (GstD3D11BaseFilter * filter,
gst_base_transform_set_passthrough (GST_BASE_TRANSFORM (filter), FALSE); gst_base_transform_set_passthrough (GST_BASE_TRANSFORM (filter), FALSE);
} }
self->in_d3d11_format = if (!gst_d3d11_device_get_format (filter->device,
gst_d3d11_device_format_from_gst (filter->device, GST_VIDEO_INFO_FORMAT (in_info), &self->in_d3d11_format)) {
GST_VIDEO_INFO_FORMAT (in_info));
if (!self->in_d3d11_format) {
unknown_info = in_info; unknown_info = in_info;
goto format_unknown; goto format_unknown;
} }
self->out_d3d11_format = if (!gst_d3d11_device_get_format (filter->device,
gst_d3d11_device_format_from_gst (filter->device, GST_VIDEO_INFO_FORMAT (out_info), &self->out_d3d11_format)) {
GST_VIDEO_INFO_FORMAT (out_info));
if (!self->out_d3d11_format) {
unknown_info = out_info; unknown_info = out_info;
goto format_unknown; goto format_unknown;
} }
@ -1812,8 +1806,8 @@ gst_d3d11_base_convert_set_info (GstD3D11BaseFilter * filter,
} }
/* If both input and output formats are native DXGI format */ /* If both input and output formats are native DXGI format */
if (self->in_d3d11_format->dxgi_format != DXGI_FORMAT_UNKNOWN && if (self->in_d3d11_format.dxgi_format != DXGI_FORMAT_UNKNOWN &&
self->out_d3d11_format->dxgi_format != DXGI_FORMAT_UNKNOWN) { self->out_d3d11_format.dxgi_format != DXGI_FORMAT_UNKNOWN) {
gboolean hardware = FALSE; gboolean hardware = FALSE;
GstD3D11VideoProcessor *processor = NULL; GstD3D11VideoProcessor *processor = NULL;
@ -1832,8 +1826,8 @@ gst_d3d11_base_convert_set_info (GstD3D11BaseFilter * filter,
out_color_space = gst_d3d11_video_info_to_dxgi_color_space (out_info); out_color_space = gst_d3d11_video_info_to_dxgi_color_space (out_info);
if (in_color_space && out_color_space) { if (in_color_space && out_color_space) {
DXGI_FORMAT in_dxgi_format = self->in_d3d11_format->dxgi_format; DXGI_FORMAT in_dxgi_format = self->in_d3d11_format.dxgi_format;
DXGI_FORMAT out_dxgi_format = self->out_d3d11_format->dxgi_format; DXGI_FORMAT out_dxgi_format = self->out_d3d11_format.dxgi_format;
DXGI_COLOR_SPACE_TYPE in_dxgi_color_space = DXGI_COLOR_SPACE_TYPE in_dxgi_color_space =
(DXGI_COLOR_SPACE_TYPE) in_color_space->dxgi_color_space_type; (DXGI_COLOR_SPACE_TYPE) in_color_space->dxgi_color_space_type;
DXGI_COLOR_SPACE_TYPE out_dxgi_color_space = DXGI_COLOR_SPACE_TYPE out_dxgi_color_space =
@ -2079,7 +2073,7 @@ gst_d3d11_base_convert_transform (GstBaseTransform * trans,
/* Ensure shader resource views */ /* Ensure shader resource views */
if (!gst_d3d11_buffer_get_shader_resource_view (inbuf, resource_view)) { if (!gst_d3d11_buffer_get_shader_resource_view (inbuf, resource_view)) {
if (!create_shader_input_resource (self, device, if (!create_shader_input_resource (self, device,
self->in_d3d11_format, &filter->in_info)) { &self->in_d3d11_format, &filter->in_info)) {
GST_ERROR_OBJECT (self, "Failed to configure fallback input texture"); GST_ERROR_OBJECT (self, "Failed to configure fallback input texture");
goto fallback_failed; goto fallback_failed;
} }
@ -2115,7 +2109,7 @@ gst_d3d11_base_convert_transform (GstBaseTransform * trans,
/* Ensure render target views */ /* Ensure render target views */
if (!gst_d3d11_buffer_get_render_target_view (outbuf, render_view)) { if (!gst_d3d11_buffer_get_render_target_view (outbuf, render_view)) {
if (!create_shader_output_resource (self, device, if (!create_shader_output_resource (self, device,
self->out_d3d11_format, &filter->out_info)) { &self->out_d3d11_format, &filter->out_info)) {
GST_ERROR_OBJECT (self, "Failed to configure fallback output texture"); GST_ERROR_OBJECT (self, "Failed to configure fallback output texture");
goto fallback_failed; goto fallback_failed;
} }

View file

@ -424,9 +424,6 @@ struct _GstD3D11Converter
GstVideoInfo out_info; GstVideoInfo out_info;
gdouble alpha; gdouble alpha;
const GstD3D11Format *in_d3d11_format;
const GstD3D11Format *out_d3d11_format;
guint num_input_view; guint num_input_view;
guint num_output_view; guint num_output_view;
@ -717,18 +714,16 @@ get_packed_yuv_components (GstD3D11Converter * self, GstVideoFormat
switch (format) { switch (format) {
case GST_VIDEO_FORMAT_YUY2: case GST_VIDEO_FORMAT_YUY2:
{ {
const GstD3D11Format *d3d11_format = GstD3D11Format d3d11_format;
gst_d3d11_device_format_from_gst (self->device,
GST_VIDEO_FORMAT_YUY2);
g_assert (d3d11_format != NULL); gst_d3d11_device_get_format (self->device, GST_VIDEO_FORMAT_YUY2,
&d3d11_format);
if (d3d11_format->resource_format[0] == DXGI_FORMAT_R8G8B8A8_UNORM) { if (d3d11_format.resource_format[0] == DXGI_FORMAT_R8G8B8A8_UNORM) {
*y = 'x'; *y = 'x';
*u = 'y'; *u = 'y';
*v = 'a'; *v = 'a';
} else if (d3d11_format->resource_format[0] == } else if (d3d11_format.resource_format[0] == DXGI_FORMAT_G8R8_G8B8_UNORM) {
DXGI_FORMAT_G8R8_G8B8_UNORM) {
*y = 'y'; *y = 'y';
*u = 'x'; *u = 'x';
*v = 'z'; *v = 'z';
@ -1804,8 +1799,8 @@ gst_d3d11_converter_new (GstD3D11Device * device,
GstVideoInfo * in_info, GstVideoInfo * out_info, GstStructure * config) GstVideoInfo * in_info, GstVideoInfo * out_info, GstStructure * config)
{ {
const GstVideoInfo *unknown_info; const GstVideoInfo *unknown_info;
const GstD3D11Format *in_d3d11_format; GstD3D11Format in_d3d11_format;
const GstD3D11Format *out_d3d11_format; GstD3D11Format out_d3d11_format;
gboolean is_supported = FALSE; gboolean is_supported = FALSE;
MatrixData matrix; MatrixData matrix;
GstD3D11Converter *converter = NULL; GstD3D11Converter *converter = NULL;
@ -1820,18 +1815,14 @@ gst_d3d11_converter_new (GstD3D11Device * device,
gst_video_format_to_string (GST_VIDEO_INFO_FORMAT (in_info)), gst_video_format_to_string (GST_VIDEO_INFO_FORMAT (in_info)),
gst_video_format_to_string (GST_VIDEO_INFO_FORMAT (out_info))); gst_video_format_to_string (GST_VIDEO_INFO_FORMAT (out_info)));
in_d3d11_format = if (!gst_d3d11_device_get_format (device, GST_VIDEO_INFO_FORMAT (in_info),
gst_d3d11_device_format_from_gst (device, &in_d3d11_format)) {
GST_VIDEO_INFO_FORMAT (in_info));
if (!in_d3d11_format) {
unknown_info = in_info; unknown_info = in_info;
goto format_unknown; goto format_unknown;
} }
out_d3d11_format = if (!gst_d3d11_device_get_format (device, GST_VIDEO_INFO_FORMAT (out_info),
gst_d3d11_device_format_from_gst (device, &out_d3d11_format)) {
GST_VIDEO_INFO_FORMAT (out_info));
if (!out_d3d11_format) {
unknown_info = out_info; unknown_info = out_info;
goto format_unknown; goto format_unknown;
} }

View file

@ -712,7 +712,7 @@ gst_d3d11_decoder_configure (GstD3D11Decoder * decoder,
GstVideoCodecState * input_state, GstVideoInfo * info, gint coded_width, GstVideoCodecState * input_state, GstVideoInfo * info, gint coded_width,
gint coded_height, guint dpb_size) gint coded_height, guint dpb_size)
{ {
const GstD3D11Format *d3d11_format; GstD3D11Format d3d11_format;
g_return_val_if_fail (GST_IS_D3D11_DECODER (decoder), FALSE); g_return_val_if_fail (GST_IS_D3D11_DECODER (decoder), FALSE);
g_return_val_if_fail (info != NULL, FALSE); g_return_val_if_fail (info != NULL, FALSE);
@ -723,9 +723,9 @@ gst_d3d11_decoder_configure (GstD3D11Decoder * decoder,
gst_d3d11_decoder_reset (decoder); gst_d3d11_decoder_reset (decoder);
d3d11_format = gst_d3d11_device_format_from_gst (decoder->device, if (!gst_d3d11_device_get_format (decoder->device,
GST_VIDEO_INFO_FORMAT (info)); GST_VIDEO_INFO_FORMAT (info), &d3d11_format) ||
if (!d3d11_format || d3d11_format->dxgi_format == DXGI_FORMAT_UNKNOWN) { d3d11_format.dxgi_format == DXGI_FORMAT_UNKNOWN) {
GST_ERROR_OBJECT (decoder, "Could not determine dxgi format from %s", GST_ERROR_OBJECT (decoder, "Could not determine dxgi format from %s",
gst_video_format_to_string (GST_VIDEO_INFO_FORMAT (info))); gst_video_format_to_string (GST_VIDEO_INFO_FORMAT (info)));
return FALSE; return FALSE;
@ -736,7 +736,7 @@ gst_d3d11_decoder_configure (GstD3D11Decoder * decoder,
decoder->coded_width = coded_width; decoder->coded_width = coded_width;
decoder->coded_height = coded_height; decoder->coded_height = coded_height;
decoder->dpb_size = dpb_size; decoder->dpb_size = dpb_size;
decoder->decoder_format = d3d11_format->dxgi_format; decoder->decoder_format = d3d11_format.dxgi_format;
decoder->configured = TRUE; decoder->configured = TRUE;

View file

@ -599,7 +599,7 @@ gst_d3d11_allocate_staging_buffer_for (GstBuffer * buffer,
gsize offset[GST_VIDEO_MAX_PLANES] = { 0, }; gsize offset[GST_VIDEO_MAX_PLANES] = { 0, };
guint i; guint i;
gsize size = 0; gsize size = 0;
const GstD3D11Format *format; GstD3D11Format format;
D3D11_TEXTURE2D_DESC desc; D3D11_TEXTURE2D_DESC desc;
for (i = 0; i < gst_buffer_n_memory (buffer); i++) { for (i = 0; i < gst_buffer_n_memory (buffer); i++) {
@ -614,9 +614,8 @@ gst_d3d11_allocate_staging_buffer_for (GstBuffer * buffer,
dmem = (GstD3D11Memory *) gst_buffer_peek_memory (buffer, 0); dmem = (GstD3D11Memory *) gst_buffer_peek_memory (buffer, 0);
device = dmem->device; device = dmem->device;
format = gst_d3d11_device_format_from_gst (device, if (!gst_d3d11_device_get_format (device, GST_VIDEO_INFO_FORMAT (info),
GST_VIDEO_INFO_FORMAT (info)); &format)) {
if (!format) {
GST_ERROR ("Unknown d3d11 format"); GST_ERROR ("Unknown d3d11 format");
return NULL; return NULL;
} }
@ -660,7 +659,7 @@ gst_d3d11_allocate_staging_buffer_for (GstBuffer * buffer,
} }
/* single texture semi-planar formats */ /* single texture semi-planar formats */
if (format->dxgi_format != DXGI_FORMAT_UNKNOWN && if (format.dxgi_format != DXGI_FORMAT_UNKNOWN &&
GST_VIDEO_INFO_N_PLANES (info) == 2) { GST_VIDEO_INFO_N_PLANES (info) == 2) {
stride[1] = stride[0]; stride[1] = stride[0];
offset[1] = stride[0] * desc.Height; offset[1] = stride[0] * desc.Height;

View file

@ -299,7 +299,7 @@ gst_d3d11_upload_decide_allocation (GstBaseTransform * trans, GstQuery * query)
GstStructure *config; GstStructure *config;
gboolean update_pool = FALSE; gboolean update_pool = FALSE;
GstVideoInfo vinfo; GstVideoInfo vinfo;
const GstD3D11Format *d3d11_format; GstD3D11Format d3d11_format;
GstD3D11AllocationParams *d3d11_params; GstD3D11AllocationParams *d3d11_params;
guint bind_flags = 0; guint bind_flags = 0;
guint i; guint i;
@ -315,17 +315,16 @@ gst_d3d11_upload_decide_allocation (GstBaseTransform * trans, GstQuery * query)
gst_video_info_from_caps (&vinfo, outcaps); gst_video_info_from_caps (&vinfo, outcaps);
d3d11_format = gst_d3d11_device_format_from_gst (filter->device, if (!gst_d3d11_device_get_format (filter->device,
GST_VIDEO_INFO_FORMAT (&vinfo)); GST_VIDEO_INFO_FORMAT (&vinfo), &d3d11_format)) {
if (!d3d11_format) {
GST_ERROR_OBJECT (filter, "Unknown format caps %" GST_PTR_FORMAT, outcaps); GST_ERROR_OBJECT (filter, "Unknown format caps %" GST_PTR_FORMAT, outcaps);
return FALSE; return FALSE;
} }
if (d3d11_format->dxgi_format == DXGI_FORMAT_UNKNOWN) { if (d3d11_format.dxgi_format == DXGI_FORMAT_UNKNOWN) {
dxgi_format = d3d11_format->resource_format[0]; dxgi_format = d3d11_format.resource_format[0];
} else { } else {
dxgi_format = d3d11_format->dxgi_format; dxgi_format = d3d11_format.dxgi_format;
} }
device_handle = gst_d3d11_device_get_device_handle (filter->device); device_handle = gst_d3d11_device_get_device_handle (filter->device);

View file

@ -664,14 +664,16 @@ gst_d3d11_window_prepare_default (GstD3D11Window * window, guint display_width,
if (chosen_colorspace) { if (chosen_colorspace) {
const GstDxgiColorSpace *in_color_space = const GstDxgiColorSpace *in_color_space =
gst_d3d11_video_info_to_dxgi_color_space (&window->info); gst_d3d11_video_info_to_dxgi_color_space (&window->info);
const GstD3D11Format *in_format = GstD3D11Format in_format;
gst_d3d11_device_format_from_gst (window->device,
GST_VIDEO_INFO_FORMAT (&window->info));
gboolean hardware = FALSE; gboolean hardware = FALSE;
GstD3D11VideoProcessor *processor = NULL; GstD3D11VideoProcessor *processor = NULL;
DXGI_FORMAT in_dxgi_format;
if (in_color_space && in_format && gst_d3d11_device_get_format (window->device,
in_format->dxgi_format != DXGI_FORMAT_UNKNOWN) { GST_VIDEO_INFO_FORMAT (&window->info), &in_format);
in_dxgi_format = in_format.dxgi_format;
if (in_color_space && in_format.dxgi_format != DXGI_FORMAT_UNKNOWN) {
g_object_get (window->device, "hardware", &hardware, NULL); g_object_get (window->device, "hardware", &hardware, NULL);
} }
@ -683,7 +685,6 @@ gst_d3d11_window_prepare_default (GstD3D11Window * window, guint display_width,
} }
if (processor) { if (processor) {
DXGI_FORMAT in_dxgi_format = in_format->dxgi_format;
DXGI_FORMAT out_dxgi_format = chosen_format->dxgi_format; DXGI_FORMAT out_dxgi_format = chosen_format->dxgi_format;
DXGI_COLOR_SPACE_TYPE in_dxgi_color_space = DXGI_COLOR_SPACE_TYPE in_dxgi_color_space =
(DXGI_COLOR_SPACE_TYPE) in_color_space->dxgi_color_space_type; (DXGI_COLOR_SPACE_TYPE) in_color_space->dxgi_color_space_type;

View file

@ -117,9 +117,7 @@ gst_d3d11_window_dummy_prepare (GstD3D11Window * window,
{ {
const GstDxgiColorSpace *in_color_space = const GstDxgiColorSpace *in_color_space =
gst_d3d11_video_info_to_dxgi_color_space (&window->info); gst_d3d11_video_info_to_dxgi_color_space (&window->info);
const GstD3D11Format *in_format = GstD3D11Format in_format;
gst_d3d11_device_format_from_gst (window->device,
GST_VIDEO_INFO_FORMAT (&window->info));
gboolean hardware = FALSE; gboolean hardware = FALSE;
GstD3D11VideoProcessor *processor = NULL; GstD3D11VideoProcessor *processor = NULL;
guint i; guint i;
@ -128,9 +126,13 @@ gst_d3d11_window_dummy_prepare (GstD3D11Window * window,
DXGI_FORMAT_B8G8R8A8_UNORM, DXGI_FORMAT_B8G8R8A8_UNORM,
DXGI_FORMAT_R10G10B10A2_UNORM DXGI_FORMAT_R10G10B10A2_UNORM
}; };
DXGI_FORMAT in_dxgi_format;
if (in_color_space && in_format && gst_d3d11_device_get_format (window->device,
in_format->dxgi_format != DXGI_FORMAT_UNKNOWN) { GST_VIDEO_INFO_FORMAT (&window->info), &in_format);
in_dxgi_format = in_format.dxgi_format;
if (in_color_space && in_format.dxgi_format != DXGI_FORMAT_UNKNOWN) {
g_object_get (window->device, "hardware", &hardware, NULL); g_object_get (window->device, "hardware", &hardware, NULL);
} }
@ -143,7 +145,6 @@ gst_d3d11_window_dummy_prepare (GstD3D11Window * window,
/* Check if video processor can support all possible output dxgi formats */ /* Check if video processor can support all possible output dxgi formats */
for (i = 0; i < G_N_ELEMENTS (formats_to_check) && processor; i++) { for (i = 0; i < G_N_ELEMENTS (formats_to_check) && processor; i++) {
DXGI_FORMAT in_dxgi_format = in_format->dxgi_format;
DXGI_FORMAT out_dxgi_format = formats_to_check[i]; DXGI_FORMAT out_dxgi_format = formats_to_check[i];
DXGI_COLOR_SPACE_TYPE in_dxgi_color_space = DXGI_COLOR_SPACE_TYPE in_dxgi_color_space =
(DXGI_COLOR_SPACE_TYPE) in_color_space->dxgi_color_space_type; (DXGI_COLOR_SPACE_TYPE) in_color_space->dxgi_color_space_type;

View file

@ -122,7 +122,7 @@ get_d3d11_devices (void)
for (i = 0; i < 12; i++) { for (i = 0; i < 12; i++) {
GstD3D11Device *device; GstD3D11Device *device;
gboolean is_hardware = FALSE; gboolean is_hardware = FALSE;
const GstD3D11Format *d3d11_format; GstD3D11Format d3d11_format;
ID3D11Device *device_handle; ID3D11Device *device_handle;
D3D11_FEATURE_DATA_D3D11_OPTIONS4 options = { 0, }; D3D11_FEATURE_DATA_D3D11_OPTIONS4 options = { 0, };
UINT supported = 0; UINT supported = 0;
@ -141,9 +141,9 @@ get_d3d11_devices (void)
} }
/* device can support NV12 format? */ /* device can support NV12 format? */
d3d11_format = if (!gst_d3d11_device_get_format (device,
gst_d3d11_device_format_from_gst (device, GST_VIDEO_FORMAT_NV12); GST_VIDEO_FORMAT_NV12, &d3d11_format) ||
if (!d3d11_format || d3d11_format->dxgi_format != DXGI_FORMAT_NV12) { d3d11_format.dxgi_format != DXGI_FORMAT_NV12) {
GST_DEBUG_OBJECT (device, GST_DEBUG_OBJECT (device,
"Given d3d11 device cannot support NV12 format"); "Given d3d11 device cannot support NV12 format");
gst_object_unref (device); gst_object_unref (device);