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
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
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
From cf89234a530bd85e575b7386b30f1425e2305411 Mon Sep 17 00:00:00 2001
From: Jeffy Chen <jeffy.chen@rock-chips.com>
Date: Fri, 25 Feb 2022 17:48:58 +0800
Subject: [PATCH 30/33] kmssink: Support setting prefered frame syncing mode
 
Tested with:
gst-launch-1.0 videotestsrc ! kmssink sync-mode=vblank
gst-launch-1.0 videotestsrc ! kmssink sync-mode=none
 
Signed-off-by: Jeffy Chen <jeffy.chen@rock-chips.com>
---
 sys/kms/gstkmssink.c | 62 +++++++++++++++++++++++++++++++++++++++-----
 sys/kms/gstkmssink.h | 10 +++++++
 2 files changed, 66 insertions(+), 6 deletions(-)
 
diff --git a/sys/kms/gstkmssink.c b/sys/kms/gstkmssink.c
index af80c8e..bfca332 100644
--- a/sys/kms/gstkmssink.c
+++ b/sys/kms/gstkmssink.c
@@ -99,11 +99,14 @@ enum
   PROP_CONNECTOR_PROPS,
   PROP_PLANE_PROPS,
   PROP_FORCE_ASPECT_RATIO,
+  PROP_SYNC_MODE,
   PROP_N,
 };
 
 static GParamSpec *g_properties[PROP_N] = { NULL, };
 
+static GstKMSSyncMode DEFAULT_SYNC_MODE = GST_KMS_SYNC_AUTO;
+
 static void
 gst_kms_sink_set_render_rectangle (GstVideoOverlay * overlay,
     gint x, gint y, gint width, gint height)
@@ -1491,7 +1494,7 @@ static gboolean
 gst_kms_sink_sync (GstKMSSink * self)
 {
   gint ret;
-  gboolean waiting;
+  gboolean waiting, pageflip;
   drmEventContext evctxt = {
     .version = DRM_EVENT_CONTEXT_VERSION,
     .page_flip_handler = sync_handler,
@@ -1510,8 +1513,18 @@ gst_kms_sink_sync (GstKMSSink * self)
   else if (self->pipe > 1)
     vbl.request.type |= self->pipe << DRM_VBLANK_HIGH_CRTC_SHIFT;
 
+  if (self->sync_mode == GST_KMS_SYNC_FLIP) {
+    pageflip = TRUE;
+  } else if (self->sync_mode == GST_KMS_SYNC_VBLANK) {
+    pageflip = FALSE;
+  } else if (self->sync_mode == GST_KMS_SYNC_AUTO) {
+    pageflip = self->modesetting_enabled;
+  } else {
+    return TRUE;
+  }
+
   waiting = TRUE;
-  if (!self->has_async_page_flip && !self->modesetting_enabled) {
+  if (!pageflip) {
     ret = drmWaitVBlank (self->fd, &vbl);
     if (ret)
       goto vblank_failed;
@@ -1916,10 +1929,12 @@ retry_set_plane:
   }
 
 sync_frame:
-  /* Wait for the previous frame to complete redraw */
-  if (!gst_kms_sink_sync (self)) {
-    GST_OBJECT_UNLOCK (self);
-    goto bail;
+  if (self->sync_mode != GST_KMS_SYNC_NONE) {
+    /* Wait for the previous frame to complete redraw */
+    if (!gst_kms_sink_sync (self)) {
+      GST_OBJECT_UNLOCK (self);
+      goto bail;
+    }
   }
 
   /* Save the rendered buffer and its metadata in case a redraw is needed */
@@ -2074,6 +2089,9 @@ gst_kms_sink_set_property (GObject * object, guint prop_id,
     case PROP_FORCE_ASPECT_RATIO:
       sink->keep_aspect = g_value_get_boolean (value);
       break;
+    case PROP_SYNC_MODE:
+      sink->sync_mode = g_value_get_enum (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);
@@ -2130,6 +2148,9 @@ gst_kms_sink_get_property (GObject * object, guint prop_id,
     case PROP_FORCE_ASPECT_RATIO:
       g_value_set_boolean (value, sink->keep_aspect);
       break;
+    case PROP_SYNC_MODE:
+      g_value_set_enum (value, sink->sync_mode);
+      break;
     default:
       G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
       break;
@@ -2161,11 +2182,31 @@ gst_kms_sink_init (GstKMSSink * sink)
   sink->saved_zpos = -1;
   sink->can_scale = TRUE;
   sink->keep_aspect = TRUE;
+  sink->sync_mode = DEFAULT_SYNC_MODE;
   gst_poll_fd_init (&sink->pollfd);
   sink->poll = gst_poll_new (TRUE);
   gst_video_info_init (&sink->vinfo);
 }
 
+#define GST_TYPE_KMS_SYNC_MODE (gst_kms_sync_mode_get_type ())
+static GType
+gst_kms_sync_mode_get_type (void)
+{
+  static GType mode = 0;
+
+  if (!mode) {
+    static const GEnumValue modes[] = {
+      {GST_KMS_SYNC_AUTO, "Sync with page flip or vblank event", "auto"},
+      {GST_KMS_SYNC_FLIP, "Sync with page flip event", "flip"},
+      {GST_KMS_SYNC_VBLANK, "Sync with vblank event", "vblank"},
+      {GST_KMS_SYNC_NONE, "Ignore syncing", "none"},
+      {0, NULL, NULL}
+    };
+    mode = g_enum_register_static ("GstKMSSyncMode", modes);
+  }
+  return mode;
+}
+
 static void
 gst_kms_sink_class_init (GstKMSSinkClass * klass)
 {
@@ -2335,6 +2376,15 @@ gst_kms_sink_class_init (GstKMSSinkClass * klass)
       "When enabled, scaling will respect original aspect ratio", TRUE,
       G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS);
 
+  if (g_getenv ("KMSSINK_DISABLE_VSYNC"))
+    DEFAULT_SYNC_MODE = GST_KMS_SYNC_NONE;
+
+  g_properties[PROP_SYNC_MODE] =
+      g_param_spec_enum ("sync-mode", "Sync mode",
+      "Prefered frame syncing mode",
+      GST_TYPE_KMS_SYNC_MODE, DEFAULT_SYNC_MODE,
+      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 ab70ec4..274351e 100644
--- a/sys/kms/gstkmssink.h
+++ b/sys/kms/gstkmssink.h
@@ -44,6 +44,14 @@ G_BEGIN_DECLS
 typedef struct _GstKMSSink GstKMSSink;
 typedef struct _GstKMSSinkClass GstKMSSinkClass;
 
+typedef enum
+{
+  GST_KMS_SYNC_AUTO = 0,
+  GST_KMS_SYNC_FLIP = 1,
+  GST_KMS_SYNC_VBLANK = 2,
+  GST_KMS_SYNC_NONE = 3,
+} GstKMSSyncMode;
+
 struct _GstKMSSink {
   GstVideoSink videosink;
 
@@ -98,6 +106,8 @@ struct _GstKMSSink {
   guintptr window_handle;
 
   gboolean keep_aspect;
+
+  GstKMSSyncMode sync_mode;
 };
 
 struct _GstKMSSinkClass {
-- 
2.20.1