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) {
}
/**
- * 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;
}
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
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));
+}
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__ */
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;
}
*/
/* 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;
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;
GstVideoInfo info;
GstVideoInfo aligned_info;
- const GstD3D11Format *d3d11_format;
+ GstD3D11Format d3d11_format;
GstD3D11AllocationFlags flags;
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,
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);
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];
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;
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:
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;
}
/* 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;
{
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];
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;
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);
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;
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);
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;
}
}
/* 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;
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 =
/* 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;
}
/* 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;
}
GstVideoInfo out_info;
gdouble alpha;
- const GstD3D11Format *in_d3d11_format;
- const GstD3D11Format *out_d3d11_format;
-
guint num_input_view;
guint num_output_view;
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';
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;
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;
}
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);
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;
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;
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++) {
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;
}
}
/* 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;
GstStructure *config;
gboolean update_pool = FALSE;
GstVideoInfo vinfo;
- const GstD3D11Format *d3d11_format;
+ GstD3D11Format d3d11_format;
GstD3D11AllocationParams *d3d11_params;
guint bind_flags = 0;
guint i;
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);
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);
}
}
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;
{
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;
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);
}
/* 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;
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;
}
/* 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);