* [meta-arago 0/4] GStreamer 1.0 adapatations for TI Platforms
@ 2015-03-03 15:59 Karthik Ramanan
2015-03-03 15:59 ` [meta-arago 1/4] gstreamer1.0-plugins-base: Add DMA Buf support Karthik Ramanan
` (5 more replies)
0 siblings, 6 replies; 11+ messages in thread
From: Karthik Ramanan @ 2015-03-03 15:59 UTC (permalink / raw)
To: meta-arago
Difference from v1:
* Add gst-plugins-ducati for GST 1.x
* Add gst-plugins-vpe for GST 1.x
* Add FILES_PN explicitly for all GST 1.x recipes
Karthik Ramanan (4):
gstreamer1.0-plugins-base: Add DMA Buf support
gstreamer1.0-plugins-good: Add DMABuf support v4l2src
gstreamer1.0-plugins-bad: Add various features
gstreamer1.0-plugins-ti: Add ducati and vpe GST plugins
.../gstreamer1.0-plugins-ducati_git.bb | 10 +
.../gst-plugins-ti/gstreamer1.0-plugins-ti.inc | 19 +
.../gst-plugins-ti/gstreamer1.0-plugins-vpe_git.bb | 11 +
.../0001-Added-GstDRMBufferPool-support.patch | 774 +++++++++++
...odified-waylandsink-to-accept-NV12-format.patch | 1017 ++++++++++++++
.../0003-Added-KMSsink-support.patch | 1457 ++++++++++++++++++++
...04-waylandsink-Removed-dependency-on-dri2.patch | 26 +
...vc1parse-and-jpegparse-Fixes-plugin-ranks.patch | 54 +
.../gstreamer1.0-plugins-bad_1.2.3.bbappend | 14 +
.../0001-Added-GstMetaDmaBuf-features.patch | 441 ++++++
.../gstreamer1.0-plugins-base_1.2.3.bbappend | 8 +
...ST_V4L2_IO_DMABUF-mode-support-in-capture.patch | 298 ++++
.../gstreamer1.0-plugins-good_1.2.3.bbappend | 8 +
13 files changed, 4137 insertions(+)
create mode 100644 meta-arago-extras/recipes-multimedia/gst-plugins-ti/gstreamer1.0-plugins-ducati_git.bb
create mode 100644 meta-arago-extras/recipes-multimedia/gst-plugins-ti/gstreamer1.0-plugins-ti.inc
create mode 100644 meta-arago-extras/recipes-multimedia/gst-plugins-ti/gstreamer1.0-plugins-vpe_git.bb
create mode 100644 meta-arago-extras/recipes-multimedia/gstreamer/gstreamer1.0-plugins-bad/0001-Added-GstDRMBufferPool-support.patch
create mode 100644 meta-arago-extras/recipes-multimedia/gstreamer/gstreamer1.0-plugins-bad/0002-Modified-waylandsink-to-accept-NV12-format.patch
create mode 100644 meta-arago-extras/recipes-multimedia/gstreamer/gstreamer1.0-plugins-bad/0003-Added-KMSsink-support.patch
create mode 100644 meta-arago-extras/recipes-multimedia/gstreamer/gstreamer1.0-plugins-bad/0004-waylandsink-Removed-dependency-on-dri2.patch
create mode 100644 meta-arago-extras/recipes-multimedia/gstreamer/gstreamer1.0-plugins-bad/0005-vc1parse-and-jpegparse-Fixes-plugin-ranks.patch
create mode 100644 meta-arago-extras/recipes-multimedia/gstreamer/gstreamer1.0-plugins-bad_1.2.3.bbappend
create mode 100644 meta-arago-extras/recipes-multimedia/gstreamer/gstreamer1.0-plugins-base/0001-Added-GstMetaDmaBuf-features.patch
create mode 100644 meta-arago-extras/recipes-multimedia/gstreamer/gstreamer1.0-plugins-base_1.2.3.bbappend
create mode 100644 meta-arago-extras/recipes-multimedia/gstreamer/gstreamer1.0-plugins-good/0001-Adds-GST_V4L2_IO_DMABUF-mode-support-in-capture.patch
create mode 100644 meta-arago-extras/recipes-multimedia/gstreamer/gstreamer1.0-plugins-good_1.2.3.bbappend
--
1.7.9.5
^ permalink raw reply [flat|nested] 11+ messages in thread
* [meta-arago 1/4] gstreamer1.0-plugins-base: Add DMA Buf support
2015-03-03 15:59 [meta-arago 0/4] GStreamer 1.0 adapatations for TI Platforms Karthik Ramanan
@ 2015-03-03 15:59 ` Karthik Ramanan
2015-03-03 15:59 ` [meta-arago 2/4] gstreamer1.0-plugins-good: Add DMABuf support v4l2src Karthik Ramanan
` (4 subsequent siblings)
5 siblings, 0 replies; 11+ messages in thread
From: Karthik Ramanan @ 2015-03-03 15:59 UTC (permalink / raw)
To: meta-arago
This patch adds the DMA Buf functionality into the
GST Base. This is required for all the TI specific
GST plugins and also for a certain good and bad
plugins.
Signed-off-by: Karthik Ramanan <a0393906@ti.com>
---
.../0001-Added-GstMetaDmaBuf-features.patch | 441 ++++++++++++++++++++
.../gstreamer1.0-plugins-base_1.2.3.bbappend | 8 +
2 files changed, 449 insertions(+)
create mode 100644 meta-arago-extras/recipes-multimedia/gstreamer/gstreamer1.0-plugins-base/0001-Added-GstMetaDmaBuf-features.patch
create mode 100644 meta-arago-extras/recipes-multimedia/gstreamer/gstreamer1.0-plugins-base_1.2.3.bbappend
diff --git a/meta-arago-extras/recipes-multimedia/gstreamer/gstreamer1.0-plugins-base/0001-Added-GstMetaDmaBuf-features.patch b/meta-arago-extras/recipes-multimedia/gstreamer/gstreamer1.0-plugins-base/0001-Added-GstMetaDmaBuf-features.patch
new file mode 100644
index 0000000..ff1d471
--- /dev/null
+++ b/meta-arago-extras/recipes-multimedia/gstreamer/gstreamer1.0-plugins-base/0001-Added-GstMetaDmaBuf-features.patch
@@ -0,0 +1,441 @@
+From e6c027962e2415439571b96ee148934827430a2b Mon Sep 17 00:00:00 2001
+From: Pooja Prajod <a0132412@ti.com>
+Date: Wed, 10 Dec 2014 14:05:35 +0530
+Subject: [PATCH] Added GstMetaDmaBuf features
+
+GstMetaDmaBuf metadata can be attached to a buffer
+for storing file descriptor value as a metadata.
+The support function enables adding the metadata to buffer,
+retrieving the metadata from buffer and
+retrieving file descriptor from a GstMetaDmaBuf metadata.
+---
+ configure.ac | 3 +
+ gst-libs/gst/Makefile.am | 1 +
+ gst-libs/gst/dmabuf/Makefile.am | 21 +++
+ gst-libs/gst/dmabuf/dmabuf.c | 184 ++++++++++++++++++++
+ gst-libs/gst/dmabuf/dmabuf.h | 58 ++++++
+ pkgconfig/Makefile.am | 3 +
+ pkgconfig/gstreamer-dmabuf-uninstalled.pc.in | 16 ++
+ pkgconfig/gstreamer-dmabuf.pc.in | 16 ++
+ pkgconfig/gstreamer-plugins-base-uninstalled.pc.in | 4 +-
+ pkgconfig/gstreamer-plugins-base.pc.in | 2 +-
+ 10 files changed, 305 insertions(+), 3 deletions(-)
+ create mode 100644 gst-libs/gst/dmabuf/Makefile.am
+ create mode 100644 gst-libs/gst/dmabuf/dmabuf.c
+ create mode 100644 gst-libs/gst/dmabuf/dmabuf.h
+ create mode 100644 pkgconfig/gstreamer-dmabuf-uninstalled.pc.in
+ create mode 100644 pkgconfig/gstreamer-dmabuf.pc.in
+
+diff --git a/configure.ac b/configure.ac
+index cb29045..7eeca12 100644
+--- a/configure.ac
++++ b/configure.ac
+@@ -868,6 +868,7 @@ gst-libs/gst/tag/Makefile
+ gst-libs/gst/pbutils/Makefile
+ gst-libs/gst/pbutils/gstpluginsbaseversion.h
+ gst-libs/gst/video/Makefile
++gst-libs/gst/dmabuf/Makefile
+ tools/Makefile
+ pkgconfig/Makefile
+ pkgconfig/gstreamer-allocators.pc
+@@ -876,6 +877,8 @@ pkgconfig/gstreamer-audio.pc
+ pkgconfig/gstreamer-audio-uninstalled.pc
+ pkgconfig/gstreamer-app.pc
+ pkgconfig/gstreamer-app-uninstalled.pc
++pkgconfig/gstreamer-dmabuf.pc
++pkgconfig/gstreamer-dmabuf-uninstalled.pc
+ pkgconfig/gstreamer-fft.pc
+ pkgconfig/gstreamer-fft-uninstalled.pc
+ pkgconfig/gstreamer-pbutils.pc
+diff --git a/gst-libs/gst/Makefile.am b/gst-libs/gst/Makefile.am
+index 0634d15..383e62f 100644
+--- a/gst-libs/gst/Makefile.am
++++ b/gst-libs/gst/Makefile.am
+@@ -5,6 +5,7 @@ SUBDIRS = \
+ sdp \
+ rtsp \
+ video \
++ dmabuf\
+ audio \
+ pbutils \
+ riff \
+diff --git a/gst-libs/gst/dmabuf/Makefile.am b/gst-libs/gst/dmabuf/Makefile.am
+new file mode 100644
+index 0000000..dbac1e4
+--- /dev/null
++++ b/gst-libs/gst/dmabuf/Makefile.am
+@@ -0,0 +1,21 @@
++lib_LTLIBRARIES = libgstdmabuf-@GST_API_VERSION@.la
++
++libgstdmabuf_@GST_API_VERSION@_la_SOURCES = \
++ dmabuf.c
++libgstdmabuf_@GST_API_VERSION@includedir = $(includedir)/gstreamer-@GST_API_VERSION@/gst/dmabuf
++libgstdmabuf_@GST_API_VERSION@include_HEADERS = \
++ dmabuf.h
++
++libgstdmabuf_@GST_API_VERSION@_la_CFLAGS = \
++ $(GST_PLUGINS_BASE_CFLAGS)\
++ $(GST_BASE_CFLAGS) \
++ $(GST_CFLAGS)
++
++libgstdmabuf_@GST_API_VERSION@_la_LIBADD = $(GST_BASE_LIBS) \
++ $(GST_LIBS)
++
++libgstdmabuf_@GST_API_VERSION@_la_LDFLAGS = \
++ $(GST_LIB_LDFLAGS) \
++ $(GST_ALL_LDFLAGS) \
++ $(GST_LT_LDFLAGS)
++
+diff --git a/gst-libs/gst/dmabuf/dmabuf.c b/gst-libs/gst/dmabuf/dmabuf.c
+new file mode 100644
+index 0000000..583740e
+--- /dev/null
++++ b/gst-libs/gst/dmabuf/dmabuf.c
+@@ -0,0 +1,184 @@
++/* GStreamer dmabuf
++ *
++ * Copyright (c) 2012, Texas Instruments Incorporated
++ *
++ * 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 Foundation; either
++ * version 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 Foundation, Inc., 59 Temple Place - Suite 330,
++ * Boston, MA 02111-1307, USA.
++ */
++
++/**
++ * SECTION:gstdmabuf
++ * @short_description: GStreamer dmabuf metadata support
++ *
++ * Since: 1.2.?
++ */
++
++#ifdef HAVE_CONFIG_H
++#include "config.h"
++#endif
++
++#include <unistd.h>
++
++#include "dmabuf.h"
++
++
++static GType gst_meta_dma_buf_api_get_type (void);
++#define GST_META_DMA_BUF_API_TYPE (gst_meta_dma_buf_api_get_type())
++
++static const GstMetaInfo *gst_meta_dma_buf_get_info (void);
++#define GST_META_DMA_BUF_INFO (gst_meta_dma_buf_get_info())
++
++#define GST_META_DMA_BUF_GET(buf) ((GstMetaDmaBuf *)gst_buffer_get_meta(buf,GST_META_DMA_BUF_API_TYPE))
++#define GST_META_DMA_BUF_ADD(buf) ((GstMetaDmaBuf *)gst_buffer_add_meta(buf,GST_META_DMA_BUF_INFO,NULL))
++
++
++static gboolean
++dmabuf_init_func (GstMeta * meta, gpointer params, GstBuffer * buffer)
++{
++ GST_DEBUG ("init called on buffer %p, meta %p", buffer, meta);
++ /* nothing to init really, the init function is mostly for allocating
++ * additional memory or doing special setup as part of adding the metadata to
++ * the buffer*/
++ return TRUE;
++}
++
++static void
++dmabuf_free_func (GstMeta * meta, GstBuffer * buffer)
++{
++ /* close the file descriptor associated with the buffer,
++ * that is stored as metadata*/
++ GstMetaDmaBuf *dmabuf = (GstMetaDmaBuf *) meta;
++ GST_DEBUG ("free called on buffer %p, meta %p", buffer, meta);
++ close (dmabuf->fd);
++}
++
++static gboolean
++dmabuf_transform_func (GstBuffer * transbuf, GstMeta * meta,
++ GstBuffer * buffer, GQuark type, gpointer data)
++{
++ GstMetaDmaBuf *transmeta, *tmeta = (GstMetaDmaBuf *) meta;
++
++ GST_DEBUG ("transform %s called from buffer %p to %p, meta %p",
++ g_quark_to_string (type), buffer, transbuf, meta);
++
++ if (GST_META_TRANSFORM_IS_COPY (type)) {
++ GstMetaTransformCopy *copy_data = data;
++
++ if (!copy_data->region){
++ /* only copy if the complete data is copied as well */
++ transmeta = GST_META_DMA_BUF_ADD (transbuf);
++ if(!transmeta) {
++ return FALSE;
++ }
++ /* create a copy of the file descriptor*/
++ transmeta->fd = dup(tmeta->fd);
++ }
++ }
++ return TRUE;
++}
++
++static GType
++gst_meta_dma_buf_api_get_type (void)
++{
++ static volatile GType type;
++ static const gchar *tags[] = { "dmabuf", NULL };
++
++ if (g_once_init_enter (&type)) {
++ GType _type = gst_meta_api_type_register ("GstMetaDmaBufAPI", tags);
++ g_once_init_leave (&type, _type);
++ }
++ return type;
++}
++
++static const GstMetaInfo *
++gst_meta_dma_buf_get_info (void)
++{
++ static const GstMetaInfo *meta_dma_buf_info = NULL;
++
++ if (g_once_init_enter (&meta_dma_buf_info)) {
++ const GstMetaInfo *mi = gst_meta_register (GST_META_DMA_BUF_API_TYPE,
++ "GstMetaDmaBuf",
++ sizeof (GstMetaDmaBuf),
++ dmabuf_init_func, dmabuf_free_func, dmabuf_transform_func);
++ g_once_init_leave (&meta_dma_buf_info, mi);
++ }
++ return meta_dma_buf_info;
++}
++
++
++
++/**
++ * gst_buffer_add_dma_buf_meta:
++ * @buf: a #GstBuffer
++ * @fd: the associated file descriptor to be added as metadata
++ *
++ * Adds a GstMetaDmaBuf metadata to the buffer. The @fd is also set in the metadata added
++ *
++ * Returns: the #GstMetaDmaBuf on @buf
++ *
++ * Since: 1.2.?
++ */
++
++GstMetaDmaBuf *
++gst_buffer_add_dma_buf_meta (GstBuffer * buf, int fd)
++{
++ GstMetaDmaBuf *dmabuf;
++ dmabuf = GST_META_DMA_BUF_ADD (buf);
++ if (dmabuf)
++ dmabuf->fd = fd;
++ return dmabuf;
++}
++
++/**
++ * gst_buffer_get_dma_buf_meta:
++ * @buf: a #GstBuffer
++ *
++ * Get the GstMetaDmaBuf metadata that has previously been attached to a buffer
++ * with gst_buffer_add_dma_buf_meta(), usually by another element
++ * upstream.
++ *
++ * Returns: the #GstMetaDmaBuf attached to @buf
++ *
++ * Since: 1.2.?
++ */
++GstMetaDmaBuf *
++gst_buffer_get_dma_buf_meta (GstBuffer * buf)
++{
++ GstMetaDmaBuf * dmabuf;
++ dmabuf = GST_META_DMA_BUF_GET (buf);
++ return dmabuf;
++}
++
++
++/**
++ * gst_dma_buf_meta_get_fd:
++ * @dmabuf: a #GstMetaDmaBuf
++ *
++ * Returns: the file descriptor set as GstMetaDmaBuf metadata
++ * that has previously been attached to a buffer
++ * with gst_buffer_add_dma_buf_meta()
++ *
++ * Since: 1.2.?
++ */
++int
++gst_dma_buf_meta_get_fd (GstMetaDmaBuf * dmabuf)
++{
++ if(dmabuf) {
++ return dmabuf->fd;
++ } else {
++ GST_DEBUG("Received Null parameter for GstMetaDmaBuf ");
++ return 0;
++ }
++}
+diff --git a/gst-libs/gst/dmabuf/dmabuf.h b/gst-libs/gst/dmabuf/dmabuf.h
+new file mode 100644
+index 0000000..d49042e
+--- /dev/null
++++ b/gst-libs/gst/dmabuf/dmabuf.h
+@@ -0,0 +1,58 @@
++/* GStreamer dmabuf
++ *
++ * Copyright (c) 2012, Texas Instruments Incorporated
++ *
++ * 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 Foundation; either
++ * version 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 Foundation, Inc., 59 Temple Place - Suite 330,
++ * Boston, MA 02111-1307, USA.
++ */
++
++#ifndef __GST_DMA_BUF_H__
++#define __GST_DMA_BUF_H__
++
++#include <gst/gst.h>
++
++
++G_BEGIN_DECLS
++
++/**
++ * GstMetaDmaBuf:
++ *
++ * A structure that enables setting file descriptor as a metadata on a buffer.
++ *
++ * Since: 1.2.?
++ */
++
++
++typedef struct
++{
++ GstMeta meta;
++
++ int fd;
++} GstMetaDmaBuf;
++
++
++
++/* attach GstMetaDmaBuf metadata to buffers */
++GstMetaDmaBuf * gst_buffer_add_dma_buf_meta (GstBuffer * buf, int fd);
++
++/* retrieve GstMetaDmaBuf metadata from buffers */
++GstMetaDmaBuf * gst_buffer_get_dma_buf_meta (GstBuffer * buf);
++
++/* retrieve file descriptor value from a GstMetaDmaBuf metadata */
++int gst_dma_buf_meta_get_fd (GstMetaDmaBuf * buf);
++
++G_END_DECLS
++
++#endif /* __GST_DMA_BUF_H__ */
+diff --git a/pkgconfig/Makefile.am b/pkgconfig/Makefile.am
+index 9976f95..c68d492 100644
+--- a/pkgconfig/Makefile.am
++++ b/pkgconfig/Makefile.am
+@@ -3,6 +3,7 @@ pcverfiles = \
+ gstreamer-allocators-@GST_API_VERSION@.pc \
+ gstreamer-audio-@GST_API_VERSION@.pc \
+ gstreamer-app-@GST_API_VERSION@.pc \
++ gstreamer-dmabuf-@GST_API_VERSION@.pc \
+ gstreamer-fft-@GST_API_VERSION@.pc \
+ gstreamer-pbutils-@GST_API_VERSION@.pc \
+ gstreamer-riff-@GST_API_VERSION@.pc \
+@@ -16,6 +17,7 @@ pcverfiles_uninstalled = \
+ gstreamer-allocators-@GST_API_VERSION@-uninstalled.pc \
+ gstreamer-audio-@GST_API_VERSION@-uninstalled.pc \
+ gstreamer-app-@GST_API_VERSION@-uninstalled.pc \
++ gstreamer-dmabuf-@GST_API_VERSION@-uninstalled.pc \
+ gstreamer-fft-@GST_API_VERSION@-uninstalled.pc \
+ gstreamer-pbutils-@GST_API_VERSION@-uninstalled.pc \
+ gstreamer-riff-@GST_API_VERSION@-uninstalled.pc \
+@@ -46,6 +48,7 @@ pcinfiles = \
+ gstreamer-allocators.pc.in gstreamer-allocators-uninstalled.pc.in \
+ gstreamer-audio.pc.in gstreamer-audio-uninstalled.pc.in \
+ gstreamer-app.pc.in gstreamer-app-uninstalled.pc.in \
++ gstreamer-dmabuf.pc.in gstreamer-dmabuf-uninstalled.pc.in \
+ gstreamer-fft.pc.in gstreamer-fft-uninstalled.pc.in \
+ gstreamer-pbutils.pc.in gstreamer-pbutils-uninstalled.pc.in \
+ gstreamer-riff.pc.in gstreamer-riff-uninstalled.pc.in \
+diff --git a/pkgconfig/gstreamer-dmabuf-uninstalled.pc.in b/pkgconfig/gstreamer-dmabuf-uninstalled.pc.in
+new file mode 100644
+index 0000000..863175f
+--- /dev/null
++++ b/pkgconfig/gstreamer-dmabuf-uninstalled.pc.in
+@@ -0,0 +1,16 @@
++# the standard variables don't make sense for an uninstalled copy
++prefix=
++exec_prefix=
++libdir=
++# includedir is builddir because it is used to find gstconfig.h in places
++includedir=@abs_top_builddir@/gst-libs
++girdir=@abs_top_builddir@/gst-libs/gst/video
++typelibdir=@abs_top_builddir@/gst-libs/gst/video
++
++Name: GStreamer DMA-BUF Library, Uninstalled
++Description: Video base classes and helper functions, uninstalled
++Version: @VERSION@
++Requires: gstreamer-@GST_API_VERSION@ gstreamer-base-@GST_API_VERSION@
++Libs: @abs_top_builddir@/gst-libs/gst/dmabuf/libgstdmabuf-@GST_API_VERSION@.la
++Cflags: -I@abs_top_srcdir@/gst-libs -I@abs_top_builddir@/gst-libs
++
+diff --git a/pkgconfig/gstreamer-dmabuf.pc.in b/pkgconfig/gstreamer-dmabuf.pc.in
+new file mode 100644
+index 0000000..1a44f19
+--- /dev/null
++++ b/pkgconfig/gstreamer-dmabuf.pc.in
+@@ -0,0 +1,16 @@
++prefix=@prefix@
++exec_prefix=@exec_prefix@
++libdir=@libdir@
++includedir=@includedir@/gstreamer-@GST_API_VERSION@
++datarootdir=${prefix}/share
++datadir=${datarootdir}
++girdir=${datadir}/gir-1.0
++typelibdir=${libdir}/girepository-1.0
++
++Name: GStreamer DMA-BUF Library
++Description: Video base classes and helper functions
++Requires: gstreamer-@GST_API_VERSION@ gstreamer-base-@GST_API_VERSION@
++Version: @VERSION@
++Libs: -L${libdir} -lgstdmabuf-@GST_API_VERSION@
++Cflags: -I${includedir}
++
+diff --git a/pkgconfig/gstreamer-plugins-base-uninstalled.pc.in b/pkgconfig/gstreamer-plugins-base-uninstalled.pc.in
+index 970c051..ebf2be6 100644
+--- a/pkgconfig/gstreamer-plugins-base-uninstalled.pc.in
++++ b/pkgconfig/gstreamer-plugins-base-uninstalled.pc.in
+@@ -10,7 +10,7 @@ Name: GStreamer Base Plugins Libraries, Uninstalled
+ Description: Streaming media framework, base plugins libraries, uninstalled
+ Version: @VERSION@
+ Requires: gstreamer-@GST_API_VERSION@
+-Libs: -L@abs_top_builddir@/gst-libs/gst/allocators -L@abs_top_builddir@/gst-libs/gst/app -L@abs_top_builddir@/gst-libs/gst/audio -L@abs_top_builddir@/gst-libs/gst/fft -L@abs_top_builddir@/gst-libs/gst/pbutils -L@abs_top_builddir@/gst-libs/gst/riff -L@abs_top_builddir@/gst-libs/gst/rtp -L@abs_top_builddir@/gst-libs/gst/rtsp -L@abs_top_builddir@/gst-libs/gst/sdp -L@abs_top_builddir@/gst-libs/gst/tag -L@abs_top_builddir@/gst-libs/gst/video
++Libs: -L@abs_top_builddir@/gst-libs/gst/allocators -L@abs_top_builddir@/gst-libs/gst/app -L@abs_top_builddir@/gst-libs/gst/audio -L@abs_top_builddir@/gst-libs/gst/dmabuf -L@abs_top_builddir@/gst-libs/gst/fft -L@abs_top_builddir@/gst-libs/gst/pbutils -L@abs_top_builddir@/gst-libs/gst/riff -L@abs_top_builddir@/gst-libs/gst/rtp -L@abs_top_builddir@/gst-libs/gst/rtsp -L@abs_top_builddir@/gst-libs/gst/sdp -L@abs_top_builddir@/gst-libs/gst/tag -L@abs_top_builddir@/gst-libs/gst/video
+ Cflags: -I@abs_top_srcdir@/gst-libs -I@abs_top_builddir@/gst-libs
+
+-libraries=allocators app audio fft pbutils riff rtp rtsp sdp tag video
++libraries=allocators app audio dmabuf fft pbutils riff rtp rtsp sdp tag video
+diff --git a/pkgconfig/gstreamer-plugins-base.pc.in b/pkgconfig/gstreamer-plugins-base.pc.in
+index e817746..3d3bc94 100644
+--- a/pkgconfig/gstreamer-plugins-base.pc.in
++++ b/pkgconfig/gstreamer-plugins-base.pc.in
+@@ -11,4 +11,4 @@ Version: @VERSION@
+ Libs: -L${libdir}
+ Cflags: -I${includedir}
+
+-libraries=allocators app audio fft pbutils riff rtp rtsp sdp tag video
++libraries=allocators app audio dmabuf fft pbutils riff rtp rtsp sdp tag video
+--
+1.7.9.5
+
diff --git a/meta-arago-extras/recipes-multimedia/gstreamer/gstreamer1.0-plugins-base_1.2.3.bbappend b/meta-arago-extras/recipes-multimedia/gstreamer/gstreamer1.0-plugins-base_1.2.3.bbappend
new file mode 100644
index 0000000..c76cb20
--- /dev/null
+++ b/meta-arago-extras/recipes-multimedia/gstreamer/gstreamer1.0-plugins-base_1.2.3.bbappend
@@ -0,0 +1,8 @@
+FILESEXTRAPATHS_prepend := "${THISDIR}/${PN}:"
+
+SRC_URI_append = " \
+ file://0001-Added-GstMetaDmaBuf-features.patch"
+
+PR = "r2"
+
+FILES_${PN} += "${libdir}/gstreamer-1.0/*.so"
--
1.7.9.5
^ permalink raw reply related [flat|nested] 11+ messages in thread
* [meta-arago 2/4] gstreamer1.0-plugins-good: Add DMABuf support v4l2src
2015-03-03 15:59 [meta-arago 0/4] GStreamer 1.0 adapatations for TI Platforms Karthik Ramanan
2015-03-03 15:59 ` [meta-arago 1/4] gstreamer1.0-plugins-base: Add DMA Buf support Karthik Ramanan
@ 2015-03-03 15:59 ` Karthik Ramanan
2015-03-03 15:59 ` [meta-arago 3/4] gstreamer1.0-plugins-bad: Add various features Karthik Ramanan
` (3 subsequent siblings)
5 siblings, 0 replies; 11+ messages in thread
From: Karthik Ramanan @ 2015-03-03 15:59 UTC (permalink / raw)
To: meta-arago
Signed-off-by: Karthik Ramanan <a0393906@ti.com>
---
...ST_V4L2_IO_DMABUF-mode-support-in-capture.patch | 298 ++++++++++++++++++++
.../gstreamer1.0-plugins-good_1.2.3.bbappend | 8 +
2 files changed, 306 insertions(+)
create mode 100644 meta-arago-extras/recipes-multimedia/gstreamer/gstreamer1.0-plugins-good/0001-Adds-GST_V4L2_IO_DMABUF-mode-support-in-capture.patch
create mode 100644 meta-arago-extras/recipes-multimedia/gstreamer/gstreamer1.0-plugins-good_1.2.3.bbappend
diff --git a/meta-arago-extras/recipes-multimedia/gstreamer/gstreamer1.0-plugins-good/0001-Adds-GST_V4L2_IO_DMABUF-mode-support-in-capture.patch b/meta-arago-extras/recipes-multimedia/gstreamer/gstreamer1.0-plugins-good/0001-Adds-GST_V4L2_IO_DMABUF-mode-support-in-capture.patch
new file mode 100644
index 0000000..3913208
--- /dev/null
+++ b/meta-arago-extras/recipes-multimedia/gstreamer/gstreamer1.0-plugins-good/0001-Adds-GST_V4L2_IO_DMABUF-mode-support-in-capture.patch
@@ -0,0 +1,298 @@
+From 25936e8f703ebe99c00e083cec317231b17d503b Mon Sep 17 00:00:00 2001
+From: Pooja Prajod <a0132412@ti.com>
+Date: Thu, 29 Jan 2015 21:10:49 +0530
+Subject: [PATCH 1/2] Adds GST_V4L2_IO_DMABUF mode support in capture
+
+Enables v4l2src to accept pool from peer and allocate buffers from
+them in GST_V4L2_IO_DMABUF mode.
+---
+ sys/v4l2/Makefile.am | 1 +
+ sys/v4l2/gstv4l2bufferpool.c | 93 +++++++++++++++++++++++++++++++++++-------
+ sys/v4l2/gstv4l2object.h | 1 +
+ sys/v4l2/gstv4l2src.c | 13 ++++--
+ 4 files changed, 90 insertions(+), 18 deletions(-)
+
+diff --git a/sys/v4l2/Makefile.am b/sys/v4l2/Makefile.am
+index da138ae..6ff4e18 100644
+--- a/sys/v4l2/Makefile.am
++++ b/sys/v4l2/Makefile.am
+@@ -37,6 +37,7 @@ libgstvideo4linux2_la_LIBTOOLFLAGS = $(GST_PLUGIN_LIBTOOLFLAGS)
+ libgstvideo4linux2_la_LIBADD = $(GST_PLUGINS_BASE_LIBS) \
+ -lgstallocators-$(GST_API_VERSION) \
+ -lgstvideo-$(GST_API_VERSION) \
++ -lgstdmabuf-$(GST_API_VERSION) \
+ $(GST_BASE_LIBS) \
+ $(GST_LIBS) \
+ $(xv_libs) \
+diff --git a/sys/v4l2/gstv4l2bufferpool.c b/sys/v4l2/gstv4l2bufferpool.c
+index 463dd44..5a108eb 100644
+--- a/sys/v4l2/gstv4l2bufferpool.c
++++ b/sys/v4l2/gstv4l2bufferpool.c
+@@ -41,6 +41,7 @@
+ #include "gst/video/gstvideometa.h"
+ #include "gst/video/gstvideopool.h"
+ #include "gst/allocators/gstdmabuf.h"
++#include <gst/dmabuf/dmabuf.h>
+
+ #include <gstv4l2bufferpool.h>
+
+@@ -112,7 +113,16 @@ gst_v4l2_buffer_pool_free_buffer (GstBufferPool * bpool, GstBuffer * buffer)
+ switch (obj->mode) {
+ case GST_V4L2_IO_RW:
+ case GST_V4L2_IO_DMABUF:
++ {
++ GstV4l2Meta *meta;
++ gint index;
++
++ meta = GST_V4L2_META_GET (buffer);
++ g_assert (meta != NULL);
++ index = meta->vbuffer.index;
++ pool->buffers[index] = NULL;
+ break;
++ }
+ case GST_V4L2_IO_MMAP:
+ {
+ GstV4l2Meta *meta;
+@@ -147,6 +157,7 @@ gst_v4l2_buffer_pool_alloc_buffer (GstBufferPool * bpool, GstBuffer ** buffer,
+ GstV4l2Meta *meta;
+ GstV4l2Object *obj;
+ GstVideoInfo *info;
++ GstMetaDmaBuf *dmabuf;
+ guint index;
+
+ obj = pool->obj;
+@@ -168,7 +179,12 @@ gst_v4l2_buffer_pool_alloc_buffer (GstBufferPool * bpool, GstBuffer ** buffer,
+
+ memset (&create_bufs, 0, sizeof (struct v4l2_create_buffers));
+ create_bufs.count = 1;
+- create_bufs.memory = V4L2_MEMORY_MMAP;
++ if (obj->mode == GST_V4L2_IO_MMAP)
++ create_bufs.memory = V4L2_MEMORY_MMAP;
++
++ if (obj->mode == GST_V4L2_IO_DMABUF)
++ create_bufs.memory = V4L2_MEMORY_DMABUF;
++
+ create_bufs.format.type = obj->type;
+
+ if (v4l2_ioctl (pool->video_fd, VIDIOC_G_FMT, &create_bufs.format) < 0)
+@@ -184,7 +200,24 @@ gst_v4l2_buffer_pool_alloc_buffer (GstBufferPool * bpool, GstBuffer ** buffer,
+ pool->buffers[pool->num_buffers - 1] = NULL;
+ }
+ #endif
+- newbuf = gst_buffer_new ();
++ if (obj->externalpool && obj->mode==GST_V4L2_IO_DMABUF) {
++ GstFlowReturn ret = gst_buffer_pool_acquire_buffer (GST_BUFFER_POOL (obj->externalpool), &newbuf,
++ NULL);
++ if (ret != GST_FLOW_OK)
++ goto external_acquire_failed;
++ dmabuf = gst_buffer_get_dma_buf_meta (newbuf);
++
++ /* if it isn't a dmabuf buffer that we can import, then there
++ * is nothing we can do with it:
++ */
++ if (!dmabuf) {
++ GST_DEBUG_OBJECT (pool, "not importing non dmabuf buffer");
++ return GST_FLOW_ERROR;
++ }
++
++ } else {
++ newbuf = gst_buffer_new ();
++ }
+ meta = GST_V4L2_META_ADD (newbuf);
+
+ index = pool->num_allocated;
+@@ -194,8 +227,12 @@ gst_v4l2_buffer_pool_alloc_buffer (GstBufferPool * bpool, GstBuffer ** buffer,
+ memset (&meta->vbuffer, 0x0, sizeof (struct v4l2_buffer));
+ meta->vbuffer.index = index;
+ meta->vbuffer.type = obj->type;
+- meta->vbuffer.memory = V4L2_MEMORY_MMAP;
+-
++ if (obj->mode == GST_V4L2_IO_MMAP)
++ meta->vbuffer.memory = V4L2_MEMORY_MMAP;
++ if (obj->mode == GST_V4L2_IO_DMABUF) {
++ meta->vbuffer.memory = V4L2_MEMORY_DMABUF;
++ meta->vbuffer.m.fd = gst_dma_buf_meta_get_fd (dmabuf);
++ }
+ if (v4l2_ioctl (pool->video_fd, VIDIOC_QUERYBUF, &meta->vbuffer) < 0)
+ goto querybuf_failed;
+
+@@ -220,6 +257,11 @@ gst_v4l2_buffer_pool_alloc_buffer (GstBufferPool * bpool, GstBuffer ** buffer,
+ meta->mem, meta->vbuffer.length, 0, meta->vbuffer.length, NULL,
+ NULL));
+ }
++ if (obj->externalpool && obj->mode==GST_V4L2_IO_DMABUF) {
++ meta->vbuffer.memory = V4L2_MEMORY_DMABUF;
++ meta->vbuffer.m.fd = gst_dma_buf_meta_get_fd (dmabuf);
++ goto skipped_native_dmabuf;
++ }
+ #if HAVE_DECL_V4L2_MEMORY_DMABUF
+ if (obj->mode == GST_V4L2_IO_DMABUF) {
+ struct v4l2_exportbuffer expbuf;
+@@ -237,6 +279,8 @@ gst_v4l2_buffer_pool_alloc_buffer (GstBufferPool * bpool, GstBuffer ** buffer,
+ meta->vbuffer.length));
+ }
+ #endif
++
++skipped_native_dmabuf:
+ /* add metadata to raw video buffers */
+ if (pool->add_videometa && info->finfo) {
+ const GstVideoFormatInfo *finfo = info->finfo;
+@@ -328,6 +372,11 @@ mmap_failed:
+ errno = errnosave;
+ return GST_FLOW_ERROR;
+ }
++external_acquire_failed:
++ {
++ GST_WARNING ("External pool acquire failed ");
++ return GST_FLOW_ERROR;
++ }
+ #if HAVE_DECL_V4L2_MEMORY_DMABUF
+ expbuf_failed:
+ {
+@@ -407,7 +456,11 @@ gst_v4l2_buffer_pool_set_config (GstBufferPool * bpool, GstStructure * config)
+ memset (&breq, 0, sizeof (struct v4l2_requestbuffers));
+ breq.type = obj->type;
+ breq.count = num_buffers;
+- breq.memory = V4L2_MEMORY_MMAP;
++ if (obj->mode == GST_V4L2_IO_MMAP)
++ breq.memory = V4L2_MEMORY_MMAP;
++
++ if (obj->mode == GST_V4L2_IO_DMABUF)
++ breq.memory = V4L2_MEMORY_DMABUF;
+
+ if (v4l2_ioctl (pool->video_fd, VIDIOC_REQBUFS, &breq) < 0)
+ goto reqbufs_failed;
+@@ -566,7 +619,11 @@ gst_v4l2_buffer_pool_free_buffers (GstV4l2BufferPool * pool)
+ memset (&breq, 0, sizeof (struct v4l2_requestbuffers));
+ breq.type = pool->obj->type;
+ breq.count = 0;
+- breq.memory = V4L2_MEMORY_MMAP;
++ if (pool->obj->mode == GST_V4L2_IO_MMAP)
++ breq.memory = V4L2_MEMORY_MMAP;
++
++ if (pool->obj->mode == GST_V4L2_IO_DMABUF)
++ breq.memory = V4L2_MEMORY_DMABUF;
+ if (v4l2_ioctl (pool->video_fd, VIDIOC_REQBUFS, &breq) < 0) {
+ GST_ERROR_OBJECT (pool, "error releasing buffers: %s",
+ g_strerror (errno));
+@@ -732,12 +789,12 @@ gst_v4l2_buffer_pool_dqbuf (GstV4l2BufferPool * pool, GstBuffer ** buffer)
+
+ memset (&vbuffer, 0x00, sizeof (vbuffer));
+ vbuffer.type = obj->type;
+-#if HAVE_DECL_V4L2_MEMORY_DMABUF
++
++ if (obj->mode == GST_V4L2_IO_MMAP)
++ vbuffer.memory = V4L2_MEMORY_MMAP;
++
+ if (obj->mode == GST_V4L2_IO_DMABUF)
+ vbuffer.memory = V4L2_MEMORY_DMABUF;
+- else
+-#endif
+- vbuffer.memory = V4L2_MEMORY_MMAP;
+
+ GST_LOG_OBJECT (pool, "doing DQBUF");
+ if (v4l2_ioctl (pool->video_fd, VIDIOC_DQBUF, &vbuffer) < 0)
+@@ -779,10 +836,14 @@ gst_v4l2_buffer_pool_dqbuf (GstV4l2BufferPool * pool, GstBuffer ** buffer)
+ * no share, so if it's not there, it's not used at all.
+ */
+ if (obj->type == V4L2_BUF_TYPE_VIDEO_CAPTURE) {
+- gst_buffer_remove_all_memory (outbuf);
+- gst_buffer_append_memory (outbuf,
+- gst_memory_new_wrapped (GST_MEMORY_FLAG_NO_SHARE,
+- meta->mem, vbuffer.length, 0, vbuffer.bytesused, NULL, NULL));
++ if (obj->mode == GST_V4L2_IO_DMABUF) {
++ GST_LOG_OBJECT (pool, " Assuming size doesn't change");
++ } else {
++ gst_buffer_remove_all_memory (outbuf);
++ gst_buffer_append_memory (outbuf,
++ gst_memory_new_wrapped (GST_MEMORY_FLAG_NO_SHARE,
++ meta->mem, vbuffer.length, 0, vbuffer.bytesused, NULL, NULL));
++ }
+ }
+
+ GST_BUFFER_TIMESTAMP (outbuf) = timestamp;
+@@ -1207,6 +1268,10 @@ gst_v4l2_buffer_pool_process (GstV4l2BufferPool * pool, GstBuffer * buf)
+ /* capture into the buffer */
+ ret = gst_v4l2_do_read (pool, buf);
+ break;
++ case GST_V4L2_IO_DMABUF:
++ /* nothing, data was inside the buffer when we did _acquire() */
++ if (buf->pool == obj->externalpool)
++ goto done;
+
+ case GST_V4L2_IO_MMAP:
+ {
+diff --git a/sys/v4l2/gstv4l2object.h b/sys/v4l2/gstv4l2object.h
+index fbfff92..645e016 100644
+--- a/sys/v4l2/gstv4l2object.h
++++ b/sys/v4l2/gstv4l2object.h
+@@ -127,6 +127,7 @@ struct _GstV4l2Object {
+
+ /* optional pool */
+ GstBufferPool *pool;
++ GstBufferPool *externalpool;
+
+ /* the video device's capabilities */
+ struct v4l2_capability vcap;
+diff --git a/sys/v4l2/gstv4l2src.c b/sys/v4l2/gstv4l2src.c
+index 8e1b754..7a19e5f 100644
+--- a/sys/v4l2/gstv4l2src.c
++++ b/sys/v4l2/gstv4l2src.c
+@@ -467,6 +467,7 @@ gst_v4l2src_decide_allocation (GstBaseSrc * bsrc, GstQuery * query)
+ GstV4l2Src *src;
+ GstV4l2Object *obj;
+ GstBufferPool *pool;
++ GstBufferPool *externalpool;
+ guint size, min, max;
+ gboolean update;
+
+@@ -474,17 +475,17 @@ gst_v4l2src_decide_allocation (GstBaseSrc * bsrc, GstQuery * query)
+ obj = src->v4l2object;
+
+ if (gst_query_get_n_allocation_pools (query) > 0) {
+- gst_query_parse_nth_allocation_pool (query, 0, &pool, &size, &min, &max);
++ gst_query_parse_nth_allocation_pool (query, 0, &externalpool, &size, &min, &max);
+ update = TRUE;
+ } else {
+- pool = NULL;
++ externalpool = NULL;
+ min = max = 0;
+ size = 0;
+ update = FALSE;
+ }
+
+ GST_DEBUG_OBJECT (src, "allocation: size:%u min:%u max:%u pool:%"
+- GST_PTR_FORMAT, size, min, max, pool);
++ GST_PTR_FORMAT, size, min, max, externalpool);
+
+ if (min != 0) {
+ /* if there is a min-buffers suggestion, use it. We add 1 because we need 1
+@@ -497,7 +498,7 @@ gst_v4l2src_decide_allocation (GstBaseSrc * bsrc, GstQuery * query)
+ /* select a pool */
+ switch (obj->mode) {
+ case GST_V4L2_IO_RW:
+- if (pool == NULL) {
++ if (externalpool == NULL) {
+ /* no downstream pool, use our own then */
+ GST_DEBUG_OBJECT (src,
+ "read/write mode: no downstream pool, using our own");
+@@ -510,12 +511,16 @@ gst_v4l2src_decide_allocation (GstBaseSrc * bsrc, GstQuery * query)
+ /* use the bigest size, when we use our own pool we can't really do any
+ * other size than what the hardware gives us but for downstream pools
+ * we can try */
++ pool = externalpool;
+ size = MAX (size, obj->sizeimage);
+ }
+ break;
+ case GST_V4L2_IO_MMAP:
+ case GST_V4L2_IO_USERPTR:
+ case GST_V4L2_IO_DMABUF:
++ if (externalpool) {
++ obj->externalpool = GST_BUFFER_POOL_CAST (externalpool);
++ }
+ /* in streaming mode, prefer our own pool */
+ pool = GST_BUFFER_POOL_CAST (obj->pool);
+ size = obj->sizeimage;
+--
+1.7.9.5
+
diff --git a/meta-arago-extras/recipes-multimedia/gstreamer/gstreamer1.0-plugins-good_1.2.3.bbappend b/meta-arago-extras/recipes-multimedia/gstreamer/gstreamer1.0-plugins-good_1.2.3.bbappend
new file mode 100644
index 0000000..1d6ceb4
--- /dev/null
+++ b/meta-arago-extras/recipes-multimedia/gstreamer/gstreamer1.0-plugins-good_1.2.3.bbappend
@@ -0,0 +1,8 @@
+FILESEXTRAPATHS_prepend := "${THISDIR}/${PN}:"
+
+SRC_URI_append = " \
+ file://0001-Adds-GST_V4L2_IO_DMABUF-mode-support-in-capture.patch"
+
+PR = "r2"
+
+FILES_${PN} += "${libdir}/gstreamer-1.0/*.so"
--
1.7.9.5
^ permalink raw reply related [flat|nested] 11+ messages in thread
* [meta-arago 3/4] gstreamer1.0-plugins-bad: Add various features
2015-03-03 15:59 [meta-arago 0/4] GStreamer 1.0 adapatations for TI Platforms Karthik Ramanan
2015-03-03 15:59 ` [meta-arago 1/4] gstreamer1.0-plugins-base: Add DMA Buf support Karthik Ramanan
2015-03-03 15:59 ` [meta-arago 2/4] gstreamer1.0-plugins-good: Add DMABuf support v4l2src Karthik Ramanan
@ 2015-03-03 15:59 ` Karthik Ramanan
2015-03-03 15:59 ` [meta-arago 4/4] gstreamer1.0-plugins-ti: Add ducati and vpe GST plugins Karthik Ramanan
` (2 subsequent siblings)
5 siblings, 0 replies; 11+ messages in thread
From: Karthik Ramanan @ 2015-03-03 15:59 UTC (permalink / raw)
To: meta-arago
The following feature will be enabled by this patch
* Add GST DRM Buffer Pool suppport.
* Add support for waylandsink to accept NV12 buffers.
This is required for interworking with TI specific GST plugins
for hardware acclerated encode/decode
* Add support for KMS Sink.
This is required for customers who will need native rendering
support without the use of wayland (wayland-sink)
* Fix incorrect dependency on dri2 for the wayland sink.
* Increase the rank for vc1parse and jpegparse.
Signed-off-by: Karthik Ramanan <a0393906@ti.com>
---
.../0001-Added-GstDRMBufferPool-support.patch | 774 +++++++++++
...odified-waylandsink-to-accept-NV12-format.patch | 1017 ++++++++++++++
.../0003-Added-KMSsink-support.patch | 1457 ++++++++++++++++++++
...04-waylandsink-Removed-dependency-on-dri2.patch | 26 +
...vc1parse-and-jpegparse-Fixes-plugin-ranks.patch | 54 +
.../gstreamer1.0-plugins-bad_1.2.3.bbappend | 14 +
6 files changed, 3342 insertions(+)
create mode 100644 meta-arago-extras/recipes-multimedia/gstreamer/gstreamer1.0-plugins-bad/0001-Added-GstDRMBufferPool-support.patch
create mode 100644 meta-arago-extras/recipes-multimedia/gstreamer/gstreamer1.0-plugins-bad/0002-Modified-waylandsink-to-accept-NV12-format.patch
create mode 100644 meta-arago-extras/recipes-multimedia/gstreamer/gstreamer1.0-plugins-bad/0003-Added-KMSsink-support.patch
create mode 100644 meta-arago-extras/recipes-multimedia/gstreamer/gstreamer1.0-plugins-bad/0004-waylandsink-Removed-dependency-on-dri2.patch
create mode 100644 meta-arago-extras/recipes-multimedia/gstreamer/gstreamer1.0-plugins-bad/0005-vc1parse-and-jpegparse-Fixes-plugin-ranks.patch
create mode 100644 meta-arago-extras/recipes-multimedia/gstreamer/gstreamer1.0-plugins-bad_1.2.3.bbappend
diff --git a/meta-arago-extras/recipes-multimedia/gstreamer/gstreamer1.0-plugins-bad/0001-Added-GstDRMBufferPool-support.patch b/meta-arago-extras/recipes-multimedia/gstreamer/gstreamer1.0-plugins-bad/0001-Added-GstDRMBufferPool-support.patch
new file mode 100644
index 0000000..c7015b2
--- /dev/null
+++ b/meta-arago-extras/recipes-multimedia/gstreamer/gstreamer1.0-plugins-bad/0001-Added-GstDRMBufferPool-support.patch
@@ -0,0 +1,774 @@
+From 1df02c3320d74c0f36e0ea7021b033da5d4d891e Mon Sep 17 00:00:00 2001
+From: Pooja Prajod <a0132412@ti.com>
+Date: Thu, 11 Dec 2014 15:42:39 +0530
+Subject: [PATCH] Added GstDRMBufferPool support
+
+GstDRMBufferPool enabled creation of a bufferpool with extended features.
+The pool stores the element that created it, device for drm allocation,
+height, width and size of buffers.
+All the buffers allocated are through drm. The buffers have dmabuf, crop
+and video metadata set.
+---
+ configure.ac | 6 +
+ gst-libs/gst/Makefile.am | 2 +-
+ gst-libs/gst/drm/Makefile.am | 36 ++
+ gst-libs/gst/drm/gstdrmbufferpool.c | 434 +++++++++++++++++++++
+ gst-libs/gst/drm/gstdrmbufferpool.h | 138 +++++++
+ pkgconfig/Makefile.am | 3 +
+ pkgconfig/gstreamer-drm-uninstalled.pc.in | 12 +
+ pkgconfig/gstreamer-drm.pc.in | 12 +
+ pkgconfig/gstreamer-plugins-bad-uninstalled.pc.in | 2 +-
+ 9 files changed, 643 insertions(+), 2 deletions(-)
+ create mode 100644 gst-libs/gst/drm/Makefile.am
+ create mode 100644 gst-libs/gst/drm/gstdrmbufferpool.c
+ create mode 100644 gst-libs/gst/drm/gstdrmbufferpool.h
+ create mode 100644 pkgconfig/gstreamer-drm-uninstalled.pc.in
+ create mode 100644 pkgconfig/gstreamer-drm.pc.in
+
+diff --git a/configure.ac b/configure.ac
+index 8f1a4cb..edf8ea8 100644
+--- a/configure.ac
++++ b/configure.ac
+@@ -457,6 +457,9 @@ AC_ARG_WITH([egl-window-system],
+ [EGL_WINDOW_SYSTEM="$withval"],
+ [EGL_WINDOW_SYSTEM="auto"])
+
++dnl *** gst-libs/gst/egl ***
++PKG_CHECK_MODULES([DRM], [libdrm libdrm_omap], HAVE_KMS=yes, HAVE_KMS=no)
++
+ if test x"$EGL_WINDOW_SYSTEM" = x"auto"; then
+ dnl Mali
+ old_LIBS=$LIBS
+@@ -2404,6 +2407,7 @@ gst/yadif/Makefile
+ gst-libs/Makefile
+ gst-libs/gst/Makefile
+ gst-libs/gst/basecamerabinsrc/Makefile
++gst-libs/gst/drm/Makefile
+ gst-libs/gst/egl/Makefile
+ gst-libs/gst/insertbin/Makefile
+ gst-libs/gst/interfaces/Makefile
+@@ -2523,6 +2527,8 @@ pkgconfig/gstreamer-plugins-bad.pc
+ pkgconfig/gstreamer-plugins-bad-uninstalled.pc
+ pkgconfig/gstreamer-codecparsers.pc
+ pkgconfig/gstreamer-codecparsers-uninstalled.pc
++pkgconfig/gstreamer-drm.pc
++pkgconfig/gstreamer-drm-uninstalled.pc
+ pkgconfig/gstreamer-insertbin.pc
+ pkgconfig/gstreamer-insertbin-uninstalled.pc
+ pkgconfig/gstreamer-egl.pc
+diff --git a/gst-libs/gst/Makefile.am b/gst-libs/gst/Makefile.am
+index 1d6cc35..b915d07 100644
+--- a/gst-libs/gst/Makefile.am
++++ b/gst-libs/gst/Makefile.am
+@@ -2,7 +2,7 @@ if HAVE_EGL
+ EGL_DIR = egl
+ endif
+
+-SUBDIRS = interfaces basecamerabinsrc codecparsers \
++SUBDIRS = interfaces basecamerabinsrc codecparsers drm \
+ insertbin uridownloader mpegts $(EGL_DIR)
+
+ noinst_HEADERS = gst-i18n-plugin.h gettext.h glib-compat-private.h
+diff --git a/gst-libs/gst/drm/Makefile.am b/gst-libs/gst/drm/Makefile.am
+new file mode 100644
+index 0000000..4808009
+--- /dev/null
++++ b/gst-libs/gst/drm/Makefile.am
+@@ -0,0 +1,36 @@
++
++lib_LTLIBRARIES = libgstdrm-@GST_API_VERSION@.la
++
++CLEANFILES = $(BUILT_SOURCES)
++
++libgstdrm_@GST_API_VERSION@_la_SOURCES = \
++ gstdrmbufferpool.c
++
++libgstdrm_@GST_API_VERSION@includedir = \
++ $(includedir)/gstreamer-@GST_API_VERSION@/gst/drm
++
++libgstdrm_@GST_API_VERSION@include_HEADERS = \
++ gstdrmbufferpool.h
++
++libgstdrm_@GST_API_VERSION@_la_CFLAGS = \
++ $(DRM_CFLAGS) \
++ $(OMAPDRM_CFLAGS) \
++ $(GST_PLUGINS_BAD_CFLAGS) \
++ $(GST_PLUGINS_BASE_CFLAGS) \
++ -DGST_USE_UNSTABLE_API \
++ $(GST_CFLAGS)
++
++libgstdrm_@GST_API_VERSION@_la_LIBADD = \
++ $(DRM_LIBS) \
++ -lgstdmabuf-@GST_API_VERSION@ \
++ $(GST_PLUGINS_BASE_LIBS) \
++ $(GST_BASE_LIBS) \
++ $(GST_LIBS) \
++ -lgstdmabuf-@GST_API_VERSION@
++
++libgstdrm_@GST_API_VERSION@_la_LDFLAGS = \
++ $(DRM_LDFLAGS) \
++ $(GST_LIB_LDFLAGS) \
++ $(GST_ALL_LDFLAGS) \
++ $(GST_LT_LDFLAGS)
++
+diff --git a/gst-libs/gst/drm/gstdrmbufferpool.c b/gst-libs/gst/drm/gstdrmbufferpool.c
+new file mode 100644
+index 0000000..6ac8044
+--- /dev/null
++++ b/gst-libs/gst/drm/gstdrmbufferpool.c
+@@ -0,0 +1,434 @@
++/*
++ * GStreamer
++ *
++ * Copyright (C) 2012 Texas Instruments
++ * Copyright (C) 2012 Collabora Ltd
++ *
++ * Authors:
++ * Alessandro Decina <alessandro.decina@collabora.co.uk>
++ * Rob Clark <rob.clark@linaro.org>
++ *
++ * This library is free software; you can redistribute it and/or
++ * modify it under the terms of the GNU Lesser General Public
++ * License as published by the Free Software Foundation
++ * version 2.1 of the License.
++ *
++ * 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
++ * Lesser General Public License for more details.
++ *
++ * You should have received a copy of the GNU Lesser General Public
++ * License along with this library; if not, write to the Free Software
++ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
++ */
++
++/**
++ * SECTION:GstDRMBufferPool
++ * @short_description: GStreamer DRM buffer pool support
++ *
++ * Since: 1.2.?
++ */
++
++
++#ifdef HAVE_CONFIG_H
++#include "config.h"
++#endif
++
++#include <string.h>
++
++#include <gst/dmabuf/dmabuf.h>
++
++#include "gstdrmbufferpool.h"
++
++GST_DEBUG_CATEGORY (drmbufferpool_debug);
++#define GST_CAT_DEFAULT drmbufferpool_debug
++
++static GstFlowReturn gst_drm_alloc_new_buffer (GstBufferPool * pool, GstBuffer ** buffer,
++ GstBufferPoolAcquireParams * params);
++
++
++#define gst_drm_buffer_pool_parent_class parent_class
++G_DEFINE_TYPE (GstDRMBufferPool, gst_drm_buffer_pool, GST_TYPE_BUFFER_POOL);
++
++
++/**
++ * gst_drm_buffer_pool_set_config:
++ * @pool: a #GstBufferPool
++ * @config: a #GstStructure
++ *
++ * Parses the @config to retrieve the caps that is set by gst_buffer_pool_config_set_params().
++ * This caps is then parsed to retrieve the video info. This function can be called to
++ * change the caps of the buffer pool.
++ *
++ * Returns: the boolean value, TRUE for success and FALSE in case of an errors
++ *
++ * Since: 1.2.?
++ */
++
++gboolean
++gst_drm_buffer_pool_set_config (GstBufferPool * pool, GstStructure * config)
++{
++ GstDRMBufferPool *drmpool = GST_DRM_BUFFER_POOL (pool);
++ GstCaps *caps;
++
++ /* get the caps param already set in the config */
++ if (!gst_buffer_pool_config_get_params (config, &caps, NULL, NULL, NULL))
++ goto wrong_config;
++
++ if (caps == NULL)
++ goto no_caps;
++
++ /* now parse the caps from the config to get the video info */
++ if (!gst_video_info_from_caps (&drmpool->info, caps))
++ goto wrong_caps;
++
++ GST_LOG_OBJECT (pool, "%dx%d, caps %" GST_PTR_FORMAT, drmpool->info.width, drmpool->info.height,
++ caps);
++
++ /* Set caps related variables of the pool */
++ drmpool->caps = gst_caps_ref (caps);
++ drmpool->width = drmpool->info.width;
++ drmpool->height = drmpool->info.height;
++
++ return GST_BUFFER_POOL_CLASS (parent_class)->set_config (pool, config);
++
++ /* ERRORS */
++wrong_config:
++ {
++ GST_WARNING_OBJECT (pool, "invalid config");
++ return FALSE;
++ }
++no_caps:
++ {
++ GST_WARNING_OBJECT (pool, "no caps in config");
++ return FALSE;
++ }
++wrong_caps:
++ {
++ GST_WARNING_OBJECT (pool,
++ "failed getting geometry from caps %" GST_PTR_FORMAT, caps);
++ return FALSE;
++ }
++}
++
++
++/**
++ * gst_drm_buffer_pool_initialize:
++ * @pool: a #GstBufferPool
++ * @element: a #GstElement
++ * @fd: a file descriptor
++ * @caps: a #GstCaps
++ * @size: the padded size of buffers
++ *
++ * Initializes the device related info. Sets the params for buffer pool config.
++ * Sets the config of the pool by calling gst_buffer_pool_set_config().
++ *
++ *
++ * Since: 1.2.?
++ */
++
++
++void
++gst_drm_buffer_pool_initialize (GstDRMBufferPool * self,
++ GstElement * element, int fd, GstCaps * caps, guint size)
++{
++ GstStructure *conf;
++
++ /* store the element that requested for the pool */
++ if(element)
++ self->element = gst_object_ref (element);
++
++ /* initialize device info */
++ self->fd = fd;
++ self->dev = omap_device_new (fd);
++
++ /* Padded size of buffers. Can be used for testing requested-buffer-size vs obtained-buffer-size */
++ self->size = size;
++
++
++ /* get the present config of the buffer pool */
++ conf = gst_buffer_pool_get_config (GST_BUFFER_POOL(self));
++ if(conf == NULL) {
++ GST_WARNING_OBJECT(self, "NULL config obtained after get_config on the pool");
++ }
++
++ /* set the config params : caps, size of the buffers, min number of buffers,
++ max number of buffers (0 for unlimited) */
++ gst_buffer_pool_config_set_params (conf, caps, size, 0, 0);
++ if(conf == NULL){
++ GST_WARNING_OBJECT(self, "NULL config after set_params");
++ }
++
++ /* set config of the pool */
++ gst_buffer_pool_set_config (GST_BUFFER_POOL(self), conf);
++
++}
++
++
++/**
++ * gst_drm_buffer_pool_new:
++ * @element: a #GstElement
++ * @fd: a file descriptor
++ * @caps: a #GstCaps
++ * @size: the padded size of buffers
++ *
++ * Creates a GstDRMBufferPool and initializes it through gst_drm_buffer_pool_initialize()
++ *
++ * Returns: the #GstDRMBufferPool created and initialized.
++ *
++ * Since: 1.2.?
++ */
++
++GstDRMBufferPool *
++gst_drm_buffer_pool_new (GstElement * element,
++ int fd, GstCaps * caps, guint size)
++{
++ GstDRMBufferPool *self = g_object_new (GST_TYPE_DRM_BUFFER_POOL, NULL);
++
++ GST_DEBUG_OBJECT (element,
++ "Creating DRM buffer pool with caps %" GST_PTR_FORMAT, caps);
++
++ gst_drm_buffer_pool_initialize (self, element, fd, caps, size);
++
++ return self;
++}
++
++
++/**
++ * gst_drm_buffer_pool_size:
++ * @self: a #GstDRMBufferPool
++ *
++ * Obtain the padded size of buffers set during bufferpool creation
++ *
++ * Returns: the size of individual buffers within the bufferpool.
++ *
++ * Since: 1.2.?
++ */
++
++guint
++gst_drm_buffer_pool_size (GstDRMBufferPool * self)
++{
++ return self->size;
++}
++
++
++/**
++ * gst_drm_buffer_pool_check_caps:
++ * @self: a #GstDRMBufferPool
++ * @caps: a #GstCaps
++ *
++ * Check if the @caps and the caps of the @self is strictly equal
++ *
++ * Returns: the boolean value obtained from gst_caps_is_strictly_equal()
++ *
++ * Since: 1.2.?
++ */
++
++gboolean
++gst_drm_buffer_pool_check_caps (GstDRMBufferPool * self, GstCaps * caps)
++{
++ return gst_caps_is_strictly_equal (self->caps, caps);
++}
++
++
++/**
++ * gst_drm_buffer_pool_destroy:
++ * @self: a #GstDRMBufferPool
++ *
++ * destroy existing bufferpool by gst_object_unref()
++ *
++ * Since: 1.2.?
++ */
++
++void
++gst_drm_buffer_pool_destroy (GstDRMBufferPool * self)
++{
++ g_return_if_fail (self);
++
++ GST_DEBUG_OBJECT (self->element, "destroy pool (contains: %d buffers)",
++ self->nbbufs);
++
++ /* Sets the buffer pool active to FALSE. Unrefs the buffer pool.
++ If the the ref_count becomes zero, all buffers are freed and the bufferpool is destroyed */
++ if(GST_OBJECT_REFCOUNT(self)) {
++ gst_buffer_pool_set_active (GST_BUFFER_POOL(self), FALSE);
++ gst_object_unref (self);
++ }
++}
++
++
++
++/**
++ * gst_drm_buffer_pool_get:
++ * @self: a #GstDRMBufferPool
++ * @force_alloc: a boolean indicating if a buffer should be acquired from already queued buffers of pool.
++ *
++ * Get a buffer from the #GstDRMBufferPool
++ *
++ * Returns: the #GstBuffer
++ *
++ * Since: 1.2.?
++ */
++
++GstBuffer *
++gst_drm_buffer_pool_get (GstDRMBufferPool * self, gboolean force_alloc)
++{
++ GstBuffer *buf = NULL;
++ g_return_val_if_fail (self, NULL);
++
++ /* Set the buffer pool to active so that acquire_buffer() is not blocked */
++ gst_buffer_pool_set_active (GST_BUFFER_POOL(self), TRUE);
++
++ /* re-use a buffer off the queued buffers of pool if any are available */
++ if (!force_alloc) {
++ gst_buffer_pool_acquire_buffer (GST_BUFFER_POOL (self), &buf, NULL);
++ } else {
++ GST_BUFFER_POOL_CLASS(GST_DRM_BUFFER_POOL_GET_CLASS (self))->alloc_buffer(GST_BUFFER_POOL (self), &buf, NULL);
++
++ }
++
++ /* Set the buffer pool active to FALSE */
++ gst_buffer_pool_set_active (GST_BUFFER_POOL(self), FALSE);
++
++ GST_LOG_OBJECT (self->element, "returning buf %p", buf);
++
++ return GST_BUFFER (buf);
++}
++
++
++/**
++ * gst_drm_buffer_pool_put:
++ * @self: a #GstDRMBufferPool
++ * @force_alloc: a boolean indicating if a buffer should be acquired from already queued buffers of pool.
++ *
++ * Get a buffer from the #GstDRMBufferPool
++ *
++ * Returns: the boolean value corresponding to success (TRUE)
++ *
++ * Since: 1.2.?
++ */
++gboolean
++gst_drm_buffer_pool_put (GstDRMBufferPool * self, GstBuffer * buf)
++{
++ gboolean reuse = gst_buffer_pool_is_active (GST_BUFFER_POOL (self));
++ if(reuse){
++ gst_buffer_pool_release_buffer(GST_BUFFER_POOL(self) , buf);
++ }
++ return reuse;
++}
++
++static void
++gst_drm_buffer_pool_finalize (GObject * pool)
++{
++ GstDRMBufferPool *self = GST_DRM_BUFFER_POOL (pool);
++ GST_DEBUG_OBJECT (self->element, "finalize");
++
++ if (self->caps)
++ gst_caps_unref (self->caps);
++ if (self->element)
++ gst_object_unref (self->element);
++ if (self->dev)
++ omap_device_del (self->dev);
++ G_OBJECT_CLASS (gst_drm_buffer_pool_parent_class)->finalize(pool);
++}
++
++static void
++gst_drm_buffer_pool_class_init (GstDRMBufferPoolClass * klass)
++{
++ GObjectClass *object_class;
++ GstBufferPoolClass *bclass = GST_BUFFER_POOL_CLASS (klass);
++ GST_DEBUG_CATEGORY_INIT (drmbufferpool_debug, "drmbufferpool", 0,
++ "DRM buffer pool");
++ parent_class = g_type_class_peek_parent (klass);
++ object_class = G_OBJECT_CLASS (klass);
++ bclass->set_config = gst_drm_buffer_pool_set_config;
++ bclass->alloc_buffer = gst_drm_alloc_new_buffer;
++ object_class->finalize = gst_drm_buffer_pool_finalize;
++}
++
++static void
++gst_drm_buffer_pool_init (GstDRMBufferPool * self)
++{
++#ifndef GST_DISABLE_GST_DEBUG
++ self->nbbufs = 0;
++#endif /* DEBUG */
++}
++
++/**
++ * gst_drm_alloc_new_buffer:
++ * @bufpool: a #GstBufferPool
++ * @buffer: a pointer to #GstBuffer
++ * @params: a #GstBufferPoolAcquireParams
++ *
++ * Allocate a new buffer to the #GstDRMBufferPool
++ *
++ * Returns: the #GstFlowReturn
++ *
++ * Since: 1.2.?
++ */
++static GstFlowReturn
++gst_drm_alloc_new_buffer (GstBufferPool * bufpool, GstBuffer ** buffer,
++ GstBufferPoolAcquireParams * params)
++{
++
++ /* create a buffer with ref_count = 1 */
++ GstBuffer *buf = gst_buffer_new ();
++ GstDRMBufferPool *pool = GST_DRM_BUFFER_POOL(bufpool);
++ GstVideoCropMeta *crop;
++ GstMetaDmaBuf *dmabuf;
++ GstVideoMeta *videometa;
++
++ /* TODO: if allocation could be handled via libkms then this
++ * bufferpool implementation could be completely generic..
++ * otherwise we might want some support for various different
++ * drm drivers here:
++ */
++
++ struct omap_bo *bo = omap_bo_new (pool->dev, pool->size, OMAP_BO_WC);
++ if (!bo) {
++ GST_WARNING_OBJECT (pool->element, "Failed to create bo");
++ return GST_FLOW_ERROR;;
++ }
++
++ /* allocating a memory to the buffer we created */
++ gst_buffer_append_memory (buf,
++ gst_memory_new_wrapped (GST_MEMORY_FLAG_NO_SHARE, omap_bo_map (bo),
++ pool->size, 0, pool->size, NULL, NULL));
++
++ /* Adding the necessary metadatas with initialization*/
++
++ dmabuf = gst_buffer_add_dma_buf_meta (GST_BUFFER (buf), omap_bo_dmabuf (bo));
++ if(!dmabuf){
++ GST_DEBUG_OBJECT (pool, "Failed to add dmabuf meta to buffer");
++ }
++
++ videometa = gst_buffer_add_video_meta(buf,GST_VIDEO_FRAME_FLAG_NONE, GST_VIDEO_INFO_FORMAT(&pool->info), pool->width, pool->height);
++ if(!videometa){
++ GST_DEBUG_OBJECT (pool, "Failed to add video meta to buffer");
++ }
++
++ crop = gst_buffer_add_video_crop_meta(buf);
++ if(!crop){
++ GST_DEBUG_OBJECT (pool, "Failed to add crop meta to buffer");
++ } else {
++ crop->x = 0;
++ crop->y = 0;
++ crop->height = pool->height;
++ crop->width = pool->width;
++ }
++
++ /* Pointer to the buffer (passed as argument) should now point to the buffer we created */
++ *buffer = buf;
++
++#ifndef GST_DISABLE_GST_DEBUG
++ {
++ GST_DEBUG_OBJECT (pool, "Creating new buffer (living buffer: %i)",
++ ++pool->nbbufs);
++ }
++#endif
++
++ return GST_FLOW_OK;
++
++}
++
+diff --git a/gst-libs/gst/drm/gstdrmbufferpool.h b/gst-libs/gst/drm/gstdrmbufferpool.h
+new file mode 100644
+index 0000000..a9f3fba
+--- /dev/null
++++ b/gst-libs/gst/drm/gstdrmbufferpool.h
+@@ -0,0 +1,138 @@
++/*
++ * GStreamer
++ *
++ * Copyright (C) 2012 Texas Instruments
++ * Copyright (C) 2012 Collabora Ltd
++ *
++ * Authors:
++ * Alessandro Decina <alessandro.decina@collabora.co.uk>
++ * Rob Clark <rob.clark@linaro.org>
++ *
++ * This library is free software; you can redistribute it and/or
++ * modify it under the terms of the GNU Lesser General Public
++ * License as published by the Free Software Foundation
++ * version 2.1 of the License.
++ *
++ * 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
++ * Lesser General Public License for more details.
++ *
++ * You should have received a copy of the GNU Lesser General Public
++ * License along with this library; if not, write to the Free Software
++ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
++ */
++
++#ifndef __GSTDRMBUFFERPOOL_H__
++#define __GSTDRMBUFFERPOOL_H__
++
++#include <gst/gst.h>
++#include <gst/video/gstvideometa.h>
++G_BEGIN_DECLS
++
++/* TODO replace dependency on libdrm_omap w/ libdrm.. the only thing
++ * missing is way to allocate buffers, but this should probably be
++ * done via libdrm?
++ *
++ * NOTE: this dependency is only for those who want to subclass us,
++ * so we could perhaps move the struct definitions into a separate
++ * header or split out private ptr and move that into the .c file..
++ */
++#include <stdint.h>
++#include <omap_drm.h>
++#include <omap_drmif.h>
++
++#define GST_TYPE_DRM_BUFFER_POOL (gst_drm_buffer_pool_get_type())
++#define GST_IS_DRM_BUFFER_POOL(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GST_TYPE_DRM_BUFFER_POOL))
++#define GST_DRM_BUFFER_POOL(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), GST_TYPE_DRM_BUFFER_POOL, GstDRMBufferPool))
++#define GST_DRM_BUFFER_POOL_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), GST_TYPE_DRM_BUFFER_POOL, GstDRMBufferPoolClass))
++#define GST_DRM_BUFFER_POOL_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), GST_TYPE_DRM_BUFFER_POOL, GstDRMBufferPoolClass))
++
++
++typedef struct _GstDRMBufferPool GstDRMBufferPool;
++typedef struct _GstDRMBufferPoolClass GstDRMBufferPoolClass;
++
++
++/*
++ * GstDRMBufferPool:
++ */
++
++struct _GstDRMBufferPool {
++ GstBufferPool parent;
++
++ int fd;
++ struct omap_device *dev;
++
++ /* output (padded) size including any codec padding: */
++ guint size;
++ gint width, height;
++
++ /* Video info obtained from caps */
++ GstVideoInfo info;
++
++ GstCaps *caps;
++ GstElement *element; /* the element that owns us.. */
++
++#ifndef GST_DISABLE_GST_DEBUG
++ guint nbbufs;
++#endif /* DEBUG */
++
++ /* TODO add reserved */
++};
++
++struct _GstDRMBufferPoolClass {
++ GstBufferPoolClass klass;
++
++ /* allow the subclass to allocate it's own buffers that extend
++ * GstDRMBuffer:
++ */
++ GstFlowReturn (*alloc_buffer)(GstBufferPool * pool, GstBuffer ** buffer,
++ GstBufferPoolAcquireParams * params);
++
++ /* The a buffer subclass should not override finalize, as that
++ * would interfere with reviving the buffer and returning to the
++ * pool. Instead you can implement this vmethod to cleanup a
++ * buffer.
++ */
++ void (*buffer_cleanup)(GstDRMBufferPool * pool, GstBuffer *buf);
++
++ /* Called when a buffer is added back to the pool after its last
++ * ref has been removed.
++ */
++ void (*buffer_pooled)(GstDRMBufferPool * pool, GstBuffer *buf);
++
++ /* TODO add reserved */
++};
++
++GType gst_drm_buffer_pool_get_type (void);
++
++void gst_drm_buffer_pool_initialize (GstDRMBufferPool * self,
++ GstElement * element, int fd, GstCaps * caps, guint size);
++
++/* to set/change the config of pool */
++gboolean gst_drm_buffer_pool_set_config (GstBufferPool * pool, GstStructure * config);
++
++/* create a new drm buffer pool */
++GstDRMBufferPool * gst_drm_buffer_pool_new (GstElement * element,
++ int fd, GstCaps * caps, guint size);
++
++/* unref the drm buffer pool */
++void gst_drm_buffer_pool_destroy (GstDRMBufferPool * self);
++
++/* size of buffers in the pool */
++guint gst_drm_buffer_pool_size (GstDRMBufferPool * self);
++
++/* check the present caps of the pool */
++gboolean gst_drm_buffer_pool_check_caps (GstDRMBufferPool * self,
++ GstCaps * caps);
++
++/* get a buffer from the pool */
++GstBuffer * gst_drm_buffer_pool_get (GstDRMBufferPool * self,
++ gboolean force_alloc);
++
++/* release a buffer to the pool */
++gboolean gst_drm_buffer_pool_put (GstDRMBufferPool * self, GstBuffer * buf);
++
++G_END_DECLS
++
++#endif /* __GSTDRMBUFFERPOOL_H__ */
+diff --git a/pkgconfig/Makefile.am b/pkgconfig/Makefile.am
+index 430e123..3fde657 100644
+--- a/pkgconfig/Makefile.am
++++ b/pkgconfig/Makefile.am
+@@ -3,12 +3,14 @@
+ pcverfiles = \
+ gstreamer-plugins-bad-@GST_API_VERSION@.pc \
+ gstreamer-codecparsers-@GST_API_VERSION@.pc \
++ gstreamer-drm-@GST_API_VERSION@.pc \
+ gstreamer-insertbin-@GST_API_VERSION@.pc \
+ gstreamer-mpegts-@GST_API_VERSION@.pc
+
+ pcverfiles_uninstalled = \
+ gstreamer-plugins-bad-@GST_API_VERSION@-uninstalled.pc \
+ gstreamer-codecparsers-@GST_API_VERSION@-uninstalled.pc \
++ gstreamer-drm-@GST_API_VERSION@-uninstalled.pc \
+ gstreamer-insertbin-@GST_API_VERSION@-uninstalled.pc \
+ gstreamer-mpegts-@GST_API_VERSION@-uninstalled.pc
+
+@@ -36,6 +38,7 @@ CLEANFILES = $(pcverfiles) $(pcverfiles_uninstalled)
+ pcinfiles = \
+ gstreamer-plugins-bad.pc.in gstreamer-plugins-bad-uninstalled.pc.in \
+ gstreamer-codecparsers.pc.in gstreamer-codecparsers-uninstalled.pc.in \
++ gstreamer-drm.pc.in gstreamer-drm-uninstalled.pc.in \
+ gstreamer-insertbin.pc.in gstreamer-insertbin-uninstalled.pc.in \
+ gstreamer-egl.pc.in gstreamer-egl-uninstalled.pc.in \
+ gstreamer-mpegts.pc.in gstreamer-mpegts-uninstalled.pc.in
+diff --git a/pkgconfig/gstreamer-drm-uninstalled.pc.in b/pkgconfig/gstreamer-drm-uninstalled.pc.in
+new file mode 100644
+index 0000000..fc0e3f2
+--- /dev/null
++++ b/pkgconfig/gstreamer-drm-uninstalled.pc.in
+@@ -0,0 +1,12 @@
++prefix=
++exec_prefix=
++libdir=${pcfiledir}/../gst-libs/gst/drm
++includedir=${pcfiledir}/../gst-libs
++
++Name: GStreamer DRM buffer pool, Uninstalled
++Description: DRM buffer pool for GStreamer elements, uninstalled
++Requires: gstreamer-@GST_MAJORMINOR@ gstreamer-base-@GST_MAJORMINOR@
++Version: @VERSION@
++Libs: -L${libdir} ${libdir}/libgstdrm-@GST_MAJORMINOR@.la
++Cflags: -I${includedir}
++
+diff --git a/pkgconfig/gstreamer-drm.pc.in b/pkgconfig/gstreamer-drm.pc.in
+new file mode 100644
+index 0000000..8182b4f
+--- /dev/null
++++ b/pkgconfig/gstreamer-drm.pc.in
+@@ -0,0 +1,12 @@
++prefix=@prefix@
++exec_prefix=@exec_prefix@
++libdir=@libdir@
++includedir=@includedir@/gstreamer-@GST_MAJORMINOR@
++
++Name: GStreamer DRM buffer pool
++Description: DRM buffer pool for GStreamer elements
++Requires: gstreamer-@GST_MAJORMINOR@ gstreamer-base-@GST_MAJORMINOR@
++Version: @VERSION@
++Libs: -L${libdir} -lgstdrm-@GST_MAJORMINOR@
++Cflags: -I${includedir}
++
+diff --git a/pkgconfig/gstreamer-plugins-bad-uninstalled.pc.in b/pkgconfig/gstreamer-plugins-bad-uninstalled.pc.in
+index 6fcf773..ed0e5b0 100644
+--- a/pkgconfig/gstreamer-plugins-bad-uninstalled.pc.in
++++ b/pkgconfig/gstreamer-plugins-bad-uninstalled.pc.in
+@@ -10,5 +10,5 @@ Name: GStreamer Bad Plugin libraries, Uninstalled
+ Description: Streaming media framework, bad plugins libraries, uninstalled
+ Version: @VERSION@
+ Requires: gstreamer-@GST_API_VERSION@
+-Libs: -L@abs_top_builddir@/gst-libs/gst/basecamerabinsrc -L@abs_top_builddir@/gst-libs/gst/codecparsers -L@abs_top_builddir@/gst-libs/gst/egl -L@abs_top_builddir@/gst-libs/gst/insertbin -L@abs_top_builddir@/gst-libs/gst/interfaces -L@abs_top_builddir@/gst-libs/gst/mpegts -L@abs_top_builddir@/gst-libs/gst/signalprocessor -L@abs_top_builddir@/gst-libs/gst/video
++Libs: -L@abs_top_builddir@/gst-libs/gst/basecamerabinsrc -L@abs_top_builddir@/gst-libs/gst/codecparsers -L@abs_top_builddir@/gst-libs/gst/drm -L@abs_top_builddir@/gst-libs/gst/egl -L@abs_top_builddir@/gst-libs/gst/insertbin -L@abs_top_builddir@/gst-libs/gst/interfaces -L@abs_top_builddir@/gst-libs/gst/mpegts -L@abs_top_builddir@/gst-libs/gst/signalprocessor -L@abs_top_builddir@/gst-libs/gst/video
+ Cflags: -I@abs_top_srcdir@/gst-libs -I@abs_top_builddir@/gst-libs
+--
+1.7.9.5
+
diff --git a/meta-arago-extras/recipes-multimedia/gstreamer/gstreamer1.0-plugins-bad/0002-Modified-waylandsink-to-accept-NV12-format.patch b/meta-arago-extras/recipes-multimedia/gstreamer/gstreamer1.0-plugins-bad/0002-Modified-waylandsink-to-accept-NV12-format.patch
new file mode 100644
index 0000000..875ff0b
--- /dev/null
+++ b/meta-arago-extras/recipes-multimedia/gstreamer/gstreamer1.0-plugins-bad/0002-Modified-waylandsink-to-accept-NV12-format.patch
@@ -0,0 +1,1017 @@
+From 4aba7f1afbd6c364e649f4c0e539c9a93d59bce6 Mon Sep 17 00:00:00 2001
+From: Pooja Prajod <a0132412@ti.com>
+Date: Fri, 12 Dec 2014 12:57:22 +0530
+Subject: [PATCH] Modified waylandsink to accept NV12 format
+
+Wayland sink now accepts NV12 format buffers. A support function gst_wl_buffer_priv
+has been added to check if it is a buffer with GstMetaDmabuf metadata set and
+create a wl_buffer. A hashtable is also maintained with GstMetaDmabuf fd as key
+---
+ configure.ac | 6 +-
+ ext/wayland/Makefile.am | 11 +-
+ ext/wayland/gstwaylandsink.c | 203 +++++++++++++++++--
+ ext/wayland/gstwaylandsink.h | 18 ++
+ .../ext/wayland/gstwlbufferpriv.c | 156 ++++++++++++++
+ .../ext/wayland/gstwlbufferpriv.h | 56 +++++
+ .../ext/wayland/wayland-drm-client-protocol.h | 213 ++++++++++++++++++++
+ .../ext/wayland/wayland-drm-protocol.c | 74 +++++++
+ 8 files changed, 717 insertions(+), 20 deletions(-)
+ create mode 100644 ext/wayland/gstwlbufferpriv.c
+ create mode 100644 ext/wayland/gstwlbufferpriv.h
+ create mode 100644 ext/wayland/wayland-drm-client-protocol.h
+ create mode 100644 ext/wayland/wayland-drm-protocol.c
+
+diff --git a/configure.ac b/configure.ac
+index edf8ea8..b94bd5d 100644
+--- a/configure.ac
++++ b/configure.ac
+@@ -1219,8 +1219,10 @@ AG_GST_CHECK_FEATURE(DIRECTFB, [directfb], dfbvideosink , [
+ dnl **** Wayland ****
+ translit(dnm, m, l) AM_CONDITIONAL(USE_WAYLAND, true)
+ AG_GST_CHECK_FEATURE(WAYLAND, [wayland sink], wayland , [
+- PKG_CHECK_MODULES(WAYLAND, wayland-client >= 1.0.0, [
+- HAVE_WAYLAND="yes" ], [ HAVE_WAYLAND="no"
++ PKG_CHECK_MODULES(WAYLAND, wayland-client >= 1.0.0 dri2 libdrm libdrm_omap, [
++ AC_SUBST(DRM_CFLAGS)
++ AC_SUBST(DRM_LIBS)
++ HAVE_WAYLAND="yes" ], [ HAVE_WAYLAND="no"
+ ])
+ ])
+
+diff --git a/ext/wayland/Makefile.am b/ext/wayland/Makefile.am
+index e8edf73..2c7a12f 100644
+--- a/ext/wayland/Makefile.am
++++ b/ext/wayland/Makefile.am
+@@ -1,12 +1,15 @@
+ plugin_LTLIBRARIES = libgstwaylandsink.la
+
+-libgstwaylandsink_la_SOURCES = gstwaylandsink.c waylandpool.c
++libgstwaylandsink_la_SOURCES = gstwaylandsink.c waylandpool.c gstwlbufferpriv.c wayland-drm-protocol.c
+ libgstwaylandsink_la_CFLAGS = $(GST_CFLAGS) $(GST_PLUGINS_BASE_CFLAGS) \
+- $(WAYLAND_CFLAGS)
++ $(GST_PLUGINS_BAD_CFLAGS) \
++ $(WAYLAND_CFLAGS) $(DRM_CFLAGS)
+ libgstwaylandsink_la_LIBADD = $(GST_PLUGINS_BASE_LIBS) \
+ -lgstvideo-$(GST_API_VERSION) \
+- $(WAYLAND_LIBS)
++ $(WAYLAND_LIBS) \
++ -lgstdmabuf-$(GST_API_VERSION) \
++ $(top_builddir)/gst-libs/gst/drm/libgstdrm-$(GST_API_VERSION).la
+ libgstwaylandsink_la_LDFLAGS = $(GST_PLUGIN_LDFLAGS)
+ libgstwaylandsink_la_LIBTOOLFLAGS = $(GST_PLUGIN_LIBTOOLFLAGS)
+
+-noinst_HEADERS = gstwaylandsink.h waylandpool.h
++noinst_HEADERS = gstwaylandsink.h waylandpool.h gstwlbufferpriv.h wayland-drm-client-protocol.h
+diff --git a/ext/wayland/gstwaylandsink.c b/ext/wayland/gstwaylandsink.c
+index cabf310..bb7d838 100644
+--- a/ext/wayland/gstwaylandsink.c
++++ b/ext/wayland/gstwaylandsink.c
+@@ -41,6 +41,13 @@
+ #endif
+
+ #include "gstwaylandsink.h"
++#include "gstwlbufferpriv.h"
++
++#include <wayland-client-protocol.h>
++#include "wayland-drm-client-protocol.h"
++
++#include <linux/input.h>
++
+
+ /* signals */
+ enum
+@@ -60,9 +67,9 @@ GST_DEBUG_CATEGORY (gstwayland_debug);
+ #define GST_CAT_DEFAULT gstwayland_debug
+
+ #if G_BYTE_ORDER == G_BIG_ENDIAN
+-#define CAPS "{xRGB, ARGB}"
++#define CAPS "{xRGB, ARGB, NV21}"
+ #else
+-#define CAPS "{BGRx, BGRA}"
++#define CAPS "{BGRx, BGRA, NV12, I420, YUY2, UYVY}"
+ #endif
+
+ static GstStaticPadTemplate sink_template = GST_STATIC_PAD_TEMPLATE ("sink",
+@@ -181,6 +188,15 @@ gst_wayland_sink_class_init (GstWaylandSinkClass * klass)
+ G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
+ }
+
++/* Free function for key destruction for the hashtable we are using*/
++static void
++wlbufferpriv_free_func (GstWLBufferPriv *priv)
++{
++ wl_buffer_destroy (priv->buffer);
++ omap_bo_del (priv->bo);
++ g_free(priv);
++}
++
+ static void
+ gst_wayland_sink_init (GstWaylandSink * sink)
+ {
+@@ -188,7 +204,10 @@ gst_wayland_sink_init (GstWaylandSink * sink)
+ sink->window = NULL;
+ sink->shm_pool = NULL;
+ sink->pool = NULL;
+-
++ sink->drm_pool = NULL;
++ /* Initialising the hastable for storing map between dmabuf fd and GstWLBufferPriv */
++ sink->wlbufferpriv = g_hash_table_new_full (g_direct_hash, g_direct_equal,
++ NULL, (GDestroyNotify) wlbufferpriv_free_func);
+ g_mutex_init (&sink->wayland_lock);
+ }
+
+@@ -230,6 +249,9 @@ destroy_display (struct display *display)
+ if (display->shm)
+ wl_shm_destroy (display->shm);
+
++ if (display->drm)
++ wl_drm_destroy (display->drm);
++
+ if (display->shell)
+ wl_shell_destroy (display->shell);
+
+@@ -280,6 +302,14 @@ gst_wayland_sink_finalize (GObject * object)
+ destroy_display (sink->display);
+ if (sink->shm_pool)
+ shm_pool_destroy (sink->shm_pool);
++ if (sink->drm_pool) {
++ gst_drm_buffer_pool_destroy (sink->drm_pool);
++ sink->drm_pool = NULL;
++ }
++ if (sink->wlbufferpriv){
++ g_hash_table_destroy (sink->wlbufferpriv);
++ sink->wlbufferpriv = NULL;
++ }
+
+ g_mutex_clear (&sink->wayland_lock);
+
+@@ -318,6 +348,56 @@ struct wl_shm_listener shm_listenter = {
+ shm_format
+ };
+
++/* For wl_drm_listener */
++static void
++drm_handle_device (void *data, struct wl_drm *drm, const char *device)
++{
++ struct display *d = data;
++ drm_magic_t magic;
++
++ d->fd = open (device, O_RDWR | O_CLOEXEC);
++ if (d->fd == -1) {
++ GST_ERROR ("could not open %s: %m", device);
++ // XXX hmm, probably need to throw up some error now??
++ return;
++ }
++
++ drmGetMagic (d->fd, &magic);
++ wl_drm_authenticate (d->drm, magic);
++}
++
++
++static void
++drm_handle_format (void *data, struct wl_drm *drm, uint32_t format)
++{
++ struct display *d = data;
++ GST_DEBUG ("got format: %" GST_FOURCC_FORMAT, GST_FOURCC_ARGS (format));
++ if (d->drm_format_count < 50) {
++ d->drm_formats[d->drm_format_count++] = format;
++ } else {
++ GST_WARNING ("drm_handle_formats (no room for more formats): %"
++ GST_FOURCC_FORMAT, GST_FOURCC_ARGS (format));
++ }
++}
++
++static void
++drm_handle_authenticated (void *data, struct wl_drm *drm)
++{
++ struct display *d = data;
++ GST_DEBUG ("authenticated");
++ d->dev = omap_device_new (d->fd);
++ d->authenticated = 1;
++ GST_DEBUG("drm_handle_authenticated: dev: %p, d->authenticated: %d\n", d->dev, d->authenticated);
++}
++
++static const struct wl_drm_listener drm_listener = {
++ drm_handle_device,
++ drm_handle_format,
++ drm_handle_authenticated
++};
++
++
++
+ static void
+ registry_handle_global (void *data, struct wl_registry *registry,
+ uint32_t id, const char *interface, uint32_t version)
+@@ -332,6 +412,9 @@ registry_handle_global (void *data, struct wl_registry *registry,
+ } else if (strcmp (interface, "wl_shm") == 0) {
+ d->shm = wl_registry_bind (registry, id, &wl_shm_interface, 1);
+ wl_shm_add_listener (d->shm, &shm_listenter, d);
++ } else if (strcmp (interface, "wl_drm") == 0) {
++ d->drm = wl_registry_bind (registry, id, &wl_drm_interface, 1);
++ wl_drm_add_listener (d->drm, &drm_listener, d);
+ }
+ }
+
+@@ -351,13 +434,14 @@ create_display (void)
+ free (display);
+ return NULL;
+ }
++ display->authenticated = 0;
+
+ display->registry = wl_display_get_registry (display->display);
+ wl_registry_add_listener (display->registry, ®istry_listener, display);
+
+ wl_display_roundtrip (display->display);
+- if (display->shm == NULL) {
+- GST_ERROR ("No wl_shm global..");
++ if (display->shm == NULL && display->drm == NULL) {
++ GST_ERROR ("No wl_shm global and wl_drm global..");
+ return NULL;
+ }
+
+@@ -384,6 +468,61 @@ gst_wayland_sink_format_from_caps (uint32_t * wl_format, GstCaps * caps)
+ return (*wl_format != -1);
+ }
+
++static void
++wait_authentication (GstWaylandSink * sink)
++{
++ GST_DEBUG_OBJECT (sink, "Before wait aunthenticated value is %d : \n", sink->display->authenticated );
++ while (!sink->display->authenticated) {
++ GST_DEBUG_OBJECT (sink, "waiting for authentication");
++ wl_display_roundtrip (sink->display->display);
++ }
++ GST_DEBUG_OBJECT (sink, "After wait aunthenticated value is %d : \n", sink->display->authenticated );
++}
++
++/* create a drm buffer pool if the video format is NV12 */
++static gboolean
++create_pool (GstWaylandSink * sink, GstCaps * caps)
++{
++
++ GstVideoInfo info;
++
++ wait_authentication (sink);
++
++ while (!sink->display->authenticated) {
++ GST_DEBUG_OBJECT (sink, "not authenticated yet");
++ }
++
++ if (!gst_video_info_from_caps (&info, caps))
++ goto invalid_format;
++
++
++
++ if (sink->drm_pool) {
++ GST_INFO_OBJECT (sink, "recreating pool");
++ gst_drm_buffer_pool_destroy (sink->drm_pool);
++ sink->drm_pool = NULL;
++ }
++
++ sink->video_width = info.width;
++ sink->video_height = info.height;
++
++ sink->drm_pool = gst_drm_buffer_pool_new (GST_ELEMENT (sink),
++ sink->display->fd, caps, info.size);
++ if(sink->drm_pool){
++ return TRUE;
++ }
++ else {
++ return FALSE;
++ }
++
++invalid_format:
++ {
++ GST_DEBUG_OBJECT (sink,
++ "Could not locate image format from caps %" GST_PTR_FORMAT, caps);
++ return FALSE;
++ }
++}
++
+ static gboolean
+ gst_wayland_sink_set_caps (GstBaseSink * bsink, GstCaps * caps)
+ {
+@@ -393,6 +532,7 @@ gst_wayland_sink_set_caps (GstBaseSink * bsink, GstCaps * caps)
+ GstStructure *structure;
+ static GstAllocationParams params = { 0, 0, 0, 15, };
+ guint size;
++ GstVideoFormat fmt;
+
+ sink = GST_WAYLAND_SINK (bsink);
+
+@@ -401,15 +541,23 @@ gst_wayland_sink_set_caps (GstBaseSink * bsink, GstCaps * caps)
+ if (!gst_video_info_from_caps (&info, caps))
+ goto invalid_format;
+
++ fmt = GST_VIDEO_INFO_FORMAT(&info);
++ if (fmt == GST_VIDEO_FORMAT_NV12 || fmt == GST_VIDEO_FORMAT_I420 || fmt == GST_VIDEO_FORMAT_YUY2 || fmt == GST_VIDEO_FORMAT_UYVY){
++ create_pool(sink, caps);
++ return TRUE;
++ }
++
+ if (!gst_wayland_sink_format_from_caps (&sink->format, caps))
+ goto invalid_format;
+
++
+ if (!(sink->display->formats & (1 << sink->format))) {
+ GST_DEBUG_OBJECT (sink, "%s not available",
+ gst_wayland_format_to_string (sink->format));
+ return FALSE;
+ }
+
++
+ sink->video_width = info.width;
+ sink->video_height = info.height;
+ size = info.size;
+@@ -417,6 +565,7 @@ gst_wayland_sink_set_caps (GstBaseSink * bsink, GstCaps * caps)
+ /* create a new pool for the new configuration */
+ newpool = gst_wayland_buffer_pool_new (sink);
+
++
+ if (!newpool) {
+ GST_DEBUG_OBJECT (sink, "Failed to create new pool");
+ return FALSE;
+@@ -532,6 +681,7 @@ gst_wayland_sink_propose_allocation (GstBaseSink * bsink, GstQuery * query)
+ {
+ GstWaylandSink *sink = GST_WAYLAND_SINK (bsink);
+ GstBufferPool *pool;
++ GstDRMBufferPool *drm_pool;
+ GstStructure *config;
+ GstCaps *caps;
+ guint size;
+@@ -562,6 +712,7 @@ gst_wayland_sink_propose_allocation (GstBaseSink * bsink, GstQuery * query)
+ gst_structure_free (config);
+ }
+
++
+ if (pool == NULL && need_pool) {
+ GstVideoInfo info;
+
+@@ -583,7 +734,6 @@ gst_wayland_sink_propose_allocation (GstBaseSink * bsink, GstQuery * query)
+ gst_query_add_allocation_pool (query, pool, size, 2, 0);
+ gst_object_unref (pool);
+ }
+-
+ return TRUE;
+
+ /* ERRORS */
+@@ -624,35 +774,54 @@ static const struct wl_callback_listener frame_callback_listener = {
+ frame_redraw_callback
+ };
+
++
+ static GstFlowReturn
+ gst_wayland_sink_render (GstBaseSink * bsink, GstBuffer * buffer)
+ {
+ GstWaylandSink *sink = GST_WAYLAND_SINK (bsink);
+ GstVideoRectangle src, dst, res;
+- GstBuffer *to_render;
++ GstBuffer *to_render = NULL;
+ GstWlMeta *meta;
+ GstFlowReturn ret;
+ struct window *window;
+ struct display *display;
+-
++ GstWLBufferPriv *priv;
++ GstMapInfo mapsrc;
++
+ GST_LOG_OBJECT (sink, "render buffer %p", buffer);
+- if (!sink->window)
+- create_window (sink, sink->display, sink->video_width, sink->video_height);
++ if (!sink->window){
++ gint video_width = sink->video_width;
++ gint video_height = sink->video_height;
++ GstVideoCropMeta* crop = gst_buffer_get_video_crop_meta (buffer);
++ if(crop){
++ if (crop->width) {
++ video_width = crop->width;
++ }
++ if (crop->height) {
++ video_height = crop->height;
++ }
++ }
++ create_window (sink, sink->display, video_width, video_height);
++ }
+
+ window = sink->window;
+ display = sink->display;
+
+ meta = gst_buffer_get_wl_meta (buffer);
++ priv = gst_wl_buffer_priv (sink, buffer);
+
+ if (window->redraw_pending) {
+ wl_display_dispatch (display->display);
+ }
+
++
+ if (meta && meta->sink == sink) {
+ GST_LOG_OBJECT (sink, "buffer %p from our pool, writing directly", buffer);
+ to_render = buffer;
++ } else if(priv) {
++ to_render = buffer;
++ GST_LOG_OBJECT (sink, " priv buffer %p from drm pool, writing directly", buffer);
+ } else {
+- GstMapInfo src;
+ GST_LOG_OBJECT (sink, "buffer %p not from our pool, copying", buffer);
+
+ if (!sink->pool)
+@@ -665,9 +834,9 @@ gst_wayland_sink_render (GstBaseSink * bsink, GstBuffer * buffer)
+ if (ret != GST_FLOW_OK)
+ goto no_buffer;
+
+- gst_buffer_map (buffer, &src, GST_MAP_READ);
+- gst_buffer_fill (to_render, 0, src.data, src.size);
+- gst_buffer_unmap (buffer, &src);
++ gst_buffer_map (buffer, &mapsrc, GST_MAP_READ);
++ gst_buffer_fill (to_render, 0, mapsrc.data, mapsrc.size);
++ gst_buffer_unmap (buffer, &mapsrc);
+
+ meta = gst_buffer_get_wl_meta (to_render);
+ }
+@@ -679,7 +848,13 @@ gst_wayland_sink_render (GstBaseSink * bsink, GstBuffer * buffer)
+
+ gst_video_sink_center_rect (src, dst, &res, FALSE);
+
++ /* display the buffer stored in priv, if the buffer obtained returns a priv */
++ if(priv){
++ wl_surface_attach (sink->window->surface, priv->buffer, res.x, res.y);
++ } else {
+ wl_surface_attach (sink->window->surface, meta->wbuffer, 0, 0);
++ }
++
+ wl_surface_damage (sink->window->surface, 0, 0, res.w, res.h);
+ window->redraw_pending = TRUE;
+ window->callback = wl_surface_frame (window->surface);
+diff --git a/ext/wayland/gstwaylandsink.h b/ext/wayland/gstwaylandsink.h
+index cb3383e..b3fbbac 100644
+--- a/ext/wayland/gstwaylandsink.h
++++ b/ext/wayland/gstwaylandsink.h
+@@ -39,9 +39,11 @@
+ #include <gst/video/video.h>
+ #include <gst/video/gstvideosink.h>
+ #include <gst/video/gstvideometa.h>
++#include <gst/drm/gstdrmbufferpool.h>
+
+ #include <wayland-client.h>
+
++
+ #define GST_TYPE_WAYLAND_SINK \
+ (gst_wayland_sink_get_type())
+ #define GST_WAYLAND_SINK(obj) \
+@@ -62,7 +64,19 @@ struct display
+ struct wl_compositor *compositor;
+ struct wl_shell *shell;
+ struct wl_shm *shm;
++ struct wl_drm *drm;
+ uint32_t formats;
++
++ uint32_t drm_formats[50];
++ int drm_format_count;
++ /* the drm device.. needed for sharing direct-render buffers..
++ * TODO nothing about this should really be omapdrm specific. But some
++ * of the code, like hashtable of imported buffers in libdrm_omap should
++ * be refactored out into some generic libdrm code..
++ */
++ struct omap_device *dev;
++ int fd;
++ int authenticated;
+ };
+
+ struct window
+@@ -99,6 +113,10 @@ struct _GstWaylandSink
+
+ GstBufferPool *pool;
+
++ /* for NV12 buffers on wl_drm_buffer */
++ GstDRMBufferPool *drm_pool;
++ GHashTable *wlbufferpriv;
++
+ GMutex wayland_lock;
+
+ gint video_width;
+diff --git a/ext/wayland/gstwlbufferpriv.c b/ext/wayland/gstwlbufferpriv.c
+new file mode 100644
+index 0000000..07fdf70
+--- /dev/null
++++ b/ext/wayland/gstwlbufferpriv.c
+@@ -0,0 +1,156 @@
++/*
++ * GStreamer
++ *
++ * Copyright (C) 2012 Texas Instruments
++ * Copyright (C) 2012 Collabora Ltd
++ *
++ * Authors:
++ * Alessandro Decina <alessandro.decina@collabora.co.uk>
++ * Rob Clark <rob.clark@linaro.org>
++ *
++ * This library is free software; you can redistribute it and/or
++ * modify it under the terms of the GNU Lesser General Public
++ * License as published by the Free Software Foundation
++ * version 2.1 of the License.
++ *
++ * 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
++ * Lesser General Public License for more details.
++ *
++ * You should have received a copy of the GNU Lesser General Public
++ * License along with this library; if not, write to the Free Software
++ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
++ */
++
++#ifdef HAVE_CONFIG_H
++#include "config.h"
++#endif
++
++#include <stdint.h>
++#include <gst/gst.h>
++#include <gst/dmabuf/dmabuf.h>
++#include <gst/video/gstvideometa.h>
++
++#include <omap_drm.h>
++#include <omap_drmif.h>
++
++#include "gstwaylandsink.h"
++#include "gstwlbufferpriv.h"
++#include "wayland-drm-client-protocol.h"
++
++
++/* Create planar wl_buffer that can be given to waylandsink.
++ * Crop info is also used */
++static int
++create_wl_buffer (GstWLBufferPriv * priv, GstWaylandSink * sink,
++ GstBuffer * buf)
++{
++ GstVideoCropMeta *crop;
++ gint video_width = sink->video_width;
++ gint video_height = sink->video_height;
++
++ /* TODO get format, etc from caps.. and query device for
++ * supported formats, and make this all more flexible to
++ * cope with various formats:
++ */
++ uint32_t fourcc = GST_MAKE_FOURCC ('N', 'V', '1', '2');
++ uint32_t name;
++
++ /* note: wayland and mesa use the terminology:
++ * stride - rowstride in bytes
++ * pitch - rowstride in pixels
++ */
++ uint32_t strides[3] = {
++ GST_ROUND_UP_4 (sink->video_width), GST_ROUND_UP_4 (sink->video_width), 0,
++ };
++ uint32_t offsets[3] = {
++ 0, strides[0] * sink->video_height, 0
++ };
++
++ crop = gst_buffer_get_video_crop_meta (buf);
++ if (crop) {
++ guint left, top;
++ left = crop->y;
++ top = crop->x;
++
++ offsets[0] = left;
++ offsets[1] += (video_width * top / 2) + left;
++ if(crop->width)
++ video_width = crop->width;
++ }
++
++ if (omap_bo_get_name (priv->bo, &name)) {
++ GST_WARNING_OBJECT (sink, "could not get name");
++ return -1;
++ }
++
++ GST_LOG_OBJECT (sink,"width = %d , height = %d , fourcc = %d ", video_width, video_height, fourcc );
++
++ priv->buffer = wl_drm_create_planar_buffer (sink->display->drm, name,
++ video_width, video_height, fourcc,
++ offsets[0], strides[0],
++ offsets[1], strides[1],
++ offsets[2], strides[2]);
++
++ GST_DEBUG_OBJECT (sink, "create planar buffer: %p (name=%d)",
++ priv->buffer, name);
++
++ return priv->buffer ? 0 : -1;
++}
++
++
++/**
++ * gst_wl_buffer_priv:
++ * @sink: a #GstWaylandSink
++ * @buf: a pointer to #GstBuffer
++ *
++ * Checks if the @buf has a GstMetaDmaBuf metadata set. If it doesn't we return a NULL
++ * indicating its not a dmabuf buffer. We maintain a hashtable with dmabuf fd as key and
++ * the GstWLBufferPriv structure as value
++ *
++ * Returns: the #GstWLBufferPriv
++ *
++ * Since: 1.2.?
++ */
++GstWLBufferPriv *
++gst_wl_buffer_priv (GstWaylandSink * sink, GstBuffer * buf)
++{
++
++ GstMetaDmaBuf *dmabuf = gst_buffer_get_dma_buf_meta (buf);
++ GstWLBufferPriv *priv;
++ int fd,fd_copy;
++
++ /* if it isn't a dmabuf buffer that we can import, then there
++ * is nothing we can do with it:
++ */
++ if (!dmabuf) {
++ GST_DEBUG_OBJECT (sink, "not importing non dmabuf buffer");
++ return NULL;
++ }
++ fd = gst_dma_buf_meta_get_fd (dmabuf);
++ fd_copy =fd;
++
++ /* lookup the hashtable with fd as key. If present return bo & buffer structure */
++ priv = g_hash_table_lookup (sink->wlbufferpriv, (gpointer)fd_copy);
++ if(priv) {
++ return priv;
++ }
++
++ priv = g_malloc0 (sizeof (GstWLBufferPriv));
++ priv->bo = omap_bo_from_dmabuf (sink->display->dev, fd);
++
++ if (create_wl_buffer (priv, sink, buf)) {
++ GST_WARNING_OBJECT (sink, "could not create framebuffer: %s",
++ strerror (errno));
++ g_free(priv);
++ return NULL;
++ }
++
++ /* if fd not present, write to hash table fd and the corresponding priv. */
++ g_hash_table_insert(sink->wlbufferpriv, (gpointer)fd_copy, priv);
++
++
++ return priv;
++}
++
+diff --git a/ext/wayland/gstwlbufferpriv.h b/ext/wayland/gstwlbufferpriv.h
+new file mode 100644
+index 0000000..fbce4a2
+--- /dev/null
++++ b/ext/wayland/gstwlbufferpriv.h
+@@ -0,0 +1,56 @@
++/*
++ * GStreamer
++ *
++ * Copyright (C) 2012 Texas Instruments
++ * Copyright (C) 2012 Collabora Ltd
++ *
++ * Authors:
++ * Alessandro Decina <alessandro.decina@collabora.co.uk>
++ * Rob Clark <rob.clark@linaro.org>
++ *
++ * This library is free software; you can redistribute it and/or
++ * modify it under the terms of the GNU Lesser General Public
++ * License as published by the Free Software Foundation
++ * version 2.1 of the License.
++ *
++ * 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
++ * Lesser General Public License for more details.
++ *
++ * You should have received a copy of the GNU Lesser General Public
++ * License along with this library; if not, write to the Free Software
++ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
++ */
++
++#ifndef __GSTWLBUFFERPRIV_H__
++#define __GSTWLBUFFERPRIV_H__
++
++#include <stdint.h>
++#include <gst/gst.h>
++
++#include <omap_drm.h>
++#include <omap_drmif.h>
++
++#include <wayland-client.h>
++
++G_BEGIN_DECLS
++
++
++typedef struct
++{
++ struct omap_bo *bo;
++ struct wl_buffer *buffer;
++
++}GstWLBufferPriv;
++
++
++GType gst_wl_buffer_priv_get_type (void);
++
++/* Returns a GstWLBufferPriv, if it has a dmabuf fd meatadata */
++GstWLBufferPriv * gst_wl_buffer_priv (GstWaylandSink *sink, GstBuffer * buf);
++
++G_END_DECLS
++
++
++#endif /* __GSTWLBUFFERPRIV_H__ */
+diff --git a/ext/wayland/wayland-drm-client-protocol.h b/ext/wayland/wayland-drm-client-protocol.h
+new file mode 100644
+index 0000000..7ddb614
+--- /dev/null
++++ b/ext/wayland/wayland-drm-client-protocol.h
+@@ -0,0 +1,213 @@
++/*
++ * Copyright © 2008-2011 Kristian Høgsberg
++ * Copyright © 2010-2011 Intel Corporation
++ *
++ * Permission to use, copy, modify, distribute, and sell this
++ * software and its documentation for any purpose is hereby granted
++ * without fee, provided that\n the above copyright notice appear in
++ * all copies and that both that copyright notice and this permission
++ * notice appear in supporting documentation, and that the name of
++ * the copyright holders not be used in advertising or publicity
++ * pertaining to distribution of the software without specific,
++ * written prior permission. The copyright holders make no
++ * representations about the suitability of this software for any
++ * purpose. It is provided "as is" without express or implied
++ * warranty.
++ *
++ * THE COPYRIGHT HOLDERS DISCLAIM ALL WARRANTIES WITH REGARD TO THIS
++ * SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND
++ * FITNESS, IN NO EVENT SHALL THE COPYRIGHT HOLDERS BE LIABLE FOR ANY
++ * SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
++ * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN
++ * AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION,
++ * ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF
++ * THIS SOFTWARE.
++ */
++
++#ifndef DRM_CLIENT_PROTOCOL_H
++#define DRM_CLIENT_PROTOCOL_H
++
++#ifdef __cplusplus
++extern "C" {
++#endif
++
++#include <stdint.h>
++#include <stddef.h>
++#include "wayland-util.h"
++
++struct wl_client;
++struct wl_resource;
++
++struct wl_drm;
++
++extern const struct wl_interface wl_drm_interface;
++
++#ifndef WL_DRM_ERROR_ENUM
++#define WL_DRM_ERROR_ENUM
++enum wl_drm_error {
++ WL_DRM_ERROR_AUTHENTICATE_FAIL = 0,
++ WL_DRM_ERROR_INVALID_FORMAT = 1,
++ WL_DRM_ERROR_INVALID_NAME = 2,
++};
++#endif /* WL_DRM_ERROR_ENUM */
++
++#ifndef WL_DRM_FORMAT_ENUM
++#define WL_DRM_FORMAT_ENUM
++enum wl_drm_format {
++ WL_DRM_FORMAT_C8 = 0x20203843,
++ WL_DRM_FORMAT_RGB332 = 0x38424752,
++ WL_DRM_FORMAT_BGR233 = 0x38524742,
++ WL_DRM_FORMAT_XRGB4444 = 0x32315258,
++ WL_DRM_FORMAT_XBGR4444 = 0x32314258,
++ WL_DRM_FORMAT_RGBX4444 = 0x32315852,
++ WL_DRM_FORMAT_BGRX4444 = 0x32315842,
++ WL_DRM_FORMAT_ARGB4444 = 0x32315241,
++ WL_DRM_FORMAT_ABGR4444 = 0x32314241,
++ WL_DRM_FORMAT_RGBA4444 = 0x32314152,
++ WL_DRM_FORMAT_BGRA4444 = 0x32314142,
++ WL_DRM_FORMAT_XRGB1555 = 0x35315258,
++ WL_DRM_FORMAT_XBGR1555 = 0x35314258,
++ WL_DRM_FORMAT_RGBX5551 = 0x35315852,
++ WL_DRM_FORMAT_BGRX5551 = 0x35315842,
++ WL_DRM_FORMAT_ARGB1555 = 0x35315241,
++ WL_DRM_FORMAT_ABGR1555 = 0x35314241,
++ WL_DRM_FORMAT_RGBA5551 = 0x35314152,
++ WL_DRM_FORMAT_BGRA5551 = 0x35314142,
++ WL_DRM_FORMAT_RGB565 = 0x36314752,
++ WL_DRM_FORMAT_BGR565 = 0x36314742,
++ WL_DRM_FORMAT_RGB888 = 0x34324752,
++ WL_DRM_FORMAT_BGR888 = 0x34324742,
++ WL_DRM_FORMAT_XRGB8888 = 0x34325258,
++ WL_DRM_FORMAT_XBGR8888 = 0x34324258,
++ WL_DRM_FORMAT_RGBX8888 = 0x34325852,
++ WL_DRM_FORMAT_BGRX8888 = 0x34325842,
++ WL_DRM_FORMAT_ARGB8888 = 0x34325241,
++ WL_DRM_FORMAT_ABGR8888 = 0x34324241,
++ WL_DRM_FORMAT_RGBA8888 = 0x34324152,
++ WL_DRM_FORMAT_BGRA8888 = 0x34324142,
++ WL_DRM_FORMAT_XRGB2101010 = 0x30335258,
++ WL_DRM_FORMAT_XBGR2101010 = 0x30334258,
++ WL_DRM_FORMAT_RGBX1010102 = 0x30335852,
++ WL_DRM_FORMAT_BGRX1010102 = 0x30335842,
++ WL_DRM_FORMAT_ARGB2101010 = 0x30335241,
++ WL_DRM_FORMAT_ABGR2101010 = 0x30334241,
++ WL_DRM_FORMAT_RGBA1010102 = 0x30334152,
++ WL_DRM_FORMAT_BGRA1010102 = 0x30334142,
++ WL_DRM_FORMAT_YUYV = 0x56595559,
++ WL_DRM_FORMAT_YVYU = 0x55595659,
++ WL_DRM_FORMAT_UYVY = 0x59565955,
++ WL_DRM_FORMAT_VYUY = 0x59555956,
++ WL_DRM_FORMAT_AYUV = 0x56555941,
++ WL_DRM_FORMAT_NV12 = 0x3231564e,
++ WL_DRM_FORMAT_NV21 = 0x3132564e,
++ WL_DRM_FORMAT_NV16 = 0x3631564e,
++ WL_DRM_FORMAT_NV61 = 0x3136564e,
++ WL_DRM_FORMAT_YUV410 = 0x39565559,
++ WL_DRM_FORMAT_YVU410 = 0x39555659,
++ WL_DRM_FORMAT_YUV411 = 0x31315559,
++ WL_DRM_FORMAT_YVU411 = 0x31315659,
++ WL_DRM_FORMAT_YUV420 = 0x32315559,
++ WL_DRM_FORMAT_YVU420 = 0x32315659,
++ WL_DRM_FORMAT_YUV422 = 0x36315559,
++ WL_DRM_FORMAT_YVU422 = 0x36315659,
++ WL_DRM_FORMAT_YUV444 = 0x34325559,
++ WL_DRM_FORMAT_YVU444 = 0x34325659,
++};
++#endif /* WL_DRM_FORMAT_ENUM */
++
++struct wl_drm_listener {
++ /**
++ * device - (none)
++ * @name: (none)
++ */
++ void (*device)(void *data,
++ struct wl_drm *wl_drm,
++ const char *name);
++ /**
++ * format - (none)
++ * @format: (none)
++ */
++ void (*format)(void *data,
++ struct wl_drm *wl_drm,
++ uint32_t format);
++ /**
++ * authenticated - (none)
++ */
++ void (*authenticated)(void *data,
++ struct wl_drm *wl_drm);
++};
++
++static inline int
++wl_drm_add_listener(struct wl_drm *wl_drm,
++ const struct wl_drm_listener *listener, void *data)
++{
++ return wl_proxy_add_listener((struct wl_proxy *) wl_drm,
++ (void (**)(void)) listener, data);
++}
++
++#define WL_DRM_AUTHENTICATE 0
++#define WL_DRM_CREATE_BUFFER 1
++#define WL_DRM_CREATE_PLANAR_BUFFER 2
++
++static inline void
++wl_drm_set_user_data(struct wl_drm *wl_drm, void *user_data)
++{
++ wl_proxy_set_user_data((struct wl_proxy *) wl_drm, user_data);
++}
++
++static inline void *
++wl_drm_get_user_data(struct wl_drm *wl_drm)
++{
++ return wl_proxy_get_user_data((struct wl_proxy *) wl_drm);
++}
++
++static inline void
++wl_drm_destroy(struct wl_drm *wl_drm)
++{
++ wl_proxy_destroy((struct wl_proxy *) wl_drm);
++}
++
++static inline void
++wl_drm_authenticate(struct wl_drm *wl_drm, uint32_t id)
++{
++ wl_proxy_marshal((struct wl_proxy *) wl_drm,
++ WL_DRM_AUTHENTICATE, id);
++}
++
++static inline struct wl_buffer *
++wl_drm_create_buffer(struct wl_drm *wl_drm, uint32_t name, int32_t width, int32_t height, uint32_t stride, uint32_t format)
++{
++ struct wl_proxy *id;
++
++ id = wl_proxy_create((struct wl_proxy *) wl_drm,
++ &wl_buffer_interface);
++ if (!id)
++ return NULL;
++
++ wl_proxy_marshal((struct wl_proxy *) wl_drm,
++ WL_DRM_CREATE_BUFFER, id, name, width, height, stride, format);
++
++ return (struct wl_buffer *) id;
++}
++
++static inline struct wl_buffer *
++wl_drm_create_planar_buffer(struct wl_drm *wl_drm, uint32_t name, int32_t width, int32_t height, uint32_t format, int32_t offset0, int32_t stride0, int32_t offset1, int32_t stride1, int32_t offset2, int32_t stride2)
++{
++ struct wl_proxy *id;
++
++ id = wl_proxy_create((struct wl_proxy *) wl_drm,
++ &wl_buffer_interface);
++ if (!id)
++ return NULL;
++
++ wl_proxy_marshal((struct wl_proxy *) wl_drm,
++ WL_DRM_CREATE_PLANAR_BUFFER, id, name, width, height, format, offset0, stride0, offset1, stride1, offset2, stride2);
++
++ return (struct wl_buffer *) id;
++}
++
++#ifdef __cplusplus
++}
++#endif
++
++#endif
+diff --git a/ext/wayland/wayland-drm-protocol.c b/ext/wayland/wayland-drm-protocol.c
+new file mode 100644
+index 0000000..939af53
+--- /dev/null
++++ b/ext/wayland/wayland-drm-protocol.c
+@@ -0,0 +1,74 @@
++/*
++ * Copyright © 2008-2011 Kristian Høgsberg
++ * Copyright © 2010-2011 Intel Corporation
++ *
++ * Permission to use, copy, modify, distribute, and sell this
++ * software and its documentation for any purpose is hereby granted
++ * without fee, provided that\n the above copyright notice appear in
++ * all copies and that both that copyright notice and this permission
++ * notice appear in supporting documentation, and that the name of
++ * the copyright holders not be used in advertising or publicity
++ * pertaining to distribution of the software without specific,
++ * written prior permission. The copyright holders make no
++ * representations about the suitability of this software for any
++ * purpose. It is provided "as is" without express or implied
++ * warranty.
++ *
++ * THE COPYRIGHT HOLDERS DISCLAIM ALL WARRANTIES WITH REGARD TO THIS
++ * SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND
++ * FITNESS, IN NO EVENT SHALL THE COPYRIGHT HOLDERS BE LIABLE FOR ANY
++ * SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
++ * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN
++ * AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION,
++ * ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF
++ * THIS SOFTWARE.
++ */
++
++#include <stdlib.h>
++#include <stdint.h>
++#include "wayland-util.h"
++
++#define ARRAY_LENGTH(a) (sizeof (a) /sizeof (a)[0])
++
++extern const struct wl_interface wl_buffer_interface;
++extern const struct wl_interface wl_buffer_interface;
++
++static const struct wl_interface *types[] = {
++ NULL,
++ &wl_buffer_interface,
++ NULL,
++ NULL,
++ NULL,
++ NULL,
++ NULL,
++ &wl_buffer_interface,
++ NULL,
++ NULL,
++ NULL,
++ NULL,
++ NULL,
++ NULL,
++ NULL,
++ NULL,
++ NULL,
++ NULL,
++};
++
++static const struct wl_message wl_drm_requests[] = {
++ { "authenticate", "u", types + 0 },
++ { "create_buffer", "nuiiuu", types + 1 },
++ { "create_planar_buffer", "nuiiuiiiiii", types + 7 },
++};
++
++static const struct wl_message wl_drm_events[] = {
++ { "device", "s", types + 0 },
++ { "format", "u", types + 0 },
++ { "authenticated", "", types + 0 },
++};
++
++WL_EXPORT const struct wl_interface wl_drm_interface = {
++ "wl_drm", 1,
++ ARRAY_LENGTH(wl_drm_requests), wl_drm_requests,
++ ARRAY_LENGTH(wl_drm_events), wl_drm_events,
++};
++
+--
+1.7.9.5
+
diff --git a/meta-arago-extras/recipes-multimedia/gstreamer/gstreamer1.0-plugins-bad/0003-Added-KMSsink-support.patch b/meta-arago-extras/recipes-multimedia/gstreamer/gstreamer1.0-plugins-bad/0003-Added-KMSsink-support.patch
new file mode 100644
index 0000000..8c19fa6
--- /dev/null
+++ b/meta-arago-extras/recipes-multimedia/gstreamer/gstreamer1.0-plugins-bad/0003-Added-KMSsink-support.patch
@@ -0,0 +1,1457 @@
+From efe7189ee13e78664bbe373c6fd890280c9dee50 Mon Sep 17 00:00:00 2001
+From: Pooja Prajod <a0132412@ti.com>
+Date: Fri, 12 Dec 2014 13:28:10 +0530
+Subject: [PATCH] Added KMSsink support
+
+---
+ configure.ac | 12 +
+ sys/Makefile.am | 10 +-
+ sys/kms/Makefile.am | 29 +
+ sys/kms/gstdrmutils.c | 292 +++++++++
+ sys/kms/gstdrmutils.h | 40 ++
+ sys/kms/gstkmsbufferpriv.c | 124 ++++
+ sys/kms/gstkmsbufferpriv.h | 64 ++
+ sys/kms/gstkmssink.c | 682 ++++++++++++++++++++++
+ sys/kms/gstkmssink.h | 91 +++
+ 9 files changed, 1342 insertions(+), 2 deletions(-)
+ create mode 100644 sys/kms/Makefile.am
+ create mode 100644 sys/kms/gstdrmutils.c
+ create mode 100644 sys/kms/gstdrmutils.h
+ create mode 100644 sys/kms/gstkmsbufferpriv.c
+ create mode 100644 sys/kms/gstkmsbufferpriv.h
+ create mode 100644 sys/kms/gstkmssink.c
+ create mode 100644 sys/kms/gstkmssink.h
+
+diff --git a/configure.ac b/configure.ac
+index b94bd5d..8cdf972 100644
+--- a/configure.ac
++++ b/configure.ac
+@@ -1400,6 +1400,16 @@ AG_GST_CHECK_FEATURE(KATE, [Kate], kate, [
+ AC_SUBST(TIGER_LIBS)
+ ],,,[AM_CONDITIONAL(USE_TIGER, false)])
+
++dnl *** kms ***
++translit(dnm, m, l) AM_CONDITIONAL(USE_KMS, true)
++AG_GST_CHECK_FEATURE(KMS, [kmssink], kms, [
++ PKG_CHECK_MODULES([DRM], [libdrm libdrm_omap], HAVE_KMS=yes, HAVE_KMS=no)
++ PKG_CHECK_MODULES(LIBDCE, [libdce >= 1.0.0], HAVE_KMS=yes, HAVE_KMS=no)
++ AC_SUBST(DRM_CFLAGS)
++ AC_SUBST(DRM_LIBS)
++])
++
++
+ dnl *** ladspa ***
+ translit(dnm, m, l) AM_CONDITIONAL(USE_LADSPA, true)
+ AG_GST_CHECK_FEATURE(LADSPA, [ladspa], ladspa, [
+@@ -2212,6 +2222,7 @@ AM_CONDITIONAL(USE_GSM, false)
+ AM_CONDITIONAL(USE_HLS, false)
+ AM_CONDITIONAL(USE_KATE, false)
+ AM_CONDITIONAL(USE_TIGER, false)
++AM_CONDITIONAL(USE_KMS, false)
+ AM_CONDITIONAL(USE_LADSPA, false)
+ AM_CONDITIONAL(USE_LV2, false)
+ AM_CONDITIONAL(USE_LIBMMS, false)
+@@ -2439,6 +2450,7 @@ sys/osxvideo/Makefile
+ sys/qtwrapper/Makefile
+ sys/mfc/Makefile
+ sys/shm/Makefile
++sys/kms/Makefile
+ sys/uvch264/Makefile
+ sys/vcd/Makefile
+ sys/vdpau/Makefile
+diff --git a/sys/Makefile.am b/sys/Makefile.am
+index b1abda6..b87a1ca 100644
+--- a/sys/Makefile.am
++++ b/sys/Makefile.am
+@@ -106,6 +106,12 @@ else
+ PVR_DIR=
+ endif
+
++if USE_KMS
++KMS_DIR=kms
++else
++KMS_DIR=
++endif
++
+ if USE_SHM
+ SHM_DIR=shm
+ else
+@@ -166,9 +172,9 @@ else
+ MFC_DIR=
+ endif
+
+-SUBDIRS = $(ACM_DIR) $(ANDROID_MEDIA_DIR) $(APPLE_MEDIA_DIR) $(AVC_DIR) $(BLUEZ_DIR) $(D3DVIDEOSINK_DIR) $(DECKLINK_DIR) $(DIRECTDRAW_DIR) $(DIRECTSOUND_DIR) $(DIRECTSHOW_DIR) $(DVB_DIR) $(FBDEV_DIR) $(LINSYS_DIR) $(OPENSLES_DIR) $(OSX_VIDEO_DIR) $(PVR_DIR) $(QT_DIR) $(SHM_DIR) $(UVCH264_DIR) $(VCD_DIR) $(VDPAU_DIR) $(WININET_DIR) $(WINSCREENCAP_DIR) $(WASAPI_DIR) $(MFC_DIR)
++SUBDIRS = $(ACM_DIR) $(ANDROID_MEDIA_DIR) $(APPLE_MEDIA_DIR) $(AVC_DIR) $(BLUEZ_DIR) $(D3DVIDEOSINK_DIR) $(DECKLINK_DIR) $(DIRECTDRAW_DIR) $(DIRECTSOUND_DIR) $(DIRECTSHOW_DIR) $(DVB_DIR) $(FBDEV_DIR) $(LINSYS_DIR) $(OPENSLES_DIR) $(OSX_VIDEO_DIR) $(PVR_DIR) $(QT_DIR) $(KMS_DIR) $(SHM_DIR) $(UVCH264_DIR) $(VCD_DIR) $(VDPAU_DIR) $(WININET_DIR) $(WINSCREENCAP_DIR) $(WASAPI_DIR) $(MFC_DIR)
+
+ DIST_SUBDIRS = acmenc acmmp3dec androidmedia applemedia applemedia-nonpublic avc bluez d3dvideosink decklink directdraw directsound dvb linsys fbdev dshowdecwrapper dshowsrcwrapper dshowvideosink \
+- opensles osxvideo pvr2d qtwrapper shm uvch264 vcd vdpau wasapi wininet winks winscreencap mfc
++ opensles osxvideo pvr2d qtwrapper kms shm uvch264 vcd vdpau wasapi wininet winks winscreencap mfc
+
+ include $(top_srcdir)/common/parallel-subdirs.mak
+diff --git a/sys/kms/Makefile.am b/sys/kms/Makefile.am
+new file mode 100644
+index 0000000..035efef
+--- /dev/null
++++ b/sys/kms/Makefile.am
+@@ -0,0 +1,29 @@
++plugin_LTLIBRARIES = libgstkmssink.la
++
++libgstkmssink_la_SOURCES = \
++ gstkmssink.c \
++ gstkmsbufferpriv.c \
++ gstdrmutils.c
++
++libgstkmssink_la_CFLAGS = \
++ $(GST_PLUGINS_BAD_CFLAGS) \
++ $(GST_PLUGINS_BASE_CFLAGS) \
++ $(GST_BASE_CFLAGS) \
++ $(LIBDCE_CFLAGS) \
++ $(GST_CFLAGS) \
++ $(DRM_CFLAGS)
++
++libgstkmssink_la_LIBADD = \
++ $(GST_PLUGINS_BASE_LIBS) \
++ $(GST_BASE_LIBS) \
++ $(GST_LIBS) \
++ $(LIBDCE_LIBS) \
++ $(DRM_LIBS) \
++ -lgstvideo-$(GST_API_VERSION) \
++ -lgstdmabuf-$(GST_API_VERSION) \
++ $(top_builddir)/gst-libs/gst/drm/libgstdrm-$(GST_API_VERSION).la
++
++libgstkmssink_la_LDFLAGS = $(GST_PLUGIN_LDFLAGS)
++libgstkmssink_la_LIBTOOLFLAGS = --tag=disable-static
++
++noinst_HEADERS = gstkmssink.h gstdrmutils.h gstkmsbufferpriv.h
+diff --git a/sys/kms/gstdrmutils.c b/sys/kms/gstdrmutils.c
+new file mode 100644
+index 0000000..d7a8dd6
+--- /dev/null
++++ b/sys/kms/gstdrmutils.c
+@@ -0,0 +1,292 @@
++/* GStreamer
++ *
++ * Copyright (C) 2012 Texas Instruments
++ * Copyright (C) 2012 Collabora Ltd
++ *
++ * Authors:
++ * Alessandro Decina <alessandro.decina@collabora.co.uk>
++ *
++ * 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 Foundation; either
++ * version 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 Foundation, Inc., 59 Temple Place - Suite 330,
++ * Boston, MA 02111-1307, USA.
++ */
++
++#include <gst/gst.h>
++#include "gstdrmutils.h"
++
++GST_DEBUG_CATEGORY_EXTERN (gst_debug_kms_sink);
++#define GST_CAT_DEFAULT gst_debug_kms_sink
++
++void
++gst_drm_connector_cleanup (int fd, struct connector *c)
++{
++ if (c->connector) {
++ drmModeFreeConnector (c->connector);
++ c->connector = NULL;
++ }
++ if (c->encoder) {
++ drmModeFreeEncoder (c->encoder);
++ c->encoder = NULL;
++ }
++ if (c->fb_id) {
++ drmModeRmFB (fd, c->fb_id);
++ c->fb_id = 0;
++ }
++ if (c->fb_bo) {
++ omap_bo_del (c->fb_bo);
++ c->fb_bo = NULL;
++ }
++}
++
++static gboolean
++gst_drm_connector_find_mode_and_plane_helper (int fd,
++ struct omap_device *dev, int width, int height,
++ drmModeRes * resources, drmModePlaneRes * plane_resources,
++ struct connector *c, drmModePlane ** out_plane)
++{
++ int i, best_area = 0, ret;
++
++ /* free old stuff: */
++ if (*out_plane) { /* TODO maybe move into 'struct connector'?? */
++ drmModeFreePlane (*out_plane);
++ *out_plane = NULL;
++ }
++ gst_drm_connector_cleanup (fd, c);
++
++ /* First, find the connector & mode */
++ c->connector = drmModeGetConnector (fd, c->id);
++ if (!c->connector)
++ goto error_no_connector;
++
++ if (!c->connector->count_modes)
++ goto error_no_mode;
++
++ /* just look for the highest resolution: */
++ for (i = 0; i < c->connector->count_modes; i++) {
++ drmModeModeInfo *mode = &c->connector->modes[i];
++ int area = mode->hdisplay * mode->vdisplay;
++
++ if (area > best_area) {
++ c->mode = mode;
++ best_area = area;
++ }
++ }
++
++ if (c->mode == NULL) {
++ /* XXX: just pick the first available mode. Not sure this is correct... */
++ c->mode = &c->connector->modes[0];
++#if 0
++ goto error_no_mode;
++#endif
++ }
++
++ /* Now get the encoder */
++ c->encoder = drmModeGetEncoder (fd, c->connector->encoder_id);
++ if (!c->encoder)
++ goto error_no_encoder;
++
++ if (c->crtc == -1)
++ c->crtc = c->encoder->crtc_id;
++
++ /* and figure out which crtc index it is: */
++ c->pipe = -1;
++ for (i = 0; i < resources->count_crtcs; i++) {
++ if (c->crtc == (int) resources->crtcs[i]) {
++ c->pipe = i;
++ break;
++ }
++ }
++
++ if (c->pipe == -1)
++ goto error_no_crtc;
++
++ *out_plane = NULL;
++ for (i = 0; i < plane_resources->count_planes; i++) {
++ drmModePlane *plane = drmModeGetPlane (fd, plane_resources->planes[i]);
++ if (plane->possible_crtcs & (1 << c->pipe)) {
++ *out_plane = plane;
++ break;
++ }
++ }
++
++ if (*out_plane == NULL)
++ goto error_no_plane;
++
++ c->fb_bo = omap_bo_new (dev, best_area * 2, OMAP_BO_WC);
++ if (c->fb_bo) {
++ uint32_t fourcc = DRM_FORMAT_RGB565;
++ uint32_t handles[4] = { omap_bo_handle (c->fb_bo) };
++ uint32_t pitches[4] = { c->mode->hdisplay * 2 };
++ uint32_t offsets[4] = { 0 };
++ ret = drmModeAddFB2 (fd, c->mode->hdisplay, c->mode->vdisplay,
++ fourcc, handles, pitches, offsets, &c->fb_id, 0);
++ if (ret) {
++ /* TODO */
++ }
++ }
++
++ /* now set the desired mode: */
++ ret = drmModeSetCrtc (fd, c->crtc, c->fb_id, 0, 0, &c->id, 1, c->mode);
++ if (ret) {
++ /* TODO */
++ }
++
++ return TRUE;
++
++fail:
++ gst_drm_connector_cleanup (fd, c);
++
++ return FALSE;
++
++error_no_connector:
++ GST_DEBUG ("could not get connector %s", strerror (errno));
++ goto fail;
++
++error_no_mode:
++ GST_DEBUG ("could not find mode %dx%d (count_modes %d)",
++ width, height, c->connector->count_modes);
++ goto fail;
++
++error_no_encoder:
++ GST_DEBUG ("could not get encoder: %s", strerror (errno));
++ goto fail;
++
++error_no_crtc:
++ GST_DEBUG ("couldn't find a crtc");
++ goto fail;
++
++error_no_plane:
++ GST_DEBUG ("couldn't find a plane");
++ goto fail;
++}
++
++gboolean
++gst_drm_connector_find_mode_and_plane (int fd,
++ struct omap_device *dev, int width, int height,
++ drmModeRes * resources, drmModePlaneRes * plane_resources,
++ struct connector *c, drmModePlane ** out_plane)
++{
++ int i;
++ gboolean found = FALSE;
++
++ /* First, find the connector & mode */
++ if (c->id == 0) {
++ /* Any connector */
++ GST_DEBUG ("Any connector, %d available", resources->count_connectors);
++ for (i = 0; i < resources->count_connectors; i++) {
++ GST_DEBUG (" %d", resources->connectors[i]);
++ }
++ for (i = 0; i < resources->count_connectors; i++) {
++ GST_DEBUG ("Trying connector %d: %d", i, resources->connectors[i]);
++ c->id = resources->connectors[i];
++ if (gst_drm_connector_find_mode_and_plane_helper (fd, dev, width, height,
++ resources, plane_resources, c, out_plane)) {
++ GST_DEBUG ("Found suitable connector");
++ found = TRUE;
++ break;
++ }
++ GST_DEBUG ("Connector not suitable");
++ }
++ } else {
++ /* A specific connector */
++ GST_DEBUG ("Connector %d", c->id);
++ found =
++ gst_drm_connector_find_mode_and_plane_helper (fd, dev, width, height,
++ resources, plane_resources, c, out_plane);
++ }
++
++ return found;
++}
++
++/* table nicked off libdrm's modetest.c */
++/* *INDENT-OFF* */
++static const struct {
++ int type_id;
++ const char *type_name;
++} connector_type_names[] = {
++ { DRM_MODE_CONNECTOR_Unknown, "unknown" },
++ { DRM_MODE_CONNECTOR_VGA, "VGA" },
++ { DRM_MODE_CONNECTOR_DVII, "DVI-I" },
++ { DRM_MODE_CONNECTOR_DVID, "DVI-D" },
++ { DRM_MODE_CONNECTOR_DVIA, "DVI-A" },
++ { DRM_MODE_CONNECTOR_Composite, "composite" },
++ { DRM_MODE_CONNECTOR_SVIDEO, "s-video" },
++ { DRM_MODE_CONNECTOR_LVDS, "LVDS" },
++ { DRM_MODE_CONNECTOR_Component, "component" },
++ { DRM_MODE_CONNECTOR_9PinDIN, "9-pin-DIN" },
++ { DRM_MODE_CONNECTOR_DisplayPort, "displayport" },
++ { DRM_MODE_CONNECTOR_HDMIA, "HDMI-A" },
++ { DRM_MODE_CONNECTOR_HDMIB, "HDMI-B" },
++ { DRM_MODE_CONNECTOR_TV, "TV" },
++ { DRM_MODE_CONNECTOR_eDP, "embedded-displayport" },
++};
++/* *INDENT-ON* */
++
++gboolean
++gst_drm_connector_find_mode_and_plane_by_name (int fd,
++ struct omap_device * dev, int width, int height,
++ drmModeRes * resources, drmModePlaneRes * plane_resources,
++ struct connector * c, const char *name, drmModePlane ** out_plane)
++{
++ int i, n;
++ char tmp[64];
++ const char *type_name;
++ int found[G_N_ELEMENTS (connector_type_names)] = { 0 };
++
++ /* Find connector from name */
++ for (i = 0; i < resources->count_connectors; i++) {
++ GST_DEBUG ("Trying connector %d: %d", i, resources->connectors[i]);
++ c->id = resources->connectors[i];
++ c->connector = drmModeGetConnector (fd, c->id);
++ if (!c->connector)
++ continue;
++
++ /* Find type name from this connector */
++ for (n = 0; n < G_N_ELEMENTS (connector_type_names); n++)
++ if (connector_type_names[n].type_id == c->connector->connector_type)
++ break;
++ if (n == G_N_ELEMENTS (connector_type_names))
++ continue;
++
++ type_name = connector_type_names[n].type_name;
++ GST_DEBUG ("Connector %d has type %s", i, type_name);
++ ++found[n];
++
++ drmModeFreeConnector (c->connector);
++ c->connector = NULL;
++
++ /* Try a few different matches, such as modetest and xrandr
++ output, and also a indexless one matching first found */
++ snprintf (tmp, sizeof (tmp), "%s-%u", type_name, found[n]);
++ if (!g_ascii_strcasecmp (tmp, name))
++ goto found;
++ snprintf (tmp, sizeof (tmp), "%s%u", type_name, found[n]);
++ if (!g_ascii_strcasecmp (tmp, name))
++ goto found;
++ if (!g_ascii_strcasecmp (name, type_name))
++ goto found;
++
++ continue;
++
++ found:
++ if (gst_drm_connector_find_mode_and_plane_helper (fd, dev, width, height,
++ resources, plane_resources, c, out_plane)) {
++ GST_DEBUG ("Found suitable connector");
++ return TRUE;
++ }
++ GST_DEBUG ("Connector not suitable");
++ }
++
++ return FALSE;
++}
+diff --git a/sys/kms/gstdrmutils.h b/sys/kms/gstdrmutils.h
+new file mode 100644
+index 0000000..053a245
+--- /dev/null
++++ b/sys/kms/gstdrmutils.h
+@@ -0,0 +1,40 @@
++#ifndef __GST_DRMUTILS_H__
++#define __GST_DRMUTILS_H__
++
++#include <stdio.h>
++#include <stdint.h>
++#include <stdlib.h>
++#include <string.h>
++#include <errno.h>
++#include <unistd.h>
++#include <assert.h>
++#include <xf86drmMode.h>
++#include <omap_drm.h>
++#include <omap_drmif.h>
++#include <drm_fourcc.h>
++#include <gst/gst.h>
++
++struct connector {
++ uint32_t id;
++ char mode_str[64];
++ drmModeConnector *connector;
++ drmModeModeInfo *mode;
++ drmModeEncoder *encoder;
++ uint32_t fb_id;
++ struct omap_bo *fb_bo;
++ int crtc;
++ int pipe;
++};
++
++void gst_drm_connector_cleanup (int fd, struct connector * c);
++gboolean gst_drm_connector_find_mode_and_plane (int fd,
++ struct omap_device * dev, int width, int height,
++ drmModeRes * resources, drmModePlaneRes * plane_resources,
++ struct connector *c, drmModePlane ** out_plane);
++gboolean gst_drm_connector_find_mode_and_plane_by_name (int fd,
++ struct omap_device *dev, int width, int height,
++ drmModeRes * resources, drmModePlaneRes * plane_resources,
++ struct connector *c, const char *name,
++ drmModePlane ** out_plane);
++
++#endif /* __GST_DRMUTILS_H__ */
+diff --git a/sys/kms/gstkmsbufferpriv.c b/sys/kms/gstkmsbufferpriv.c
+new file mode 100644
+index 0000000..ffa7e46
+--- /dev/null
++++ b/sys/kms/gstkmsbufferpriv.c
+@@ -0,0 +1,124 @@
++/*
++ * GStreamer
++ *
++ * Copyright (C) 2012 Texas Instruments
++ * Copyright (C) 2012 Collabora Ltd
++ *
++ * Authors:
++ * Alessandro Decina <alessandro.decina@collabora.co.uk>
++ * Rob Clark <rob.clark@linaro.org>
++ *
++ * This library is free software; you can redistribute it and/or
++ * modify it under the terms of the GNU Lesser General Public
++ * License as published by the Free Software Foundation
++ * version 2.1 of the License.
++ *
++ * 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
++ * Lesser General Public License for more details.
++ *
++ * You should have received a copy of the GNU Lesser General Public
++ * License along with this library; if not, write to the Free Software
++ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
++ */
++
++#ifdef HAVE_CONFIG_H
++#include "config.h"
++#endif
++
++#include <stdint.h>
++#include <gst/gst.h>
++#include <gst/dmabuf/dmabuf.h>
++
++#include <omap_drm.h>
++#include <omap_drmif.h>
++#include <xf86drmMode.h>
++
++#include "gstkmssink.h"
++#include "gstkmsbufferpriv.h"
++
++static int
++create_fb (GstKMSBufferPriv * priv, GstKMSSink * sink)
++{
++ /* TODO get format, etc from caps.. and query device for
++ * supported formats, and make this all more flexible to
++ * cope with various formats:
++ */
++ uint32_t fourcc = GST_MAKE_FOURCC ('N', 'V', '1', '2');
++
++ uint32_t handles[4] = {
++ omap_bo_handle (priv->bo), omap_bo_handle (priv->bo),
++ };
++ uint32_t pitches[4] = {
++ GST_ROUND_UP_4 (sink->input_width), GST_ROUND_UP_4 (sink->input_width),
++ };
++ uint32_t offsets[4] = {
++ 0, pitches[0] * sink->input_height
++ };
++
++ return drmModeAddFB2 (priv->fd, sink->input_width, sink->input_height,
++ fourcc, handles, pitches, offsets, &priv->fb_id, 0);
++}
++
++/**
++ * gst_kms_buffer_priv:
++ * @sink: a #GstKMSSink
++ * @buf: a pointer to #GstBuffer
++ *
++ * Checks if the @buf has a GstMetaDmaBuf metadata set. If it doesn't we return a NULL
++ * indicating its not a dmabuf buffer. We maintain a hashtable with dmabuf fd as key and
++ * the GstKMSBufferPriv structure as value
++ *
++ * Returns: the #GstKMSBufferPriv
++ *
++ * Since: 1.2.?
++ */
++GstKMSBufferPriv *
++gst_kms_buffer_priv (GstKMSSink * sink, GstBuffer * buf)
++{
++ GstMetaDmaBuf *dmabuf = gst_buffer_get_dma_buf_meta (buf);
++
++
++ struct omap_bo *bo;
++ int fd;
++ int fd_copy;
++ GstKMSBufferPriv * priv;
++
++ /* if it isn't a dmabuf buffer that we can import, then there
++ * is nothing we can do with it:
++ */
++
++ if (!dmabuf) {
++ GST_DEBUG_OBJECT (sink, "not importing non dmabuf buffer");
++ return NULL;
++ }
++
++ fd_copy = gst_dma_buf_meta_get_fd (dmabuf);
++
++ /* lookup the hashtable with fd as key. If present return bo & buffer structure */
++ priv = g_hash_table_lookup (sink->kmsbufferpriv, (gpointer)fd_copy);
++ if(priv) {
++ return priv;
++ }
++
++ priv = g_malloc0 (sizeof (GstKMSBufferPriv));
++ bo = omap_bo_from_dmabuf (sink->dev, fd_copy);
++ fd = sink->fd;
++
++ priv->bo = bo;
++ priv->fd = fd;
++
++ if (create_fb (priv, sink)) {
++ GST_WARNING_OBJECT (sink, "could not create framebuffer: %s",
++ strerror (errno));
++ g_free(priv);
++ return NULL;
++ }
++
++ /* if fd not present, write to hash table fd and the corresponding priv. */
++ g_hash_table_insert(sink->kmsbufferpriv, (gpointer)fd_copy, priv);
++
++
++ return priv;
++}
+diff --git a/sys/kms/gstkmsbufferpriv.h b/sys/kms/gstkmsbufferpriv.h
+new file mode 100644
+index 0000000..a1070da
+--- /dev/null
++++ b/sys/kms/gstkmsbufferpriv.h
+@@ -0,0 +1,64 @@
++/*
++ * GStreamer
++ *
++ * Copyright (C) 2012 Texas Instruments
++ * Copyright (C) 2012 Collabora Ltd
++ *
++ * Authors:
++ * Alessandro Decina <alessandro.decina@collabora.co.uk>
++ * Rob Clark <rob.clark@linaro.org>
++ *
++ * This library is free software; you can redistribute it and/or
++ * modify it under the terms of the GNU Lesser General Public
++ * License as published by the Free Software Foundation
++ * version 2.1 of the License.
++ *
++ * 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
++ * Lesser General Public License for more details.
++ *
++ * You should have received a copy of the GNU Lesser General Public
++ * License along with this library; if not, write to the Free Software
++ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
++ */
++
++#ifndef __GSTKMSBUFFERPRIV_H__
++#define __GSTKMSBUFFERPRIV_H__
++
++#include <stdint.h>
++#include <gst/gst.h>
++
++G_BEGIN_DECLS
++
++/*
++ * per-buffer private data so kmssink can attach a drm_framebuffer
++ * handle (fb_id) to a buffer, which gets deleted when the buffer
++ * is finalized
++ */
++
++#define GST_TYPE_KMS_BUFFER_PRIV \
++ (gst_kms_buffer_priv_get_type ())
++#define GST_KMS_BUFFER_PRIV(obj) \
++ (G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_KMS_BUFFER_PRIV, GstKMSBufferPriv))
++#define GST_IS_KMS_BUFFER_PRIV(obj) \
++ (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_KMS_BUFFER_PRIV))
++
++
++typedef struct
++{
++ struct omap_bo *bo;
++ int fd;
++ uint32_t fb_id;
++}GstKMSBufferPriv;
++
++
++GType gst_kms_buffer_priv_get_type (void);
++
++/* Returns a GstKMSBufferPriv, if it has a dmabuf fd metadata */
++GstKMSBufferPriv * gst_kms_buffer_priv (GstKMSSink *sink, GstBuffer * buf);
++
++G_END_DECLS
++
++
++#endif /* __GSTKMSBUFFERPRIV_H__ */
+diff --git a/sys/kms/gstkmssink.c b/sys/kms/gstkmssink.c
+new file mode 100644
+index 0000000..b9c9095
+--- /dev/null
++++ b/sys/kms/gstkmssink.c
+@@ -0,0 +1,682 @@
++/* GStreamer
++ * Copyright (C) 2012 Texas Instruments
++ * Copyright (C) 2012 Collabora Ltd
++ *
++ * Authors:
++ * Alessandro Decina <alessandro.decina@collabora.co.uk>
++ *
++ * 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 Foundation; either
++ * version 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 Foundation, Inc., 59 Temple Place - Suite 330,
++ * Boston, MA 02111-1307, USA.
++ *
++ * Authors:
++ * Alessandro Decina <alessandro.decina@collabora.co.uk>
++ */
++
++#ifdef HAVE_CONFIG_H
++#include "config.h"
++#endif
++
++#include "gstkmssink.h"
++#include "gstkmsbufferpriv.h"
++
++#include <libdce.h>
++#include <omap_drm.h>
++#include <omap_drmif.h>
++#include <xf86drmMode.h>
++
++GST_DEBUG_CATEGORY (gst_debug_kms_sink);
++#define GST_CAT_DEFAULT gst_debug_kms_sink
++
++G_DEFINE_TYPE (GstKMSSink, gst_kms_sink, GST_TYPE_VIDEO_SINK);
++
++static void gst_kms_sink_reset (GstKMSSink * sink);
++
++static GstStaticPadTemplate gst_kms_sink_template_factory =
++GST_STATIC_PAD_TEMPLATE ("sink",
++ GST_PAD_SINK,
++ GST_PAD_ALWAYS,
++ GST_STATIC_CAPS (GST_VIDEO_CAPS_MAKE("NV12"))
++ );
++
++enum
++{
++ PROP_0,
++ PROP_PIXEL_ASPECT_RATIO,
++ PROP_FORCE_ASPECT_RATIO,
++ PROP_SCALE,
++ PROP_CONNECTOR,
++ PROP_CONNECTOR_NAME,
++};
++
++static inline void
++display_bufs_queue (GstKMSSink * sink, GstBuffer * buf)
++{
++ int i;
++ for (i = 0; i < (NUM_DISPLAY_BUFS - 1); i++)
++ gst_buffer_replace (&sink->display_bufs[i], sink->display_bufs[i + 1]);
++ gst_buffer_replace (&sink->display_bufs[i], buf);
++}
++
++static inline void
++display_bufs_free (GstKMSSink * sink)
++{
++ int i;
++ for (i = 0; i < NUM_DISPLAY_BUFS; i++)
++ gst_buffer_replace (&sink->display_bufs[i], NULL);
++}
++
++static gboolean
++gst_kms_sink_calculate_aspect_ratio (GstKMSSink * sink, gint width,
++ gint height, gint video_par_n, gint video_par_d)
++{
++ guint calculated_par_n;
++ guint calculated_par_d;
++
++ if (!gst_video_calculate_display_ratio (&calculated_par_n, &calculated_par_d,
++ width, height, video_par_n, video_par_d, 1, 1)) {
++ GST_ELEMENT_ERROR (sink, CORE, NEGOTIATION, (NULL),
++ ("Error calculating the output display ratio of the video."));
++ return FALSE;
++ }
++ GST_DEBUG_OBJECT (sink,
++ "video width/height: %dx%d, calculated display ratio: %d/%d",
++ width, height, calculated_par_n, calculated_par_d);
++
++ /* now find a width x height that respects this display ratio.
++ * prefer those that have one of w/h the same as the incoming video
++ * using wd / hd = calculated_pad_n / calculated_par_d */
++
++ /* start with same height, because of interlaced video */
++ /* check hd / calculated_par_d is an integer scale factor, and scale wd with the PAR */
++ if (height % calculated_par_d == 0) {
++ GST_DEBUG_OBJECT (sink, "keeping video height");
++ GST_VIDEO_SINK_WIDTH (sink) = (guint)
++ gst_util_uint64_scale_int (height, calculated_par_n, calculated_par_d);
++ GST_VIDEO_SINK_HEIGHT (sink) = height;
++ } else if (width % calculated_par_n == 0) {
++ GST_DEBUG_OBJECT (sink, "keeping video width");
++ GST_VIDEO_SINK_WIDTH (sink) = width;
++ GST_VIDEO_SINK_HEIGHT (sink) = (guint)
++ gst_util_uint64_scale_int (width, calculated_par_d, calculated_par_n);
++ } else {
++ GST_DEBUG_OBJECT (sink, "approximating while keeping video height");
++ GST_VIDEO_SINK_WIDTH (sink) = (guint)
++ gst_util_uint64_scale_int (height, calculated_par_n, calculated_par_d);
++ GST_VIDEO_SINK_HEIGHT (sink) = height;
++ }
++ GST_DEBUG_OBJECT (sink, "scaling to %dx%d",
++ GST_VIDEO_SINK_WIDTH (sink), GST_VIDEO_SINK_HEIGHT (sink));
++
++ return TRUE;
++}
++
++static gboolean
++gst_kms_sink_setcaps (GstBaseSink * bsink, GstCaps * caps)
++{
++ GstKMSSink *sink;
++ gboolean ret = TRUE;
++ gint width, height;
++ gint fps_n, fps_d;
++ gint par_n, par_d;
++ GstVideoFormat format;
++ GstVideoInfo info;
++
++ sink = GST_KMS_SINK (bsink);
++
++ ret = gst_video_info_from_caps (&info, caps);
++ format = GST_VIDEO_INFO_FORMAT(&info);
++ width = GST_VIDEO_INFO_WIDTH(&info);
++ height = GST_VIDEO_INFO_HEIGHT(&info);
++ fps_n = GST_VIDEO_INFO_FPS_N(&info);
++ fps_d = GST_VIDEO_INFO_FPS_D(&info);
++ par_n = GST_VIDEO_INFO_PAR_N(&info);
++ par_d = GST_VIDEO_INFO_PAR_D(&info);
++
++ if (!ret)
++ return FALSE;
++
++ if (width <= 0 || height <= 0) {
++ GST_ELEMENT_ERROR (sink, CORE, NEGOTIATION, (NULL),
++ ("Invalid image size."));
++ return FALSE;
++ }
++
++ sink->format = format;
++ sink->par_n = par_n;
++ sink->par_d = par_d;
++ sink->src_rect.x = sink->src_rect.y = 0;
++ sink->src_rect.w = width;
++ sink->src_rect.h = height;
++ sink->input_width = width;
++ sink->input_height = height;
++
++ if (!sink->pool || !gst_drm_buffer_pool_check_caps (sink->pool, caps)) {
++ int size;
++
++ if (sink->pool) {
++ gst_drm_buffer_pool_destroy (sink->pool);
++ sink->pool = NULL;
++ }
++
++ size = GST_VIDEO_INFO_SIZE(&info);
++ sink->pool = gst_drm_buffer_pool_new (GST_ELEMENT (sink),
++ sink->fd, caps, size);
++ }
++
++ sink->conn.crtc = -1;
++ sink->plane = NULL;
++
++ return TRUE;
++}
++
++static void
++gst_kms_sink_get_times (GstBaseSink * bsink, GstBuffer * buf,
++ GstClockTime * start, GstClockTime * end)
++{
++ GstKMSSink *sink;
++
++ sink = GST_KMS_SINK (bsink);
++
++ if (GST_BUFFER_PTS_IS_VALID (buf)) {
++ *start = GST_BUFFER_PTS (buf);
++ if (GST_BUFFER_DURATION_IS_VALID (buf)) {
++ *end = *start + GST_BUFFER_DURATION (buf);
++ } else {
++ if (sink->fps_n > 0) {
++ *end = *start +
++ gst_util_uint64_scale_int (GST_SECOND, sink->fps_d, sink->fps_n);
++ }
++ }
++ }
++}
++
++static GstFlowReturn
++gst_kms_sink_show_frame (GstVideoSink * vsink, GstBuffer * inbuf)
++{
++ GstKMSSink *sink = GST_KMS_SINK (vsink);
++ GstBuffer *buf = NULL;
++ GstKMSBufferPriv *priv;
++ GstFlowReturn flow_ret = GST_FLOW_OK;
++ int ret;
++ gint width, height;
++ GstVideoRectangle *c = &sink->src_rect;
++
++ GstVideoCropMeta* crop = gst_buffer_get_video_crop_meta (inbuf);
++ if (crop){
++ c->y = crop->y;
++ c->x = crop->x;
++
++ if (crop->width >= 0) {
++ width = crop->width;
++ }
++ else {
++ width = GST_VIDEO_SINK_WIDTH (sink);
++ }
++ if (crop->height >= 0){
++ height = crop->height;
++ }
++ else {
++ height = GST_VIDEO_SINK_HEIGHT (sink);
++ }
++}
++
++
++ c->w = width;
++ c->h = height;
++
++
++if (!gst_kms_sink_calculate_aspect_ratio (sink, width, height,
++ sink->par_n, sink->par_d))
++ GST_DEBUG_OBJECT (sink, "calculate aspect ratio failed");
++
++
++ GST_INFO_OBJECT (sink, "enter");
++
++ if (sink->conn.crtc == -1) {
++ GstVideoRectangle dest = { 0 };
++
++ if (sink->conn_name) {
++ if (!gst_drm_connector_find_mode_and_plane_by_name (sink->fd,
++ sink->dev, sink->src_rect.w, sink->src_rect.h,
++ sink->resources, sink->plane_resources, &sink->conn,
++ sink->conn_name, &sink->plane))
++ goto connector_not_found;
++ } else {
++ sink->conn.id = sink->conn_id;
++ if (!gst_drm_connector_find_mode_and_plane (sink->fd,
++ sink->dev, sink->src_rect.w, sink->src_rect.h,
++ sink->resources, sink->plane_resources, &sink->conn,
++ &sink->plane))
++ goto connector_not_found;
++ }
++
++ dest.w = sink->conn.mode->hdisplay;
++ dest.h = sink->conn.mode->vdisplay;
++ gst_video_sink_center_rect (sink->src_rect, dest, &sink->dst_rect,
++ sink->scale);
++ }
++
++ priv = gst_kms_buffer_priv (sink, inbuf);
++ if (priv) {
++ buf = gst_buffer_ref (inbuf);
++ } else {
++ GST_LOG_OBJECT (sink, "not a KMS buffer, slow-path!");
++ buf = gst_drm_buffer_pool_get (sink->pool, FALSE);
++ if (buf) {
++ GST_BUFFER_PTS (buf) = GST_BUFFER_PTS (inbuf);
++ GST_BUFFER_DURATION (buf) = GST_BUFFER_DURATION (inbuf);
++ gst_buffer_copy_into (buf, inbuf, GST_BUFFER_COPY_DEEP, 0 ,-1);
++ priv = gst_kms_buffer_priv (sink, buf);
++ }
++ if (!priv)
++ goto add_fb2_failed;
++ }
++
++ ret = drmModeSetPlane (sink->fd, sink->plane->plane_id,
++ sink->conn.crtc, priv->fb_id, 0,
++ sink->dst_rect.x, sink->dst_rect.y, sink->dst_rect.w, sink->dst_rect.h,
++ sink->src_rect.x << 16, sink->src_rect.y << 16,
++ sink->src_rect.w << 16, sink->src_rect.h << 16);
++ if (ret)
++ goto set_plane_failed;
++
++ display_bufs_queue (sink, buf);
++
++out:
++ GST_INFO_OBJECT (sink, "exit");
++ if (buf)
++ gst_buffer_unref (buf);
++ return flow_ret;
++
++add_fb2_failed:
++ GST_ELEMENT_ERROR (sink, RESOURCE, FAILED,
++ (NULL), ("drmModeAddFB2 failed: %s (%d)", strerror (errno), errno));
++ flow_ret = GST_FLOW_ERROR;
++ goto out;
++
++set_plane_failed:
++ GST_ELEMENT_ERROR (sink, RESOURCE, FAILED,
++ (NULL), ("drmModeSetPlane failed: %s (%d)", strerror (errno), errno));
++ flow_ret = GST_FLOW_ERROR;
++ goto out;
++
++connector_not_found:
++ GST_ELEMENT_ERROR (sink, RESOURCE, NOT_FOUND,
++ (NULL), ("connector not found", strerror (errno), errno));
++ goto out;
++}
++
++
++static gboolean
++gst_kms_sink_event (GstBaseSink * bsink, GstEvent * event)
++{
++ GstKMSSink *sink = GST_KMS_SINK (bsink);
++
++ switch (GST_EVENT_TYPE (event)) {
++ default:
++ break;
++ }
++ if (GST_BASE_SINK_CLASS (gst_kms_sink_parent_class)->event)
++ return GST_BASE_SINK_CLASS (gst_kms_sink_parent_class)->event (bsink,
++ event);
++ else
++ return TRUE;
++}
++
++static void
++gst_kms_sink_set_property (GObject * object, guint prop_id,
++ const GValue * value, GParamSpec * pspec)
++{
++ GstKMSSink *sink;
++
++ g_return_if_fail (GST_IS_KMS_SINK (object));
++
++ sink = GST_KMS_SINK (object);
++
++ switch (prop_id) {
++ case PROP_FORCE_ASPECT_RATIO:
++ sink->keep_aspect = g_value_get_boolean (value);
++ break;
++ case PROP_SCALE:
++ sink->scale = g_value_get_boolean (value);
++ break;
++ case PROP_CONNECTOR:
++ sink->conn_id = g_value_get_uint (value);
++ break;
++ case PROP_CONNECTOR_NAME:
++ g_free (sink->conn_name);
++ sink->conn_name = g_strdup (g_value_get_string (value));
++ break;
++ case PROP_PIXEL_ASPECT_RATIO:
++ {
++ GValue *tmp;
++
++ tmp = g_new0 (GValue, 1);
++ g_value_init (tmp, GST_TYPE_FRACTION);
++
++ if (!g_value_transform (value, tmp)) {
++ GST_WARNING_OBJECT (sink, "Could not transform string to aspect ratio");
++ } else {
++ sink->par_n = gst_value_get_fraction_numerator (tmp);
++ sink->par_d = gst_value_get_fraction_denominator (tmp);
++ GST_DEBUG_OBJECT (sink, "set PAR to %d/%d", sink->par_n, sink->par_d);
++ }
++ g_free (tmp);
++ }
++ break;
++ default:
++ G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
++ break;
++ }
++}
++
++static void
++gst_kms_sink_get_property (GObject * object, guint prop_id,
++ GValue * value, GParamSpec * pspec)
++{
++ GstKMSSink *sink;
++
++ g_return_if_fail (GST_IS_KMS_SINK (object));
++
++ sink = GST_KMS_SINK (object);
++
++ switch (prop_id) {
++ case PROP_FORCE_ASPECT_RATIO:
++ g_value_set_boolean (value, sink->keep_aspect);
++ break;
++ case PROP_SCALE:
++ g_value_set_boolean (value, sink->scale);
++ break;
++ case PROP_CONNECTOR:
++ g_value_set_uint (value, sink->conn.id);
++ break;
++ case PROP_PIXEL_ASPECT_RATIO:
++ {
++ char *v = g_strdup_printf ("%d/%d", sink->par_n, sink->par_d);
++ g_value_take_string (value, v);
++ break;
++ }
++ default:
++ G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
++ break;
++ }
++}
++
++static void
++gst_kms_sink_reset (GstKMSSink * sink)
++{
++ GST_DEBUG_OBJECT (sink, "reset");
++
++ if (sink->fd != -1) {
++ gst_drm_connector_cleanup (sink->fd, &sink->conn);
++ }
++ memset (&sink->conn, 0, sizeof (struct connector));
++
++ if (sink->pool) {
++ gst_drm_buffer_pool_destroy (sink->pool);
++ sink->pool = NULL;
++ }
++
++ if (sink->plane) {
++ drmModeFreePlane (sink->plane);
++ sink->plane = NULL;
++ }
++
++ if (sink->plane_resources) {
++ drmModeFreePlaneResources (sink->plane_resources);
++ sink->plane_resources = NULL;
++ }
++
++ if (sink->resources) {
++ drmModeFreeResources (sink->resources);
++ sink->resources = NULL;
++ }
++
++ display_bufs_free (sink);
++
++ if (sink->dev) {
++ dce_deinit (sink->dev);
++ sink->dev = NULL;
++ sink->fd = -1;
++ }
++
++ sink->par_n = sink->par_d = 1;
++ sink->src_rect.x = 0;
++ sink->src_rect.y = 0;
++ sink->src_rect.w = 0;
++ sink->src_rect.h = 0;
++ sink->input_width = 0;
++ sink->input_height = 0;
++ sink->format = GST_VIDEO_FORMAT_UNKNOWN;
++
++ memset (&sink->src_rect, 0, sizeof (GstVideoRectangle));
++ memset (&sink->dst_rect, 0, sizeof (GstVideoRectangle));
++}
++
++static gboolean
++gst_kms_sink_start (GstBaseSink * bsink)
++{
++ GstKMSSink *sink;
++
++ sink = GST_KMS_SINK (bsink);
++
++ sink->dev = dce_init ();
++ if (sink->dev == NULL)
++ goto device_failed;
++ else
++ sink->fd = dce_get_fd ();
++
++ sink->resources = drmModeGetResources (sink->fd);
++ if (sink->resources == NULL)
++ goto resources_failed;
++
++ sink->plane_resources = drmModeGetPlaneResources (sink->fd);
++ if (sink->plane_resources == NULL)
++ goto plane_resources_failed;
++
++ return TRUE;
++
++fail:
++ gst_kms_sink_reset (sink);
++ return FALSE;
++
++device_failed:
++ GST_ELEMENT_ERROR (sink, RESOURCE, FAILED,
++ (NULL), ("omap_device_new failed"));
++ goto fail;
++
++resources_failed:
++ GST_ELEMENT_ERROR (sink, RESOURCE, FAILED,
++ (NULL), ("drmModeGetResources failed: %s (%d)", strerror (errno), errno));
++ goto fail;
++
++plane_resources_failed:
++ GST_ELEMENT_ERROR (sink, RESOURCE, FAILED,
++ (NULL), ("drmModeGetPlaneResources failed: %s (%d)",
++ strerror (errno), errno));
++ goto fail;
++}
++
++static gboolean
++gst_kms_sink_stop (GstBaseSink * bsink)
++{
++ GstKMSSink *sink;
++
++ sink = GST_KMS_SINK (bsink);
++ gst_kms_sink_reset (sink);
++
++ return TRUE;
++}
++
++static GstFlowReturn
++gst_kms_sink_buffer_alloc (GstBaseSink * bsink, guint64 offset, guint size,
++ GstCaps * caps, GstBuffer ** buf)
++{
++ GstKMSSink *sink;
++ GstFlowReturn ret = GST_FLOW_OK;
++
++ sink = GST_KMS_SINK (bsink);
++
++ GST_DEBUG_OBJECT (sink, "begin");
++
++ if (G_UNLIKELY (!caps)) {
++ GST_WARNING_OBJECT (sink, "have no caps, doing fallback allocation");
++ *buf = NULL;
++ ret = GST_FLOW_OK;
++ goto beach;
++ }
++
++ GST_LOG_OBJECT (sink,
++ "a buffer of %d bytes was requested with caps %" GST_PTR_FORMAT
++ " and offset %" G_GUINT64_FORMAT, size, caps, offset);
++
++ /* initialize the buffer pool if not initialized yet */
++ if (G_UNLIKELY (!sink->pool || gst_drm_buffer_pool_size (sink->pool) != size)) {
++ GstVideoFormat format;
++ gint width, height;
++ GstVideoInfo info;
++
++ if (sink->pool) {
++ GST_INFO_OBJECT (sink, "in buffer alloc, pool->size != size");
++ gst_drm_buffer_pool_destroy (sink->pool);
++ sink->pool = NULL;
++ }
++
++ gst_video_info_from_caps (&info, caps);
++ format = GST_VIDEO_INFO_FORMAT(&info);
++ width = GST_VIDEO_INFO_WIDTH(&info);
++ height = GST_VIDEO_INFO_HEIGHT(&info);
++ size = GST_VIDEO_INFO_SIZE(&info);
++ sink->pool = gst_drm_buffer_pool_new (GST_ELEMENT (sink),
++ sink->fd, caps, size);
++ }
++ *buf = GST_BUFFER_CAST (gst_drm_buffer_pool_get (sink->pool, FALSE));
++
++beach:
++ return ret;
++}
++
++static void
++gst_kms_sink_finalize (GObject * object)
++{
++ GstKMSSink *sink;
++
++ sink = GST_KMS_SINK (object);
++ gst_kms_sink_reset (sink);
++ g_free (sink->conn_name);
++ if (sink->kmsbufferpriv){
++ g_hash_table_destroy (sink->kmsbufferpriv);
++ sink->kmsbufferpriv = NULL;
++}
++
++ G_OBJECT_CLASS (gst_kms_sink_parent_class)->finalize (object);
++}
++
++static void
++kmsbufferpriv_free_func (GstKMSBufferPriv *priv)
++{
++ drmModeRmFB (priv->fd, priv->fb_id);
++ omap_bo_del (priv->bo);
++ g_free(priv);
++}
++
++
++static void
++gst_kms_sink_init (GstKMSSink * sink)
++{
++ sink->fd = -1;
++ gst_kms_sink_reset (sink);
++ sink->kmsbufferpriv = g_hash_table_new_full (g_direct_hash, g_direct_equal,
++ NULL, (GDestroyNotify) kmsbufferpriv_free_func);
++}
++
++static void
++gst_kms_sink_class_init (GstKMSSinkClass * klass)
++{
++ GObjectClass *gobject_class;
++ GstElementClass *gstelement_class;
++ GstBaseSinkClass *gstbasesink_class;
++ GstVideoSinkClass *videosink_class;
++
++ gobject_class = (GObjectClass *) klass;
++ gstelement_class = (GstElementClass *) klass;
++ gstbasesink_class = (GstBaseSinkClass *) klass;
++ videosink_class = (GstVideoSinkClass *) klass;
++
++ gobject_class->finalize = gst_kms_sink_finalize;
++ gobject_class->set_property = gst_kms_sink_set_property;
++ gobject_class->get_property = gst_kms_sink_get_property;
++
++ g_object_class_install_property (gobject_class, PROP_FORCE_ASPECT_RATIO,
++ g_param_spec_boolean ("force-aspect-ratio", "Force aspect ratio",
++ "When enabled, reverse caps negotiation (scaling) will respect "
++ "original aspect ratio", FALSE,
++ G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
++ g_object_class_install_property (gobject_class, PROP_PIXEL_ASPECT_RATIO,
++ g_param_spec_string ("pixel-aspect-ratio", "Pixel Aspect Ratio",
++ "The pixel aspect ratio of the device", "1/1",
++ G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
++ g_object_class_install_property (gobject_class, PROP_SCALE,
++ g_param_spec_boolean ("scale", "Scale",
++ "When true, scale to render fullscreen", FALSE,
++ G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
++ g_object_class_install_property (gobject_class, PROP_CONNECTOR,
++ g_param_spec_uint ("connector", "Connector",
++ "DRM connector id (0 for automatic selection)", 0, G_MAXUINT32, 0,
++ G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS | G_PARAM_CONSTRUCT));
++ g_object_class_install_property (gobject_class, PROP_CONNECTOR_NAME,
++ g_param_spec_string ("connector-name", "Connector name",
++ "DRM connector name (alternative to the connector property, "
++ "use $type$index, $type-$index, or $type)", "",
++ G_PARAM_WRITABLE | G_PARAM_STATIC_STRINGS));
++
++ gst_element_class_set_details_simple (gstelement_class,
++ "Video sink", "Sink/Video",
++ "A video sink using the linux kernel mode setting API",
++ "Alessandro Decina <alessandro.d@gmail.com>");
++
++ gst_element_class_add_pad_template (gstelement_class,
++ gst_static_pad_template_get (&gst_kms_sink_template_factory));
++
++ gstbasesink_class->set_caps = GST_DEBUG_FUNCPTR (gst_kms_sink_setcaps);
++ gstbasesink_class->get_times = GST_DEBUG_FUNCPTR (gst_kms_sink_get_times);
++ gstbasesink_class->event = GST_DEBUG_FUNCPTR (gst_kms_sink_event);
++ gstbasesink_class->start = GST_DEBUG_FUNCPTR (gst_kms_sink_start);
++ gstbasesink_class->stop = GST_DEBUG_FUNCPTR (gst_kms_sink_stop);
++
++ /* disable preroll as it's called before GST_CROP_EVENT has been received, so
++ * we end up configuring the wrong mode... (based on padded caps)
++ */
++ gstbasesink_class->preroll = NULL;
++ videosink_class->show_frame = GST_DEBUG_FUNCPTR (gst_kms_sink_show_frame);
++}
++
++static gboolean
++plugin_init (GstPlugin * plugin)
++{
++ if (!gst_element_register (plugin, "kmssink",
++ GST_RANK_PRIMARY + 1, GST_TYPE_KMS_SINK))
++ return FALSE;
++
++ GST_DEBUG_CATEGORY_INIT (gst_debug_kms_sink, "kmssink", 0, "kmssink element");
++
++ return TRUE;
++}
++
++GST_PLUGIN_DEFINE (GST_VERSION_MAJOR,
++ GST_VERSION_MINOR,
++ kms,
++ "KMS video output element",
++ plugin_init, VERSION, GST_LICENSE, GST_PACKAGE_NAME, GST_PACKAGE_ORIGIN)
+diff --git a/sys/kms/gstkmssink.h b/sys/kms/gstkmssink.h
+new file mode 100644
+index 0000000..6c312bb
+--- /dev/null
++++ b/sys/kms/gstkmssink.h
+@@ -0,0 +1,91 @@
++/* GStreamer
++ *
++ * Copyright (C) 2012 Texas Instruments
++ * Copyright (C) 2012 Collabora Ltd
++ *
++ * Authors:
++ * Alessandro Decina <alessandro.decina@collabora.co.uk>
++ *
++ * 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 Foundation; either
++ * version 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 Foundation, Inc., 59 Temple Place - Suite 330,
++ * Boston, MA 02111-1307, USA.
++ */
++
++#ifndef __GST_KMS_SINK_H__
++#define __GST_KMS_SINK_H__
++
++#include <gst/video/video.h>
++#include <gst/video/gstvideosink.h>
++#include <gst/drm/gstdrmbufferpool.h>
++
++#include <stdio.h>
++#include <stdint.h>
++#include <stdlib.h>
++#include <string.h>
++#include <errno.h>
++#include <unistd.h>
++#include <assert.h>
++
++#include "gstdrmutils.h"
++
++G_BEGIN_DECLS
++#define GST_TYPE_KMS_SINK \
++ (gst_kms_sink_get_type())
++#define GST_KMS_SINK(obj) \
++ (G_TYPE_CHECK_INSTANCE_CAST((obj), GST_TYPE_KMS_SINK, GstKMSSink))
++#define GST_KMS_SINK_CLASS(klass) \
++ (G_TYPE_CHECK_CLASS_CAST((klass), GST_TYPE_KMS_SINK, GstKMSSinkClass))
++#define GST_IS_KMS_SINK(obj) \
++ (G_TYPE_CHECK_INSTANCE_TYPE((obj), GST_TYPE_KMS_SINK))
++#define GST_IS_KMS_SINK_CLASS(klass) \
++ (G_TYPE_CHECK_CLASS_TYPE((klass), GST_TYPE_KMS_SINK))
++typedef struct _GstKMSSink GstKMSSink;
++typedef struct _GstKMSSinkClass GstKMSSinkClass;
++
++#define NUM_DISPLAY_BUFS 4
++
++struct _GstKMSSink
++{
++ GstVideoSink videosink;
++ gint input_width, input_height;
++ GstVideoFormat format;
++ gint par_n, par_d;
++ gint fps_n, fps_d;
++ gboolean keep_aspect;
++ GstVideoRectangle src_rect;
++ GstVideoRectangle dst_rect;
++ int fd;
++ struct omap_device *dev;
++ drmModeRes *resources;
++ drmModePlaneRes *plane_resources;
++ struct connector conn;
++ uint32_t conn_id;
++ char *conn_name;
++ drmModePlane *plane;
++ GstDRMBufferPool *pool;
++ GHashTable *kmsbufferpriv;
++ /* current displayed buffer and last displayed buffer: */
++ GstBuffer *display_bufs[NUM_DISPLAY_BUFS];
++ gboolean scale;
++};
++
++struct _GstKMSSinkClass
++{
++ GstVideoSinkClass parent_class;
++};
++
++GType gst_kms_sink_get_type (void);
++
++G_END_DECLS
++#endif /* __GST_KMS_SINK_H__ */
+--
+1.7.9.5
+
diff --git a/meta-arago-extras/recipes-multimedia/gstreamer/gstreamer1.0-plugins-bad/0004-waylandsink-Removed-dependency-on-dri2.patch b/meta-arago-extras/recipes-multimedia/gstreamer/gstreamer1.0-plugins-bad/0004-waylandsink-Removed-dependency-on-dri2.patch
new file mode 100644
index 0000000..8c2e887
--- /dev/null
+++ b/meta-arago-extras/recipes-multimedia/gstreamer/gstreamer1.0-plugins-bad/0004-waylandsink-Removed-dependency-on-dri2.patch
@@ -0,0 +1,26 @@
+From dbaac14600fd88988aa676634849b137376de397 Mon Sep 17 00:00:00 2001
+From: Karthik Ramanan <a0393906@ti.com>
+Date: Thu, 15 Jan 2015 12:47:31 +0530
+Subject: [PATCH] waylandsink: Removed dependency on dri2
+
+Signed-off-by: Karthik Ramanan <a0393906@ti.com>
+---
+ configure.ac | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+diff --git a/configure.ac b/configure.ac
+index e3db68f..2741824 100644
+--- a/configure.ac
++++ b/configure.ac
+@@ -1219,7 +1219,7 @@ AG_GST_CHECK_FEATURE(DIRECTFB, [directfb], dfbvideosink , [
+ dnl **** Wayland ****
+ translit(dnm, m, l) AM_CONDITIONAL(USE_WAYLAND, true)
+ AG_GST_CHECK_FEATURE(WAYLAND, [wayland sink], wayland , [
+- PKG_CHECK_MODULES(WAYLAND, wayland-client >= 1.0.0 dri2 libdrm libdrm_omap, [
++ PKG_CHECK_MODULES(WAYLAND, wayland-client >= 1.0.0 libdrm libdrm_omap, [
+ AC_SUBST(DRM_CFLAGS)
+ AC_SUBST(DRM_LIBS)
+ HAVE_WAYLAND="yes" ], [ HAVE_WAYLAND="no"
+--
+1.7.9.5
+
diff --git a/meta-arago-extras/recipes-multimedia/gstreamer/gstreamer1.0-plugins-bad/0005-vc1parse-and-jpegparse-Fixes-plugin-ranks.patch b/meta-arago-extras/recipes-multimedia/gstreamer/gstreamer1.0-plugins-bad/0005-vc1parse-and-jpegparse-Fixes-plugin-ranks.patch
new file mode 100644
index 0000000..8ae79b5
--- /dev/null
+++ b/meta-arago-extras/recipes-multimedia/gstreamer/gstreamer1.0-plugins-bad/0005-vc1parse-and-jpegparse-Fixes-plugin-ranks.patch
@@ -0,0 +1,54 @@
+From 7083e7ee50130bf41a0ec0d1634577d4bf9ef9cf Mon Sep 17 00:00:00 2001
+From: Pooja Prajod <a0132412@ti.com>
+Date: Wed, 4 Feb 2015 18:12:58 +0530
+Subject: [PATCH] vc1parse and jpegparse : Fixes plugin ranks
+
+Fix plugin ranks so that they are picked by playbin
+---
+ gst/jpegformat/gstjpegformat.c | 2 +-
+ gst/jpegformat/gstjpegparse.c | 2 +-
+ gst/videoparsers/plugin.c | 2 +-
+ 3 files changed, 3 insertions(+), 3 deletions(-)
+
+diff --git a/gst/jpegformat/gstjpegformat.c b/gst/jpegformat/gstjpegformat.c
+index b410466..ecb9311 100644
+--- a/gst/jpegformat/gstjpegformat.c
++++ b/gst/jpegformat/gstjpegformat.c
+@@ -30,7 +30,7 @@
+ static gboolean
+ plugin_init (GstPlugin * plugin)
+ {
+- if (!gst_element_register (plugin, "jpegparse", GST_RANK_NONE,
++ if (!gst_element_register (plugin, "jpegparse", GST_RANK_PRIMARY + 2,
+ GST_TYPE_JPEG_PARSE))
+ return FALSE;
+ if (!gst_element_register (plugin, "jifmux", GST_RANK_SECONDARY,
+diff --git a/gst/jpegformat/gstjpegparse.c b/gst/jpegformat/gstjpegparse.c
+index 9983f32..04d5b91 100644
+--- a/gst/jpegformat/gstjpegparse.c
++++ b/gst/jpegformat/gstjpegparse.c
+@@ -156,7 +156,7 @@ gst_jpeg_parse_class_init (GstJpegParseClass * klass)
+
+ gst_element_class_set_static_metadata (gstelement_class,
+ "JPEG stream parser",
+- "Video/Parser",
++ "Codec/Parser/Video",
+ "Parse JPEG images into single-frame buffers",
+ "Arnout Vandecappelle (Essensium/Mind) <arnout@mind.be>");
+
+diff --git a/gst/videoparsers/plugin.c b/gst/videoparsers/plugin.c
+index 485b0ed..a85550c 100644
+--- a/gst/videoparsers/plugin.c
++++ b/gst/videoparsers/plugin.c
+@@ -48,7 +48,7 @@ plugin_init (GstPlugin * plugin)
+ ret |= gst_element_register (plugin, "pngparse",
+ GST_RANK_PRIMARY, GST_TYPE_PNG_PARSE);
+ ret |= gst_element_register (plugin, "vc1parse",
+- GST_RANK_NONE, GST_TYPE_VC1_PARSE);
++ GST_RANK_PRIMARY + 2, GST_TYPE_VC1_PARSE);
+
+ return ret;
+ }
+--
+1.7.9.5
+
diff --git a/meta-arago-extras/recipes-multimedia/gstreamer/gstreamer1.0-plugins-bad_1.2.3.bbappend b/meta-arago-extras/recipes-multimedia/gstreamer/gstreamer1.0-plugins-bad_1.2.3.bbappend
new file mode 100644
index 0000000..33b0048
--- /dev/null
+++ b/meta-arago-extras/recipes-multimedia/gstreamer/gstreamer1.0-plugins-bad_1.2.3.bbappend
@@ -0,0 +1,14 @@
+FILESEXTRAPATHS_prepend := "${THISDIR}/${PN}:"
+
+PACKAGECONFIG = "faad wayland"
+
+SRC_URI_append = " \
+ file://0001-Added-GstDRMBufferPool-support.patch \
+ file://0002-Modified-waylandsink-to-accept-NV12-format.patch \
+ file://0003-Added-KMSsink-support.patch \
+ file://0004-waylandsink-Removed-dependency-on-dri2.patch \
+ file://0005-vc1parse-and-jpegparse-Fixes-plugin-ranks.patch"
+
+PR = "r9"
+
+FILES_${PN} += "${libdir}/gstreamer-1.0/*.so"
--
1.7.9.5
^ permalink raw reply related [flat|nested] 11+ messages in thread
* [meta-arago 4/4] gstreamer1.0-plugins-ti: Add ducati and vpe GST plugins
2015-03-03 15:59 [meta-arago 0/4] GStreamer 1.0 adapatations for TI Platforms Karthik Ramanan
` (2 preceding siblings ...)
2015-03-03 15:59 ` [meta-arago 3/4] gstreamer1.0-plugins-bad: Add various features Karthik Ramanan
@ 2015-03-03 15:59 ` Karthik Ramanan
2015-03-10 16:53 ` [meta-arago 0/4] GStreamer 1.0 adapatations for TI Platforms Denys Dmytriyenko
2015-03-17 15:45 ` Denys Dmytriyenko
5 siblings, 0 replies; 11+ messages in thread
From: Karthik Ramanan @ 2015-03-03 15:59 UTC (permalink / raw)
To: meta-arago
Signed-off-by: Karthik Ramanan <a0393906@ti.com>
---
.../gstreamer1.0-plugins-ducati_git.bb | 10 ++++++++++
.../gst-plugins-ti/gstreamer1.0-plugins-ti.inc | 19 +++++++++++++++++++
.../gst-plugins-ti/gstreamer1.0-plugins-vpe_git.bb | 11 +++++++++++
3 files changed, 40 insertions(+)
create mode 100644 meta-arago-extras/recipes-multimedia/gst-plugins-ti/gstreamer1.0-plugins-ducati_git.bb
create mode 100644 meta-arago-extras/recipes-multimedia/gst-plugins-ti/gstreamer1.0-plugins-ti.inc
create mode 100644 meta-arago-extras/recipes-multimedia/gst-plugins-ti/gstreamer1.0-plugins-vpe_git.bb
diff --git a/meta-arago-extras/recipes-multimedia/gst-plugins-ti/gstreamer1.0-plugins-ducati_git.bb b/meta-arago-extras/recipes-multimedia/gst-plugins-ti/gstreamer1.0-plugins-ducati_git.bb
new file mode 100644
index 0000000..7f65284
--- /dev/null
+++ b/meta-arago-extras/recipes-multimedia/gst-plugins-ti/gstreamer1.0-plugins-ducati_git.bb
@@ -0,0 +1,10 @@
+DESCRIPTION = "GStreamer elements to use the multimedia accelerators available on some TI parts"
+LICENSE = "LGPLv2"
+LIC_FILES_CHKSUM = "file://COPYING;md5=fbc093901857fcd118f065f900982c24"
+
+require gstreamer1.0-plugins-ti.inc
+
+PR = "${INC_PR}.1"
+SRCREV = "59fb5be20da72a2f5fb4f25587be668532a90c3b"
+
+SRC_URI = "git://git.ti.com/glsdk/gst-plugin-ducati.git;protocol=git"
diff --git a/meta-arago-extras/recipes-multimedia/gst-plugins-ti/gstreamer1.0-plugins-ti.inc b/meta-arago-extras/recipes-multimedia/gst-plugins-ti/gstreamer1.0-plugins-ti.inc
new file mode 100644
index 0000000..b5bb501
--- /dev/null
+++ b/meta-arago-extras/recipes-multimedia/gst-plugins-ti/gstreamer1.0-plugins-ti.inc
@@ -0,0 +1,19 @@
+# Include file for common build settings for TI GStreamer plugins
+DEPENDS += "gstreamer1.0 gstreamer1.0-plugins-base gstreamer1.0-plugins-bad libdrm libdce"
+
+inherit autotools pkgconfig gettext
+
+INC_PR = "r0"
+
+S = "${WORKDIR}/git"
+
+do_configure() {
+ cd ${S}
+ chmod +x autogen.sh
+ ./autogen.sh --host=arm-linux --with-libtool-sysroot=${STAGING_DIR_TARGET} --prefix=/usr
+}
+
+EXTRA_OECONF += "--enable-maintainer-mode"
+EXTRA_OEMAKE += "'ERROR_CFLAGS=-Wno-deprecated-declarations'"
+
+FILES_${PN} += "${libdir}/gstreamer-1.0/*.so"
diff --git a/meta-arago-extras/recipes-multimedia/gst-plugins-ti/gstreamer1.0-plugins-vpe_git.bb b/meta-arago-extras/recipes-multimedia/gst-plugins-ti/gstreamer1.0-plugins-vpe_git.bb
new file mode 100644
index 0000000..74d5c77
--- /dev/null
+++ b/meta-arago-extras/recipes-multimedia/gst-plugins-ti/gstreamer1.0-plugins-vpe_git.bb
@@ -0,0 +1,11 @@
+DESCRIPTION = "GStreamer elements to use the Video Processing Engine (VPE) found on some TI devices"
+
+LICENSE = "LGPLv2"
+LIC_FILES_CHKSUM = "file://COPYING;md5=fbc093901857fcd118f065f900982c24"
+
+require gstreamer1.0-plugins-ti.inc
+
+PR = "${INC_PR}.1"
+SRCREV = "6083aeb7d2caedb57cd62ab34c2ab0cd59664da5"
+
+SRC_URI = "git://git.ti.com/glsdk/gst-plugin-vpe.git;protocol=git"
--
1.7.9.5
^ permalink raw reply related [flat|nested] 11+ messages in thread
* Re: [meta-arago 0/4] GStreamer 1.0 adapatations for TI Platforms
2015-03-03 15:59 [meta-arago 0/4] GStreamer 1.0 adapatations for TI Platforms Karthik Ramanan
` (3 preceding siblings ...)
2015-03-03 15:59 ` [meta-arago 4/4] gstreamer1.0-plugins-ti: Add ducati and vpe GST plugins Karthik Ramanan
@ 2015-03-10 16:53 ` Denys Dmytriyenko
2015-03-17 15:45 ` Denys Dmytriyenko
5 siblings, 0 replies; 11+ messages in thread
From: Denys Dmytriyenko @ 2015-03-10 16:53 UTC (permalink / raw)
To: Karthik Ramanan; +Cc: meta-arago
Vivek, Jake,
Do you have any comments for these 2 sets of GST 1.x patches?
On Tue, Mar 03, 2015 at 09:29:21PM +0530, Karthik Ramanan wrote:
> Difference from v1:
> * Add gst-plugins-ducati for GST 1.x
> * Add gst-plugins-vpe for GST 1.x
> * Add FILES_PN explicitly for all GST 1.x recipes
>
> Karthik Ramanan (4):
> gstreamer1.0-plugins-base: Add DMA Buf support
> gstreamer1.0-plugins-good: Add DMABuf support v4l2src
> gstreamer1.0-plugins-bad: Add various features
> gstreamer1.0-plugins-ti: Add ducati and vpe GST plugins
>
> .../gstreamer1.0-plugins-ducati_git.bb | 10 +
> .../gst-plugins-ti/gstreamer1.0-plugins-ti.inc | 19 +
> .../gst-plugins-ti/gstreamer1.0-plugins-vpe_git.bb | 11 +
> .../0001-Added-GstDRMBufferPool-support.patch | 774 +++++++++++
> ...odified-waylandsink-to-accept-NV12-format.patch | 1017 ++++++++++++++
> .../0003-Added-KMSsink-support.patch | 1457 ++++++++++++++++++++
> ...04-waylandsink-Removed-dependency-on-dri2.patch | 26 +
> ...vc1parse-and-jpegparse-Fixes-plugin-ranks.patch | 54 +
> .../gstreamer1.0-plugins-bad_1.2.3.bbappend | 14 +
> .../0001-Added-GstMetaDmaBuf-features.patch | 441 ++++++
> .../gstreamer1.0-plugins-base_1.2.3.bbappend | 8 +
> ...ST_V4L2_IO_DMABUF-mode-support-in-capture.patch | 298 ++++
> .../gstreamer1.0-plugins-good_1.2.3.bbappend | 8 +
> 13 files changed, 4137 insertions(+)
> create mode 100644 meta-arago-extras/recipes-multimedia/gst-plugins-ti/gstreamer1.0-plugins-ducati_git.bb
> create mode 100644 meta-arago-extras/recipes-multimedia/gst-plugins-ti/gstreamer1.0-plugins-ti.inc
> create mode 100644 meta-arago-extras/recipes-multimedia/gst-plugins-ti/gstreamer1.0-plugins-vpe_git.bb
> create mode 100644 meta-arago-extras/recipes-multimedia/gstreamer/gstreamer1.0-plugins-bad/0001-Added-GstDRMBufferPool-support.patch
> create mode 100644 meta-arago-extras/recipes-multimedia/gstreamer/gstreamer1.0-plugins-bad/0002-Modified-waylandsink-to-accept-NV12-format.patch
> create mode 100644 meta-arago-extras/recipes-multimedia/gstreamer/gstreamer1.0-plugins-bad/0003-Added-KMSsink-support.patch
> create mode 100644 meta-arago-extras/recipes-multimedia/gstreamer/gstreamer1.0-plugins-bad/0004-waylandsink-Removed-dependency-on-dri2.patch
> create mode 100644 meta-arago-extras/recipes-multimedia/gstreamer/gstreamer1.0-plugins-bad/0005-vc1parse-and-jpegparse-Fixes-plugin-ranks.patch
> create mode 100644 meta-arago-extras/recipes-multimedia/gstreamer/gstreamer1.0-plugins-bad_1.2.3.bbappend
> create mode 100644 meta-arago-extras/recipes-multimedia/gstreamer/gstreamer1.0-plugins-base/0001-Added-GstMetaDmaBuf-features.patch
> create mode 100644 meta-arago-extras/recipes-multimedia/gstreamer/gstreamer1.0-plugins-base_1.2.3.bbappend
> create mode 100644 meta-arago-extras/recipes-multimedia/gstreamer/gstreamer1.0-plugins-good/0001-Adds-GST_V4L2_IO_DMABUF-mode-support-in-capture.patch
> create mode 100644 meta-arago-extras/recipes-multimedia/gstreamer/gstreamer1.0-plugins-good_1.2.3.bbappend
>
> --
> 1.7.9.5
>
> _______________________________________________
> meta-arago mailing list
> meta-arago@arago-project.org
> http://arago-project.org/cgi-bin/mailman/listinfo/meta-arago
^ permalink raw reply [flat|nested] 11+ messages in thread
* Re: [meta-arago 0/4] GStreamer 1.0 adapatations for TI Platforms
2015-03-03 15:59 [meta-arago 0/4] GStreamer 1.0 adapatations for TI Platforms Karthik Ramanan
` (4 preceding siblings ...)
2015-03-10 16:53 ` [meta-arago 0/4] GStreamer 1.0 adapatations for TI Platforms Denys Dmytriyenko
@ 2015-03-17 15:45 ` Denys Dmytriyenko
2015-03-17 16:07 ` R, Karthik
5 siblings, 1 reply; 11+ messages in thread
From: Denys Dmytriyenko @ 2015-03-17 15:45 UTC (permalink / raw)
To: Karthik Ramanan; +Cc: meta-arago
Ok, I'm fine with these patches, except one thing:
FILES_${PN} += "${libdir}/gstreamer-1.0/*.so"
What is the specific reason for this? I'm going to drop it when applying
these patches later today...
On Tue, Mar 03, 2015 at 09:29:21PM +0530, Karthik Ramanan wrote:
> Difference from v1:
> * Add gst-plugins-ducati for GST 1.x
> * Add gst-plugins-vpe for GST 1.x
> * Add FILES_PN explicitly for all GST 1.x recipes
>
> Karthik Ramanan (4):
> gstreamer1.0-plugins-base: Add DMA Buf support
> gstreamer1.0-plugins-good: Add DMABuf support v4l2src
> gstreamer1.0-plugins-bad: Add various features
> gstreamer1.0-plugins-ti: Add ducati and vpe GST plugins
>
> .../gstreamer1.0-plugins-ducati_git.bb | 10 +
> .../gst-plugins-ti/gstreamer1.0-plugins-ti.inc | 19 +
> .../gst-plugins-ti/gstreamer1.0-plugins-vpe_git.bb | 11 +
> .../0001-Added-GstDRMBufferPool-support.patch | 774 +++++++++++
> ...odified-waylandsink-to-accept-NV12-format.patch | 1017 ++++++++++++++
> .../0003-Added-KMSsink-support.patch | 1457 ++++++++++++++++++++
> ...04-waylandsink-Removed-dependency-on-dri2.patch | 26 +
> ...vc1parse-and-jpegparse-Fixes-plugin-ranks.patch | 54 +
> .../gstreamer1.0-plugins-bad_1.2.3.bbappend | 14 +
> .../0001-Added-GstMetaDmaBuf-features.patch | 441 ++++++
> .../gstreamer1.0-plugins-base_1.2.3.bbappend | 8 +
> ...ST_V4L2_IO_DMABUF-mode-support-in-capture.patch | 298 ++++
> .../gstreamer1.0-plugins-good_1.2.3.bbappend | 8 +
> 13 files changed, 4137 insertions(+)
> create mode 100644 meta-arago-extras/recipes-multimedia/gst-plugins-ti/gstreamer1.0-plugins-ducati_git.bb
> create mode 100644 meta-arago-extras/recipes-multimedia/gst-plugins-ti/gstreamer1.0-plugins-ti.inc
> create mode 100644 meta-arago-extras/recipes-multimedia/gst-plugins-ti/gstreamer1.0-plugins-vpe_git.bb
> create mode 100644 meta-arago-extras/recipes-multimedia/gstreamer/gstreamer1.0-plugins-bad/0001-Added-GstDRMBufferPool-support.patch
> create mode 100644 meta-arago-extras/recipes-multimedia/gstreamer/gstreamer1.0-plugins-bad/0002-Modified-waylandsink-to-accept-NV12-format.patch
> create mode 100644 meta-arago-extras/recipes-multimedia/gstreamer/gstreamer1.0-plugins-bad/0003-Added-KMSsink-support.patch
> create mode 100644 meta-arago-extras/recipes-multimedia/gstreamer/gstreamer1.0-plugins-bad/0004-waylandsink-Removed-dependency-on-dri2.patch
> create mode 100644 meta-arago-extras/recipes-multimedia/gstreamer/gstreamer1.0-plugins-bad/0005-vc1parse-and-jpegparse-Fixes-plugin-ranks.patch
> create mode 100644 meta-arago-extras/recipes-multimedia/gstreamer/gstreamer1.0-plugins-bad_1.2.3.bbappend
> create mode 100644 meta-arago-extras/recipes-multimedia/gstreamer/gstreamer1.0-plugins-base/0001-Added-GstMetaDmaBuf-features.patch
> create mode 100644 meta-arago-extras/recipes-multimedia/gstreamer/gstreamer1.0-plugins-base_1.2.3.bbappend
> create mode 100644 meta-arago-extras/recipes-multimedia/gstreamer/gstreamer1.0-plugins-good/0001-Adds-GST_V4L2_IO_DMABUF-mode-support-in-capture.patch
> create mode 100644 meta-arago-extras/recipes-multimedia/gstreamer/gstreamer1.0-plugins-good_1.2.3.bbappend
>
> --
> 1.7.9.5
>
> _______________________________________________
> meta-arago mailing list
> meta-arago@arago-project.org
> http://arago-project.org/cgi-bin/mailman/listinfo/meta-arago
^ permalink raw reply [flat|nested] 11+ messages in thread
* Re: [meta-arago 0/4] GStreamer 1.0 adapatations for TI Platforms
2015-03-17 15:45 ` Denys Dmytriyenko
@ 2015-03-17 16:07 ` R, Karthik
2015-03-17 16:22 ` Denys Dmytriyenko
0 siblings, 1 reply; 11+ messages in thread
From: R, Karthik @ 2015-03-17 16:07 UTC (permalink / raw)
To: Dmytriyenko, Denys; +Cc: meta-arago
[-- Attachment #1: Type: text/plain, Size: 4269 bytes --]
Denys,
If I recall correctly, that line is required because the required .so's of the various get plugins do not get populated into the targetfs. There are a lot of them that we need, both default and TI added plugins.
I had earlier made the change in the oe-core recipe and sent it to you for requesting upstream submission but I reworked it to have them in the individual recipes.
This is tested on dra7xx and I can confirm that it's needed. Please include it.
Regards
Karthik
________________________________
From: Dmytriyenko, Denys<mailto:denys@ti.com>
Sent: 3/17/2015 9:15 PM
To: R, Karthik<mailto:karthik.ramanan@ti.com>
Cc: meta-arago@arago-project.org<mailto:meta-arago@arago-project.org>
Subject: Re: [meta-arago] [meta-arago 0/4] GStreamer 1.0 adapatations for TI Platforms
Ok, I'm fine with these patches, except one thing:
FILES_${PN} += "${libdir}/gstreamer-1.0/*.so"
What is the specific reason for this? I'm going to drop it when applying
these patches later today...
On Tue, Mar 03, 2015 at 09:29:21PM +0530, Karthik Ramanan wrote:
> Difference from v1:
> * Add gst-plugins-ducati for GST 1.x
> * Add gst-plugins-vpe for GST 1.x
> * Add FILES_PN explicitly for all GST 1.x recipes
>
> Karthik Ramanan (4):
> gstreamer1.0-plugins-base: Add DMA Buf support
> gstreamer1.0-plugins-good: Add DMABuf support v4l2src
> gstreamer1.0-plugins-bad: Add various features
> gstreamer1.0-plugins-ti: Add ducati and vpe GST plugins
>
> .../gstreamer1.0-plugins-ducati_git.bb | 10 +
> .../gst-plugins-ti/gstreamer1.0-plugins-ti.inc | 19 +
> .../gst-plugins-ti/gstreamer1.0-plugins-vpe_git.bb | 11 +
> .../0001-Added-GstDRMBufferPool-support.patch | 774 +++++++++++
> ...odified-waylandsink-to-accept-NV12-format.patch | 1017 ++++++++++++++
> .../0003-Added-KMSsink-support.patch | 1457 ++++++++++++++++++++
> ...04-waylandsink-Removed-dependency-on-dri2.patch | 26 +
> ...vc1parse-and-jpegparse-Fixes-plugin-ranks.patch | 54 +
> .../gstreamer1.0-plugins-bad_1.2.3.bbappend | 14 +
> .../0001-Added-GstMetaDmaBuf-features.patch | 441 ++++++
> .../gstreamer1.0-plugins-base_1.2.3.bbappend | 8 +
> ...ST_V4L2_IO_DMABUF-mode-support-in-capture.patch | 298 ++++
> .../gstreamer1.0-plugins-good_1.2.3.bbappend | 8 +
> 13 files changed, 4137 insertions(+)
> create mode 100644 meta-arago-extras/recipes-multimedia/gst-plugins-ti/gstreamer1.0-plugins-ducati_git.bb
> create mode 100644 meta-arago-extras/recipes-multimedia/gst-plugins-ti/gstreamer1.0-plugins-ti.inc
> create mode 100644 meta-arago-extras/recipes-multimedia/gst-plugins-ti/gstreamer1.0-plugins-vpe_git.bb
> create mode 100644 meta-arago-extras/recipes-multimedia/gstreamer/gstreamer1.0-plugins-bad/0001-Added-GstDRMBufferPool-support.patch
> create mode 100644 meta-arago-extras/recipes-multimedia/gstreamer/gstreamer1.0-plugins-bad/0002-Modified-waylandsink-to-accept-NV12-format.patch
> create mode 100644 meta-arago-extras/recipes-multimedia/gstreamer/gstreamer1.0-plugins-bad/0003-Added-KMSsink-support.patch
> create mode 100644 meta-arago-extras/recipes-multimedia/gstreamer/gstreamer1.0-plugins-bad/0004-waylandsink-Removed-dependency-on-dri2.patch
> create mode 100644 meta-arago-extras/recipes-multimedia/gstreamer/gstreamer1.0-plugins-bad/0005-vc1parse-and-jpegparse-Fixes-plugin-ranks.patch
> create mode 100644 meta-arago-extras/recipes-multimedia/gstreamer/gstreamer1.0-plugins-bad_1.2.3.bbappend
> create mode 100644 meta-arago-extras/recipes-multimedia/gstreamer/gstreamer1.0-plugins-base/0001-Added-GstMetaDmaBuf-features.patch
> create mode 100644 meta-arago-extras/recipes-multimedia/gstreamer/gstreamer1.0-plugins-base_1.2.3.bbappend
> create mode 100644 meta-arago-extras/recipes-multimedia/gstreamer/gstreamer1.0-plugins-good/0001-Adds-GST_V4L2_IO_DMABUF-mode-support-in-capture.patch
> create mode 100644 meta-arago-extras/recipes-multimedia/gstreamer/gstreamer1.0-plugins-good_1.2.3.bbappend
>
> --
> 1.7.9.5
>
> _______________________________________________
> meta-arago mailing list
> meta-arago@arago-project.org
> http://arago-project.org/cgi-bin/mailman/listinfo/meta-arago
[-- Attachment #2: Type: text/html, Size: 6981 bytes --]
^ permalink raw reply [flat|nested] 11+ messages in thread
* Re: [meta-arago 0/4] GStreamer 1.0 adapatations for TI Platforms
2015-03-17 16:07 ` R, Karthik
@ 2015-03-17 16:22 ` Denys Dmytriyenko
2015-03-17 16:28 ` R, Karthik
0 siblings, 1 reply; 11+ messages in thread
From: Denys Dmytriyenko @ 2015-03-17 16:22 UTC (permalink / raw)
To: R, Karthik; +Cc: meta-arago
Karthik,
As I explained the last time around - all the plugins get split out into
individual subpackages and you can decide which ones you want to pull into the
rootfs. Alternatively, there is an empty -meta package, that automatically
RDEPENDS on all the individual plugin subpackages, so if you want to pull in
all the plugins, all you have to do is pull the -meta package. And that's what
we already do:
$ cat tisdk-rootfs-image-am335x-*.rootfs.manifest|sort|grep gst-plugins|cut -f1 -d' '
gst-plugins-bad-adpcmdec
gst-plugins-bad-adpcmenc
gst-plugins-bad-aiff
gst-plugins-bad-asfmux
gst-plugins-bad-audiovisualizers
gst-plugins-bad-autoconvert
gst-plugins-bad-bayer
gst-plugins-bad-bz2
gst-plugins-bad-camerabin2
gst-plugins-bad-camerabin
gst-plugins-bad-cdxaparse
gst-plugins-bad-coloreffects
gst-plugins-bad-colorspace
gst-plugins-bad
gst-plugins-bad-curl
gst-plugins-bad-dataurisrc
gst-plugins-bad-dccp
gst-plugins-bad-debugutilsbad
gst-plugins-bad-decklink
gst-plugins-bad-dtmf
gst-plugins-bad-dvb
gst-plugins-bad-dvbsuboverlay
gst-plugins-bad-dvdspu
gst-plugins-bad-faad
gst-plugins-bad-faceoverlay
gst-plugins-bad-fbdevsink
gst-plugins-bad-festival
gst-plugins-bad-fieldanalysis
gst-plugins-bad-fragmented
gst-plugins-bad-freeverb
gst-plugins-bad-freeze
gst-plugins-bad-frei0r
gst-plugins-bad-gaudieffects
gst-plugins-bad-geometrictransform
gst-plugins-bad-gsettingselements
gst-plugins-bad-h264parse
gst-plugins-bad-hdvparse
gst-plugins-bad-id3tag
gst-plugins-bad-inter
gst-plugins-bad-interlace
gst-plugins-bad-ivfparse
gst-plugins-bad-jp2kdecimator
gst-plugins-bad-jpegformat
gst-plugins-bad-legacyresample
gst-plugins-bad-linsys
gst-plugins-bad-liveadder
gst-plugins-bad-meta
gst-plugins-bad-mpegdemux
gst-plugins-bad-mpegpsmux
gst-plugins-bad-mpegtsdemux
gst-plugins-bad-mpegtsmux
gst-plugins-bad-mpegvideoparse
gst-plugins-bad-mve
gst-plugins-bad-mxf
gst-plugins-bad-nsf
gst-plugins-bad-nuvdemux
gst-plugins-bad-patchdetect
gst-plugins-bad-pcapparse
gst-plugins-bad-pnm
gst-plugins-bad-rawparse
gst-plugins-bad-removesilence
gst-plugins-bad-rfbsrc
gst-plugins-bad-rtpmux
gst-plugins-bad-rtpvp8
gst-plugins-bad-scaletempoplugin
gst-plugins-bad-sdi
gst-plugins-bad-sdpelem
gst-plugins-bad-segmentclip
gst-plugins-bad-shm
gst-plugins-bad-siren
gst-plugins-bad-smooth
gst-plugins-bad-speed
gst-plugins-bad-stereo
gst-plugins-bad-subenc
gst-plugins-bad-tta
gst-plugins-bad-vcdsrc
gst-plugins-bad-videofiltersbad
gst-plugins-bad-videomaxrate
gst-plugins-bad-videomeasure
gst-plugins-bad-videoparsersbad
gst-plugins-bad-videosignal
gst-plugins-bad-vmnc
gst-plugins-bad-y4mdec
gst-plugins-base-adder
gst-plugins-base-alsa
gst-plugins-base-app
gst-plugins-base-apps
gst-plugins-base-audioconvert
gst-plugins-base-audiorate
gst-plugins-base-audioresample
gst-plugins-base-audiotestsrc
gst-plugins-base
gst-plugins-base-decodebin2
gst-plugins-base-decodebin
gst-plugins-base-encodebin
gst-plugins-base-ffmpegcolorspace
gst-plugins-base-gdp
gst-plugins-base-gio
gst-plugins-base-ivorbisdec
gst-plugins-base-meta
gst-plugins-base-ogg
gst-plugins-base-playbin
gst-plugins-base-subparse
gst-plugins-base-tcp
gst-plugins-base-theora
gst-plugins-base-typefindfunctions
gst-plugins-base-videorate
gst-plugins-base-videoscale
gst-plugins-base-videotestsrc
gst-plugins-base-volume
gst-plugins-base-vorbis
gst-plugins-good-alaw
gst-plugins-good-alphacolor
gst-plugins-good-alpha
gst-plugins-good-annodex
gst-plugins-good-apetag
gst-plugins-good-audiofx
gst-plugins-good-audioparsers
gst-plugins-good-auparse
gst-plugins-good-autodetect
gst-plugins-good-avi
gst-plugins-good-cairo
gst-plugins-good
gst-plugins-good-cutter
gst-plugins-good-debug
gst-plugins-good-deinterlace
gst-plugins-good-efence
gst-plugins-good-effectv
gst-plugins-good-equalizer
gst-plugins-good-flac
gst-plugins-good-flv
gst-plugins-good-flxdec
gst-plugins-good-goom2k1
gst-plugins-good-goom
gst-plugins-good-icydemux
gst-plugins-good-id3demux
gst-plugins-good-imagefreeze
gst-plugins-good-interleave
gst-plugins-good-isomp4
gst-plugins-good-jpeg
gst-plugins-good-level
gst-plugins-good-matroska
gst-plugins-good-meta
gst-plugins-good-mulaw
gst-plugins-good-multifile
gst-plugins-good-multipart
gst-plugins-good-navigationtest
gst-plugins-good-oss4audio
gst-plugins-good-ossaudio
gst-plugins-good-png
gst-plugins-good-pulse
gst-plugins-good-replaygain
gst-plugins-good-rtp
gst-plugins-good-rtpmanager
gst-plugins-good-rtsp
gst-plugins-good-shapewipe
gst-plugins-good-smpte
gst-plugins-good-souphttpsrc
gst-plugins-good-spectrum
gst-plugins-good-speex
gst-plugins-good-udp
gst-plugins-good-video4linux2
gst-plugins-good-videobox
gst-plugins-good-videocrop
gst-plugins-good-videofilter
gst-plugins-good-videomixer
gst-plugins-good-wavenc
gst-plugins-good-wavparse
gst-plugins-good-y4menc
On Tue, Mar 17, 2015 at 12:07:20PM -0400, R, Karthik wrote:
> Denys,
>
> If I recall correctly, that line is required because the required .so's of
> the various get plugins do not get populated into the targetfs. There are
> a lot of them that we need, both default and TI added plugins.
>
> I had earlier made the change in the oe-core recipe and sent it to you for
> requesting upstream submission but I reworked it to have them in the
> individual recipes.
>
> This is tested on dra7xx and I can confirm that it's needed. Please
> include it.
>
> Regards
> Karthik
>
> ----------------------------------------------------------------------
>
> From: Dmytriyenko, Denys
> Sent: (->)3/(->)17/(->)2015 9:15 PM
> To: R, Karthik
> Cc: meta-arago@arago-project.org
> Subject: Re: [meta-arago] [meta-arago 0/4] GStreamer 1.0 adapatations for
> TI Platforms
>
> Ok, I'm fine with these patches, except one thing:
>
> FILES_${PN} += "${libdir}/gstreamer-1.0/*.so"
>
> What is the specific reason for this? I'm going to drop it when applying
> these patches later today...
>
> On Tue, Mar 03, 2015 at 09:29:21PM +0530, Karthik Ramanan wrote:
> > Difference from v1:
> > * Add gst-plugins-ducati for GST 1.x
> > * Add gst-plugins-vpe for GST 1.x
> > * Add FILES_PN explicitly for all GST 1.x recipes
> >
> > Karthik Ramanan (4):
> > gstreamer1.0-plugins-base: Add DMA Buf support
> > gstreamer1.0-plugins-good: Add DMABuf support v4l2src
> > gstreamer1.0-plugins-bad: Add various features
> > gstreamer1.0-plugins-ti: Add ducati and vpe GST plugins
> >
> > .../gstreamer1.0-plugins-ducati_git.bb | 10 +
> > .../gst-plugins-ti/gstreamer1.0-plugins-ti.inc | 19 +
> > .../gst-plugins-ti/gstreamer1.0-plugins-vpe_git.bb | 11 +
> > .../0001-Added-GstDRMBufferPool-support.patch | 774 +++++++++++
> > ...odified-waylandsink-to-accept-NV12-format.patch | 1017
> ++++++++++++++
> > .../0003-Added-KMSsink-support.patch | 1457
> ++++++++++++++++++++
> > ...04-waylandsink-Removed-dependency-on-dri2.patch | 26 +
> > ...vc1parse-and-jpegparse-Fixes-plugin-ranks.patch | 54 +
> > .../gstreamer1.0-plugins-bad_1.2.3.bbappend | 14 +
> > .../0001-Added-GstMetaDmaBuf-features.patch | 441 ++++++
> > .../gstreamer1.0-plugins-base_1.2.3.bbappend | 8 +
> > ...ST_V4L2_IO_DMABUF-mode-support-in-capture.patch | 298 ++++
> > .../gstreamer1.0-plugins-good_1.2.3.bbappend | 8 +
> > 13 files changed, 4137 insertions(+)
> > create mode 100644
> meta-arago-extras/recipes-multimedia/gst-plugins-ti/gstreamer1.0-plugins-ducati_git.bb
> > create mode 100644
> meta-arago-extras/recipes-multimedia/gst-plugins-ti/gstreamer1.0-plugins-ti.inc
> > create mode 100644
> meta-arago-extras/recipes-multimedia/gst-plugins-ti/gstreamer1.0-plugins-vpe_git.bb
> > create mode 100644
> meta-arago-extras/recipes-multimedia/gstreamer/gstreamer1.0-plugins-bad/0001-Added-GstDRMBufferPool-support.patch
> > create mode 100644
> meta-arago-extras/recipes-multimedia/gstreamer/gstreamer1.0-plugins-bad/0002-Modified-waylandsink-to-accept-NV12-format.patch
> > create mode 100644
> meta-arago-extras/recipes-multimedia/gstreamer/gstreamer1.0-plugins-bad/0003-Added-KMSsink-support.patch
> > create mode 100644
> meta-arago-extras/recipes-multimedia/gstreamer/gstreamer1.0-plugins-bad/0004-waylandsink-Removed-dependency-on-dri2.patch
> > create mode 100644
> meta-arago-extras/recipes-multimedia/gstreamer/gstreamer1.0-plugins-bad/0005-vc1parse-and-jpegparse-Fixes-plugin-ranks.patch
> > create mode 100644
> meta-arago-extras/recipes-multimedia/gstreamer/gstreamer1.0-plugins-bad_1.2.3.bbappend
> > create mode 100644
> meta-arago-extras/recipes-multimedia/gstreamer/gstreamer1.0-plugins-base/0001-Added-GstMetaDmaBuf-features.patch
> > create mode 100644
> meta-arago-extras/recipes-multimedia/gstreamer/gstreamer1.0-plugins-base_1.2.3.bbappend
> > create mode 100644
> meta-arago-extras/recipes-multimedia/gstreamer/gstreamer1.0-plugins-good/0001-Adds-GST_V4L2_IO_DMABUF-mode-support-in-capture.patch
> > create mode 100644
> meta-arago-extras/recipes-multimedia/gstreamer/gstreamer1.0-plugins-good_1.2.3.bbappend
> >
> > --
> > 1.7.9.5
> >
> > _______________________________________________
> > meta-arago mailing list
> > meta-arago@arago-project.org
> > http://arago-project.org/cgi-bin/mailman/listinfo/meta-arago
^ permalink raw reply [flat|nested] 11+ messages in thread
* Re: [meta-arago 0/4] GStreamer 1.0 adapatations for TI Platforms
2015-03-17 16:22 ` Denys Dmytriyenko
@ 2015-03-17 16:28 ` R, Karthik
2015-03-18 12:16 ` R, Karthik
0 siblings, 1 reply; 11+ messages in thread
From: R, Karthik @ 2015-03-17 16:28 UTC (permalink / raw)
To: Dmytriyenko, Denys; +Cc: meta-arago
[-- Attachment #1: Type: text/plain, Size: 10190 bytes --]
Ok Denys, thanks for this additional pointer. I will take a look at this and let you know if I need some additional inputs.
You can drop the line and merge the patch.
Regards
Karthik
________________________________
From: Dmytriyenko, Denys<mailto:denys@ti.com>
Sent: 3/17/2015 9:52 PM
To: R, Karthik<mailto:karthik.ramanan@ti.com>
Cc: meta-arago@arago-project.org<mailto:meta-arago@arago-project.org>
Subject: Re: [meta-arago] [meta-arago 0/4] GStreamer 1.0 adapatations for TI Platforms
Karthik,
As I explained the last time around - all the plugins get split out into
individual subpackages and you can decide which ones you want to pull into the
rootfs. Alternatively, there is an empty -meta package, that automatically
RDEPENDS on all the individual plugin subpackages, so if you want to pull in
all the plugins, all you have to do is pull the -meta package. And that's what
we already do:
$ cat tisdk-rootfs-image-am335x-*.rootfs.manifest|sort|grep gst-plugins|cut -f1 -d' '
gst-plugins-bad-adpcmdec
gst-plugins-bad-adpcmenc
gst-plugins-bad-aiff
gst-plugins-bad-asfmux
gst-plugins-bad-audiovisualizers
gst-plugins-bad-autoconvert
gst-plugins-bad-bayer
gst-plugins-bad-bz2
gst-plugins-bad-camerabin2
gst-plugins-bad-camerabin
gst-plugins-bad-cdxaparse
gst-plugins-bad-coloreffects
gst-plugins-bad-colorspace
gst-plugins-bad
gst-plugins-bad-curl
gst-plugins-bad-dataurisrc
gst-plugins-bad-dccp
gst-plugins-bad-debugutilsbad
gst-plugins-bad-decklink
gst-plugins-bad-dtmf
gst-plugins-bad-dvb
gst-plugins-bad-dvbsuboverlay
gst-plugins-bad-dvdspu
gst-plugins-bad-faad
gst-plugins-bad-faceoverlay
gst-plugins-bad-fbdevsink
gst-plugins-bad-festival
gst-plugins-bad-fieldanalysis
gst-plugins-bad-fragmented
gst-plugins-bad-freeverb
gst-plugins-bad-freeze
gst-plugins-bad-frei0r
gst-plugins-bad-gaudieffects
gst-plugins-bad-geometrictransform
gst-plugins-bad-gsettingselements
gst-plugins-bad-h264parse
gst-plugins-bad-hdvparse
gst-plugins-bad-id3tag
gst-plugins-bad-inter
gst-plugins-bad-interlace
gst-plugins-bad-ivfparse
gst-plugins-bad-jp2kdecimator
gst-plugins-bad-jpegformat
gst-plugins-bad-legacyresample
gst-plugins-bad-linsys
gst-plugins-bad-liveadder
gst-plugins-bad-meta
gst-plugins-bad-mpegdemux
gst-plugins-bad-mpegpsmux
gst-plugins-bad-mpegtsdemux
gst-plugins-bad-mpegtsmux
gst-plugins-bad-mpegvideoparse
gst-plugins-bad-mve
gst-plugins-bad-mxf
gst-plugins-bad-nsf
gst-plugins-bad-nuvdemux
gst-plugins-bad-patchdetect
gst-plugins-bad-pcapparse
gst-plugins-bad-pnm
gst-plugins-bad-rawparse
gst-plugins-bad-removesilence
gst-plugins-bad-rfbsrc
gst-plugins-bad-rtpmux
gst-plugins-bad-rtpvp8
gst-plugins-bad-scaletempoplugin
gst-plugins-bad-sdi
gst-plugins-bad-sdpelem
gst-plugins-bad-segmentclip
gst-plugins-bad-shm
gst-plugins-bad-siren
gst-plugins-bad-smooth
gst-plugins-bad-speed
gst-plugins-bad-stereo
gst-plugins-bad-subenc
gst-plugins-bad-tta
gst-plugins-bad-vcdsrc
gst-plugins-bad-videofiltersbad
gst-plugins-bad-videomaxrate
gst-plugins-bad-videomeasure
gst-plugins-bad-videoparsersbad
gst-plugins-bad-videosignal
gst-plugins-bad-vmnc
gst-plugins-bad-y4mdec
gst-plugins-base-adder
gst-plugins-base-alsa
gst-plugins-base-app
gst-plugins-base-apps
gst-plugins-base-audioconvert
gst-plugins-base-audiorate
gst-plugins-base-audioresample
gst-plugins-base-audiotestsrc
gst-plugins-base
gst-plugins-base-decodebin2
gst-plugins-base-decodebin
gst-plugins-base-encodebin
gst-plugins-base-ffmpegcolorspace
gst-plugins-base-gdp
gst-plugins-base-gio
gst-plugins-base-ivorbisdec
gst-plugins-base-meta
gst-plugins-base-ogg
gst-plugins-base-playbin
gst-plugins-base-subparse
gst-plugins-base-tcp
gst-plugins-base-theora
gst-plugins-base-typefindfunctions
gst-plugins-base-videorate
gst-plugins-base-videoscale
gst-plugins-base-videotestsrc
gst-plugins-base-volume
gst-plugins-base-vorbis
gst-plugins-good-alaw
gst-plugins-good-alphacolor
gst-plugins-good-alpha
gst-plugins-good-annodex
gst-plugins-good-apetag
gst-plugins-good-audiofx
gst-plugins-good-audioparsers
gst-plugins-good-auparse
gst-plugins-good-autodetect
gst-plugins-good-avi
gst-plugins-good-cairo
gst-plugins-good
gst-plugins-good-cutter
gst-plugins-good-debug
gst-plugins-good-deinterlace
gst-plugins-good-efence
gst-plugins-good-effectv
gst-plugins-good-equalizer
gst-plugins-good-flac
gst-plugins-good-flv
gst-plugins-good-flxdec
gst-plugins-good-goom2k1
gst-plugins-good-goom
gst-plugins-good-icydemux
gst-plugins-good-id3demux
gst-plugins-good-imagefreeze
gst-plugins-good-interleave
gst-plugins-good-isomp4
gst-plugins-good-jpeg
gst-plugins-good-level
gst-plugins-good-matroska
gst-plugins-good-meta
gst-plugins-good-mulaw
gst-plugins-good-multifile
gst-plugins-good-multipart
gst-plugins-good-navigationtest
gst-plugins-good-oss4audio
gst-plugins-good-ossaudio
gst-plugins-good-png
gst-plugins-good-pulse
gst-plugins-good-replaygain
gst-plugins-good-rtp
gst-plugins-good-rtpmanager
gst-plugins-good-rtsp
gst-plugins-good-shapewipe
gst-plugins-good-smpte
gst-plugins-good-souphttpsrc
gst-plugins-good-spectrum
gst-plugins-good-speex
gst-plugins-good-udp
gst-plugins-good-video4linux2
gst-plugins-good-videobox
gst-plugins-good-videocrop
gst-plugins-good-videofilter
gst-plugins-good-videomixer
gst-plugins-good-wavenc
gst-plugins-good-wavparse
gst-plugins-good-y4menc
On Tue, Mar 17, 2015 at 12:07:20PM -0400, R, Karthik wrote:
> Denys,
>
> If I recall correctly, that line is required because the required .so's of
> the various get plugins do not get populated into the targetfs. There are
> a lot of them that we need, both default and TI added plugins.
>
> I had earlier made the change in the oe-core recipe and sent it to you for
> requesting upstream submission but I reworked it to have them in the
> individual recipes.
>
> This is tested on dra7xx and I can confirm that it's needed. Please
> include it.
>
> Regards
> Karthik
>
> ----------------------------------------------------------------------
>
> From: Dmytriyenko, Denys
> Sent: (->)3/(->)17/(->)2015 9:15 PM
> To: R, Karthik
> Cc: meta-arago@arago-project.org
> Subject: Re: [meta-arago] [meta-arago 0/4] GStreamer 1.0 adapatations for
> TI Platforms
>
> Ok, I'm fine with these patches, except one thing:
>
> FILES_${PN} += "${libdir}/gstreamer-1.0/*.so"
>
> What is the specific reason for this? I'm going to drop it when applying
> these patches later today...
>
> On Tue, Mar 03, 2015 at 09:29:21PM +0530, Karthik Ramanan wrote:
> > Difference from v1:
> > * Add gst-plugins-ducati for GST 1.x
> > * Add gst-plugins-vpe for GST 1.x
> > * Add FILES_PN explicitly for all GST 1.x recipes
> >
> > Karthik Ramanan (4):
> > gstreamer1.0-plugins-base: Add DMA Buf support
> > gstreamer1.0-plugins-good: Add DMABuf support v4l2src
> > gstreamer1.0-plugins-bad: Add various features
> > gstreamer1.0-plugins-ti: Add ducati and vpe GST plugins
> >
> > .../gstreamer1.0-plugins-ducati_git.bb | 10 +
> > .../gst-plugins-ti/gstreamer1.0-plugins-ti.inc | 19 +
> > .../gst-plugins-ti/gstreamer1.0-plugins-vpe_git.bb | 11 +
> > .../0001-Added-GstDRMBufferPool-support.patch | 774 +++++++++++
> > ...odified-waylandsink-to-accept-NV12-format.patch | 1017
> ++++++++++++++
> > .../0003-Added-KMSsink-support.patch | 1457
> ++++++++++++++++++++
> > ...04-waylandsink-Removed-dependency-on-dri2.patch | 26 +
> > ...vc1parse-and-jpegparse-Fixes-plugin-ranks.patch | 54 +
> > .../gstreamer1.0-plugins-bad_1.2.3.bbappend | 14 +
> > .../0001-Added-GstMetaDmaBuf-features.patch | 441 ++++++
> > .../gstreamer1.0-plugins-base_1.2.3.bbappend | 8 +
> > ...ST_V4L2_IO_DMABUF-mode-support-in-capture.patch | 298 ++++
> > .../gstreamer1.0-plugins-good_1.2.3.bbappend | 8 +
> > 13 files changed, 4137 insertions(+)
> > create mode 100644
> meta-arago-extras/recipes-multimedia/gst-plugins-ti/gstreamer1.0-plugins-ducati_git.bb
> > create mode 100644
> meta-arago-extras/recipes-multimedia/gst-plugins-ti/gstreamer1.0-plugins-ti.inc
> > create mode 100644
> meta-arago-extras/recipes-multimedia/gst-plugins-ti/gstreamer1.0-plugins-vpe_git.bb
> > create mode 100644
> meta-arago-extras/recipes-multimedia/gstreamer/gstreamer1.0-plugins-bad/0001-Added-GstDRMBufferPool-support.patch
> > create mode 100644
> meta-arago-extras/recipes-multimedia/gstreamer/gstreamer1.0-plugins-bad/0002-Modified-waylandsink-to-accept-NV12-format.patch
> > create mode 100644
> meta-arago-extras/recipes-multimedia/gstreamer/gstreamer1.0-plugins-bad/0003-Added-KMSsink-support.patch
> > create mode 100644
> meta-arago-extras/recipes-multimedia/gstreamer/gstreamer1.0-plugins-bad/0004-waylandsink-Removed-dependency-on-dri2.patch
> > create mode 100644
> meta-arago-extras/recipes-multimedia/gstreamer/gstreamer1.0-plugins-bad/0005-vc1parse-and-jpegparse-Fixes-plugin-ranks.patch
> > create mode 100644
> meta-arago-extras/recipes-multimedia/gstreamer/gstreamer1.0-plugins-bad_1.2.3.bbappend
> > create mode 100644
> meta-arago-extras/recipes-multimedia/gstreamer/gstreamer1.0-plugins-base/0001-Added-GstMetaDmaBuf-features.patch
> > create mode 100644
> meta-arago-extras/recipes-multimedia/gstreamer/gstreamer1.0-plugins-base_1.2.3.bbappend
> > create mode 100644
> meta-arago-extras/recipes-multimedia/gstreamer/gstreamer1.0-plugins-good/0001-Adds-GST_V4L2_IO_DMABUF-mode-support-in-capture.patch
> > create mode 100644
> meta-arago-extras/recipes-multimedia/gstreamer/gstreamer1.0-plugins-good_1.2.3.bbappend
> >
> > --
> > 1.7.9.5
> >
> > _______________________________________________
> > meta-arago mailing list
> > meta-arago@arago-project.org
> > http://arago-project.org/cgi-bin/mailman/listinfo/meta-arago
[-- Attachment #2: Type: text/html, Size: 15344 bytes --]
^ permalink raw reply [flat|nested] 11+ messages in thread
* Re: [meta-arago 0/4] GStreamer 1.0 adapatations for TI Platforms
2015-03-17 16:28 ` R, Karthik
@ 2015-03-18 12:16 ` R, Karthik
0 siblings, 0 replies; 11+ messages in thread
From: R, Karthik @ 2015-03-18 12:16 UTC (permalink / raw)
To: Dmytriyenko, Denys; +Cc: meta-arago
[-- Attachment #1: Type: text/plain, Size: 10705 bytes --]
Hi Denys,
I was able to verify that the files get populated if you include the –meta package.
Thanks for the inputs.
Regards
Karthik
From: meta-arago-bounces@arago-project.org [mailto:meta-arago-bounces@arago-project.org] On Behalf Of R, Karthik
Sent: Tuesday, March 17, 2015 9:58 PM
To: Dmytriyenko, Denys
Cc: meta-arago@arago-project.org
Subject: Re: [meta-arago] [meta-arago 0/4] GStreamer 1.0 adapatations for TI Platforms
Ok Denys, thanks for this additional pointer. I will take a look at this and let you know if I need some additional inputs.
You can drop the line and merge the patch.
Regards
Karthik
________________________________
From: Dmytriyenko, Denys<mailto:denys@ti.com>
Sent: 3/17/2015 9:52 PM
To: R, Karthik<mailto:karthik.ramanan@ti.com>
Cc: meta-arago@arago-project.org<mailto:meta-arago@arago-project.org>
Subject: Re: [meta-arago] [meta-arago 0/4] GStreamer 1.0 adapatations for TI Platforms
Karthik,
As I explained the last time around - all the plugins get split out into
individual subpackages and you can decide which ones you want to pull into the
rootfs. Alternatively, there is an empty -meta package, that automatically
RDEPENDS on all the individual plugin subpackages, so if you want to pull in
all the plugins, all you have to do is pull the -meta package. And that's what
we already do:
$ cat tisdk-rootfs-image-am335x-*.rootfs.manifest|sort|grep gst-plugins|cut -f1 -d' '
gst-plugins-bad-adpcmdec
gst-plugins-bad-adpcmenc
gst-plugins-bad-aiff
gst-plugins-bad-asfmux
gst-plugins-bad-audiovisualizers
gst-plugins-bad-autoconvert
gst-plugins-bad-bayer
gst-plugins-bad-bz2
gst-plugins-bad-camerabin2
gst-plugins-bad-camerabin
gst-plugins-bad-cdxaparse
gst-plugins-bad-coloreffects
gst-plugins-bad-colorspace
gst-plugins-bad
gst-plugins-bad-curl
gst-plugins-bad-dataurisrc
gst-plugins-bad-dccp
gst-plugins-bad-debugutilsbad
gst-plugins-bad-decklink
gst-plugins-bad-dtmf
gst-plugins-bad-dvb
gst-plugins-bad-dvbsuboverlay
gst-plugins-bad-dvdspu
gst-plugins-bad-faad
gst-plugins-bad-faceoverlay
gst-plugins-bad-fbdevsink
gst-plugins-bad-festival
gst-plugins-bad-fieldanalysis
gst-plugins-bad-fragmented
gst-plugins-bad-freeverb
gst-plugins-bad-freeze
gst-plugins-bad-frei0r
gst-plugins-bad-gaudieffects
gst-plugins-bad-geometrictransform
gst-plugins-bad-gsettingselements
gst-plugins-bad-h264parse
gst-plugins-bad-hdvparse
gst-plugins-bad-id3tag
gst-plugins-bad-inter
gst-plugins-bad-interlace
gst-plugins-bad-ivfparse
gst-plugins-bad-jp2kdecimator
gst-plugins-bad-jpegformat
gst-plugins-bad-legacyresample
gst-plugins-bad-linsys
gst-plugins-bad-liveadder
gst-plugins-bad-meta
gst-plugins-bad-mpegdemux
gst-plugins-bad-mpegpsmux
gst-plugins-bad-mpegtsdemux
gst-plugins-bad-mpegtsmux
gst-plugins-bad-mpegvideoparse
gst-plugins-bad-mve
gst-plugins-bad-mxf
gst-plugins-bad-nsf
gst-plugins-bad-nuvdemux
gst-plugins-bad-patchdetect
gst-plugins-bad-pcapparse
gst-plugins-bad-pnm
gst-plugins-bad-rawparse
gst-plugins-bad-removesilence
gst-plugins-bad-rfbsrc
gst-plugins-bad-rtpmux
gst-plugins-bad-rtpvp8
gst-plugins-bad-scaletempoplugin
gst-plugins-bad-sdi
gst-plugins-bad-sdpelem
gst-plugins-bad-segmentclip
gst-plugins-bad-shm
gst-plugins-bad-siren
gst-plugins-bad-smooth
gst-plugins-bad-speed
gst-plugins-bad-stereo
gst-plugins-bad-subenc
gst-plugins-bad-tta
gst-plugins-bad-vcdsrc
gst-plugins-bad-videofiltersbad
gst-plugins-bad-videomaxrate
gst-plugins-bad-videomeasure
gst-plugins-bad-videoparsersbad
gst-plugins-bad-videosignal
gst-plugins-bad-vmnc
gst-plugins-bad-y4mdec
gst-plugins-base-adder
gst-plugins-base-alsa
gst-plugins-base-app
gst-plugins-base-apps
gst-plugins-base-audioconvert
gst-plugins-base-audiorate
gst-plugins-base-audioresample
gst-plugins-base-audiotestsrc
gst-plugins-base
gst-plugins-base-decodebin2
gst-plugins-base-decodebin
gst-plugins-base-encodebin
gst-plugins-base-ffmpegcolorspace
gst-plugins-base-gdp
gst-plugins-base-gio
gst-plugins-base-ivorbisdec
gst-plugins-base-meta
gst-plugins-base-ogg
gst-plugins-base-playbin
gst-plugins-base-subparse
gst-plugins-base-tcp
gst-plugins-base-theora
gst-plugins-base-typefindfunctions
gst-plugins-base-videorate
gst-plugins-base-videoscale
gst-plugins-base-videotestsrc
gst-plugins-base-volume
gst-plugins-base-vorbis
gst-plugins-good-alaw
gst-plugins-good-alphacolor
gst-plugins-good-alpha
gst-plugins-good-annodex
gst-plugins-good-apetag
gst-plugins-good-audiofx
gst-plugins-good-audioparsers
gst-plugins-good-auparse
gst-plugins-good-autodetect
gst-plugins-good-avi
gst-plugins-good-cairo
gst-plugins-good
gst-plugins-good-cutter
gst-plugins-good-debug
gst-plugins-good-deinterlace
gst-plugins-good-efence
gst-plugins-good-effectv
gst-plugins-good-equalizer
gst-plugins-good-flac
gst-plugins-good-flv
gst-plugins-good-flxdec
gst-plugins-good-goom2k1
gst-plugins-good-goom
gst-plugins-good-icydemux
gst-plugins-good-id3demux
gst-plugins-good-imagefreeze
gst-plugins-good-interleave
gst-plugins-good-isomp4
gst-plugins-good-jpeg
gst-plugins-good-level
gst-plugins-good-matroska
gst-plugins-good-meta
gst-plugins-good-mulaw
gst-plugins-good-multifile
gst-plugins-good-multipart
gst-plugins-good-navigationtest
gst-plugins-good-oss4audio
gst-plugins-good-ossaudio
gst-plugins-good-png
gst-plugins-good-pulse
gst-plugins-good-replaygain
gst-plugins-good-rtp
gst-plugins-good-rtpmanager
gst-plugins-good-rtsp
gst-plugins-good-shapewipe
gst-plugins-good-smpte
gst-plugins-good-souphttpsrc
gst-plugins-good-spectrum
gst-plugins-good-speex
gst-plugins-good-udp
gst-plugins-good-video4linux2
gst-plugins-good-videobox
gst-plugins-good-videocrop
gst-plugins-good-videofilter
gst-plugins-good-videomixer
gst-plugins-good-wavenc
gst-plugins-good-wavparse
gst-plugins-good-y4menc
On Tue, Mar 17, 2015 at 12:07:20PM -0400, R, Karthik wrote:
> Denys,
>
> If I recall correctly, that line is required because the required .so's of
> the various get plugins do not get populated into the targetfs. There are
> a lot of them that we need, both default and TI added plugins.
>
> I had earlier made the change in the oe-core recipe and sent it to you for
> requesting upstream submission but I reworked it to have them in the
> individual recipes.
>
> This is tested on dra7xx and I can confirm that it's needed. Please
> include it.
>
> Regards
> Karthik
>
> ----------------------------------------------------------------------
>
> From: Dmytriyenko, Denys
> Sent: (->)3/(->)17/(->)2015 9:15 PM
> To: R, Karthik
> Cc: meta-arago@arago-project.org<mailto:meta-arago@arago-project.org>
> Subject: Re: [meta-arago] [meta-arago 0/4] GStreamer 1.0 adapatations for
> TI Platforms
>
> Ok, I'm fine with these patches, except one thing:
>
> FILES_${PN} += "${libdir}/gstreamer-1.0/*.so"
>
> What is the specific reason for this? I'm going to drop it when applying
> these patches later today...
>
> On Tue, Mar 03, 2015 at 09:29:21PM +0530, Karthik Ramanan wrote:
> > Difference from v1:
> > * Add gst-plugins-ducati for GST 1.x
> > * Add gst-plugins-vpe for GST 1.x
> > * Add FILES_PN explicitly for all GST 1.x recipes
> >
> > Karthik Ramanan (4):
> > gstreamer1.0-plugins-base: Add DMA Buf support
> > gstreamer1.0-plugins-good: Add DMABuf support v4l2src
> > gstreamer1.0-plugins-bad: Add various features
> > gstreamer1.0-plugins-ti: Add ducati and vpe GST plugins
> >
> > .../gstreamer1.0-plugins-ducati_git.bb | 10 +
> > .../gst-plugins-ti/gstreamer1.0-plugins-ti.inc | 19 +
> > .../gst-plugins-ti/gstreamer1.0-plugins-vpe_git.bb | 11 +
> > .../0001-Added-GstDRMBufferPool-support.patch | 774 +++++++++++
> > ...odified-waylandsink-to-accept-NV12-format.patch | 1017
> ++++++++++++++
> > .../0003-Added-KMSsink-support.patch | 1457
> ++++++++++++++++++++
> > ...04-waylandsink-Removed-dependency-on-dri2.patch | 26 +
> > ...vc1parse-and-jpegparse-Fixes-plugin-ranks.patch | 54 +
> > .../gstreamer1.0-plugins-bad_1.2.3.bbappend | 14 +
> > .../0001-Added-GstMetaDmaBuf-features.patch | 441 ++++++
> > .../gstreamer1.0-plugins-base_1.2.3.bbappend | 8 +
> > ...ST_V4L2_IO_DMABUF-mode-support-in-capture.patch | 298 ++++
> > .../gstreamer1.0-plugins-good_1.2.3.bbappend | 8 +
> > 13 files changed, 4137 insertions(+)
> > create mode 100644
> meta-arago-extras/recipes-multimedia/gst-plugins-ti/gstreamer1.0-plugins-ducati_git.bb
> > create mode 100644
> meta-arago-extras/recipes-multimedia/gst-plugins-ti/gstreamer1.0-plugins-ti.inc
> > create mode 100644
> meta-arago-extras/recipes-multimedia/gst-plugins-ti/gstreamer1.0-plugins-vpe_git.bb
> > create mode 100644
> meta-arago-extras/recipes-multimedia/gstreamer/gstreamer1.0-plugins-bad/0001-Added-GstDRMBufferPool-support.patch
> > create mode 100644
> meta-arago-extras/recipes-multimedia/gstreamer/gstreamer1.0-plugins-bad/0002-Modified-waylandsink-to-accept-NV12-format.patch
> > create mode 100644
> meta-arago-extras/recipes-multimedia/gstreamer/gstreamer1.0-plugins-bad/0003-Added-KMSsink-support.patch
> > create mode 100644
> meta-arago-extras/recipes-multimedia/gstreamer/gstreamer1.0-plugins-bad/0004-waylandsink-Removed-dependency-on-dri2.patch
> > create mode 100644
> meta-arago-extras/recipes-multimedia/gstreamer/gstreamer1.0-plugins-bad/0005-vc1parse-and-jpegparse-Fixes-plugin-ranks.patch
> > create mode 100644
> meta-arago-extras/recipes-multimedia/gstreamer/gstreamer1.0-plugins-bad_1.2.3.bbappend
> > create mode 100644
> meta-arago-extras/recipes-multimedia/gstreamer/gstreamer1.0-plugins-base/0001-Added-GstMetaDmaBuf-features.patch
> > create mode 100644
> meta-arago-extras/recipes-multimedia/gstreamer/gstreamer1.0-plugins-base_1.2.3.bbappend
> > create mode 100644
> meta-arago-extras/recipes-multimedia/gstreamer/gstreamer1.0-plugins-good/0001-Adds-GST_V4L2_IO_DMABUF-mode-support-in-capture.patch
> > create mode 100644
> meta-arago-extras/recipes-multimedia/gstreamer/gstreamer1.0-plugins-good_1.2.3.bbappend
> >
> > --
> > 1.7.9.5
> >
> > _______________________________________________
> > meta-arago mailing list
> > meta-arago@arago-project.org<mailto:meta-arago@arago-project.org>
> > http://arago-project.org/cgi-bin/mailman/listinfo/meta-arago
[-- Attachment #2: Type: text/html, Size: 19828 bytes --]
^ permalink raw reply [flat|nested] 11+ messages in thread
end of thread, other threads:[~2015-03-18 12:16 UTC | newest]
Thread overview: 11+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2015-03-03 15:59 [meta-arago 0/4] GStreamer 1.0 adapatations for TI Platforms Karthik Ramanan
2015-03-03 15:59 ` [meta-arago 1/4] gstreamer1.0-plugins-base: Add DMA Buf support Karthik Ramanan
2015-03-03 15:59 ` [meta-arago 2/4] gstreamer1.0-plugins-good: Add DMABuf support v4l2src Karthik Ramanan
2015-03-03 15:59 ` [meta-arago 3/4] gstreamer1.0-plugins-bad: Add various features Karthik Ramanan
2015-03-03 15:59 ` [meta-arago 4/4] gstreamer1.0-plugins-ti: Add ducati and vpe GST plugins Karthik Ramanan
2015-03-10 16:53 ` [meta-arago 0/4] GStreamer 1.0 adapatations for TI Platforms Denys Dmytriyenko
2015-03-17 15:45 ` Denys Dmytriyenko
2015-03-17 16:07 ` R, Karthik
2015-03-17 16:22 ` Denys Dmytriyenko
2015-03-17 16:28 ` R, Karthik
2015-03-18 12:16 ` R, Karthik
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.