All of lore.kernel.org
 help / color / mirror / Atom feed
* [PATCH 1/3] gst-bad: Add gstreamer 1.8 TI add-ons
@ 2017-01-27 12:02 Pooja Prajod
  2017-01-27 12:02 ` [PATCH 2/3] Revert "branding-core: temporarily disable mmip features due to gst 1.8.3" Pooja Prajod
  2017-01-27 12:02 ` [PATCH 3/3] gstreamer: Remove gst 1.6 recipe Pooja Prajod
  0 siblings, 2 replies; 3+ messages in thread
From: Pooja Prajod @ 2017-01-27 12:02 UTC (permalink / raw)
  To: meta-arago; +Cc: Pooja Prajod

There are some patches that are carried by TI and
not part of the official gst 1.8 release. This patch adds
a bbappend file to overlay such patches.

Signed-off-by: Pooja Prajod <a0132412@ti.com>
---
 ...gstdrmallocator-Add-DRM-allocator-support.patch |  482 ++++++
 ...ck-previos-bug-fixes-on-different-parsers.patch |  146 ++
 ...gstkmssink-Add-support-for-KMS-based-sink.patch | 1592 ++++++++++++++++++
 ...aylandsink-Add-DRM-support-on-waylandsink.patch | 1728 ++++++++++++++++++++
 .../gstreamer1.0-plugins-bad_1.8.3.bbappend        |   40 +
 5 files changed, 3988 insertions(+)
 create mode 100644 meta-arago-extras/recipes-multimedia/gstreamer/gstreamer1.0-plugins-bad/0001-gstdrmallocator-Add-DRM-allocator-support.patch
 create mode 100644 meta-arago-extras/recipes-multimedia/gstreamer/gstreamer1.0-plugins-bad/0002-parsers-Pick-previos-bug-fixes-on-different-parsers.patch
 create mode 100644 meta-arago-extras/recipes-multimedia/gstreamer/gstreamer1.0-plugins-bad/0003-gstkmssink-Add-support-for-KMS-based-sink.patch
 create mode 100644 meta-arago-extras/recipes-multimedia/gstreamer/gstreamer1.0-plugins-bad/0004-gstwaylandsink-Add-DRM-support-on-waylandsink.patch
 create mode 100644 meta-arago-extras/recipes-multimedia/gstreamer/gstreamer1.0-plugins-bad_1.8.3.bbappend

diff --git a/meta-arago-extras/recipes-multimedia/gstreamer/gstreamer1.0-plugins-bad/0001-gstdrmallocator-Add-DRM-allocator-support.patch b/meta-arago-extras/recipes-multimedia/gstreamer/gstreamer1.0-plugins-bad/0001-gstdrmallocator-Add-DRM-allocator-support.patch
new file mode 100644
index 0000000..38eb5a1
--- /dev/null
+++ b/meta-arago-extras/recipes-multimedia/gstreamer/gstreamer1.0-plugins-bad/0001-gstdrmallocator-Add-DRM-allocator-support.patch
@@ -0,0 +1,482 @@
+From c5d115bf88f0d2fb64f58b21b72a3195eae98d0a Mon Sep 17 00:00:00 2001
+From: Pooja Prajod <a0132412@ti.com>
+Date: Fri, 20 Jan 2017 14:41:45 +0530
+Subject: [PATCH 1/5] gstdrmallocator: Add DRM allocator support
+
+Add DRM based allocator support.
+
+The following changes are included :
+1. Use DRM dumb buffers and associated APIs for
+dmabuf allocation.
+2. Have DRM device fd a member of allocator object
+3. Allocate GstMemory objects with mem_type as 'dmabuf'
+
+Signed-off-by: Pooja Prajod <a0132412@ti.com>
+---
+ configure.ac                              |   5 +
+ gst-libs/gst/Makefile.am                  |   4 +-
+ gst-libs/gst/drm/Makefile.am              |  33 +++++
+ gst-libs/gst/drm/gstdrmallocator.c        | 206 ++++++++++++++++++++++++++++++
+ gst-libs/gst/drm/gstdrmallocator.h        |  77 +++++++++++
+ pkgconfig/Makefile.am                     |   3 +
+ pkgconfig/gstreamer-drm-uninstalled.pc.in |  11 ++
+ pkgconfig/gstreamer-drm.pc.in             |  12 ++
+ 8 files changed, 349 insertions(+), 2 deletions(-)
+ create mode 100644 gst-libs/gst/drm/Makefile.am
+ create mode 100644 gst-libs/gst/drm/gstdrmallocator.c
+ create mode 100644 gst-libs/gst/drm/gstdrmallocator.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 5e85e56..e254605 100644
+--- a/configure.ac
++++ b/configure.ac
+@@ -621,6 +621,8 @@ if test x$with_egl_module_name != x; then
+   AC_DEFINE_UNQUOTED(GST_GL_LIBEGL_MODULE_NAME, "$with_egl_module_name", [EGL module name])
+ fi
+ 
++PKG_CHECK_MODULES([DRM], [libdrm libdrm_omap], HAVE_KMS=yes, HAVE_KMS=no)
++
+ AC_ARG_ENABLE([wgl],
+      [  --enable-wgl            Enable WGL support @<:@default=auto@:>@],
+      [case "${enableval}" in
+@@ -3590,6 +3592,7 @@ gst-libs/Makefile
+ gst-libs/gst/Makefile
+ gst-libs/gst/adaptivedemux/Makefile
+ gst-libs/gst/basecamerabinsrc/Makefile
++gst-libs/gst/drm/Makefile
+ gst-libs/gst/gl/Makefile
+ gst-libs/gst/gl/android/Makefile
+ gst-libs/gst/gl/cocoa/Makefile
+@@ -3749,6 +3752,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-gl.pc
+diff --git a/gst-libs/gst/Makefile.am b/gst-libs/gst/Makefile.am
+index 7d0b309..5ec3967 100644
+--- a/gst-libs/gst/Makefile.am
++++ b/gst-libs/gst/Makefile.am
+@@ -11,7 +11,7 @@ WAYLAND_DIR=wayland
+ endif
+ 
+ SUBDIRS = uridownloader adaptivedemux interfaces basecamerabinsrc codecparsers \
+-	 insertbin mpegts base video audio player $(GL_DIR) $(WAYLAND_DIR)
++	 insertbin mpegts base video audio player drm $(GL_DIR) $(WAYLAND_DIR)
+ 
+ noinst_HEADERS = gst-i18n-plugin.h gettext.h glib-compat-private.h
+ DIST_SUBDIRS = uridownloader adaptivedemux interfaces gl basecamerabinsrc \
+@@ -24,7 +24,7 @@ adaptivedemux: uridownloader
+ 
+ INDEPENDENT_SUBDIRS = \
+ 	interfaces basecamerabinsrc codecparsers insertbin uridownloader \
+-	mpegts base player $(GL_DIR) $(WAYLAND_DIR)
++	mpegts base player drm $(GL_DIR) $(WAYLAND_DIR)
+ 
+ .PHONY: independent-subdirs $(INDEPENDENT_SUBDIRS)
+ 
+diff --git a/gst-libs/gst/drm/Makefile.am b/gst-libs/gst/drm/Makefile.am
+new file mode 100644
+index 0000000..9a45dfb
+--- /dev/null
++++ b/gst-libs/gst/drm/Makefile.am
+@@ -0,0 +1,33 @@
++lib_LTLIBRARIES = libgstdrm-@GST_API_VERSION@.la
++
++CLEANFILES = $(BUILT_SOURCES)
++
++libgstdrm_@GST_API_VERSION@_la_SOURCES = \
++	gstdrmallocator.c 
++
++libgstdrm_@GST_API_VERSION@includedir = \
++	$(includedir)/gstreamer-@GST_API_VERSION@/gst/drm
++
++libgstdrm_@GST_API_VERSION@include_HEADERS = \
++	gstdrmallocator.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) \
++	$(GST_PLUGINS_BASE_LIBS) \
++	$(GST_BASE_LIBS) \
++        -lgstallocators-$(GST_API_VERSION) \
++	$(GST_LIBS) 
++
++libgstdrm_@GST_API_VERSION@_la_LDFLAGS = \
++	$(DRM_LDFLAGS) \
++	$(GST_LIB_LDFLAGS) \
++	$(GST_ALL_LDFLAGS) \
++	$(GST_LT_LDFLAGS)
+diff --git a/gst-libs/gst/drm/gstdrmallocator.c b/gst-libs/gst/drm/gstdrmallocator.c
+new file mode 100644
+index 0000000..b557ad2
+--- /dev/null
++++ b/gst-libs/gst/drm/gstdrmallocator.c
+@@ -0,0 +1,206 @@
++/*
++ * GStreamer
++ *
++ * Copyright (C) 2012 Texas Instruments
++ *
++ * Authors:
++ *  Pooja Prajod <poojaprajod@ti.com>
++ *
++ * 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:GstDRMAllocator
++ * @short_description: GStreamer DRM allocator support
++ *
++ * Since: 1.6.3
++ */
++
++
++#include "gstdrmallocator.h"
++#include <stdio.h>
++#include <stdlib.h>
++#include <string.h>
++#include <errno.h>
++#include <unistd.h>
++#include <sys/mman.h>
++#include <sys/types.h>
++
++#define INVALID_DRM_FD (-1)
++
++GST_DEBUG_CATEGORY (drmallocator_debug);
++#define GST_CAT_DEFAULT drmallocator_debug
++
++#define gst_drm_allocator_parent_class parent_class
++G_DEFINE_TYPE (GstDRMAllocator, gst_drm_allocator, GST_TYPE_FD_ALLOCATOR);
++
++static GstMemory *
++gst_drm_allocator_alloc (GstAllocator * allocator, gsize size,
++    GstAllocationParams * params)
++{
++  GstDRMAllocator *self = GST_DRM_ALLOCATOR (allocator);
++  int fd = -1;
++  int DrmDeviceFD = self->DrmDeviceFD;
++  GstMemory *mem;
++  /* Variable for DRM Dumb Buffers */
++
++  struct drm_mode_create_dumb creq;
++  struct drm_mode_destroy_dumb dreq;
++  int ret ;
++  
++  GST_LOG_OBJECT (self, "DRM Memory alloc");  
++  
++  memset(&creq, 0, sizeof(struct drm_mode_create_dumb));
++  /* 
++   We have only total size as argument to _allocator_alloc.
++   Since the DDR storage is linear, it is as good as saying
++   the buffer is of width = size and height = 1
++  */
++  creq.width = size;
++  creq.height = 1;
++  creq.bpp = 8;
++
++  /* Create a DRM dumb buffer */
++  ret = drmIoctl (DrmDeviceFD, DRM_IOCTL_MODE_CREATE_DUMB, &creq);
++  if (ret < 0) {
++    GST_ERROR_OBJECT (self, "Create DRM dumb buffer failed");
++    return NULL;
++  }
++  /* Get a dmabuf fd from the dumb buffer handle */
++  drmPrimeHandleToFD (DrmDeviceFD, creq.handle, DRM_CLOEXEC | O_RDWR, &fd);
++
++  if (fd < 0) {
++    GST_ERROR_OBJECT (self, "Invalid fd returned: %d", fd);
++    goto fail;
++  }
++
++  /* Get a dmabuf gstmemory with the fd */
++  mem = gst_fd_allocator_alloc (allocator, fd, size, 0);  
++
++  if (G_UNLIKELY (!mem)) {
++    GST_ERROR_OBJECT (self, "GstDmaBufMemory allocation failed");
++    close (fd);
++    goto fail;
++  }
++
++  return mem;
++
++  fail:
++    memset(&dreq, 0, sizeof(struct drm_mode_destroy_dumb));
++    dreq.handle = creq.handle;
++    drmIoctl (DrmDeviceFD, DRM_IOCTL_MODE_DESTROY_DUMB, &dreq);
++    return NULL;
++}
++
++static void
++gst_drm_allocator_free (GstAllocator * allocator, GstMemory * mem)
++{
++  GstDRMAllocator *self = GST_DRM_ALLOCATOR (allocator);
++  uint32_t handle = 0;
++  int DrmDeviceFD = self->DrmDeviceFD;
++  int fd = -1;
++
++  GST_LOG_OBJECT (self, "DRM Memory free");
++
++  g_return_if_fail (GST_IS_ALLOCATOR (allocator));
++  g_return_if_fail (mem != NULL);
++  g_return_if_fail (gst_is_drm_memory (mem));
++
++  fd = gst_fd_memory_get_fd (mem);
++  drmPrimeFDToHandle(DrmDeviceFD, fd, &handle);    
++
++  /* Incase there are some mapped memory, we unmap and ready it to be cleaned*/
++  GST_ALLOCATOR_CLASS (parent_class)->free (allocator, mem);
++
++  if (handle) {
++    struct drm_mode_destroy_dumb dreq;
++    memset(&dreq, 0, sizeof(struct drm_mode_destroy_dumb));
++    dreq.handle = handle;
++    drmIoctl (DrmDeviceFD, DRM_IOCTL_MODE_DESTROY_DUMB, &dreq);
++  }
++  
++  close (fd);
++}
++
++static void
++gst_drm_allocator_finalize (GObject * obj)
++{
++  GstDRMAllocator *self = GST_DRM_ALLOCATOR (obj);
++  GST_LOG_OBJECT (obj, "DRM Allocator finalize");
++
++  close (self->DrmDeviceFD);
++  self->DrmDeviceFD = INVALID_DRM_FD;
++
++  G_OBJECT_CLASS (parent_class)->finalize (obj);
++}
++
++static void
++gst_drm_allocator_class_init (GstDRMAllocatorClass * klass)
++{
++  GstAllocatorClass *drm_alloc = (GstAllocatorClass *) klass;
++
++  drm_alloc->alloc = GST_DEBUG_FUNCPTR (gst_drm_allocator_alloc);
++  drm_alloc->free = GST_DEBUG_FUNCPTR (gst_drm_allocator_free);
++  GST_DEBUG_CATEGORY_INIT (drmallocator_debug, "drmallocator", 0,
++    "GstDRMAllocator debug");
++
++}
++
++static void
++gst_drm_allocator_init (GstDRMAllocator * self)
++{
++  GstAllocator *alloc = GST_ALLOCATOR_CAST (self);
++  GObjectClass *object_class = G_OBJECT_CLASS (GST_DRM_ALLOCATOR_GET_CLASS(self));
++  
++  if (self->DrmDeviceFD <= 0) {
++    self->DrmDeviceFD = open("/dev/dri/card0", O_RDWR | O_CLOEXEC);
++    if (self->DrmDeviceFD < 0) {
++      GST_ERROR_OBJECT (self, "Failed to open DRM device");
++    } else {
++      drmDropMaster (self->DrmDeviceFD);
++    }
++  }
++
++  alloc->mem_type = GST_ALLOCATOR_DMABUF;
++
++  object_class->finalize = gst_drm_allocator_finalize;
++
++  GST_OBJECT_FLAG_UNSET (self, GST_ALLOCATOR_FLAG_CUSTOM_ALLOC);
++}
++
++void
++gst_drm_allocator_register (void)
++{
++  gst_allocator_register (GST_ALLOCATOR_DRM,
++      g_object_new (GST_TYPE_DRM_ALLOCATOR, NULL));
++}
++
++GstAllocator *
++gst_drm_allocator_get (void)
++{
++  GstAllocator *alloc;
++  alloc = gst_allocator_find (GST_ALLOCATOR_DRM);
++  if (!alloc) {
++    gst_drm_allocator_register();
++    alloc = gst_allocator_find (GST_ALLOCATOR_DRM);
++  }
++  return alloc; 
++}
++
++gboolean
++gst_is_drm_memory (GstMemory * mem)
++{
++  return gst_memory_is_type (mem, GST_ALLOCATOR_DMABUF);
++}
+diff --git a/gst-libs/gst/drm/gstdrmallocator.h b/gst-libs/gst/drm/gstdrmallocator.h
+new file mode 100644
+index 0000000..1ca93ba
+--- /dev/null
++++ b/gst-libs/gst/drm/gstdrmallocator.h
+@@ -0,0 +1,77 @@
++/*
++ * GStreamer
++ *
++ * Copyright (C) 2012 Texas Instruments
++ *
++ * Authors:
++ *  Pooja Prajod <poojaprajod@ti.com>
++ *
++ * 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:GstDRMAllocator
++ * @short_description: GStreamer DRM allocator support
++ *
++ * Since: 1.6.3
++ */
++
++#ifndef __GSTDRMALLOCATOR_H__
++#define __GSTDRMALLOCATOR_H__
++
++#include <gst/gst.h>
++#include <gst/video/video.h>
++#include <gst/allocators/allocators.h>
++#include <stdint.h>
++
++#include <xf86drm.h>
++#include <xf86drmMode.h>
++#include <fcntl.h>
++
++G_BEGIN_DECLS
++
++#define GST_TYPE_DRM_ALLOCATOR                  (gst_drm_allocator_get_type ())
++#define GST_DRM_ALLOCATOR(obj)                  (G_TYPE_CHECK_INSTANCE_CAST ((obj), GST_TYPE_DRM_ALLOCATOR, GstDRMAllocator))
++#define GST_IS_DRM_ALLOCATOR(obj)               (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GST_TYPE_DRM_ALLOCATOR))
++#define GST_DRM_ALLOCATOR_CLASS(klass)          (G_TYPE_CHECK_CLASS_CAST ((klass), GST_TYPE_DRM_ALLOCATOR, GstDRMAllocatorClass))
++#define GST_IS_DRM_ALLOCATOR_CLASS(klass)       (G_TYPE_CHECK_CLASS_TYPE ((klass), GST_TYPE_DRM_ALLOCATOR))
++#define GST_DRM_ALLOCATOR_GET_CLASS(obj)        (G_TYPE_INSTANCE_GET_CLASS ((obj), GST_TYPE_DRM_ALLOCATOR, GstDRMAllocatorClass))
++
++#define GST_ALLOCATOR_DRM "DRM"
++
++typedef struct _GstDRMAllocator GstDRMAllocator;
++typedef struct _GstDRMAllocatorClass GstDRMAllocatorClass;
++
++struct _GstDRMAllocator
++{
++  GstFdAllocator parent;
++  int DrmDeviceFD;
++};
++
++struct _GstDRMAllocatorClass
++{
++  GstFdAllocatorClass parent_class;
++};
++
++void gst_drm_allocator_register (void);
++GstAllocator * gst_drm_allocator_get (void);
++
++gboolean gst_is_drm_memory (GstMemory * mem);
++
++GType gst_drm_allocator_get_type (void);
++
++G_END_DECLS
++
++#endif /* __GSTDRMALLOCATOR_H__ */
+diff --git a/pkgconfig/Makefile.am b/pkgconfig/Makefile.am
+index 88c7e52..5fdccbf 100644
+--- a/pkgconfig/Makefile.am
++++ b/pkgconfig/Makefile.am
+@@ -2,6 +2,7 @@
+ ### all of the standard pc files we need to generate
+ pcverfiles =  \
+ 	gstreamer-plugins-bad-@GST_API_VERSION@.pc \
++        gstreamer-drm-@GST_API_VERSION@.pc \
+ 	gstreamer-codecparsers-@GST_API_VERSION@.pc \
+ 	gstreamer-insertbin-@GST_API_VERSION@.pc \
+ 	gstreamer-mpegts-@GST_API_VERSION@.pc \
+@@ -12,6 +13,7 @@ pcverfiles =  \
+ 
+ pcverfiles_uninstalled = \
+ 	gstreamer-plugins-bad-@GST_API_VERSION@-uninstalled.pc \
++        gstreamer-drm-@GST_API_VERSION@-uninstalled.pc \
+ 	gstreamer-codecparsers-@GST_API_VERSION@-uninstalled.pc \
+ 	gstreamer-insertbin-@GST_API_VERSION@-uninstalled.pc \
+ 	gstreamer-mpegts-@GST_API_VERSION@-uninstalled.pc \
+@@ -43,6 +45,7 @@ pkgconfig_DATA = $(pcverfiles)
+ CLEANFILES = $(pcverfiles) $(pcverfiles_uninstalled)
+ pcinfiles = \
+            gstreamer-plugins-bad.pc.in gstreamer-plugins-bad-uninstalled.pc.in \
++           gstreamer-drm.pc.in gstreamer-drm-uninstalled.pc.in \
+            gstreamer-codecparsers.pc.in gstreamer-codecparsers-uninstalled.pc.in \
+            gstreamer-gl.pc.in gstreamer-gl-uninstalled.pc.in \
+            gstreamer-insertbin.pc.in gstreamer-insertbin-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..9dcf978
+--- /dev/null
++++ b/pkgconfig/gstreamer-drm-uninstalled.pc.in
+@@ -0,0 +1,11 @@
++prefix=
++exec_prefix=
++libdir=${pcfiledir}/../gst-libs/gst/drm
++includedir=${pcfiledir}/../gst-libs
++
++Name: GStreamer DRM Allocator, Uninstalled
++Description: DRM Allocator 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..d155e80
+--- /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 Allocator
++Description: DRM Allocator for GStreamer elements
++Requires: gstreamer-@GST_MAJORMINOR@ gstreamer-base-@GST_MAJORMINOR@
++Version: @VERSION@
++Libs: -L${libdir} -lgstdrm-@GST_MAJORMINOR@
++Cflags: -I${includedir}
++
+-- 
+1.9.1
+
diff --git a/meta-arago-extras/recipes-multimedia/gstreamer/gstreamer1.0-plugins-bad/0002-parsers-Pick-previos-bug-fixes-on-different-parsers.patch b/meta-arago-extras/recipes-multimedia/gstreamer/gstreamer1.0-plugins-bad/0002-parsers-Pick-previos-bug-fixes-on-different-parsers.patch
new file mode 100644
index 0000000..707cfc2
--- /dev/null
+++ b/meta-arago-extras/recipes-multimedia/gstreamer/gstreamer1.0-plugins-bad/0002-parsers-Pick-previos-bug-fixes-on-different-parsers.patch
@@ -0,0 +1,146 @@
+From c748e947ff35c4137178aef9bf229e0c67952982 Mon Sep 17 00:00:00 2001
+From: Pooja Prajod <a0132412@ti.com>
+Date: Fri, 20 Jan 2017 14:57:29 +0530
+Subject: [PATCH 2/5] parsers: Pick previos bug fixes on different parsers
+
+The following bug fixes which were previously identified are picked :
+1. Increase rank for vc1parse and jpegparse
+2. Modify h264 and mpeg4 parsers to interpolate pts
+3. Fix create() width and height calculation on h264parse
+
+Signed-off-by: Pooja Prajod <a0132412@ti.com>
+---
+ gst/jpegformat/gstjpegformat.c        |  2 +-
+ gst/jpegformat/gstjpegparse.c         |  2 +-
+ gst/videoparsers/gsth264parse.c       | 22 +++++++---------------
+ gst/videoparsers/gstmpeg4videoparse.c |  2 +-
+ gst/videoparsers/gstmpegvideoparse.c  |  2 +-
+ gst/videoparsers/plugin.c             |  2 +-
+ 6 files changed, 12 insertions(+), 20 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 77e53a6..5bfba7b 100644
+--- a/gst/jpegformat/gstjpegparse.c
++++ b/gst/jpegformat/gstjpegparse.c
+@@ -151,7 +151,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/gsth264parse.c b/gst/videoparsers/gsth264parse.c
+index 05b6b75..6fe2914 100644
+--- a/gst/videoparsers/gsth264parse.c
++++ b/gst/videoparsers/gsth264parse.c
+@@ -162,7 +162,7 @@ static void
+ gst_h264_parse_init (GstH264Parse * h264parse)
+ {
+   h264parse->frame_out = gst_adapter_new ();
+-  gst_base_parse_set_pts_interpolation (GST_BASE_PARSE (h264parse), FALSE);
++  gst_base_parse_set_pts_interpolation (GST_BASE_PARSE (h264parse), TRUE);
+   GST_PAD_SET_ACCEPT_INTERSECT (GST_BASE_PARSE_SINK_PAD (h264parse));
+   GST_PAD_SET_ACCEPT_TEMPLATE (GST_BASE_PARSE_SINK_PAD (h264parse));
+ }
+@@ -1722,13 +1722,8 @@ gst_h264_parse_update_src_caps (GstH264Parse * h264parse, GstCaps * caps)
+     gint fps_num, fps_den;
+     gint par_n, par_d;
+ 
+-    if (sps->frame_cropping_flag) {
+-      crop_width = sps->crop_rect_width;
+-      crop_height = sps->crop_rect_height;
+-    } else {
+-      crop_width = sps->width;
+-      crop_height = sps->height;
+-    }
++    crop_width = (sps->crop_rect_width > sps->width)? sps->crop_rect_width: sps->width;
++    crop_height = (sps->crop_rect_height > sps->height)? sps->crop_rect_height: sps->height;
+ 
+     if (G_UNLIKELY (h264parse->width != crop_width ||
+             h264parse->height != crop_height)) {
+@@ -1762,7 +1757,7 @@ gst_h264_parse_update_src_caps (GstH264Parse * h264parse, GstCaps * caps)
+     }
+ 
+     if (G_UNLIKELY (modified || h264parse->update_caps)) {
+-      gint width, height;
++      gint width=0, height=0;
+       GstClockTime latency;
+ 
+       const gchar *caps_mview_mode = NULL;
+@@ -1774,16 +1769,13 @@ gst_h264_parse_update_src_caps (GstH264Parse * h264parse, GstCaps * caps)
+ 
+       caps = gst_caps_copy (sink_caps);
+ 
+-      /* sps should give this but upstream overrides */
+       if (s && gst_structure_has_field (s, "width"))
+         gst_structure_get_int (s, "width", &width);
+-      else
+-        width = h264parse->width;
+-
++      width = (width > h264parse->width)? width: h264parse->width;
++     
+       if (s && gst_structure_has_field (s, "height"))
+         gst_structure_get_int (s, "height", &height);
+-      else
+-        height = h264parse->height;
++      height = (height > h264parse->height)? height: h264parse->height;
+ 
+       if (s == NULL ||
+           !gst_structure_get_fraction (s, "pixel-aspect-ratio", &par_n,
+diff --git a/gst/videoparsers/gstmpeg4videoparse.c b/gst/videoparsers/gstmpeg4videoparse.c
+index a1fd3b2..7912254 100644
+--- a/gst/videoparsers/gstmpeg4videoparse.c
++++ b/gst/videoparsers/gstmpeg4videoparse.c
+@@ -185,7 +185,7 @@ gst_mpeg4vparse_init (GstMpeg4VParse * parse)
+   parse->interval = DEFAULT_CONFIG_INTERVAL;
+   parse->last_report = GST_CLOCK_TIME_NONE;
+ 
+-  gst_base_parse_set_pts_interpolation (GST_BASE_PARSE (parse), FALSE);
++  gst_base_parse_set_pts_interpolation (GST_BASE_PARSE (parse), TRUE);
+   GST_PAD_SET_ACCEPT_INTERSECT (GST_BASE_PARSE_SINK_PAD (parse));
+   GST_PAD_SET_ACCEPT_TEMPLATE (GST_BASE_PARSE_SINK_PAD (parse));
+ }
+diff --git a/gst/videoparsers/gstmpegvideoparse.c b/gst/videoparsers/gstmpegvideoparse.c
+index bf71a3e..f203cca 100644
+--- a/gst/videoparsers/gstmpegvideoparse.c
++++ b/gst/videoparsers/gstmpegvideoparse.c
+@@ -175,7 +175,7 @@ gst_mpegv_parse_init (GstMpegvParse * parse)
+ {
+   parse->config_flags = FLAG_NONE;
+ 
+-  gst_base_parse_set_pts_interpolation (GST_BASE_PARSE (parse), FALSE);
++  gst_base_parse_set_pts_interpolation (GST_BASE_PARSE (parse), TRUE);
+   GST_PAD_SET_ACCEPT_INTERSECT (GST_BASE_PARSE_SINK_PAD (parse));
+   GST_PAD_SET_ACCEPT_TEMPLATE (GST_BASE_PARSE_SINK_PAD (parse));
+ }
+diff --git a/gst/videoparsers/plugin.c b/gst/videoparsers/plugin.c
+index 79d1df6..fb866b5 100644
+--- a/gst/videoparsers/plugin.c
++++ b/gst/videoparsers/plugin.c
+@@ -51,7 +51,7 @@ plugin_init (GstPlugin * plugin)
+   ret |= gst_element_register (plugin, "h265parse",
+       GST_RANK_SECONDARY, GST_TYPE_H265_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.9.1
+
diff --git a/meta-arago-extras/recipes-multimedia/gstreamer/gstreamer1.0-plugins-bad/0003-gstkmssink-Add-support-for-KMS-based-sink.patch b/meta-arago-extras/recipes-multimedia/gstreamer/gstreamer1.0-plugins-bad/0003-gstkmssink-Add-support-for-KMS-based-sink.patch
new file mode 100644
index 0000000..1068fda
--- /dev/null
+++ b/meta-arago-extras/recipes-multimedia/gstreamer/gstreamer1.0-plugins-bad/0003-gstkmssink-Add-support-for-KMS-based-sink.patch
@@ -0,0 +1,1592 @@
+From 44ba6f9839a410e981c9c941f099316ebfac2659 Mon Sep 17 00:00:00 2001
+From: Pooja Prajod <a0132412@ti.com>
+Date: Fri, 20 Jan 2017 16:18:22 +0530
+Subject: [PATCH 3/5] gstkmssink: Add support for KMS based sink
+
+The following features are enabled:
+1. Add support for kmssink
+2. Fix memory leak by using API's that do not hold
+   reference to GstMemory
+3. Restrict the number of buffers that will be allocated
+   by kmssink bufferpool
+4. Use Atomic mode setting instead of SetPlane
+5. Store encoder and plane data as static data to enable
+   same process looping usecase
+6. Handle usecase where display is disabled by default
+
+Signed-off-by: Pooja Prajod <a0132412@ti.com>
+---
+ configure.ac               |  14 +
+ sys/Makefile.am            |  10 +-
+ sys/kms/Makefile.am        |  28 ++
+ sys/kms/gstdrmutils.c      | 347 +++++++++++++++++++++
+ sys/kms/gstdrmutils.h      |  50 +++
+ sys/kms/gstkmsbufferpriv.c | 121 ++++++++
+ sys/kms/gstkmsbufferpriv.h |  64 ++++
+ sys/kms/gstkmssink.c       | 740 +++++++++++++++++++++++++++++++++++++++++++++
+ sys/kms/gstkmssink.h       |  92 ++++++
+ 9 files changed, 1464 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 e254605..9fdfbc7 100644
+--- a/configure.ac
++++ b/configure.ac
+@@ -2324,6 +2324,18 @@ 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, [
+@@ -3383,6 +3395,7 @@ AM_CONDITIONAL(USE_GTK3_GL, 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_LIBDE265, false)
+@@ -3632,6 +3645,7 @@ sys/fbdev/Makefile
+ sys/linsys/Makefile
+ sys/nvenc/Makefile
+ sys/opensles/Makefile
++sys/kms/Makefile
+ sys/shm/Makefile
+ sys/tinyalsa/Makefile
+ sys/uvch264/Makefile
+diff --git a/sys/Makefile.am b/sys/Makefile.am
+index 32f79fb..325b4af 100644
+--- a/sys/Makefile.am
++++ b/sys/Makefile.am
+@@ -87,6 +87,12 @@ PVR_DIR=pvr2d
+ else
+ PVR_DIR=
+ endif
++	
++if USE_KMS
++KMS_DIR=kms
++else
++KMS_DIR=
++endif
+ 
+ if USE_SHM
+ SHM_DIR=shm
+@@ -148,10 +154,10 @@ else
+ TINYALSA_DIR=
+ endif
+ 
+-SUBDIRS = $(ACM_DIR) $(ANDROID_MEDIA_DIR) $(APPLE_MEDIA_DIR) $(AVC_DIR) $(BLUEZ_DIR) $(D3DVIDEOSINK_DIR) $(DECKLINK_DIR) $(DIRECTSOUND_DIR) $(WINKS_DIR) $(DVB_DIR) $(FBDEV_DIR) $(LINSYS_DIR) $(OPENSLES_DIR) $(PVR_DIR) $(SHM_DIR) $(UVCH264_DIR) $(VCD_DIR) $(VDPAU_DIR) $(WININET_DIR) $(WINSCREENCAP_DIR) $(WASAPI_DIR) $(NVENC_DIR) $(TINYALSA_DIR)
++SUBDIRS = $(ACM_DIR) $(ANDROID_MEDIA_DIR) $(APPLE_MEDIA_DIR) $(AVC_DIR) $(BLUEZ_DIR) $(D3DVIDEOSINK_DIR) $(DECKLINK_DIR) $(DIRECTSOUND_DIR) $(WINKS_DIR) $(DVB_DIR) $(FBDEV_DIR) $(LINSYS_DIR) $(OPENSLES_DIR) $(PVR_DIR) $(KMS_DIR) $(SHM_DIR) $(UVCH264_DIR) $(VCD_DIR) $(VDPAU_DIR) $(WININET_DIR) $(WINSCREENCAP_DIR) $(WASAPI_DIR) $(NVENC_DIR) $(TINYALSA_DIR)
+ 
+ DIST_SUBDIRS = acmenc acmmp3dec androidmedia applemedia applemedia-nonpublic avc bluez d3dvideosink decklink directsound dvb linsys fbdev dshowdecwrapper dshowsrcwrapper dshowvideosink \
+-		opensles pvr2d shm uvch264 vcd vdpau wasapi wininet winks winscreencap \
++		opensles pvr2d kms shm uvch264 vcd vdpau wasapi wininet winks winscreencap \
+ 		nvenc tinyalsa
+ 
+ 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..6d56073
+--- /dev/null
++++ b/sys/kms/Makefile.am
+@@ -0,0 +1,28 @@
++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) \
++	$(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..0e67a48
+--- /dev/null
++++ b/sys/kms/gstdrmutils.c
+@@ -0,0 +1,347 @@
++/* 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"
++
++static int stored_enc = 0;
++static drmModeEncoder *enc;
++static struct plane_data *stored_plane;
++
++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->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)
++{
++  int i, best_area = 0, ret;
++  struct drm_set_client_cap req;
++  unsigned int j;
++  int32_t crtc;
++
++  gst_drm_connector_cleanup (fd, c);
++
++  req.capability = DRM_CLIENT_CAP_ATOMIC;
++  req.value = 1;
++  ret = ioctl(fd, DRM_IOCTL_SET_CLIENT_CAP, &req);
++  if(ret < 0) {
++    GST_DEBUG("drm set atomic cap failed");
++    goto fail;
++  }
++
++  /* 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 */
++
++  if (stored_enc) {
++    c->encoder = enc;
++    c->connector->encoder_id = stored_enc;
++  } else {
++    c->encoder = drmModeGetEncoder (fd, c->connector->encoder_id);
++    enc = c->encoder;
++    stored_enc = c->connector->encoder_id;
++  }
++
++  if (!c->encoder) {
++    for (i = 0; i < c->connector->count_encoders; ++i) {
++       c->encoder = drmModeGetEncoder(fd, c->connector->encoders[i]);
++       if (!c->encoder) {
++          GST_DEBUG ("Cannot retrieve encoder %u:%u (%d): %m\n",
++              i, c->connector->encoders[i], errno);
++          continue;
++       }
++       /* iterate all global CRTCs */
++       for (j = 0; j < resources->count_crtcs; ++j) {
++          /* check whether this CRTC works with the encoder */
++          if (!(c->encoder->possible_crtcs & (1 << j)))
++             continue;
++          crtc = resources->crtcs[j];
++          break;
++       }
++      if (crtc >= 0) {
++         enc = c->encoder;
++         stored_enc = c->connector->encoder_id;
++         c->crtc = crtc;
++         goto found_encoder;
++      }
++    }
++  }
++
++found_encoder:
++
++  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;
++
++  if (stored_plane) {
++    c->pdata = stored_plane;
++  } else {
++
++    c->pdata = calloc(sizeof(struct plane_data), 1);
++    for (i = 0; i < plane_resources->count_planes; i++) {
++      drmModePlane *plane = drmModeGetPlane (fd, plane_resources->planes[i]);
++      int propc;
++      if (plane->possible_crtcs & (1 << c->pipe)) {
++        drmModeObjectPropertiesPtr props = drmModeObjectGetProperties(fd, plane_resources->planes[i], DRM_MODE_OBJECT_PLANE);
++        for(propc = 0; propc < props->count_props; propc++) {
++          drmModePropertyPtr prop = drmModeGetProperty(fd, props->props[propc]);
++          if(strcmp(prop->name, "FB_ID") == 0)
++            c->pdata[0].fb_id_property = props->props[propc];
++        }
++        c->pdata[0].plane = plane_resources->planes[i];
++        stored_plane = c->pdata;
++        break;
++      }
++    }
++    if (stored_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) {
++      GST_DEBUG ("RGB565 AddFb2 failed");
++    }
++  }
++
++  /* now set the desired mode: */
++  ret = drmModeSetCrtc (fd, c->crtc, c->fb_id, 0, 0, &c->id, 1, c->mode);
++  if (ret) {
++    GST_DEBUG ("SetCrtc failed");
++  }
++
++  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)
++{
++  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)) {
++        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);
++  }
++
++  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)
++{
++  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)) {
++      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..ebc5fc6
+--- /dev/null
++++ b/sys/kms/gstdrmutils.h
+@@ -0,0 +1,50 @@
++#ifndef __GST_DRMUTILS_H__
++#define __GST_DRMUTILS_H__
++
++#include <fcntl.h>
++#include <xf86drm.h>
++#include <stdio.h>
++#include <stdint.h>
++#include <stdlib.h>
++#include <string.h>
++#include <errno.h>
++#include <unistd.h>
++#include <assert.h>
++#include <libdrm/drm.h>
++#include <libdrm/drm_mode.h>
++#include <xf86drmMode.h>
++#include <omap_drm.h>
++#include <omap_drmif.h>
++#include <drm_fourcc.h>
++#include <gst/gst.h>
++#include <sys/ioctl.h>
++
++struct plane_data {
++	int plane;
++	int fb_id_property;
++};
++
++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;
++        struct plane_data *pdata;
++};
++
++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);
++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);
++
++#endif /* __GST_DRMUTILS_H__ */
+diff --git a/sys/kms/gstkmsbufferpriv.c b/sys/kms/gstkmsbufferpriv.c
+new file mode 100644
+index 0000000..172a4c3
+--- /dev/null
++++ b/sys/kms/gstkmsbufferpriv.c
+@@ -0,0 +1,121 @@
++/*
++ * 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/allocators/allocators.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)
++{
++    struct omap_bo *bo;
++    int fd;
++    int fd_copy;
++    GstKMSBufferPriv * priv;
++    GstMemory *mem;
++
++    /* if it isn't a dmabuf buffer that we can import, then there
++     * is nothing we can do with it:
++     */
++    mem = gst_buffer_peek_memory (buf, 0);
++    fd_copy = gst_fd_memory_get_fd (mem); 
++    if (fd_copy < 0) {
++      GST_DEBUG_OBJECT (sink, "not importing non dmabuf buffer");
++      return NULL;
++    }
++
++    /* 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..17e6407
+--- /dev/null
++++ b/sys/kms/gstkmssink.c
+@@ -0,0 +1,740 @@
++/* 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>
++
++static int drm_fd = -1;
++static struct omap_device *drm_dev;
++static int once =1;
++
++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;
++  GstStructure *conf;
++  GstStructure *s;
++  int size;
++
++  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;
++  size = info.size;
++
++  if (!sink->pool) {
++    GstAllocator *allocator;
++
++    allocator = gst_drm_allocator_get ();
++    sink->pool = gst_buffer_pool_new ();
++    conf = gst_buffer_pool_get_config (GST_BUFFER_POOL(sink->pool));
++    gst_buffer_pool_config_set_params (conf, caps, size, 0, 0);
++    gst_buffer_pool_config_set_allocator (conf, allocator, NULL);
++    gst_buffer_pool_set_config (GST_BUFFER_POOL(sink->pool), conf);
++    if (allocator)
++      gst_object_unref (allocator);
++  }
++
++  sink->conn.crtc = -1;
++  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 void page_flip_handler(int fd, unsigned int frame,
++                  unsigned int sec, unsigned int usec, void *data)
++{
++        int *waiting_for_flip = data;
++        *waiting_for_flip = 0;
++}
++
++
++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 = 0;
++  gint width, height;
++  GstVideoRectangle *c = &sink->src_rect;
++  int waiting_for_flip = 1;
++
++  fd_set fds;
++  drmEventContext evctx = {
++                          .version = DRM_EVENT_CONTEXT_VERSION,
++                          .vblank_handler = 0,
++                          .page_flip_handler = page_flip_handler,
++                           };
++
++  g_mutex_lock (&sink->render_lock);
++  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 = sink->input_width;
++    }
++    if (crop->height >= 0){
++      height = crop->height;
++    } else {
++      height = sink->input_height;
++    }
++  } else {
++    width = sink->input_width;
++    height = sink->input_height;
++  }
++
++  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) {
++    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))
++        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))
++        goto connector_not_found;
++    }
++   once = 1;
++  }
++
++  priv = gst_kms_buffer_priv (sink, inbuf);
++
++  if (priv) {
++    buf = inbuf;
++  } else {
++    GST_LOG_OBJECT (sink, "not a KMS buffer, slow-path!");
++    gst_buffer_pool_acquire_buffer (sink->pool, &buf, NULL);
++    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;
++  }
++  
++ if (once) {
++    once = 0;
++    static  GstVideoRectangle dest = { 0 };
++    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);
++    ret = drmModeSetPlane (sink->fd, sink->conn.pdata[0].plane,
++        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;
++  }
++
++  drmModeAtomicReqPtr m_req = drmModeAtomicAlloc();
++
++  drmModeAtomicAddProperty(m_req, sink->conn.pdata[0].plane,
++			sink->conn.pdata[0].fb_id_property,
++			priv->fb_id);
++
++  drmModeAtomicCommit(sink->fd, m_req, DRM_MODE_ATOMIC_TEST_ONLY, 0);
++  drmModeAtomicCommit(sink->fd, m_req, DRM_MODE_PAGE_FLIP_EVENT | DRM_MODE_ATOMIC_NONBLOCK, &waiting_for_flip);
++  drmModeAtomicFree(m_req);
++
++  while (waiting_for_flip) {
++    FD_ZERO(&fds);
++    FD_SET(sink->fd, &fds);
++    int err;
++    err = select(sink->fd + 1, &fds, NULL, NULL, NULL);
++    if (err < 0) {
++      GST_ERROR_OBJECT (sink,"select err: %s\n", strerror(errno));
++      flow_ret = GST_FLOW_ERROR;
++      goto out;
++    }
++    if (FD_ISSET(sink->fd, &fds)) {
++      drmHandleEvent(sink->fd, &evctx);
++    }
++  }
++
++  display_bufs_queue (sink, buf);
++
++out:
++  GST_INFO_OBJECT (sink, "exit");
++  if (buf != inbuf)
++    gst_buffer_unref (buf);
++  g_mutex_unlock (&sink->render_lock);
++  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));
++
++  display_bufs_free (sink);
++  
++ if (sink->pool) {
++    gst_buffer_pool_set_active (GST_BUFFER_POOL(sink->pool), FALSE);
++    gst_object_unref(sink->pool);
++    sink->pool = NULL;
++  }
++
++  if (sink->plane_resources) {
++    drmModeFreePlaneResources (sink->plane_resources);
++    sink->plane_resources = NULL;
++  }
++
++  if (sink->resources) {
++    drmModeFreeResources (sink->resources);
++    sink->resources = NULL;
++  }
++
++  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);
++
++  drm_dev = dce_init ();
++  if (drm_dev == NULL)
++    goto device_failed;
++  else {
++    sink->dev = drm_dev;
++    sink->fd = dce_get_fd ();
++    drm_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 gboolean
++gst_kms_sink_propose_allocation (GstBaseSink * bsink, GstQuery * query)
++{
++  GstKMSSink *sink;
++  GstStructure *conf;
++  GstCaps *caps;
++  guint size;
++  gboolean need_pool;
++  GstStructure *s;
++  int num_buffers = 0;
++
++
++  sink = GST_KMS_SINK (bsink);
++
++  GST_DEBUG_OBJECT (sink, "begin");
++
++  gst_query_parse_allocation (query, &caps, &need_pool);
++
++  if (G_UNLIKELY (!caps)) {
++    GST_WARNING_OBJECT (sink, "have no caps, doing fallback allocation");
++    return FALSE;
++  }
++
++  if (need_pool) {
++    GstVideoInfo info;
++  
++    if (!gst_video_info_from_caps (&info, caps))
++      goto invalid_caps;
++
++    GST_LOG_OBJECT (sink,
++        "a bufferpool was requested with caps %" GST_PTR_FORMAT, caps);
++
++    /* We already have a pool after set_caps */
++    if (sink->pool) {
++      GstStructure *config;
++      int min,max;
++      config = gst_buffer_pool_get_config (sink->pool);
++      gst_buffer_pool_config_get_params (config, NULL, &size, &min, &max);
++      gst_structure_free (config);
++    
++      gst_query_add_allocation_pool (query, sink->pool, size, min, max);
++      gst_query_add_allocation_param (query, gst_drm_allocator_get (), NULL);
++      return TRUE;
++   } else {
++     GST_LOG_OBJECT (sink, "No bufferpool available");
++     return FALSE;
++   }
++  }
++ 
++
++invalid_caps:
++  GST_DEBUG_OBJECT (sink, "invalid caps specified");
++  return FALSE;
++}
++
++static void
++gst_kms_sink_finalize (GObject * object)
++{
++  GstKMSSink *sink;
++
++  sink = GST_KMS_SINK (object);
++  g_mutex_clear (&sink->render_lock);
++  g_free (sink->conn_name);
++  if (sink->kmsbufferpriv){
++    g_hash_table_destroy (sink->kmsbufferpriv);
++    sink->kmsbufferpriv = NULL;
++  gst_kms_sink_reset (sink);
++}
++
++  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);
++  g_mutex_init (&sink->render_lock);
++}
++
++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);
++  gstbasesink_class->propose_allocation = GST_DEBUG_FUNCPTR (gst_kms_sink_propose_allocation);
++
++  /* 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..9f76839
+--- /dev/null
++++ b/sys/kms/gstkmssink.h
+@@ -0,0 +1,92 @@
++/* 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/gstdrmallocator.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 1
++
++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;
++  GstBufferPool *pool;
++  GHashTable *kmsbufferpriv;
++  /* current displayed buffer and last displayed buffer: */
++  GstBuffer *display_bufs[NUM_DISPLAY_BUFS];
++  gboolean scale;
++  GMutex render_lock;
++};
++
++struct _GstKMSSinkClass
++{
++  GstVideoSinkClass parent_class;
++};
++
++GType gst_kms_sink_get_type (void);
++
++G_END_DECLS
++#endif /* __GST_KMS_SINK_H__ */
+-- 
+1.9.1
+
diff --git a/meta-arago-extras/recipes-multimedia/gstreamer/gstreamer1.0-plugins-bad/0004-gstwaylandsink-Add-DRM-support-on-waylandsink.patch b/meta-arago-extras/recipes-multimedia/gstreamer/gstreamer1.0-plugins-bad/0004-gstwaylandsink-Add-DRM-support-on-waylandsink.patch
new file mode 100644
index 0000000..2902bc3
--- /dev/null
+++ b/meta-arago-extras/recipes-multimedia/gstreamer/gstreamer1.0-plugins-bad/0004-gstwaylandsink-Add-DRM-support-on-waylandsink.patch
@@ -0,0 +1,1728 @@
+From 78ddc83ebfe7cf69c62610e1f7d14e7f49bf65c9 Mon Sep 17 00:00:00 2001
+From: Pooja Prajod <a0132412@ti.com>
+Date: Wed, 25 Jan 2017 17:09:35 +0530
+Subject: [gst-bad-1.8] gstwaylandsink: Add DRM support on waylandsink
+
+Add wl_drm interface on waylandsink.
+The following features are supported:
+1. Support for mouse drag and drop.
+2. Support for video cropping
+
+The following bug fixes identified earlier have been picked:
+1. Consolidate header files to avoid circular dependency
+2. Fix bug reported on waylandsink incase of same process looping
+
+Signed-off-by: Pooja Prajod <a0132412@ti.com>
+---
+ configure.ac                              |   4 +-
+ ext/wayland/Makefile.am                   |  17 +-
+ ext/wayland/gstwaylandsink.c              |  82 ++++++-
+ ext/wayland/gstwaylandsink.h              |   4 +-
+ ext/wayland/wayland-drm-client-protocol.h | 213 ++++++++++++++++++
+ ext/wayland/wayland-drm-protocol.c        |  74 +++++++
+ ext/wayland/wlbuffer.c                    |   2 +-
+ ext/wayland/wlbuffer.h                    |  67 ------
+ ext/wayland/wldisplay-wlwindow-wlbuffer.h | 216 ++++++++++++++++++
+ ext/wayland/wldisplay.c                   | 350 +++++++++++++++++++++++++++++-
+ ext/wayland/wldisplay.h                   |  84 -------
+ ext/wayland/wldrm.c                       |  69 ++++++
+ ext/wayland/wldrm.h                       |   3 +
+ ext/wayland/wlshmallocator.h              |   2 +-
+ ext/wayland/wlvideoformat.c               |   8 +-
+ ext/wayland/wlwindow.c                    |  47 +++-
+ ext/wayland/wlwindow.h                    |  84 -------
+ 17 files changed, 1056 insertions(+), 270 deletions(-)
+ create mode 100644 ext/wayland/wayland-drm-client-protocol.h
+ create mode 100644 ext/wayland/wayland-drm-protocol.c
+ delete mode 100644 ext/wayland/wlbuffer.h
+ create mode 100644 ext/wayland/wldisplay-wlwindow-wlbuffer.h
+ delete mode 100644 ext/wayland/wldisplay.h
+ create mode 100644 ext/wayland/wldrm.c
+ create mode 100644 ext/wayland/wldrm.h
+ delete mode 100644 ext/wayland/wlwindow.h
+
+diff --git a/configure.ac b/configure.ac
+index 9fdfbc7..76166cb 100644
+--- a/configure.ac
++++ b/configure.ac
+@@ -2172,8 +2172,10 @@ AG_GST_CHECK_FEATURE(DIRECTFB, [directfb], dfbvideosink , [
+ dnl **** Wayland ****
+ translit(dnm, m, l) AM_CONDITIONAL(USE_WAYLAND, true)
+ AC_PATH_PROG([wayland_scanner], [wayland-scanner])
+-AG_GST_CHECK_FEATURE(WAYLAND, [wayland sink], wayland , [
++AG_GST_CHECK_FEATURE(WAYLAND, [wayland sink], wayland libdrm libdrm_omap, [
+   PKG_CHECK_MODULES(WAYLAND, wayland-client >= 1.4.0, [
++    AC_SUBST(DRM_CFLAGS)
++    AC_SUBST(DRM_LIBS)
+     if test "x$wayland_scanner" != "x"; then
+       HAVE_WAYLAND="yes"
+     else
+diff --git a/ext/wayland/Makefile.am b/ext/wayland/Makefile.am
+index c742bfc..eb6e326 100644
+--- a/ext/wayland/Makefile.am
++++ b/ext/wayland/Makefile.am
+@@ -3,31 +3,34 @@ plugin_LTLIBRARIES = libgstwaylandsink.la
+ libgstwaylandsink_la_SOURCES =  \
+ 	gstwaylandsink.c \
+ 	wlshmallocator.c \
++        wldrm.c \
+ 	wlbuffer.c \
+ 	wldisplay.c \
+ 	wlwindow.c \
+ 	wlvideoformat.c \
+-	scaler-protocol.c
++	scaler-protocol.c \
++        wayland-drm-protocol.c
+ 
+ libgstwaylandsink_la_CFLAGS = $(GST_CFLAGS) $(GST_PLUGINS_BASE_CFLAGS) \
+-                               $(WAYLAND_CFLAGS) $(GST_PLUGINS_BAD_CFLAGS)
++                               $(WAYLAND_CFLAGS) $(GST_PLUGINS_BAD_CFLAGS) $(DRM_CFLAGS)
+ libgstwaylandsink_la_LIBADD = \
+ 	$(GST_PLUGINS_BASE_LIBS) \
+ 	-lgstvideo-$(GST_API_VERSION) \
+ 	-lgstallocators-$(GST_API_VERSION) \
+ 	$(WAYLAND_LIBS) \
+-	$(top_builddir)/gst-libs/gst/wayland/libgstwayland-$(GST_API_VERSION).la
++	$(top_builddir)/gst-libs/gst/wayland/libgstwayland-$(GST_API_VERSION).la \
++        $(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 \
+ 	wlshmallocator.h \
+-	wlbuffer.h \
+-	wldisplay.h \
+-	wlwindow.h \
++        wldisplay-wlwindow-wlbuffer.h \
++        wldrm.h \
+ 	wlvideoformat.h \
+-	scaler-client-protocol.h
++	scaler-client-protocol.h \
++        wayland-drm-client-protocol.h
+ 
+ EXTRA_DIST = scaler.xml
+ CLEANFILES = scaler-protocol.c scaler-client-protocol.h
+diff --git a/ext/wayland/gstwaylandsink.c b/ext/wayland/gstwaylandsink.c
+index f4f34a8..3e8ff19 100644
+--- a/ext/wayland/gstwaylandsink.c
++++ b/ext/wayland/gstwaylandsink.c
+@@ -43,8 +43,14 @@
+ 
+ #include "gstwaylandsink.h"
+ #include "wlvideoformat.h"
+-#include "wlbuffer.h"
+ #include "wlshmallocator.h"
++#include "wldrm.h"
++
++#include <gst/drm/gstdrmallocator.h>
++#include "wayland-drm-client-protocol.h"
++#include <omap_drm.h>
++#include <omap_drmif.h>
++#include <wayland-client.h>
+ 
+ #include <gst/wayland/wayland.h>
+ #include <gst/video/videooverlay.h>
+@@ -60,7 +66,8 @@ enum
+ enum
+ {
+   PROP_0,
+-  PROP_DISPLAY
++  PROP_DISPLAY,
++  PROP_ALLOCATION
+ };
+ 
+ GST_DEBUG_CATEGORY (gstwayland_debug);
+@@ -75,6 +82,7 @@ static GstStaticPadTemplate sink_template = GST_STATIC_PAD_TEMPLATE ("sink",
+             "YUV9, YVU9, Y41B, I420, YV12, Y42B, v308 }"))
+     );
+ 
++
+ static void gst_wayland_sink_get_property (GObject * object,
+     guint prop_id, GValue * value, GParamSpec * pspec);
+ static void gst_wayland_sink_set_property (GObject * object,
+@@ -158,6 +166,11 @@ gst_wayland_sink_class_init (GstWaylandSinkClass * klass)
+       g_param_spec_string ("display", "Wayland Display name", "Wayland "
+           "display name to connect to, if not supplied via the GstContext",
+           NULL, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
++  
++  g_object_class_install_property (gobject_class, PROP_ALLOCATION,
++      g_param_spec_boolean ("use-drm", "Wayland Allocation name", "Wayland "
++          "Use DRM based memory for allocation",
++          FALSE, G_PARAM_WRITABLE));
+ }
+ 
+ static void
+@@ -197,6 +210,11 @@ gst_wayland_sink_set_property (GObject * object,
+       sink->display_name = g_value_dup_string (value);
+       GST_OBJECT_UNLOCK (sink);
+       break;
++   case PROP_ALLOCATION:
++      GST_OBJECT_LOCK (sink);
++      sink->use_drm = g_value_get_boolean (value);
++      GST_OBJECT_UNLOCK (sink);
++      break;     
+     default:
+       G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
+       break;
+@@ -281,6 +299,7 @@ gst_wayland_sink_find_display (GstWaylandSink * sink)
+         /* if the application didn't set a display, let's create it ourselves */
+         GST_OBJECT_LOCK (sink);
+         sink->display = gst_wl_display_new (sink->display_name, &error);
++        sink->display->use_drm = sink->use_drm;
+         GST_OBJECT_UNLOCK (sink);
+ 
+         if (error) {
+@@ -408,7 +427,6 @@ gst_wayland_sink_get_caps (GstBaseSink * bsink, GstCaps * filter)
+ 
+     caps = gst_caps_make_writable (caps);
+     gst_structure_set_value (gst_caps_get_structure (caps, 0), "format", &list);
+-
+     GST_DEBUG_OBJECT (sink, "display caps: %" GST_PTR_FORMAT, caps);
+   }
+ 
+@@ -426,6 +444,18 @@ gst_wayland_sink_get_caps (GstBaseSink * bsink, GstCaps * filter)
+   return caps;
+ }
+ 
++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 );
++}
++
++
+ static gboolean
+ gst_wayland_sink_set_caps (GstBaseSink * bsink, GstCaps * caps)
+ {
+@@ -436,11 +466,20 @@ gst_wayland_sink_set_caps (GstBaseSink * bsink, GstCaps * caps)
+   GArray *formats;
+   gint i;
+   GstStructure *structure;
++  GstStructure *s;
++  gboolean use_drm = 0;
++  int num_buffers = 0;
+ 
+   sink = GST_WAYLAND_SINK (bsink);
+ 
+   GST_DEBUG_OBJECT (sink, "set caps %" GST_PTR_FORMAT, caps);
+ 
++  wait_authentication (sink);
++
++  while (!sink->display->authenticated) {
++    GST_DEBUG_OBJECT (sink, "not authenticated yet");
++  } 
++
+   /* extract info from caps */
+   if (!gst_video_info_from_caps (&info, caps))
+     goto invalid_format;
+@@ -460,14 +499,27 @@ gst_wayland_sink_set_caps (GstBaseSink * bsink, GstCaps * caps)
+     goto unsupported_format;
+ 
+   /* create a new pool for the new configuration */
+-  newpool = gst_video_buffer_pool_new ();
++
++  s = gst_caps_get_structure (caps, 0);
++  gst_structure_get_boolean (s, "drm_mem", &use_drm);
++  gst_structure_get_int (s, "max-ref-frames", &num_buffers);
++  if (num_buffers )
++    num_buffers = num_buffers + 2;
++
++  newpool = gst_buffer_pool_new ();
+   if (!newpool)
+     goto pool_failed;
+ 
+   structure = gst_buffer_pool_get_config (newpool);
+-  gst_buffer_pool_config_set_params (structure, caps, info.size, 2, 0);
+-  gst_buffer_pool_config_set_allocator (structure, gst_wl_shm_allocator_get (),
+-      NULL);
++  gst_buffer_pool_config_set_params (structure, caps, info.size, 2, num_buffers);
++  if ( use_drm ) {
++    gst_buffer_pool_config_set_allocator (structure, gst_drm_allocator_get (),
++        NULL);
++    sink->display->use_drm = TRUE;
++  } else {
++    gst_buffer_pool_config_set_allocator (structure, gst_wl_shm_allocator_get (),
++        NULL);
++  }
+   if (!gst_buffer_pool_set_config (newpool, structure))
+     goto config_failed;
+ 
+@@ -518,8 +570,11 @@ gst_wayland_sink_propose_allocation (GstBaseSink * bsink, GstQuery * query)
+   /* we do have a pool for sure (created in set_caps),
+    * so let's propose it anyway, but also propose the allocator on its own */
+   gst_query_add_allocation_pool (query, sink->pool, size, min_bufs, max_bufs);
+-  gst_query_add_allocation_param (query, gst_wl_shm_allocator_get (), NULL);
+-
++  if (sink->display->use_drm) {
++    gst_query_add_allocation_param (query, gst_drm_allocator_get (), NULL);
++  } else {
++    gst_query_add_allocation_param (query, gst_wl_shm_allocator_get (), NULL);
++  }
+   gst_structure_free (config);
+ 
+   return TRUE;
+@@ -582,6 +637,10 @@ gst_wayland_sink_render (GstBaseSink * bsink, GstBuffer * buffer)
+ 
+   GST_LOG_OBJECT (sink, "render buffer %p", buffer);
+ 
++  if (sink->display) {
++    sink->display->crop = gst_buffer_get_video_crop_meta (buffer); 
++  }
++
+   if (G_UNLIKELY (!sink->window)) {
+     /* ask for window handle. Unlock render_lock while doing that because
+      * set_window_handle & friends will lock it in this context */
+@@ -623,6 +682,11 @@ gst_wayland_sink_render (GstBaseSink * bsink, GstBuffer * buffer)
+       wbuf = gst_wl_shm_memory_construct_wl_buffer (mem, sink->display,
+           &sink->video_info);
+     }
++    
++    if (gst_is_drm_memory (mem)) {
++      wbuf = gst_wl_drm_memory_construct_wl_buffer (mem, sink->display,
++          &sink->video_info);      
++    }
+ 
+     if (wbuf) {
+       gst_buffer_add_wl_buffer (buffer, wbuf, sink->display);
+diff --git a/ext/wayland/gstwaylandsink.h b/ext/wayland/gstwaylandsink.h
+index afbed40..c1092ce 100644
+--- a/ext/wayland/gstwaylandsink.h
++++ b/ext/wayland/gstwaylandsink.h
+@@ -27,8 +27,7 @@
+ 
+ #include <wayland-client.h>
+ 
+-#include "wldisplay.h"
+-#include "wlwindow.h"
++#include "wldisplay-wlwindow-wlbuffer.h"
+ 
+ G_BEGIN_DECLS
+ 
+@@ -61,6 +60,7 @@ struct _GstWaylandSink
+   GstVideoInfo video_info;
+ 
+   gchar *display_name;
++  gboolean use_drm;  
+ 
+   gboolean redraw_pending;
+   GMutex render_lock;
+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,
++};
++
+diff --git a/ext/wayland/wlbuffer.c b/ext/wayland/wlbuffer.c
+index 4ac99ef..0e38d2e 100644
+--- a/ext/wayland/wlbuffer.c
++++ b/ext/wayland/wlbuffer.c
+@@ -76,7 +76,7 @@
+  * as soon as we remove the reference that GstWlDisplay holds.
+  */
+ 
+-#include "wlbuffer.h"
++#include "wldisplay-wlwindow-wlbuffer.h"
+ 
+ GST_DEBUG_CATEGORY_EXTERN (gstwayland_debug);
+ #define GST_CAT_DEFAULT gstwayland_debug
+diff --git a/ext/wayland/wlbuffer.h b/ext/wayland/wlbuffer.h
+deleted file mode 100644
+index cbb50f7..0000000
+--- a/ext/wayland/wlbuffer.h
++++ /dev/null
+@@ -1,67 +0,0 @@
+-/* GStreamer Wayland video sink
+- *
+- * Copyright (C) 2014 Collabora Ltd.
+- *
+- * 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., 51 Franklin Street, Fifth Floor,
+- * Boston, MA 02110-1301 USA.
+- */
+-
+-#ifndef __GST_WL_BUFFER_H__
+-#define __GST_WL_BUFFER_H__
+-
+-#include "wldisplay.h"
+-
+-G_BEGIN_DECLS
+-
+-#define GST_TYPE_WL_BUFFER                  (gst_wl_buffer_get_type ())
+-#define GST_WL_BUFFER(obj)                  (G_TYPE_CHECK_INSTANCE_CAST ((obj), GST_TYPE_WL_BUFFER, GstWlBuffer))
+-#define GST_IS_WL_BUFFER(obj)               (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GST_TYPE_WL_BUFFER))
+-#define GST_WL_BUFFER_CLASS(klass)          (G_TYPE_CHECK_CLASS_CAST ((klass), GST_TYPE_WL_BUFFER, GstWlBufferClass))
+-#define GST_IS_WL_BUFFER_CLASS(klass)       (G_TYPE_CHECK_CLASS_TYPE ((klass), GST_TYPE_WL_BUFFER))
+-#define GST_WL_BUFFER_GET_CLASS(obj)        (G_TYPE_INSTANCE_GET_CLASS ((obj), GST_TYPE_WL_BUFFER, GstWlBufferClass))
+-
+-typedef struct _GstWlBuffer GstWlBuffer;
+-typedef struct _GstWlBufferClass GstWlBufferClass;
+-
+-struct _GstWlBuffer
+-{
+-  GObject parent_instance;
+-
+-  struct wl_buffer * wlbuffer;
+-  GstBuffer *gstbuffer;
+-
+-  GstWlDisplay *display;
+-
+-  gboolean used_by_compositor;
+-};
+-
+-struct _GstWlBufferClass
+-{
+-  GObjectClass parent_class;
+-};
+-
+-GType gst_wl_buffer_get_type (void);
+-
+-GstWlBuffer * gst_buffer_add_wl_buffer (GstBuffer * gstbuffer,
+-    struct wl_buffer * wlbuffer, GstWlDisplay * display);
+-GstWlBuffer * gst_buffer_get_wl_buffer (GstBuffer * gstbuffer);
+-
+-void gst_wl_buffer_force_release_and_unref (GstWlBuffer * self);
+-
+-void gst_wl_buffer_attach (GstWlBuffer * self, struct wl_surface *surface);
+-
+-G_END_DECLS
+-
+-#endif /* __GST_WL_BUFFER_H__ */
+diff --git a/ext/wayland/wldisplay-wlwindow-wlbuffer.h b/ext/wayland/wldisplay-wlwindow-wlbuffer.h
+new file mode 100644
+index 0000000..684d145
+--- /dev/null
++++ b/ext/wayland/wldisplay-wlwindow-wlbuffer.h
+@@ -0,0 +1,216 @@
++/* GStreamer Wayland video sink
++ *
++ * Copyright (C) 2014 Collabora Ltd.
++ *
++ * 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., 51 Franklin Street, Fifth Floor,
++ * Boston, MA 02110-1301 USA.
++ */
++
++#ifndef __GST_WL_DISPLAY_WL_WINDOW_H__
++#define __GST_WL_DISPLAY_WL_WINDOW_H__
++
++#include <gst/gst.h>
++#include <stdlib.h>
++#include <stdio.h>
++#include <wayland-client.h>
++#include "scaler-client-protocol.h"
++#include <gst/video/video.h>
++#include <gst/video/gstvideometa.h>
++
++G_BEGIN_DECLS
++
++#define GST_TYPE_WL_DISPLAY                  (gst_wl_display_get_type ())
++#define GST_WL_DISPLAY(obj)                  (G_TYPE_CHECK_INSTANCE_CAST ((obj), GST_TYPE_WL_DISPLAY, GstWlDisplay))
++#define GST_IS_WL_DISPLAY(obj)               (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GST_TYPE_WL_DISPLAY))
++#define GST_WL_DISPLAY_CLASS(klass)          (G_TYPE_CHECK_CLASS_CAST ((klass), GST_TYPE_WL_DISPLAY, GstWlDisplayClass))
++#define GST_IS_WL_DISPLAY_CLASS(klass)       (G_TYPE_CHECK_CLASS_TYPE ((klass), GST_TYPE_WL_DISPLAY))
++#define GST_WL_DISPLAY_GET_CLASS(obj)        (G_TYPE_INSTANCE_GET_CLASS ((obj), GST_TYPE_WL_DISPLAY, GstWlDisplayClass))
++
++#define GST_TYPE_WL_WINDOW                  (gst_wl_window_get_type ())
++#define GST_WL_WINDOW(obj)                  (G_TYPE_CHECK_INSTANCE_CAST ((obj), GST_TYPE_WL_WINDOW, GstWlWindow))
++#define GST_IS_WL_WINDOW(obj)               (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GST_TYPE_WL_WINDOW))
++#define GST_WL_WINDOW_CLASS(klass)          (G_TYPE_CHECK_CLASS_CAST ((klass), GST_TYPE_WL_WINDOW, GstWlWindowClass))
++#define GST_IS_WL_WINDOW_CLASS(klass)       (G_TYPE_CHECK_CLASS_TYPE ((klass), GST_TYPE_WL_WINDOW))
++#define GST_WL_WINDOW_GET_CLASS(obj)        (G_TYPE_INSTANCE_GET_CLASS ((obj), GST_TYPE_WL_WINDOW, GstWlWindowClass))
++
++#define GST_TYPE_WL_BUFFER                  (gst_wl_buffer_get_type ())
++#define GST_WL_BUFFER(obj)                  (G_TYPE_CHECK_INSTANCE_CAST ((obj), GST_TYPE_WL_BUFFER, GstWlBuffer))
++#define GST_IS_WL_BUFFER(obj)               (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GST_TYPE_WL_BUFFER))
++#define GST_WL_BUFFER_CLASS(klass)          (G_TYPE_CHECK_CLASS_CAST ((klass), GST_TYPE_WL_BUFFER, GstWlBufferClass))
++#define GST_IS_WL_BUFFER_CLASS(klass)       (G_TYPE_CHECK_CLASS_TYPE ((klass), GST_TYPE_WL_BUFFER))
++#define GST_WL_BUFFER_GET_CLASS(obj)        (G_TYPE_INSTANCE_GET_CLASS ((obj), GST_TYPE_WL_BUFFER, GstWlBufferClass))
++
++typedef struct _GstWlBuffer GstWlBuffer;
++typedef struct _GstWlBufferClass GstWlBufferClass;
++
++typedef struct _GstWlWindow GstWlWindow;
++typedef struct _GstWlWindowClass GstWlWindowClass;
++
++typedef struct _GstWlDisplay GstWlDisplay;
++typedef struct _GstWlDisplayClass GstWlDisplayClass;
++
++struct _GstWlBuffer
++{
++  GObject parent_instance;
++
++  struct wl_buffer * wlbuffer;
++  GstBuffer *gstbuffer;
++
++  GstWlDisplay *display;
++
++  gboolean used_by_compositor;
++};
++
++struct _GstWlBufferClass
++{
++  GObjectClass parent_class;
++};
++
++GType gst_wl_buffer_get_type (void);
++
++GstWlBuffer * gst_buffer_add_wl_buffer (GstBuffer * gstbuffer,
++    struct wl_buffer * wlbuffer, GstWlDisplay * display);
++GstWlBuffer * gst_buffer_get_wl_buffer (GstBuffer * gstbuffer);
++
++void gst_wl_buffer_force_release_and_unref (GstWlBuffer * self);
++
++void gst_wl_buffer_attach (GstWlBuffer * self, struct wl_surface *surface);
++
++
++struct touch_point
++{
++  int32_t id;
++  struct wl_list link;
++};
++       
++struct input
++{
++  GstWlDisplay *display;
++  struct wl_seat *seat;
++  struct wl_pointer *pointer;
++  struct wl_touch *touch;
++  struct wl_list touch_point_list;
++  GstWlWindow *pointer_focus;
++  GstWlWindow *touch_focus;
++  struct wl_list link; 
++  GstWlWindow *grab;      
++};
++
++
++struct _GstWlWindow
++{
++  GObject parent_instance;
++
++  GstWlDisplay *display;
++  struct wl_surface *area_surface;
++  struct wl_subsurface *area_subsurface;
++  struct wl_viewport *area_viewport;
++  struct wl_surface *video_surface;
++  struct wl_subsurface *video_subsurface;
++  struct wl_viewport *video_viewport;
++  struct wl_shell_surface *shell_surface;
++
++  /* the size and position of the area_(sub)surface */
++  GstVideoRectangle render_rectangle;
++  /* the size of the video in the buffers */
++  gint video_width, video_height;
++  /* the size of the video_(sub)surface */
++  gint surface_width, surface_height;
++};
++
++struct _GstWlWindowClass
++{
++  GObjectClass parent_class;
++};
++
++GType gst_wl_window_get_type (void);
++
++GstWlWindow *gst_wl_window_new_toplevel (GstWlDisplay * display,
++        const GstVideoInfo * info);
++GstWlWindow *gst_wl_window_new_in_surface (GstWlDisplay * display,
++        struct wl_surface * parent);
++
++GstWlDisplay *gst_wl_window_get_display (GstWlWindow * window);
++struct wl_surface *gst_wl_window_get_wl_surface (GstWlWindow * window);
++gboolean gst_wl_window_is_toplevel (GstWlWindow *window);
++
++void gst_wl_window_render (GstWlWindow * window, GstWlBuffer * buffer,
++        const GstVideoInfo * info);
++void gst_wl_window_set_render_rectangle (GstWlWindow * window, gint x, gint y,
++        gint w, gint h);
++
++
++struct _GstWlDisplay
++{
++  GObject parent_instance;
++
++  /* public objects */
++  struct wl_display *display;
++  struct wl_event_queue *queue;
++
++  /* globals */
++  struct wl_registry *registry;
++  struct wl_compositor *compositor;
++  struct wl_subcompositor *subcompositor;
++  struct wl_shell *shell;
++  struct wl_shm *shm;
++  struct wl_drm *drm;
++  struct wl_scaler *scaler;
++  GArray *shm_formats;
++
++  /* private */
++  gboolean own_display;
++  GThread *thread;
++  GstPoll *wl_fd_poll;
++
++  GMutex buffers_mutex;
++  GHashTable *buffers;
++  gboolean shutting_down;
++
++  /* 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;
++  gboolean use_drm;
++
++  struct wl_list input_list;
++  int seat_version;
++  uint32_t serial;
++
++  GstVideoCropMeta *crop;
++};
++
++struct _GstWlDisplayClass
++{
++  GObjectClass parent_class;
++};
++
++GType gst_wl_display_get_type (void);
++
++GstWlDisplay *gst_wl_display_new (const gchar * name, GError ** error);
++GstWlDisplay *gst_wl_display_new_existing (struct wl_display * display,
++    gboolean take_ownership, GError ** error);
++
++/* see wlbuffer.c for explanation */
++void gst_wl_display_register_buffer (GstWlDisplay * self, gpointer buf);
++void gst_wl_display_unregister_buffer (GstWlDisplay * self, gpointer buf);
++
++G_END_DECLS
++
++#endif /* __GST_WL_DISPLAY_WL_WINDOW_H__ */
+diff --git a/ext/wayland/wldisplay.c b/ext/wayland/wldisplay.c
+index 3318095..2f58fd2 100644
+--- a/ext/wayland/wldisplay.c
++++ b/ext/wayland/wldisplay.c
+@@ -22,9 +22,15 @@
+ #include <config.h>
+ #endif
+ 
+-#include "wldisplay.h"
+-#include "wlbuffer.h"
+-
++#include "wldisplay-wlwindow-wlbuffer.h"
++
++#include <wayland-client-protocol.h>
++#include "wayland-drm-client-protocol.h"
++#include <linux/input.h>
++#include <omap_drm.h>
++#include <omap_drmif.h>
++#include <fcntl.h>
++#include <unistd.h>
+ #include <errno.h>
+ 
+ GST_DEBUG_CATEGORY_EXTERN (gstwayland_debug);
+@@ -33,6 +39,8 @@ GST_DEBUG_CATEGORY_EXTERN (gstwayland_debug);
+ G_DEFINE_TYPE (GstWlDisplay, gst_wl_display, G_TYPE_OBJECT);
+ 
+ static void gst_wl_display_finalize (GObject * gobject);
++static void input_grab (struct input *input, GstWlWindow *window);
++static void input_ungrab (struct input *input);
+ 
+ static void
+ gst_wl_display_class_init (GstWlDisplayClass * klass)
+@@ -45,12 +53,62 @@ static void
+ gst_wl_display_init (GstWlDisplay * self)
+ {
+   self->shm_formats = g_array_new (FALSE, FALSE, sizeof (uint32_t));
++  self->fd = -1;
++  self->use_drm = FALSE;
+   self->wl_fd_poll = gst_poll_new (TRUE);
+   self->buffers = g_hash_table_new (g_direct_hash, g_direct_equal);
+   g_mutex_init (&self->buffers_mutex);
+ }
+ 
+ static void
++input_grab (struct input *input, GstWlWindow *window)
++{
++  input->grab = window;
++}
++
++static void
++input_ungrab (struct input *input)
++{
++  input->grab = NULL;
++}
++
++static void
++input_remove_pointer_focus (struct input *input)
++{
++  GstWlWindow *window = input->pointer_focus;
++
++  if (!window)
++    return;
++
++  input->pointer_focus = NULL;
++}
++
++static void
++input_destroy (struct input *input)
++{
++  input_remove_pointer_focus (input);
++
++  if (input->display->seat_version >= 3) {
++    if (input->pointer)
++      wl_pointer_release (input->pointer);
++  }
++
++  wl_list_remove (&input->link);
++  wl_seat_destroy (input->seat);
++  free (input);
++}
++
++static void
++display_destroy_inputs (GstWlDisplay *display)
++{
++  struct input *tmp;
++  struct input *input;
++
++  wl_list_for_each_safe (input, tmp, &display->input_list, link)
++      input_destroy (input);
++}
++
++static void
+ gst_wl_display_finalize (GObject * gobject)
+ {
+   GstWlDisplay *self = GST_WL_DISPLAY (gobject);
+@@ -71,13 +129,26 @@ gst_wl_display_finalize (GObject * gobject)
+   g_hash_table_remove_all (self->buffers);
+ 
+   g_array_unref (self->shm_formats);
++
++  if (self->dev) {
++    omap_device_del (self->dev);
++    self->dev = NULL;
++  }
++  if (self->fd !=-1)
++    close (self->fd);
++
+   gst_poll_free (self->wl_fd_poll);
+   g_hash_table_unref (self->buffers);
+   g_mutex_clear (&self->buffers_mutex);
+ 
++  display_destroy_inputs (self);
++
+   if (self->shm)
+     wl_shm_destroy (self->shm);
+ 
++  if (self->drm)
++    wl_drm_destroy (self->drm);
++
+   if (self->shell)
+     wl_shell_destroy (self->shell);
+ 
+@@ -138,12 +209,277 @@ shm_format (void *data, struct wl_shm *wl_shm, uint32_t format)
+   GstWlDisplay *self = data;
+ 
+   g_array_append_val (self->shm_formats, format);
++  GST_DEBUG ("shm got format: %" GST_FOURCC_FORMAT, GST_FOURCC_ARGS (format));
+ }
+ 
+ static const struct wl_shm_listener shm_listener = {
+   shm_format
+ };
+ 
++/* For wl_drm_listener */
++
++static void
++drm_handle_device (void *data, struct wl_drm *drm, const char *device)
++{
++  GstWlDisplay *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);
++    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)
++{
++  GstWlDisplay *self = data;
++  g_array_append_val (self->shm_formats, format);
++  GST_DEBUG ("drm got format: %" GST_FOURCC_FORMAT, GST_FOURCC_ARGS (format));
++}
++
++static void
++drm_handle_authenticated (void *data, struct wl_drm *drm)
++{
++  GstWlDisplay *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
++pointer_handle_enter (void *data, struct wl_pointer *pointer,
++    uint32_t serial, struct wl_surface *surface,
++    wl_fixed_t sx_w, wl_fixed_t sy_w)
++{
++  struct input *input = data;
++
++  if (!surface) {
++    /* enter event for a window we've just destroyed */
++    return;
++  }
++
++  input->display->serial = serial;
++  input->pointer_focus = wl_surface_get_user_data (surface);
++}
++
++static void
++pointer_handle_leave (void *data, struct wl_pointer *pointer,
++    uint32_t serial, struct wl_surface *surface)
++{
++  struct input *input = data;
++
++  input_remove_pointer_focus (input);
++}
++
++static void
++pointer_handle_motion (void *data, struct wl_pointer *pointer,
++    uint32_t time, wl_fixed_t sx_w, wl_fixed_t sy_w)
++{
++  struct input *input = data;
++  GstWlWindow *window = input->pointer_focus;
++
++  if (!window)
++    return;
++
++  if (input->grab)
++    wl_shell_surface_move (input->grab->shell_surface, input->seat,
++        input->display->serial);
++
++}
++
++static void
++pointer_handle_button (void *data, struct wl_pointer *pointer, uint32_t serial,
++    uint32_t time, uint32_t button, uint32_t state_w)
++{
++  struct input *input = data;
++  enum wl_pointer_button_state state = state_w;
++  input->display->serial = serial;
++
++  if (button == BTN_LEFT) {
++    if (state == WL_POINTER_BUTTON_STATE_PRESSED)
++      input_grab (input, input->pointer_focus);
++
++    if (input->grab && state == WL_POINTER_BUTTON_STATE_RELEASED)
++      input_ungrab (input);
++  }
++
++  if (input->grab)
++    wl_shell_surface_move (input->grab->shell_surface, input->seat,
++        input->display->serial);
++}
++
++static void
++pointer_handle_axis (void *data, struct wl_pointer *pointer,
++    uint32_t time, uint32_t axis, wl_fixed_t value)
++{
++}
++
++static const struct wl_pointer_listener pointer_listener = {
++  pointer_handle_enter,
++  pointer_handle_leave,
++  pointer_handle_motion,
++  pointer_handle_button,
++  pointer_handle_axis,
++};
++
++static void
++touch_handle_down (void *data, struct wl_touch *wl_touch,
++    uint32_t serial, uint32_t time, struct wl_surface *surface,
++    int32_t id, wl_fixed_t x_w, wl_fixed_t y_w)
++{
++  struct input *input = data;
++  struct touch_point *tp;
++
++  input->display->serial = serial;
++  input->touch_focus = wl_surface_get_user_data (surface);
++  if (!input->touch_focus) {
++    return;
++  }
++
++  tp = malloc (sizeof *tp);
++  if (tp) {
++    tp->id = id;
++    wl_list_insert (&input->touch_point_list, &tp->link);
++    wl_shell_surface_move (input->touch_focus->shell_surface, input->seat,
++        serial);
++  }
++}
++
++static void
++touch_handle_motion (void *data, struct wl_touch *wl_touch,
++    uint32_t time, int32_t id, wl_fixed_t x_w, wl_fixed_t y_w)
++{
++  struct input *input = data;
++  struct touch_point *tp;
++
++
++  if (!input->touch_focus) {
++    return;
++  }
++  wl_list_for_each (tp, &input->touch_point_list, link) {
++    if (tp->id != id)
++      continue;
++
++    wl_shell_surface_move (input->touch_focus->shell_surface, input->seat,
++        input->display->serial);
++
++    return;
++  }
++}
++
++static void
++touch_handle_frame (void *data, struct wl_touch *wl_touch)
++{
++}
++
++static void
++touch_handle_cancel (void *data, struct wl_touch *wl_touch)
++{
++}
++
++static void
++touch_handle_up (void *data, struct wl_touch *wl_touch,
++    uint32_t serial, uint32_t time, int32_t id)
++{
++  struct input *input = data;
++  struct touch_point *tp, *tmp;
++
++  if (!input->touch_focus) {
++    return;
++  }
++
++  wl_list_for_each_safe (tp, tmp, &input->touch_point_list, link) {
++    if (tp->id != id)
++      continue;
++
++    wl_list_remove (&tp->link);
++    free (tp);
++
++    return;
++  }
++}
++
++static const struct wl_touch_listener touch_listener = {
++  touch_handle_down,
++  touch_handle_up,
++  touch_handle_motion,
++  touch_handle_frame,
++  touch_handle_cancel,
++};
++
++
++static void
++seat_handle_capabilities (void *data, struct wl_seat *seat,
++    enum wl_seat_capability caps)
++{
++  struct input *input = data;
++
++  if ((caps & WL_SEAT_CAPABILITY_POINTER) && !input->pointer) {
++    input->pointer = wl_seat_get_pointer (seat);
++    wl_pointer_set_user_data (input->pointer, input);
++    wl_pointer_add_listener (input->pointer, &pointer_listener, input);
++  } else if (!(caps & WL_SEAT_CAPABILITY_POINTER) && input->pointer) {
++    wl_pointer_destroy (input->pointer);
++    input->pointer = NULL;
++  }
++
++  if ((caps & WL_SEAT_CAPABILITY_TOUCH) && !input->touch) {
++    input->touch = wl_seat_get_touch (seat);
++    wl_touch_set_user_data (input->touch, input);
++    wl_touch_add_listener (input->touch, &touch_listener, input);
++  } else if (!(caps & WL_SEAT_CAPABILITY_TOUCH) && input->touch) {
++    wl_touch_destroy (input->touch);
++    input->touch = NULL;
++  }
++}
++
++static void
++seat_handle_name (void *data, struct wl_seat *seat, const char *name)
++{
++ 
++}
++
++static const struct wl_seat_listener seat_listener = {
++  seat_handle_capabilities,
++  seat_handle_name
++};
++
++static void
++display_add_input (GstWlDisplay *d, uint32_t id)
++{
++  struct input *input;
++
++  input = calloc (1, sizeof (*input));
++  if (input == NULL) {
++    fprintf (stderr, "%s: out of memory\n", "gst-wayland-sink");
++    exit (EXIT_FAILURE);
++  }
++  input->display = d;
++  input->seat = wl_registry_bind (d->registry, id, &wl_seat_interface,
++      MAX (d->seat_version, 3));
++  input->touch_focus = NULL;
++  input->pointer_focus = NULL;
++  wl_list_init (&input->touch_point_list);
++  wl_list_insert (d->input_list.prev, &input->link);
++
++  wl_seat_add_listener (input->seat, &seat_listener, input);
++  wl_seat_set_user_data (input->seat, input);
++
++}
++
++
+ static void
+ registry_handle_global (void *data, struct wl_registry *registry,
+     uint32_t id, const char *interface, uint32_t version)
+@@ -161,6 +497,12 @@ registry_handle_global (void *data, struct wl_registry *registry,
+   } else if (g_strcmp0 (interface, "wl_shm") == 0) {
+     self->shm = wl_registry_bind (registry, id, &wl_shm_interface, 1);
+     wl_shm_add_listener (self->shm, &shm_listener, self);
++  } else if (g_strcmp0 (interface, "wl_drm") == 0) {
++    self->drm = wl_registry_bind (registry, id, &wl_drm_interface, 1);
++    wl_drm_add_listener (self->drm, &drm_listener, self);
++  } else if (g_strcmp0 (interface, "wl_seat") == 0) {
++    self->seat_version = version;
++    display_add_input (self, id);
+   } else if (g_strcmp0 (interface, "wl_scaler") == 0) {
+     self->scaler = wl_registry_bind (registry, id, &wl_scaler_interface, 2);
+   }
+@@ -238,6 +580,7 @@ gst_wl_display_new_existing (struct wl_display * display,
+   self->own_display = take_ownership;
+ 
+   self->queue = wl_display_create_queue (self->display);
++  wl_list_init (&self->input_list);
+   self->registry = wl_display_get_registry (self->display);
+   wl_proxy_set_queue ((struct wl_proxy *) self->registry, self->queue);
+   wl_registry_add_listener (self->registry, &registry_listener, self);
+@@ -266,6 +609,7 @@ gst_wl_display_new_existing (struct wl_display * display,
+   VERIFY_INTERFACE_EXISTS (subcompositor, "wl_subcompositor");
+   VERIFY_INTERFACE_EXISTS (shell, "wl_shell");
+   VERIFY_INTERFACE_EXISTS (shm, "wl_shm");
++  VERIFY_INTERFACE_EXISTS (drm, "wl_drm");
+   VERIFY_INTERFACE_EXISTS (scaler, "wl_scaler");
+ 
+ #undef VERIFY_INTERFACE_EXISTS
+diff --git a/ext/wayland/wldisplay.h b/ext/wayland/wldisplay.h
+deleted file mode 100644
+index e9df749..0000000
+--- a/ext/wayland/wldisplay.h
++++ /dev/null
+@@ -1,84 +0,0 @@
+-/* GStreamer Wayland video sink
+- *
+- * Copyright (C) 2014 Collabora Ltd.
+- *
+- * 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., 51 Franklin Street, Fifth Floor,
+- * Boston, MA 02110-1301 USA.
+- */
+-
+-#ifndef __GST_WL_DISPLAY_H__
+-#define __GST_WL_DISPLAY_H__
+-
+-#include <gst/gst.h>
+-#include <wayland-client.h>
+-#include "scaler-client-protocol.h"
+-
+-G_BEGIN_DECLS
+-
+-#define GST_TYPE_WL_DISPLAY                  (gst_wl_display_get_type ())
+-#define GST_WL_DISPLAY(obj)                  (G_TYPE_CHECK_INSTANCE_CAST ((obj), GST_TYPE_WL_DISPLAY, GstWlDisplay))
+-#define GST_IS_WL_DISPLAY(obj)               (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GST_TYPE_WL_DISPLAY))
+-#define GST_WL_DISPLAY_CLASS(klass)          (G_TYPE_CHECK_CLASS_CAST ((klass), GST_TYPE_WL_DISPLAY, GstWlDisplayClass))
+-#define GST_IS_WL_DISPLAY_CLASS(klass)       (G_TYPE_CHECK_CLASS_TYPE ((klass), GST_TYPE_WL_DISPLAY))
+-#define GST_WL_DISPLAY_GET_CLASS(obj)        (G_TYPE_INSTANCE_GET_CLASS ((obj), GST_TYPE_WL_DISPLAY, GstWlDisplayClass))
+-
+-typedef struct _GstWlDisplay GstWlDisplay;
+-typedef struct _GstWlDisplayClass GstWlDisplayClass;
+-
+-struct _GstWlDisplay
+-{
+-  GObject parent_instance;
+-
+-  /* public objects */
+-  struct wl_display *display;
+-  struct wl_event_queue *queue;
+-
+-  /* globals */
+-  struct wl_registry *registry;
+-  struct wl_compositor *compositor;
+-  struct wl_subcompositor *subcompositor;
+-  struct wl_shell *shell;
+-  struct wl_shm *shm;
+-  struct wl_scaler *scaler;
+-  GArray *shm_formats;
+-
+-  /* private */
+-  gboolean own_display;
+-  GThread *thread;
+-  GstPoll *wl_fd_poll;
+-
+-  GMutex buffers_mutex;
+-  GHashTable *buffers;
+-  gboolean shutting_down;
+-};
+-
+-struct _GstWlDisplayClass
+-{
+-  GObjectClass parent_class;
+-};
+-
+-GType gst_wl_display_get_type (void);
+-
+-GstWlDisplay *gst_wl_display_new (const gchar * name, GError ** error);
+-GstWlDisplay *gst_wl_display_new_existing (struct wl_display * display,
+-    gboolean take_ownership, GError ** error);
+-
+-/* see wlbuffer.c for explanation */
+-void gst_wl_display_register_buffer (GstWlDisplay * self, gpointer buf);
+-void gst_wl_display_unregister_buffer (GstWlDisplay * self, gpointer buf);
+-
+-G_END_DECLS
+-
+-#endif /* __GST_WL_DISPLAY_H__ */
+diff --git a/ext/wayland/wldrm.c b/ext/wayland/wldrm.c
+new file mode 100644
+index 0000000..3dc9c21
+--- /dev/null
++++ b/ext/wayland/wldrm.c
+@@ -0,0 +1,69 @@
++#include "wldisplay-wlwindow-wlbuffer.h"
++#include <gst/drm/gstdrmallocator.h>
++#include "wayland-drm-client-protocol.h"
++#include <omap_drm.h>
++#include <omap_drmif.h>
++#include <wayland-client.h>
++
++struct wl_buffer *
++gst_wl_drm_memory_construct_wl_buffer (GstMemory * mem, GstWlDisplay * display,
++    const GstVideoInfo * info)
++{
++  gint video_width = GST_VIDEO_INFO_WIDTH (info);
++  gint video_height = GST_VIDEO_INFO_HEIGHT (info);
++  int fd = -1;
++  struct omap_bo *bo;
++  struct wl_buffer *buffer;
++
++  /* 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 (video_width), GST_ROUND_UP_4 (video_width), 0,
++  };
++  uint32_t offsets[3] = {
++    0, strides[0] * video_height, 0
++  };
++
++  fd = gst_fd_memory_get_fd (mem);
++
++  if (fd < 0 ) {
++    GST_DEBUG ("Invalid fd");
++    return NULL;
++  }
++
++  bo = omap_bo_from_dmabuf (display->dev, fd);
++
++  struct drm_gem_flink req = {
++                  .handle = omap_bo_handle(bo),
++  };
++
++  int ret;
++  ret = drmIoctl(display->fd, DRM_IOCTL_GEM_FLINK, &req);
++  if (ret) {
++    GST_DEBUG ("could not get name, DRM_IOCTL_GEM_FLINK returned %d", ret);
++    return NULL;
++  }
++
++  name = req.name;
++
++ GST_LOG ("width = %d , height = %d , fourcc = %d ",  video_width, video_height, fourcc );
++ buffer = wl_drm_create_planar_buffer (display->drm, name,
++      video_width, video_height, fourcc,
++      offsets[0], strides[0],
++      offsets[1], strides[1],
++      offsets[2], strides[2]);
++
++  GST_DEBUG ("create planar buffer: %p (name=%d)",
++      buffer, name);
++
++  return buffer;
++}
++
+diff --git a/ext/wayland/wldrm.h b/ext/wayland/wldrm.h
+new file mode 100644
+index 0000000..9751029
+--- /dev/null
++++ b/ext/wayland/wldrm.h
+@@ -0,0 +1,3 @@
++struct wl_buffer *
++gst_wl_drm_memory_construct_wl_buffer (GstMemory * mem, GstWlDisplay * display,
++    const GstVideoInfo * info);
+diff --git a/ext/wayland/wlshmallocator.h b/ext/wayland/wlshmallocator.h
+index 07ae17f..2860fc3 100644
+--- a/ext/wayland/wlshmallocator.h
++++ b/ext/wayland/wlshmallocator.h
+@@ -26,7 +26,7 @@
+ #include <gst/video/video.h>
+ #include <gst/allocators/allocators.h>
+ #include <wayland-client-protocol.h>
+-#include "wldisplay.h"
++#include "wldisplay-wlwindow-wlbuffer.h"
+ 
+ G_BEGIN_DECLS
+ 
+diff --git a/ext/wayland/wlvideoformat.c b/ext/wayland/wlvideoformat.c
+index 1302da6..aa336aa 100644
+--- a/ext/wayland/wlvideoformat.c
++++ b/ext/wayland/wlvideoformat.c
+@@ -106,6 +106,10 @@ gst_wl_shm_format_to_video_format (enum wl_shm_format wl_format)
+ const gchar *
+ gst_wl_shm_format_to_string (enum wl_shm_format wl_format)
+ {
+-  return gst_video_format_to_string
+-      (gst_wl_shm_format_to_video_format (wl_format));
++  GstVideoFormat fmt = gst_wl_shm_format_to_video_format (wl_format);
++  if (fmt != GST_VIDEO_FORMAT_UNKNOWN) {
++    return gst_video_format_to_string (fmt);
++  } else {
++    return NULL;
++  }
+ }
+diff --git a/ext/wayland/wlwindow.c b/ext/wayland/wlwindow.c
+index 79000ae..f7e3324 100644
+--- a/ext/wayland/wlwindow.c
++++ b/ext/wayland/wlwindow.c
+@@ -24,9 +24,10 @@
+ #include <config.h>
+ #endif
+ 
+-#include "wlwindow.h"
++#include "wldisplay-wlwindow-wlbuffer.h"
+ #include "wlshmallocator.h"
+-#include "wlbuffer.h"
++#include "wldrm.h"
++#include <gst/drm/gstdrmallocator.h>
+ 
+ GST_DEBUG_CATEGORY_EXTERN (gstwayland_debug);
+ #define GST_CAT_DEFAULT gstwayland_debug
+@@ -111,6 +112,8 @@ gst_wl_window_new_internal (GstWlDisplay * display)
+ 
+   window->area_surface = wl_compositor_create_surface (display->compositor);
+   window->video_surface = wl_compositor_create_surface (display->compositor);
++  wl_surface_set_user_data (window->area_surface, window);
++  wl_surface_set_user_data (window->video_surface, window);
+ 
+   wl_proxy_set_queue ((struct wl_proxy *) window->area_surface, display->queue);
+   wl_proxy_set_queue ((struct wl_proxy *) window->video_surface,
+@@ -126,6 +129,21 @@ gst_wl_window_new_internal (GstWlDisplay * display)
+       window->area_surface);
+   window->video_viewport = wl_scaler_get_viewport (display->scaler,
+       window->video_surface);
++  if (display->crop) {
++    GST_DEBUG ("Setting source crop : %d %d %d %d",display->crop->x, display->crop->y,
++                    display->crop->width, display->crop->height);
++    wl_viewport_set_source (window->area_viewport,
++                                        wl_fixed_from_int(display->crop->x),
++                                        wl_fixed_from_int(display->crop->y),
++                                        wl_fixed_from_int(display->crop->width),
++                                        wl_fixed_from_int(display->crop->height));
++    wl_viewport_set_source (window->video_viewport,
++                                        wl_fixed_from_int(display->crop->x),
++                                        wl_fixed_from_int(display->crop->y),
++                                        wl_fixed_from_int(display->crop->width),
++                                        wl_fixed_from_int(display->crop->height));
++
++  }
+ 
+   /* draw the area_subsurface */
+   gst_video_info_set_format (&info,
+@@ -136,14 +154,25 @@ gst_wl_window_new_internal (GstWlDisplay * display)
+       GST_VIDEO_FORMAT_BGRx,
+ #endif
+       1, 1);
+-
+-  buf = gst_buffer_new_allocate (gst_wl_shm_allocator_get (), info.size, NULL);
++  if (display->use_drm) {
++    buf = gst_buffer_new_allocate (gst_drm_allocator_get (), info.size, NULL);
++  } else {
++    buf = gst_buffer_new_allocate (gst_wl_shm_allocator_get (), info.size, NULL);
++  } 
+   gst_buffer_map (buf, &mapinfo, GST_MAP_WRITE);
+-  *((guint32 *) mapinfo.data) = 0;      /* paint it black */
+-  gst_buffer_unmap (buf, &mapinfo);
+-  wlbuf =
+-      gst_wl_shm_memory_construct_wl_buffer (gst_buffer_peek_memory (buf, 0),
+-      display, &info);
++   *((guint32 *) mapinfo.data) = 0;      /* paint it black */
++   gst_buffer_unmap (buf, &mapinfo);
++   
++  if (display->use_drm) {
++     wlbuf =
++       gst_wl_drm_memory_construct_wl_buffer (gst_buffer_peek_memory (buf, 0),
++       display, &info);
++   } else {
++     wlbuf =
++       gst_wl_shm_memory_construct_wl_buffer (gst_buffer_peek_memory (buf, 0),
++       display, &info);
++   }
++
+   gwlbuf = gst_buffer_add_wl_buffer (buf, wlbuf, display);
+   gst_wl_buffer_attach (gwlbuf, window->area_surface);
+ 
+diff --git a/ext/wayland/wlwindow.h b/ext/wayland/wlwindow.h
+deleted file mode 100644
+index e22cb26..0000000
+--- a/ext/wayland/wlwindow.h
++++ /dev/null
+@@ -1,84 +0,0 @@
+-/* GStreamer Wayland video sink
+- *
+- * Copyright (C) 2014 Collabora Ltd.
+- *
+- * 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., 51 Franklin Street, Fifth Floor,
+- * Boston, MA 02110-1301 USA.
+- */
+-
+-#ifndef __GST_WL_WINDOW_H__
+-#define __GST_WL_WINDOW_H__
+-
+-#include "wldisplay.h"
+-#include "wlbuffer.h"
+-#include <gst/video/video.h>
+-
+-G_BEGIN_DECLS
+-
+-#define GST_TYPE_WL_WINDOW                  (gst_wl_window_get_type ())
+-#define GST_WL_WINDOW(obj)                  (G_TYPE_CHECK_INSTANCE_CAST ((obj), GST_TYPE_WL_WINDOW, GstWlWindow))
+-#define GST_IS_WL_WINDOW(obj)               (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GST_TYPE_WL_WINDOW))
+-#define GST_WL_WINDOW_CLASS(klass)          (G_TYPE_CHECK_CLASS_CAST ((klass), GST_TYPE_WL_WINDOW, GstWlWindowClass))
+-#define GST_IS_WL_WINDOW_CLASS(klass)       (G_TYPE_CHECK_CLASS_TYPE ((klass), GST_TYPE_WL_WINDOW))
+-#define GST_WL_WINDOW_GET_CLASS(obj)        (G_TYPE_INSTANCE_GET_CLASS ((obj), GST_TYPE_WL_WINDOW, GstWlWindowClass))
+-
+-typedef struct _GstWlWindow GstWlWindow;
+-typedef struct _GstWlWindowClass GstWlWindowClass;
+-
+-struct _GstWlWindow
+-{
+-  GObject parent_instance;
+-
+-  GstWlDisplay *display;
+-  struct wl_surface *area_surface;
+-  struct wl_subsurface *area_subsurface;
+-  struct wl_viewport *area_viewport;
+-  struct wl_surface *video_surface;
+-  struct wl_subsurface *video_subsurface;
+-  struct wl_viewport *video_viewport;
+-  struct wl_shell_surface *shell_surface;
+-
+-  /* the size and position of the area_(sub)surface */
+-  GstVideoRectangle render_rectangle;
+-  /* the size of the video in the buffers */
+-  gint video_width, video_height;
+-  /* the size of the video_(sub)surface */
+-  gint surface_width, surface_height;
+-};
+-
+-struct _GstWlWindowClass
+-{
+-  GObjectClass parent_class;
+-};
+-
+-GType gst_wl_window_get_type (void);
+-
+-GstWlWindow *gst_wl_window_new_toplevel (GstWlDisplay * display,
+-        const GstVideoInfo * info);
+-GstWlWindow *gst_wl_window_new_in_surface (GstWlDisplay * display,
+-        struct wl_surface * parent);
+-
+-GstWlDisplay *gst_wl_window_get_display (GstWlWindow * window);
+-struct wl_surface *gst_wl_window_get_wl_surface (GstWlWindow * window);
+-gboolean gst_wl_window_is_toplevel (GstWlWindow *window);
+-
+-void gst_wl_window_render (GstWlWindow * window, GstWlBuffer * buffer,
+-        const GstVideoInfo * info);
+-void gst_wl_window_set_render_rectangle (GstWlWindow * window, gint x, gint y,
+-        gint w, gint h);
+-
+-G_END_DECLS
+-
+-#endif /* __GST_WL_WINDOW_H__ */
+-- 
+2.7.4
+
diff --git a/meta-arago-extras/recipes-multimedia/gstreamer/gstreamer1.0-plugins-bad_1.8.3.bbappend b/meta-arago-extras/recipes-multimedia/gstreamer/gstreamer1.0-plugins-bad_1.8.3.bbappend
new file mode 100644
index 0000000..5e099d5
--- /dev/null
+++ b/meta-arago-extras/recipes-multimedia/gstreamer/gstreamer1.0-plugins-bad_1.8.3.bbappend
@@ -0,0 +1,40 @@
+FILESEXTRAPATHS_prepend := "${THISDIR}/${PN}:"
+
+PACKAGECONFIG = "faad"
+
+# gstreamer is now also included on Keystone, be mindful of any Graphics dependencies
+PACKAGECONFIG_append_omap-a15 = " ${@bb.utils.contains('DISTRO_FEATURES','wayland','wayland','',d)}"
+PACKAGECONFIG_append_ti43x = " ${@bb.utils.contains('DISTRO_FEATURES','wayland','wayland','',d)}"
+PACKAGECONFIG_append_ti33x = " ${@bb.utils.contains('DISTRO_FEATURES','wayland','wayland','',d)}"
+
+DEPENDS_append_omap-a15 = " \
+    libdce \
+    libdrm \
+"
+
+DEPENDS_append_ti43x = " \
+    libdrm \
+"
+
+DEPENDS_append_ti33x = " \
+    libdrm \
+"
+
+SRC_URI_append_ti43x = " \
+    file://0001-gstwaylandsink-Add-mouse-drag-and-drop-support.patch \
+"
+
+SRC_URI_append_ti33x = " \
+    file://0001-gstwaylandsink-Add-mouse-drag-and-drop-support.patch \
+"
+
+SRC_URI_append_omap-a15 = " \
+    file://0001-gstdrmallocator-Add-DRM-allocator-support.patch \
+    file://0002-parsers-Pick-previos-bug-fixes-on-different-parsers.patch \
+    file://0003-gstkmssink-Add-support-for-KMS-based-sink.patch \
+    file://0004-gstwaylandsink-Add-DRM-support-on-waylandsink.patch \
+"
+
+PACKAGE_ARCH = "${MACHINE_ARCH}"
+
+PR = "r3"
-- 
1.9.1



^ permalink raw reply related	[flat|nested] 3+ messages in thread

* [PATCH 2/3] Revert "branding-core: temporarily disable mmip features due to gst 1.8.3"
  2017-01-27 12:02 [PATCH 1/3] gst-bad: Add gstreamer 1.8 TI add-ons Pooja Prajod
@ 2017-01-27 12:02 ` Pooja Prajod
  2017-01-27 12:02 ` [PATCH 3/3] gstreamer: Remove gst 1.6 recipe Pooja Prajod
  1 sibling, 0 replies; 3+ messages in thread
From: Pooja Prajod @ 2017-01-27 12:02 UTC (permalink / raw)
  To: meta-arago; +Cc: Pooja Prajod

This reverts commit 3d85967977c55b83437869e054260815a5de3e32.
---
 meta-arago-distro/conf/distro/include/branding-core.inc | 4 ----
 1 file changed, 4 deletions(-)

diff --git a/meta-arago-distro/conf/distro/include/branding-core.inc b/meta-arago-distro/conf/distro/include/branding-core.inc
index 22ad8f4..a506e3c 100644
--- a/meta-arago-distro/conf/distro/include/branding-core.inc
+++ b/meta-arago-distro/conf/distro/include/branding-core.inc
@@ -10,7 +10,3 @@ ALTERNATIVE_PRIORITY_pn-opencl-monitor = "1"
 
 # Raise priority for sample IPC FW images
 ALTERNATIVE_PRIORITY_pn-ti-ipc-rtos = "15"
-
-# Temporarily disable "mmip" machine feature for all SOCs while building
-# latest code base, until gstreamer support is available for 1.8.3
-MACHINE_FEATURES := "${@d.getVar('MACHINE_FEATURES', True).replace('mmip', '')}"
-- 
1.9.1



^ permalink raw reply related	[flat|nested] 3+ messages in thread

* [PATCH 3/3] gstreamer: Remove gst 1.6 recipe
  2017-01-27 12:02 [PATCH 1/3] gst-bad: Add gstreamer 1.8 TI add-ons Pooja Prajod
  2017-01-27 12:02 ` [PATCH 2/3] Revert "branding-core: temporarily disable mmip features due to gst 1.8.3" Pooja Prajod
@ 2017-01-27 12:02 ` Pooja Prajod
  1 sibling, 0 replies; 3+ messages in thread
From: Pooja Prajod @ 2017-01-27 12:02 UTC (permalink / raw)
  To: meta-arago; +Cc: Pooja Prajod

Remove gst 1.6 recipe since the gstreamer version
is upgraded to gst 1.8

Signed-off-by: Pooja Prajod <a0132412@ti.com>
---
 .../gstreamer1.0-plugins-bad_1.6.3.bbappend        | 43 ----------------------
 1 file changed, 43 deletions(-)
 delete mode 100644 meta-arago-extras/recipes-multimedia/gstreamer/gstreamer1.0-plugins-bad_1.6.3.bbappend

diff --git a/meta-arago-extras/recipes-multimedia/gstreamer/gstreamer1.0-plugins-bad_1.6.3.bbappend b/meta-arago-extras/recipes-multimedia/gstreamer/gstreamer1.0-plugins-bad_1.6.3.bbappend
deleted file mode 100644
index 7ceb1b3..0000000
--- a/meta-arago-extras/recipes-multimedia/gstreamer/gstreamer1.0-plugins-bad_1.6.3.bbappend
+++ /dev/null
@@ -1,43 +0,0 @@
-FILESEXTRAPATHS_prepend := "${THISDIR}/${PN}:"
-
-PACKAGECONFIG = "faad"
-
-# gstreamer is now also included on Keystone, be mindful of any Graphics dependencies
-PACKAGECONFIG_append_omap-a15 = " ${@bb.utils.contains('DISTRO_FEATURES','wayland','wayland','',d)}"
-PACKAGECONFIG_append_ti43x = " ${@bb.utils.contains('DISTRO_FEATURES','wayland','wayland','',d)}"
-PACKAGECONFIG_append_ti33x = " ${@bb.utils.contains('DISTRO_FEATURES','wayland','wayland','',d)}"
-
-DEPENDS_append_omap-a15 = " \
-    libdce \
-    libdrm \
-"
-
-DEPENDS_append_ti43x = " \
-    libdrm \
-"
-
-DEPENDS_append_ti33x = " \
-    libdrm \
-"
-
-SRC_URI_append_ti43x = " \
-    file://0001-gstwaylandsink-Add-mouse-drag-and-drop-support.patch \
-"
-
-SRC_URI_append_ti33x = " \
-    file://0001-gstwaylandsink-Add-mouse-drag-and-drop-support.patch \
-"
-
-PACKAGE_ARCH = "${MACHINE_ARCH}"
-
-BRANCH ?= "master"
-
-SRC_URI = "git://git.ti.com/glsdk/gstreamer1-0-plugins-bad.git;protocol=git;branch=${BRANCH} \
-          "
-
-S = "${WORKDIR}/git"
-
-SRCREV_omap-a15 = "07050013051af00828be115eb7bce0fc08abb79f"
-SRCREV = "d0160ca810be30bf2b2e7681f5047933402efb52"
-
-PR = "r24"
-- 
1.9.1



^ permalink raw reply related	[flat|nested] 3+ messages in thread

end of thread, other threads:[~2017-01-27 12:02 UTC | newest]

Thread overview: 3+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2017-01-27 12:02 [PATCH 1/3] gst-bad: Add gstreamer 1.8 TI add-ons Pooja Prajod
2017-01-27 12:02 ` [PATCH 2/3] Revert "branding-core: temporarily disable mmip features due to gst 1.8.3" Pooja Prajod
2017-01-27 12:02 ` [PATCH 3/3] gstreamer: Remove gst 1.6 recipe Pooja Prajod

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.