[FFmpeg-cvslog] avfilter/vsrc_ddagrab: calculate pointer position on rotated screens
Timo Rothenpieler
git at videolan.org
Sat Jul 15 20:02:17 EEST 2023
ffmpeg | branch: master | Timo Rothenpieler <timo at rothenpieler.org> | Sat Jul 15 18:48:49 2023 +0200| [3c73200be2aef966a36d8c54359fef68e22c58b6] | committer: Timo Rothenpieler
avfilter/vsrc_ddagrab: calculate pointer position on rotated screens
> http://git.videolan.org/gitweb.cgi/ffmpeg.git/?a=commit;h=3c73200be2aef966a36d8c54359fef68e22c58b6
---
libavfilter/vsrc_ddagrab.c | 54 ++++++++++++++++++++++++++++++++++++++++++++--
1 file changed, 52 insertions(+), 2 deletions(-)
diff --git a/libavfilter/vsrc_ddagrab.c b/libavfilter/vsrc_ddagrab.c
index 4bf316c15a..525d48110a 100644
--- a/libavfilter/vsrc_ddagrab.c
+++ b/libavfilter/vsrc_ddagrab.c
@@ -533,8 +533,23 @@ static int update_mouse_pointer(AVFilterContext *avctx, DXGI_OUTDUPL_FRAME_INFO
return 0;
if (frame_info->PointerPosition.Visible) {
- dda->mouse_x = frame_info->PointerPosition.Position.x;
- dda->mouse_y = frame_info->PointerPosition.Position.y;
+ switch (dda->output_desc.Rotation) {
+ case DXGI_MODE_ROTATION_ROTATE90:
+ dda->mouse_x = frame_info->PointerPosition.Position.y;
+ dda->mouse_y = dda->output_desc.DesktopCoordinates.right - dda->output_desc.DesktopCoordinates.left - frame_info->PointerPosition.Position.x - 1;
+ break;
+ case DXGI_MODE_ROTATION_ROTATE180:
+ dda->mouse_x = dda->output_desc.DesktopCoordinates.right - dda->output_desc.DesktopCoordinates.left - frame_info->PointerPosition.Position.x - 1;
+ dda->mouse_y = dda->output_desc.DesktopCoordinates.bottom - dda->output_desc.DesktopCoordinates.top - frame_info->PointerPosition.Position.y - 1;
+ break;
+ case DXGI_MODE_ROTATION_ROTATE270:
+ dda->mouse_x = dda->output_desc.DesktopCoordinates.bottom - dda->output_desc.DesktopCoordinates.top - frame_info->PointerPosition.Position.y - 1;
+ dda->mouse_y = frame_info->PointerPosition.Position.x;
+ break;
+ default:
+ dda->mouse_x = frame_info->PointerPosition.Position.x;
+ dda->mouse_y = frame_info->PointerPosition.Position.y;
+ }
} else {
dda->mouse_x = dda->mouse_y = -1;
}
@@ -853,6 +868,41 @@ static int draw_mouse_pointer(AVFilterContext *avctx, AVFrame *frame)
D3D11_SUBRESOURCE_DATA init_data = { 0 };
D3D11_BUFFER_DESC buf_desc = { 0 };
+ switch (dda->output_desc.Rotation) {
+ case DXGI_MODE_ROTATION_ROTATE90:
+ vertices[ 0] = x; vertices[ 1] = y;
+ vertices[ 5] = x; vertices[ 6] = y - tex_desc.Width;
+ vertices[10] = x + tex_desc.Height; vertices[11] = y;
+ vertices[15] = x + tex_desc.Height; vertices[16] = y - tex_desc.Width;
+ vertices[ 3] = 0.0f; vertices[ 4] = 0.0f;
+ vertices[ 8] = 1.0f; vertices[ 9] = 0.0f;
+ vertices[13] = 0.0f; vertices[14] = 1.0f;
+ vertices[18] = 1.0f; vertices[19] = 1.0f;
+ break;
+ case DXGI_MODE_ROTATION_ROTATE180:
+ vertices[ 0] = x - tex_desc.Width; vertices[ 1] = y;
+ vertices[ 5] = x - tex_desc.Width; vertices[ 6] = y - tex_desc.Height;
+ vertices[10] = x; vertices[11] = y;
+ vertices[15] = x; vertices[16] = y - tex_desc.Height;
+ vertices[ 3] = 1.0f; vertices[ 4] = 0.0f;
+ vertices[ 8] = 1.0f; vertices[ 9] = 1.0f;
+ vertices[13] = 0.0f; vertices[14] = 0.0f;
+ vertices[18] = 0.0f; vertices[19] = 1.0f;
+ break;
+ case DXGI_MODE_ROTATION_ROTATE270:
+ vertices[ 0] = x - tex_desc.Height; vertices[ 1] = y + tex_desc.Width;
+ vertices[ 5] = x - tex_desc.Height; vertices[ 6] = y;
+ vertices[10] = x; vertices[11] = y + tex_desc.Width;
+ vertices[15] = x; vertices[16] = y;
+ vertices[ 3] = 1.0f; vertices[ 4] = 1.0f;
+ vertices[ 8] = 0.0f; vertices[ 9] = 1.0f;
+ vertices[13] = 1.0f; vertices[14] = 0.0f;
+ vertices[18] = 0.0f; vertices[19] = 0.0f;
+ break;
+ default:
+ break;
+ }
+
num_vertices = sizeof(vertices) / (sizeof(FLOAT) * 5);
buf_desc.Usage = D3D11_USAGE_DEFAULT;
More information about the ffmpeg-cvslog
mailing list