os/mm/mmdevicefw/mdf/src/openmax/omxoutputportbody.cpp
author sl
Tue, 10 Jun 2014 14:32:02 +0200
changeset 1 260cb5ec6c19
permissions -rw-r--r--
Update contrib.
     1 // Copyright (c) 2005-2009 Nokia Corporation and/or its subsidiary(-ies).
     2 // All rights reserved.
     3 // This component and the accompanying materials are made available
     4 // under the terms of "Eclipse Public License v1.0"
     5 // which accompanies this distribution, and is available
     6 // at the URL "http://www.eclipse.org/legal/epl-v10.html".
     7 //
     8 // Initial Contributors:
     9 // Nokia Corporation - initial contribution.
    10 //
    11 // Contributors:
    12 //
    13 // Description:
    14 // omxoutputport.cpp
    15 // 
    16 //
    17 
    18 #include <omxprocessingunit.h>
    19 #include <mdf/mdfpuconfig.h>
    20 #include "omxcomponentbody.h"
    21 #include "omxoutputportbody.h"
    22 
    23 COmxOutputPort::CBody* COmxOutputPort::CBody::NewL(TInt aIndex, COmxProcessingUnit* aComponent, COmxOutputPort* aParent)
    24 	{
    25 	return new (ELeave) CBody(aIndex, aComponent, aParent);	
    26 	}  
    27 
    28 COmxOutputPort::CBody::CBody(TInt aIndex, COmxProcessingUnit* aComponent, COmxOutputPort* aParent) :
    29 	iPortIndex(aIndex),	
    30 	iComponent(aComponent),
    31 	iParent(aParent)
    32 	{
    33 	}
    34 
    35 void COmxOutputPort::CBody::MopSetObserver(const MMdfOutputPortObserver& aOutputPortObserver) 
    36 	{
    37 	iObserver = const_cast<MMdfOutputPortObserver*>(&aOutputPortObserver);
    38 	}
    39 
    40 void COmxOutputPort::CBody::MipoWriteDataComplete(const MMdfInputPort* /*aInputPort*/,
    41 		CMMFBuffer* aBuffer, TInt /*aErrorCode*/)
    42 	{
    43 	// the parent class read must be called in case it has been overridden in a derived class
    44 	iParent->MopReadData(*aBuffer);
    45 	}
    46 
    47 void COmxOutputPort::CBody::MipoDisconnectTunnelComplete(const MMdfInputPort* /*aInputPort*/,
    48 		TInt /*aErrorCode*/)
    49 	{
    50 	}
    51 	
    52 void COmxOutputPort::CBody::MipoRestartTunnelComplete(const MMdfInputPort* /*aInputPort*/,
    53 		TInt /*aErrorCode*/)
    54 	{	
    55 	}
    56 
    57 TInt COmxOutputPort::CBody::FillBufferDone(OMX_HANDLETYPE /*aComponent*/, CMMFBuffer* aBuffer)
    58 	{
    59 	__ASSERT_ALWAYS(iObserver, User::Panic(_L("OmxOutputPort"), EObserverNotSet));
    60 
    61 	if (iPortConnectedTo)
    62 		{
    63 		iPortConnectedTo->MipWriteData(*aBuffer);
    64 		}
    65 	else
    66 		{
    67 		if (iObserver)
    68 			{
    69 			iObserver->MopoReadDataComplete(iParent, aBuffer, KErrNone);				
    70 			}
    71 		}
    72 	return KErrNone;
    73 	}
    74 
    75 TInt COmxOutputPort::CBody::MopConfigure(const TPuConfig&  /*aConfig*/)
    76 	{
    77 	return KErrNotSupported;	
    78 	}
    79 	
    80 TInt COmxOutputPort::CBody::MopGetConfig(TPuConfig& /*aConfig*/)
    81 	{
    82 	return KErrNotSupported;	
    83 	}		
    84 
    85 void COmxOutputPort::CBody::MopInitialize()	
    86  	{
    87  	if (iPortConnectedTo != NULL)
    88  		{
    89  		iPortConnectedTo->MipSetObserver(*iParent);
    90  		}
    91  	}
    92 	
    93 CMMFBuffer* COmxOutputPort::CBody::MopCreateBuffer(TInt aBufferSize)
    94 	{
    95 	CMMFBuffer* buffer = NULL;
    96 	TInt err = KErrNone;
    97 	TRAP(err, buffer = Component()->OmxAllocateBufferL(iPortIndex, aBufferSize));	
    98 	return buffer;
    99 	}
   100 
   101 TInt COmxOutputPort::CBody::MopUseBuffer(CMMFBuffer& aBuffer)
   102 	{
   103 	if (iPortConnectedTo)
   104 		{
   105 		iPortConnectedTo->MipUseBuffer(aBuffer);
   106 		}
   107 
   108 	return Component()->OmxUseBuffer(&aBuffer, iPortIndex);	
   109 	}
   110 	
   111 TInt COmxOutputPort::CBody::MopFreeBuffer(CMMFBuffer* aBuffer)
   112 	{
   113 	return Component()->OmxFreeBuffer(aBuffer);	
   114 	}
   115 	 
   116 TInt COmxOutputPort::CBody::MopTunnelRequest(const MMdfInputPort& aInputPortToBeConnectedTo,
   117 		TTunnelFlags& aTunnelFlags, TSupplierType& aSupplierType) 
   118 	{
   119 	if ((Component()->State()!=EProcessingUnitLoaded) && (!iStopped))
   120 		{
   121 		// invalid state
   122 		return EInvalidState;
   123 		}
   124 	
   125 	if (iPortConnectedTo)
   126 		{
   127 		// the port is already connected, return an error
   128 		return EPortAlreadyTunnelled;
   129 		}
   130 	aTunnelFlags = EBufferReadOnly;
   131 	aSupplierType = EBufferSupplyOutput;
   132 	iPortConnectedTo = const_cast<MMdfInputPort*>(&aInputPortToBeConnectedTo);
   133 
   134 	
   135 	return KErrNone;
   136 	}
   137 
   138 void COmxOutputPort::CBody::MopReadData(CMMFBuffer& aBuffer)
   139 	{
   140 	Component()->OmxFillThisBuffer(&aBuffer, this);	
   141 	}
   142 
   143 void COmxOutputPort::CBody::MopDisconnectTunnel()
   144 	{
   145 	if(iObserver) 
   146 		{
   147 		iObserver->MopoDisconnectTunnelComplete(iParent, KErrNone);		
   148 		}
   149 	}
   150 
   151 void COmxOutputPort::CBody::MopRestartTunnel()
   152 	{
   153 	}
   154 
   155 TBool COmxOutputPort::CBody::MopIsTunnelled() const
   156 	{
   157 	if (!iPortConnectedTo)
   158 		{
   159 		return EFalse;
   160 		}		
   161 	return ETrue;
   162 	}
   163 
   164 TInt COmxOutputPort::CBody::MopIndex() const
   165 	{
   166 	return iPortIndex;
   167 	}
   168 
   169 TUint32 COmxOutputPort::CBody::MopBufferSize() const
   170 	{
   171 	OMX_PARAM_PORTDEFINITIONTYPE portInfo;
   172 	portInfo.nPortIndex = 1;
   173 	Component()->OmxGetParameter(OMX_IndexParamPortDefinition, &portInfo);	
   174 	return portInfo.nBufferSize;
   175 	}
   176 
   177 TInt COmxOutputPort::CBody::MopCreateCustomInterface(TUid /*aUid*/)
   178 	{
   179 	return KErrNotSupported;
   180 	}
   181 
   182 TAny* COmxOutputPort::CBody::MopCustomInterface(TUid /*aUid*/)
   183 	{
   184 	return NULL;	
   185 	}
   186 
   187 MMdfOutputPortObserver* COmxOutputPort::CBody::Observer() const
   188 	{
   189 	return iObserver;
   190 	}
   191 
   192 COmxProcessingUnit* COmxOutputPort::CBody::Component() const
   193 	{
   194 	return iComponent;
   195 	}