d3d11decoder: Set GstVideoAlignment to downstream d3d11 buffer pool

To copy decoder output texture to another d3d11 texture, the downstream
texture needs to be aligned too.
This commit is contained in:
Seungha Yang 2020-03-07 19:38:30 +09:00 committed by Seungha Yang
parent 5c51601cdf
commit c10b5f06a5
3 changed files with 47 additions and 17 deletions

View file

@ -423,16 +423,26 @@ gst_d3d11_h264_dec_decide_allocation (GstVideoDecoder * decoder,
gst_buffer_pool_config_add_option (config, GST_BUFFER_POOL_OPTION_VIDEO_META); gst_buffer_pool_config_add_option (config, GST_BUFFER_POOL_OPTION_VIDEO_META);
if (self->use_d3d11_output) { if (self->use_d3d11_output) {
GstVideoAlignment align;
gint width, height;
gst_video_alignment_reset (&align);
d3d11_params = gst_buffer_pool_config_get_d3d11_allocation_params (config); d3d11_params = gst_buffer_pool_config_get_d3d11_allocation_params (config);
if (!d3d11_params) if (!d3d11_params)
d3d11_params = gst_d3d11_allocation_params_new (self->device, d3d11_params = gst_d3d11_allocation_params_new (self->device,
&vinfo, 0, 0); &vinfo, 0, 0);
/* dxva2 decoder uses non-resource format width = GST_VIDEO_INFO_WIDTH (&vinfo);
* (e.g., use NV12 instead of R8 + R8G8 */ height = GST_VIDEO_INFO_HEIGHT (&vinfo);
d3d11_params->desc[0].Width = GST_VIDEO_INFO_WIDTH (&vinfo);
d3d11_params->desc[0].Height = GST_VIDEO_INFO_HEIGHT (&vinfo); /* need alignment to copy decoder output texture to downstream texture */
d3d11_params->desc[0].Format = d3d11_params->d3d11_format->dxgi_format; align.padding_right = GST_ROUND_UP_16 (width) - width;
align.padding_bottom = GST_ROUND_UP_16 (height) - height;
if (!gst_d3d11_allocation_params_alignment (d3d11_params, &align)) {
GST_ERROR_OBJECT (self, "Cannot set alignment");
return FALSE;
}
gst_buffer_pool_config_set_d3d11_allocation_params (config, d3d11_params); gst_buffer_pool_config_set_d3d11_allocation_params (config, d3d11_params);
gst_d3d11_allocation_params_free (d3d11_params); gst_d3d11_allocation_params_free (d3d11_params);

View file

@ -392,16 +392,26 @@ gst_d3d11_h265_dec_decide_allocation (GstVideoDecoder * decoder,
gst_buffer_pool_config_add_option (config, GST_BUFFER_POOL_OPTION_VIDEO_META); gst_buffer_pool_config_add_option (config, GST_BUFFER_POOL_OPTION_VIDEO_META);
if (self->use_d3d11_output) { if (self->use_d3d11_output) {
GstVideoAlignment align;
gint width, height;
gst_video_alignment_reset (&align);
d3d11_params = gst_buffer_pool_config_get_d3d11_allocation_params (config); d3d11_params = gst_buffer_pool_config_get_d3d11_allocation_params (config);
if (!d3d11_params) if (!d3d11_params)
d3d11_params = d3d11_params = gst_d3d11_allocation_params_new (self->device,
gst_d3d11_allocation_params_new (self->device, &vinfo, 0, 0); &vinfo, 0, 0);
/* dxva2 decoder uses non-resource format width = GST_VIDEO_INFO_WIDTH (&vinfo);
* (e.g., use NV12 instead of R8 + R8G8 */ height = GST_VIDEO_INFO_HEIGHT (&vinfo);
d3d11_params->desc[0].Width = GST_VIDEO_INFO_WIDTH (&vinfo);
d3d11_params->desc[0].Height = GST_VIDEO_INFO_HEIGHT (&vinfo); /* need alignment to copy decoder output texture to downstream texture */
d3d11_params->desc[0].Format = d3d11_params->d3d11_format->dxgi_format; align.padding_right = GST_ROUND_UP_16 (width) - width;
align.padding_bottom = GST_ROUND_UP_16 (height) - height;
if (!gst_d3d11_allocation_params_alignment (d3d11_params, &align)) {
GST_ERROR_OBJECT (self, "Cannot set alignment");
return FALSE;
}
gst_buffer_pool_config_set_d3d11_allocation_params (config, d3d11_params); gst_buffer_pool_config_set_d3d11_allocation_params (config, d3d11_params);
gst_d3d11_allocation_params_free (d3d11_params); gst_d3d11_allocation_params_free (d3d11_params);

View file

@ -391,16 +391,26 @@ gst_d3d11_vp9_dec_decide_allocation (GstVideoDecoder * decoder,
gst_buffer_pool_config_add_option (config, GST_BUFFER_POOL_OPTION_VIDEO_META); gst_buffer_pool_config_add_option (config, GST_BUFFER_POOL_OPTION_VIDEO_META);
if (self->use_d3d11_output) { if (self->use_d3d11_output) {
GstVideoAlignment align;
gint width, height;
gst_video_alignment_reset (&align);
d3d11_params = gst_buffer_pool_config_get_d3d11_allocation_params (config); d3d11_params = gst_buffer_pool_config_get_d3d11_allocation_params (config);
if (!d3d11_params) if (!d3d11_params)
d3d11_params = gst_d3d11_allocation_params_new (self->device, d3d11_params = gst_d3d11_allocation_params_new (self->device,
&vinfo, 0, 0); &vinfo, 0, 0);
/* dxva2 decoder uses non-resource format width = GST_VIDEO_INFO_WIDTH (&vinfo);
* (e.g., use NV12 instead of R8 + R8G8 */ height = GST_VIDEO_INFO_HEIGHT (&vinfo);
d3d11_params->desc[0].Width = GST_VIDEO_INFO_WIDTH (&vinfo);
d3d11_params->desc[0].Height = GST_VIDEO_INFO_HEIGHT (&vinfo); /* need alignment to copy decoder output texture to downstream texture */
d3d11_params->desc[0].Format = d3d11_params->d3d11_format->dxgi_format; align.padding_right = GST_ROUND_UP_16 (width) - width;
align.padding_bottom = GST_ROUND_UP_16 (height) - height;
if (!gst_d3d11_allocation_params_alignment (d3d11_params, &align)) {
GST_ERROR_OBJECT (self, "Cannot set alignment");
return FALSE;
}
gst_buffer_pool_config_set_d3d11_allocation_params (config, d3d11_params); gst_buffer_pool_config_set_d3d11_allocation_params (config, d3d11_params);
gst_d3d11_allocation_params_free (d3d11_params); gst_d3d11_allocation_params_free (d3d11_params);