summaryrefslogtreecommitdiff
path: root/msmcobalt/mm-core/src/common/omx_core_cmp.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'msmcobalt/mm-core/src/common/omx_core_cmp.cpp')
-rwxr-xr-xmsmcobalt/mm-core/src/common/omx_core_cmp.cpp407
1 files changed, 407 insertions, 0 deletions
diff --git a/msmcobalt/mm-core/src/common/omx_core_cmp.cpp b/msmcobalt/mm-core/src/common/omx_core_cmp.cpp
new file mode 100755
index 0000000..300abe4
--- /dev/null
+++ b/msmcobalt/mm-core/src/common/omx_core_cmp.cpp
@@ -0,0 +1,407 @@
+/*--------------------------------------------------------------------------
+Copyright (c) 2009, The Linux Foundation. All rights reserved.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are met:
+ * Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+ * Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+ * Neither the name of The Linux Foundation nor
+ the names of its contributors may be used to endorse or promote
+ products derived from this software without specific prior written
+ permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+NON-INFRINGEMENT ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
+CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
+OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
+WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
+OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+--------------------------------------------------------------------------*/
+/*============================================================================
+ O p e n M A X w r a p p e r s
+ O p e n M A X C o r e
+
+ This module contains the implementation of the OpenMAX core Macros which
+ operate directly on the component.
+
+*//*========================================================================*/
+
+//////////////////////////////////////////////////////////////////////////////
+// Include Files
+//////////////////////////////////////////////////////////////////////////////
+#include "qc_omx_common.h"
+#include "omx_core_cmp.h"
+#include "qc_omx_component.h"
+#include <string.h>
+
+
+void * qc_omx_create_component_wrapper(OMX_PTR obj_ptr)
+{
+ qc_omx_component *pThis = (qc_omx_component *)obj_ptr;
+ OMX_COMPONENTTYPE* component = &(pThis->m_cmp);
+ memset(&pThis->m_cmp,0,sizeof(OMX_COMPONENTTYPE));
+
+ component->nSize = sizeof(OMX_COMPONENTTYPE);
+ component->nVersion.nVersion = OMX_SPEC_VERSION;
+ component->pApplicationPrivate = 0;
+ component->pComponentPrivate = obj_ptr;
+
+ component->AllocateBuffer = &qc_omx_component_allocate_buffer;
+ component->FreeBuffer = &qc_omx_component_free_buffer;
+ component->GetParameter = &qc_omx_component_get_parameter;
+ component->SetParameter = &qc_omx_component_set_parameter;
+ component->SendCommand = &qc_omx_component_send_command;
+ component->FillThisBuffer = &qc_omx_component_fill_this_buffer;
+ component->EmptyThisBuffer = &qc_omx_component_empty_this_buffer;
+ component->GetState = &qc_omx_component_get_state;
+ component->GetComponentVersion = &qc_omx_component_get_version;
+ component->GetConfig = &qc_omx_component_get_config;
+ component->SetConfig = &qc_omx_component_set_config;
+ component->GetExtensionIndex = &qc_omx_component_get_extension_index;
+ component->ComponentTunnelRequest = &qc_omx_component_tunnel_request;
+ component->UseBuffer = &qc_omx_component_use_buffer;
+ component->SetCallbacks = &qc_omx_component_set_callbacks;
+ component->UseEGLImage = &qc_omx_component_use_EGL_image;
+ component->ComponentRoleEnum = &qc_omx_component_role_enum;
+ component->ComponentDeInit = &qc_omx_component_deinit;
+ return (void *)component;
+}
+
+
+
+/************************************************************************/
+/* COMPONENT INTERFACE */
+/************************************************************************/
+
+OMX_ERRORTYPE
+qc_omx_component_init(OMX_IN OMX_HANDLETYPE hComp, OMX_IN OMX_STRING componentName)
+{
+ OMX_ERRORTYPE eRet = OMX_ErrorBadParameter;
+ qc_omx_component *pThis = (hComp)? (qc_omx_component *)(((OMX_COMPONENTTYPE *)hComp)->pComponentPrivate):NULL;
+ DEBUG_PRINT("OMXCORE: qc_omx_component_init %p\n", hComp);
+
+ if(pThis)
+ {
+ // call the init fuction
+ eRet = pThis->component_init(componentName);
+
+ if(eRet != OMX_ErrorNone)
+ {
+ // in case of error, please destruct the component created
+ delete pThis;
+ }
+ }
+ return eRet;
+}
+
+
+OMX_ERRORTYPE
+qc_omx_component_get_version(OMX_IN OMX_HANDLETYPE hComp,
+ OMX_OUT OMX_STRING componentName,
+ OMX_OUT OMX_VERSIONTYPE* componentVersion,
+ OMX_OUT OMX_VERSIONTYPE* specVersion,
+ OMX_OUT OMX_UUIDTYPE* componentUUID)
+{
+ OMX_ERRORTYPE eRet = OMX_ErrorBadParameter;
+ qc_omx_component *pThis = (hComp)? (qc_omx_component *)(((OMX_COMPONENTTYPE *)hComp)->pComponentPrivate):NULL;
+ DEBUG_PRINT("OMXCORE: qc_omx_component_get_version %p, %s , %p\n", hComp, componentName, componentVersion);
+ if(pThis)
+ {
+ eRet = pThis->get_component_version(hComp,componentName,componentVersion,specVersion,componentUUID);
+ }
+ return eRet;
+}
+
+OMX_ERRORTYPE
+qc_omx_component_send_command(OMX_IN OMX_HANDLETYPE hComp,
+ OMX_IN OMX_COMMANDTYPE cmd,
+ OMX_IN OMX_U32 param1,
+ OMX_IN OMX_PTR cmdData)
+{
+ OMX_ERRORTYPE eRet = OMX_ErrorBadParameter;
+ qc_omx_component *pThis = (hComp)? (qc_omx_component *)(((OMX_COMPONENTTYPE *)hComp)->pComponentPrivate):NULL;
+ DEBUG_PRINT("OMXCORE: qc_omx_component_send_command %p, %d , %d\n", hComp,(unsigned)cmd,(unsigned)param1);
+
+ if(pThis)
+ {
+ eRet = pThis->send_command(hComp,cmd,param1,cmdData);
+ }
+ return eRet;
+}
+
+OMX_ERRORTYPE
+qc_omx_component_get_parameter(OMX_IN OMX_HANDLETYPE hComp,
+ OMX_IN OMX_INDEXTYPE paramIndex,
+ OMX_INOUT OMX_PTR paramData)
+{
+ OMX_ERRORTYPE eRet = OMX_ErrorBadParameter;
+ qc_omx_component *pThis = (hComp)? (qc_omx_component *)(((OMX_COMPONENTTYPE *)hComp)->pComponentPrivate):NULL;
+ DEBUG_PRINT("OMXCORE: qc_omx_component_get_parameter %p, %p , %d\n", hComp, paramData, paramIndex);
+
+ if(pThis)
+ {
+ eRet = pThis->get_parameter(hComp,paramIndex,paramData);
+ }
+ return eRet;
+}
+
+OMX_ERRORTYPE
+qc_omx_component_set_parameter(OMX_IN OMX_HANDLETYPE hComp,
+ OMX_IN OMX_INDEXTYPE paramIndex,
+ OMX_IN OMX_PTR paramData)
+{
+ OMX_ERRORTYPE eRet = OMX_ErrorBadParameter;
+ qc_omx_component *pThis = (hComp)? (qc_omx_component *)(((OMX_COMPONENTTYPE *)hComp)->pComponentPrivate):NULL;
+ DEBUG_PRINT("OMXCORE: qc_omx_component_set_parameter %p, %p , %d\n", hComp, paramData, paramIndex);
+
+ if(pThis)
+ {
+ eRet = pThis->set_parameter(hComp,paramIndex,paramData);
+ }
+ return eRet;
+}
+
+ OMX_ERRORTYPE
+qc_omx_component_get_config(OMX_IN OMX_HANDLETYPE hComp,
+ OMX_IN OMX_INDEXTYPE configIndex,
+ OMX_INOUT OMX_PTR configData)
+{
+ OMX_ERRORTYPE eRet = OMX_ErrorBadParameter;
+ qc_omx_component *pThis = (hComp)? (qc_omx_component *)(((OMX_COMPONENTTYPE *)hComp)->pComponentPrivate):NULL;
+ DEBUG_PRINT("OMXCORE: qc_omx_component_get_config %p\n", hComp);
+
+ if(pThis)
+ {
+ eRet = pThis->get_config(hComp,
+ configIndex,
+ configData);
+ }
+ return eRet;
+}
+
+ OMX_ERRORTYPE
+qc_omx_component_set_config(OMX_IN OMX_HANDLETYPE hComp,
+ OMX_IN OMX_INDEXTYPE configIndex,
+ OMX_IN OMX_PTR configData)
+{
+ OMX_ERRORTYPE eRet = OMX_ErrorBadParameter;
+ qc_omx_component *pThis = (hComp)? (qc_omx_component *)(((OMX_COMPONENTTYPE *)hComp)->pComponentPrivate):NULL;
+ DEBUG_PRINT("OMXCORE: qc_omx_component_set_config %p\n", hComp);
+
+ if(pThis)
+ {
+ eRet = pThis->set_config(hComp,
+ configIndex,
+ configData);
+ }
+ return eRet;
+}
+
+ OMX_ERRORTYPE
+qc_omx_component_get_extension_index(OMX_IN OMX_HANDLETYPE hComp,
+ OMX_IN OMX_STRING paramName,
+ OMX_OUT OMX_INDEXTYPE* indexType)
+{
+ OMX_ERRORTYPE eRet = OMX_ErrorBadParameter;
+ qc_omx_component *pThis = (hComp)? (qc_omx_component *)(((OMX_COMPONENTTYPE *)hComp)->pComponentPrivate):NULL;
+ if(pThis)
+ {
+ eRet = pThis->get_extension_index(hComp,paramName,indexType);
+ }
+ return eRet;
+}
+
+ OMX_ERRORTYPE
+qc_omx_component_get_state(OMX_IN OMX_HANDLETYPE hComp,
+ OMX_OUT OMX_STATETYPE* state)
+{
+ OMX_ERRORTYPE eRet = OMX_ErrorBadParameter;
+ qc_omx_component *pThis = (hComp)? (qc_omx_component *)(((OMX_COMPONENTTYPE *)hComp)->pComponentPrivate):NULL;
+ DEBUG_PRINT("OMXCORE: qc_omx_component_get_state %p\n", hComp);
+
+ if(pThis)
+ {
+ eRet = pThis->get_state(hComp,state);
+ }
+ return eRet;
+}
+
+ OMX_ERRORTYPE
+qc_omx_component_tunnel_request(OMX_IN OMX_HANDLETYPE hComp,
+ OMX_IN OMX_U32 port,
+ OMX_IN OMX_HANDLETYPE peerComponent,
+ OMX_IN OMX_U32 peerPort,
+ OMX_INOUT OMX_TUNNELSETUPTYPE* tunnelSetup)
+{
+ (void) hComp, (void) port, (void) peerComponent, (void) peerPort, (void) tunnelSetup;
+ DEBUG_PRINT("Error: qc_omx_component_tunnel_request Not Implemented\n");
+ return OMX_ErrorNotImplemented;
+}
+
+ OMX_ERRORTYPE
+qc_omx_component_use_buffer(OMX_IN OMX_HANDLETYPE hComp,
+ OMX_INOUT OMX_BUFFERHEADERTYPE** bufferHdr,
+ OMX_IN OMX_U32 port,
+ OMX_IN OMX_PTR appData,
+ OMX_IN OMX_U32 bytes,
+ OMX_IN OMX_U8* buffer)
+{
+ OMX_ERRORTYPE eRet = OMX_ErrorBadParameter;
+ qc_omx_component *pThis = (hComp)? (qc_omx_component *)(((OMX_COMPONENTTYPE *)hComp)->pComponentPrivate):NULL;
+ DEBUG_PRINT("OMXCORE: qc_omx_component_use_buffer %p\n", hComp);
+
+ if(pThis)
+ {
+ eRet = pThis->use_buffer(hComp,
+ bufferHdr,
+ port,
+ appData,
+ bytes,
+ buffer);
+ }
+ return eRet;
+}
+
+
+// qc_omx_component_allocate_buffer -- API Call
+ OMX_ERRORTYPE
+qc_omx_component_allocate_buffer(OMX_IN OMX_HANDLETYPE hComp,
+ OMX_INOUT OMX_BUFFERHEADERTYPE** bufferHdr,
+ OMX_IN OMX_U32 port,
+ OMX_IN OMX_PTR appData,
+ OMX_IN OMX_U32 bytes)
+{
+
+ OMX_ERRORTYPE eRet = OMX_ErrorBadParameter;
+ qc_omx_component *pThis = (hComp)? (qc_omx_component *)(((OMX_COMPONENTTYPE *)hComp)->pComponentPrivate):NULL;
+ DEBUG_PRINT("OMXCORE: qc_omx_component_allocate_buffer %p, %p , %d\n",hComp, bufferHdr,(unsigned)port);
+
+ if(pThis)
+ {
+ eRet = pThis->allocate_buffer(hComp,bufferHdr,port,appData,bytes);
+ }
+ return eRet;
+}
+
+ OMX_ERRORTYPE
+qc_omx_component_free_buffer(OMX_IN OMX_HANDLETYPE hComp,
+ OMX_IN OMX_U32 port,
+ OMX_IN OMX_BUFFERHEADERTYPE* buffer)
+{
+
+ OMX_ERRORTYPE eRet = OMX_ErrorBadParameter;
+ qc_omx_component *pThis = (hComp)? (qc_omx_component *)(((OMX_COMPONENTTYPE *)hComp)->pComponentPrivate):NULL;
+ DEBUG_PRINT("OMXCORE: qc_omx_component_free_buffer[%d] %p, %p\n", (unsigned)port, hComp, buffer);
+
+ if(pThis)
+ {
+ eRet = pThis->free_buffer(hComp,port,buffer);
+ }
+ return eRet;
+}
+
+ OMX_ERRORTYPE
+qc_omx_component_empty_this_buffer(OMX_IN OMX_HANDLETYPE hComp,
+ OMX_IN OMX_BUFFERHEADERTYPE* buffer)
+{
+ OMX_ERRORTYPE eRet = OMX_ErrorBadParameter;
+ qc_omx_component *pThis = (hComp)? (qc_omx_component *)(((OMX_COMPONENTTYPE *)hComp)->pComponentPrivate):NULL;
+ DEBUG_PRINT("OMXCORE: qc_omx_component_empty_this_buffer %p, %p\n",hComp, buffer);
+
+ if(pThis)
+ {
+ eRet = pThis->empty_this_buffer(hComp,buffer);
+ }
+ return eRet;
+}
+
+ OMX_ERRORTYPE
+qc_omx_component_fill_this_buffer(OMX_IN OMX_HANDLETYPE hComp,
+ OMX_IN OMX_BUFFERHEADERTYPE* buffer)
+{
+ OMX_ERRORTYPE eRet = OMX_ErrorBadParameter;
+ qc_omx_component *pThis = (hComp)? (qc_omx_component *)(((OMX_COMPONENTTYPE *)hComp)->pComponentPrivate):NULL;
+ DEBUG_PRINT("OMXCORE: qc_omx_component_fill_this_buffer %p, %p\n", hComp, buffer);
+ if(pThis)
+ {
+ eRet = pThis->fill_this_buffer(hComp,buffer);
+ }
+ return eRet;
+}
+
+ OMX_ERRORTYPE
+qc_omx_component_set_callbacks(OMX_IN OMX_HANDLETYPE hComp,
+ OMX_IN OMX_CALLBACKTYPE* callbacks,
+ OMX_IN OMX_PTR appData)
+{
+ OMX_ERRORTYPE eRet = OMX_ErrorBadParameter;
+ qc_omx_component *pThis = (hComp)? (qc_omx_component *)(((OMX_COMPONENTTYPE *)hComp)->pComponentPrivate):NULL;
+ DEBUG_PRINT("OMXCORE: qc_omx_component_set_callbacks %p, %p , %p\n", hComp, callbacks, appData);
+
+ if(pThis)
+ {
+ eRet = pThis->set_callbacks(hComp,callbacks,appData);
+ }
+ return eRet;
+}
+
+ OMX_ERRORTYPE
+qc_omx_component_deinit(OMX_IN OMX_HANDLETYPE hComp)
+{
+ OMX_ERRORTYPE eRet = OMX_ErrorBadParameter;
+ qc_omx_component *pThis = (hComp)? (qc_omx_component *)(((OMX_COMPONENTTYPE *)hComp)->pComponentPrivate):NULL;
+ DEBUG_PRINT("OMXCORE: qc_omx_component_deinit %p\n", hComp);
+
+ if(pThis)
+ {
+ // call the deinit fuction first
+ OMX_STATETYPE state;
+ pThis->get_state(hComp,&state);
+ DEBUG_PRINT("Calling FreeHandle in state %d \n", state);
+ eRet = pThis->component_deinit(hComp);
+ // destroy the component.
+ delete pThis;
+ }
+ return eRet;
+}
+
+ OMX_ERRORTYPE
+qc_omx_component_use_EGL_image(OMX_IN OMX_HANDLETYPE hComp,
+ OMX_INOUT OMX_BUFFERHEADERTYPE** bufferHdr,
+ OMX_IN OMX_U32 port,
+ OMX_IN OMX_PTR appData,
+ OMX_IN void* eglImage)
+{
+ OMX_ERRORTYPE eRet = OMX_ErrorBadParameter;
+ qc_omx_component *pThis = (hComp)? (qc_omx_component *)(((OMX_COMPONENTTYPE *)hComp)->pComponentPrivate):NULL;
+ DEBUG_PRINT("OMXCORE: qc_omx_component_use_EGL_image %p, %p , %d\n", hComp, bufferHdr,(unsigned)port);
+ if(pThis)
+ {
+ eRet = pThis->use_EGL_image(hComp,bufferHdr,port,appData,eglImage);
+ }
+ return eRet;
+}
+
+ OMX_ERRORTYPE
+qc_omx_component_role_enum(OMX_IN OMX_HANDLETYPE hComp,
+ OMX_OUT OMX_U8* role,
+ OMX_IN OMX_U32 index)
+{
+ OMX_ERRORTYPE eRet = OMX_ErrorBadParameter;
+ qc_omx_component *pThis = (hComp)? (qc_omx_component *)(((OMX_COMPONENTTYPE *)hComp)->pComponentPrivate):NULL;
+ DEBUG_PRINT("OMXCORE: qc_omx_component_role_enum %p, %p , %d\n", hComp, role,(unsigned)index);
+
+ if(pThis)
+ {
+ eRet = pThis->component_role_enum(hComp,role,index);
+ }
+ return eRet;
+}