d3d11colorconverter: Add method to support updating destination rect

It's equivalent to GST_VIDEO_CONVERTER_OPT_DEST_* options of GstVideoConverter

Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1323>
This commit is contained in:
Seungha Yang 2020-06-03 00:59:15 +09:00 committed by GStreamer Merge Bot
parent 5c7caf70e1
commit 94ac3cc94d
2 changed files with 57 additions and 8 deletions

View file

@ -327,6 +327,7 @@ struct _GstD3D11ColorConverter
D3D11_VIEWPORT viewport[GST_VIDEO_MAX_PLANES]; D3D11_VIEWPORT viewport[GST_VIDEO_MAX_PLANES];
RECT src_rect; RECT src_rect;
RECT dest_rect;
gint input_texture_width; gint input_texture_width;
gint input_texture_height; gint input_texture_height;
ID3D11Buffer *vertex_buffer; ID3D11Buffer *vertex_buffer;
@ -1237,6 +1238,11 @@ gst_d3d11_color_convert_setup_shader (GstD3D11ColorConverter * self,
self->src_rect.right = GST_VIDEO_INFO_WIDTH (in_info); self->src_rect.right = GST_VIDEO_INFO_WIDTH (in_info);
self->src_rect.bottom = GST_VIDEO_INFO_HEIGHT (in_info); self->src_rect.bottom = GST_VIDEO_INFO_HEIGHT (in_info);
self->dest_rect.left = 0;
self->dest_rect.top = 0;
self->dest_rect.right = GST_VIDEO_INFO_WIDTH (out_info);
self->dest_rect.bottom = GST_VIDEO_INFO_HEIGHT (out_info);
self->input_texture_width = GST_VIDEO_INFO_WIDTH (in_info); self->input_texture_width = GST_VIDEO_INFO_WIDTH (in_info);
self->input_texture_height = GST_VIDEO_INFO_HEIGHT (in_info); self->input_texture_height = GST_VIDEO_INFO_HEIGHT (in_info);
@ -1411,10 +1417,13 @@ gst_d3d11_color_converter_update_vertex_buffer (GstD3D11ColorConverter * self)
VertexData *vertex_data; VertexData *vertex_data;
ID3D11DeviceContext *context_handle; ID3D11DeviceContext *context_handle;
HRESULT hr; HRESULT hr;
FLOAT x1, y1, x2, y2;
FLOAT u, v; FLOAT u, v;
const RECT *src_rect = &self->src_rect; const RECT *src_rect = &self->src_rect;
const RECT *dest_rect = &self->dest_rect;
gint texture_width = self->input_texture_width; gint texture_width = self->input_texture_width;
gint texture_height = self->input_texture_height; gint texture_height = self->input_texture_height;
gdouble val;
context_handle = gst_d3d11_device_get_device_context_handle (self->device); context_handle = gst_d3d11_device_get_device_context_handle (self->device);
@ -1428,13 +1437,30 @@ gst_d3d11_color_converter_update_vertex_buffer (GstD3D11ColorConverter * self)
} }
vertex_data = (VertexData *) map.pData; vertex_data = (VertexData *) map.pData;
/* bottom left */
gst_util_fraction_to_double (dest_rect->left,
GST_VIDEO_INFO_WIDTH (&self->out_info), &val);
x1 = (val * 2.0f) - 1.0f;
gst_util_fraction_to_double (dest_rect->bottom,
GST_VIDEO_INFO_HEIGHT (&self->out_info), &val);
y1 = (val * -2.0f) + 1.0f;
/* top right */
gst_util_fraction_to_double (dest_rect->right,
GST_VIDEO_INFO_WIDTH (&self->out_info), &val);
x2 = (val * 2.0f) - 1.0f;
gst_util_fraction_to_double (dest_rect->top,
GST_VIDEO_INFO_HEIGHT (&self->out_info), &val);
y2 = (val * -2.0f) + 1.0f;
/* bottom left */ /* bottom left */
u = (src_rect->left / (gfloat) texture_width) - 0.5f / texture_width; u = (src_rect->left / (gfloat) texture_width) - 0.5f / texture_width;
v = (src_rect->bottom / (gfloat) texture_height) - 0.5f / texture_height; v = (src_rect->bottom / (gfloat) texture_height) - 0.5f / texture_height;
vertex_data[0].position.x = -1.0f; vertex_data[0].position.x = x1;
vertex_data[0].position.y = -1.0f; vertex_data[0].position.y = y1;
vertex_data[0].position.z = 0.0f; vertex_data[0].position.z = 0.0f;
vertex_data[0].texture.x = u; vertex_data[0].texture.x = u;
vertex_data[0].texture.y = v; vertex_data[0].texture.y = v;
@ -1443,8 +1469,8 @@ gst_d3d11_color_converter_update_vertex_buffer (GstD3D11ColorConverter * self)
u = (src_rect->left / (gfloat) texture_width) - 0.5f / texture_width; u = (src_rect->left / (gfloat) texture_width) - 0.5f / texture_width;
v = (src_rect->top / (gfloat) texture_height) - 0.5f / texture_height; v = (src_rect->top / (gfloat) texture_height) - 0.5f / texture_height;
vertex_data[1].position.x = -1.0f; vertex_data[1].position.x = x1;
vertex_data[1].position.y = 1.0f; vertex_data[1].position.y = y2;
vertex_data[1].position.z = 0.0f; vertex_data[1].position.z = 0.0f;
vertex_data[1].texture.x = u; vertex_data[1].texture.x = u;
vertex_data[1].texture.y = v; vertex_data[1].texture.y = v;
@ -1453,8 +1479,8 @@ gst_d3d11_color_converter_update_vertex_buffer (GstD3D11ColorConverter * self)
u = (src_rect->right / (gfloat) texture_width) - 0.5f / texture_width; u = (src_rect->right / (gfloat) texture_width) - 0.5f / texture_width;
v = (src_rect->top / (gfloat) texture_height) - 0.5f / texture_height; v = (src_rect->top / (gfloat) texture_height) - 0.5f / texture_height;
vertex_data[2].position.x = 1.0f; vertex_data[2].position.x = x2;
vertex_data[2].position.y = 1.0f; vertex_data[2].position.y = y2;
vertex_data[2].position.z = 0.0f; vertex_data[2].position.z = 0.0f;
vertex_data[2].texture.x = u; vertex_data[2].texture.x = u;
vertex_data[2].texture.y = v; vertex_data[2].texture.y = v;
@ -1463,8 +1489,8 @@ gst_d3d11_color_converter_update_vertex_buffer (GstD3D11ColorConverter * self)
u = (src_rect->right / (gfloat) texture_width) - 0.5f / texture_width; u = (src_rect->right / (gfloat) texture_width) - 0.5f / texture_width;
v = (src_rect->bottom / (gfloat) texture_height) - 0.5f / texture_height; v = (src_rect->bottom / (gfloat) texture_height) - 0.5f / texture_height;
vertex_data[3].position.x = 1.0f; vertex_data[3].position.x = x2;
vertex_data[3].position.y = -1.0f; vertex_data[3].position.y = y1;
vertex_data[3].position.z = 0.0f; vertex_data[3].position.z = 0.0f;
vertex_data[3].texture.x = u; vertex_data[3].texture.x = u;
vertex_data[3].texture.y = v; vertex_data[3].texture.y = v;
@ -1601,3 +1627,23 @@ gst_d3d11_color_converter_update_src_rect (GstD3D11ColorConverter * converter,
return TRUE; return TRUE;
} }
gboolean
gst_d3d11_color_converter_update_dest_rect (GstD3D11ColorConverter * converter,
RECT * dest_rect)
{
g_return_val_if_fail (converter != NULL, FALSE);
g_return_val_if_fail (dest_rect != NULL, FALSE);
if (converter->dest_rect.left != dest_rect->left ||
converter->dest_rect.top != dest_rect->top ||
converter->dest_rect.right != dest_rect->right ||
converter->dest_rect.bottom != dest_rect->bottom) {
converter->dest_rect = *dest_rect;
/* vertex buffer will be updated on next convert() call */
converter->update_vertex = TRUE;
}
return TRUE;
}

View file

@ -48,6 +48,9 @@ gboolean gst_d3d11_color_converter_update_viewport (GstD3D11Col
gboolean gst_d3d11_color_converter_update_src_rect (GstD3D11ColorConverter * converter, gboolean gst_d3d11_color_converter_update_src_rect (GstD3D11ColorConverter * converter,
RECT * src_rect); RECT * src_rect);
gboolean gst_d3d11_color_converter_update_dest_rect (GstD3D11ColorConverter * converter,
RECT * dest_rect);
G_END_DECLS G_END_DECLS
#endif /* __GST_D3D11_COLOR_CONVERTER_H__ */ #endif /* __GST_D3D11_COLOR_CONVERTER_H__ */