1.1 --- /dev/null Thu Jan 01 00:00:00 1970 +0000
1.2 +++ b/os/mm/mmdevicefw/mdf/src/openmax/omxoutputportbody.cpp Fri Jun 15 03:10:57 2012 +0200
1.3 @@ -0,0 +1,195 @@
1.4 +// Copyright (c) 2005-2009 Nokia Corporation and/or its subsidiary(-ies).
1.5 +// All rights reserved.
1.6 +// This component and the accompanying materials are made available
1.7 +// under the terms of "Eclipse Public License v1.0"
1.8 +// which accompanies this distribution, and is available
1.9 +// at the URL "http://www.eclipse.org/legal/epl-v10.html".
1.10 +//
1.11 +// Initial Contributors:
1.12 +// Nokia Corporation - initial contribution.
1.13 +//
1.14 +// Contributors:
1.15 +//
1.16 +// Description:
1.17 +// omxoutputport.cpp
1.18 +//
1.19 +//
1.20 +
1.21 +#include <omxprocessingunit.h>
1.22 +#include <mdf/mdfpuconfig.h>
1.23 +#include "omxcomponentbody.h"
1.24 +#include "omxoutputportbody.h"
1.25 +
1.26 +COmxOutputPort::CBody* COmxOutputPort::CBody::NewL(TInt aIndex, COmxProcessingUnit* aComponent, COmxOutputPort* aParent)
1.27 + {
1.28 + return new (ELeave) CBody(aIndex, aComponent, aParent);
1.29 + }
1.30 +
1.31 +COmxOutputPort::CBody::CBody(TInt aIndex, COmxProcessingUnit* aComponent, COmxOutputPort* aParent) :
1.32 + iPortIndex(aIndex),
1.33 + iComponent(aComponent),
1.34 + iParent(aParent)
1.35 + {
1.36 + }
1.37 +
1.38 +void COmxOutputPort::CBody::MopSetObserver(const MMdfOutputPortObserver& aOutputPortObserver)
1.39 + {
1.40 + iObserver = const_cast<MMdfOutputPortObserver*>(&aOutputPortObserver);
1.41 + }
1.42 +
1.43 +void COmxOutputPort::CBody::MipoWriteDataComplete(const MMdfInputPort* /*aInputPort*/,
1.44 + CMMFBuffer* aBuffer, TInt /*aErrorCode*/)
1.45 + {
1.46 + // the parent class read must be called in case it has been overridden in a derived class
1.47 + iParent->MopReadData(*aBuffer);
1.48 + }
1.49 +
1.50 +void COmxOutputPort::CBody::MipoDisconnectTunnelComplete(const MMdfInputPort* /*aInputPort*/,
1.51 + TInt /*aErrorCode*/)
1.52 + {
1.53 + }
1.54 +
1.55 +void COmxOutputPort::CBody::MipoRestartTunnelComplete(const MMdfInputPort* /*aInputPort*/,
1.56 + TInt /*aErrorCode*/)
1.57 + {
1.58 + }
1.59 +
1.60 +TInt COmxOutputPort::CBody::FillBufferDone(OMX_HANDLETYPE /*aComponent*/, CMMFBuffer* aBuffer)
1.61 + {
1.62 + __ASSERT_ALWAYS(iObserver, User::Panic(_L("OmxOutputPort"), EObserverNotSet));
1.63 +
1.64 + if (iPortConnectedTo)
1.65 + {
1.66 + iPortConnectedTo->MipWriteData(*aBuffer);
1.67 + }
1.68 + else
1.69 + {
1.70 + if (iObserver)
1.71 + {
1.72 + iObserver->MopoReadDataComplete(iParent, aBuffer, KErrNone);
1.73 + }
1.74 + }
1.75 + return KErrNone;
1.76 + }
1.77 +
1.78 +TInt COmxOutputPort::CBody::MopConfigure(const TPuConfig& /*aConfig*/)
1.79 + {
1.80 + return KErrNotSupported;
1.81 + }
1.82 +
1.83 +TInt COmxOutputPort::CBody::MopGetConfig(TPuConfig& /*aConfig*/)
1.84 + {
1.85 + return KErrNotSupported;
1.86 + }
1.87 +
1.88 +void COmxOutputPort::CBody::MopInitialize()
1.89 + {
1.90 + if (iPortConnectedTo != NULL)
1.91 + {
1.92 + iPortConnectedTo->MipSetObserver(*iParent);
1.93 + }
1.94 + }
1.95 +
1.96 +CMMFBuffer* COmxOutputPort::CBody::MopCreateBuffer(TInt aBufferSize)
1.97 + {
1.98 + CMMFBuffer* buffer = NULL;
1.99 + TInt err = KErrNone;
1.100 + TRAP(err, buffer = Component()->OmxAllocateBufferL(iPortIndex, aBufferSize));
1.101 + return buffer;
1.102 + }
1.103 +
1.104 +TInt COmxOutputPort::CBody::MopUseBuffer(CMMFBuffer& aBuffer)
1.105 + {
1.106 + if (iPortConnectedTo)
1.107 + {
1.108 + iPortConnectedTo->MipUseBuffer(aBuffer);
1.109 + }
1.110 +
1.111 + return Component()->OmxUseBuffer(&aBuffer, iPortIndex);
1.112 + }
1.113 +
1.114 +TInt COmxOutputPort::CBody::MopFreeBuffer(CMMFBuffer* aBuffer)
1.115 + {
1.116 + return Component()->OmxFreeBuffer(aBuffer);
1.117 + }
1.118 +
1.119 +TInt COmxOutputPort::CBody::MopTunnelRequest(const MMdfInputPort& aInputPortToBeConnectedTo,
1.120 + TTunnelFlags& aTunnelFlags, TSupplierType& aSupplierType)
1.121 + {
1.122 + if ((Component()->State()!=EProcessingUnitLoaded) && (!iStopped))
1.123 + {
1.124 + // invalid state
1.125 + return EInvalidState;
1.126 + }
1.127 +
1.128 + if (iPortConnectedTo)
1.129 + {
1.130 + // the port is already connected, return an error
1.131 + return EPortAlreadyTunnelled;
1.132 + }
1.133 + aTunnelFlags = EBufferReadOnly;
1.134 + aSupplierType = EBufferSupplyOutput;
1.135 + iPortConnectedTo = const_cast<MMdfInputPort*>(&aInputPortToBeConnectedTo);
1.136 +
1.137 +
1.138 + return KErrNone;
1.139 + }
1.140 +
1.141 +void COmxOutputPort::CBody::MopReadData(CMMFBuffer& aBuffer)
1.142 + {
1.143 + Component()->OmxFillThisBuffer(&aBuffer, this);
1.144 + }
1.145 +
1.146 +void COmxOutputPort::CBody::MopDisconnectTunnel()
1.147 + {
1.148 + if(iObserver)
1.149 + {
1.150 + iObserver->MopoDisconnectTunnelComplete(iParent, KErrNone);
1.151 + }
1.152 + }
1.153 +
1.154 +void COmxOutputPort::CBody::MopRestartTunnel()
1.155 + {
1.156 + }
1.157 +
1.158 +TBool COmxOutputPort::CBody::MopIsTunnelled() const
1.159 + {
1.160 + if (!iPortConnectedTo)
1.161 + {
1.162 + return EFalse;
1.163 + }
1.164 + return ETrue;
1.165 + }
1.166 +
1.167 +TInt COmxOutputPort::CBody::MopIndex() const
1.168 + {
1.169 + return iPortIndex;
1.170 + }
1.171 +
1.172 +TUint32 COmxOutputPort::CBody::MopBufferSize() const
1.173 + {
1.174 + OMX_PARAM_PORTDEFINITIONTYPE portInfo;
1.175 + portInfo.nPortIndex = 1;
1.176 + Component()->OmxGetParameter(OMX_IndexParamPortDefinition, &portInfo);
1.177 + return portInfo.nBufferSize;
1.178 + }
1.179 +
1.180 +TInt COmxOutputPort::CBody::MopCreateCustomInterface(TUid /*aUid*/)
1.181 + {
1.182 + return KErrNotSupported;
1.183 + }
1.184 +
1.185 +TAny* COmxOutputPort::CBody::MopCustomInterface(TUid /*aUid*/)
1.186 + {
1.187 + return NULL;
1.188 + }
1.189 +
1.190 +MMdfOutputPortObserver* COmxOutputPort::CBody::Observer() const
1.191 + {
1.192 + return iObserver;
1.193 + }
1.194 +
1.195 +COmxProcessingUnit* COmxOutputPort::CBody::Component() const
1.196 + {
1.197 + return iComponent;
1.198 + }