hc
2023-12-09 b22da3d8526a935aa31e086e63f60ff3246cb61c
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
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
From bdae7d7d57718cabde193c6a20b059fb4c35ac46 Mon Sep 17 00:00:00 2001
From: Jeffy Chen <jeffy.chen@rock-chips.com>
Date: Thu, 15 Sep 2022 18:01:12 +0800
Subject: [PATCH 38/39] kmssink: Support scaling in modesetting
 
Signed-off-by: Jeffy Chen <jeffy.chen@rock-chips.com>
---
 sys/kms/gstkmssink.c | 52 +++++++++++++++++++++++++++++---------------
 1 file changed, 34 insertions(+), 18 deletions(-)
 
diff --git a/sys/kms/gstkmssink.c b/sys/kms/gstkmssink.c
index 78f58e3..a27f569 100644
--- a/sys/kms/gstkmssink.c
+++ b/sys/kms/gstkmssink.c
@@ -234,11 +234,12 @@ drm_plane_get_type (int fd, drmModePlane * plane)
 }
 
 static drmModePlane *
-find_plane_for_crtc (int fd, drmModeRes * res, drmModePlaneRes * pres,
+find_plane_for_crtc (GstKMSSink * self, drmModeRes * res, drmModePlaneRes * pres,
     int crtc_id)
 {
   drmModePlane *plane;
   int i, pipe, plane_type, num_primary, fallback;
+  int fd = self->fd;
 
   num_primary = 0;
   fallback = 0;
@@ -260,7 +261,8 @@ find_plane_for_crtc (int fd, drmModeRes * res, drmModePlaneRes * pres,
     num_primary += plane_type == DRM_PLANE_TYPE_PRIMARY;
 
     /* Check unused possible planes */
-    if (plane->possible_crtcs & (1 << pipe) && !plane->fb_id) {
+    if (plane->possible_crtcs & (1 << pipe) &&
+        (!plane->fb_id || self->modesetting_enabled)) {
       if (pipe == num_primary - 1 && plane_type == DRM_PLANE_TYPE_PRIMARY) {
         /* Prefer the Nth primary plane */
         return plane;
@@ -525,12 +527,6 @@ configure_mode_setting (GstKMSSink * self, GstVideoInfo * vinfo)
 
   GST_INFO_OBJECT (self, "configuring mode setting");
 
-  ensure_kms_allocator (self);
-  kmsmem = (GstKMSMemory *) gst_kms_allocator_bo_alloc (self->allocator, vinfo);
-  if (!kmsmem)
-    goto bo_failed;
-  fb_id = kmsmem->fb_id;
-
   conn = drmModeGetConnector (self->fd, self->conn_id);
   if (!conn)
     goto connector_failed;
@@ -542,9 +538,25 @@ configure_mode_setting (GstKMSSink * self, GstVideoInfo * vinfo)
       break;
     }
   }
+
+  /* Fallback to the last mode (using scale) */
+  if (!mode && self->can_scale && conn->count_modes) {
+    mode = &conn->modes[conn->count_modes - 1];
+
+    /* Hack this temp video info */
+    gst_video_info_set_format (vinfo, GST_VIDEO_INFO_FORMAT (vinfo),
+        mode->hdisplay, mode->vdisplay);
+  }
+
   if (!mode)
     goto mode_failed;
 
+  ensure_kms_allocator (self);
+  kmsmem = (GstKMSMemory *) gst_kms_allocator_bo_alloc (self->allocator, vinfo);
+  if (!kmsmem)
+    goto bo_failed;
+  fb_id = kmsmem->fb_id;
+
   err = drmModeSetCrtc (self->fd, self->crtc_id, fb_id, 0, 0,
       (uint32_t *) & self->conn_id, 1, mode);
   if (err)
@@ -720,7 +732,7 @@ ensure_allowed_caps (GstKMSSink * self, drmModeConnector * conn,
 
       format = gst_video_format_to_string (fmt);
 
-      if (mode) {
+      if (mode && !self->can_scale) {
         caps = gst_caps_new_simple ("video/x-raw",
             "format", G_TYPE_STRING, format,
             "width", G_TYPE_INT, mode->hdisplay,
@@ -1036,7 +1048,7 @@ retry_find_plane:
     goto plane_resources_failed;
 
   if (self->plane_id == -1)
-    plane = find_plane_for_crtc (self->fd, res, pres, crtc->crtc_id);
+    plane = find_plane_for_crtc (self, res, pres, crtc->crtc_id);
   else
     plane = drmModeGetPlane (self->fd, self->plane_id);
   if (!plane)
@@ -1586,7 +1598,7 @@ gst_kms_sink_sync (GstKMSSink * self)
   } else if (self->sync_mode == GST_KMS_SYNC_VBLANK) {
     pageflip = FALSE;
   } else if (self->sync_mode == GST_KMS_SYNC_AUTO) {
-    pageflip = self->modesetting_enabled;
+    pageflip = self->modesetting_enabled && self->buffer_id;
   } else {
     return TRUE;
   }
@@ -1913,15 +1925,19 @@ gst_kms_sink_show_frame (GstVideoSink * vsink, GstBuffer * buf)
 
   GST_OBJECT_LOCK (self);
   if (self->modesetting_enabled) {
-    self->buffer_id = fb_id;
+    if (video_width == self->hdisplay && video_height == self->vdisplay) {
+      self->buffer_id = fb_id;
 
-    if (!self->render_rect.w || !self->render_rect.h)
-      goto sync_frame;
+      if (!self->render_rect.w || !self->render_rect.h)
+        goto sync_frame;
 
-    if (!self->render_rect.x && !self->render_rect.y &&
-        self->render_rect.w == self->hdisplay &&
-        self->render_rect.h == self->vdisplay)
-      goto sync_frame;
+      if (!self->render_rect.x && !self->render_rect.y &&
+          self->render_rect.w == self->hdisplay &&
+          self->render_rect.h == self->vdisplay)
+        goto sync_frame;
+    } else {
+      self->buffer_id = 0;
+    }
   }
 
   if ((crop = gst_buffer_get_video_crop_meta (buffer))) {
-- 
2.20.1