mmdevicefw/mdf/src/openmax/omxoutputportbody.cpp
changeset 0 40261b775718
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/mmdevicefw/mdf/src/openmax/omxoutputportbody.cpp	Tue Feb 02 01:56:55 2010 +0200
@@ -0,0 +1,195 @@
+// Copyright (c) 2005-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:
+// omxoutputport.cpp
+// 
+//
+
+#include <omxprocessingunit.h>
+#include <mdf/mdfpuconfig.h>
+#include "omxcomponentbody.h"
+#include "omxoutputportbody.h"
+
+COmxOutputPort::CBody* COmxOutputPort::CBody::NewL(TInt aIndex, COmxProcessingUnit* aComponent, COmxOutputPort* aParent)
+	{
+	return new (ELeave) CBody(aIndex, aComponent, aParent);	
+	}  
+
+COmxOutputPort::CBody::CBody(TInt aIndex, COmxProcessingUnit* aComponent, COmxOutputPort* aParent) :
+	iPortIndex(aIndex),	
+	iComponent(aComponent),
+	iParent(aParent)
+	{
+	}
+
+void COmxOutputPort::CBody::MopSetObserver(const MMdfOutputPortObserver& aOutputPortObserver) 
+	{
+	iObserver = const_cast<MMdfOutputPortObserver*>(&aOutputPortObserver);
+	}
+
+void COmxOutputPort::CBody::MipoWriteDataComplete(const MMdfInputPort* /*aInputPort*/,
+		CMMFBuffer* aBuffer, TInt /*aErrorCode*/)
+	{
+	// the parent class read must be called in case it has been overridden in a derived class
+	iParent->MopReadData(*aBuffer);
+	}
+
+void COmxOutputPort::CBody::MipoDisconnectTunnelComplete(const MMdfInputPort* /*aInputPort*/,
+		TInt /*aErrorCode*/)
+	{
+	}
+	
+void COmxOutputPort::CBody::MipoRestartTunnelComplete(const MMdfInputPort* /*aInputPort*/,
+		TInt /*aErrorCode*/)
+	{	
+	}
+
+TInt COmxOutputPort::CBody::FillBufferDone(OMX_HANDLETYPE /*aComponent*/, CMMFBuffer* aBuffer)
+	{
+	__ASSERT_ALWAYS(iObserver, User::Panic(_L("OmxOutputPort"), EObserverNotSet));
+
+	if (iPortConnectedTo)
+		{
+		iPortConnectedTo->MipWriteData(*aBuffer);
+		}
+	else
+		{
+		if (iObserver)
+			{
+			iObserver->MopoReadDataComplete(iParent, aBuffer, KErrNone);				
+			}
+		}
+	return KErrNone;
+	}
+
+TInt COmxOutputPort::CBody::MopConfigure(const TPuConfig&  /*aConfig*/)
+	{
+	return KErrNotSupported;	
+	}
+	
+TInt COmxOutputPort::CBody::MopGetConfig(TPuConfig& /*aConfig*/)
+	{
+	return KErrNotSupported;	
+	}		
+
+void COmxOutputPort::CBody::MopInitialize()	
+ 	{
+ 	if (iPortConnectedTo != NULL)
+ 		{
+ 		iPortConnectedTo->MipSetObserver(*iParent);
+ 		}
+ 	}
+	
+CMMFBuffer* COmxOutputPort::CBody::MopCreateBuffer(TInt aBufferSize)
+	{
+	CMMFBuffer* buffer = NULL;
+	TInt err = KErrNone;
+	TRAP(err, buffer = Component()->OmxAllocateBufferL(iPortIndex, aBufferSize));	
+	return buffer;
+	}
+
+TInt COmxOutputPort::CBody::MopUseBuffer(CMMFBuffer& aBuffer)
+	{
+	if (iPortConnectedTo)
+		{
+		iPortConnectedTo->MipUseBuffer(aBuffer);
+		}
+
+	return Component()->OmxUseBuffer(&aBuffer, iPortIndex);	
+	}
+	
+TInt COmxOutputPort::CBody::MopFreeBuffer(CMMFBuffer* aBuffer)
+	{
+	return Component()->OmxFreeBuffer(aBuffer);	
+	}
+	 
+TInt COmxOutputPort::CBody::MopTunnelRequest(const MMdfInputPort& aInputPortToBeConnectedTo,
+		TTunnelFlags& aTunnelFlags, TSupplierType& aSupplierType) 
+	{
+	if ((Component()->State()!=EProcessingUnitLoaded) && (!iStopped))
+		{
+		// invalid state
+		return EInvalidState;
+		}
+	
+	if (iPortConnectedTo)
+		{
+		// the port is already connected, return an error
+		return EPortAlreadyTunnelled;
+		}
+	aTunnelFlags = EBufferReadOnly;
+	aSupplierType = EBufferSupplyOutput;
+	iPortConnectedTo = const_cast<MMdfInputPort*>(&aInputPortToBeConnectedTo);
+
+	
+	return KErrNone;
+	}
+
+void COmxOutputPort::CBody::MopReadData(CMMFBuffer& aBuffer)
+	{
+	Component()->OmxFillThisBuffer(&aBuffer, this);	
+	}
+
+void COmxOutputPort::CBody::MopDisconnectTunnel()
+	{
+	if(iObserver) 
+		{
+		iObserver->MopoDisconnectTunnelComplete(iParent, KErrNone);		
+		}
+	}
+
+void COmxOutputPort::CBody::MopRestartTunnel()
+	{
+	}
+
+TBool COmxOutputPort::CBody::MopIsTunnelled() const
+	{
+	if (!iPortConnectedTo)
+		{
+		return EFalse;
+		}		
+	return ETrue;
+	}
+
+TInt COmxOutputPort::CBody::MopIndex() const
+	{
+	return iPortIndex;
+	}
+
+TUint32 COmxOutputPort::CBody::MopBufferSize() const
+	{
+	OMX_PARAM_PORTDEFINITIONTYPE portInfo;
+	portInfo.nPortIndex = 1;
+	Component()->OmxGetParameter(OMX_IndexParamPortDefinition, &portInfo);	
+	return portInfo.nBufferSize;
+	}
+
+TInt COmxOutputPort::CBody::MopCreateCustomInterface(TUid /*aUid*/)
+	{
+	return KErrNotSupported;
+	}
+
+TAny* COmxOutputPort::CBody::MopCustomInterface(TUid /*aUid*/)
+	{
+	return NULL;	
+	}
+
+MMdfOutputPortObserver* COmxOutputPort::CBody::Observer() const
+	{
+	return iObserver;
+	}
+
+COmxProcessingUnit* COmxOutputPort::CBody::Component() const
+	{
+	return iComponent;
+	}