diff -r 000000000000 -r 5d29cba61097 omxilvideocomps/omxil3gpdemuxer/src/comxil3gpdemuxeraudiooutputport.cpp --- /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 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(iMimeTypeBuf.PtrZ()); + paramPortDefinition.format.audio.cMIMEType = reinterpret_cast(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& 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& 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(apComponentParameterStructure); + u32Type->nU32 = iProcessingFunction->NumAvailableStreams(COmxIL3GPDemuxer::EPortIndexAudioOutput); + return OMX_ErrorNone; + } + + case OMX_IndexParamActiveStream: + { + OMX_PARAM_U32TYPE* u32Type = reinterpret_cast(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(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; + }