summaryrefslogtreecommitdiff
path: root/recipes-multimedia/gstreamer/gstreamer1.0-plugins-bad/0029-kmssink-support-videooverlay-interface.patch
diff options
context:
space:
mode:
Diffstat (limited to 'recipes-multimedia/gstreamer/gstreamer1.0-plugins-bad/0029-kmssink-support-videooverlay-interface.patch')
-rw-r--r--recipes-multimedia/gstreamer/gstreamer1.0-plugins-bad/0029-kmssink-support-videooverlay-interface.patch343
1 files changed, 0 insertions, 343 deletions
diff --git a/recipes-multimedia/gstreamer/gstreamer1.0-plugins-bad/0029-kmssink-support-videooverlay-interface.patch b/recipes-multimedia/gstreamer/gstreamer1.0-plugins-bad/0029-kmssink-support-videooverlay-interface.patch
deleted file mode 100644
index 7bf995f..0000000
--- a/recipes-multimedia/gstreamer/gstreamer1.0-plugins-bad/0029-kmssink-support-videooverlay-interface.patch
+++ /dev/null
@@ -1,343 +0,0 @@
-From a1affa1293e31870d6fb9dda85e4c648cc4dd247 Mon Sep 17 00:00:00 2001
-From: Haihua Hu <jared.hu@nxp.com>
-Date: Tue, 20 Jun 2017 13:11:27 +0800
-Subject: [PATCH 2/3] [MMFMWK-7567] kmssink: support videooverlay interface
-
-Implement videooverlay interface in kmssink, divided into two cases:
-when driver supports scale, then we do refresh in show_frame(); if
-not, send a reconfigure event to upstream and re-negotiate, using the
-new size.
-
-Upstream-Status: Backport [1.13.1]
-https://bugzilla.gnome.org/show_bug.cgi?id=784599
----
- sys/kms/gstkmssink.c | 164 ++++++++++++++++++++++++++++++++++++++++++++++++---
- sys/kms/gstkmssink.h | 12 ++++
- 2 files changed, 167 insertions(+), 9 deletions(-)
-
-diff --git a/sys/kms/gstkmssink.c b/sys/kms/gstkmssink.c
-index e91c211..6d9b765 100644
---- a/sys/kms/gstkmssink.c
-+++ b/sys/kms/gstkmssink.c
-@@ -43,6 +43,7 @@
- #endif
-
- #include <gst/video/video.h>
-+#include <gst/video/videooverlay.h>
- #include <gst/allocators/gstdmabuf.h>
-
- #include <drm.h>
-@@ -66,11 +67,17 @@ GST_DEBUG_CATEGORY_STATIC (gst_kms_sink_debug);
- GST_DEBUG_CATEGORY_STATIC (CAT_PERFORMANCE);
- #define GST_CAT_DEFAULT gst_kms_sink_debug
-
-+static GstFlowReturn gst_kms_sink_show_frame (GstVideoSink * vsink,
-+ GstBuffer * buf);
-+static void gst_kms_sink_video_overlay_init (GstVideoOverlayInterface * iface);
-+
- #define parent_class gst_kms_sink_parent_class
- G_DEFINE_TYPE_WITH_CODE (GstKMSSink, gst_kms_sink, GST_TYPE_VIDEO_SINK,
- GST_DEBUG_CATEGORY_INIT (GST_CAT_DEFAULT, GST_PLUGIN_NAME, 0,
- GST_PLUGIN_DESC);
-- GST_DEBUG_CATEGORY_GET (CAT_PERFORMANCE, "GST_PERFORMANCE"));
-+ GST_DEBUG_CATEGORY_GET (CAT_PERFORMANCE, "GST_PERFORMANCE");
-+ G_IMPLEMENT_INTERFACE (GST_TYPE_VIDEO_OVERLAY,
-+ gst_kms_sink_video_overlay_init));
-
- enum
- {
-@@ -83,6 +90,79 @@ enum
-
- static GParamSpec *g_properties[PROP_N] = { NULL, };
-
-+static void
-+gst_kms_sink_set_render_rectangle (GstVideoOverlay * overlay,
-+ gint x, gint y, gint width, gint height)
-+{
-+ GstKMSSink *self = GST_KMS_SINK (overlay);
-+
-+ if (width <= 0 || height <= 0) {
-+ if (width == -1 && height == -1) {
-+ x = 0;
-+ y = 0;
-+ width = self->hdisplay;
-+ height = self->vdisplay;
-+ goto commit;
-+ }
-+ return;
-+ }
-+
-+commit:
-+ GST_OBJECT_LOCK (self);
-+ if (self->can_scale) {
-+ self->preferred_rect.x = x;
-+ self->preferred_rect.y = y;
-+ self->preferred_rect.w = width;
-+ self->preferred_rect.h = height;
-+ } else {
-+ GstVideoRectangle src = { 0, };
-+ GstVideoRectangle dst = { 0, };
-+ GstVideoRectangle result;
-+
-+ src.w = self->original_width;
-+ src.h = self->original_heigth;
-+
-+ dst.w = width;
-+ dst.h = height;
-+
-+ gst_video_sink_center_rect (src, dst, &result, TRUE);
-+
-+ self->pending_rect.x = x + result.x;
-+ self->pending_rect.y = y + result.y;
-+ self->pending_rect.w = result.w;
-+ self->pending_rect.h = result.h;
-+
-+ GST_DEBUG_OBJECT (self, "pending resize to (%d,%d)-(%dx%d)",
-+ self->pending_rect.x, self->pending_rect.y,
-+ self->pending_rect.w, self->pending_rect.h);
-+ }
-+ GST_OBJECT_UNLOCK (self);
-+}
-+
-+static void
-+gst_kms_sink_expose (GstVideoOverlay * overlay)
-+{
-+ GstKMSSink *self = GST_KMS_SINK (overlay);
-+
-+ if (self->can_scale) {
-+ gst_kms_sink_show_frame (GST_VIDEO_SINK (self), NULL);
-+ } else {
-+ GST_OBJECT_LOCK (self);
-+ self->reconfigure = TRUE;
-+ GST_OBJECT_UNLOCK (self);
-+
-+ gst_pad_push_event (GST_BASE_SINK (self)->sinkpad,
-+ gst_event_new_reconfigure ());
-+ }
-+}
-+
-+static void
-+gst_kms_sink_video_overlay_init (GstVideoOverlayInterface * iface)
-+{
-+ iface->expose = gst_kms_sink_expose;
-+ iface->set_render_rectangle = gst_kms_sink_set_render_rectangle;
-+}
-+
- static int
- kms_open (gchar ** driver)
- {
-@@ -539,7 +619,7 @@ gst_kms_sink_start (GstBaseSink * bsink)
- if (!get_drm_caps (self))
- goto bail;
-
-- self->can_scale = TRUE;
-+ //self->can_scale = TRUE;
-
- res = drmModeGetResources (self->fd);
- if (!res)
-@@ -588,8 +668,10 @@ retry_find_plane:
- GST_INFO_OBJECT (self, "connector id = %d / crtc id = %d / plane id = %d",
- self->conn_id, self->crtc_id, self->plane_id);
-
-- self->hdisplay = crtc->mode.hdisplay;
-- self->vdisplay = crtc->mode.vdisplay;
-+ self->preferred_rect.x = 0;
-+ self->preferred_rect.y = 0;
-+ self->hdisplay = self->preferred_rect.w = crtc->mode.hdisplay;
-+ self->vdisplay = self->preferred_rect.h = crtc->mode.vdisplay;
- self->buffer_id = crtc->buffer_id;
-
- self->mm_width = conn->mmWidth;
-@@ -602,6 +684,9 @@ retry_find_plane:
- gst_poll_add_fd (self->poll, &self->pollfd);
- gst_poll_fd_ctl_read (self->poll, &self->pollfd, TRUE);
-
-+ self->original_width = -1;
-+ self->original_heigth = -1;
-+
- ret = TRUE;
-
- bail:
-@@ -731,17 +816,29 @@ static GstCaps *
- gst_kms_sink_get_caps (GstBaseSink * bsink, GstCaps * filter)
- {
- GstKMSSink *self;
-- GstCaps *caps, *out_caps;
-+ GstCaps *caps, *out_caps, *tmp;
-
- self = GST_KMS_SINK (bsink);
-
- caps = gst_kms_sink_get_allowed_caps (self);
-+
-+ GST_OBJECT_LOCK (self);
-+ if (caps && self->reconfigure) {
-+ tmp = gst_caps_copy (caps);
-+ gst_caps_set_simple (tmp, "width", G_TYPE_INT, self->pending_rect.w,
-+ "height", G_TYPE_INT, self->pending_rect.h, NULL);
-+ gst_caps_append (tmp, caps);
-+ caps = tmp;
-+ }
-+ GST_OBJECT_UNLOCK (self);
-+
- if (caps && filter) {
- out_caps = gst_caps_intersect_full (caps, filter, GST_CAPS_INTERSECT_FIRST);
- gst_caps_unref (caps);
- } else {
- out_caps = caps;
- }
-+ GST_DEBUG_OBJECT (self, "out caps %" GST_PTR_FORMAT, out_caps);
-
- return out_caps;
- }
-@@ -880,6 +977,19 @@ gst_kms_sink_set_caps (GstBaseSink * bsink, GstCaps * caps)
-
- self->vinfo = vinfo;
-
-+ GST_OBJECT_LOCK (self);
-+ if (self->reconfigure) {
-+ self->reconfigure = FALSE;
-+ self->preferred_rect = self->pending_rect;
-+ }
-+ GST_OBJECT_UNLOCK (self);
-+
-+ /* initialize original video size */
-+ if (self->original_width < 0) {
-+ self->original_width = GST_VIDEO_INFO_WIDTH (&self->vinfo);
-+ self->original_heigth = GST_VIDEO_INFO_HEIGHT (&self->vinfo);
-+ }
-+
- GST_DEBUG_OBJECT (self, "negotiated caps = %" GST_PTR_FORMAT, caps);
-
- return TRUE;
-@@ -1258,7 +1368,13 @@ gst_kms_sink_show_frame (GstVideoSink * vsink, GstBuffer * buf)
-
- res = GST_FLOW_ERROR;
-
-- buffer = gst_kms_sink_get_input_buffer (self, buf);
-+ buffer = NULL;
-+
-+ if (buf)
-+ buffer = gst_kms_sink_get_input_buffer (self, buf);
-+ else if (self->last_buffer)
-+ buffer = gst_buffer_ref (self->last_buffer);
-+
- if (!buffer)
- return GST_FLOW_ERROR;
- fb_id = gst_kms_memory_get_fb_id (gst_buffer_peek_memory (buffer, 0));
-@@ -1267,6 +1383,7 @@ gst_kms_sink_show_frame (GstVideoSink * vsink, GstBuffer * buf)
-
- GST_TRACE_OBJECT (self, "displaying fb %d", fb_id);
-
-+ GST_OBJECT_LOCK (self);
- if (self->modesetting_enabled) {
- self->buffer_id = fb_id;
- goto sync_frame;
-@@ -1287,12 +1404,15 @@ gst_kms_sink_show_frame (GstVideoSink * vsink, GstBuffer * buf)
- src.w = GST_VIDEO_SINK_WIDTH (self);
- src.h = GST_VIDEO_SINK_HEIGHT (self);
-
-- dst.w = self->hdisplay;
-- dst.h = self->vdisplay;
-+ dst.w = self->preferred_rect.w;
-+ dst.h = self->preferred_rect.h;
-
- retry_set_plane:
- gst_video_sink_center_rect (src, dst, &result, self->can_scale);
-
-+ result.x += self->preferred_rect.x;
-+ result.y += self->preferred_rect.y;
-+
- if (crop) {
- src.w = crop->width;
- src.h = crop->height;
-@@ -1301,6 +1421,27 @@ retry_set_plane:
- src.h = GST_VIDEO_INFO_HEIGHT (&self->vinfo);
- }
-
-+ /* handle out of screen case */
-+ if ((result.x + result.w) > self->hdisplay)
-+ src.w = self->hdisplay - result.x;
-+
-+ if ((result.y + result.h) > self->vdisplay)
-+ src.h = self->vdisplay - result.y;
-+
-+ if (src.w <= 0 || src.h <= 0) {
-+ GST_WARNING_OBJECT (self, "video is out of display range");
-+ goto sync_frame;
-+ }
-+ GST_TRACE_OBJECT (self,
-+ "before drmModeSetPlane at (%i,%i) %ix%i sourcing at (%i,%i) %ix%i",
-+ result.x, result.y, result.w, result.h, src.x, src.y, src.w, src.h);
-+
-+ /* to make sure it can be show when driver don't support scale */
-+ if (!self->can_scale) {
-+ result.w = src.w;
-+ result.h = src.h;
-+ }
-+
- GST_TRACE_OBJECT (self,
- "drmModeSetPlane at (%i,%i) %ix%i sourcing at (%i,%i) %ix%i",
- result.x, result.y, result.w, result.h, src.x, src.y, src.w, src.h);
-@@ -1322,9 +1463,11 @@ sync_frame:
- if (!gst_kms_sink_sync (self))
- goto bail;
-
-- gst_buffer_replace (&self->last_buffer, buffer);
-+ if (buffer != self->last_buffer)
-+ gst_buffer_replace (&self->last_buffer, buffer);
- g_clear_pointer (&self->tmp_kmsmem, gst_memory_unref);
-
-+ GST_OBJECT_UNLOCK (self);
- res = GST_FLOW_OK;
-
- bail:
-@@ -1339,6 +1482,7 @@ buffer_invalid:
- }
- set_plane_failed:
- {
-+ GST_OBJECT_UNLOCK (self);
- GST_DEBUG_OBJECT (self, "result = { %d, %d, %d, %d} / "
- "src = { %d, %d, %d %d } / dst = { %d, %d, %d %d }", result.x, result.y,
- result.w, result.h, src.x, src.y, src.w, src.h, dst.x, dst.y, dst.w,
-@@ -1349,6 +1493,7 @@ set_plane_failed:
- }
- no_disp_ratio:
- {
-+ GST_OBJECT_UNLOCK (self);
- GST_ELEMENT_ERROR (self, CORE, NEGOTIATION, (NULL),
- ("Error calculating the output display ratio of the video."));
- goto bail;
-@@ -1427,6 +1572,7 @@ gst_kms_sink_init (GstKMSSink * sink)
- sink->fd = -1;
- sink->conn_id = -1;
- sink->plane_id = -1;
-+ sink->can_scale = TRUE;
- gst_poll_fd_init (&sink->pollfd);
- sink->poll = gst_poll_new (TRUE);
- gst_video_info_init (&sink->vinfo);
-diff --git a/sys/kms/gstkmssink.h b/sys/kms/gstkmssink.h
-index f2ab4d4..44476e1 100644
---- a/sys/kms/gstkmssink.h
-+++ b/sys/kms/gstkmssink.h
-@@ -79,6 +79,18 @@ struct _GstKMSSink {
-
- GstPoll *poll;
- GstPollFD pollfd;
-+
-+ /* preferred video rectangle */
-+ GstVideoRectangle preferred_rect;
-+
-+ /* reconfigure info if driver doesn't scale */
-+ GstVideoRectangle pending_rect;
-+ gboolean reconfigure;
-+
-+ /* kept original video size */
-+ gint original_width;
-+ gint original_heigth;
-+
- };
-
- struct _GstKMSSinkClass {
---
-1.9.1
-