linuxOS_AP06/buildroot/package/gstreamer1/gst1-plugins-bad/0045-kmssink-Try-to-modeset-with-video-buffer.patch
2025-06-03 12:28:32 +08:00

97 lines
2.7 KiB
Diff

From 523675e1a31e349e6d60d95a7aa55d7bbc387544 Mon Sep 17 00:00:00 2001
From: Jeffy Chen <jeffy.chen@rock-chips.com>
Date: Fri, 12 Apr 2024 16:44:09 +0800
Subject: [PATCH 45/48] kmssink: Try to modeset with video buffer
To avoid the initial black screen.
Signed-off-by: Jeffy Chen <jeffy.chen@rock-chips.com>
---
sys/kms/gstkmssink.c | 24 ++++++++++++++++++------
1 file changed, 18 insertions(+), 6 deletions(-)
diff --git a/sys/kms/gstkmssink.c b/sys/kms/gstkmssink.c
index 9c62629..3c22292 100644
--- a/sys/kms/gstkmssink.c
+++ b/sys/kms/gstkmssink.c
@@ -969,14 +969,13 @@ ensure_kms_allocator (GstKMSSink * self)
}
static gboolean
-configure_mode_setting (GstKMSSink * self, GstVideoInfo * vinfo)
+configure_mode_setting (GstKMSSink * self, GstVideoInfo * vinfo, guint32 fb_id)
{
gboolean ret;
drmModeConnector *conn;
int err;
gint i;
drmModeModeInfo *mode, *preferred;
- guint32 fb_id;
GstKMSMemory *kmsmem;
GstVideoInfo *info;
@@ -1004,6 +1003,10 @@ configure_mode_setting (GstKMSSink * self, GstVideoInfo * vinfo)
mode = &conn->modes[i];
}
+ if (mode && fb_id)
+ goto try_orig;
+
+retry_tmp:
if (preferred && (self->can_scale || !mode))
mode = preferred;
@@ -1025,10 +1028,15 @@ configure_mode_setting (GstKMSSink * self, GstVideoInfo * vinfo)
goto bo_failed;
fb_id = kmsmem->fb_id;
+try_orig:
err = drmModeSetCrtc (self->fd, self->crtc_id, fb_id, 0, 0,
(uint32_t *) & self->conn_id, 1, mode);
- if (err)
+ if (err) {
+ if (!kmsmem)
+ goto retry_tmp;
+
goto modesetting_failed;
+ }
self->hdisplay = mode->hdisplay;
self->vdisplay = mode->vdisplay;
@@ -2414,17 +2422,20 @@ gst_kms_sink_show_frame (GstVideoSink * vsink, GstBuffer * buf)
GST_TRACE_OBJECT (self, "displaying fb %d", fb_id);
GST_OBJECT_LOCK (self);
+ crop = gst_buffer_get_video_crop_meta (buffer);
retry_set_plane:
+
if (self->modesetting_enabled && !self->mode_valid) {
- if (!configure_mode_setting (self, vinfo))
+ if (!configure_mode_setting (self, vinfo,
+ (!crop && self->fullscreen) ? fb_id : 0))
goto modesetting_failed;
src.w = GST_VIDEO_SINK_WIDTH (self);
src.h = GST_VIDEO_SINK_HEIGHT (self);
}
- if ((crop = gst_buffer_get_video_crop_meta (buffer))) {
+ if (crop) {
GstVideoInfo cropped_vinfo = *vinfo;
video_width = src.w = cropped_vinfo.width = crop->width;
@@ -2507,7 +2518,8 @@ retry_set_plane:
self->can_scale = FALSE;
if (self->modesetting_enabled) {
- if (!configure_mode_setting (self, vinfo))
+ if (!configure_mode_setting (self, vinfo,
+ (!crop && self->fullscreen) ? fb_id : 0))
goto modesetting_failed;
src.w = GST_VIDEO_SINK_WIDTH (self);
--
2.20.1