summaryrefslogtreecommitdiff
path: root/recipes-multimedia/gstreamer/gstreamer1.0-plugins-bad/0025-Add-ion-dmabuf-support-in-gldownload.patch
diff options
context:
space:
mode:
Diffstat (limited to 'recipes-multimedia/gstreamer/gstreamer1.0-plugins-bad/0025-Add-ion-dmabuf-support-in-gldownload.patch')
-rw-r--r--recipes-multimedia/gstreamer/gstreamer1.0-plugins-bad/0025-Add-ion-dmabuf-support-in-gldownload.patch473
1 files changed, 473 insertions, 0 deletions
diff --git a/recipes-multimedia/gstreamer/gstreamer1.0-plugins-bad/0025-Add-ion-dmabuf-support-in-gldownload.patch b/recipes-multimedia/gstreamer/gstreamer1.0-plugins-bad/0025-Add-ion-dmabuf-support-in-gldownload.patch
new file mode 100644
index 0000000..66f78d9
--- /dev/null
+++ b/recipes-multimedia/gstreamer/gstreamer1.0-plugins-bad/0025-Add-ion-dmabuf-support-in-gldownload.patch
@@ -0,0 +1,473 @@
+From 7964e5dabf3f89b02a89ac775466de5b3dfab8a9 Mon Sep 17 00:00:00 2001
+From: Haihua Hu <jared.hu@nxp.com>
+Date: Fri, 25 Nov 2016 14:48:44 +0800
+Subject: [PATCH 23/26] Add ion dmabuf support in gldownload
+
+Support copy into dma-fb buffer if support the buffer format
+
+Upstream-Status: Inappropriate [i.MX specific]
+
+Signed-off-by: Haihua Hu <jared.hu@nxp.com>
+---
+ ext/gl/gstgldownloadelement.c | 36 +++++-
+ gst-libs/gst/gl/Makefile.am | 6 +
+ gst-libs/gst/gl/gstgl_fwd.h | 4 +
+ gst-libs/gst/gl/gstglmemorydma.c | 258 +++++++++++++++++++++++++++++++++++++++
+ gst-libs/gst/gl/gstglmemorydma.h | 76 ++++++++++++
+ 5 files changed, 376 insertions(+), 4 deletions(-)
+ create mode 100644 gst-libs/gst/gl/gstglmemorydma.c
+ create mode 100644 gst-libs/gst/gl/gstglmemorydma.h
+
+diff --git a/ext/gl/gstgldownloadelement.c b/ext/gl/gstgldownloadelement.c
+index 03f4479..1e6e728 100644
+--- a/ext/gl/gstgldownloadelement.c
++++ b/ext/gl/gstgldownloadelement.c
+@@ -29,6 +29,10 @@
+ #include <gst/gl/gstglphymemory.h>
+ #endif
+
++#if GST_GL_HAVE_IONDMA
++#include <gst/gl/gstglmemorydma.h>
++#endif
++
+ GST_DEBUG_CATEGORY_STATIC (gst_gl_download_element_debug);
+ #define GST_CAT_DEFAULT gst_gl_download_element_debug
+
+@@ -173,8 +177,22 @@ gst_gl_download_element_prepare_output_buffer (GstBaseTransform * bt,
+ gint i, n;
+ GstGLMemory *glmem;
+
+-#if GST_GL_HAVE_PHYMEM
+ glmem = gst_buffer_peek_memory (inbuf, 0);
++#if GST_GL_HAVE_IONDMA
++ if (gst_is_gl_memory_dma (glmem)) {
++ GstGLContext *context = GST_GL_BASE_FILTER (bt)->context;
++ GstVideoInfo info;
++
++ gst_video_info_from_caps (&info, src_caps);
++ *outbuf = gst_gl_memory_dma_buffer_to_gstbuffer (context, &info, inbuf);
++
++ GST_DEBUG_OBJECT (download, "gl download with dma buf.");
++
++ return GST_FLOW_OK;
++ }
++#endif
++
++#if GST_GL_HAVE_PHYMEM
+ if (gst_is_gl_physical_memory (glmem)) {
+ GstGLContext *context = GST_GL_BASE_FILTER (bt)->context;
+ GstVideoInfo info;
+@@ -233,6 +251,7 @@ gst_gl_download_element_propose_allocation (GstBaseTransform * bt,
+ GstCaps *caps;
+ GstStructure *config;
+ gsize size;
++ GstVideoFormat fmt;
+
+ gst_query_parse_allocation (query, &caps, NULL);
+ if (!gst_video_info_from_caps (&info, caps)) {
+@@ -240,12 +259,21 @@ gst_gl_download_element_propose_allocation (GstBaseTransform * bt,
+ return FALSE;
+ }
+
+- GST_DEBUG_OBJECT (bt, "video format is %s", gst_video_format_to_string (GST_VIDEO_INFO_FORMAT (&info)));
+-
+ gst_allocation_params_init (&params);
+
++ fmt = GST_VIDEO_INFO_FORMAT (&info);
++
++ GST_DEBUG_OBJECT (bt, "video format is %s", gst_video_format_to_string (fmt));
++
++#if GST_GL_HAVE_IONDMA
++ if (fmt == GST_VIDEO_FORMAT_RGBA || fmt == GST_VIDEO_FORMAT_RGB16) {
++ allocator = gst_gl_memory_dma_allocator_obtain ();
++ GST_DEBUG_OBJECT (bt, "obtain dma memory allocator %p.", allocator);
++ }
++#endif
++
+ #if GST_GL_HAVE_PHYMEM
+- if (gst_is_gl_physical_memory_supported_fmt (&info)) {
++ if (!allocator && gst_is_gl_physical_memory_supported_fmt (&info)) {
+ allocator = gst_phy_mem_allocator_obtain ();
+ GST_DEBUG_OBJECT (bt, "obtain physical memory allocator %p.", allocator);
+ }
+diff --git a/gst-libs/gst/gl/Makefile.am b/gst-libs/gst/gl/Makefile.am
+index 03ce1b0..b0b6655 100644
+--- a/gst-libs/gst/gl/Makefile.am
++++ b/gst-libs/gst/gl/Makefile.am
+@@ -137,6 +137,12 @@ libgstgl_@GST_API_VERSION@include_HEADERS += gstglphymemory.h
+ libgstgl_@GST_API_VERSION@_la_LIBADD += -lg2d
+ endif
+
++if HAVE_IONDMA
++libgstgl_@GST_API_VERSION@_la_SOURCES += gstglmemorydma.c
++libgstgl_@GST_API_VERSION@include_HEADERS += gstglmemorydma.h
++endif
++
++
+ configexecincludedir = $(libdir)/gstreamer-@GST_API_VERSION@/include/gst/gl
+ nodist_configexecinclude_HEADERS = $(built_sys_header_configure)
+
+diff --git a/gst-libs/gst/gl/gstgl_fwd.h b/gst-libs/gst/gl/gstgl_fwd.h
+index 8f42e8d..0f5957d 100644
+--- a/gst-libs/gst/gl/gstgl_fwd.h
++++ b/gst-libs/gst/gl/gstgl_fwd.h
+@@ -51,6 +51,10 @@ typedef struct _GstGLMemory GstGLMemory;
+ typedef struct _GstGLMemoryAllocator GstGLMemoryAllocator;
+ typedef struct _GstGLMemoryAllocatorClass GstGLMemoryAllocatorClass;
+
++typedef struct _GstGLMemoryDMA GstGLMemoryDMA;
++typedef struct _GstGLMemoryDMAAllocator GstGLMemoryDMAAllocator;
++typedef struct _GstGLMemoryDMAAllocatorClass GstGLMemoryDMAAllocatorClass;
++
+ typedef struct _GstGLMemoryPBO GstGLMemoryPBO;
+ typedef struct _GstGLMemoryPBOAllocator GstGLMemoryPBOAllocator;
+ typedef struct _GstGLMemoryPBOAllocatorClass GstGLMemoryPBOAllocatorClass;
+diff --git a/gst-libs/gst/gl/gstglmemorydma.c b/gst-libs/gst/gl/gstglmemorydma.c
+new file mode 100644
+index 0000000..8774e6a
+--- /dev/null
++++ b/gst-libs/gst/gl/gstglmemorydma.c
+@@ -0,0 +1,258 @@
++/*
++ * GStreamer
++ * Copyright (c) 2016, Freescale Semiconductor, Inc.
++ *
++ * This library is free software; you can redistribute it and/or
++ * modify it under the terms of the GNU Library General Public
++ * License as published by the Free Software Foundatdma; either
++ * versdma 2 of the License, or (at your option) any later version.
++ *
++ * This library is distributed in the hope that it will be useful,
++ * but WITHOUT ANY WARRANTY; without even the implied warranty of
++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
++ * Library General Public License for more details.
++ *
++ * You should have received a copy of the GNU Library General Public
++ * License along with this library; if not, write to the
++ * Free Software Foundatdma, Inc., 51 Franklin St, Fifth Floor,
++ * Boston, MA 02110-1301, USA.
++ */
++
++#ifdef HAVE_CONFIG_H
++#include "config.h"
++#endif
++
++#include <string.h>
++
++#include <gst/allocators/gstdmabuf.h>
++#include <gst/gl/gstglmemorydma.h>
++
++#if GST_GL_HAVE_IONDMA
++#include <gst/allocators/gstionmemory.h>
++#endif
++
++GST_DEBUG_CATEGORY_STATIC (GST_CAT_GL_DMA_MEMORY);
++#define GST_CAT_DEFAULT GST_CAT_GL_DMA_MEMORY
++
++#define parent_class gst_gl_memory_dma_allocator_parent_class
++G_DEFINE_TYPE (GstGLMemoryDMAAllocator, gst_gl_memory_dma_allocator,
++ GST_TYPE_GL_MEMORY_ALLOCATOR);
++
++static void
++gst_gl_memory_dma_init_instance (void)
++{
++ GstAllocator *ion_allocator = NULL;
++ GstGLMemoryDMAAllocator *_gl_allocator;
++
++ GST_DEBUG_CATEGORY_INIT (GST_CAT_GL_DMA_MEMORY, "glmemorydma", 0, "OpenGL dma memory");
++
++#if GST_GL_HAVE_IONDMA
++ ion_allocator = gst_ion_allocator_obtain();
++#endif
++
++ if (!ion_allocator)
++ return;
++
++ gst_gl_memory_init_once ();
++
++ _gl_allocator = (GstGLMemoryDMAAllocator *) g_object_new (GST_TYPE_GL_MEMORY_DMA_ALLOCATOR, NULL);
++ _gl_allocator->ion_allocator = ion_allocator;
++
++ gst_allocator_register (GST_GL_MEMORY_DMA_ALLOCATOR_NAME,
++ gst_object_ref (_gl_allocator));
++}
++
++GstAllocator *
++gst_gl_memory_dma_allocator_obtain (void)
++{
++
++ static GOnce once = G_ONCE_INIT;
++ GstAllocator *allocator;
++
++ g_once (&once, (GThreadFunc) gst_gl_memory_dma_init_instance, NULL);
++
++ allocator = gst_allocator_find (GST_GL_MEMORY_DMA_ALLOCATOR_NAME);
++ if (allocator == NULL)
++ GST_WARNING ("No allocator named %s found", GST_GL_MEMORY_DMA_ALLOCATOR_NAME);
++
++ return allocator;
++}
++
++static void
++gst_gl_memory_dma_allocator_dispose (GObject * object)
++{
++ GstGLMemoryDMAAllocator *gl_dma_alloc= GST_GL_MEMORY_DMA_ALLOCATOR (object);
++
++ if (gl_dma_alloc->ion_allocator) {
++ GST_DEBUG ("free ion allocator");
++ gst_object_unref (gl_dma_alloc->ion_allocator);
++ gl_dma_alloc->ion_allocator = NULL;
++ }
++
++ G_OBJECT_CLASS (parent_class)->dispose (object);
++}
++
++static gboolean
++_gl_mem_create (GstGLMemoryDMA * gl_mem, GError ** error)
++{
++ GstGLContext *context = gl_mem->mem.mem.context;
++ GstGLBaseMemoryAllocatorClass *alloc_class;
++ guint dma_fd;
++
++ alloc_class = GST_GL_BASE_MEMORY_ALLOCATOR_CLASS (parent_class);
++ if (!alloc_class->create ((GstGLBaseMemory *) gl_mem, error))
++ return FALSE;
++
++ dma_fd = gst_dmabuf_memory_get_fd ((GstMemory*) gl_mem->dma);
++
++ gl_mem->eglimage =
++ gst_egl_image_from_dmabuf (context, dma_fd, &gl_mem->mem.info, 0,0);
++
++ if (!gl_mem->eglimage) {
++ GST_CAT_ERROR (GST_CAT_GL_DMA_MEMORY, "Can't allocate eglimage memory");
++ return FALSE;
++ }
++
++ const GstGLFuncs *gl = context->gl_vtable;
++
++ gl->ActiveTexture (GL_TEXTURE0);
++ gl->BindTexture (GL_TEXTURE_2D, gl_mem->mem.tex_id);
++ gl->EGLImageTargetTexture2D (GL_TEXTURE_2D,
++ gst_egl_image_get_image (gl_mem->eglimage));
++
++ GST_CAT_DEBUG (GST_CAT_GL_DMA_MEMORY, "generated dma buffer %p fd %u texid %u",
++ gl_mem, dma_fd, gl_mem->mem.tex_id);
++
++ return TRUE;
++}
++
++static GstMemory *
++_gl_mem_alloc (GstAllocator * allocator, gsize size,
++ GstAllocationParams * params)
++{
++ g_warning ("Use gst_gl_base_memory_alloc () to allocate from this "
++ "GstGLMemoryDMA allocator");
++
++ return NULL;
++}
++
++static void
++_gl_mem_destroy (GstGLMemoryDMA * gl_mem)
++{
++ GST_CAT_DEBUG (GST_CAT_GL_DMA_MEMORY, "destroy gl dma buffer %p", gl_mem);
++
++ if (gl_mem->eglimage)
++ gst_egl_image_unref (gl_mem->eglimage);
++ gl_mem->eglimage = NULL;
++ if (gl_mem->dma)
++ gst_memory_unref (GST_MEMORY_CAST (gl_mem->dma));
++ gl_mem->dma = NULL;
++
++ GST_GL_BASE_MEMORY_ALLOCATOR_CLASS (parent_class)->destroy ((GstGLBaseMemory
++ *) gl_mem);
++}
++
++static GstGLMemoryDMA *
++_gl_mem_dma_alloc (GstGLBaseMemoryAllocator * allocator,
++ GstGLVideoAllocationParams * params)
++{
++ GstGLMemoryDMA *mem;
++ guint alloc_flags;
++ gsize size;
++ GstGLMemoryDMAAllocator *gl_dma_alloc = GST_GL_MEMORY_DMA_ALLOCATOR (allocator);
++
++ alloc_flags = params->parent.alloc_flags;
++
++ g_return_val_if_fail (alloc_flags & GST_GL_ALLOCATION_PARAMS_ALLOC_FLAG_VIDEO,
++ NULL);
++
++ mem = g_new0 (GstGLMemoryDMA, 1);
++
++ mem->params = params->parent.alloc_params;
++
++ size = gst_gl_get_plane_data_size (params->v_info, params->valign, params->plane);
++ mem->dma = gst_allocator_alloc (gl_dma_alloc->ion_allocator, size, mem->params);
++
++ if (!mem->dma) {
++ GST_CAT_ERROR (GST_CAT_GL_DMA_MEMORY, "Can't allocate dma memory size %d", size);
++ g_free(mem);
++ return NULL;
++ }
++
++ gst_gl_memory_init (GST_GL_MEMORY_CAST (mem), GST_ALLOCATOR_CAST (allocator),
++ NULL, params->parent.context, params->target, params->tex_format,
++ params->parent.alloc_params, params->v_info, params->plane,
++ params->valign, params->parent.user_data, params->parent.notify);
++
++ return mem;
++}
++
++static void
++gst_gl_memory_dma_allocator_class_init (GstGLMemoryDMAAllocatorClass * klass)
++{
++ GObjectClass *gobject_class = G_OBJECT_CLASS (klass);
++ GstGLBaseMemoryAllocatorClass *gl_base;
++ GstAllocatorClass *allocator_class;
++
++ gl_base = (GstGLBaseMemoryAllocatorClass *) klass;
++ allocator_class = (GstAllocatorClass *) klass;
++
++ gl_base->alloc = (GstGLBaseMemoryAllocatorAllocFunction) _gl_mem_dma_alloc;
++ gl_base->create = (GstGLBaseMemoryAllocatorCreateFunction) _gl_mem_create;
++ gl_base->destroy = (GstGLBaseMemoryAllocatorDestroyFunction) _gl_mem_destroy;
++ gobject_class->dispose = GST_DEBUG_FUNCPTR (gst_gl_memory_dma_allocator_dispose);
++
++ allocator_class->alloc = _gl_mem_alloc;
++}
++
++static void
++gst_gl_memory_dma_allocator_init (GstGLMemoryDMAAllocator * allocator)
++{
++ GstAllocator *alloc = GST_ALLOCATOR_CAST (allocator);
++
++ alloc->mem_type = GST_GL_MEMORY_DMA_ALLOCATOR_NAME;
++
++ GST_OBJECT_FLAG_SET (allocator, GST_ALLOCATOR_FLAG_CUSTOM_ALLOC);
++}
++
++gboolean
++gst_is_gl_memory_dma (GstMemory * mem)
++{
++ return mem != NULL && mem->allocator != NULL
++ && g_type_is_a (G_OBJECT_TYPE (mem->allocator),
++ GST_TYPE_GL_MEMORY_DMA_ALLOCATOR);
++}
++
++static void
++_finish_texture (GstGLContext * ctx, gpointer *data)
++{
++ GstGLFuncs *gl = ctx->gl_vtable;
++
++ gl->Finish ();
++}
++
++GstBuffer *
++gst_gl_memory_dma_buffer_to_gstbuffer (GstGLContext *ctx, GstVideoInfo * info,
++ GstBuffer * glbuf)
++{
++ GstBuffer *buf;
++ GstGLMemoryDMA *glmem;
++
++ gst_gl_context_thread_add (ctx, (GstGLContextThreadFunc) _finish_texture, NULL);
++
++ glmem = gst_buffer_peek_memory (glbuf, 0);
++
++ buf = gst_buffer_new ();
++ gst_buffer_append_memory (buf, (GstMemory *) glmem->dma);
++ gst_memory_ref ((GstMemory *)glmem->dma);
++
++ gst_buffer_add_video_meta_full (buf, 0,
++ GST_VIDEO_INFO_FORMAT (info), GST_VIDEO_INFO_WIDTH (info),
++ GST_VIDEO_INFO_HEIGHT (info), 1, info->offset, info->stride);
++ GST_BUFFER_FLAGS (buf) = GST_BUFFER_FLAGS (glbuf);
++ GST_BUFFER_PTS (buf) = GST_BUFFER_PTS (glbuf);
++ GST_BUFFER_DTS (buf) = GST_BUFFER_DTS (glbuf);
++ GST_BUFFER_DURATION (buf) = GST_BUFFER_DURATION (glbuf);
++
++ return buf;
++}
+diff --git a/gst-libs/gst/gl/gstglmemorydma.h b/gst-libs/gst/gl/gstglmemorydma.h
+new file mode 100644
+index 0000000..f63442a
+--- /dev/null
++++ b/gst-libs/gst/gl/gstglmemorydma.h
+@@ -0,0 +1,76 @@
++/*
++ * GStreamer
++ * Copyright (c) 2016, Freescale Semiconductor, Inc.
++ *
++ * This library is free software; you can redistribute it and/or
++ * modify it under the terms of the GNU Library General Public
++ * License as published by the Free Software Foundatdma; either
++ * versdma 2 of the License, or (at your optdma) any later versdma.
++ *
++ * This library is distributed in the hope that it will be useful,
++ * but WITHOUT ANY WARRANTY; without even the implied warranty of
++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
++ * Library General Public License for more details.
++ *
++ * You should have received a copy of the GNU Library General Public
++ * License along with this library; if not, write to the
++ * Free Software Foundatdma, Inc., 51 Franklin St, Fifth Floor,
++ * Boston, MA 02110-1301, USA.
++ */
++
++#ifndef _GST_GL_MEMORY_DMA_H_
++#define _GST_GL_MEMORY_DMA_H_
++
++#include <gst/gst.h>
++#include <gst/gstallocator.h>
++#include <gst/gstmemory.h>
++#include <gst/video/video.h>
++
++#include <gst/gl/gl.h>
++#include <gst/gl/egl/gstglcontext_egl.h>
++#include <gst/gl/egl/gsteglimage.h>
++
++#include <gst/gl/gstglmemory.h>
++
++G_BEGIN_DECLS
++
++#define GST_TYPE_GL_MEMORY_DMA_ALLOCATOR (gst_gl_memory_dma_allocator_get_type())
++GType gst_gl_memory_dma_allocator_get_type(void);
++
++#define GST_IS_GL_MEMORY_DMA_ALLOCATOR(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GST_TYPE_GL_MEMORY_DMA_ALLOCATOR))
++#define GST_IS_GL_MEMORY_DMA_ALLOCATOR_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), GST_TYPE_GL_MEMORY_DMA_ALLOCATOR))
++#define GST_GL_MEMORY_DMA_ALLOCATOR_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), GST_TYPE_GL_MEMORY_DMA_ALLOCATOR, GstGLMemoryDMAAllocatorClass))
++#define GST_GL_MEMORY_DMA_ALLOCATOR(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), GST_TYPE_GL_MEMORY_DMA_ALLOCATOR, GstGLMemoryDMAAllocator))
++#define GST_GL_MEMORY_DMA_ALLOCATOR_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), GST_TYPE_GL_MEMORY_DMA_ALLOCATOR, GstGLAllocatorClass))
++#define GST_GL_MEMORY_DMA_ALLOCATOR_CAST(obj) ((GstGLMemoryDMAAllocator *)(obj))
++
++struct _GstGLMemoryDMA
++{
++ GstGLMemory mem;
++
++ /* <private> */
++ GstEGLImage *eglimage;
++ GstMemory *dma;
++ GstAllocationParams *params;
++};
++
++#define GST_GL_MEMORY_DMA_ALLOCATOR_NAME "GLMemoryDMA"
++
++struct _GstGLMemoryDMAAllocator
++{
++ GstGLMemoryAllocator parent;
++ GstAllocator *ion_allocator;
++};
++
++struct _GstGLMemoryDMAAllocatorClass
++{
++ GstGLMemoryAllocatorClass parent_class;
++};
++
++GstAllocator *gst_gl_memory_dma_allocator_obtain (void);
++gboolean gst_is_gl_memory_dma (GstMemory * mem);
++GstBuffer * gst_gl_memory_dma_buffer_to_gstbuffer (GstGLContext * ctx, GstVideoInfo * info, GstBuffer * glbuf);
++
++G_END_DECLS
++
++#endif /* _GST_GL_MEMORY_DMA_H_ */
+--
+1.9.1
+