1*4882a593SmuzhiyunFrom e226214c97d057cfcc861ae64272a52331375f3f Mon Sep 17 00:00:00 2001
2*4882a593SmuzhiyunFrom: Jeffy Chen <jeffy.chen@rock-chips.com>
3*4882a593SmuzhiyunDate: Wed, 19 Jan 2022 16:37:40 +0800
4*4882a593SmuzhiyunSubject: [PATCH 30/41] kmssink: Support ignoring aspect ratio
5*4882a593Smuzhiyun
6*4882a593SmuzhiyunSet "force-aspect-ratio" property to false to ignore aspect ratio.
7*4882a593Smuzhiyun
8*4882a593SmuzhiyunSigned-off-by: Jeffy Chen <jeffy.chen@rock-chips.com>
9*4882a593Smuzhiyun---
10*4882a593Smuzhiyun sys/kms/gstkmssink.c | 18 +++++++++++++++++-
11*4882a593Smuzhiyun sys/kms/gstkmssink.h |  2 ++
12*4882a593Smuzhiyun 2 files changed, 19 insertions(+), 1 deletion(-)
13*4882a593Smuzhiyun
14*4882a593Smuzhiyundiff --git a/sys/kms/gstkmssink.c b/sys/kms/gstkmssink.c
15*4882a593Smuzhiyunindex 8335963..3740e57 100644
16*4882a593Smuzhiyun--- a/sys/kms/gstkmssink.c
17*4882a593Smuzhiyun+++ b/sys/kms/gstkmssink.c
18*4882a593Smuzhiyun@@ -106,6 +106,7 @@ enum
19*4882a593Smuzhiyun   PROP_PLANE_PROPS,
20*4882a593Smuzhiyun   PROP_FD,
21*4882a593Smuzhiyun   PROP_SKIP_VSYNC,
22*4882a593Smuzhiyun+  PROP_FORCE_ASPECT_RATIO,
23*4882a593Smuzhiyun   PROP_N,
24*4882a593Smuzhiyun };
25*4882a593Smuzhiyun
26*4882a593Smuzhiyun@@ -1582,7 +1583,7 @@ gst_kms_sink_calculate_display_ratio (GstKMSSink * self, GstVideoInfo * vinfo,
27*4882a593Smuzhiyun   video_par_n = GST_VIDEO_INFO_PAR_N (vinfo);
28*4882a593Smuzhiyun   video_par_d = GST_VIDEO_INFO_PAR_D (vinfo);
29*4882a593Smuzhiyun
30*4882a593Smuzhiyun-  if (self->can_scale) {
31*4882a593Smuzhiyun+  if (self->can_scale && self->keep_aspect) {
32*4882a593Smuzhiyun     gst_video_calculate_device_ratio (self->hdisplay, self->vdisplay,
33*4882a593Smuzhiyun         self->mm_width, self->mm_height, &dpy_par_n, &dpy_par_d);
34*4882a593Smuzhiyun   } else {
35*4882a593Smuzhiyun@@ -2179,6 +2180,9 @@ retry_set_plane:
36*4882a593Smuzhiyun   result.x += self->render_rect.x;
37*4882a593Smuzhiyun   result.y += self->render_rect.y;
38*4882a593Smuzhiyun
39*4882a593Smuzhiyun+  if (self->can_scale && !self->keep_aspect)
40*4882a593Smuzhiyun+    result = self->render_rect;
41*4882a593Smuzhiyun+
42*4882a593Smuzhiyun   if (crop) {
43*4882a593Smuzhiyun     src.w = crop->width;
44*4882a593Smuzhiyun     src.h = crop->height;
45*4882a593Smuzhiyun@@ -2438,6 +2442,9 @@ gst_kms_sink_set_property (GObject * object, guint prop_id,
46*4882a593Smuzhiyun     case PROP_SKIP_VSYNC:
47*4882a593Smuzhiyun       sink->skip_vsync = g_value_get_boolean (value);
48*4882a593Smuzhiyun       break;
49*4882a593Smuzhiyun+    case PROP_FORCE_ASPECT_RATIO:
50*4882a593Smuzhiyun+      sink->keep_aspect = g_value_get_boolean (value);
51*4882a593Smuzhiyun+      break;
52*4882a593Smuzhiyun     default:
53*4882a593Smuzhiyun       if (!gst_video_overlay_set_property (object, PROP_N, prop_id, value))
54*4882a593Smuzhiyun         G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
55*4882a593Smuzhiyun@@ -2497,6 +2504,9 @@ gst_kms_sink_get_property (GObject * object, guint prop_id,
56*4882a593Smuzhiyun     case PROP_SKIP_VSYNC:
57*4882a593Smuzhiyun       g_value_set_boolean (value, sink->skip_vsync);
58*4882a593Smuzhiyun       break;
59*4882a593Smuzhiyun+    case PROP_FORCE_ASPECT_RATIO:
60*4882a593Smuzhiyun+      g_value_set_boolean (value, sink->keep_aspect);
61*4882a593Smuzhiyun+      break;
62*4882a593Smuzhiyun     default:
63*4882a593Smuzhiyun       G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
64*4882a593Smuzhiyun       break;
65*4882a593Smuzhiyun@@ -2528,6 +2538,7 @@ gst_kms_sink_init (GstKMSSink * sink)
66*4882a593Smuzhiyun   sink->plane_id = -1;
67*4882a593Smuzhiyun   sink->saved_zpos = -1;
68*4882a593Smuzhiyun   sink->can_scale = TRUE;
69*4882a593Smuzhiyun+  sink->keep_aspect = TRUE;
70*4882a593Smuzhiyun   gst_poll_fd_init (&sink->pollfd);
71*4882a593Smuzhiyun   sink->poll = gst_poll_new (TRUE);
72*4882a593Smuzhiyun   gst_video_info_init (&sink->vinfo);
73*4882a593Smuzhiyun@@ -2736,6 +2747,11 @@ gst_kms_sink_class_init (GstKMSSinkClass * klass)
74*4882a593Smuzhiyun       "Should be used for atomic drivers to avoid double vsync.", FALSE,
75*4882a593Smuzhiyun       G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS | G_PARAM_CONSTRUCT);
76*4882a593Smuzhiyun
77*4882a593Smuzhiyun+  g_properties[PROP_FORCE_ASPECT_RATIO] =
78*4882a593Smuzhiyun+      g_param_spec_boolean ("force-aspect-ratio", "Force aspect ratio",
79*4882a593Smuzhiyun+      "When enabled, scaling will respect original aspect ratio", TRUE,
80*4882a593Smuzhiyun+      G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS);
81*4882a593Smuzhiyun+
82*4882a593Smuzhiyun   g_object_class_install_properties (gobject_class, PROP_N, g_properties);
83*4882a593Smuzhiyun
84*4882a593Smuzhiyun   gst_video_overlay_install_properties (gobject_class, PROP_N);
85*4882a593Smuzhiyundiff --git a/sys/kms/gstkmssink.h b/sys/kms/gstkmssink.h
86*4882a593Smuzhiyunindex f221eb6..5fb712d 100644
87*4882a593Smuzhiyun--- a/sys/kms/gstkmssink.h
88*4882a593Smuzhiyun+++ b/sys/kms/gstkmssink.h
89*4882a593Smuzhiyun@@ -112,6 +112,8 @@ struct _GstKMSSink {
90*4882a593Smuzhiyun #endif
91*4882a593Smuzhiyun
92*4882a593Smuzhiyun   guintptr window_handle;
93*4882a593Smuzhiyun+
94*4882a593Smuzhiyun+  gboolean keep_aspect;
95*4882a593Smuzhiyun };
96*4882a593Smuzhiyun
97*4882a593Smuzhiyun struct _GstKMSSinkClass {
98*4882a593Smuzhiyun--
99*4882a593Smuzhiyun2.20.1
100*4882a593Smuzhiyun
101