omxilvideocomps/omxil3gpdemuxer/src/comxil3gpdemuxeraudiooutputport.cpp
changeset 0 5d29cba61097
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/omxilvideocomps/omxil3gpdemuxer/src/comxil3gpdemuxeraudiooutputport.cpp	Fri Oct 08 22:09:17 2010 +0100
@@ -0,0 +1,201 @@
+/*
+* Copyright (c) 2008 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:
+*
+*/
+
+
+/**
+@file
+@internalComponent
+*/
+
+#include "log.h"
+#include "comxil3gpdemuxeraudiooutputport.h"
+#include "comxil3gpdemuxerprocessingfunction.h"
+#include "taudioformat.h"
+
+// TODO: Possibly add other mime types, for now only AAC handled
+_LIT8(KMimeTypeAudioAac, "audio/aac");
+_LIT(K3GPDemuxerAudioPortPanic, "COmxIL3GPDemuxerVideoOutputPort");
+
+
+COmxIL3GPDemuxerAudioOutputPort* COmxIL3GPDemuxerAudioOutputPort::NewL(const TOmxILCommonPortData& aCommonPortData,
+                                                                       COmxIL3GPDemuxerProcessingFunction& aProcessingFunction)
+	{
+	DEBUG_PRINTF(_L8("COmxIL3GPDemuxerAudioOutputPort::NewL"));
+	// TODO this array must be left empty, to be removed from the audio port constructor
+
+	COmxIL3GPDemuxerAudioOutputPort* self = new(ELeave) COmxIL3GPDemuxerAudioOutputPort(aProcessingFunction);
+	CleanupStack::PushL(self);
+	self->ConstructL(aCommonPortData);
+	CleanupStack::Pop(self);
+	return self;
+	}
+
+void COmxIL3GPDemuxerAudioOutputPort::ConstructL(const TOmxILCommonPortData& aCommonPortData)
+	{
+    RArray<OMX_AUDIO_CODINGTYPE> supportedCodings;
+    CleanupClosePushL(supportedCodings);
+    supportedCodings.AppendL(OMX_AUDIO_CodingAAC);
+    COmxILAudioPort::ConstructL(aCommonPortData, supportedCodings);
+    CleanupStack::PopAndDestroy(&supportedCodings);
+    
+    OMX_PARAM_PORTDEFINITIONTYPE& paramPortDefinition=GetParamPortDefinition();
+	// We have to finish with iParamPortDefinition
+    paramPortDefinition.eDomain = OMX_PortDomainAudio;
+    paramPortDefinition.format.audio.pNativeRender = 0;
+
+	// TODO: Possible add in the future other mime types that can be handled by
+	// this audio port... for now only AAC Check
+	// COmxILAudioPort::iParamAudioPortFormat.nIndex and use
+	// COmxILAudioPort::iSupportedAudioFormats[iParamAudioPortFormat.nIndex]
+
+	iMimeTypeBuf.CreateL(KMimeTypeAudioAac(), KMimeTypeAudioAac().Length() + 1);
+
+	TUint8* pTUint = const_cast<TUint8*>(iMimeTypeBuf.PtrZ());
+	paramPortDefinition.format.audio.cMIMEType = reinterpret_cast<OMX_STRING>(pTUint);
+
+	paramPortDefinition.format.audio.bFlagErrorConcealment = OMX_FALSE;
+	paramPortDefinition.format.audio.eEncoding = OMX_AUDIO_CodingAAC;
+	}
+
+COmxIL3GPDemuxerAudioOutputPort::COmxIL3GPDemuxerAudioOutputPort(COmxIL3GPDemuxerProcessingFunction& aProcessingFunction) 
+:	iProcessingFunction(&aProcessingFunction)
+	{
+	DEBUG_PRINTF(_L8("COmxIL3GPDemuxerAudioOutputPort::COmxIL3GPDemuxerAudioOutputPort"));
+	}
+
+COmxIL3GPDemuxerAudioOutputPort::~COmxIL3GPDemuxerAudioOutputPort()
+	{
+	DEBUG_PRINTF(_L8("COmxIL3GPDemuxerAudioOutputPort::~COmxIL3GPDemuxerAudioOutputPort"));
+	iMimeTypeBuf.Close();
+	}
+
+OMX_ERRORTYPE COmxIL3GPDemuxerAudioOutputPort::GetLocalOmxParamIndexes(RArray<TUint>& aIndexArray) const
+	{
+	DEBUG_PRINTF(_L8("COmxIL3GPDemuxerAudioOutputPort::GetLocalOmxParamIndexes"));
+	OMX_ERRORTYPE omxRetValue = COmxILAudioPort::GetLocalOmxParamIndexes(aIndexArray);		
+	if (omxRetValue != OMX_ErrorNone)
+		{
+		return omxRetValue;
+		}
+		
+	TInt err = aIndexArray.InsertInOrder(OMX_IndexParamNumAvailableStreams);
+	// Note that index duplication is OK.
+	if (err == KErrNone || err == KErrAlreadyExists)
+		{
+		err = aIndexArray.InsertInOrder(OMX_IndexParamActiveStream);
+		}
+				
+	if (err != KErrNone && err != KErrAlreadyExists)
+		{
+		return OMX_ErrorInsufficientResources;
+		}
+
+	return OMX_ErrorNone;
+	}
+
+OMX_ERRORTYPE COmxIL3GPDemuxerAudioOutputPort::GetLocalOmxConfigIndexes(RArray<TUint>& aIndexArray) const
+	{
+	return COmxILAudioPort::GetLocalOmxConfigIndexes(aIndexArray);
+	}
+
+OMX_ERRORTYPE COmxIL3GPDemuxerAudioOutputPort::GetParameter(OMX_INDEXTYPE aParamIndex,
+                                                            TAny* apComponentParameterStructure) const
+	{
+	DEBUG_PRINTF(_L8("COmxIL3GPDemuxerAudioOutputPort::GetParameter"));
+	switch(aParamIndex)
+		{		
+		case OMX_IndexParamNumAvailableStreams:
+			{
+			OMX_PARAM_U32TYPE* u32Type = reinterpret_cast<OMX_PARAM_U32TYPE*>(apComponentParameterStructure);
+			u32Type->nU32 = iProcessingFunction->NumAvailableStreams(COmxIL3GPDemuxer::EPortIndexAudioOutput);
+			return OMX_ErrorNone;
+			}
+
+		case OMX_IndexParamActiveStream:
+			{
+			OMX_PARAM_U32TYPE* u32Type = reinterpret_cast<OMX_PARAM_U32TYPE*>(apComponentParameterStructure);
+			u32Type->nU32 = iProcessingFunction->ActiveStream(COmxIL3GPDemuxer::EPortIndexAudioOutput);
+			return OMX_ErrorNone;
+			}
+
+		default:
+			{
+			return COmxILAudioPort::GetParameter(aParamIndex, apComponentParameterStructure);
+			}
+		}
+	}
+
+OMX_ERRORTYPE COmxIL3GPDemuxerAudioOutputPort::SetParameter(OMX_INDEXTYPE aParamIndex,
+                                                            const TAny* apComponentParameterStructure,
+                                                            TBool& aUpdateProcessingFunction)
+	{
+	DEBUG_PRINTF(_L8("COmxIL3GPDemuxerAudioOutputPort::SetParameter"));
+	switch(aParamIndex)
+		{		
+		case OMX_IndexParamActiveStream:
+			{
+			const OMX_PARAM_U32TYPE* u32Type = reinterpret_cast<const OMX_PARAM_U32TYPE*>(apComponentParameterStructure);
+			return iProcessingFunction->SetActiveStream(COmxIL3GPDemuxer::EPortIndexAudioOutput, u32Type->nU32);
+			}
+
+		default:
+			{
+			return COmxILAudioPort::SetParameter(aParamIndex, apComponentParameterStructure, aUpdateProcessingFunction);
+			}
+		}
+	}
+
+OMX_ERRORTYPE COmxIL3GPDemuxerAudioOutputPort::SetFormatInPortDefinition(
+	const OMX_PARAM_PORTDEFINITIONTYPE& aPortDefinition,
+	TBool& /*aUpdateProcessingFunction*/)
+	{
+	DEBUG_PRINTF(_L8("COmxIL3GPDemuxerAudioOutputPort::SetFormatInPortDefinition"));
+
+	if (aPortDefinition.nBufferCountActual > KMaxAudioBuffers)
+		{
+		return OMX_ErrorBadParameter;
+		}
+
+	GetParamPortDefinition().format.audio = aPortDefinition.format.audio;
+	
+	return OMX_ErrorNone;
+	}
+
+TBool COmxIL3GPDemuxerAudioOutputPort::IsTunnelledPortCompatible(const OMX_PARAM_PORTDEFINITIONTYPE& /*aPortDefinition*/) const
+	{
+	DEBUG_PRINTF(_L8("COmxIL3GPDemuxerAudioOutputPort::IsTunnelledPortCompatible"));
+
+	// This function only gets called on input ports, so panic if this is ever called
+	User::Panic(K3GPDemuxerAudioPortPanic, KErrGeneral);
+	return EFalse; // to keep compiler happy
+	}
+
+void COmxIL3GPDemuxerAudioOutputPort::FormatDetected(const TAudioFormat& aFormat)
+	{
+	GetParamPortDefinition().format.audio.eEncoding = aFormat.iCoding;
+	}
+
+OMX_AUDIO_CODINGTYPE COmxIL3GPDemuxerAudioOutputPort::AudioFormat()
+	{
+	return GetParamPortDefinition().format.audio.eEncoding;
+	}
+
+/** Returns the number of buffers configured on this port. */
+TInt COmxIL3GPDemuxerAudioOutputPort::BufferCount() const
+	{
+	return GetParamPortDefinition().nBufferCountActual;
+	}