omxil/omxilcomponentcommon/src/common/omxilcallbackmanagerifimpl.cpp
branchOpenMAX-IL_SHAI
changeset 16 eedf2dcd43c6
parent 0 40261b775718
--- a/omxil/omxilcomponentcommon/src/common/omxilcallbackmanagerifimpl.cpp	Mon May 03 13:56:28 2010 +0300
+++ b/omxil/omxilcomponentcommon/src/common/omxilcallbackmanagerifimpl.cpp	Fri May 07 16:25:23 2010 +0100
@@ -1,502 +1,527 @@
-// 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 "omxilcallbackmanagerifimpl.h"
-#include "omxilportmanager.h"
-#include "omxilfsm.h"
-
-
-EXPORT_C
-XOmxILCallbackManagerIfImpl::XOmxILCallbackManagerIfImpl(OMX_HANDLETYPE apComponentHandle,
-											 OMX_PTR apAppData,
-											 OMX_CALLBACKTYPE* apCallbacks)
-	:
-	ipHandle(static_cast<OMX_COMPONENTTYPE*>(apComponentHandle)),
-	ipAppData(apAppData),
-	ipCallbacks(apCallbacks),
-	iRegisteredTunnels(),
-	iBufferMarkPropagationPorts(),
-	iBufferMarks(),
-	ipPortManager(0),
-	ipFsm(0)
-	{
-    DEBUG_PRINTF(_L8("XOmxILCallbackManagerIfImpl::XOmxILCallbackManagerIfImpl"));
-	}
-
-EXPORT_C
-XOmxILCallbackManagerIfImpl::~XOmxILCallbackManagerIfImpl()
-	{
-    DEBUG_PRINTF(_L8("XOmxILCallbackManagerIfImpl::~XOmxILCallbackManagerIfImpl"));
-	// These pointers are cleared to make sure that any further calls on this
-	// object will fail (e.g., from a threaded PF)
-	ipHandle	= 0;
-	ipAppData	= 0;
-	ipCallbacks = 0;
-
-	iRegisteredTunnels.Close();
-	iBufferMarkPropagationPorts.Close();
-	iBufferMarks.Close();
-
-	ipPortManager = 0;
-
-	ipFsm = 0;
-
-	}
-
-EXPORT_C void
-XOmxILCallbackManagerIfImpl::DoSetPortManager(COmxILPortManager& apPortManager)
-	{
-	ipPortManager = &apPortManager;
-	}
-
-EXPORT_C void
-XOmxILCallbackManagerIfImpl::DoSetFsm(COmxILFsm& apFsm)
-	{
-	ipFsm = &apFsm;
-	}
-
-EXPORT_C OMX_ERRORTYPE
-XOmxILCallbackManagerIfImpl::DoRegisterComponentHandle(OMX_HANDLETYPE aComponentHandle)
-	{
-    DEBUG_PRINTF(_L8("XOmxILCallbackManagerIfImpl::DoRegisterComponentHandle"));
-
-	__ASSERT_DEBUG(aComponentHandle,
-				   User::Panic(KOmxILCallbackManagerIfImplPanicCategory, 1));
-
-	ipHandle = static_cast<OMX_COMPONENTTYPE *>(aComponentHandle);
-
-	return OMX_ErrorNone;
-
-	}
-
-
-EXPORT_C OMX_ERRORTYPE
-XOmxILCallbackManagerIfImpl::DoRegisterILClientCallbacks(const OMX_CALLBACKTYPE* apCallbacks,
-												   const OMX_PTR apAppData)
-	{
-    DEBUG_PRINTF(_L8("XOmxILCallbackManagerIfImpl::DoRegisterILClientCallbacks"));
-
-	ipAppData   = const_cast<OMX_PTR>(apAppData);
-	ipCallbacks = const_cast<OMX_CALLBACKTYPE*>(apCallbacks);
-
-	return OMX_ErrorNone;
-
-	}
-
-EXPORT_C OMX_ERRORTYPE
-XOmxILCallbackManagerIfImpl::DoRegisterTunnelCallback(
-	OMX_U32 aLocalPortIndex,
-	OMX_DIRTYPE aLocalPortDirection,
-	OMX_HANDLETYPE aTunnelledComponentHandle,
-	OMX_U32 aTunnelledPortIndex)
-	{
-	DEBUG_PRINTF(_L8("XOmxILCallbackManagerIfImpl::DoRegisterTunnelCallback"));
-
-	OMX_ERRORTYPE omxError = OMX_ErrorNone;
-
-	if (aTunnelledComponentHandle)
-		{
-		// Register tunnelled port
-		TInt err = iRegisteredTunnels.Append(
-			TTunnelRegistrationInfo(aLocalPortIndex,
-									aLocalPortDirection,
-									aTunnelledComponentHandle,
-									aTunnelledPortIndex));
-		if (KErrNone != err)
-			{
-			switch (err)
-				{
-			case KErrNoMemory:
-				{
-				omxError = OMX_ErrorInsufficientResources;
-				}
-				break;
-			default:
-				{
-				omxError = OMX_ErrorUndefined;
-				}
-				};
-			}
-
-		}
-	else
-		{
-		// Deregister tunnelled port
-		const TUint tunnelCount = iRegisteredTunnels.Count();
-		for (TUint i=0; i<tunnelCount; ++i)
-			{
-			if (iRegisteredTunnels[i].iLocalPortIndex ==
-				aLocalPortIndex)
-				{
-				iRegisteredTunnels.Remove(i);
-				break;
-				}
-			}
-		}
-
-	return omxError;
-
-	}
-
-EXPORT_C OMX_ERRORTYPE
-XOmxILCallbackManagerIfImpl::DoRegisterBufferMarkPropagationPort(
-	OMX_U32 aPortIndex,
-	OMX_U32 aPropagationPortIndex)
-	{
-	DEBUG_PRINTF3(_L8("XOmxILCallbackManagerIfImpl::DoRegisterBufferMarkPropagationPort : aPortIndex[%d] aPropagationPortIndex[%d] "),aPortIndex, aPropagationPortIndex);
-
-	TInt err = iBufferMarkPropagationPorts.Append(
-		TBufferMarkPropagationInfo(aPortIndex,
-								   aPropagationPortIndex));
-
-	OMX_ERRORTYPE omxError = OMX_ErrorNone;
-	if (KErrNone != err)
-		{
-		switch (err)
-			{
-		case KErrNoMemory:
-			{
-			omxError = OMX_ErrorInsufficientResources;
-			}
-			break;
-		default:
-			{
-			omxError = OMX_ErrorUndefined;
-			}
-			};
-		}
-
-	return omxError;
-
-	}
-
-
-
-EXPORT_C OMX_ERRORTYPE
-XOmxILCallbackManagerIfImpl::DoTransitionCompleteNotification(OMX_STATETYPE aOmxState)
-	{
-    DEBUG_PRINTF(_L8("XOmxILCallbackManagerIfImpl::DoTransitionCompleteNotification"));
-
-	return DoEventNotification(OMX_EventCmdComplete,
-							 OMX_CommandStateSet,
-							 aOmxState,
-							 0);
-
-	}
-
-
-EXPORT_C OMX_ERRORTYPE
-XOmxILCallbackManagerIfImpl::DoCommandCompleteNotification(OMX_COMMANDTYPE aOmxCommand,
-												   OMX_U32 aOmxPortIndex)
-	{
-    DEBUG_PRINTF(_L8("XOmxILCallbackManagerIfImpl::DoCommandCompleteNotification"));
-
-	return DoEventNotification(OMX_EventCmdComplete,
-							 aOmxCommand,
-							 aOmxPortIndex,
-							 0);
-
-	}
-
-
-EXPORT_C OMX_ERRORTYPE
-XOmxILCallbackManagerIfImpl::DoErrorEventNotification(OMX_ERRORTYPE aOmxError)
-	{
-    DEBUG_PRINTF2(_L8("XOmxILCallbackManagerIfImpl::DoErrorEventNotification : aOmxError[%X] "), aOmxError);
-
-	return DoEventNotification(OMX_EventError,
-							 aOmxError,
-							 0,
-							 0);
-
-	}
-
-EXPORT_C OMX_ERRORTYPE
-XOmxILCallbackManagerIfImpl::DoEventNotification(OMX_EVENTTYPE aEvent,
-										   TUint32 aData1,
-										   TUint32 aData2,
-										   OMX_STRING aExtraInfo)
-	{
-    DEBUG_PRINTF4(_L8("XOmxILCallbackManagerIfImpl::DoEventNotification : aEvent[%u] aData1[%u] aData2[%u]"), aEvent, aData1, aData2);
-
-	__ASSERT_DEBUG(ipHandle && ipCallbacks, User::Panic(KOmxILCallbackManagerIfImplPanicCategory, 1));
-
-	ipCallbacks->EventHandler(ipHandle,
-							  ipAppData,
-							  aEvent,
-							  aData1,
-							  aData2,
-							  aExtraInfo);
-	return OMX_ErrorNone;
-
-	}
-
-
-EXPORT_C OMX_ERRORTYPE
-XOmxILCallbackManagerIfImpl::DoBufferDoneNotification(OMX_BUFFERHEADERTYPE* apBufferHeader,
-											 OMX_U32 aLocalPortIndex,
-											 OMX_DIRTYPE aLocalPortDirection)
-	{
-    DEBUG_PRINTF5(_L8("XOmxILCallbackManagerIfImpl::DoBufferDoneNotification : HANDLE [%X] BUFFER [%X] PORT[%d] DIR[%d]"), ipHandle, apBufferHeader, aLocalPortIndex, aLocalPortDirection);
-
-	__ASSERT_ALWAYS(apBufferHeader &&
-					(OMX_DirInput == aLocalPortDirection ||
-					 OMX_DirOutput == aLocalPortDirection),
-					User::Panic(KOmxILCallbackManagerIfImplPanicCategory, 1));
-
-	__ASSERT_ALWAYS(apBufferHeader->nOffset + apBufferHeader->nFilledLen
-					<= apBufferHeader->nAllocLen,
-					User::Panic(KOmxILCallbackManagerIfImplPanicCategory, 1));
-
-	__ASSERT_DEBUG(ipHandle && ipCallbacks, User::Panic(KOmxILCallbackManagerIfImplPanicCategory, 1));
-
-	// Look for buffer marks to be signalled or propagated
-	SignalOrPropagateBufferMarks(apBufferHeader,
-								 aLocalPortDirection);
-
-	// find out whether the port is tunnelled or not
-	TBool tunnelled = EFalse;
-	TUint tunnelInfoArrayIndex = 0;
-	const TUint tunnelCount = iRegisteredTunnels.Count();
-	for (TUint i=0; i<tunnelCount; ++i)
-		{
-		if (iRegisteredTunnels[i].iLocalPortIndex ==
-			aLocalPortIndex)
-			{
-			tunnelled = ETrue;
-			tunnelInfoArrayIndex = i;
-			break;
-			}
-		}
-
-	if (tunnelled)
-		{
-		OMX_COMPONENTTYPE* ipTunnelledComponent =
-			static_cast<OMX_COMPONENTTYPE*>(
-				iRegisteredTunnels[tunnelInfoArrayIndex].
-				iTunnelledComponentHandle);
-
-		__ASSERT_DEBUG(ipTunnelledComponent,
-					   User::Panic(KOmxILCallbackManagerIfImplPanicCategory, 1));
-
-		// From OMX_Core.h "Callbacks should not return an error to the
-		// component, so if an error occurs, the application shall handle it
-		// internally". Callback return error ignored here.
-		if (OMX_DirInput == aLocalPortDirection)
-			{
-			OMX_FillThisBuffer(ipTunnelledComponent, apBufferHeader);
-			}
-		else
-			{
-			OMX_EmptyThisBuffer(ipTunnelledComponent, apBufferHeader);
-			}
-
-		}
-	else
-		{
-		OMX_ERRORTYPE (*fp2CBackHandler)
-			(OMX_HANDLETYPE, OMX_PTR, OMX_BUFFERHEADERTYPE*) =
-			(aLocalPortDirection == OMX_DirInput ?
-			 ipCallbacks->EmptyBufferDone :
-			 ipCallbacks->FillBufferDone);
-
-		// From OMX_Core.h "Callbacks should not return an error to the
-		// component, so if an error occurs, the application shall handle it
-		// internally". Callback return error ignored here.
-		fp2CBackHandler(ipHandle,
-						ipAppData,
-						apBufferHeader);
-		}
-
-	return OMX_ErrorNone;
-
-	}
-
-EXPORT_C OMX_ERRORTYPE
-XOmxILCallbackManagerIfImpl::DoPortSettingsChangeNotification(
-	OMX_U32 aLocalPortIndex,
-	TUint aPortSettingsIndex,
-	const TDesC8& aPortSettings)
-	{
-    DEBUG_PRINTF2(_L8("XOmxILCallbackManagerIfImpl::DoPortSettingsChangeNotification : aLocalPortIndex[%d]"), aLocalPortIndex);
-
-	__ASSERT_DEBUG(ipHandle &&
-				   ipCallbacks &&
-				   ipPortManager,
-				   User::Panic(KOmxILCallbackManagerIfImplPanicCategory, 1));
-
-	HBufC8* pPortSettings = HBufC8::New(aPortSettings.Length());
-	if (!pPortSettings)
-		{
-		return OMX_ErrorInsufficientResources;
-		}
-	*pPortSettings = aPortSettings;
-
-	// This is an event that the port may want to convey to the IL Client...
-	OMX_EVENTTYPE eventForILClient = OMX_EventMax;
-	OMX_ERRORTYPE omxRetError =
-		ipPortManager->PortSettingsChangeIndication(aLocalPortIndex,
-													aPortSettingsIndex,
-													*pPortSettings,
-													eventForILClient);
-
-	delete pPortSettings;
-	pPortSettings = NULL;
-
-	// Inform the IL Client that some value in one of the ports' configuration
-	// structures has changed...
-	if (OMX_EventMax != eventForILClient)
-		{
-		// Only allow these two port events...
-		__ASSERT_ALWAYS(eventForILClient == OMX_EventPortSettingsChanged ||
-						eventForILClient == OMX_EventPortFormatDetected,
-						User::Panic(KOmxILCallbackManagerIfImplPanicCategory, 1));
-
-		// From OMX_Core.h "Callbacks should not return an error to the component,
-		// so if an error occurs, the application shall handle it
-		// internally". Callback return error ignored here.
-		ipCallbacks->EventHandler(ipHandle,
-								  ipAppData,
-								  eventForILClient,
-								  aLocalPortIndex,
-								  0,
-								  0);
-		}
-
-	return OMX_ErrorNone;
-
-	}
-
-EXPORT_C void
-XOmxILCallbackManagerIfImpl::SignalOrPropagateBufferMarks(
-	OMX_BUFFERHEADERTYPE* apBufferHeader,
-	OMX_U32 aLocalPortIndex)
-	{
-    DEBUG_PRINTF(_L8("XOmxILCallbackManagerIfImpl::SignalOrPropagateBufferMarks()"));
-
-	// Look for buffer marks to be signalled or propagated
-	if (apBufferHeader->hMarkTargetComponent)
-		{
-		// See if this component is the buffer mark target component...
-		if (apBufferHeader->hMarkTargetComponent == ipHandle)
-			{
-			// Inform the IL Client that a marked buffer has been processed...
-			ipCallbacks->EventHandler(ipHandle,
-									  ipAppData,
-									  OMX_EventMark,
-									  0,
-									  0,
-									  apBufferHeader->pMarkData);
-
-			// At this point, the mark has been delivered to the IL
-			// Client...Remove the mark from the processed header...
-			apBufferHeader->hMarkTargetComponent = 0;
-			apBufferHeader->pMarkData = 0;
-
-			}
-		else
-			{
-			// Propagate the mark...
-
-			// First find the buffer mark propagation port...
-			const TInt index = iBufferMarkPropagationPorts.Find(
-				TBufferMarkPropagationInfo(aLocalPortIndex),
-				TIdentityRelation<TBufferMarkPropagationInfo>(
-					&TBufferMarkPropagationInfo::Compare));
-
-			// Note that sink components don't propagate marks...
-			if (index != KErrNotFound)
-				{
-				const TBufferMarkPropagationInfo& propInfo =
-					iBufferMarkPropagationPorts[index];
-
-				// Let's check for the special case: The case for a source
-				// component where the output port is both the port that marks
-				// the headers and the port that propagates them ... Therefore
-				// no need to store the mark for later propagation...
-				if (propInfo.iPropagationPortIndex != aLocalPortIndex)
-					{
-					// Now, store temporarily the mark so the next time we send
-					// a buffer done callback in that propagation port, we mark
-					// that header accordingly...
-					// Unsuccessful insertion is ignored.
-					iBufferMarks.Append(
-						TOutputPortBufferMarkInfo(
-							propInfo.iPropagationPortIndex,
-							apBufferHeader->hMarkTargetComponent,
-							apBufferHeader->pMarkData));
-
-					// At this point the mark has been set for propagation to
-					// an output port. Remove the mark from the processed
-					// header...
-					apBufferHeader->hMarkTargetComponent = 0;
-					apBufferHeader->pMarkData = 0;
-					}
-				}
-			}
-		}
-	else
-		{
-		if(iBufferMarks.Count() != 0)
-			{
-			// Let's see if we have a mark waiting to go out...This will find the
-			// first mark in the local list of marks ...
-			const TInt index = iBufferMarks.Find(
-				TOutputPortBufferMarkInfo(aLocalPortIndex),
-				TIdentityRelation<TOutputPortBufferMarkInfo>(
-					&TOutputPortBufferMarkInfo::Compare));
-			if (index != KErrNotFound)
-				{
-				const TOutputPortBufferMarkInfo& markInfo =
-					iBufferMarks[index];
-
-				// Mark the header...
-				apBufferHeader->hMarkTargetComponent = markInfo.ipMarkTargetComponent;
-				apBufferHeader->pMarkData			 = markInfo.ipMarkData;
-
-				// Remove the mark info from the local store
-				iBufferMarks.Remove(index);
-				}
-			}
-
-		}
-
-
-	}
-
-EXPORT_C void
-XOmxILCallbackManagerIfImpl::HandleInsufficientResources()
-	{
-    DEBUG_PRINTF3(_L8("XOmxILCallbackManagerIfImpl::HandleInsufficientResources : ipCallbacks[%X] ipHandle[%X]"), ipCallbacks, ipHandle);
-
-	if (ipCallbacks && ipHandle)
-		{
-		// This is a best-effort action, let's try to inform the IL Client of
-		// the lack of resources...
-		ipCallbacks->EventHandler(ipHandle,
-								  ipAppData,
-								  OMX_EventError,
-					  			  (OMX_U32)OMX_ErrorInsufficientResources,
-								  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 "omxilcallbackmanagerifimpl.h"
+#include "omxilfsm.h"
+#include "omxilportmanagerif.h"
+#include "omxilspecversion.h"
+
+
+EXPORT_C
+XOmxILCallbackManagerIfImpl::XOmxILCallbackManagerIfImpl(OMX_HANDLETYPE apComponentHandle,
+														 OMX_PTR apAppData,
+														 OMX_CALLBACKTYPE* apCallbacks)
+	:
+	ipHandle(static_cast<OMX_COMPONENTTYPE*>(apComponentHandle)),
+	ipAppData(apAppData),
+	ipCallbacks(apCallbacks),
+	iRegisteredTunnels(),
+	iBufferMarkPropagationPorts(),
+	iBufferMarks(),
+	ipPortManager(0),
+	ipFsm(0)
+	{
+    DEBUG_PRINTF(_L8("XOmxILCallbackManagerIfImpl::XOmxILCallbackManagerIfImpl"));
+	}
+
+EXPORT_C
+XOmxILCallbackManagerIfImpl::~XOmxILCallbackManagerIfImpl()
+	{
+    DEBUG_PRINTF(_L8("XOmxILCallbackManagerIfImpl::~XOmxILCallbackManagerIfImpl"));
+	// These pointers are cleared to make sure that any further calls on this
+	// object will fail (e.g., from a threaded PF)
+	ipHandle	= 0;
+	ipAppData	= 0;
+	ipCallbacks = 0;
+
+	iRegisteredTunnels.Close();
+	iBufferMarkPropagationPorts.Close();
+	iBufferMarks.Close();
+
+	ipPortManager = 0;
+
+	ipFsm = 0;
+
+	}
+
+EXPORT_C void
+XOmxILCallbackManagerIfImpl::DoSetPortManager(MOmxILPortManagerIf& apPortManager)
+	{
+	ipPortManager = &apPortManager;
+	}
+
+EXPORT_C void
+XOmxILCallbackManagerIfImpl::DoSetFsm(COmxILFsm& apFsm)
+	{
+	ipFsm = &apFsm;
+	}
+
+EXPORT_C OMX_ERRORTYPE
+XOmxILCallbackManagerIfImpl::DoRegisterComponentHandle(OMX_HANDLETYPE aComponentHandle)
+	{
+    DEBUG_PRINTF(_L8("XOmxILCallbackManagerIfImpl::DoRegisterComponentHandle"));
+
+	__ASSERT_DEBUG(aComponentHandle,
+				   User::Panic(KOmxILCallbackManagerIfImplPanicCategory, 1));
+
+	ipHandle = static_cast<OMX_COMPONENTTYPE *>(aComponentHandle);
+
+	return OMX_ErrorNone;
+
+	}
+
+
+EXPORT_C OMX_ERRORTYPE
+XOmxILCallbackManagerIfImpl::DoRegisterILClientCallbacks(const OMX_CALLBACKTYPE* apCallbacks,
+														 const OMX_PTR apAppData)
+	{
+    DEBUG_PRINTF(_L8("XOmxILCallbackManagerIfImpl::DoRegisterILClientCallbacks"));
+
+	ipAppData   = const_cast<OMX_PTR>(apAppData);
+	ipCallbacks = const_cast<OMX_CALLBACKTYPE*>(apCallbacks);
+
+	return OMX_ErrorNone;
+
+	}
+
+EXPORT_C OMX_ERRORTYPE
+XOmxILCallbackManagerIfImpl::DoRegisterTunnelCallback(
+	OMX_U32 aLocalPortIndex,
+	OMX_DIRTYPE aLocalPortDirection,
+	OMX_HANDLETYPE aTunnelledComponentHandle,
+	OMX_U32 aTunnelledPortIndex)
+	{
+	DEBUG_PRINTF(_L8("XOmxILCallbackManagerIfImpl::DoRegisterTunnelCallback"));
+
+	OMX_ERRORTYPE omxError = OMX_ErrorNone;
+
+	if (aTunnelledComponentHandle)
+		{
+		// Register tunnelled port
+		TInt err = iRegisteredTunnels.Append(
+			TTunnelRegistrationInfo(aLocalPortIndex,
+									aLocalPortDirection,
+									aTunnelledComponentHandle,
+									aTunnelledPortIndex));
+		if (KErrNone != err)
+			{
+			switch (err)
+				{
+			case KErrNoMemory:
+				{
+				omxError = OMX_ErrorInsufficientResources;
+				}
+				break;
+			default:
+				{
+				omxError = OMX_ErrorUndefined;
+				}
+				};
+			}
+
+		}
+	else
+		{
+		// Deregister tunnelled port
+		const TUint tunnelCount = iRegisteredTunnels.Count();
+		for (TUint i=0; i<tunnelCount; ++i)
+			{
+			if (iRegisteredTunnels[i].iLocalPortIndex ==
+				aLocalPortIndex)
+				{
+				iRegisteredTunnels.Remove(i);
+				break;
+				}
+			}
+		}
+
+	return omxError;
+
+	}
+
+EXPORT_C OMX_ERRORTYPE
+XOmxILCallbackManagerIfImpl::DoRegisterBufferMarkPropagationPort(
+	OMX_U32 aPortIndex,
+	OMX_U32 aPropagationPortIndex)
+	{
+	DEBUG_PRINTF3(_L8("XOmxILCallbackManagerIfImpl::DoRegisterBufferMarkPropagationPort : aPortIndex[%d] aPropagationPortIndex[%d] "),aPortIndex, aPropagationPortIndex);
+
+	TInt err = iBufferMarkPropagationPorts.Append(
+		TBufferMarkPropagationInfo(aPortIndex,
+								   aPropagationPortIndex));
+
+	OMX_ERRORTYPE omxError = OMX_ErrorNone;
+	if (KErrNone != err)
+		{
+		switch (err)
+			{
+		case KErrNoMemory:
+			{
+			omxError = OMX_ErrorInsufficientResources;
+			}
+			break;
+		default:
+			{
+			omxError = OMX_ErrorUndefined;
+			}
+			};
+		}
+
+	return omxError;
+
+	}
+
+
+
+EXPORT_C OMX_ERRORTYPE
+XOmxILCallbackManagerIfImpl::DoTransitionCompleteNotification(OMX_STATETYPE aOmxState)
+	{
+    DEBUG_PRINTF(_L8("XOmxILCallbackManagerIfImpl::DoTransitionCompleteNotification"));
+
+	return DoEventNotification(OMX_EventCmdComplete,
+							   OMX_CommandStateSet,
+							   aOmxState,
+							   0);
+
+	}
+
+
+EXPORT_C OMX_ERRORTYPE
+XOmxILCallbackManagerIfImpl::DoCommandCompleteNotification(OMX_COMMANDTYPE aOmxCommand,
+														   OMX_U32 aOmxPortIndex)
+	{
+    DEBUG_PRINTF(_L8("XOmxILCallbackManagerIfImpl::DoCommandCompleteNotification"));
+
+	return DoEventNotification(OMX_EventCmdComplete,
+							   aOmxCommand,
+							   aOmxPortIndex,
+							   0);
+
+	}
+
+
+EXPORT_C OMX_ERRORTYPE
+XOmxILCallbackManagerIfImpl::DoErrorEventNotification(OMX_ERRORTYPE aOmxError)
+	{
+    DEBUG_PRINTF2(_L8("XOmxILCallbackManagerIfImpl::DoErrorEventNotification : aOmxError[%X] "), aOmxError);
+
+	return DoEventNotification(OMX_EventError,
+							   aOmxError,
+							   0,
+							   0);
+
+	}
+
+EXPORT_C OMX_ERRORTYPE
+XOmxILCallbackManagerIfImpl::DoEventNotification(OMX_EVENTTYPE aEvent,
+												 TUint32 aData1,
+												 TUint32 aData2,
+												 OMX_STRING aExtraInfo)
+	{
+    DEBUG_PRINTF5(_L8("XOmxILCallbackManagerIfImpl::DoEventNotification : Handle[%X] aEvent[%u] aData1[%u] aData2[%u]"), ipHandle, aEvent, aData1, aData2);
+
+	__ASSERT_DEBUG(ipHandle && ipCallbacks, User::Panic(KOmxILCallbackManagerIfImplPanicCategory, 1));
+
+	OMX_TRACE_EVENTHANDLER_IN(ipHandle, ipAppData, aEvent, aData1, aData2, aExtraInfo);
+
+	ipCallbacks->EventHandler(ipHandle,
+							  ipAppData,
+							  aEvent,
+							  aData1,
+							  aData2,
+							  aExtraInfo);
+	OMX_TRACE_EVENTHANDLER_OUT(ipHandle, ipAppData, aEvent, aData1, aData2, aExtraInfo, OMX_ErrorNone);
+	return OMX_ErrorNone;
+
+	}
+
+
+EXPORT_C OMX_ERRORTYPE
+XOmxILCallbackManagerIfImpl::DoBufferDoneNotification(OMX_BUFFERHEADERTYPE* apBufferHeader,
+													  OMX_U32 aLocalPortIndex,
+													  OMX_DIRTYPE aLocalPortDirection)
+	{
+    DEBUG_PRINTF5(_L8("XOmxILCallbackManagerIfImpl::DoBufferDoneNotification : HANDLE [%X] BUFFER [%X] PORT[%d] DIR[%d]"), ipHandle, apBufferHeader, aLocalPortIndex, aLocalPortDirection);
+
+	__ASSERT_ALWAYS(apBufferHeader &&
+					(OMX_DirInput == aLocalPortDirection ||
+					 OMX_DirOutput == aLocalPortDirection),
+					User::Panic(KOmxILCallbackManagerIfImplPanicCategory, 1));
+
+	__ASSERT_ALWAYS(apBufferHeader->nOffset + apBufferHeader->nFilledLen
+					<= apBufferHeader->nAllocLen,
+					User::Panic(KOmxILCallbackManagerIfImplPanicCategory, 1));
+
+	__ASSERT_DEBUG(ipHandle && ipCallbacks, User::Panic(KOmxILCallbackManagerIfImplPanicCategory, 1));
+
+	// Look for buffer marks to be signalled or propagated
+	SignalOrPropagateBufferMarks(apBufferHeader,
+								 aLocalPortDirection);
+
+	// find out whether the port is tunnelled or not
+	TBool tunnelled = EFalse;
+	TUint tunnelInfoArrayIndex = 0;
+	const TUint tunnelCount = iRegisteredTunnels.Count();
+	for (TUint i=0; i<tunnelCount; ++i)
+		{
+		if (iRegisteredTunnels[i].iLocalPortIndex ==
+			aLocalPortIndex)
+			{
+			tunnelled = ETrue;
+			tunnelInfoArrayIndex = i;
+			break;
+			}
+		}
+
+	if (tunnelled)
+		{
+		OMX_COMPONENTTYPE* ipTunnelledComponent =
+			static_cast<OMX_COMPONENTTYPE*>(
+				iRegisteredTunnels[tunnelInfoArrayIndex].
+				iTunnelledComponentHandle);
+
+		__ASSERT_DEBUG(ipTunnelledComponent,
+					   User::Panic(KOmxILCallbackManagerIfImplPanicCategory, 1));
+
+		// From OMX_Core.h "Callbacks should not return an error to the
+		// component, so if an error occurs, the application shall handle it
+		// internally". Callback return error ignored here.
+		if (OMX_DirInput == aLocalPortDirection)
+			{
+			OMX_FillThisBuffer(ipTunnelledComponent, apBufferHeader);
+			}
+		else
+			{
+			OMX_EmptyThisBuffer(ipTunnelledComponent, apBufferHeader);
+			}
+
+		}
+	else
+		{
+		OMX_ERRORTYPE (*fp2CBackHandler)
+			(OMX_HANDLETYPE, OMX_PTR, OMX_BUFFERHEADERTYPE*) =
+			(aLocalPortDirection == OMX_DirInput ?
+			 ipCallbacks->EmptyBufferDone :
+			 ipCallbacks->FillBufferDone);
+
+		// From OMX_Core.h "Callbacks should not return an error to the
+		// component, so if an error occurs, the application shall handle it
+		// internally". Callback return error ignored here.
+#ifdef OMX_DEBUG_TRACING_ON
+		if (aLocalPortDirection == OMX_DirInput)
+			{
+			OMX_TRACE_EMPTYBUFFERDONE_IN(ipHandle, ipAppData, apBufferHeader);
+			}
+		else
+			{
+			OMX_TRACE_FILLBUFFERDONE_IN(ipHandle, ipAppData, apBufferHeader);
+			}
+#endif
+		fp2CBackHandler(ipHandle,
+						ipAppData,
+						apBufferHeader);
+#ifdef OMX_DEBUG_TRACING_ON
+        if (aLocalPortDirection == OMX_DirInput)
+            {
+            OMX_TRACE_EMPTYBUFFERDONE_OUT(ipHandle, ipAppData, apBufferHeader, 0);
+            }
+        else
+            {
+            OMX_TRACE_FILLBUFFERDONE_OUT(ipHandle, ipAppData, apBufferHeader, 0);
+            }
+#endif
+
+		}
+
+	return OMX_ErrorNone;
+
+	}
+
+EXPORT_C OMX_ERRORTYPE
+XOmxILCallbackManagerIfImpl::DoPortSettingsChangeNotification(
+	OMX_U32 aLocalPortIndex,
+	TUint aPortSettingsIndex,
+	const TDesC8& aPortSettings)
+	{
+    DEBUG_PRINTF2(_L8("XOmxILCallbackManagerIfImpl::DoPortSettingsChangeNotification : aLocalPortIndex[%d]"), aLocalPortIndex);
+
+	__ASSERT_DEBUG(ipHandle &&
+				   ipCallbacks &&
+				   ipPortManager,
+				   User::Panic(KOmxILCallbackManagerIfImplPanicCategory, 1));
+
+	HBufC8* pPortSettings = HBufC8::New(aPortSettings.Length());
+	if (!pPortSettings)
+		{
+		return OMX_ErrorInsufficientResources;
+		}
+	*pPortSettings = aPortSettings;
+
+	// This is an event that the port may want to convey to the IL Client...
+	OMX_EVENTTYPE eventForILClient = OMX_EventMax;
+	OMX_ERRORTYPE omxRetError =
+		ipPortManager->PortSettingsChangeIndication(aLocalPortIndex,
+													aPortSettingsIndex,
+													*pPortSettings,
+													eventForILClient);
+
+	delete pPortSettings;
+	pPortSettings = NULL;
+
+	// Inform the IL Client that some value in one of the ports' configuration
+	// structures has changed...
+	if (OMX_EventMax != eventForILClient)
+		{
+		// Only allow these two port events...
+		__ASSERT_ALWAYS(eventForILClient == OMX_EventPortSettingsChanged ||
+						eventForILClient == OMX_EventPortFormatDetected,
+						User::Panic(KOmxILCallbackManagerIfImplPanicCategory, 1));
+
+		// From OMX_Core.h "Callbacks should not return an error to the component,
+		// so if an error occurs, the application shall handle it
+		// internally". Callback return error ignored here.
+		ipCallbacks->EventHandler(ipHandle,
+								  ipAppData,
+								  eventForILClient,
+								  aLocalPortIndex,
+								  0,
+								  0);
+		}
+
+	return OMX_ErrorNone;
+
+	}
+
+EXPORT_C void
+XOmxILCallbackManagerIfImpl::SignalOrPropagateBufferMarks(
+	OMX_BUFFERHEADERTYPE* apBufferHeader,
+	OMX_U32 aLocalPortIndex)
+	{
+    DEBUG_PRINTF(_L8("XOmxILCallbackManagerIfImpl::SignalOrPropagateBufferMarks()"));
+
+	// Look for buffer marks to be signalled or propagated
+	if (apBufferHeader->hMarkTargetComponent)
+		{
+		// See if this component is the buffer mark target component...
+		if (apBufferHeader->hMarkTargetComponent == ipHandle)
+			{
+			// Inform the IL Client that a marked buffer has been processed...
+			ipCallbacks->EventHandler(ipHandle,
+									  ipAppData,
+									  OMX_EventMark,
+									  0,
+									  0,
+									  apBufferHeader->pMarkData);
+
+			// At this point, the mark has been delivered to the IL
+			// Client...Remove the mark from the processed header...
+			apBufferHeader->hMarkTargetComponent = 0;
+			apBufferHeader->pMarkData = 0;
+
+			}
+		else
+			{
+			// Propagate the mark...
+
+			// First find the buffer mark propagation port...
+			const TInt index = iBufferMarkPropagationPorts.Find(
+				TBufferMarkPropagationInfo(aLocalPortIndex),
+				TIdentityRelation<TBufferMarkPropagationInfo>(
+					&TBufferMarkPropagationInfo::Compare));
+
+			// Note that sink components don't propagate marks...
+			if (index != KErrNotFound)
+				{
+				const TBufferMarkPropagationInfo& propInfo =
+					iBufferMarkPropagationPorts[index];
+
+				// Let's check for the special case: The case for a source
+				// component where the output port is both the port that marks
+				// the headers and the port that propagates them ... Therefore
+				// no need to store the mark for later propagation...
+				if (propInfo.iPropagationPortIndex != aLocalPortIndex)
+					{
+					// Now, store temporarily the mark so the next time we send
+					// a buffer done callback in that propagation port, we mark
+					// that header accordingly...
+					// Unsuccessful insertion is ignored.
+					iBufferMarks.Append(
+						TOutputPortBufferMarkInfo(
+							propInfo.iPropagationPortIndex,
+							apBufferHeader->hMarkTargetComponent,
+							apBufferHeader->pMarkData));
+
+					// At this point the mark has been set for propagation to
+					// an output port. Remove the mark from the processed
+					// header...
+					apBufferHeader->hMarkTargetComponent = 0;
+					apBufferHeader->pMarkData = 0;
+					}
+				}
+			}
+		}
+	else
+		{
+		if(iBufferMarks.Count() != 0)
+			{
+			// Let's see if we have a mark waiting to go out...This will find the
+			// first mark in the local list of marks ...
+			const TInt index = iBufferMarks.Find(
+				TOutputPortBufferMarkInfo(aLocalPortIndex),
+				TIdentityRelation<TOutputPortBufferMarkInfo>(
+					&TOutputPortBufferMarkInfo::Compare));
+			if (index != KErrNotFound)
+				{
+				const TOutputPortBufferMarkInfo& markInfo =
+					iBufferMarks[index];
+
+				// Mark the header...
+				apBufferHeader->hMarkTargetComponent = markInfo.ipMarkTargetComponent;
+				apBufferHeader->pMarkData                        = markInfo.ipMarkData;
+
+				// Remove the mark info from the local store
+				iBufferMarks.Remove(index);
+				}
+			}
+
+		}
+
+
+	}
+
+EXPORT_C void
+XOmxILCallbackManagerIfImpl::HandleInsufficientResources()
+	{
+    DEBUG_PRINTF3(_L8("XOmxILCallbackManagerIfImpl::HandleInsufficientResources : ipCallbacks[%X] ipHandle[%X]"), ipCallbacks, ipHandle);
+
+	if (ipCallbacks && ipHandle)
+		{
+		// This is a best-effort action, let's try to inform the IL Client of
+		// the lack of resources...
+		ipCallbacks->EventHandler(ipHandle,
+								  ipAppData,
+								  OMX_EventError,
+					  			  (OMX_U32)OMX_ErrorInsufficientResources,
+								  0,
+								  0);
+		}
+	}