diff --git a/package/gstreamer1/gst1-plugins-bad/0004-kmssink-bind-vaild-buffer.patch b/package/gstreamer1/gst1-plugins-bad/0004-kmssink-bind-vaild-buffer.patch new file mode 100644 index 00000000..89b549d4 --- /dev/null +++ b/package/gstreamer1/gst1-plugins-bad/0004-kmssink-bind-vaild-buffer.patch @@ -0,0 +1,88 @@ +kmssink plugin bind vaild buffer when enable drm pipeline. + +Signed-off-by: Leo Lu + +diff -pruN a/sys/kms/gstkmssink.c b/sys/kms/gstkmssink.c +--- a/sys/kms/gstkmssink.c 2023-05-08 11:08:39.273491472 +0800 ++++ b/sys/kms/gstkmssink.c 2023-05-08 10:56:22.825058287 +0800 +@@ -426,14 +426,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; +- guint32 fb_id; + GstKMSMemory *kmsmem; + + ret = FALSE; +@@ -450,7 +449,6 @@ configure_mode_setting (GstKMSSink * sel + 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) +@@ -1150,8 +1148,6 @@ gst_kms_sink_set_caps (GstBaseSink * bsi + self->pool = NULL; + } + +- if (self->modesetting_enabled && !configure_mode_setting (self, &vinfo)) +- goto modesetting_failed; + + GST_OBJECT_LOCK (self); + if (self->reconfigure) { +@@ -1185,13 +1181,6 @@ no_disp_ratio: + return FALSE; + } + +-modesetting_failed: +- { +- GST_ELEMENT_ERROR (self, CORE, NEGOTIATION, (NULL), +- ("failed to configure video mode")); +- return FALSE; +- } +- + } + + static gboolean +@@ -1578,6 +1567,7 @@ gst_kms_sink_show_frame (GstVideoSink * + GstVideoRectangle dst = { 0, }; + GstVideoRectangle result; + GstFlowReturn res; ++ static bool configure_flag = FALSE; + + self = GST_KMS_SINK (vsink); + +@@ -1609,6 +1599,11 @@ gst_kms_sink_show_frame (GstVideoSink * + GST_OBJECT_LOCK (self); + if (self->modesetting_enabled) { + self->buffer_id = fb_id; ++ if ( !configure_flag && !configure_mode_setting (self, &self->vinfo, self->buffer_id)) { ++ configure_flag = TRUE; ++ goto modesetting_failed; ++ } ++ configure_flag = TRUE; + goto sync_frame; + } + +@@ -1724,6 +1719,13 @@ no_disp_ratio: + ("Error calculating the output display ratio of the video.")); + goto bail; + } ++ ++modesetting_failed: ++ { ++ GST_ELEMENT_ERROR (self, CORE, NEGOTIATION, (NULL), ++ ("failed to configure video mode")); ++ return GST_FLOW_ERROR; ++ } + } + + static void