--- a/omxil/omxilcomponentcommon/src/common/omxilcallbackmanager.cpp Mon Aug 23 21:48:44 2010 +0100
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,1046 +0,0 @@
-// 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 "log.h"
-#include "omxilcallbackmanager.h"
-#include "omxilportmanager.h"
-#include "omxilfsm.h"
-#include "omxilutil.h"
-
-const TInt COmxILCallbackManager::KMaxMsgQueueEntries;
-
-
-EXPORT_C COmxILCallbackManager*
-COmxILCallbackManager::NewL(
- OMX_HANDLETYPE apComponentHandle,
- OMX_PTR apAppData,
- OMX_CALLBACKTYPE* apCallbacks)
- {
- DEBUG_PRINTF(_L8("COmxILCallbackManager::NewL"));
- COmxILCallbackManager* self = new (ELeave)COmxILCallbackManager(
- apComponentHandle,
- apAppData,
- apCallbacks);
- CleanupStack::PushL(self);
- self->ConstructL();
- CleanupStack::Pop(self);
- return self;
- }
-
-void
-COmxILCallbackManager::ConstructL()
- {
- DEBUG_PRINTF(_L8("COmxILCallbackManager::ConstructL"));
-
- CActiveScheduler::Add(this);
- User::LeaveIfError(iCommandQueue.CreateLocal(KMaxMsgQueueEntries));
- iCommandQueue.NotifyDataAvailable(iStatus);
-
- User::LeaveIfError(iPendingQueue.CreateLocal(KMaxMsgQueueEntries));
-
- SetActive();
-
- }
-
-COmxILCallbackManager::COmxILCallbackManager(OMX_HANDLETYPE apComponentHandle,
- OMX_PTR apAppData,
- OMX_CALLBACKTYPE* apCallbacks)
- :
- CActive(CActive::EPriorityStandard),
- XOmxILCallbackManagerIfImpl(
- static_cast<OMX_COMPONENTTYPE*>(apComponentHandle),
- apAppData,
- apCallbacks),
- iCommandQueue(),
- iPendingQueue(),
- iFlushPendingQueue(EFalse),
- iCurrentState(OMX_StateLoaded),
- iPreviousState(OMX_StateLoaded)
- {
- DEBUG_PRINTF(_L8("COmxILCallbackManager::COmxILCallbackManager"));
- }
-
-EXPORT_C
-COmxILCallbackManager::~COmxILCallbackManager()
- {
- DEBUG_PRINTF(_L8("COmxILCallbackManager::~COmxILCallbackManager"));
-
- Cancel();
-
- CleanUpQueue(iPendingQueue);
-
- CleanUpQueue(iCommandQueue);
-
- }
-
-
-void
-COmxILCallbackManager::CleanUpQueue(RCallbackManagerQueue& aQueue)
- {
- DEBUG_PRINTF(_L8("COmxILCallbackManager::CleanUpQueue"));
-
- if (aQueue.Handle() != 0)
- {
- CCallbackCommand* pCommand = 0;
- TInt err = KErrNone;
- while ((err = aQueue.Receive(pCommand)) == KErrNone)
- {
- DEBUG_PRINTF2(_L8("COmxILCallbackManager::CleanUpQueue : aQueue.Receive [%X]"), pCommand);
- delete pCommand;
- pCommand = 0;
- }
-
- if (KErrNone != err)
- {
- DEBUG_PRINTF2(_L8("COmxILCallbackManager::CleanUpQueue : aQueue.Receive returned error [%d]"), err);
- if (KErrNoMemory == err)
- {
- HandleInsufficientResources();
- }
- }
-
- }
-
- aQueue.Close();
-
- }
-
-
-EXPORT_C void
-COmxILCallbackManager::SetPortManager(COmxILPortManager& apPortManager)
- {
- DoSetPortManager(apPortManager);
- }
-
-EXPORT_C void
-COmxILCallbackManager::SetFsm(COmxILFsm& apFsm)
- {
- DoSetFsm(apFsm);
- }
-
-EXPORT_C OMX_ERRORTYPE
-COmxILCallbackManager::RegisterComponentHandle(OMX_HANDLETYPE aComponentHandle)
- {
- DEBUG_PRINTF(_L8("COmxILCallbackManager::RegisterComponentHandle"));
-
- __ASSERT_DEBUG(aComponentHandle,
- User::Panic(KOmxILCallbackManagerPanicCategory, 1));
-
- CCompHandleRegistrationCommand* pHandleReg =
- new CCompHandleRegistrationCommand(aComponentHandle);
- if (!pHandleReg || (iCommandQueue.Send(pHandleReg) != KErrNone))
- {
- delete pHandleReg;
- DoRegisterComponentHandle(aComponentHandle);
- return OMX_ErrorInsufficientResources;
- }
-
- return OMX_ErrorNone;
-
- }
-
-/**
- The IL Client callback registration is handled in this implementation
- asynchronously. Note that this implementation assumes that the IL Client
- will update the callbacks information once all expected callbacks from this
- component have already been received and therefore, the callback change will
- be safe leading to no race condition at the IL Client side.
-
- @param apCallbacks The IL Client callback structure.
-
- @param apAppData Pointer to an application provided value so that the
- application can have a component specific context when receiving
- the callback.
-
- @return OMX_ERRORTYPE
- */
-EXPORT_C OMX_ERRORTYPE
-COmxILCallbackManager::RegisterILClientCallbacks(
- const OMX_CALLBACKTYPE* apCallbacks,
- const OMX_PTR apAppData)
- {
- DEBUG_PRINTF(_L8("COmxILCallbackManager::RegisterILClientCallbacks"));
-
- CClientCallbacksRegistrationCommand* pClientCBacksReg =
- new CClientCallbacksRegistrationCommand(
- apCallbacks,
- apAppData);
- if (!pClientCBacksReg || (iCommandQueue.Send(pClientCBacksReg) != KErrNone))
- {
- delete pClientCBacksReg;
- DoRegisterILClientCallbacks(apCallbacks, apAppData);
- return OMX_ErrorInsufficientResources;
- }
-
- return OMX_ErrorNone;
-
- }
-
-EXPORT_C OMX_ERRORTYPE
-COmxILCallbackManager::RegisterTunnelCallback(
- OMX_U32 aLocalPortIndex,
- OMX_DIRTYPE aLocalPortDirection,
- OMX_HANDLETYPE aTunnelledComponentHandle,
- OMX_U32 aTunnelledPortIndex)
- {
- DEBUG_PRINTF2(_L8("COmxILCallbackManager::RegisterTunnelCallback : aTunnelledComponentHandle [%x]"), aTunnelledComponentHandle);
-
- CTunnelCallbackRegistrationCommand* pTunnelCBacksReg =
- new CTunnelCallbackRegistrationCommand(aLocalPortIndex,
- aLocalPortDirection,
- aTunnelledComponentHandle,
- aTunnelledPortIndex);
-
- if (!pTunnelCBacksReg || (iCommandQueue.Send(pTunnelCBacksReg) != KErrNone))
- {
- delete pTunnelCBacksReg;
- return OMX_ErrorInsufficientResources;
- }
-
- return OMX_ErrorNone;
-
- }
-
-EXPORT_C OMX_ERRORTYPE
-COmxILCallbackManager::DeregisterTunnelCallback(
- OMX_U32 aLocalPortIndex)
- {
-
- DEBUG_PRINTF(_L8("COmxILCallbackManager::DeregisterTunnelCallback"));
-
- return RegisterTunnelCallback(aLocalPortIndex,
- OMX_DirMax,
- 0,
- 0);
-
- }
-
-EXPORT_C OMX_ERRORTYPE
-COmxILCallbackManager::RegisterBufferMarkPropagationPort(
- OMX_U32 aPortIndex,
- OMX_U32 aPropagationPortIndex)
- {
- DEBUG_PRINTF(_L8("COmxILCallbackManager::RegisterBufferMarkPropagationPort"));
-
- CBufferMarkPropagationRegistrationCommand* pBufferMarkPropReg =
- new CBufferMarkPropagationRegistrationCommand(aPortIndex,
- aPropagationPortIndex);
- if (!pBufferMarkPropReg || (iCommandQueue.Send(pBufferMarkPropReg) != KErrNone))
- {
- delete pBufferMarkPropReg;
- HandleInsufficientResources();
- }
-
- return OMX_ErrorNone;
-
- }
-
-EXPORT_C TBool
-COmxILCallbackManager::BufferRemovalIndication(
- OMX_BUFFERHEADERTYPE* apBufferHeader,
- OMX_DIRTYPE aDirection)
- {
- DEBUG_PRINTF(_L8("COmxILCallbackManager::BufferRemovalIndication"));
-
- CBufferRemovalCommand* pBufferRemovalCmd =
- new CBufferRemovalCommand(apBufferHeader, aDirection);
-
- if (!pBufferRemovalCmd ||
- (iCommandQueue.Send(pBufferRemovalCmd) != KErrNone))
- {
- delete pBufferRemovalCmd;
- HandleInsufficientResources();
- }
-
- // Always return false now as the buffer would be removed asynchronously
- return EFalse;
-
- }
-
-EXPORT_C OMX_ERRORTYPE
-COmxILCallbackManager::TransitionCompleteNotification(OMX_STATETYPE aOmxState)
- {
- DEBUG_PRINTF(_L8("COmxILCallbackManager::TransitionCompleteNotification"));
-
- return EventNotificationImpl(OMX_EventCmdComplete,
- OMX_CommandStateSet,
- aOmxState,
- 0);
-
- }
-
-
-EXPORT_C OMX_ERRORTYPE
-COmxILCallbackManager::CommandCompleteNotification(OMX_COMMANDTYPE aOmxCommand,
- OMX_U32 aOmxPortIndex)
- {
- DEBUG_PRINTF(_L8("COmxILCallbackManager::CommandCompleteNotification"));
-
- return EventNotification(OMX_EventCmdComplete,
- aOmxCommand,
- aOmxPortIndex,
- 0);
-
- }
-
-
-EXPORT_C OMX_ERRORTYPE
-COmxILCallbackManager::ErrorEventNotification(OMX_ERRORTYPE aOmxError)
- {
- DEBUG_PRINTF2(_L8("COmxILCallbackManager::ErrorEventNotification : aOmxError[%X] "), aOmxError);
-
- return EventNotification(OMX_EventError,
- aOmxError,
- 0,
- 0);
-
- }
-
-EXPORT_C OMX_ERRORTYPE
-COmxILCallbackManager::EventNotification(OMX_EVENTTYPE aEvent,
- TUint32 aData1,
- TUint32 aData2,
- OMX_STRING aExtraInfo)
- {
- // The error code is ignored intentionally, as errors from this function cannot be handled by clients, since they don't have
- // another mechanism for reporting an error
- (void)EventNotificationImpl(aEvent, aData1, aData2, aExtraInfo);
- return OMX_ErrorNone;
- }
-
-
-OMX_ERRORTYPE COmxILCallbackManager::EventNotificationImpl(OMX_EVENTTYPE aEvent,
- TUint32 aData1,
- TUint32 aData2,
- OMX_STRING aExtraInfo)
- {
- DEBUG_PRINTF4(_L8("COmxILCallbackManager::EventNotificationImpl : aEvent[%X] aData1[%X] aData2[%u]"), aEvent, aData1, aData2);
-
- CEventCallbackCommand* pEventCBack =
- new CEventCallbackCommand(aEvent,
- aData1,
- aData2,
- aExtraInfo);
- if (!pEventCBack || (iCommandQueue.Send(pEventCBack) != KErrNone))
- {
- delete pEventCBack;
- HandleInsufficientResources();
- return OMX_ErrorInsufficientResources;
- }
-
- return OMX_ErrorNone;
-
- }
-
-
-EXPORT_C OMX_ERRORTYPE
-COmxILCallbackManager::BufferDoneNotification(OMX_BUFFERHEADERTYPE* apBufferHeader,
- OMX_U32 aLocalPortIndex,
- OMX_DIRTYPE aLocalPortDirection)
- {
- DEBUG_PRINTF(_L8("COmxILCallbackManager::BufferDoneNotificaton"));
-
- return SendBufferDoneNotification(apBufferHeader,
- aLocalPortIndex,
- aLocalPortDirection,
- CCallbackCommand::EPriorityNormal);
-
- }
-
-EXPORT_C OMX_ERRORTYPE
-COmxILCallbackManager::ClockBufferDoneNotification(OMX_BUFFERHEADERTYPE* apBufferHeader,
- OMX_U32 aLocalPortIndex,
- OMX_DIRTYPE aLocalPortDirection)
- {
- DEBUG_PRINTF(_L8("COmxILCallbackManager::ClockBufferDoneNotification"));
-
- return SendBufferDoneNotification(apBufferHeader,
- aLocalPortIndex,
- aLocalPortDirection,
- CCallbackCommand::EPriorityHigh);
-
- }
-
-EXPORT_C OMX_ERRORTYPE
-COmxILCallbackManager::PortSettingsChangeNotification(
- OMX_U32 aLocalPortIndex,
- TUint aPortSettingsIndex,
- const TDesC8& aPortSettings)
- {
- DEBUG_PRINTF2(_L8("COmxILCallbackManager::PortSettingsChangeNotification : aLocalPortIndex[%d]"), aLocalPortIndex);
-
- HBufC8* pPortSettings = aPortSettings.Alloc();
- if (!pPortSettings)
- {
- HandleInsufficientResources();
- return OMX_ErrorNone;
- }
-
- CPortSettingsChangeCommand* pPortSettingsCmd =
- new CPortSettingsChangeCommand(aLocalPortIndex,
- aPortSettingsIndex,
- pPortSettings);
- if (!pPortSettingsCmd)
- {
- delete pPortSettings;
- HandleInsufficientResources();
- return OMX_ErrorNone;
- }
-
- if (iCommandQueue.Send(pPortSettingsCmd) != KErrNone)
- {
- delete pPortSettingsCmd; // Destructor will delete pPortSettings
- HandleInsufficientResources();
- }
-
- return OMX_ErrorNone;
-
- }
-
-OMX_ERRORTYPE
-COmxILCallbackManager::SendBufferDoneNotification(
- OMX_BUFFERHEADERTYPE* apBufferHeader,
- OMX_U32 aLocalPortIndex,
- OMX_DIRTYPE aLocalPortDirection,
- TInt aPriority)
- {
- DEBUG_PRINTF(_L8("COmxILCallbackManager::SendBufferDoneNotification"));
-
- __ASSERT_ALWAYS(apBufferHeader &&
- (OMX_DirInput == aLocalPortDirection ||
- OMX_DirOutput == aLocalPortDirection),
- User::Panic(KOmxILCallbackManagerPanicCategory, 1));
-
- __ASSERT_ALWAYS(apBufferHeader->nOffset + apBufferHeader->nFilledLen
- <= apBufferHeader->nAllocLen,
- User::Panic(KOmxILCallbackManagerPanicCategory, 1));
-
- CBufferDoneCallbackCommand* pEventCBack =
- new CBufferDoneCallbackCommand(apBufferHeader,
- aLocalPortIndex,
- aLocalPortDirection,
- aPriority);
-
- if (!pEventCBack || (iCommandQueue.Send(pEventCBack) != KErrNone))
- {
- delete pEventCBack;
- HandleInsufficientResources();
- }
-
- return OMX_ErrorNone;
-
- }
-
-
-void
-COmxILCallbackManager::RunL()
- {
- DEBUG_PRINTF2(_L8("COmxILCallbackManager::RunL : Handle[%X]"), ipHandle);
-
- ProcessQueue(iCommandQueue);
-
- // Setup for next callbacks
- iCommandQueue.NotifyDataAvailable(iStatus);
- SetActive();
-
- }
-
-
-void
-COmxILCallbackManager::ProcessQueue(RCallbackManagerQueue& aQueue)
- {
- DEBUG_PRINTF2(_L8("COmxILCallbackManager::ProcessQueue : Handle[%X]"), ipHandle);
-
- CCallbackCommand* pCommand = 0;
-
- TInt receiveRes = 0;
- TBool hasBeenDeferred = EFalse;
- while ((receiveRes = aQueue.Receive(pCommand)) == KErrNone)
- {
- if (pCommand)
- {
- DEBUG_PRINTF2(_L8("COmxILCallbackManager::ProcessQueue : aQueue.Receive [%X]"),
- pCommand);
- hasBeenDeferred = EFalse;
- (*pCommand)(*this, hasBeenDeferred);
- if (hasBeenDeferred)
- {
- // Move the current command to the pending queue
- if (iPendingQueue.Send(pCommand) != KErrNone)
- {
- delete pCommand;
- pCommand = 0;
- HandleInsufficientResources();
- }
- }
- else
- {
- delete pCommand;
- pCommand = 0;
- }
- }
-
- }
-
- if (KErrNoMemory == receiveRes)
- {
- HandleInsufficientResources();
- }
-
- }
-
-void
-COmxILCallbackManager::DoCancel()
- {
- DEBUG_PRINTF2(_L8("COmxILCallbackManager::DoCancel : Handle[%X]"), ipHandle);
-
- iCommandQueue.CancelDataAvailable();
-
- }
-
-
-//
-// COmxILCallbackManager::RCallbackManagerQueue
-//
-TBool
-COmxILCallbackManager::RCallbackManagerQueue::RemoveBufferDoneCbCommandsByBufferHeader(
- COmxILCallbackManager& aCbMgr,
- const OMX_BUFFERHEADERTYPE* apBufferHeader,
- OMX_DIRTYPE aDirection)
- {
- DEBUG_PRINTF2(_L8("RCallbackManagerQueue::RemoveBufferDoneCbCommandsByBufferHeader : Handle[%X]"), aCbMgr.ipHandle);
-
- if (KErrNone != DrainBackQueue())
- {
- aCbMgr.HandleInsufficientResources();
- return EFalse;
- }
-
- if(!iFrontQueue.IsEmpty())
- {
- TBool removed = EFalse;
- TDblQueIter<TFrontQueueElement> frontQueueIter(iFrontQueue);
- TFrontQueueElement* pLastElement = iFrontQueue.Last();
- TFrontQueueElement* pCurrentElement = 0;
-
- do
- {
- pCurrentElement = frontQueueIter++;
- __ASSERT_DEBUG(pCurrentElement && pCurrentElement->ipInfo,
- User::Panic(KOmxILCallbackManagerPanicCategory, 1));
- removed = reinterpret_cast<CCallbackCommand*>(
- const_cast<TAny*>(pCurrentElement->ipInfo))->
- DoRemoveBufferDoneCbCommandByBufferHeader(aCbMgr,
- apBufferHeader,
- aDirection);
- if (removed)
- {
- pCurrentElement->iLink.Deque();
- delete reinterpret_cast<CCallbackCommand*>(
- const_cast<TAny*>(pCurrentElement->ipInfo));
- delete pCurrentElement;
- DEBUG_PRINTF2(_L8("RCallbackManagerQueue::RemoveBufferDoneCbCommandsByBufferHeader : Removed Buffer Done @ Header [%X]"), apBufferHeader);
- return ETrue;
- }
- }
- while (pCurrentElement != pLastElement);
- }
-
- return EFalse;
-
- }
-
-TBool
-COmxILCallbackManager::RCallbackManagerQueue::RemoveBufferDoneCbCommandsByPortIndex(
- COmxILCallbackManager& aCbMgr,
- OMX_U32 aLocalPortIndex)
- {
- DEBUG_PRINTF2(_L8("RCallbackManagerQueue::RemoveBufferDoneCbCommandsByPortIndex : Handle[%X]"), aCbMgr.ipHandle);
-
- TBool somethingRemoved = EFalse;
-
- if (KErrNone != DrainBackQueue())
- {
- aCbMgr.HandleInsufficientResources();
- return EFalse;
- }
-
- if(!iFrontQueue.IsEmpty())
- {
- TBool removed = EFalse;
- TDblQueIter<TFrontQueueElement> frontQueueIter(iFrontQueue);
- TFrontQueueElement* pLastElement = iFrontQueue.Last();
- TFrontQueueElement* pCurrentElement = 0;
-
- do
- {
- pCurrentElement = frontQueueIter++;
- __ASSERT_DEBUG(pCurrentElement && pCurrentElement->ipInfo,
- User::Panic(KOmxILCallbackManagerPanicCategory, 1));
- removed = reinterpret_cast<CCallbackCommand*>(
- const_cast<TAny*>(pCurrentElement->ipInfo))->
- DoRemoveBufferDoneCbCommandByPortIndex(aCbMgr,
- aLocalPortIndex);
- if (removed)
- {
- somethingRemoved = ETrue;
- pCurrentElement->iLink.Deque();
- delete reinterpret_cast<CCallbackCommand*>(
- const_cast<TAny*>(pCurrentElement->ipInfo));
- delete pCurrentElement;
- DEBUG_PRINTF2(_L8("RCallbackManagerQueue::RemoveBufferDoneCbCommandsByPortIndex : Removed Buffer Done @ Port Index [%d]"), aLocalPortIndex);
- }
- }
- while (pCurrentElement != pLastElement);
- }
-
- return somethingRemoved;
-
- }
-
-
-TBool
-COmxILCallbackManager::RCallbackManagerQueue::ExecuteBufferDoneCbCommandsByPortIndex(
- COmxILCallbackManager& aCbMgr,
- OMX_U32 aLocalPortIndex)
- {
- DEBUG_PRINTF2(_L8("RCallbackManagerQueue::ExecuteBufferDoneCbCommandsByPortIndex : Handle[%X]"), aCbMgr.ipHandle);
-
- TBool somethingExecuted = EFalse;
-
- if (KErrNone != DrainBackQueue())
- {
- aCbMgr.HandleInsufficientResources();
- return EFalse;
- }
-
- if(!iFrontQueue.IsEmpty())
- {
- TBool executed = EFalse;
- TDblQueIter<TFrontQueueElement> frontQueueIter(iFrontQueue);
- TFrontQueueElement* pLastElement = iFrontQueue.Last();
- TFrontQueueElement* pCurrentElement = 0;
-
- do
- {
- pCurrentElement = frontQueueIter++;
- __ASSERT_DEBUG(pCurrentElement && pCurrentElement->ipInfo,
- User::Panic(KOmxILCallbackManagerPanicCategory, 1));
- executed = reinterpret_cast<CCallbackCommand*>(
- const_cast<TAny*>(pCurrentElement->ipInfo))->
- DoExecuteBufferDoneCbCommandByPortIndex(aCbMgr,
- aLocalPortIndex);
- if (executed)
- {
- somethingExecuted = ETrue;
- pCurrentElement->iLink.Deque();
- delete reinterpret_cast<CCallbackCommand*>(
- const_cast<TAny*>(pCurrentElement->ipInfo));
- delete pCurrentElement;
- DEBUG_PRINTF2(_L8("RCallbackManagerQueue::ExecuteBufferDoneCbCommandsByPortIndex : Executed Buffer Done @ Port Index [%d]"), aLocalPortIndex);
- }
- }
- while (pCurrentElement != pLastElement);
- }
-
- return somethingExecuted;
-
- }
-
-
-//
-// COmxILCallbackManager commands
-//
-
-TBool
-COmxILCallbackManager::CCallbackCommand::DoRemoveBufferDoneCbCommandByBufferHeader(
- COmxILCallbackManager& /*aCbMgr*/,
- const OMX_BUFFERHEADERTYPE* /*apBufferHeader*/,
- OMX_DIRTYPE /*aDirection*/)
- {
- return EFalse;
- }
-
-TBool
-COmxILCallbackManager::CCallbackCommand::DoRemoveBufferDoneCbCommandByPortIndex(
- COmxILCallbackManager& /*aCbMgr*/,
- OMX_U32 /* aLocalPortIndex */)
- {
- return EFalse;
- }
-
-TBool
-COmxILCallbackManager::CCallbackCommand::DoExecuteBufferDoneCbCommandByPortIndex(
- COmxILCallbackManager& /*aCbMgr*/,
- OMX_U32 /* aLocalPortIndex */)
- {
- return EFalse;
- }
-
-void
-COmxILCallbackManager::CCompHandleRegistrationCommand::operator()(
- COmxILCallbackManager& aCbMgr, TBool& /* aHasBeenDeferred */)
- {
- DEBUG_PRINTF2(_L8("CCompHandleRegistrationCommand::operator() : Handle[%X]"), aCbMgr.ipHandle);
- aCbMgr.DoRegisterComponentHandle(ipHandle);
- }
-
-void
-COmxILCallbackManager::CClientCallbacksRegistrationCommand::operator()(
- COmxILCallbackManager& aCbMgr, TBool& /* aHasBeenDeferred */)
- {
- DEBUG_PRINTF2(_L8("CClientCallbacksRegistrationCommand::operator() : Handle[%X]"), aCbMgr.ipHandle);
- aCbMgr.DoRegisterILClientCallbacks(ipCallbacks, ipAppData);
- }
-
-void
-COmxILCallbackManager::CBufferMarkPropagationRegistrationCommand::operator()(
- COmxILCallbackManager& aCbMgr, TBool& /* aHasBeenDeferred */)
- {
- DEBUG_PRINTF2(_L8("CBufferMarkPropagationRegistrationCommand::operator() : Handle[%X]"), aCbMgr.ipHandle);
-
- OMX_ERRORTYPE omxError =
- aCbMgr.DoRegisterBufferMarkPropagationPort(
- iMarkPropagationInfo.iPortIndex,
- iMarkPropagationInfo.iPropagationPortIndex);
-
- if (OMX_ErrorInsufficientResources == omxError)
- {
- aCbMgr.HandleInsufficientResources();
- }
- }
-
-void
-COmxILCallbackManager::CBufferRemovalCommand::operator()(
- COmxILCallbackManager& aCbMgr, TBool& /* aHasBeenDeferred */)
- {
- DEBUG_PRINTF2(_L8("CBufferRemovalCommand::operator() : Handle[%X]"), aCbMgr.ipHandle);
-
- // Returned value not relevant
- aCbMgr.iPendingQueue.RemoveBufferDoneCbCommandsByBufferHeader(
- aCbMgr,
- ipBufferHeader,
- iDirection);
-
- // Returned value not relevant
- aCbMgr.iCommandQueue.RemoveBufferDoneCbCommandsByBufferHeader(
- aCbMgr,
- ipBufferHeader,
- iDirection);
-
-
- }
-
-void
-COmxILCallbackManager::CTunnelCallbackRegistrationCommand::operator()(
- COmxILCallbackManager& aCbMgr, TBool& /* aHasBeenDeferred */)
- {
- DEBUG_PRINTF2(_L8("CTunnelCallbackRegistrationCommand::operator() : Handle[%X]"), aCbMgr.ipHandle);
-
- if (!iTunnelInfo.iTunnelledComponentHandle)
- {
- // This is a tunnel deregistration command, then remove any pending
- // callbacks on that tunnel...
- aCbMgr.iCommandQueue.RemoveBufferDoneCbCommandsByPortIndex(
- aCbMgr,
- iTunnelInfo.iLocalPortIndex);
- }
-
- OMX_ERRORTYPE omxError =
- aCbMgr.DoRegisterTunnelCallback(iTunnelInfo.iLocalPortIndex,
- iTunnelInfo.iLocalPortDirection,
- iTunnelInfo.iTunnelledComponentHandle,
- iTunnelInfo.iTunnelledPortIndex);
-
- if (OMX_ErrorInsufficientResources == omxError)
- {
- aCbMgr.HandleInsufficientResources();
- }
-
- }
-
-
-void
-COmxILCallbackManager::CEventCallbackCommand::operator()(
- COmxILCallbackManager& aCbMgr, TBool& /* aHasBeenDeferred */)
- {
- DEBUG_PRINTF2(_L8("CEventCallbackCommand::operator() : Handle[%X]"), aCbMgr.ipHandle);
-
- OMX_ERRORTYPE omxError = OMX_ErrorNone;
- switch(iData1)
- {
- case OMX_CommandStateSet:
- {
- aCbMgr.iPreviousState = aCbMgr.iCurrentState;
- aCbMgr.iCurrentState = static_cast<OMX_STATETYPE>(iData2);
-
- DEBUG_PRINTF4(_L8("CEventCallbackCommand::operator() : Handle[%X] iPreviousState[%d] -> iCurrentState[%d]"), aCbMgr.ipHandle, aCbMgr.iPreviousState, aCbMgr.iCurrentState);
-
- if (OMX_StatePause == aCbMgr.iPreviousState &&
- OMX_StateIdle == aCbMgr.iCurrentState)
- {
- // Flush pending queue first...
- aCbMgr.ProcessQueue(aCbMgr.iPendingQueue);
-
- // ... and now signal command completion...
- omxError =
- aCbMgr.DoEventNotification(iEvent,
- iData1,
- iData2,
- iExtraInfo);
-
- }
- else if (OMX_StatePause == aCbMgr.iPreviousState &&
- OMX_StateExecuting == aCbMgr.iCurrentState)
- {
- // Signal command completion first...
- omxError =
- aCbMgr.DoEventNotification(iEvent,
- iData1,
- iData2,
- iExtraInfo);
-
- // ... and now flush...
- aCbMgr.ProcessQueue(aCbMgr.iPendingQueue);
-
- }
- else
- {
- // Signal command completion...
- omxError =
- aCbMgr.DoEventNotification(iEvent,
- iData1,
- iData2,
- iExtraInfo);
-
- }
-
- }
- break;
-
- case OMX_CommandPortDisable:
- case OMX_CommandFlush:
- {
- // Process pending queue unconditionally...
- aCbMgr.iFlushPendingQueue = ETrue;
-
- // Flush first...
- if (OMX_ALL == iData2)
- {
- aCbMgr.ProcessQueue(aCbMgr.iPendingQueue);
- }
- else
- {
- aCbMgr.iPendingQueue.
- ExecuteBufferDoneCbCommandsByPortIndex(aCbMgr,
- iData2);
-
- }
-
- aCbMgr.iFlushPendingQueue = EFalse;
-
- // ... and now signal command completion...
- omxError =
- aCbMgr.DoEventNotification(iEvent,
- iData1,
- iData2,
- iExtraInfo);
-
- }
- break;
-
- default:
- {
- // Signal command completion...
- omxError =
- aCbMgr.DoEventNotification(iEvent,
- iData1,
- iData2,
- iExtraInfo);
-
- }
-
- };
-
- if (OMX_ErrorInsufficientResources == omxError)
- {
- aCbMgr.HandleInsufficientResources();
- }
-
- }
-
-
-void
-COmxILCallbackManager::CBufferDoneCallbackCommand::operator()(
- COmxILCallbackManager& aCbMgr, TBool& aHasBeenDeferred)
- {
- DEBUG_PRINTF2(_L8("CBufferDoneCallbackCommand::operator() : Handle[%X]"), aCbMgr.ipHandle);
-
- // Only send the buffer done callback if is not in Pause stae or if there
- // is a buffer flushing situation...
-
- if ((OMX_StatePause == aCbMgr.iCurrentState) &&
- (!aCbMgr.iFlushPendingQueue))
- {
- aHasBeenDeferred = ETrue;
- return;
- }
-
- OMX_ERRORTYPE omxError =
- aCbMgr.DoBufferDoneNotification(ipBufferHeader,
- iLocalPortIndex,
- iLocalPortDirection);
-
- if (OMX_ErrorInsufficientResources == omxError)
- {
- aCbMgr.HandleInsufficientResources();
- }
-
- }
-
-TBool
-COmxILCallbackManager::CBufferDoneCallbackCommand::DoRemoveBufferDoneCbCommandByBufferHeader(
- COmxILCallbackManager& aCbMgr,
- const OMX_BUFFERHEADERTYPE* apBufferHeader,
- OMX_DIRTYPE aDirection)
- {
-
- if (apBufferHeader == ipBufferHeader)
- {
- __ASSERT_DEBUG(aCbMgr.ipFsm,
- User::Panic(KOmxILCallbackManagerPanicCategory, 1));
- __ASSERT_DEBUG(aDirection == OMX_DirInput ||
- aDirection == OMX_DirOutput,
- User::Panic(KOmxILCallbackManagerPanicCategory, 1));
-
- DEBUG_PRINTF4(_L8("DoRemoveBufferDoneCbCommandByBufferHeader() : Nofiying FSM : Handle[%X] aDirection[%X] apBufferHeader[%X]"), aCbMgr.ipHandle, aDirection, apBufferHeader);
-
- // Make sure the buffer contents are cleared...
- TOmxILUtil::ClearBufferContents(
- const_cast<OMX_BUFFERHEADERTYPE*>(apBufferHeader));
-
- if (aDirection == OMX_DirInput)
- {
- aCbMgr.ipFsm->EmptyThisBuffer(
- const_cast<OMX_BUFFERHEADERTYPE*>(apBufferHeader));
- }
- else
- {
- aCbMgr.ipFsm->FillThisBuffer(
- const_cast<OMX_BUFFERHEADERTYPE*>(apBufferHeader));
- }
- return ETrue;
- }
-
- return EFalse;
-
- }
-
-//
-// This method only prints some logging information for debugging purposes. For
-// now, there's no other action to be performed as the deletion is done by the caller.
-//
-TBool
-COmxILCallbackManager::CBufferDoneCallbackCommand::DoRemoveBufferDoneCbCommandByPortIndex(
- COmxILCallbackManager& /* aCbMgr */,
- OMX_U32 aLocalPortIndex)
- {
-
- if (iLocalPortIndex == aLocalPortIndex)
- {
- DEBUG_PRINTF2(_L8("CBufferDoneCallbackCommand::DoRemoveBufferDoneCbCommandByPortIndex() : FOUND -> PortIndex[%d]"), aLocalPortIndex);
- return ETrue;
- }
-
- DEBUG_PRINTF2(_L8("CBufferDoneCallbackCommand::DoRemoveBufferDoneCbCommandByPortIndex() : NOT FOUND -> PortIndex[%d]"), aLocalPortIndex);
-
- return EFalse;
- }
-
-
-TBool
-COmxILCallbackManager::CBufferDoneCallbackCommand::DoExecuteBufferDoneCbCommandByPortIndex(
- COmxILCallbackManager& aCbMgr,
- OMX_U32 aLocalPortIndex)
- {
-
- TBool executed = EFalse;
-
- if (iLocalPortIndex == aLocalPortIndex)
- {
- TBool hasBeenDeferred = EFalse;
- // The only use case for this method is during unconditional flushing
- // of the pending queue...
- __ASSERT_DEBUG(aCbMgr.iFlushPendingQueue,
- User::Panic(KOmxILCallbackManagerPanicCategory, 1));
- this->operator()(aCbMgr, hasBeenDeferred);
- __ASSERT_DEBUG(!hasBeenDeferred,
- User::Panic(KOmxILCallbackManagerPanicCategory, 1));
- executed = ETrue;
- }
-
- DEBUG_PRINTF3(_L8("CBufferDoneCallbackCommand::DoExecuteBufferDoneCbCommandByPortIndex() : %s FOUND -> PortIndex[%d]"),
- (executed ? "" : "NOT"), aLocalPortIndex);
-
- return executed;
-
- }
-
-
-TBool
-XOmxILCallbackManagerIfImpl::TBufferMarkPropagationInfo::Compare(
- const TBufferMarkPropagationInfo& aBmpi1,
- const TBufferMarkPropagationInfo& aBmpi2)
- {
- return (aBmpi1.iPortIndex == aBmpi2.iPortIndex ? ETrue : EFalse);
- }
-
-TBool
-XOmxILCallbackManagerIfImpl::TOutputPortBufferMarkInfo::Compare(
- const TOutputPortBufferMarkInfo& aOpbmi1,
- const TOutputPortBufferMarkInfo& aOpbmi2)
- {
- return (aOpbmi1.iPortIndex == aOpbmi2.iPortIndex ? ETrue : EFalse);
- }
-
-COmxILCallbackManager::CPortSettingsChangeCommand::~CPortSettingsChangeCommand()
- {
- delete ipPortSettings;
- }
-
-void
-COmxILCallbackManager::CPortSettingsChangeCommand::operator()(
- COmxILCallbackManager& aCbMgr, TBool& /* aHasBeenDeferred */)
- {
- DEBUG_PRINTF3(_L8("CPortSettingsChangeCommand::operator() : Handle[%X], iLocalPortIndex=[%d]"),
- aCbMgr.ipHandle, iLocalPortIndex);
-
- OMX_ERRORTYPE omxError =
- aCbMgr.DoPortSettingsChangeNotification(iLocalPortIndex,
- iPortSettingsIndex,
- *ipPortSettings);
-
- if (OMX_ErrorInsufficientResources == omxError)
- {
- aCbMgr.HandleInsufficientResources();
- }
-
- }