gst-ducati: Migrate to gst 1.6.3 (V2)
authorPooja Prajod <a0132412@ti.com>
Tue, 31 May 2016 14:33:49 +0000 (20:03 +0530)
committerPooja Prajod <a0132412@ti.com>
Thu, 2 Jun 2016 13:02:49 +0000 (18:32 +0530)
The patch has been reworked to apply cleanly on the top-most commit

Signed-off-by: Pooja Prajod <a0132412@ti.com>
src/Makefile.am
src/gstducati.c
src/gstducatibufferpriv.h
src/gstducatividdec.c
src/gstducatividdec.h
src/gstducatividenc.c
src/gstducatividenc.h

index 87d2ad2e8a6409a58566012fa7e247513f4a193b..14afd192e105d3b6d3cc3c1353d68f47303bc1fd 100644 (file)
@@ -40,7 +40,6 @@ libgstducati_la_CFLAGS = \
 libgstducati_la_LIBADD = \
        $(GST_LIBS) \
        $(LIBDCE_LIBS) \
-       -lgstdmabuf-1.0 \
        -lgstdrm-1.0 \
        -lgstvideo-1.0
 
index a91a48b62f83144bf31e1eb277d5f04fc1b052f2..2a38e79c9f46f93c3cdfccc562fdaa645f647416 100644 (file)
@@ -70,13 +70,13 @@ plugin_init (GstPlugin * plugin)
 {
   GST_DEBUG_CATEGORY_INIT (gst_ducati_debug, "ducati", 0, "ducati");
 
-  return gst_element_register (plugin, "ducatih264dec", GST_RANK_PRIMARY,
+  return gst_element_register (plugin, "ducatih264dec", GST_RANK_PRIMARY + 1,
       GST_TYPE_DUCATIH264DEC) &&
-      gst_element_register (plugin, "ducatimpeg4dec", GST_RANK_PRIMARY,
+      gst_element_register (plugin, "ducatimpeg4dec", GST_RANK_PRIMARY + 1,
       GST_TYPE_DUCATIMPEG4DEC) &&
-      gst_element_register (plugin, "ducatimpeg2dec", GST_RANK_PRIMARY,
+      gst_element_register (plugin, "ducatimpeg2dec", GST_RANK_PRIMARY + 1,
       GST_TYPE_DUCATIMPEG2DEC) &&
-      gst_element_register (plugin, "ducativc1dec", GST_RANK_PRIMARY,
+      gst_element_register (plugin, "ducativc1dec", GST_RANK_PRIMARY + 1,
       GST_TYPE_DUCATIVC1DEC) &&
       gst_element_register (plugin, "ducatijpegdec", GST_RANK_PRIMARY + 1,
       GST_TYPE_DUCATIJPEGDEC) &&
@@ -95,6 +95,6 @@ plugin_init (GstPlugin * plugin)
 #  define PACKAGE "ducati"
 #endif
 
-GST_PLUGIN_DEFINE (GST_VERSION_MAJOR, GST_VERSION_MINOR, ducati ,
+GST_PLUGIN_DEFINE (GST_VERSION_MAJOR, GST_VERSION_MINOR, ducati,
     "Hardware accelerated codecs for OMAP4",
     plugin_init, VERSION, "LGPL", "GStreamer", "http://gstreamer.net/")
index 0ba38a4dd7eed62dd4da9cc8277db690a992ad6a..f59fc313c20078d0f9941a38859d73f87b08f5d8 100644 (file)
@@ -31,8 +31,6 @@
 
 G_BEGIN_DECLS
 
-#include <gst/dmabuf/dmabuf.h>
-
 /**
  * GstMetaDucatiBufferPriv:
  *
index ba79a9e33321e5e8d6e06f5d13ff37d958e613eb..b02ca2942949c20e2d35c89260b0699395a45bea 100644 (file)
@@ -24,6 +24,7 @@
 
 #include "gstducatividdec.h"
 #include "gstducatibufferpriv.h"
+#include <stdlib.h>
 
 #define VERSION_LENGTH 256
 
@@ -31,18 +32,6 @@ static void gst_ducati_viddec_class_init (GstDucatiVidDecClass * klass);
 static void gst_ducati_viddec_init (GstDucatiVidDec * self, gpointer klass);
 static void gst_ducati_viddec_base_init (gpointer gclass);
 static GstElementClass *parent_class = NULL;
-void gst_drm_buffer_pool_set_caps (GstDRMBufferPool * self, GstCaps * caps);
-
-
-void
-gst_drm_buffer_pool_set_caps (GstDRMBufferPool * self, GstCaps * caps)
-{
-  GstStructure *conf;
-  conf = gst_buffer_pool_get_config (GST_BUFFER_POOL (self));
-  gst_buffer_pool_config_set_params (conf, caps, self->size, 0, 0);
-  gst_drm_buffer_pool_set_config (GST_BUFFER_POOL (self), conf);
-
-}
 
 GType
 gst_ducati_viddec_get_type (void)
@@ -170,11 +159,6 @@ engine_open (GstDucatiVidDec * self)
 static void
 codec_delete (GstDucatiVidDec * self)
 {
-  if (self->pool) {
-    gst_drm_buffer_pool_destroy (self->pool);
-    self->pool = NULL;
-  }
-
   if (self->codec) {
     GST_DEBUG ("Calling VIDDEC3_delete");
     VIDDEC3_delete (self->codec);
@@ -276,26 +260,45 @@ static inline GstBuffer *
 codec_buffer_pool_get (GstDucatiVidDec * self, GstBuffer * buf)
 {
   GstBuffer *ret_buf;
+  GstCaps *caps = gst_pad_get_current_caps (self->srcpad);
   GstStructure *conf;
+  GstVideoInfo info;
+  if (!gst_video_info_from_caps (&info, caps)) {
+    GST_WARNING_OBJECT (self, "No valid pad caps");
+  }
   if (G_UNLIKELY (!self->pool)) {
+    GstAllocator *allocator;
+    int num_buffers = 0;
     guint size =
         GST_ROUND_UP_4 (self->padded_width) *
         GST_ROUND_UP_2 (self->padded_height) * 3 / 2;
 
+    if (self->status->maxNumDisplayBufs)
+      num_buffers = self->status->maxNumDisplayBufs + 5;
+
     GST_DEBUG_OBJECT (self, "creating bufferpool");
     GST_DEBUG_OBJECT (self, "%s\n",
         gst_caps_to_string (gst_pad_get_current_caps (self->srcpad)));
-    self->pool =
-        gst_drm_buffer_pool_new (GST_ELEMENT (self), dce_get_fd (),
-        gst_pad_get_current_caps (self->srcpad), size);
 
-    gst_buffer_pool_set_active (GST_BUFFER_POOL(self->pool), FALSE);
-    conf = gst_buffer_pool_get_config (GST_BUFFER_POOL(self->pool));
-    gst_buffer_pool_config_set_params (conf, gst_pad_get_current_caps (self->srcpad), size, self->status->maxNumDisplayBufs+5, self->status->maxNumDisplayBufs+5);
-    gst_buffer_pool_set_config (GST_BUFFER_POOL(self->pool), conf);
-    gst_buffer_pool_set_active (GST_BUFFER_POOL(self->pool), TRUE);
-  }
-  return GST_BUFFER (gst_drm_buffer_pool_get (self->pool, FALSE));
+    allocator = gst_drm_allocator_get ();
+
+    if (!allocator) {
+      GST_DEBUG_OBJECT (self,
+          "Did not get a DRM allocator. Proceeding with default allocator");
+    }
+    self->pool = gst_buffer_pool_new ();
+    conf = gst_buffer_pool_get_config (GST_BUFFER_POOL (self->pool));
+    gst_buffer_pool_config_set_params (conf, caps, size, num_buffers,
+        num_buffers);
+    gst_buffer_pool_config_set_allocator (conf, allocator, NULL);
+    gst_buffer_pool_set_config (GST_BUFFER_POOL (self->pool), conf);
+    gst_buffer_pool_set_active (GST_BUFFER_POOL (self->pool), TRUE);
+  }
+  gst_buffer_pool_acquire_buffer (self->pool, &ret_buf, NULL);
+  gst_buffer_add_video_crop_meta (ret_buf);
+  /* Crop meta will be checked and consumed by codec_process */
+
+  return ret_buf;
 }
 
 static GstMetaDucatiBufferPriv *
@@ -306,25 +309,23 @@ get_buffer_priv (GstDucatiVidDec * self, GstBuffer * buf)
     GstVideoFormat format = GST_VIDEO_FORMAT_NV12;
     struct omap_bo *bo;
     gint uv_offset, size;
-
-    GstMetaDmaBuf *dmabuf = gst_buffer_get_dma_buf_meta (buf);
+    GstMemory *mem = gst_buffer_peek_memory (buf, 0);
+    int fd = gst_fd_memory_get_fd (mem);
 
     /* if it isn't a dmabuf buffer that we can import, then there
      * is nothing we can do with it:
      */
-    if (!dmabuf) {
+    if (fd < 0) {
       GST_DEBUG_OBJECT (self, "not importing non dmabuf buffer");
       return NULL;
     }
 
-    bo = omap_bo_from_dmabuf (self->device, gst_dma_buf_meta_get_fd (dmabuf));
-
+    bo = omap_bo_from_dmabuf (self->device, fd);
     uv_offset =
         GST_ROUND_UP_4 (self->stride) * GST_ROUND_UP_2 (self->padded_height);
     size =
         GST_ROUND_UP_4 (self->stride) * GST_ROUND_UP_2 (self->padded_height) *
         3 / 2;
-
     priv = gst_ducati_buffer_priv_set (buf, bo, uv_offset, size);
   }
   return priv;
@@ -335,7 +336,7 @@ codec_prepare_outbuf (GstDucatiVidDec * self, GstBuffer ** buf,
     gboolean force_internal)
 {
   GstMetaDucatiBufferPriv *priv = NULL;
-  GstMetaDmaBuf *dmabuf = NULL;
+  int fd = -1;
 
   if (!force_internal)
     priv = get_buffer_priv (self, *buf);
@@ -353,11 +354,18 @@ codec_prepare_outbuf (GstDucatiVidDec * self, GstBuffer ** buf,
 
   /* There are at least two buffers. Derived classes may add codec specific
      buffers (eg, debug info) after these two if they want to. */
-  dmabuf = gst_buffer_get_dma_buf_meta (*buf);
+  GstMemory *mem = gst_buffer_peek_memory (*buf, 0);
+  fd = gst_fd_memory_get_fd (mem);
+
+  if (fd < 0) {
+    GST_DEBUG_OBJECT (self, "Invalid fd");
+    return 0;
+  }
+
   /* XDM_MemoryType required by drm to allcoate buffer */
   self->outBufs->descs[0].memType = XDM_MEMTYPE_RAW;
   /* IPC requires dmabuf fd in place of bo handle */
-  self->outBufs->descs[0].buf = (XDAS_Int8 *) gst_dma_buf_meta_get_fd (dmabuf);
+  self->outBufs->descs[0].buf = (XDAS_Int8 *) fd;
   self->outBufs->descs[0].bufSize.bytes = priv->uv_offset;
   self->outBufs->descs[1].memType = XDM_MEMTYPE_RAW;
   /* For singleplaner buffer pass a single dmabuf fd for both the outBufs
@@ -389,8 +397,13 @@ do_dce_buf_unlock (GstBuffer * buf)
 {
   SizeT fd;
   /* Get dmabuf fd of the buffer to unlock */
-  fd = gst_dma_buf_meta_get_fd (gst_buffer_get_dma_buf_meta (buf));
+  GstMemory *mem = gst_buffer_peek_memory (buf, 0);
+  fd = gst_fd_memory_get_fd (mem);
 
+  if (fd < 0) {
+    GST_DEBUG ("Invalid Fd to unlock");
+    return;
+  }
   dce_buf_unlock (1, &fd);
 }
 
@@ -503,6 +516,7 @@ codec_process (GstDucatiVidDec * self, gboolean send, gboolean flush,
     /* Check if this inputID was already sent to the codec */
     if (g_hash_table_contains (self->dce_locked_bufs,
             (gpointer) self->inArgs->inputID)) {
+      int out_fd = -1;
       GstMetaDucatiBufferPriv *priv =
           gst_ducati_buffer_priv_get ((GstBuffer *) self->inArgs->inputID);
 
@@ -511,17 +525,30 @@ codec_process (GstDucatiVidDec * self, gboolean send, gboolean flush,
       /* Input ID needs to be resent to the codec for cases like H.264 field coded pictures.
          The decoder indicates this by setting outArgs->outBufsInUseFlag */
       self->outBufs->descs[0].memType = XDM_MEMTYPE_RAW;
-      self->outBufs->descs[0].buf = (XDAS_Int8 *)
-          gst_dma_buf_meta_get_fd (gst_buffer_get_dma_buf_meta ((GstBuffer *)
-              self->inArgs->inputID));
+
+      GstMemory *mem =
+          gst_buffer_peek_memory ((GstBuffer *) self->inArgs->inputID, 0);
+      out_fd = gst_fd_memory_get_fd (mem);
+      if (out_fd < 0) {
+        GST_DEBUG_OBJECT (self, "Invalid fd %d", out_fd);
+        gst_buffer_unref (((GstBuffer *) self->inArgs->inputID));
+        return GST_FLOW_ERROR;
+      }
+      self->outBufs->descs[0].buf = (XDAS_Int8 *) out_fd;
       self->outBufs->descs[0].bufSize.bytes = priv->uv_offset;
       self->outBufs->descs[1].memType = XDM_MEMTYPE_RAW;
       self->outBufs->descs[1].buf = (XDAS_Int8 *) self->outBufs->descs[0].buf;
       self->outBufs->descs[1].bufSize.bytes = priv->size - priv->uv_offset;
     } else {
       /* Get dmabuf fd of the buffer to lock it */
-      fd = gst_dma_buf_meta_get_fd (gst_buffer_get_dma_buf_meta ((GstBuffer *)
-              self->inArgs->inputID));
+      GstMemory *mem =
+          gst_buffer_peek_memory ((GstBuffer *) self->inArgs->inputID, 0);
+      fd = gst_fd_memory_get_fd (mem);
+      if (fd < 0) {
+        GST_DEBUG_OBJECT (self, "Invalid fd %d", fd);
+        gst_buffer_unref (((GstBuffer *) self->inArgs->inputID));
+        return GST_FLOW_ERROR;
+      }
       /* Must lock all the buffer passed to ducati */
       GST_DEBUG_OBJECT (self, "dce_buf_lock(inputID: %08x, fd: %d)",
           self->inArgs->inputID, fd);
@@ -565,8 +592,6 @@ codec_process (GstDucatiVidDec * self, gboolean send, gboolean flush,
 
         gst_caps_set_simple (caps, "max-ref-frames", G_TYPE_INT,
             self->status->maxNumDisplayBufs, NULL);
-        if (self->pool)
-          gst_drm_buffer_pool_set_caps (self->pool, caps);
         if (!gst_pad_set_caps (self->srcpad, caps)) {
           GST_ERROR_OBJECT (self, "downstream didn't accept new caps");
           err = XDM_EFAIL;
@@ -632,8 +657,6 @@ codec_process (GstDucatiVidDec * self, gboolean send, gboolean flush,
       GST_INFO_OBJECT (self, "changing interlace field in caps");
       gst_caps_set_simple (caps, "interlaced", G_TYPE_BOOLEAN, interlaced,
           NULL);
-      if (self->pool)
-        gst_drm_buffer_pool_set_caps (self->pool, caps);
       if (!gst_pad_set_caps (self->srcpad, caps)) {
         GST_ERROR_OBJECT (self,
             "downstream didn't want to change interlace mode");
@@ -672,16 +695,22 @@ codec_process (GstDucatiVidDec * self, gboolean send, gboolean flush,
     }
 
     if (G_UNLIKELY (self->first_out_buffer) && send) {
-      GstDRMBufferPool *pool;
+
       self->first_out_buffer = FALSE;
 
       /* Destroy the pool so the buffers we used so far are eventually released.
        * The pool will be recreated if needed.
        */
-      pool = self->pool;
-      self->pool = NULL;
-      if (pool)
-        gst_drm_buffer_pool_destroy (pool);
+
+      if (self->pool) {
+        gst_object_unref (self->pool);
+        self->pool = NULL;
+      }
+
+      if (self->externalpool) {
+        gst_object_unref (self->externalpool);
+        self->externalpool = NULL;
+      }
     }
 
     if (send) {
@@ -1113,6 +1142,8 @@ gst_ducati_viddec_set_sink_caps (GstDucatiVidDec * self, GstCaps * caps)
   if (self->interlaced)
     gst_structure_set (out_s, "interlaced", G_TYPE_BOOLEAN, TRUE, NULL);
 
+  gst_structure_set (out_s, "drm_mem", G_TYPE_BOOLEAN, TRUE, NULL);
+
   self->stride = GST_ROUND_UP_4 (self->padded_width);
 
   self->outsize =
@@ -1373,13 +1404,18 @@ allocate_buffer:
   }
 
   if (self->externalpool) {
+    gst_buffer_pool_set_active (self->externalpool, TRUE);
     GstFlowReturn ret_acq_buf =
         gst_buffer_pool_acquire_buffer (GST_BUFFER_POOL (self->externalpool),
         &outbuf,
         NULL);
     if (ret_acq_buf == GST_FLOW_OK) {
-      GstMetaDmaBuf *meta = gst_buffer_get_dma_buf_meta (outbuf);
-      if (meta) {
+      gst_buffer_add_video_crop_meta (outbuf);
+      /* Crop meta will be checked and consumed by codec_process */
+      GstMemory *mem = gst_buffer_get_memory (outbuf, 0);
+      gboolean mem_type = gst_is_drm_memory (mem);
+      gst_memory_unref (mem);
+      if (mem_type) {
         goto common;
       } else {
         gst_buffer_unref (outbuf);
@@ -1387,6 +1423,7 @@ allocate_buffer:
     }
     GST_WARNING_OBJECT (self, "acquire buffer from externalpool failed %s",
         gst_flow_get_name (ret_acq_buf));
+
   }
 
 aqcuire_from_own_pool:
@@ -1756,6 +1793,11 @@ gst_ducati_viddec_finalize (GObject * obj)
     self->externalpool = NULL;
   }
 
+  if (self->pool) {
+    gst_object_unref (self->pool);
+    self->pool = NULL;
+  }
+
   engine_close (self);
 
   /* Will unref the remaining buffers if needed */
index 5444b79482ce8063cd761f591f727982981e898c..f4fbc2b727120dc1ae93b0e87f8ebe00e26a2df9 100644 (file)
@@ -29,7 +29,7 @@
 #include "gstducati.h"
 #include "gstducatibufferpriv.h"
 
-#include <gst/drm/gstdrmbufferpool.h>
+#include <gst/drm/gstdrmallocator.h>
 #include <gst/video/video.h>
 #include <gst/video/gstvideometa.h>
 
@@ -54,7 +54,7 @@ struct _GstDucatiVidDec
 
   GstPad *sinkpad, *srcpad;
 
-  GstDRMBufferPool *pool;
+  GstBufferPool *pool;
 
   /* minimum output size required by the codec: */
   gint outsize;
index 017cade038d17546a3716cda2e8aac267d2954a3..9e58cb343cce26a6f924f648bbb80b521980db96 100644 (file)
@@ -76,12 +76,14 @@ static gboolean gst_ducati_videnc_is_sync_point_default (GstDucatiVidEnc * enc,
 static gboolean gst_ducati_videnc_configure_default (GstDucatiVidEnc * self);
 static gboolean gst_ducati_videnc_event (GstVideoEncoder * enc,
     GstEvent * event);
-
+static gboolean
+gst_ducati_videnc_propose_allocation (GstVideoEncoder * encoder,
+    GstQuery * query);
+static GstBufferPool *gst_drm_buffer_pool_new (GstCaps * caps, guint size);
 
 #define gst_ducati_videnc_parent_class parent_class
 G_DEFINE_TYPE (GstDucatiVidEnc, gst_ducati_videnc, GST_TYPE_VIDEO_ENCODER);
 
-
 /* the values for the following enums are taken from the codec */
 
 enum
@@ -123,6 +125,69 @@ gst_ducati_videnc_rate_preset_get_type (void)
   return type;
 }
 
+static GstBufferPool *
+gst_drm_buffer_pool_new (GstCaps * caps, guint size)
+{
+  GstAllocator *allocator;
+  GstStructure *conf;
+  GstBufferPool *ret_pool;
+
+  allocator = gst_drm_allocator_get ();
+  if (!allocator) {
+    GST_DEBUG
+        ("Failed to get a DRM bufferpool. Proceeding with default allocator");
+  }
+  ret_pool = gst_buffer_pool_new ();
+  conf = gst_buffer_pool_get_config (GST_BUFFER_POOL (ret_pool));
+  if (conf) {
+    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 (ret_pool), conf);
+  }
+
+  if (allocator)
+    gst_object_unref (allocator);
+
+  return ret_pool;
+}
+
+static gboolean
+gst_ducati_videnc_propose_allocation (GstVideoEncoder * encoder,
+    GstQuery * query)
+{
+  GstDucatiVidEnc *self = GST_DUCATIVIDENC (encoder);
+  GstStructure *config;
+  guint size, min_bufs, max_bufs;
+  GstCaps *allowed_sink_caps;
+  GstVideoInfo info;
+
+  if (!self->input_pool) {
+    allowed_sink_caps =
+        gst_pad_get_allowed_caps (GST_VIDEO_ENCODER_SINK_PAD (self));
+    if (!allowed_sink_caps) {
+      GST_DEBUG_OBJECT (self, "... but no peer, using template caps");
+      allowed_sink_caps =
+          gst_pad_get_pad_template_caps (GST_VIDEO_ENCODER_SINK_PAD (self));
+    }
+    GST_DEBUG_OBJECT (self, "chose caps %" GST_PTR_FORMAT, allowed_sink_caps);
+    allowed_sink_caps = gst_caps_truncate (allowed_sink_caps);
+    gst_video_info_from_caps (&info, gst_caps_fixate (allowed_sink_caps));
+    self->input_pool =
+        gst_drm_buffer_pool_new (gst_caps_fixate (allowed_sink_caps),
+        info.size);
+  }
+
+  config = gst_buffer_pool_get_config (self->input_pool);
+  gst_buffer_pool_config_get_params (config, NULL, &size, &min_bufs, &max_bufs);
+
+  gst_query_add_allocation_pool (query, self->input_pool, size, min_bufs,
+      max_bufs);
+  gst_query_add_allocation_param (query, gst_drm_allocator_get (), NULL);
+  gst_structure_free (config);
+
+  return TRUE;
+}
+
 
 static void
 gst_ducati_videnc_class_init (GstDucatiVidEncClass * klass)
@@ -148,6 +213,9 @@ gst_ducati_videnc_class_init (GstDucatiVidEncClass * klass)
   basevideoencoder_class->src_event =
       GST_DEBUG_FUNCPTR (gst_ducati_videnc_event);
 
+  basevideoencoder_class->propose_allocation =
+      GST_DEBUG_FUNCPTR (gst_ducati_videnc_propose_allocation);
+
   klass->allocate_params = gst_ducati_videnc_allocate_params_default;
   klass->configure = gst_ducati_videnc_configure_default;
   klass->is_sync_point = gst_ducati_videnc_is_sync_point_default;
@@ -203,7 +271,6 @@ gst_ducati_videnc_set_format (GstVideoEncoder * base_video_encoder,
   GstVideoCodecState *output_state;
   GstCaps *allowed_caps = NULL;
 
-
   GST_DEBUG_OBJECT (self, "picking an output format ...");
   allowed_caps =
       gst_pad_get_allowed_caps (GST_VIDEO_ENCODER_SRC_PAD (base_video_encoder));
@@ -336,20 +403,25 @@ gst_ducati_videnc_configure (GstDucatiVidEnc * self)
       max_out_size = size;
   }
 
-  g_assert (self->input_pool == NULL);
-
-  allowed_sink_caps =
-      gst_pad_get_allowed_caps (GST_VIDEO_ENCODER_SINK_PAD (self));
-  if (!allowed_sink_caps) {
-    GST_DEBUG_OBJECT (self, "... but no peer, using template caps");
+  if (!self->input_pool) {
+    GstVideoInfo info;
     allowed_sink_caps =
-        gst_pad_get_pad_template_caps (GST_VIDEO_ENCODER_SINK_PAD (self));
+        gst_pad_get_allowed_caps (GST_VIDEO_ENCODER_SINK_PAD (self));
+    if (!allowed_sink_caps) {
+      GST_DEBUG_OBJECT (self, "... but no peer, using template caps");
+      allowed_sink_caps =
+          gst_pad_get_pad_template_caps (GST_VIDEO_ENCODER_SINK_PAD (self));
+    }
+    GST_DEBUG_OBJECT (self, "chose caps %" GST_PTR_FORMAT, allowed_sink_caps);
+    allowed_sink_caps = gst_caps_truncate (allowed_sink_caps);
+    gst_video_info_from_caps (&info, gst_caps_fixate (allowed_sink_caps));
+    self->input_pool =
+        gst_drm_buffer_pool_new (gst_caps_fixate (allowed_sink_caps),
+        info.size);
   }
-  GST_DEBUG_OBJECT (self, "chose caps %" GST_PTR_FORMAT, allowed_sink_caps);
-  allowed_sink_caps = gst_caps_truncate (allowed_sink_caps);
-  self->input_pool = gst_drm_buffer_pool_new (GST_ELEMENT (self),
-      dce_get_fd (), gst_caps_fixate (allowed_sink_caps),
-      GST_VIDEO_INFO_SIZE (&state->info));
+
+
+  gst_buffer_pool_set_active (GST_BUFFER_POOL (self->input_pool), TRUE);
 
   g_assert (self->output_pool == NULL);
   allowed_src_caps =
@@ -361,8 +433,11 @@ gst_ducati_videnc_configure (GstDucatiVidEnc * self)
   }
   GST_DEBUG_OBJECT (self, "chose caps %" GST_PTR_FORMAT, allowed_src_caps);
   allowed_src_caps = gst_caps_truncate (allowed_src_caps);
-  self->output_pool = gst_drm_buffer_pool_new (GST_ELEMENT (self),
-      dce_get_fd (), gst_caps_fixate (allowed_src_caps), max_out_size);
+  self->output_pool =
+      gst_drm_buffer_pool_new (gst_caps_fixate (allowed_src_caps),
+      max_out_size);
+
+  gst_buffer_pool_set_active (GST_BUFFER_POOL (self->output_pool), TRUE);
 
   GST_INFO_OBJECT (self, "configured");
 
@@ -591,12 +666,12 @@ gst_ducati_videnc_stop (GstVideoEncoder * base_video_encoder)
   gst_ducati_videnc_close_engine (self);
 
   if (self->input_pool) {
-    gst_drm_buffer_pool_destroy (self->input_pool);
+    gst_object_unref (self->input_pool);
     self->input_pool = NULL;
   }
 
   if (self->output_pool) {
-    gst_drm_buffer_pool_destroy (self->output_pool);
+    gst_object_unref (self->output_pool);
     self->output_pool = NULL;
   }
 
@@ -620,12 +695,14 @@ static int
 gst_ducati_videnc_buffer_lock (GstDucatiVidEnc * self, GstBuffer * buf)
 {
   int fd;
-  GstMetaDmaBuf *dmabuf = gst_buffer_get_dma_buf_meta (buf);
-  if (!dmabuf) {
-    GST_ERROR_OBJECT (self, "invalid dmabuf for buf = %p", buf);
+  GstMemory *mem;
+  mem = gst_buffer_peek_memory (buf, 0);
+  if (!gst_is_drm_memory (mem)) {
+    GST_LOG_OBJECT (self, "Not a dmabuf memory");
     return -1;
   }
-  fd = gst_dma_buf_meta_get_fd (dmabuf);
+
+  fd = gst_fd_memory_get_fd (mem);
   if (fd < 0) {
     GST_ERROR_OBJECT (self, "Invalid dma buf fd %d", fd);
     return -1;
@@ -638,12 +715,13 @@ static void
 gst_ducati_videnc_buffer_unlock (GstDucatiVidEnc * self, GstBuffer * buf)
 {
   int fd;
-  GstMetaDmaBuf *dmabuf = gst_buffer_get_dma_buf_meta (buf);
-  if (!dmabuf) {
-    GST_ERROR_OBJECT (self, "invalid dmabuf for buf = %p", buf);
+  GstMemory *mem;
+  mem = gst_buffer_peek_memory (buf, 0);
+  if (!gst_is_drm_memory (mem)) {
+    GST_LOG_OBJECT (self, "Not a dmabuf memory");
     return;
   }
-  fd = gst_dma_buf_meta_get_fd (dmabuf);
+  fd = gst_fd_memory_get_fd (mem);
   if (fd < 0) {
     GST_ERROR_OBJECT (self, "Invalid dma buf fd %d", fd);
     return;
@@ -687,9 +765,8 @@ have_inbuf:
 
     GST_DEBUG_OBJECT (self, "memcpying input");
     gst_buffer_unref (inbuf);
-    inbuf = GST_BUFFER (gst_drm_buffer_pool_get (self->input_pool, FALSE));
-    gst_buffer_pool_set_active (GST_BUFFER_POOL (self->input_pool), TRUE);
 
+    gst_buffer_pool_acquire_buffer (self->input_pool, &inbuf, NULL);
     mapped = gst_buffer_map (frame->input_buffer, &info, GST_MAP_READ);
     if (mapped) {
       gst_buffer_fill (inbuf, 0, info.data, info.size);
@@ -700,11 +777,15 @@ have_inbuf:
     goto have_inbuf;
   }
 
-  outbuf = GST_BUFFER (gst_drm_buffer_pool_get (self->output_pool, FALSE));
-  gst_buffer_pool_set_active (GST_BUFFER_POOL (self->output_pool), TRUE);
-  crop = gst_buffer_get_video_crop_meta (outbuf);
-  crop->width = GST_VIDEO_INFO_WIDTH (&state->info);
-  crop->height = GST_VIDEO_INFO_HEIGHT (&state->info);
+  gst_buffer_pool_acquire_buffer (self->output_pool, &outbuf, NULL);
+
+  crop = gst_buffer_add_video_crop_meta (outbuf);
+  if (crop) {
+    crop->x = 0;
+    crop->y = 0;
+    crop->width = GST_VIDEO_INFO_WIDTH (&state->info);
+    crop->height = GST_VIDEO_INFO_HEIGHT (&state->info);
+  }
   dmabuf_fd_out = gst_ducati_videnc_buffer_lock (self, outbuf);
 
   self->inBufs->planeDesc[0].buf = (XDAS_Int8 *) dmabuf_fd_in;
@@ -742,7 +823,13 @@ have_inbuf:
 
   self->outBufs->numBufs = 1;
   self->outBufs->descs[0].buf = (XDAS_Int8 *) dmabuf_fd_out;
-  self->outBufs->descs[0].bufSize.bytes = self->output_pool->size;
+
+  GstStructure *conf;
+  guint size;
+  conf = gst_buffer_pool_get_config (self->output_pool);
+  gst_buffer_pool_config_get_params (conf, NULL, &size, NULL, NULL);
+
+  self->outBufs->descs[0].bufSize.bytes = size;
   self->outBufs->descs[0].memType = XDM_MEMTYPE_RAW;
 
   self->inArgs->inputID = GPOINTER_TO_INT (inbuf);
index fa0a2783da93e85de728ffe41da47179887a1138..5d68016af581c4eb65be1114c3fad9303067d741 100644 (file)
@@ -24,7 +24,7 @@
 #include <gst/video/video.h>
 #include <gst/video/gstvideoencoder.h>
 #include <gst/video/gstvideoutils.h>
-#include <gst/drm/gstdrmbufferpool.h>
+#include <gst/drm/gstdrmallocator.h>
 
 #include <ti/sdo/ce/video2/videnc2.h>
 
@@ -70,8 +70,8 @@ struct _GstDucatiVidEnc
   IVIDENC2_InArgs *inArgs;
   IVIDENC2_OutArgs *outArgs;
 
-  GstDRMBufferPool *input_pool;
-  GstDRMBufferPool *output_pool;
+  GstBufferPool *input_pool;
+  GstBufferPool *output_pool;
   gboolean configure;
 
   GstDucatiVideoRectangle rect;