From fc9eeb6ae11da3eecfa6463f874df0fb18205c87 Mon Sep 17 00:00:00 2001 From: Sejun Park Date: Wed, 22 Mar 2017 12:13:00 +0900 Subject: [PATCH] Enabled to use omx_allocatebuffer for TW2 Change-Id: I7a59bf5d7604007b55514681be9a62f289a093d9 --- config/exynos/gstomx.conf | 16 +++++ config/exynos64/gstomx.conf | 14 +++++ omx/gstomx.c | 149 ++++++++++++++++++++++++++++---------------- omx/gstomx.h | 8 ++- omx/gstomxbufferpool.c | 8 +++ omx/gstomxbufferpool.h | 3 + omx/gstomxvideo.c | 4 ++ omx/gstomxvideodec.c | 106 ++++++++++++++++++------------- omx/gstomxvideodec.h | 2 +- 9 files changed, 213 insertions(+), 97 deletions(-) mode change 100644 => 100755 omx/gstomxbufferpool.h diff --git a/config/exynos/gstomx.conf b/config/exynos/gstomx.conf index 8262f6c..a41fd06 100755 --- a/config/exynos/gstomx.conf +++ b/config/exynos/gstomx.conf @@ -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 diff --git a/config/exynos64/gstomx.conf b/config/exynos64/gstomx.conf index 44b3c63..c512b7e 100755 --- a/config/exynos64/gstomx.conf +++ b/config/exynos64/gstomx.conf @@ -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 diff --git a/omx/gstomx.c b/omx/gstomx.c index 7010b03..19b533a 100755 --- a/omx/gstomx.c +++ b/omx/gstomx.c @@ -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) { diff --git a/omx/gstomx.h b/omx/gstomx.h index 6a8234a..a245b88 100755 --- a/omx/gstomx.h +++ b/omx/gstomx.h @@ -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); diff --git a/omx/gstomxbufferpool.c b/omx/gstomxbufferpool.c index 689469e..2d47370 100755 --- a/omx/gstomxbufferpool.c +++ b/omx/gstomxbufferpool.c @@ -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), diff --git a/omx/gstomxbufferpool.h b/omx/gstomxbufferpool.h old mode 100644 new mode 100755 index 76f9680..87b27d3 --- a/omx/gstomxbufferpool.h +++ b/omx/gstomxbufferpool.h @@ -78,6 +78,9 @@ struct _GstOMXBufferPool * wrapped */ gint current_buffer_index; +#ifdef TIZEN_FEATURE_OMX + gint num_buffers; +#endif }; struct _GstOMXBufferPoolClass diff --git a/omx/gstomxvideo.c b/omx/gstomxvideo.c index 2d702d2..b4b7247 100755 --- a/omx/gstomxvideo.c +++ b/omx/gstomxvideo.c @@ -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; diff --git a/omx/gstomxvideodec.c b/omx/gstomxvideodec.c index 7874971..88472b3 100755 --- a/omx/gstomxvideodec.c +++ b/omx/gstomxvideodec.c @@ -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; idec->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 = diff --git a/omx/gstomxvideodec.h b/omx/gstomxvideodec.h index 6171b24..0511f31 100755 --- a/omx/gstomxvideodec.h +++ b/omx/gstomxvideodec.h @@ -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; -- 2.7.4