--- /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;
+ }