Enabled to use omx_allocatebuffer for TW2 62/120162/7 accepted/tizen/unified/20170406.053543 submit/tizen/20170404.094130
authorSejun Park <sejun79.park@samsung.com>
Wed, 22 Mar 2017 03:13:00 +0000 (12:13 +0900)
committerSejun Park <sejun79.park@samsung.com>
Thu, 23 Mar 2017 06:07:46 +0000 (15:07 +0900)
Change-Id: I7a59bf5d7604007b55514681be9a62f289a093d9

config/exynos/gstomx.conf
config/exynos64/gstomx.conf
omx/gstomx.c
omx/gstomx.h
omx/gstomxbufferpool.c
omx/gstomxbufferpool.h [changed mode: 0644->0755]
omx/gstomxvideo.c
omx/gstomxvideodec.c
omx/gstomxvideodec.h

index 8262f6c..a41fd06 100755 (executable)
@@ -5,6 +5,8 @@ component-name=OMX.Exynos.MPEG2.Decoder
 rank=258
 in-port-index=0
 out-port-index=1
+in-port-usebuffer=0
+out-port-usebuffer=1
 hacks=no-component-role;no-disable-outport;no-component-reconfigure
 
 [omxdec_mpeg4]
@@ -14,6 +16,8 @@ component-name=OMX.Exynos.MPEG4.Decoder
 rank=258
 in-port-index=0
 out-port-index=1
+in-port-usebuffer=0
+out-port-usebuffer=1
 hacks=no-component-role;no-disable-outport;no-component-reconfigure
 
 [omxdec_h263]
@@ -23,6 +27,8 @@ component-name=OMX.Exynos.H263.Decoder
 rank=258
 in-port-index=0
 out-port-index=1
+in-port-usebuffer=0
+out-port-usebuffer=1
 hacks=no-component-role;no-disable-outport;no-component-reconfigure
 
 [omxdec_h264]
@@ -32,6 +38,8 @@ component-name=OMX.Exynos.AVC.Decoder
 rank=258
 in-port-index=0
 out-port-index=1
+in-port-usebuffer=0
+out-port-usebuffer=1
 hacks=no-component-role;no-disable-outport;no-component-reconfigure
 
 [omxdec_vc1]
@@ -41,6 +49,8 @@ component-name=OMX.Exynos.WMV.Decoder
 rank=256
 in-port-index=0
 out-port-index=1
+in-port-usebuffer=0
+out-port-usebuffer=1
 hacks=no-component-role;no-disable-outport
 sink-template-caps=video/x-wmv,wmvversion=(int)3,format=(string){WMV3,WVC1},width=(int)[1,MAX],height=(int)[1,MAX]
 
@@ -51,6 +61,8 @@ component-name=OMX.Exynos.AVC.Encoder
 rank=258
 in-port-index=0
 out-port-index=1
+in-port-usebuffer=1
+out-port-usebuffer=1
 hacks=no-disable-outport;no-component-role
 sink-template-caps=video/x-raw, format=(string)SN12, width=(int) [1,1920], height=(int) [1,1080], framerate=(fraction)[0/1, MAX]
 src-template-caps=video/x-h264, width=(int) [1,1920], height=(int) [1,1080], framerate=(fraction) [0/1, MAX], alignment=(string) au, stream-format = (string){ avc, byte-stream }
@@ -62,6 +74,8 @@ component-name=OMX.Exynos.MPEG4.Encoder
 rank=258
 in-port-index=0
 out-port-index=1
+in-port-usebuffer=1
+out-port-usebuffer=1
 hacks=no-component-role;no-disable-outport
 
 [omxenc_h263]
@@ -71,4 +85,6 @@ component-name=OMX.Exynos.H263.Encoder
 rank=258
 in-port-index=0
 out-port-index=1
+in-port-usebuffer=1
+out-port-usebuffer=1
 hacks=no-component-role;no-disable-outport
index 44b3c63..c512b7e 100755 (executable)
@@ -5,6 +5,8 @@ component-name=OMX.Exynos.MPEG2.Decoder
 rank=258
 in-port-index=0
 out-port-index=1
+in-port-usebuffer=0
+out-port-usebuffer=1
 hacks=no-component-role;no-disable-outport;no-component-reconfigure
 
 [omxdec_mpeg4]
@@ -14,6 +16,8 @@ component-name=OMX.Exynos.MPEG4.Decoder
 rank=258
 in-port-index=0
 out-port-index=1
+in-port-usebuffer=0
+out-port-usebuffer=1
 hacks=no-component-role;no-disable-outport;no-component-reconfigure
 
 [omxdec_h263]
@@ -23,6 +27,8 @@ component-name=OMX.Exynos.H263.Decoder
 rank=258
 in-port-index=0
 out-port-index=1
+in-port-usebuffer=0
+out-port-usebuffer=1
 hacks=no-component-role;no-disable-outport;no-component-reconfigure
 
 [omxdec_h264]
@@ -32,6 +38,8 @@ component-name=OMX.Exynos.AVC.Decoder
 rank=258
 in-port-index=0
 out-port-index=1
+in-port-usebuffer=0
+out-port-usebuffer=1
 hacks=no-component-role;no-disable-outport;no-component-reconfigure
 
 [omxdec_vc1]
@@ -41,6 +49,8 @@ component-name=OMX.Exynos.WMV.Decoder
 rank=256
 in-port-index=0
 out-port-index=1
+in-port-usebuffer=0
+out-port-usebuffer=1
 hacks=no-component-role;no-disable-outport
 sink-template-caps=video/x-wmv,wmvversion=(int)3,format=(string){WMV3,WVC1},width=(int)[1,MAX],height=(int)[1,MAX]
 
@@ -62,6 +72,8 @@ component-name=OMX.Exynos.MPEG4.Encoder
 rank=258
 in-port-index=0
 out-port-index=1
+in-port-usebuffer=1
+out-port-usebuffer=1
 hacks=no-component-role;no-disable-outport
 
 [omxenc_h263]
@@ -71,4 +83,6 @@ component-name=OMX.Exynos.H263.Encoder
 rank=258
 in-port-index=0
 out-port-index=1
+in-port-usebuffer=1
+out-port-usebuffer=1
 hacks=no-component-role;no-disable-outport
index 7010b03..19b533a 100755 (executable)
@@ -1008,6 +1008,23 @@ gst_omx_component_get_last_error_string (GstOMXComponent * comp)
   return gst_omx_error_to_string (gst_omx_component_get_last_error (comp));
 }
 
+#ifdef TIZEN_FEATURE_OMX
+OMX_ERRORTYPE
+gst_omx_component_get_extension_index (GstOMXComponent * comp, OMX_STRING name,
+  OMX_INDEXTYPE * index)
+{
+  OMX_ERRORTYPE err;
+
+  g_return_val_if_fail (comp != NULL, OMX_ErrorUndefined);
+
+  GST_DEBUG_OBJECT (comp->parent, "Getting %s parameter index for %s", comp->name, name);
+  err = OMX_GetExtensionIndex (comp->handle, name, index);
+  GST_DEBUG_OBJECT (comp->parent, "Got %s parameter index 0x%08x: %s (0x%08x)", comp->name, *index, gst_omx_error_to_string (err), err);
+
+  return err;
+}
+#endif
+
 /* comp->lock must be unlocked while calling this */
 OMX_ERRORTYPE
 gst_omx_component_get_parameter (GstOMXComponent * comp, OMX_INDEXTYPE index,
@@ -1423,11 +1440,12 @@ gst_omx_port_release_buffer (GstOMXPort * port, GstOMXBuffer * buf)
 
   if (port->port_def.eDir == OMX_DirInput) {
     GST_LOG_OBJECT (comp->parent,"Calling OMX_EmptyThisBuffer. dmabuf_fd : [%d(%p)0x%02x, 0x%02x], nFilledLen : %d\n",
-      buf->mm_vbuffer->handle.dmabuf_fd[0], buf, buf->omx_buf->pBuffer[4], buf->omx_buf->pBuffer[10], buf->omx_buf->nFilledLen);
+        buf->mm_vbuffer ? buf->mm_vbuffer->handle.dmabuf_fd[0] : 0, buf, buf->omx_buf->pBuffer[4],
+        buf->omx_buf->pBuffer[10], buf->omx_buf->nFilledLen);
     err = OMX_EmptyThisBuffer (comp->handle, buf->omx_buf);
   } else {
     GST_LOG_OBJECT (comp->parent,"Calling OMX_FillThisBuffer. dmabuf_fd : [%d(%p)]\n",
-         buf->mm_vbuffer->handle.dmabuf_fd[0], buf);
+        buf->mm_vbuffer->handle.dmabuf_fd[0], buf);
     err = OMX_FillThisBuffer (comp->handle, buf->omx_buf);
   }
   GST_DEBUG_OBJECT (comp->parent, "Released buffer %p to %s port %u: %s "
@@ -1592,7 +1610,7 @@ gst_omx_port_allocate_buffers_unlocked (GstOMXPort * port,
 {
   GstOMXComponent *comp;
   OMX_ERRORTYPE err = OMX_ErrorNone;
-  gint i;
+  gint i = 0;
   const GList *l;
 
   g_assert (!port->buffers || port->buffers->len == 0);
@@ -1640,6 +1658,7 @@ gst_omx_port_allocate_buffers_unlocked (GstOMXPort * port,
     buf->settings_cookie = port->settings_cookie;
 
 #ifdef TIZEN_FEATURE_OMX
+    if (buffers)
       buf->mm_vbuffer = (MMVideoBuffer*) l->data;
 #endif
 
@@ -1713,9 +1732,11 @@ gst_omx_port_allocate_buffers (GstOMXPort * port)
 #ifdef TIZEN_FEATURE_OMX
 /* NOTE: Uses comp->lock and comp->messages_lock */
 OMX_ERRORTYPE
-gst_omx_port_tbm_allocate_dec_buffers (GstOMXPort * port, tbm_bufmgr bufMgr, int eCompressionFormat)
+gst_omx_port_tbm_allocate_dec_buffers (GstOMXPort * port, tbm_bufmgr bufmgr, int eCompressionFormat, gboolean use_buffer)
 {
   guint n = 0;
+  gint num = 0;
+  gint i = 0 , j = 0;
   int y_size = 0;
   int uv_size = 0;
   GList *buffers = NULL;
@@ -1734,61 +1755,60 @@ gst_omx_port_tbm_allocate_dec_buffers (GstOMXPort * port, tbm_bufmgr bufMgr, int
   if (port->buffers)
       gst_omx_port_deallocate_buffers(port);
 
-  n = port->port_def.nBufferCountActual;
-
-  for (int i = 0; i < n; i++) {
-    mm_vbuffer[i] = (MMVideoBuffer*) malloc(sizeof(MMVideoBuffer));
+  if (use_buffer) {
+    n = port->port_def.nBufferCountActual;
 
-    if (port->index == 0) {
-      mm_vbuffer[i]->handle.bo[0] = tbm_bo_alloc(bufMgr, port->port_def.nBufferSize, TBM_BO_WC);
+    for (int i = 0; i < n; i++) {
+      mm_vbuffer[i] = (MMVideoBuffer*) malloc(sizeof(MMVideoBuffer));
+      memset (mm_vbuffer[i], 0, sizeof (MMVideoBuffer));
 
-      handle_bo = tbm_bo_get_handle(mm_vbuffer[i]->handle.bo[0], TBM_DEVICE_MM);
-      mm_vbuffer[i]->handle.dmabuf_fd[0] = handle_bo.u32;
-
-      handle_bo = tbm_bo_get_handle(mm_vbuffer[i]->handle.bo[0], TBM_DEVICE_CPU);
-      mm_vbuffer[i]->data[0] = handle_bo.ptr;
-      mm_vbuffer[i]->size[0] = port->port_def.nBufferSize;
-      mm_vbuffer[i]->type = MM_VIDEO_BUFFER_TYPE_TBM_BO;
+      if (port->index == 0) {
+        mm_vbuffer[i]->handle.bo[0] = tbm_bo_alloc (bufmgr, port->port_def.nBufferSize, TBM_BO_WC);
+        mm_vbuffer[i]->size[0] = port->port_def.nBufferSize;
+        mm_vbuffer[i]->plane_num = 1;
+      } else {
+        y_size = gst_omx_calculate_y_size (eCompressionFormat,
+          port->port_def.format.video.nStride, port->port_def.format.video.nSliceHeight);
 
-      GST_INFO_OBJECT (comp->parent,
-        "Allocating %d buffer bo[0]:%p fd[0]:%d size[0]:%d for %s port %u",
-        i, mm_vbuffer[i]->handle.bo[0], mm_vbuffer[i]->handle.dmabuf_fd[0],
-        mm_vbuffer[i]->size[0], comp->name, (guint) port->index);
-      } else { /* output port */
-        y_size = gst_omx_calculate_y_size(eCompressionFormat,
-                 port->port_def.format.video.nStride, port->port_def.format.video.nSliceHeight);
-
-        mm_vbuffer[i]->handle.bo[0] = tbm_bo_alloc(bufMgr, y_size, TBM_BO_WC);
-        handle_bo = tbm_bo_get_handle(mm_vbuffer[i]->handle.bo[0], TBM_DEVICE_MM);
-        mm_vbuffer[i]->handle.dmabuf_fd[0] = handle_bo.u32;
-        handle_bo = tbm_bo_get_handle(mm_vbuffer[i]->handle.bo[0], TBM_DEVICE_CPU);
-        mm_vbuffer[i]->data[0] = handle_bo.ptr;
+        mm_vbuffer[i]->handle.bo[0] = tbm_bo_alloc (bufmgr, y_size, TBM_BO_WC);
         mm_vbuffer[i]->size[0] = y_size;
-
-        uv_size = gst_omx_calculate_uv_size(eCompressionFormat,
-                  port->port_def.format.video.nStride, port->port_def.format.video.nSliceHeight >> 1);
-        mm_vbuffer[i]->handle.bo[1] = tbm_bo_alloc(bufMgr, uv_size, TBM_BO_WC);
-
-        handle_bo = tbm_bo_get_handle(mm_vbuffer[i]->handle.bo[1], TBM_DEVICE_MM);
-        mm_vbuffer[i]->handle.dmabuf_fd[1] = handle_bo.u32;
-
-        handle_bo = tbm_bo_get_handle(mm_vbuffer[i]->handle.bo[1], TBM_DEVICE_CPU);
-        mm_vbuffer[i]->data[1] = handle_bo.ptr;
+        mm_vbuffer[i]->width[0] = port->port_def.format.video.nFrameWidth;
+        mm_vbuffer[i]->height[0] = port->port_def.format.video.nFrameHeight;
+        mm_vbuffer[i]->stride_width[0] = port->port_def.format.video.nStride;
+        mm_vbuffer[i]->stride_height[0] = port->port_def.format.video.nSliceHeight;
+
+        uv_size = gst_omx_calculate_uv_size (eCompressionFormat,
+          port->port_def.format.video.nStride, port->port_def.format.video.nSliceHeight >> 1);
+        mm_vbuffer[i]->handle.bo[1] = tbm_bo_alloc (bufmgr, uv_size, TBM_BO_WC);
         mm_vbuffer[i]->size[1] = uv_size;
-        mm_vbuffer[i]->type = MM_VIDEO_BUFFER_TYPE_TBM_BO;
+        mm_vbuffer[i]->width[1] = port->port_def.format.video.nFrameWidth;
+        mm_vbuffer[i]->height[1] = port->port_def.format.video.nFrameHeight>>1;
+        mm_vbuffer[i]->stride_width[1] = port->port_def.format.video.nStride;
+        mm_vbuffer[i]->stride_height[1] = port->port_def.format.video.nSliceHeight>>1;
         mm_vbuffer[i]->plane_num = 2;
+        mm_vbuffer[i]->type = MM_VIDEO_BUFFER_TYPE_TBM_BO;
+      }
 
-        GST_INFO_OBJECT (comp->parent,
-          "Allocating %d buffer bo[0]:%p bo[1]:%p fd[0]:%d fd[1]:%d size[0]:%d size[1]:%d for %s port %u", i,
-          mm_vbuffer[i]->handle.bo[0], mm_vbuffer[i]->handle.bo[1], mm_vbuffer[i]->handle.dmabuf_fd[0], mm_vbuffer[i]->handle.dmabuf_fd[1],
-          mm_vbuffer[i]->size[0], mm_vbuffer[i]->size[1], comp->name, (guint) port->index);
+      for (j = 0; j < port->index+1; j++) {
+        handle_bo = tbm_bo_get_handle(mm_vbuffer[i]->handle.bo[j], TBM_DEVICE_MM);
+        mm_vbuffer[i]->handle.dmabuf_fd[j] = handle_bo.u32;
 
+        handle_bo = tbm_bo_get_handle(mm_vbuffer[i]->handle.bo[j], TBM_DEVICE_CPU);
+        mm_vbuffer[i]->data[j] = handle_bo.ptr;
       }
-      buffers = g_list_append(buffers,(gpointer)mm_vbuffer[i]);
+
+      GST_INFO_OBJECT (comp->parent,
+        "Allocating %d buffer bo[0]:%p bo[1]:%p fd[0]:%d fd[1]:%d size[0]:%d size[1]:%d for %s port %u", i,
+        mm_vbuffer[i]->handle.bo[0], mm_vbuffer[i]->handle.bo[1], mm_vbuffer[i]->handle.dmabuf_fd[0], mm_vbuffer[i]->handle.dmabuf_fd[1],
+        mm_vbuffer[i]->size[0], mm_vbuffer[i]->size[1], comp->name, (guint) port->index);
+
+      buffers = g_list_append(buffers, (gpointer)mm_vbuffer[i]);
+    }
   }
 
-  n = g_list_length ((GList *) buffers);
-  err = gst_omx_port_allocate_buffers_unlocked (port, buffers, NULL, n);
+  num = use_buffer ? g_list_length ((GList *) buffers) : -1;
+  err = gst_omx_port_allocate_buffers_unlocked (port, buffers, NULL, num);
+
   g_mutex_unlock (&port->comp->lock);
 
   return err;
@@ -1796,7 +1816,7 @@ gst_omx_port_tbm_allocate_dec_buffers (GstOMXPort * port, tbm_bufmgr bufMgr, int
 
 /* NOTE: Uses comp->lock and comp->messages_lock */
 OMX_ERRORTYPE
-gst_omx_port_tbm_allocate_enc_buffers (GstOMXPort * port, tbm_bufmgr bufMgr, int eCompressionFormat)
+gst_omx_port_tbm_allocate_enc_buffers (GstOMXPort * port, tbm_bufmgr bufmgr, int eCompressionFormat)
 {
   int y_size = 0;
   int uv_size = 0;
@@ -1819,7 +1839,7 @@ gst_omx_port_tbm_allocate_enc_buffers (GstOMXPort * port, tbm_bufmgr bufMgr, int
     mm_vbuffer[i] = (MMVideoBuffer*)malloc(sizeof(MMVideoBuffer));
 
     if (port->index == 1) {
-      mm_vbuffer[i]->handle.bo[0] = tbm_bo_alloc(bufMgr, port->port_def.nBufferSize, TBM_BO_WC);
+      mm_vbuffer[i]->handle.bo[0] = tbm_bo_alloc(bufmgr, port->port_def.nBufferSize, TBM_BO_WC);
       handle_bo = tbm_bo_get_handle(mm_vbuffer[i]->handle.bo[0], TBM_DEVICE_MM);
       mm_vbuffer[i]->handle.dmabuf_fd[0] = handle_bo.u32;
 
@@ -1879,7 +1899,7 @@ gst_omx_port_deallocate_buffers_unlocked (GstOMXPort * port)
 {
   GstOMXComponent *comp;
   OMX_ERRORTYPE err = OMX_ErrorNone;
-  gint i, n;
+  gint i = 0, n = 0;
 
   g_return_val_if_fail (!port->tunneled, OMX_ErrorBadParameter);
 
@@ -1922,7 +1942,7 @@ gst_omx_port_deallocate_buffers_unlocked (GstOMXPort * port)
         tbm_bo_unref(buf->mm_vbuffer->handle.bo[0]);
         if(port->index == 1) /* output port */
             tbm_bo_unref(buf->mm_vbuffer->handle.bo[1]);
-        free(buf->mm_vbuffer);
+        g_free(buf->mm_vbuffer);
         buf->mm_vbuffer = NULL;
     }
 #endif
@@ -2750,6 +2770,7 @@ _class_init (gpointer g_class, gpointer data)
   GError *err;
   gchar *core_name, *component_name, *component_role;
   gint in_port_index, out_port_index;
+  gint in_port_usebuffer, out_port_usebuffer;
   gchar *template_caps;
   GstPadTemplate *templ;
   GstCaps *caps;
@@ -2816,6 +2837,30 @@ _class_init (gpointer g_class, gpointer data)
   }
   class_data->out_port_index = out_port_index;
 
+#ifdef TIZEN_FEATURE_OMX
+  err = NULL;
+  in_port_usebuffer =
+      g_key_file_get_integer (config, element_name, "in-port-usebuffer", &err);
+  if (err != NULL) {
+    GST_DEBUG ("No 'in-port-usebuffer' set for element '%s', auto-detecting: %s",
+        element_name, err->message);
+    in_port_usebuffer = 0;
+    g_error_free (err);
+  }
+  class_data->in_port_usebuffer = in_port_usebuffer;
+
+  err = NULL;
+  out_port_usebuffer =
+      g_key_file_get_integer (config, element_name, "out-port-usebuffer", &err);
+  if (err != NULL) {
+    GST_DEBUG ("No 'out-port-usebuffer' set for element '%s', auto-detecting: %s",
+        element_name, err->message);
+    out_port_usebuffer = 1;
+    g_error_free (err);
+  }
+  class_data->out_port_usebuffer = out_port_usebuffer;
+#endif
+
   /* Add pad templates */
   err = NULL;
   if (class_data->type != GST_OMX_COMPONENT_TYPE_SOURCE) {
index 6a8234a..a245b88 100755 (executable)
@@ -319,6 +319,9 @@ struct _GstOMXPort {
   gboolean enabled_pending;  /* TRUE after OMX_Command{En,Dis}able */
   gboolean disabled_pending; /* was done until it took effect */
   gboolean eos; /* TRUE after a buffer with EOS flag was received */
+#ifdef TIZEN_FEATURE_OMX
+  gboolean use_buffer;
+#endif
 
   /* Increased whenever the settings of these port change.
    * If settings_cookie != configured_settings_cookie
@@ -391,6 +394,9 @@ struct _GstOMXClassData {
   const gchar *default_sink_template_caps;
 
   guint32 in_port_index, out_port_index;
+#ifdef TIZEN_FEATURE_OMX
+  guint32 in_port_usebuffer, out_port_usebuffer;
+#endif
 
   guint64 hacks;
 
@@ -442,7 +448,7 @@ gboolean          gst_omx_port_is_flushing (GstOMXPort *port);
 
 OMX_ERRORTYPE     gst_omx_port_allocate_buffers (GstOMXPort *port);
 #ifdef TIZEN_FEATURE_OMX
-OMX_ERRORTYPE     gst_omx_port_tbm_allocate_dec_buffers (GstOMXPort * port, tbm_bufmgr  bufMgr, int eCompressionFormat);
+OMX_ERRORTYPE     gst_omx_port_tbm_allocate_dec_buffers (GstOMXPort * port, tbm_bufmgr  bufMgr, int eCompressionFormat, gboolean use_buffer);
 OMX_ERRORTYPE     gst_omx_port_tbm_allocate_enc_buffers (GstOMXPort * port, tbm_bufmgr  bufMgr, int eCompressionFormat);
 #endif
 OMX_ERRORTYPE     gst_omx_port_use_buffers (GstOMXPort *port, const GList *buffers);
index 689469e..2d47370 100755 (executable)
@@ -467,6 +467,8 @@ gst_omx_buffer_pool_alloc_buffer (GstBufferPool * bpool,
 
   *buffer = buf;
 
+  pool->num_buffers++;
+  GST_DEBUG_OBJECT (pool, "alloc buffers : %d %d", pool->num_buffers, pool->current_buffer_index);
   pool->current_buffer_index++;
 
   return GST_FLOW_OK;
@@ -490,6 +492,8 @@ gst_omx_buffer_pool_free_buffer (GstBufferPool * bpool, GstBuffer * buffer)
 
   GST_BUFFER_POOL_CLASS (gst_omx_buffer_pool_parent_class)->free_buffer (bpool,
       buffer);
+  GST_DEBUG_OBJECT (pool, "free buffers : %d %d", pool->num_buffers, pool->current_buffer_index);
+  pool->num_buffers--;
 }
 
 static GstFlowReturn
@@ -507,6 +511,8 @@ gst_omx_buffer_pool_acquire_buffer (GstBufferPool * bpool,
     buf = g_ptr_array_index (pool->buffers, pool->current_buffer_index);
     g_return_val_if_fail (buf != NULL, GST_FLOW_ERROR);
     *buffer = buf;
+    pool->num_buffers--;
+    GST_DEBUG_OBJECT (pool, "acquire buffers : %d %d", pool->num_buffers, pool->current_buffer_index);
     ret = GST_FLOW_OK;
 
     /* If it's our own memory we have to set the sizes */
@@ -543,6 +549,8 @@ gst_omx_buffer_pool_release_buffer (GstBufferPool * bpool, GstBuffer * buffer)
         gst_omx_buffer_data_quark);
     if (pool->port->port_def.eDir == OMX_DirOutput && !omx_buf->used) {
       /* Release back to the port, can be filled again */
+      pool->num_buffers++;
+      GST_DEBUG_OBJECT (pool, "release buffers : %d %d", pool->num_buffers, pool->current_buffer_index);
       err = gst_omx_port_release_buffer (pool->port, omx_buf);
       if (err != OMX_ErrorNone) {
         GST_ELEMENT_ERROR (pool->element, LIBRARY, SETTINGS, (NULL),
old mode 100644 (file)
new mode 100755 (executable)
index 76f9680..87b27d3
@@ -78,6 +78,9 @@ struct _GstOMXBufferPool
    * wrapped
    */
   gint current_buffer_index;
+#ifdef TIZEN_FEATURE_OMX
+  gint num_buffers;
+#endif
 };
 
 struct _GstOMXBufferPoolClass
index 2d702d2..b4b7247 100755 (executable)
@@ -45,7 +45,11 @@ gst_omx_video_get_format_from_omx (OMX_COLOR_FORMATTYPE omx_colorformat)
       format = GST_VIDEO_FORMAT_I420;
       break;
     case OMX_COLOR_FormatYUV420SemiPlanar:
+#ifdef TIZEN_FEATURE_OMX
+      format = GST_VIDEO_FORMAT_SN12;
+#else
       format = GST_VIDEO_FORMAT_NV12;
+#endif
       break;
     case OMX_COLOR_FormatYUV422SemiPlanar:
       format = GST_VIDEO_FORMAT_NV16;
index 7874971..88472b3 100755 (executable)
@@ -152,7 +152,7 @@ gst_omx_video_dec_init (GstOMXVideoDec * self)
   g_cond_init (&self->drain_cond);
 
 #ifdef TIZEN_FEATURE_OMX
-  self->hTBMBufMgr = NULL;
+  self->bufmgr = NULL;
   self->drm_fd = -1;
 #endif
 }
@@ -163,6 +163,7 @@ gst_omx_video_dec_open (GstVideoDecoder * decoder)
   GstOMXVideoDec *self = GST_OMX_VIDEO_DEC (decoder);
   GstOMXVideoDecClass *klass = GST_OMX_VIDEO_DEC_GET_CLASS (self);
   gint in_port_index, out_port_index;
+  gint in_port_usebuffer, out_port_usebuffer;
 
   GST_DEBUG_OBJECT (self, "Opening decoder");
 
@@ -211,12 +212,14 @@ gst_omx_video_dec_open (GstVideoDecoder * decoder)
     return FALSE;
 
 #ifdef TIZEN_FEATURE_OMX
-
-   self->hTBMBufMgr = tbm_bufmgr_init(self->drm_fd);
-   if(self->hTBMBufMgr == NULL){
+  self->bufmgr = tbm_bufmgr_init(self->drm_fd);
+  if(self->bufmgr == NULL) {
     GST_ERROR_OBJECT (self, "TBM initialization failed.");
     return FALSE;
-   }
+  }
+
+  self->dec_in_port->use_buffer = klass->cdata.in_port_usebuffer;
+  self->dec_out_port->use_buffer = klass->cdata.out_port_usebuffer;
 #endif
 
   GST_DEBUG_OBJECT (self, "Opened decoder");
@@ -318,9 +321,9 @@ gst_omx_video_dec_shutdown (GstOMXVideoDec * self)
 
 #ifdef TIZEN_FEATURE_OMX
    /* uninitialize tbm buffer manager */
-   if(self->hTBMBufMgr != NULL){
-    tbm_bufmgr_deinit(self->hTBMBufMgr);
-    self->hTBMBufMgr = NULL;
+   if(self->bufmgr != NULL){
+    tbm_bufmgr_deinit(self->bufmgr);
+    self->bufmgr = NULL;
    }
 
    if(self->drm_fd != -1) {
@@ -416,9 +419,6 @@ gst_omx_video_dec_change_state (GstElement * element, GstStateChange transition)
       break;
   }
 
-  if (ret == GST_STATE_CHANGE_FAILURE)
-    return ret;
-
   ret =
       GST_ELEMENT_CLASS (gst_omx_video_dec_parent_class)->change_state
       (element, transition);
@@ -580,8 +580,8 @@ gst_omx_video_dec_fill_buffer (GstOMXVideoDec * self,
       mm_vbuffer->type = MM_VIDEO_BUFFER_TYPE_TBM_BO;
 
       if (mm_vbuffer->type == MM_VIDEO_BUFFER_TYPE_TBM_BO) {
-        GST_LOG_OBJECT (self, "dec output buf: fd[0]:%d  fd[1]:%d fd[2]:%d  w[0]:%d h[0]:%d  buf_share_method:%d",
-                mm_vbuffer->handle.dmabuf_fd[0], mm_vbuffer->handle.dmabuf_fd[1], mm_vbuffer->handle.dmabuf_fd[2],
+        GST_LOG_OBJECT (self, "dec output buf: bo[0] :%p, bo[1] : %p, fd[0]:%d  fd[1]:%d fd[2]:%d  w[0]:%d h[0]:%d  buf_share_method:%d",
+                mm_vbuffer->handle.bo[0], mm_vbuffer->handle.bo[1], mm_vbuffer->handle.dmabuf_fd[0], mm_vbuffer->handle.dmabuf_fd[1], mm_vbuffer->handle.dmabuf_fd[2],
                 mm_vbuffer->width[0], mm_vbuffer->height[0], mm_vbuffer->type);
       } else if (mm_vbuffer->type == MM_VIDEO_BUFFER_TYPE_PHYSICAL_ADDRESS) {
         GST_LOG_OBJECT (self, "dec output uses hw addr");
@@ -902,8 +902,8 @@ gst_omx_video_dec_allocate_output_buffers (GstOMXVideoDec * self)
       was_enabled = FALSE;
     }
 #ifdef TIZEN_FEATURE_OMX
-    err = gst_omx_port_tbm_allocate_dec_buffers(port, self->hTBMBufMgr,
-      self->dec_in_port->port_def.format.video.eCompressionFormat);
+    err = gst_omx_port_tbm_allocate_dec_buffers (port, self->bufmgr,
+        self->dec_in_port->port_def.format.video.eCompressionFormat, port->use_buffer);
 #else
     err = gst_omx_port_allocate_buffers (port);
 #endif
@@ -938,8 +938,8 @@ gst_omx_video_dec_allocate_output_buffers (GstOMXVideoDec * self)
         }
       }
 #ifdef TIZEN_FEATURE_OMX
-      err = gst_omx_port_tbm_allocate_dec_buffers(port, self->hTBMBufMgr,
-          self->dec_in_port->port_def.format.video.eCompressionFormat);
+      err = gst_omx_port_tbm_allocate_dec_buffers (port, self->bufmgr,
+          self->dec_in_port->port_def.format.video.eCompressionFormat, port->use_buffer);
 #else
       err = gst_omx_port_allocate_buffers (port);
 #endif
@@ -1582,7 +1582,7 @@ gst_omx_video_dec_loop (GstOMXVideoDec * self)
   } else if (buf->omx_buf->nFilledLen > 0 || buf->eglimage) {
     if (self->out_port_pool) {
       gint i, n;
-      GstBuffer *outbuf;
+      GstBuffer *outbuf = NULL;
       GstBufferPoolAcquireParams params = { 0, };
 
       n = port->buffers->len;
@@ -1932,19 +1932,20 @@ gst_omx_video_dec_negotiate (GstOMXVideoDec * self)
   }
 
 #ifdef TIZEN_FEATURE_OMX
-  for(i=0; i<gst_caps_get_size(intersection); i++)
+  for(i = 0; i < gst_caps_get_size (intersection); i++)
   {
       s = gst_caps_get_structure (intersection, i);
-      format_tmp = gst_structure_get_string (s, "format");
+      if (format_tmp = gst_structure_get_string (s, "format")) {
 
-      if(!strncmp(format_tmp, "S", 1)) {
+        if (!strncmp (format_tmp, "S", 1)) {
           format_str = format_tmp;
           GST_DEBUG_OBJECT (self, "SEC format found");
           break;
+        }
       }
   }
 
-  if(!format_str) {
+  if (!format_str) {
     intersection = gst_caps_truncate (intersection);
     intersection = gst_caps_fixate (intersection);
 
@@ -2001,6 +2002,16 @@ gst_omx_video_dec_negotiate (GstOMXVideoDec * self)
   gemBuffers.enable = OMX_TRUE;
   gemBuffers.nPortIndex = 1;
 
+  OMX_INDEXTYPE index = OMX_IndexComponentStartUnused;
+
+  err = OMX_GetExtensionIndex(self->dec->handle, "OMX.SEC.index.enablePlatformSpecificBuffers", &index);
+  if (err != OMX_ErrorNone || index == OMX_IndexComponentStartUnused) {
+    GST_INFO_OBJECT (self, "can not get index for OMX_GetExtensionIndex enablePlatformSpecificBuffers");
+  }
+
+  err = gst_omx_component_set_parameter(self->dec, index, &gemBuffers);
+
+#if 0
   err =
       gst_omx_component_set_parameter (self->dec,
       OMX_IndexParamEnablePlatformSpecificBuffers,&gemBuffers);
@@ -2023,6 +2034,7 @@ gst_omx_video_dec_negotiate (GstOMXVideoDec * self)
         gst_omx_error_to_string (err), err);
   }
 #endif
+#endif
   gst_caps_unref (intersection);
   return (err == OMX_ErrorNone);
 }
@@ -2210,7 +2222,8 @@ gst_omx_video_dec_set_format (GstVideoDecoder * decoder,
     if (gst_omx_port_set_enabled (self->dec_in_port, TRUE) != OMX_ErrorNone)
       return FALSE;
 #ifdef TIZEN_FEATURE_OMX
-    if(gst_omx_port_tbm_allocate_dec_buffers(self->dec_in_port, self->hTBMBufMgr, 0) != OMX_ErrorNone)
+    if (gst_omx_port_tbm_allocate_dec_buffers (self->dec_in_port,
+        self->bufmgr, 0, self->dec_in_port->use_buffer) != OMX_ErrorNone)
      return FALSE;
 #else
     if (gst_omx_port_allocate_buffers (self->dec_in_port) != OMX_ErrorNone)
@@ -2253,10 +2266,12 @@ gst_omx_video_dec_set_format (GstVideoDecoder * decoder,
 
       /* Need to allocate buffers to reach Idle state */
 #ifdef TIZEN_FEATURE_OMX
-      if(gst_omx_port_tbm_allocate_dec_buffers(self->dec_in_port, self->hTBMBufMgr, 0) != OMX_ErrorNone)
+      if (gst_omx_port_tbm_allocate_dec_buffers (self->dec_in_port,
+          self->bufmgr, 0, self->dec_in_port->use_buffer) != OMX_ErrorNone)
           return FALSE;
-      if(gst_omx_port_tbm_allocate_dec_buffers(self->dec_out_port, self->hTBMBufMgr,
-          self->dec_in_port->port_def.format.video.eCompressionFormat) != OMX_ErrorNone)
+      if (gst_omx_port_tbm_allocate_dec_buffers (self->dec_out_port,
+          self->bufmgr, self->dec_in_port->port_def.format.video.eCompressionFormat,
+          self->dec_out_port->use_buffer) != OMX_ErrorNone)
           return FALSE;
 #else
       if (gst_omx_port_allocate_buffers (self->dec_in_port) != OMX_ErrorNone)
@@ -2272,10 +2287,12 @@ gst_omx_video_dec_set_format (GstVideoDecoder * decoder,
 
       /* Need to allocate buffers to reach Idle state */
 #ifdef TIZEN_FEATURE_OMX
-      if(gst_omx_port_tbm_allocate_dec_buffers(self->dec_in_port, self->hTBMBufMgr, 0) != OMX_ErrorNone)
+      if (gst_omx_port_tbm_allocate_dec_buffers (self->dec_in_port,
+          self->bufmgr, 0, self->dec_in_port->use_buffer) != OMX_ErrorNone)
           return FALSE;
-      if(gst_omx_port_tbm_allocate_dec_buffers(self->dec_out_port, self->hTBMBufMgr,
-          self->dec_in_port->port_def.format.video.eCompressionFormat) != OMX_ErrorNone)
+      if (gst_omx_port_tbm_allocate_dec_buffers (self->dec_out_port,
+          self->bufmgr, self->dec_in_port->port_def.format.video.eCompressionFormat,
+          self->dec_out_port->use_buffer) != OMX_ErrorNone)
           return FALSE;
 #else
       if (gst_omx_port_allocate_buffers (self->dec_in_port) != OMX_ErrorNone)
@@ -2496,8 +2513,7 @@ gst_omx_video_dec_handle_frame (GstVideoDecoder * decoder,
         goto reconfigure_error;
       }
 #ifdef TIZEN_FEATURE_OMX
-      err = gst_omx_port_tbm_allocate_dec_buffers(port, self->hTBMBufMgr,
-          self->dec_in_port->port_def.format.video.eCompressionFormat);
+      err = gst_omx_port_tbm_allocate_dec_buffers (port, self->bufmgr, 0, port->use_buffer);
 #else
       err = gst_omx_port_allocate_buffers (port);
 #endif
@@ -2552,13 +2568,15 @@ gst_omx_video_dec_handle_frame (GstVideoDecoder * decoder,
       buf->omx_buf->nFilledLen = gst_buffer_get_size (codec_data);;
 
 #ifdef TIZEN_FEATURE_OMX
-      gst_buffer_extract (codec_data, 0,
-          buf->mm_vbuffer->data[0] + buf->omx_buf->nOffset,
-          buf->omx_buf->nFilledLen);
-#else
-      gst_buffer_extract (codec_data, 0,
-          buf->omx_buf->pBuffer + buf->omx_buf->nOffset,
-          buf->omx_buf->nFilledLen);
+      if (port->use_buffer) {
+        gst_buffer_extract (codec_data, 0,
+            buf->mm_vbuffer->data[0] + buf->omx_buf->nOffset,
+            buf->omx_buf->nFilledLen);
+      } else {
+        gst_buffer_extract (codec_data, 0,
+            buf->omx_buf->pBuffer + buf->omx_buf->nOffset,
+            buf->omx_buf->nFilledLen);
+      }
 #endif
 
       if (GST_CLOCK_TIME_IS_VALID (timestamp))
@@ -2587,13 +2605,15 @@ gst_omx_video_dec_handle_frame (GstVideoDecoder * decoder,
     GST_DEBUG_OBJECT (self, "nFilledLen %d, %p", buf->omx_buf->nFilledLen, buf->omx_buf->pBuffer);
 
 #ifdef TIZEN_FEATURE_OMX
-     gst_buffer_extract (frame->input_buffer, offset,
+    if (port->use_buffer) {
+      gst_buffer_extract (frame->input_buffer, offset,
           buf->mm_vbuffer->data[0] + buf->omx_buf->nOffset,
           buf->omx_buf->nFilledLen);
-#else
-    gst_buffer_extract (frame->input_buffer, offset,
-        buf->omx_buf->pBuffer + buf->omx_buf->nOffset,
-        buf->omx_buf->nFilledLen);
+    } else {
+      gst_buffer_extract (frame->input_buffer, offset,
+          buf->omx_buf->pBuffer + buf->omx_buf->nOffset,
+          buf->omx_buf->nFilledLen);
+    }
 #endif
     if (timestamp != GST_CLOCK_TIME_NONE) {
       buf->omx_buf->nTimeStamp =
index 6171b24..0511f31 100755 (executable)
@@ -94,7 +94,7 @@ struct _GstOMXVideoDec
   GstFlowReturn downstream_flow_ret;
 #ifdef TIZEN_FEATURE_OMX
   gint drm_fd;
-  tbm_bufmgr hTBMBufMgr;
+  tbm_bufmgr bufmgr;
 #endif
 #ifdef USE_OMX_TARGET_RPI
   GstOMXComponent *egl_render;