Enhance handling of bufferpool allocated by peer
authorPooja Prajod <a0132412@ti.com>
Fri, 6 Feb 2015 14:56:14 +0000 (20:26 +0530)
committerKarthik Ramanan <a0393906@ti.com>
Mon, 23 Feb 2015 08:43:26 +0000 (14:13 +0530)
Ducati decoder accepts bufferpool allocated by peer
provided it is a dmabuf buffer with fd as metadata. The query
can be done once and bufferpool obtained can be reused.
The patch implements this enhancement. It also corrects
the handling bufferpool which doesnot allocate dmabuf buffer

Signed-off-by: Pooja Prajod <a0132412@ti.com>
src/gstducatividdec.c
src/gstducatividdec.h

index 9e8d92056f162da4b342e28a58b9ae5c86045103..a6339d7b77c38b7f507ffaab7dbf68be845f23f9 100644 (file)
@@ -1269,7 +1269,6 @@ gst_ducati_viddec_chain (GstPad * pad, GstObject * parent, GstBuffer * buf)
   GstCaps *outcaps = NULL;
   gboolean decode;
 
   GstCaps *outcaps = NULL;
   gboolean decode;
 
-  GstBufferPool *externalpool = NULL;
   GstQuery *query = NULL;
   guint min = 0;
   guint max = 0;
   GstQuery *query = NULL;
   guint min = 0;
   guint max = 0;
@@ -1299,29 +1298,42 @@ normal:
    */
 allocate_buffer:
   /* For plugins like VPE that allocate buffers to peers */
    */
 allocate_buffer:
   /* For plugins like VPE that allocate buffers to peers */
-
-  query =
-      gst_query_new_allocation (gst_pad_get_current_caps (self->srcpad), TRUE);
-  if (gst_pad_peer_query (self->srcpad, query)) {
-    gst_query_parse_nth_allocation_pool (query, 0, &externalpool, &size, &min,
-        &max);
+  if (!self->queried_external_pool) {
+    query =
+        gst_query_new_allocation (gst_pad_get_current_caps (self->srcpad),
+        TRUE);
+    if (gst_pad_peer_query (self->srcpad, query)) {
+      gst_query_parse_nth_allocation_pool (query, 0, &self->externalpool, &size,
+          &min, &max);
+    }
+    gst_query_unref (query);
+    self->queried_external_pool = TRUE;
   }
   }
-  gst_query_unref (query);
 
 
-  if (externalpool) {
-    ret =
-        gst_buffer_pool_acquire_buffer (GST_BUFFER_POOL (externalpool), &outbuf,
+  if (self->externalpool) {
+    GstFlowReturn ret_acq_buf =
+        gst_buffer_pool_acquire_buffer (GST_BUFFER_POOL (self->externalpool),
+        &outbuf,
         NULL);
         NULL);
-    if (ret == GST_FLOW_OK) {
+    if (ret_acq_buf == GST_FLOW_OK) {
       GstMetaDmaBuf *meta = gst_buffer_get_dma_buf_meta (outbuf);
       if (!meta) {
       GstMetaDmaBuf *meta = gst_buffer_get_dma_buf_meta (outbuf);
       if (!meta) {
-        outbuf = codec_buffer_pool_get (self, NULL);
+        goto aqcuire_from_own_pool;
       }
       }
+      goto common;
     }
   } else {
     }
   } else {
-    outbuf = codec_buffer_pool_get (self, NULL);
+    goto aqcuire_from_own_pool;
   }
 
   }
 
+aqcuire_from_own_pool:
+  if (self->externalpool) {
+    gst_object_unref (self->externalpool);
+    self->externalpool = NULL;
+  }
+  outbuf = codec_buffer_pool_get (self, NULL);
+
+common:
   if (ret != GST_FLOW_OK) {
     GST_WARNING_OBJECT (self, "alloc_buffer failed %s",
         gst_flow_get_name (ret));
   if (ret != GST_FLOW_OK) {
     GST_WARNING_OBJECT (self, "alloc_buffer failed %s",
         gst_flow_get_name (ret));
@@ -1828,6 +1840,9 @@ gst_ducati_viddec_init (GstDucatiVidDec * self, gpointer klass)
 
   self->pageMemType = XDM_MEMTYPE_TILEDPAGE;
 
 
   self->pageMemType = XDM_MEMTYPE_TILEDPAGE;
 
+  self->queried_external_pool = FALSE;
+  self->externalpool = NULL;
+
   self->codecdata = NULL;
   self->codecdatasize = 0;
 
   self->codecdata = NULL;
   self->codecdatasize = 0;
 
index faac58f8a6caab61f0bc613c2ba3d7d64ae45559..ad877f3c3c61727b6b359d3c6f0acb58111612ca 100644 (file)
@@ -99,6 +99,10 @@ struct _GstDucatiVidDec
 
   gboolean need_out_buf;
 
 
   gboolean need_out_buf;
 
+  /* For storing the external pool query history */
+  gboolean queried_external_pool;
+  GstBufferPool *externalpool;
+
   /* by default, codec_data from sinkpad is prepended to first buffer: */
   GstBuffer *codec_data;
 
   /* by default, codec_data from sinkpad is prepended to first buffer: */
   GstBuffer *codec_data;