hc
2023-02-14 0cc9b7c44253c93447ddf73e206fbdbb3d9f16b1
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
From 61e879015a5848fb5e62fcbe6caed85cdb072d2d Mon Sep 17 00:00:00 2001
From: Jeffy Chen <jeffy.chen@rock-chips.com>
Date: Wed, 19 Jan 2022 16:37:40 +0800
Subject: [PATCH 29/33] kmssink: Support ignoring aspect ratio
 
Set "force-aspect-ratio" property to false to ignore aspect ratio.
 
Signed-off-by: Jeffy Chen <jeffy.chen@rock-chips.com>
---
 sys/kms/gstkmssink.c | 18 +++++++++++++++++-
 sys/kms/gstkmssink.h |  2 ++
 2 files changed, 19 insertions(+), 1 deletion(-)
 
diff --git a/sys/kms/gstkmssink.c b/sys/kms/gstkmssink.c
index b472f3b..af80c8e 100644
--- a/sys/kms/gstkmssink.c
+++ b/sys/kms/gstkmssink.c
@@ -98,6 +98,7 @@ enum
   PROP_DISPLAY_HEIGHT,
   PROP_CONNECTOR_PROPS,
   PROP_PLANE_PROPS,
+  PROP_FORCE_ASPECT_RATIO,
   PROP_N,
 };
 
@@ -1272,7 +1273,7 @@ gst_kms_sink_calculate_display_ratio (GstKMSSink * self, GstVideoInfo * vinfo,
   video_par_n = GST_VIDEO_INFO_PAR_N (vinfo);
   video_par_d = GST_VIDEO_INFO_PAR_D (vinfo);
 
-  if (self->can_scale) {
+  if (self->can_scale && self->keep_aspect) {
     gst_video_calculate_device_ratio (self->hdisplay, self->vdisplay,
         self->mm_width, self->mm_height, &dpy_par_n, &dpy_par_d);
   } else {
@@ -1865,6 +1866,9 @@ retry_set_plane:
   result.x += self->render_rect.x;
   result.y += self->render_rect.y;
 
+  if (self->can_scale && !self->keep_aspect)
+    result = self->render_rect;
+
   if (crop) {
     src.w = crop->width;
     src.h = crop->height;
@@ -2067,6 +2071,9 @@ gst_kms_sink_set_property (GObject * object, guint prop_id,
 
       break;
     }
+    case PROP_FORCE_ASPECT_RATIO:
+      sink->keep_aspect = g_value_get_boolean (value);
+      break;
     default:
       if (!gst_video_overlay_set_property (object, PROP_N, prop_id, value))
         G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
@@ -2120,6 +2127,9 @@ gst_kms_sink_get_property (GObject * object, guint prop_id,
     case PROP_PLANE_PROPS:
       gst_value_set_structure (value, sink->plane_props);
       break;
+    case PROP_FORCE_ASPECT_RATIO:
+      g_value_set_boolean (value, sink->keep_aspect);
+      break;
     default:
       G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
       break;
@@ -2150,6 +2160,7 @@ gst_kms_sink_init (GstKMSSink * sink)
   sink->plane_id = -1;
   sink->saved_zpos = -1;
   sink->can_scale = TRUE;
+  sink->keep_aspect = TRUE;
   gst_poll_fd_init (&sink->pollfd);
   sink->poll = gst_poll_new (TRUE);
   gst_video_info_init (&sink->vinfo);
@@ -2319,6 +2330,11 @@ gst_kms_sink_class_init (GstKMSSinkClass * klass)
       "Additional properties for the plane",
       GST_TYPE_STRUCTURE, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS);
 
+  g_properties[PROP_FORCE_ASPECT_RATIO] =
+      g_param_spec_boolean ("force-aspect-ratio", "Force aspect ratio",
+      "When enabled, scaling will respect original aspect ratio", TRUE,
+      G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS);
+
   g_object_class_install_properties (gobject_class, PROP_N, g_properties);
 
   gst_video_overlay_install_properties (gobject_class, PROP_N);
diff --git a/sys/kms/gstkmssink.h b/sys/kms/gstkmssink.h
index 45a9c08..ab70ec4 100644
--- a/sys/kms/gstkmssink.h
+++ b/sys/kms/gstkmssink.h
@@ -96,6 +96,8 @@ struct _GstKMSSink {
   gboolean reconfigure;
 
   guintptr window_handle;
+
+  gboolean keep_aspect;
 };
 
 struct _GstKMSSinkClass {
-- 
2.20.1