sl@0: // Copyright (c) 2005-2009 Nokia Corporation and/or its subsidiary(-ies). sl@0: // All rights reserved. sl@0: // This component and the accompanying materials are made available sl@0: // under the terms of "Eclipse Public License v1.0" sl@0: // which accompanies this distribution, and is available sl@0: // at the URL "http://www.eclipse.org/legal/epl-v10.html". sl@0: // sl@0: // Initial Contributors: sl@0: // Nokia Corporation - initial contribution. sl@0: // sl@0: // Contributors: sl@0: // sl@0: // Description: sl@0: // omxoutputport.cpp sl@0: // sl@0: // sl@0: sl@0: #include sl@0: #include sl@0: #include "omxcomponentbody.h" sl@0: #include "omxoutputportbody.h" sl@0: sl@0: COmxOutputPort::CBody* COmxOutputPort::CBody::NewL(TInt aIndex, COmxProcessingUnit* aComponent, COmxOutputPort* aParent) sl@0: { sl@0: return new (ELeave) CBody(aIndex, aComponent, aParent); sl@0: } sl@0: sl@0: COmxOutputPort::CBody::CBody(TInt aIndex, COmxProcessingUnit* aComponent, COmxOutputPort* aParent) : sl@0: iPortIndex(aIndex), sl@0: iComponent(aComponent), sl@0: iParent(aParent) sl@0: { sl@0: } sl@0: sl@0: void COmxOutputPort::CBody::MopSetObserver(const MMdfOutputPortObserver& aOutputPortObserver) sl@0: { sl@0: iObserver = const_cast(&aOutputPortObserver); sl@0: } sl@0: sl@0: void COmxOutputPort::CBody::MipoWriteDataComplete(const MMdfInputPort* /*aInputPort*/, sl@0: CMMFBuffer* aBuffer, TInt /*aErrorCode*/) sl@0: { sl@0: // the parent class read must be called in case it has been overridden in a derived class sl@0: iParent->MopReadData(*aBuffer); sl@0: } sl@0: sl@0: void COmxOutputPort::CBody::MipoDisconnectTunnelComplete(const MMdfInputPort* /*aInputPort*/, sl@0: TInt /*aErrorCode*/) sl@0: { sl@0: } sl@0: sl@0: void COmxOutputPort::CBody::MipoRestartTunnelComplete(const MMdfInputPort* /*aInputPort*/, sl@0: TInt /*aErrorCode*/) sl@0: { sl@0: } sl@0: sl@0: TInt COmxOutputPort::CBody::FillBufferDone(OMX_HANDLETYPE /*aComponent*/, CMMFBuffer* aBuffer) sl@0: { sl@0: __ASSERT_ALWAYS(iObserver, User::Panic(_L("OmxOutputPort"), EObserverNotSet)); sl@0: sl@0: if (iPortConnectedTo) sl@0: { sl@0: iPortConnectedTo->MipWriteData(*aBuffer); sl@0: } sl@0: else sl@0: { sl@0: if (iObserver) sl@0: { sl@0: iObserver->MopoReadDataComplete(iParent, aBuffer, KErrNone); sl@0: } sl@0: } sl@0: return KErrNone; sl@0: } sl@0: sl@0: TInt COmxOutputPort::CBody::MopConfigure(const TPuConfig& /*aConfig*/) sl@0: { sl@0: return KErrNotSupported; sl@0: } sl@0: sl@0: TInt COmxOutputPort::CBody::MopGetConfig(TPuConfig& /*aConfig*/) sl@0: { sl@0: return KErrNotSupported; sl@0: } sl@0: sl@0: void COmxOutputPort::CBody::MopInitialize() sl@0: { sl@0: if (iPortConnectedTo != NULL) sl@0: { sl@0: iPortConnectedTo->MipSetObserver(*iParent); sl@0: } sl@0: } sl@0: sl@0: CMMFBuffer* COmxOutputPort::CBody::MopCreateBuffer(TInt aBufferSize) sl@0: { sl@0: CMMFBuffer* buffer = NULL; sl@0: TInt err = KErrNone; sl@0: TRAP(err, buffer = Component()->OmxAllocateBufferL(iPortIndex, aBufferSize)); sl@0: return buffer; sl@0: } sl@0: sl@0: TInt COmxOutputPort::CBody::MopUseBuffer(CMMFBuffer& aBuffer) sl@0: { sl@0: if (iPortConnectedTo) sl@0: { sl@0: iPortConnectedTo->MipUseBuffer(aBuffer); sl@0: } sl@0: sl@0: return Component()->OmxUseBuffer(&aBuffer, iPortIndex); sl@0: } sl@0: sl@0: TInt COmxOutputPort::CBody::MopFreeBuffer(CMMFBuffer* aBuffer) sl@0: { sl@0: return Component()->OmxFreeBuffer(aBuffer); sl@0: } sl@0: sl@0: TInt COmxOutputPort::CBody::MopTunnelRequest(const MMdfInputPort& aInputPortToBeConnectedTo, sl@0: TTunnelFlags& aTunnelFlags, TSupplierType& aSupplierType) sl@0: { sl@0: if ((Component()->State()!=EProcessingUnitLoaded) && (!iStopped)) sl@0: { sl@0: // invalid state sl@0: return EInvalidState; sl@0: } sl@0: sl@0: if (iPortConnectedTo) sl@0: { sl@0: // the port is already connected, return an error sl@0: return EPortAlreadyTunnelled; sl@0: } sl@0: aTunnelFlags = EBufferReadOnly; sl@0: aSupplierType = EBufferSupplyOutput; sl@0: iPortConnectedTo = const_cast(&aInputPortToBeConnectedTo); sl@0: sl@0: sl@0: return KErrNone; sl@0: } sl@0: sl@0: void COmxOutputPort::CBody::MopReadData(CMMFBuffer& aBuffer) sl@0: { sl@0: Component()->OmxFillThisBuffer(&aBuffer, this); sl@0: } sl@0: sl@0: void COmxOutputPort::CBody::MopDisconnectTunnel() sl@0: { sl@0: if(iObserver) sl@0: { sl@0: iObserver->MopoDisconnectTunnelComplete(iParent, KErrNone); sl@0: } sl@0: } sl@0: sl@0: void COmxOutputPort::CBody::MopRestartTunnel() sl@0: { sl@0: } sl@0: sl@0: TBool COmxOutputPort::CBody::MopIsTunnelled() const sl@0: { sl@0: if (!iPortConnectedTo) sl@0: { sl@0: return EFalse; sl@0: } sl@0: return ETrue; sl@0: } sl@0: sl@0: TInt COmxOutputPort::CBody::MopIndex() const sl@0: { sl@0: return iPortIndex; sl@0: } sl@0: sl@0: TUint32 COmxOutputPort::CBody::MopBufferSize() const sl@0: { sl@0: OMX_PARAM_PORTDEFINITIONTYPE portInfo; sl@0: portInfo.nPortIndex = 1; sl@0: Component()->OmxGetParameter(OMX_IndexParamPortDefinition, &portInfo); sl@0: return portInfo.nBufferSize; sl@0: } sl@0: sl@0: TInt COmxOutputPort::CBody::MopCreateCustomInterface(TUid /*aUid*/) sl@0: { sl@0: return KErrNotSupported; sl@0: } sl@0: sl@0: TAny* COmxOutputPort::CBody::MopCustomInterface(TUid /*aUid*/) sl@0: { sl@0: return NULL; sl@0: } sl@0: sl@0: MMdfOutputPortObserver* COmxOutputPort::CBody::Observer() const sl@0: { sl@0: return iObserver; sl@0: } sl@0: sl@0: COmxProcessingUnit* COmxOutputPort::CBody::Component() const sl@0: { sl@0: return iComponent; sl@0: }