mirror of
https://gitlab.freedesktop.org/gstreamer/gstreamer.git
synced 2024-06-24 08:50:40 +00:00
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:
parent
04f3a2bd22
commit
dd906f9610
|
@ -299,8 +299,7 @@ gst_d3d11_buffer_pool_set_config (GstBufferPool * pool, GstStructure * config)
|
|||
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 */
|
||||
if (format->dxgi_format != DXGI_FORMAT_UNKNOWN &&
|
||||
GST_VIDEO_INFO_N_PLANES (&info) == 2) {
|
||||
|
|
|
@ -1419,30 +1419,40 @@ gst_d3d11_device_unlock (GstD3D11Device * device)
|
|||
}
|
||||
|
||||
/**
|
||||
* gst_d3d11_device_format_from_gst:
|
||||
* gst_d3d11_device_get_format:
|
||||
* @device: a #GstD3D11Device
|
||||
* @format: a #GstVideoFormat
|
||||
* @device_format: (out caller-allocates) (nullable): a #GstD3D11Format
|
||||
*
|
||||
* Returns: (transfer none) (nullable): a pointer to #GstD3D11Format
|
||||
* or %NULL if @format is not supported by @device
|
||||
* Converts @format to #GstD3D11Format if the @format is supported
|
||||
* by device
|
||||
*
|
||||
* Since: 1.20
|
||||
* Returns: %TRUE if @format is supported by @device
|
||||
*
|
||||
* Since: 1.22
|
||||
*/
|
||||
const GstD3D11Format *
|
||||
gst_d3d11_device_format_from_gst (GstD3D11Device * device,
|
||||
GstVideoFormat format)
|
||||
gboolean
|
||||
gst_d3d11_device_get_format (GstD3D11Device * device, GstVideoFormat format,
|
||||
GstD3D11Format * device_format)
|
||||
{
|
||||
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;
|
||||
|
||||
for (i = 0; i < G_N_ELEMENTS (priv->format_table); i++) {
|
||||
if (priv->format_table[i].format == format)
|
||||
return &priv->format_table[i];
|
||||
for (guint i = 0; i < G_N_ELEMENTS (priv->format_table); i++) {
|
||||
if (priv->format_table[i].format != format)
|
||||
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;
|
||||
}
|
||||
|
|
|
@ -91,8 +91,9 @@ GST_D3D11_API
|
|||
void gst_d3d11_device_unlock (GstD3D11Device * device);
|
||||
|
||||
GST_D3D11_API
|
||||
const GstD3D11Format * gst_d3d11_device_format_from_gst (GstD3D11Device * device,
|
||||
GstVideoFormat format);
|
||||
gboolean gst_d3d11_device_get_format (GstD3D11Device * device,
|
||||
GstVideoFormat format,
|
||||
GstD3D11Format * device_format);
|
||||
|
||||
G_END_DECLS
|
||||
|
||||
|
|
|
@ -192,3 +192,19 @@ gst_d3d11_dxgi_format_to_gst (DXGI_FORMAT format)
|
|||
|
||||
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));
|
||||
}
|
||||
|
|
|
@ -73,6 +73,9 @@ gboolean gst_d3d11_dxgi_format_get_size (DXGI_FORMAT format,
|
|||
GST_D3D11_API
|
||||
GstVideoFormat gst_d3d11_dxgi_format_to_gst (DXGI_FORMAT format);
|
||||
|
||||
GST_D3D11_API
|
||||
void gst_d3d11_format_init (GstD3D11Format * format);
|
||||
|
||||
G_END_DECLS
|
||||
|
||||
#endif /* __GST_D3D11_FORMAT_H__ */
|
||||
|
|
|
@ -61,14 +61,13 @@ gst_d3d11_allocation_params_new (GstD3D11Device * device, GstVideoInfo * info,
|
|||
GstD3D11AllocationFlags flags, guint bind_flags)
|
||||
{
|
||||
GstD3D11AllocationParams *ret;
|
||||
const GstD3D11Format *d3d11_format;
|
||||
GstD3D11Format d3d11_format;
|
||||
guint i;
|
||||
|
||||
g_return_val_if_fail (info != NULL, NULL);
|
||||
|
||||
d3d11_format = gst_d3d11_device_format_from_gst (device,
|
||||
GST_VIDEO_INFO_FORMAT (info));
|
||||
if (!d3d11_format) {
|
||||
if (!gst_d3d11_device_get_format (device, GST_VIDEO_INFO_FORMAT (info),
|
||||
&d3d11_format)) {
|
||||
GST_WARNING ("Couldn't get d3d11 format");
|
||||
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 (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++) {
|
||||
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].Height = GST_VIDEO_INFO_COMP_HEIGHT (info, i);
|
||||
ret->desc[i].MipLevels = 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.Quality = 0;
|
||||
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].MipLevels = 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.Quality = 0;
|
||||
ret->desc[0].Usage = D3D11_USAGE_DEFAULT;
|
||||
|
|
|
@ -128,7 +128,7 @@ struct _GstD3D11AllocationParams
|
|||
|
||||
GstVideoInfo info;
|
||||
GstVideoInfo aligned_info;
|
||||
const GstD3D11Format *d3d11_format;
|
||||
GstD3D11Format d3d11_format;
|
||||
|
||||
GstD3D11AllocationFlags flags;
|
||||
|
||||
|
|
|
@ -126,7 +126,7 @@ gst_d3d11_staging_buffer_pool_set_config (GstBufferPool * pool,
|
|||
GstCaps *caps = nullptr;
|
||||
guint min_buffers, max_buffers;
|
||||
D3D11_TEXTURE2D_DESC *desc;
|
||||
const GstD3D11Format *format;
|
||||
GstD3D11Format format;
|
||||
gsize offset = 0;
|
||||
|
||||
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))
|
||||
goto wrong_caps;
|
||||
|
||||
format = gst_d3d11_device_format_from_gst (self->device,
|
||||
GST_VIDEO_INFO_FORMAT (&info));
|
||||
if (!format)
|
||||
if (!gst_d3d11_device_get_format (self->device, GST_VIDEO_INFO_FORMAT (&info),
|
||||
&format)) {
|
||||
goto wrong_caps;
|
||||
}
|
||||
|
||||
GST_LOG_OBJECT (pool, "%dx%d, caps %" GST_PTR_FORMAT, info.width, info.height,
|
||||
caps);
|
||||
|
@ -154,7 +154,7 @@ gst_d3d11_staging_buffer_pool_set_config (GstBufferPool * pool,
|
|||
memset (priv->offset, 0, sizeof (priv->offset));
|
||||
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++) {
|
||||
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->MipLevels = 1;
|
||||
desc->ArraySize = 1;
|
||||
desc->Format = format->resource_format[i];
|
||||
desc->Format = format.resource_format[i];
|
||||
desc->SampleDesc.Count = 1;
|
||||
desc->Usage = D3D11_USAGE_STAGING;
|
||||
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);
|
||||
|
||||
/* 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_P010:
|
||||
case DXGI_FORMAT_P016:
|
||||
|
@ -191,7 +191,7 @@ gst_d3d11_staging_buffer_pool_set_config (GstBufferPool * pool,
|
|||
desc->Height = height;
|
||||
desc->MipLevels = 1;
|
||||
desc->ArraySize = 1;
|
||||
desc->Format = format->dxgi_format;
|
||||
desc->Format = format.dxgi_format;
|
||||
desc->SampleDesc.Count = 1;
|
||||
desc->Usage = D3D11_USAGE_STAGING;
|
||||
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 */
|
||||
if (format->dxgi_format != DXGI_FORMAT_UNKNOWN &&
|
||||
if (format.dxgi_format != DXGI_FORMAT_UNKNOWN &&
|
||||
GST_VIDEO_INFO_N_PLANES (&info) == 2) {
|
||||
priv->stride[1] = priv->stride[0];
|
||||
priv->offset[1] = priv->stride[0] * priv->desc[0].Height;
|
||||
|
|
|
@ -56,8 +56,8 @@ struct _GstD3D11BaseConvert
|
|||
{
|
||||
GstD3D11BaseFilter parent;
|
||||
|
||||
const GstD3D11Format *in_d3d11_format;
|
||||
const GstD3D11Format *out_d3d11_format;
|
||||
GstD3D11Format in_d3d11_format;
|
||||
GstD3D11Format out_d3d11_format;
|
||||
|
||||
ID3D11Texture2D *in_texture[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;
|
||||
guint size;
|
||||
GstD3D11AllocationParams *d3d11_params;
|
||||
const GstD3D11Format *d3d11_format;
|
||||
GstD3D11Format d3d11_format;
|
||||
guint bind_flags = D3D11_BIND_SHADER_RESOURCE;
|
||||
DXGI_FORMAT dxgi_format = DXGI_FORMAT_UNKNOWN;
|
||||
UINT supported = 0;
|
||||
|
@ -1193,17 +1193,16 @@ gst_d3d11_base_convert_propose_allocation (GstBaseTransform * trans,
|
|||
return FALSE;
|
||||
}
|
||||
|
||||
d3d11_format = gst_d3d11_device_format_from_gst (filter->device,
|
||||
GST_VIDEO_INFO_FORMAT (&info));
|
||||
if (!d3d11_format) {
|
||||
if (!gst_d3d11_device_get_format (filter->device,
|
||||
GST_VIDEO_INFO_FORMAT (&info), &d3d11_format)) {
|
||||
GST_ERROR_OBJECT (filter, "Unknown format caps %" GST_PTR_FORMAT, caps);
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
if (d3d11_format->dxgi_format == DXGI_FORMAT_UNKNOWN) {
|
||||
dxgi_format = d3d11_format->resource_format[0];
|
||||
if (d3d11_format.dxgi_format == DXGI_FORMAT_UNKNOWN) {
|
||||
dxgi_format = d3d11_format.resource_format[0];
|
||||
} else {
|
||||
dxgi_format = d3d11_format->dxgi_format;
|
||||
dxgi_format = d3d11_format.dxgi_format;
|
||||
}
|
||||
|
||||
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;
|
||||
GstVideoInfo info;
|
||||
guint i;
|
||||
const GstD3D11Format *d3d11_format;
|
||||
GstD3D11Format d3d11_format;
|
||||
guint bind_flags = D3D11_BIND_RENDER_TARGET;
|
||||
DXGI_FORMAT dxgi_format = DXGI_FORMAT_UNKNOWN;
|
||||
UINT supported = 0;
|
||||
|
@ -1309,17 +1308,16 @@ gst_d3d11_base_convert_decide_allocation (GstBaseTransform * trans,
|
|||
return FALSE;
|
||||
}
|
||||
|
||||
d3d11_format = gst_d3d11_device_format_from_gst (filter->device,
|
||||
GST_VIDEO_INFO_FORMAT (&info));
|
||||
if (!d3d11_format) {
|
||||
if (!gst_d3d11_device_get_format (filter->device,
|
||||
GST_VIDEO_INFO_FORMAT (&info), &d3d11_format)) {
|
||||
GST_ERROR_OBJECT (filter, "Unknown format caps %" GST_PTR_FORMAT, outcaps);
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
if (d3d11_format->dxgi_format == DXGI_FORMAT_UNKNOWN) {
|
||||
dxgi_format = d3d11_format->resource_format[0];
|
||||
if (d3d11_format.dxgi_format == DXGI_FORMAT_UNKNOWN) {
|
||||
dxgi_format = d3d11_format.resource_format[0];
|
||||
} else {
|
||||
dxgi_format = d3d11_format->dxgi_format;
|
||||
dxgi_format = d3d11_format.dxgi_format;
|
||||
}
|
||||
|
||||
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);
|
||||
}
|
||||
|
||||
self->in_d3d11_format =
|
||||
gst_d3d11_device_format_from_gst (filter->device,
|
||||
GST_VIDEO_INFO_FORMAT (in_info));
|
||||
if (!self->in_d3d11_format) {
|
||||
if (!gst_d3d11_device_get_format (filter->device,
|
||||
GST_VIDEO_INFO_FORMAT (in_info), &self->in_d3d11_format)) {
|
||||
unknown_info = in_info;
|
||||
goto format_unknown;
|
||||
}
|
||||
|
||||
self->out_d3d11_format =
|
||||
gst_d3d11_device_format_from_gst (filter->device,
|
||||
GST_VIDEO_INFO_FORMAT (out_info));
|
||||
if (!self->out_d3d11_format) {
|
||||
if (!gst_d3d11_device_get_format (filter->device,
|
||||
GST_VIDEO_INFO_FORMAT (out_info), &self->out_d3d11_format)) {
|
||||
unknown_info = out_info;
|
||||
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 (self->in_d3d11_format->dxgi_format != DXGI_FORMAT_UNKNOWN &&
|
||||
self->out_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) {
|
||||
gboolean hardware = FALSE;
|
||||
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);
|
||||
|
||||
if (in_color_space && out_color_space) {
|
||||
DXGI_FORMAT in_dxgi_format = self->in_d3d11_format->dxgi_format;
|
||||
DXGI_FORMAT out_dxgi_format = self->out_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_COLOR_SPACE_TYPE in_dxgi_color_space =
|
||||
(DXGI_COLOR_SPACE_TYPE) in_color_space->dxgi_color_space_type;
|
||||
DXGI_COLOR_SPACE_TYPE out_dxgi_color_space =
|
||||
|
@ -2079,7 +2073,7 @@ gst_d3d11_base_convert_transform (GstBaseTransform * trans,
|
|||
/* Ensure shader resource views */
|
||||
if (!gst_d3d11_buffer_get_shader_resource_view (inbuf, resource_view)) {
|
||||
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");
|
||||
goto fallback_failed;
|
||||
}
|
||||
|
@ -2115,7 +2109,7 @@ gst_d3d11_base_convert_transform (GstBaseTransform * trans,
|
|||
/* Ensure render target views */
|
||||
if (!gst_d3d11_buffer_get_render_target_view (outbuf, render_view)) {
|
||||
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");
|
||||
goto fallback_failed;
|
||||
}
|
||||
|
|
|
@ -424,9 +424,6 @@ struct _GstD3D11Converter
|
|||
GstVideoInfo out_info;
|
||||
gdouble alpha;
|
||||
|
||||
const GstD3D11Format *in_d3d11_format;
|
||||
const GstD3D11Format *out_d3d11_format;
|
||||
|
||||
guint num_input_view;
|
||||
guint num_output_view;
|
||||
|
||||
|
@ -717,18 +714,16 @@ get_packed_yuv_components (GstD3D11Converter * self, GstVideoFormat
|
|||
switch (format) {
|
||||
case GST_VIDEO_FORMAT_YUY2:
|
||||
{
|
||||
const GstD3D11Format *d3d11_format =
|
||||
gst_d3d11_device_format_from_gst (self->device,
|
||||
GST_VIDEO_FORMAT_YUY2);
|
||||
GstD3D11Format d3d11_format;
|
||||
|
||||
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';
|
||||
*u = 'y';
|
||||
*v = 'a';
|
||||
} else if (d3d11_format->resource_format[0] ==
|
||||
DXGI_FORMAT_G8R8_G8B8_UNORM) {
|
||||
} else if (d3d11_format.resource_format[0] == DXGI_FORMAT_G8R8_G8B8_UNORM) {
|
||||
*y = 'y';
|
||||
*u = 'x';
|
||||
*v = 'z';
|
||||
|
@ -1804,8 +1799,8 @@ gst_d3d11_converter_new (GstD3D11Device * device,
|
|||
GstVideoInfo * in_info, GstVideoInfo * out_info, GstStructure * config)
|
||||
{
|
||||
const GstVideoInfo *unknown_info;
|
||||
const GstD3D11Format *in_d3d11_format;
|
||||
const GstD3D11Format *out_d3d11_format;
|
||||
GstD3D11Format in_d3d11_format;
|
||||
GstD3D11Format out_d3d11_format;
|
||||
gboolean is_supported = FALSE;
|
||||
MatrixData matrix;
|
||||
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 (out_info)));
|
||||
|
||||
in_d3d11_format =
|
||||
gst_d3d11_device_format_from_gst (device,
|
||||
GST_VIDEO_INFO_FORMAT (in_info));
|
||||
if (!in_d3d11_format) {
|
||||
if (!gst_d3d11_device_get_format (device, GST_VIDEO_INFO_FORMAT (in_info),
|
||||
&in_d3d11_format)) {
|
||||
unknown_info = in_info;
|
||||
goto format_unknown;
|
||||
}
|
||||
|
||||
out_d3d11_format =
|
||||
gst_d3d11_device_format_from_gst (device,
|
||||
GST_VIDEO_INFO_FORMAT (out_info));
|
||||
if (!out_d3d11_format) {
|
||||
if (!gst_d3d11_device_get_format (device, GST_VIDEO_INFO_FORMAT (out_info),
|
||||
&out_d3d11_format)) {
|
||||
unknown_info = out_info;
|
||||
goto format_unknown;
|
||||
}
|
||||
|
|
|
@ -712,7 +712,7 @@ gst_d3d11_decoder_configure (GstD3D11Decoder * decoder,
|
|||
GstVideoCodecState * input_state, GstVideoInfo * info, gint coded_width,
|
||||
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 (info != NULL, FALSE);
|
||||
|
@ -723,9 +723,9 @@ gst_d3d11_decoder_configure (GstD3D11Decoder * decoder,
|
|||
|
||||
gst_d3d11_decoder_reset (decoder);
|
||||
|
||||
d3d11_format = gst_d3d11_device_format_from_gst (decoder->device,
|
||||
GST_VIDEO_INFO_FORMAT (info));
|
||||
if (!d3d11_format || d3d11_format->dxgi_format == DXGI_FORMAT_UNKNOWN) {
|
||||
if (!gst_d3d11_device_get_format (decoder->device,
|
||||
GST_VIDEO_INFO_FORMAT (info), &d3d11_format) ||
|
||||
d3d11_format.dxgi_format == DXGI_FORMAT_UNKNOWN) {
|
||||
GST_ERROR_OBJECT (decoder, "Could not determine dxgi format from %s",
|
||||
gst_video_format_to_string (GST_VIDEO_INFO_FORMAT (info)));
|
||||
return FALSE;
|
||||
|
@ -736,7 +736,7 @@ gst_d3d11_decoder_configure (GstD3D11Decoder * decoder,
|
|||
decoder->coded_width = coded_width;
|
||||
decoder->coded_height = coded_height;
|
||||
decoder->dpb_size = dpb_size;
|
||||
decoder->decoder_format = d3d11_format->dxgi_format;
|
||||
decoder->decoder_format = d3d11_format.dxgi_format;
|
||||
|
||||
decoder->configured = TRUE;
|
||||
|
||||
|
|
|
@ -599,7 +599,7 @@ gst_d3d11_allocate_staging_buffer_for (GstBuffer * buffer,
|
|||
gsize offset[GST_VIDEO_MAX_PLANES] = { 0, };
|
||||
guint i;
|
||||
gsize size = 0;
|
||||
const GstD3D11Format *format;
|
||||
GstD3D11Format format;
|
||||
D3D11_TEXTURE2D_DESC desc;
|
||||
|
||||
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);
|
||||
device = dmem->device;
|
||||
format = gst_d3d11_device_format_from_gst (device,
|
||||
GST_VIDEO_INFO_FORMAT (info));
|
||||
if (!format) {
|
||||
if (!gst_d3d11_device_get_format (device, GST_VIDEO_INFO_FORMAT (info),
|
||||
&format)) {
|
||||
GST_ERROR ("Unknown d3d11 format");
|
||||
return NULL;
|
||||
}
|
||||
|
@ -660,7 +659,7 @@ gst_d3d11_allocate_staging_buffer_for (GstBuffer * buffer,
|
|||
}
|
||||
|
||||
/* 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) {
|
||||
stride[1] = stride[0];
|
||||
offset[1] = stride[0] * desc.Height;
|
||||
|
|
|
@ -299,7 +299,7 @@ gst_d3d11_upload_decide_allocation (GstBaseTransform * trans, GstQuery * query)
|
|||
GstStructure *config;
|
||||
gboolean update_pool = FALSE;
|
||||
GstVideoInfo vinfo;
|
||||
const GstD3D11Format *d3d11_format;
|
||||
GstD3D11Format d3d11_format;
|
||||
GstD3D11AllocationParams *d3d11_params;
|
||||
guint bind_flags = 0;
|
||||
guint i;
|
||||
|
@ -315,17 +315,16 @@ gst_d3d11_upload_decide_allocation (GstBaseTransform * trans, GstQuery * query)
|
|||
|
||||
gst_video_info_from_caps (&vinfo, outcaps);
|
||||
|
||||
d3d11_format = gst_d3d11_device_format_from_gst (filter->device,
|
||||
GST_VIDEO_INFO_FORMAT (&vinfo));
|
||||
if (!d3d11_format) {
|
||||
if (!gst_d3d11_device_get_format (filter->device,
|
||||
GST_VIDEO_INFO_FORMAT (&vinfo), &d3d11_format)) {
|
||||
GST_ERROR_OBJECT (filter, "Unknown format caps %" GST_PTR_FORMAT, outcaps);
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
if (d3d11_format->dxgi_format == DXGI_FORMAT_UNKNOWN) {
|
||||
dxgi_format = d3d11_format->resource_format[0];
|
||||
if (d3d11_format.dxgi_format == DXGI_FORMAT_UNKNOWN) {
|
||||
dxgi_format = d3d11_format.resource_format[0];
|
||||
} else {
|
||||
dxgi_format = d3d11_format->dxgi_format;
|
||||
dxgi_format = d3d11_format.dxgi_format;
|
||||
}
|
||||
|
||||
device_handle = gst_d3d11_device_get_device_handle (filter->device);
|
||||
|
|
|
@ -664,14 +664,16 @@ gst_d3d11_window_prepare_default (GstD3D11Window * window, guint display_width,
|
|||
if (chosen_colorspace) {
|
||||
const GstDxgiColorSpace *in_color_space =
|
||||
gst_d3d11_video_info_to_dxgi_color_space (&window->info);
|
||||
const GstD3D11Format *in_format =
|
||||
gst_d3d11_device_format_from_gst (window->device,
|
||||
GST_VIDEO_INFO_FORMAT (&window->info));
|
||||
GstD3D11Format in_format;
|
||||
gboolean hardware = FALSE;
|
||||
GstD3D11VideoProcessor *processor = NULL;
|
||||
DXGI_FORMAT in_dxgi_format;
|
||||
|
||||
if (in_color_space && in_format &&
|
||||
in_format->dxgi_format != DXGI_FORMAT_UNKNOWN) {
|
||||
gst_d3d11_device_get_format (window->device,
|
||||
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);
|
||||
}
|
||||
|
||||
|
@ -683,7 +685,6 @@ gst_d3d11_window_prepare_default (GstD3D11Window * window, guint display_width,
|
|||
}
|
||||
|
||||
if (processor) {
|
||||
DXGI_FORMAT in_dxgi_format = in_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_color_space->dxgi_color_space_type;
|
||||
|
|
|
@ -117,9 +117,7 @@ gst_d3d11_window_dummy_prepare (GstD3D11Window * window,
|
|||
{
|
||||
const GstDxgiColorSpace *in_color_space =
|
||||
gst_d3d11_video_info_to_dxgi_color_space (&window->info);
|
||||
const GstD3D11Format *in_format =
|
||||
gst_d3d11_device_format_from_gst (window->device,
|
||||
GST_VIDEO_INFO_FORMAT (&window->info));
|
||||
GstD3D11Format in_format;
|
||||
gboolean hardware = FALSE;
|
||||
GstD3D11VideoProcessor *processor = NULL;
|
||||
guint i;
|
||||
|
@ -128,9 +126,13 @@ gst_d3d11_window_dummy_prepare (GstD3D11Window * window,
|
|||
DXGI_FORMAT_B8G8R8A8_UNORM,
|
||||
DXGI_FORMAT_R10G10B10A2_UNORM
|
||||
};
|
||||
DXGI_FORMAT in_dxgi_format;
|
||||
|
||||
if (in_color_space && in_format &&
|
||||
in_format->dxgi_format != DXGI_FORMAT_UNKNOWN) {
|
||||
gst_d3d11_device_get_format (window->device,
|
||||
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);
|
||||
}
|
||||
|
||||
|
@ -143,7 +145,6 @@ gst_d3d11_window_dummy_prepare (GstD3D11Window * window,
|
|||
|
||||
/* Check if video processor can support all possible output dxgi formats */
|
||||
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_COLOR_SPACE_TYPE in_dxgi_color_space =
|
||||
(DXGI_COLOR_SPACE_TYPE) in_color_space->dxgi_color_space_type;
|
||||
|
|
|
@ -122,7 +122,7 @@ get_d3d11_devices (void)
|
|||
for (i = 0; i < 12; i++) {
|
||||
GstD3D11Device *device;
|
||||
gboolean is_hardware = FALSE;
|
||||
const GstD3D11Format *d3d11_format;
|
||||
GstD3D11Format d3d11_format;
|
||||
ID3D11Device *device_handle;
|
||||
D3D11_FEATURE_DATA_D3D11_OPTIONS4 options = { 0, };
|
||||
UINT supported = 0;
|
||||
|
@ -141,9 +141,9 @@ get_d3d11_devices (void)
|
|||
}
|
||||
|
||||
/* device can support NV12 format? */
|
||||
d3d11_format =
|
||||
gst_d3d11_device_format_from_gst (device, GST_VIDEO_FORMAT_NV12);
|
||||
if (!d3d11_format || d3d11_format->dxgi_format != DXGI_FORMAT_NV12) {
|
||||
if (!gst_d3d11_device_get_format (device,
|
||||
GST_VIDEO_FORMAT_NV12, &d3d11_format) ||
|
||||
d3d11_format.dxgi_format != DXGI_FORMAT_NV12) {
|
||||
GST_DEBUG_OBJECT (device,
|
||||
"Given d3d11 device cannot support NV12 format");
|
||||
gst_object_unref (device);
|
||||
|
|
Loading…
Reference in a new issue