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