new/yocto/meta-rockchip/recipes-multimedia/gstreamer/gstreamer1.0-plugins-bad_1.20/0030-kmssink-Support-setting-prefered-frame-syncing-mode.patch

180 lines
5.4 KiB
Diff
Raw Normal View History

2025-05-10 21:58:58 +08:00
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