diff --git a/sys/d3d11/gstd3d11colorconverter.c b/sys/d3d11/gstd3d11colorconverter.c index 724139f89f..b07a3b76e9 100644 --- a/sys/d3d11/gstd3d11colorconverter.c +++ b/sys/d3d11/gstd3d11colorconverter.c @@ -326,7 +326,7 @@ struct _GstD3D11ColorConverter D3D11_VIEWPORT viewport[GST_VIDEO_MAX_PLANES]; - RECT crop_rect; + RECT src_rect; gint input_texture_width; gint input_texture_height; ID3D11Buffer *vertex_buffer; @@ -1232,10 +1232,10 @@ gst_d3d11_color_convert_setup_shader (GstD3D11ColorConverter * self, self->vertex_buffer = vertex_buffer; ID3D11Buffer_AddRef (vertex_buffer); - self->crop_rect.left = 0; - self->crop_rect.top = 0; - self->crop_rect.right = GST_VIDEO_INFO_WIDTH (in_info); - self->crop_rect.bottom = GST_VIDEO_INFO_HEIGHT (in_info); + self->src_rect.left = 0; + self->src_rect.top = 0; + self->src_rect.right = GST_VIDEO_INFO_WIDTH (in_info); + self->src_rect.bottom = GST_VIDEO_INFO_HEIGHT (in_info); self->input_texture_width = GST_VIDEO_INFO_WIDTH (in_info); self->input_texture_height = GST_VIDEO_INFO_HEIGHT (in_info); @@ -1412,7 +1412,7 @@ gst_d3d11_color_converter_update_vertex_buffer (GstD3D11ColorConverter * self) ID3D11DeviceContext *context_handle; HRESULT hr; FLOAT u, v; - const RECT *crop_rect = &self->crop_rect; + const RECT *src_rect = &self->src_rect; gint texture_width = self->input_texture_width; gint texture_height = self->input_texture_height; @@ -1430,8 +1430,8 @@ gst_d3d11_color_converter_update_vertex_buffer (GstD3D11ColorConverter * self) vertex_data = (VertexData *) map.pData; /* bottom left */ - u = (crop_rect->left / (gfloat) texture_width) - 0.5f / texture_width; - v = (crop_rect->bottom / (gfloat) texture_height) - 0.5f / texture_height; + u = (src_rect->left / (gfloat) texture_width) - 0.5f / texture_width; + v = (src_rect->bottom / (gfloat) texture_height) - 0.5f / texture_height; vertex_data[0].position.x = -1.0f; vertex_data[0].position.y = -1.0f; @@ -1440,8 +1440,8 @@ gst_d3d11_color_converter_update_vertex_buffer (GstD3D11ColorConverter * self) vertex_data[0].texture.y = v; /* top left */ - u = (crop_rect->left / (gfloat) texture_width) - 0.5f / texture_width; - v = (crop_rect->top / (gfloat) texture_height) - 0.5f / texture_height; + u = (src_rect->left / (gfloat) texture_width) - 0.5f / texture_width; + v = (src_rect->top / (gfloat) texture_height) - 0.5f / texture_height; vertex_data[1].position.x = -1.0f; vertex_data[1].position.y = 1.0f; @@ -1450,8 +1450,8 @@ gst_d3d11_color_converter_update_vertex_buffer (GstD3D11ColorConverter * self) vertex_data[1].texture.y = v; /* top right */ - u = (crop_rect->right / (gfloat) texture_width) - 0.5f / texture_width; - v = (crop_rect->top / (gfloat) texture_height) - 0.5f / texture_height; + u = (src_rect->right / (gfloat) texture_width) - 0.5f / texture_width; + v = (src_rect->top / (gfloat) texture_height) - 0.5f / texture_height; vertex_data[2].position.x = 1.0f; vertex_data[2].position.y = 1.0f; @@ -1460,8 +1460,8 @@ gst_d3d11_color_converter_update_vertex_buffer (GstD3D11ColorConverter * self) vertex_data[2].texture.y = v; /* bottom right */ - u = (crop_rect->right / (gfloat) texture_width) - 0.5f / texture_width; - v = (crop_rect->bottom / (gfloat) texture_height) - 0.5f / texture_height; + u = (src_rect->right / (gfloat) texture_width) - 0.5f / texture_width; + v = (src_rect->bottom / (gfloat) texture_height) - 0.5f / texture_height; vertex_data[3].position.x = 1.0f; vertex_data[3].position.y = -1.0f; @@ -1548,16 +1548,13 @@ gst_d3d11_color_converter_convert_unlocked (GstD3D11ColorConverter * converter, } gboolean -gst_d3d11_color_converter_update_rect (GstD3D11ColorConverter * converter, - RECT * rect) +gst_d3d11_color_converter_update_viewport (GstD3D11ColorConverter * converter, + D3D11_VIEWPORT * viewport) { g_return_val_if_fail (converter != NULL, FALSE); - g_return_val_if_fail (rect != NULL, FALSE); + g_return_val_if_fail (viewport != NULL, FALSE); - converter->viewport[0].TopLeftX = rect->left; - converter->viewport[0].TopLeftY = rect->top; - converter->viewport[0].Width = rect->right - rect->left; - converter->viewport[0].Height = rect->bottom - rect->top; + converter->viewport[0] = *viewport; switch (GST_VIDEO_INFO_FORMAT (&converter->out_info)) { case GST_VIDEO_FORMAT_NV12: @@ -1586,17 +1583,17 @@ gst_d3d11_color_converter_update_rect (GstD3D11ColorConverter * converter, } gboolean -gst_d3d11_color_converter_update_crop_rect (GstD3D11ColorConverter * converter, - RECT * crop_rect) +gst_d3d11_color_converter_update_src_rect (GstD3D11ColorConverter * converter, + RECT * src_rect) { g_return_val_if_fail (converter != NULL, FALSE); - g_return_val_if_fail (crop_rect != NULL, FALSE); + g_return_val_if_fail (src_rect != NULL, FALSE); - if (converter->crop_rect.left != crop_rect->left || - converter->crop_rect.top != crop_rect->top || - converter->crop_rect.right != crop_rect->right || - converter->crop_rect.bottom != crop_rect->bottom) { - converter->crop_rect = *crop_rect; + if (converter->src_rect.left != src_rect->left || + converter->src_rect.top != src_rect->top || + converter->src_rect.right != src_rect->right || + converter->src_rect.bottom != src_rect->bottom) { + converter->src_rect = *src_rect; /* vertex buffer will be updated on next convert() call */ converter->update_vertex = TRUE; diff --git a/sys/d3d11/gstd3d11colorconverter.h b/sys/d3d11/gstd3d11colorconverter.h index 1a4bad0624..32664770ac 100644 --- a/sys/d3d11/gstd3d11colorconverter.h +++ b/sys/d3d11/gstd3d11colorconverter.h @@ -42,11 +42,11 @@ gboolean gst_d3d11_color_converter_convert_unlocked (GstD3D11Col ID3D11ShaderResourceView *srv[GST_VIDEO_MAX_PLANES], ID3D11RenderTargetView *rtv[GST_VIDEO_MAX_PLANES]); -gboolean gst_d3d11_color_converter_update_rect (GstD3D11ColorConverter * converter, - RECT *rect); +gboolean gst_d3d11_color_converter_update_viewport (GstD3D11ColorConverter * converter, + D3D11_VIEWPORT * viewport); -gboolean gst_d3d11_color_converter_update_crop_rect (GstD3D11ColorConverter * converter, - RECT *crop_rect); +gboolean gst_d3d11_color_converter_update_src_rect (GstD3D11ColorConverter * converter, + RECT * src_rect); G_END_DECLS diff --git a/sys/d3d11/gstd3d11decoder.c b/sys/d3d11/gstd3d11decoder.c index f88f3447b2..a502ca7526 100644 --- a/sys/d3d11/gstd3d11decoder.c +++ b/sys/d3d11/gstd3d11decoder.c @@ -849,15 +849,17 @@ gst_d3d11_decoder_open (GstD3D11Decoder * decoder, GstD3D11Codec codec, D3D11_RENDER_TARGET_VIEW_DESC render_desc = { 0, }; D3D11_SHADER_RESOURCE_VIEW_DESC resource_desc = { 0, }; ID3D11Device *device_handle; - RECT rect; + D3D11_VIEWPORT viewport; priv->converter = gst_d3d11_color_converter_new (priv->device, info, info); - rect.left = 0; - rect.top = 0; - rect.right = priv->display_width; - rect.bottom = priv->display_height; - gst_d3d11_color_converter_update_rect (priv->converter, &rect); + viewport.TopLeftX = 0; + viewport.TopLeftY = 0; + viewport.Width = priv->display_width; + viewport.Height = priv->display_height; + viewport.MinDepth = 0.0f; + viewport.MaxDepth = 1.0f; + gst_d3d11_color_converter_update_viewport (priv->converter, &viewport); device_handle = gst_d3d11_device_get_device_handle (priv->device); @@ -1245,7 +1247,7 @@ copy_to_system (GstD3D11Decoder * self, GstVideoInfo * info, gint display_width, rect.right = display_width; rect.bottom = display_height; - gst_d3d11_color_converter_update_crop_rect (priv->converter, &rect); + gst_d3d11_color_converter_update_src_rect (priv->converter, &rect); if (!gst_d3d11_color_converter_convert_unlocked (priv->converter, srv, priv->fallback_render_target_view)) { @@ -1382,7 +1384,7 @@ copy_to_d3d11 (GstD3D11Decoder * self, GstVideoInfo * info, gint display_width, rect.right = display_width; rect.bottom = display_height; - gst_d3d11_color_converter_update_crop_rect (priv->converter, &rect); + gst_d3d11_color_converter_update_src_rect (priv->converter, &rect); if (!gst_d3d11_color_converter_convert_unlocked (priv->converter, srv, rtv)) { GST_ERROR_OBJECT (self, "Failed to convert"); diff --git a/sys/d3d11/gstd3d11overlaycompositor.c b/sys/d3d11/gstd3d11overlaycompositor.c index b8c257a3fd..75d4383348 100644 --- a/sys/d3d11/gstd3d11overlaycompositor.c +++ b/sys/d3d11/gstd3d11overlaycompositor.c @@ -625,16 +625,13 @@ gst_d3d11_overlay_compositor_free_overlays (GstD3D11OverlayCompositor * } gboolean -gst_d3d11_overlay_compositor_update_rect (GstD3D11OverlayCompositor * - compositor, RECT * rect) +gst_d3d11_overlay_compositor_update_viewport (GstD3D11OverlayCompositor * + compositor, D3D11_VIEWPORT * viewport) { g_return_val_if_fail (compositor != NULL, FALSE); - g_return_val_if_fail (rect != NULL, FALSE); + g_return_val_if_fail (viewport != NULL, FALSE); - compositor->viewport.TopLeftX = rect->left; - compositor->viewport.TopLeftY = rect->top; - compositor->viewport.Width = rect->right - rect->left; - compositor->viewport.Height = rect->bottom - rect->top; + compositor->viewport = *viewport; return TRUE; } diff --git a/sys/d3d11/gstd3d11overlaycompositor.h b/sys/d3d11/gstd3d11overlaycompositor.h index 1640546e96..98f94a8b05 100644 --- a/sys/d3d11/gstd3d11overlaycompositor.h +++ b/sys/d3d11/gstd3d11overlaycompositor.h @@ -38,8 +38,8 @@ gboolean gst_d3d11_overlay_compositor_upload (GstD3D11Overlay void gst_d3d11_overlay_compositor_free_overlays (GstD3D11OverlayCompositor * compositor); -gboolean gst_d3d11_overlay_compositor_update_rect (GstD3D11OverlayCompositor * compositor, - RECT *rect); +gboolean gst_d3d11_overlay_compositor_update_viewport (GstD3D11OverlayCompositor * compositor, + D3D11_VIEWPORT * viewport); gboolean gst_d3d11_overlay_compositor_draw (GstD3D11OverlayCompositor * compositor, ID3D11RenderTargetView *rtv[GST_VIDEO_MAX_PLANES]); diff --git a/sys/d3d11/gstd3d11window.cpp b/sys/d3d11/gstd3d11window.cpp index ab98419466..a40e2e624e 100644 --- a/sys/d3d11/gstd3d11window.cpp +++ b/sys/d3d11/gstd3d11window.cpp @@ -913,10 +913,18 @@ gst_d3d111_window_present (GstD3D11Window * self, GstBuffer * buffer) } if (self->first_present) { - gst_d3d11_color_converter_update_rect (self->converter, - &self->render_rect); - gst_d3d11_overlay_compositor_update_rect (self->compositor, - &self->render_rect); + D3D11_VIEWPORT viewport; + + viewport.TopLeftX = self->render_rect.left; + viewport.TopLeftY = self->render_rect.top; + viewport.Width = self->render_rect.right - self->render_rect.left; + viewport.Height = self->render_rect.bottom - self->render_rect.top; + viewport.MinDepth = 0.0f; + viewport.MaxDepth = 1.0f; + gst_d3d11_color_converter_update_viewport (self->converter, + &viewport); + gst_d3d11_overlay_compositor_update_viewport (self->compositor, + &viewport); } if (self->processor && piv && self->pov) {