omxil_generic/omxilcomplib/src/omxilcomponentimpl.cpp
changeset 0 0e4a32b9112d
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/omxil_generic/omxilcomplib/src/omxilcomponentimpl.cpp	Wed Aug 25 12:40:50 2010 +0300
@@ -0,0 +1,504 @@
+// Copyright (c) 2008-2009 Nokia Corporation and/or its subsidiary(-ies).
+// All rights reserved.
+// This component and the accompanying materials are made available
+// under the terms of "Eclipse Public License v1.0"
+// which accompanies this distribution, and is available
+// at the URL "http://www.eclipse.org/legal/epl-v10.html".
+//
+// Initial Contributors:
+// Nokia Corporation - initial contribution.
+//
+// Contributors:
+//
+// Description:
+//
+
+/**
+ @file
+ @internalComponent
+*/
+
+#include <openmax/il/khronos/v1_x/OMX_Types.h>
+#include "omxilindexmanager.h"
+#include "omxilportmanager.h"
+#include "omxilcallbackmanager.h"
+#include "omxilincontextcallbackmanager.h"
+#include <openmax/il/common/omxilconfigmanager.h>
+#include <openmax/il/common/omxilprocessingfunction.h>
+#include <openmax/il/common/omxilstatedefs.h>
+#include <openmax/il/common/omxilcomponent.h>
+#include "omxilcomponentimpl.h"
+#include "omxilfsm.h"
+#include "log.h"
+
+COmxILComponentImpl* COmxILComponentImpl::NewL(COmxILComponent* aComponent, OMX_HANDLETYPE aHandle)
+	{
+	if (aComponent==0 || aHandle==0)
+		{
+		User::Leave(KErrArgument);
+		}
+	COmxILComponentImpl* self=new(ELeave) COmxILComponentImpl(aComponent, aHandle);
+	return self;		
+	}
+
+COmxILComponentImpl::COmxILComponentImpl(COmxILComponent* aComponent, OMX_HANDLETYPE aHandle)
+	: 	ipComponent(aComponent),
+		iComponentName(0),
+		ipHandle(static_cast<OMX_COMPONENTTYPE*>(aHandle)),
+		ipAppData(0),
+		ipCallbacks(0),
+		ipFsm(0),
+		ipConfigManager(0),
+		ipCallbackManager(0),
+		ipPortManager(0),
+		ipProcessingFunction(0)
+	{
+	DEBUG_PRINTF3(_L8("COmxILComponentImpl::COmxILComponentImpl : Comp[%X], Handle[%X]"), aComponent, ipHandle);
+	}
+
+COmxILComponentImpl::~COmxILComponentImpl()
+	{
+    DEBUG_PRINTF2(_L8("COmxILComponentImpl::~COmxILComponentImpl : Handle[%X]"), ipHandle);
+	delete ipProcessingFunction;
+	delete ipPortManager;
+	delete ipConfigManager;
+	delete ipFsm;
+	delete ipCallbackManager;	
+	iComponentName.Close();
+	}
+
+OMX_ERRORTYPE
+COmxILComponentImpl::GetComponentVersion(
+	OMX_HANDLETYPE aComponent,
+	OMX_STRING aComponentName,
+	OMX_VERSIONTYPE* apComponentVersion,
+	OMX_VERSIONTYPE* apSpecVersion,
+	OMX_UUIDTYPE* apComponentUUID)
+	{
+	DEBUG_PRINTF2(_L8("COmxILComponentImpl::GetComponentVersion : Handle[%X]"), aComponent);
+    OMX_ERRORTYPE omxError;
+    omxError = (static_cast<COmxILFsm*>
+			((static_cast<OMX_COMPONENTTYPE*>(aComponent))->pComponentPrivate))->
+		GetComponentVersion(aComponentName, apComponentVersion,
+							apSpecVersion, apComponentUUID);
+    return omxError;
+	}
+
+OMX_ERRORTYPE
+COmxILComponentImpl::SendCommand(
+	OMX_HANDLETYPE aComponent,
+	OMX_COMMANDTYPE aCmd,
+	OMX_U32 aParam1,
+	OMX_PTR aCmdData)
+	{
+    DEBUG_PRINTF2(_L8("COmxILComponentImpl::SendCommand : Handle[%X]"), aComponent);
+    OMX_ERRORTYPE omxError;
+	omxError =  (static_cast<COmxILFsm*>
+			((static_cast<OMX_COMPONENTTYPE*>(aComponent))->pComponentPrivate))->
+		SendCommand(aCmd ,aParam1, aCmdData);
+	
+	return omxError;
+	}
+
+OMX_ERRORTYPE
+COmxILComponentImpl::GetParameter(
+	OMX_HANDLETYPE aComponent,
+	OMX_INDEXTYPE aParamIndex,
+	OMX_PTR aComponentParameterStructure)
+	{
+    DEBUG_PRINTF3(_L8("COmxILComponentImpl::GetParameter : Handle[%X]; ParamIndex[0x%X]"), aComponent, aParamIndex);
+    
+    OMX_ERRORTYPE omxError;
+	omxError = (static_cast<COmxILFsm*>
+			((static_cast<OMX_COMPONENTTYPE*>(aComponent))->pComponentPrivate))->
+		GetParameter(aParamIndex, aComponentParameterStructure);
+	
+	return omxError;
+	}
+
+OMX_ERRORTYPE
+COmxILComponentImpl::SetParameter(
+	OMX_HANDLETYPE aComponent,
+	OMX_INDEXTYPE aIndex,
+	OMX_PTR aComponentParameterStructure)
+	{
+    DEBUG_PRINTF3(_L8("COmxILComponentImpl::SetParameter : Handle[%X]; ParamIndex[0x%X]"), aComponent, aIndex);
+    
+    OMX_ERRORTYPE omxError;
+	omxError = (static_cast<COmxILFsm*>
+			((static_cast<OMX_COMPONENTTYPE*>(aComponent))->pComponentPrivate))->
+		SetParameter(aIndex,
+					 const_cast<const TAny*>(aComponentParameterStructure));
+
+	return omxError;
+	}
+
+OMX_ERRORTYPE
+COmxILComponentImpl::GetConfig(
+	OMX_HANDLETYPE aComponent,
+	OMX_INDEXTYPE aIndex,
+	OMX_PTR aComponentParameterStructure)
+	{
+    DEBUG_PRINTF3(_L8("COmxILComponentImpl::GetConfig : Handle[%X]; ConfigIndex[0x%X]"), aComponent, aIndex);
+    OMX_ERRORTYPE omxError;
+	omxError = (static_cast<COmxILFsm*>
+			((static_cast<OMX_COMPONENTTYPE*>(aComponent))->pComponentPrivate))->
+		GetConfig(aIndex, aComponentParameterStructure);
+	return omxError;
+	}
+
+OMX_ERRORTYPE
+COmxILComponentImpl::SetConfig(
+	OMX_HANDLETYPE aComponent,
+	OMX_INDEXTYPE aIndex,
+	OMX_PTR aComponentConfigStructure)
+	{
+    DEBUG_PRINTF3(_L8("COmxILComponentImpl::SetConfig : Handle[%X]; ConfigIndex[0x%X]"), aComponent, aIndex);
+    OMX_ERRORTYPE omxError;
+	omxError = (static_cast<COmxILFsm*>
+			((static_cast<OMX_COMPONENTTYPE*>(aComponent))->pComponentPrivate))->
+		SetConfig(aIndex, const_cast<const TAny*>(aComponentConfigStructure));
+	return omxError;
+	}
+
+OMX_ERRORTYPE
+COmxILComponentImpl::GetExtensionIndex(
+	OMX_HANDLETYPE aComponent,
+	OMX_STRING aParameterName,
+	OMX_INDEXTYPE* aIndexType)
+	{
+    DEBUG_PRINTF2(_L8("COmxILComponentImpl::GetExtensionIndex : Handle[%X]"), aComponent);
+    OMX_ERRORTYPE omxError;
+	omxError = (static_cast<COmxILFsm*>
+			((static_cast<OMX_COMPONENTTYPE*>(aComponent))->pComponentPrivate))->
+		GetExtensionIndex(aParameterName, aIndexType);
+	return omxError;
+	}
+
+OMX_ERRORTYPE
+COmxILComponentImpl::GetState(
+	OMX_HANDLETYPE aComponent,
+	OMX_STATETYPE* aState)
+	{
+    DEBUG_PRINTF2(_L8("COmxILComponentImpl::GetState : Handle[%X]"), aComponent);
+    OMX_ERRORTYPE omxError;
+    omxError = (static_cast<COmxILFsm*>
+			((static_cast<OMX_COMPONENTTYPE*>(aComponent))->pComponentPrivate))->
+		GetState(aState);
+    return omxError;
+	}
+
+OMX_ERRORTYPE
+COmxILComponentImpl::ComponentTunnelRequest(
+	OMX_HANDLETYPE aComponent,
+	OMX_U32 aPort,
+	OMX_HANDLETYPE aTunneledComp,
+	OMX_U32 aTunneledPort,
+	OMX_TUNNELSETUPTYPE* aTunnelSetup)
+	{
+    DEBUG_PRINTF2(_L8("COmxILComponentImpl::ComponentTunnelRequest : Handle[%X]"), aComponent);
+    OMX_ERRORTYPE omxError;
+	omxError = (static_cast<COmxILFsm*>
+			((static_cast<OMX_COMPONENTTYPE*>(aComponent))->pComponentPrivate))->
+		ComponentTunnelRequest(aPort, aTunneledComp,
+							   aTunneledPort, aTunnelSetup);
+	return omxError;
+	}
+
+OMX_ERRORTYPE
+COmxILComponentImpl::UseBuffer(
+	OMX_HANDLETYPE aComponent,
+	OMX_BUFFERHEADERTYPE** appBufferHdr,
+	OMX_U32 aPortIndex,
+	OMX_PTR apAppPrivate,
+	OMX_U32 aSizeBytes,
+	OMX_U8* aBuffer)
+	{
+    DEBUG_PRINTF2(_L8("COmxILComponentImpl::UseBuffer : Handle[%X]"), aComponent);
+    OMX_ERRORTYPE omxError;
+    omxError = (static_cast<COmxILFsm*>
+			((static_cast<OMX_COMPONENTTYPE*>(aComponent))->pComponentPrivate))->
+		UseBuffer(appBufferHdr, aPortIndex, apAppPrivate, aSizeBytes, aBuffer);
+    return omxError;
+	}
+
+OMX_ERRORTYPE
+COmxILComponentImpl::AllocateBuffer(
+	OMX_HANDLETYPE aComponent,
+	OMX_BUFFERHEADERTYPE** apBuffer,
+	OMX_U32 aPortIndex,
+	OMX_PTR aAppData,
+	OMX_U32 aSizeBytes)
+	{
+    DEBUG_PRINTF2(_L8("COmxILComponentImpl::AllocateBuffer : Handle[%X]"), aComponent);
+    OMX_ERRORTYPE omxError;
+    omxError = (static_cast<COmxILFsm*>
+			((static_cast<OMX_COMPONENTTYPE*>(aComponent))->pComponentPrivate))->
+		AllocateBuffer(apBuffer, aPortIndex, aAppData, aSizeBytes);
+    return omxError;
+	}
+
+OMX_ERRORTYPE
+COmxILComponentImpl::FreeBuffer(
+	OMX_HANDLETYPE aComponent,
+	OMX_U32 aPortIndex,
+	OMX_BUFFERHEADERTYPE* aBuffer)
+	{
+    DEBUG_PRINTF2(_L8("COmxILComponentImpl::FreeBuffer : Handle[%X]"), aComponent);
+    OMX_ERRORTYPE omxError;
+    omxError = (static_cast<COmxILFsm*>
+			((static_cast<OMX_COMPONENTTYPE*>(aComponent))->pComponentPrivate))->
+		FreeBuffer(aPortIndex, aBuffer);
+    return omxError;
+	}
+
+OMX_ERRORTYPE
+COmxILComponentImpl::EmptyThisBuffer(
+	OMX_HANDLETYPE aComponent,
+	OMX_BUFFERHEADERTYPE* aBuffer)
+	{
+    DEBUG_PRINTF2(_L8("COmxILComponentImpl::EmptyThisBuffer : Handle[%X]"), aComponent);
+#ifdef _OMXIL_COMMON_BUFFER_TRACING_ON
+	RDebug::Print(_L("COmxILComponentImpl::EmptyThisBuffer component=0x%08X header=0x%08X port=%d flags=0x%X filledLen=%d timeStamp=%Ld"),
+		aComponent, aBuffer, aBuffer->nInputPortIndex, aBuffer->nFlags, aBuffer->nFilledLen, aBuffer->nTimeStamp);
+#endif
+	OMX_ERRORTYPE omxError;
+	omxError =  (static_cast<COmxILFsm*>
+			((static_cast<OMX_COMPONENTTYPE*>(aComponent))->pComponentPrivate))->
+		EmptyThisBuffer(aBuffer);
+	
+	return omxError;
+	}
+
+OMX_ERRORTYPE
+COmxILComponentImpl::FillThisBuffer(
+	OMX_HANDLETYPE aComponent,
+	OMX_BUFFERHEADERTYPE* aBuffer)
+	{
+    DEBUG_PRINTF2(_L8("COmxILComponentImpl::FillThisBuffer : Handle[%X]"), aComponent);
+#ifdef _OMXIL_COMMON_BUFFER_TRACING_ON
+	RDebug::Print(_L("COmxILComponentImpl::FillThisBuffer component=0x%08X header=0x%08X port=%d"), aComponent, aBuffer, aBuffer->nOutputPortIndex);
+#endif
+	
+	OMX_ERRORTYPE omxError;
+	omxError =  (static_cast<COmxILFsm*>
+			((static_cast<OMX_COMPONENTTYPE*>(aComponent))->pComponentPrivate))->
+		FillThisBuffer(aBuffer);
+	
+	return omxError;
+	}
+
+OMX_ERRORTYPE
+COmxILComponentImpl::SetCallbacks(
+	OMX_HANDLETYPE aComponent,
+	OMX_CALLBACKTYPE* aCallbacks,
+	OMX_PTR aAppData)
+	{	
+    DEBUG_PRINTF2(_L8("COmxILComponentImpl::SetCallbacks : Handle[%X]"), aComponent);
+    OMX_ERRORTYPE omxError;
+	omxError = (static_cast<COmxILFsm*>
+			((static_cast<OMX_COMPONENTTYPE*>(aComponent))->pComponentPrivate))->
+		SetCallbacks(const_cast<const OMX_CALLBACKTYPE*>(aCallbacks), aAppData);
+	if (OMX_ErrorNone==omxError)
+		{
+		(static_cast<OMX_COMPONENTTYPE*>(aComponent))->pApplicationPrivate = aAppData;
+		}
+	return omxError;
+	}
+
+OMX_ERRORTYPE
+COmxILComponentImpl::ComponentDeInit(
+	OMX_HANDLETYPE aComponent)
+	{
+    DEBUG_PRINTF2(_L8("COmxILComponentImpl::ComponentDeInit : Handle[%X]"), aComponent);
+	delete (static_cast<COmxILComponent*>(
+				(static_cast<COmxILFsm*>(
+					(static_cast<OMX_COMPONENTTYPE*>(aComponent))->
+					pComponentPrivate))->GetComponent()));
+	return OMX_ErrorNone;
+	}
+
+OMX_ERRORTYPE
+COmxILComponentImpl::UseEGLImage(
+		OMX_HANDLETYPE aComponent,
+		OMX_BUFFERHEADERTYPE** appBufferHdr,
+		OMX_U32 aPortIndex,
+		OMX_PTR aAppPrivate,
+		void* eglImage)
+	{
+    DEBUG_PRINTF2(_L8("COmxILComponentImpl::UseEGLImage : Handle[%X]"), aComponent);
+    OMX_ERRORTYPE omxError;
+    omxError = (static_cast<COmxILFsm*>
+			((static_cast<OMX_COMPONENTTYPE*>(aComponent))->pComponentPrivate))->
+		UseEGLImage(appBufferHdr, aPortIndex, aAppPrivate, eglImage);
+    return omxError;
+	}
+
+OMX_ERRORTYPE
+COmxILComponentImpl::ComponentRoleEnum(
+	OMX_HANDLETYPE aComponent,
+	OMX_U8* aRole,
+	OMX_U32 aIndex)
+	{
+    DEBUG_PRINTF2(_L8("COmxILComponentImpl::ComponentRoleEnum : Handle[%X]"), aComponent);
+    OMX_ERRORTYPE omxError;
+    omxError = (static_cast<COmxILFsm*>
+			((static_cast<OMX_COMPONENTTYPE*>(aComponent))->pComponentPrivate))->
+		ComponentRoleEnum(aRole, aIndex);
+    return omxError;
+	}
+
+void
+COmxILComponentImpl::InitComponentL()
+	{
+    DEBUG_PRINTF2(_L8("COmxILComponentImpl::InitComponent : Handle[%X]"), ipHandle);
+	__ASSERT_ALWAYS(ipHandle && ipProcessingFunction && ipCallbackManager && ipPortManager && ipConfigManager, User::Panic(KOmxILComponentPanicCategory, 1));
+	ipFsm = COmxILFsm::NewL(*ipComponent,
+							*ipProcessingFunction,
+							*ipPortManager,
+							*ipConfigManager,
+							*ipCallbackManager);
+	
+	char componentNamebuffer[OMX_MAX_STRINGNAME_SIZE];
+	OMX_VERSIONTYPE componentVersion;
+	OMX_VERSIONTYPE specVersion;
+	OMX_UUIDTYPE componentUid;
+
+	ipConfigManager->GetComponentVersion(componentNamebuffer,
+										 &componentVersion,
+										 &specVersion,
+										 &componentUid);
+	TBuf8<128> componentNameBuf8;
+	componentNameBuf8 = const_cast<const TUint8*>(reinterpret_cast<TUint8*>(componentNamebuffer));
+	iComponentName.CreateL(componentNameBuf8, componentNameBuf8.Length() + 1);
+	iComponentName.PtrZ();
+    DEBUG_PRINTF2(_L8("COmxILComponentImpl::InitComponent : [%S]"), &iComponentName);
+
+	// Fill in the component handle
+	ipHandle->nVersion				 = componentVersion;
+	// The FSM will take care of all the API calls
+	ipHandle->pComponentPrivate		 = ipFsm;
+	ipHandle->pApplicationPrivate	 = 0;
+	ipHandle->GetComponentVersion	 = COmxILComponentImpl::GetComponentVersion;
+	ipHandle->SendCommand			 = COmxILComponentImpl::SendCommand;
+	ipHandle->GetParameter			 = COmxILComponentImpl::GetParameter;
+	ipHandle->SetParameter			 = COmxILComponentImpl::SetParameter;
+	ipHandle->GetConfig				 = COmxILComponentImpl::GetConfig;
+	ipHandle->SetConfig				 = COmxILComponentImpl::SetConfig;
+	ipHandle->GetExtensionIndex		 = COmxILComponentImpl::GetExtensionIndex;
+	ipHandle->GetState				 = COmxILComponentImpl::GetState;
+	ipHandle->ComponentTunnelRequest = COmxILComponentImpl::ComponentTunnelRequest;
+	ipHandle->UseBuffer				 = COmxILComponentImpl::UseBuffer;
+	ipHandle->AllocateBuffer		 = COmxILComponentImpl::AllocateBuffer;
+	ipHandle->FreeBuffer			 = COmxILComponentImpl::FreeBuffer;
+	ipHandle->EmptyThisBuffer		 = COmxILComponentImpl::EmptyThisBuffer;
+	ipHandle->FillThisBuffer		 = COmxILComponentImpl::FillThisBuffer;
+	ipHandle->SetCallbacks			 = COmxILComponentImpl::SetCallbacks;
+	ipHandle->ComponentDeInit		 = COmxILComponentImpl::ComponentDeInit;
+	ipHandle->UseEGLImage			 = COmxILComponentImpl::UseEGLImage;
+	ipHandle->ComponentRoleEnum		 = COmxILComponentImpl::ComponentRoleEnum;
+
+	OMX_ERRORTYPE omxRetValue =
+		ipCallbackManager->RegisterComponentHandle(ipHandle);
+	if (OMX_ErrorNone != omxRetValue)
+		{
+		if (OMX_ErrorInsufficientResources == omxRetValue)
+			{
+			User::Leave(KErrNoMemory);
+			}
+		User::Leave(KErrGeneral);
+		}
+
+	// Let's init the FSM...
+	ipFsm->InitFsm();
+	}
+
+MOmxILCallbackNotificationIf* COmxILComponentImpl::CreateCallbackManagerL(COmxILComponent::TCallbackManagerType aCallbackManagerType)
+	{
+	if (aCallbackManagerType==COmxILComponent::EInContext)
+		{
+		ipCallbackManager = COmxILInContextCallbackManager::NewL(ipHandle, ipAppData, ipCallbacks);
+		}
+	else if (aCallbackManagerType==COmxILComponent::EOutofContext)
+		{
+		ipCallbackManager = COmxILCallbackManager::NewL(ipHandle, ipAppData, ipCallbacks);
+		}
+		
+	return ipCallbackManager;
+	}
+
+TInt COmxILComponentImpl::AddPort(const COmxILPort* aPort, OMX_DIRTYPE aDirection)
+	{
+	return ipPortManager->AddPort(aPort, aDirection);
+	}
+
+void COmxILComponentImpl::CreatePortManagerL(COmxILComponent::TPortManagerType /*aType*/,
+											const OMX_VERSIONTYPE& aOmxVersion,
+											OMX_U32 aNumberOfAudioPorts,
+											OMX_U32 aStartAudioPortNumber,
+											OMX_U32 aNumberOfImagePorts,
+											OMX_U32 aStartImagePortNumber,
+											OMX_U32 aNumberOfVideoPorts,
+											OMX_U32 aStartVideoPortNumber,
+											OMX_U32 aNumberOfOtherPorts,
+											OMX_U32 aStartOtherPortNumber,
+											OMX_BOOL aImmediateReturnTimeBuffer)
+	{
+	__ASSERT_ALWAYS(ipProcessingFunction && ipCallbackManager, User::Panic(KOmxILComponentPanicCategory, 1));
+	ipPortManager = COmxILPortManager::NewL(*ipProcessingFunction,       // The component's processing function
+											*ipCallbackManager,          // The call back manager object
+											aOmxVersion,                  // Component's OMX Version
+											aNumberOfAudioPorts,		 	 // The number of audio ports in this component
+											aStartAudioPortNumber, 		 // The starting audio port index
+											aNumberOfImagePorts,		 	 // The number of image ports in this component
+											aStartImagePortNumber,		 // The starting image port index
+											aNumberOfVideoPorts,		 	 // The number of video ports in this component
+											aStartVideoPortNumber,		 // The starting video port index
+											aNumberOfOtherPorts,		 	 // The number of other ports in this component
+											aStartOtherPortNumber,	 	 // The starting other port index
+											aImmediateReturnTimeBuffer
+											);	
+	}
+
+void COmxILComponentImpl::RegisterProcessingFunction(const COmxILProcessingFunction* apProcessingFunction)
+	{
+	__ASSERT_ALWAYS(apProcessingFunction, User::Panic(KOmxILComponentPanicCategory, 1));
+	ipProcessingFunction = const_cast<COmxILProcessingFunction*>(apProcessingFunction);
+	}
+
+void COmxILComponentImpl::RegisterConfigurationManager(const COmxILConfigManager* apConfigManager)
+	{
+	__ASSERT_ALWAYS(apConfigManager, User::Panic(KOmxILComponentPanicCategory, 1));
+	ipConfigManager = const_cast<COmxILConfigManager*>(apConfigManager);
+	SetPortManagerForConfigManager();
+	}	
+	
+OMX_COMPONENTTYPE* COmxILComponentImpl::GetHandle() const
+	{
+	return ipHandle;
+	}
+OMX_PTR COmxILComponentImpl::GetAppData() const
+	{
+	return ipAppData;
+	}
+OMX_CALLBACKTYPE* COmxILComponentImpl::GetCallbacks() const
+	{
+	return ipCallbacks;
+	}
+COmxILConfigManager* COmxILComponentImpl::GetConfigManager() const
+	{
+	return ipConfigManager;
+	}
+COmxILProcessingFunction* COmxILComponentImpl::GetProcessingFunction() const
+	{
+	return ipProcessingFunction;
+	}
+MOmxILCallbackNotificationIf* COmxILComponentImpl::GetCallbackNotificationIf() const
+	{
+	return ipCallbackManager;
+	}
+void COmxILComponentImpl::SetPortManagerForConfigManager()
+	{
+	__ASSERT_ALWAYS(ipPortManager && ipConfigManager, User::Panic(KOmxILComponentPanicCategory, 1));
+	ipConfigManager->SetPortManager(ipPortManager);
+	}