summaryrefslogtreecommitdiff
path: root/recipes-multimedia/gstreamer/gstreamer1.0-plugins-bad/0030-kmssink-check-scaleable-when-set_caps.patch
diff options
context:
space:
mode:
Diffstat (limited to 'recipes-multimedia/gstreamer/gstreamer1.0-plugins-bad/0030-kmssink-check-scaleable-when-set_caps.patch')
-rw-r--r--recipes-multimedia/gstreamer/gstreamer1.0-plugins-bad/0030-kmssink-check-scaleable-when-set_caps.patch74
1 files changed, 74 insertions, 0 deletions
diff --git a/recipes-multimedia/gstreamer/gstreamer1.0-plugins-bad/0030-kmssink-check-scaleable-when-set_caps.patch b/recipes-multimedia/gstreamer/gstreamer1.0-plugins-bad/0030-kmssink-check-scaleable-when-set_caps.patch
new file mode 100644
index 0000000..691ac84
--- /dev/null
+++ b/recipes-multimedia/gstreamer/gstreamer1.0-plugins-bad/0030-kmssink-check-scaleable-when-set_caps.patch
@@ -0,0 +1,74 @@
+From b1886be721be792c98f17af31dd8c144754e05be Mon Sep 17 00:00:00 2001
+From: Haihua Hu <jared.hu@nxp.com>
+Date: Wed, 12 Jul 2017 10:17:18 +0800
+Subject: [PATCH 3/3] [MMFMWK-7567] kmssink: check scaleable when set_caps
+
+when video size is same as display resolution, show frame will not do
+retry because the setplane will never fail. But the scale result is not
+correct. We can do this check by set a fake plane.
+
+Upstream-Status: Inappropriate [i.MX specific]
+
+---
+ sys/kms/gstkmssink.c | 38 ++++++++++++++++++++++++++++++++++++++
+ 1 file changed, 38 insertions(+)
+
+diff --git a/sys/kms/gstkmssink.c b/sys/kms/gstkmssink.c
+index 6d9b765..65fdc4f 100644
+--- a/sys/kms/gstkmssink.c
++++ b/sys/kms/gstkmssink.c
+@@ -402,6 +402,42 @@ get_drm_caps (GstKMSSink * self)
+ return TRUE;
+ }
+
++static void
++check_scaleable (GstKMSSink * self)
++{
++ gint result;
++ guint32 fb_id;
++ guint32 width, height;
++ GstKMSMemory *kmsmem = NULL;
++
++ if (!self->can_scale)
++ return;
++
++ if (self->conn_id < 0)
++ return;
++
++ kmsmem = (GstKMSMemory *) gst_kms_allocator_bo_alloc (self->allocator, &self->vinfo);
++ if (!kmsmem)
++ return;
++
++ fb_id = kmsmem->fb_id;
++
++ GST_INFO_OBJECT (self, "checking scaleable");
++
++ width = GST_VIDEO_INFO_WIDTH (&self->vinfo);
++ height = GST_VIDEO_INFO_HEIGHT (&self->vinfo);
++
++ result = drmModeSetPlane (self->fd, self->plane_id, self->crtc_id, fb_id, 0,
++ 0, 0, width/2, height/2,
++ 0, 0, width << 16, height << 16);
++ if (result) {
++ self->can_scale = FALSE;
++ GST_INFO_OBJECT (self, "scale is not support");
++ }
++
++ g_clear_pointer (&kmsmem, gst_memory_unref);
++}
++
+ static gboolean
+ configure_mode_setting (GstKMSSink * self, GstVideoInfo * vinfo)
+ {
+@@ -977,6 +1013,8 @@ gst_kms_sink_set_caps (GstBaseSink * bsink, GstCaps * caps)
+
+ self->vinfo = vinfo;
+
++ check_scaleable (self);
++
+ GST_OBJECT_LOCK (self);
+ if (self->reconfigure) {
+ self->reconfigure = FALSE;
+--
+1.9.1
+