From 523675e1a31e349e6d60d95a7aa55d7bbc387544 Mon Sep 17 00:00:00 2001 From: Jeffy Chen 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 --- 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