--- a/videoeditorengine/audioeditorengine/src/ProcDecoder.cpp Fri Jan 29 14:08:33 2010 +0200
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,950 +0,0 @@
-/*
-* Copyright (c) 2010 Ixonos Plc.
-* All rights reserved.
-* This component and the accompanying materials are made available
-* under the terms of the "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:
-* Ixonos Plc
-*
-* Description:
-*
-*/
-
-
-
-#include "ProcDecoder.h"
-#include "audconstants.h"
-#include <MmfDatabuffer.h>
-#include <mmfcontrollerpluginresolver.h>
-#include <mmf/plugin/mmfCodecImplementationUIDs.hrh>
-#include <MMFCodec.h>
-
-
-// CONSTANTS
-
-
-
-
-
-// MACROS
-
-// Debug print macro
-#if defined _DEBUG
-#include <e32svr.h>
-#define PRINT(x) RDebug::Print x;
-#else
-#define PRINT(x)
-#endif
-
-
-CProcDecoder* CProcDecoder::NewL()
-
- {
- CProcDecoder* self = NewLC();
- CleanupStack::Pop(self);
- return self;
-
- }
-
-
-CProcDecoder* CProcDecoder::NewLC()
-
- {
-
- CProcDecoder* self = new (ELeave) CProcDecoder();
- CleanupStack::PushL(self);
- self->ConstructL();
- return self;
-
- }
-
-CProcDecoder::~CProcDecoder()
- {
-
- delete iSourceInputBuffer;
-
- // Input buffer for encoder (alternative output buffer for decoder).
- delete iDestInputBuffer;
-
- // Codec used in decoding input audio to PCM16
- delete iSourceCodec;
-
- delete iSampleRateChannelBuffer;
-
- delete iRateConverter;
-
- }
-
-TBool CProcDecoder::InitL(TAudFileProperties aProperties, TInt aTargetSamplingRate, TChannelMode aChannelMode)
- {
- PRINT((_L("CProcDecoder::InitL() in")));
-
- if (aTargetSamplingRate == 0)
- {
-
- // we are just adding a clip now, check if the source codec is available
- iProperties = aProperties;
- SetSourceCodecL();
-
- return ETrue;
- }
-
-
- iDecimFactor = 0; // by default
-
- iDoDecoding = ETrue;
-
- if (aProperties.iAudioType == EAudWAV)
- {
- // if input is PCM, no decoding is required, but possibly sample rate conversion
- iDoDecoding = EFalse;
- }
-
-
-
- // set output params
- iToSampleRate = aTargetSamplingRate;
- iToChannels = 1;
-
- if (aChannelMode == EAudStereo)
- {
- iToChannels = 2;
- }
-
-
- //set input params
- iProperties = aProperties;
-
- iFromSampleRate = iProperties.iSamplingRate;
-
- iFromChannels = 1;
-
- if (aProperties.iChannelMode == EAudStereo)
- {
- iFromChannels = 2;
- }
-
-
- iDoSampleRateChannelConversion = EFalse;
- if (iFromSampleRate != iToSampleRate || iProperties.iChannelMode != aChannelMode)
- {
- // sample rate or channel conversion is needed
- iDoSampleRateChannelConversion = ETrue;
- }
-
-
- PRINT((_L("CProcDecoder::PrepareConverterL() in")));
-
- TInt destInputBufferSize = 0;
- TInt sourceInputBufferSize = 0;
-
- // buffer sizes for input and output
- if ( iProperties.iAudioType == EAudAMR )
- {
- destInputBufferSize = KAedSizeAMRBuffer;
- sourceInputBufferSize = KAedMaxAMRFrameLength;
-
- }
- else if ( iProperties.iAudioType == EAudAMRWB )
- {
- destInputBufferSize = KAedSizeAWBBuffer;
- sourceInputBufferSize = KAedMaxAWBFrameLength;
-
- }
- else if (iProperties.iAudioType == EAudAAC_MPEG4 &&
- iProperties.iAudioTypeExtension == EAudExtensionTypeNoExtension)
- {
- if ( aProperties.iChannelMode == EAudSingleChannel )
- {
- destInputBufferSize = KAedSizeAACBuffer;
- sourceInputBufferSize = KAedMaxAACFrameLengthPerChannel;
- }
- else
- {
- destInputBufferSize = KAedSizeAACStereoBuffer;
- sourceInputBufferSize = 2* KAedMaxAACFrameLengthPerChannel;
- }
-
- }
- else if (iProperties.iAudioType == EAudAAC_MPEG4 &&
- iProperties.iAudioTypeExtension != EAudExtensionTypeNoExtension)
- {
- if ( iProperties.iAudioTypeExtension == EAudExtensionTypeEnhancedAACPlusParametricStereo )
- {
- // output is parametric stereo (mono channel, but decoded to stereo)
- destInputBufferSize = KAedSizeAACStereoBuffer*2; // 2 for eAAC+
- sourceInputBufferSize = KAedMaxAACFrameLengthPerChannel;
- }
- else
- {
- // output is normal stereo
- destInputBufferSize = KAedSizeAACBuffer*2; // 2 for eAAC+
- sourceInputBufferSize = 2* KAedMaxAACFrameLengthPerChannel;
- }
-
-
- }
-
- else if ( iProperties.iAudioType == EAudMP3 )
- {
- // mp3 can be directly decoded to mono if necessary
- if (iToChannels == 1)
- {
- iFromChannels = 1;
- }
-
- // check if decimation would be useful
- if (iFromSampleRate == iToSampleRate * 4)
- {
- iFromSampleRate /= 4;
- iDecimFactor = 4;
- }
-
- if (iFromSampleRate == iToSampleRate * 2)
- {
- iFromSampleRate /= 2;
- iDecimFactor = 2;
- }
-
- if ((iToSampleRate == 8000) && ((iFromSampleRate == 48000) || (iFromSampleRate == 44100)))
- {
- iFromSampleRate /= 2;
- iDecimFactor = 2;
- }
-
- const TReal KMP3FrameDurationSec = 0.026;
-
- destInputBufferSize = (iFromSampleRate * KMP3FrameDurationSec + 1);
- destInputBufferSize *= 2; //16 bit samples
- if (iFromChannels == 2)
- {
- destInputBufferSize *= 2; // stereo
- }
-
- sourceInputBufferSize = KAedMaxMP3FrameLength;
- }
-
- else if (iProperties.iAudioType == EAudWAV)
- {
- // frame duration in WAV case is always 20 ms, that is 50 frames per sec
- const TInt KNumberOfFramesInSecond = 50;
-
- destInputBufferSize = iFromSampleRate / KNumberOfFramesInSecond; // Number of samples
- destInputBufferSize *= iFromChannels;
- if ((destInputBufferSize % 2) != 0) destInputBufferSize++; // Must be even
- destInputBufferSize *= 2; // 16-bit samples
-
- sourceInputBufferSize = iProperties.iFrameLen;
-
- TInt sourceBufferSizeAfterExpansion = sourceInputBufferSize;
- if (iProperties.iNumberOfBitsPerSample == 8)
- {
- // 8-bit samples are expanded to 16-bit so twice as big buffer is needed
- sourceBufferSizeAfterExpansion *= 2;
- }
-
- if (sourceBufferSizeAfterExpansion > destInputBufferSize)
- {
- // Make sure there's no overflow
- destInputBufferSize = sourceBufferSizeAfterExpansion;
- }
- }
-
- PRINT((_L("CProcDecoder::InitL() source size: %d, dest size %d"), sourceInputBufferSize, destInputBufferSize));
-
-
- if ( iSourceInputBuffer )
- {
- delete iSourceInputBuffer;
- iSourceInputBuffer = NULL;
- }
- // create buffer for input data
- iSourceInputBuffer = CMMFDataBuffer::NewL(sourceInputBufferSize);
-
-
- if ( iDestInputBuffer )
- {
- delete iDestInputBuffer;
- iDestInputBuffer = NULL;
- }
-
-
- TInt errC = KErrNone;
- if (iDoDecoding)
- {
- SetSourceCodecL();
-
- // create buffer for output data if necessary
- iDestInputBuffer = CMMFDataBuffer::NewL( destInputBufferSize);
- }
-
-
-
- TInt err = KErrNone;
-
- if (iProperties.iAudioType == EAudAAC_MPEG4)
- {
- // configure AAC plus decoder, used also for AAC
- TRAP( err, ConfigureAACPlusDecoderL());
-
- }
-
- else if ( iProperties.iAudioType == EAudMP3 )
- {
- // configure mp3 decoder
- TRAP( err, ConfigureMP3DecoderL());
-
- }
- if (err != KErrNone || errC != KErrNone)
- {
- User::Leave(KErrNotSupported);
- }
-
- if ( iDoSampleRateChannelConversion )
- {
- if (iRateConverter)
- {
- delete iRateConverter;
- iRateConverter = NULL;
- }
-
- iRateConverter = CRateConverter::NewL(iFromSampleRate, iToSampleRate, iFromChannels, iToChannels);
-
- if( !iRateConverter->InitL(destInputBufferSize / (2 * iFromChannels)) ) // 16-bit samples
- {
- User::Leave(KErrNotSupported);
- }
-
- TInt sampleRateBufferSize = iRateConverter->GetOutputBufferSize() * 2 * iToChannels; // 16-bit samples
-
- PRINT((_L("CProcDecoder::InitL() sample rate buffer size %d"), sampleRateBufferSize));
-
- if ( iSampleRateChannelBuffer )
- {
- delete iSampleRateChannelBuffer;
- iSampleRateChannelBuffer = NULL;
- }
-
- // Buffer for sample rate conversion output
- iSampleRateChannelBuffer = CMMFDataBuffer::NewL(sampleRateBufferSize);
- }
-
-
- iReady = ETrue;
- PRINT((_L("CProcDecoder::InitL() out")));
-
-
- return ETrue;
- }
-
-TBool CProcDecoder::FillDecBufferL(const HBufC8* aEncFrame, HBufC8*& aDecBuffer)
- {
- PRINT((_L("CProcDecoder::FillDecBufferL() in")));
-
- iDecBuffer = 0;
- if (iProperties.iAudioType == EAudWAV && !iDoSampleRateChannelConversion)
- {
-
- // if we don't have to do anything for input data ->
- aDecBuffer = HBufC8::NewL(aEncFrame->Size());
- aDecBuffer->Des().Append(*aEncFrame);
- PRINT((_L("CProcDecoder::FillDecBufferL() out from Wav branch with ETrue")));
- return ETrue;
-
- }
-
-
- if (!iReady)
- {
- User::Leave(KErrNotReady);
- }
-
- if ( aEncFrame == 0 || !aEncFrame->Length() )
- {
- // no data in input buffer
- PRINT((_L("CProcDecoder::FillDecBufferL() no input data, out with EFalse")));
- return EFalse;
- }
-
- if ( (TInt)(aEncFrame->Length() + iSourceInputBuffer->Position() ) > iSourceInputBuffer->Data().MaxLength() )
- {
-
- ReAllocBufferL( iSourceInputBuffer, aEncFrame->Length() + iSourceInputBuffer->Position() );
- }
-
- iSourceInputBuffer->Data().SetLength( 0 );
- iSourceInputBuffer->SetPosition( 0 );
-
- iSourceInputBuffer->Data().Append( *aEncFrame );
- iSourceInputBuffer->Data().SetLength( aEncFrame->Length() );
-
- PRINT((_L("CProcDecoder::FillDecBufferL(), iSourceInputBuffer length = %d"),aEncFrame->Length()));
- if (iDoDecoding)
- {
- iDestInputBuffer->Data().SetLength(0);
- iDestInputBuffer->SetPosition(0);
-
- }
-
- if ( iDoSampleRateChannelConversion )
- {
- iSampleRateChannelBuffer->Data().SetLength(0);
- iSampleRateChannelBuffer->SetPosition(0);
- }
-
-
- FeedCodecL( iSourceCodec, iSourceInputBuffer, iDestInputBuffer);
-
- if ( aDecBuffer )
- {
- // in case of EDstNotFilled from decoder, you may end up looping and to avoid memory leaks, you need to
- // delete the previous allocated buffer. Alternative might be to not allocate a new one in this case.
- delete aDecBuffer;
- aDecBuffer = NULL;
- }
- aDecBuffer = iDecBuffer;
-
- if (iDoDecoding)
- {
- iDestInputBuffer->Data().SetLength(0);
- iDestInputBuffer->SetPosition(0);
-
- }
-
- if (iDecBuffer != 0 && iDecBuffer->Size() > 0)
- {
- PRINT((_L("CProcDecoder::FillDecBufferL() out with ETrue")));
- return ETrue;
-
- }
-
- PRINT((_L("CProcDecoder::FillDecBufferL() out with EFalse")));
- return EFalse;
-
- }
-
-
-void CProcDecoder::ConstructL()
- {
-
-
-
- }
-
-CProcDecoder::CProcDecoder()
- {
-
- }
-
-
-
-void CProcDecoder::ConfigureAACPlusDecoderL()
- {
-
-
- RArray<TInt> config;
-
- if (iProperties.iAudioTypeExtension == EAudExtensionTypeEnhancedAACPlusParametricStereo)
- {
-
- // for sample rate and channel converter, the output from parametric stereo
- // is stereo, only the AAC part is incoded as mono
- iFromChannels = 2;
- }
-
-
- config.Append( iFromSampleRate);
- config.Append( iFromChannels );
-
-
- if (iProperties.iAACObjectType == EAudAACObjectTypeLC)
- {
- config.Append( 1 ); // {1 - LC, 3 - LTP}
- }
- else if (iProperties.iAACObjectType == EAudAACObjectTypeLTP)
- {
- config.Append( 3 ); // {1 - LC, 3 - LTP}
- }
- else
- {
- User::Leave(KErrNotSupported);
- }
-
- config.Append( 8192 ); //Size of PCM Samples generated by decoder
-
- config.Append( 1024 ); //Number of PCM Samples generated by decoder per frame
-
- config.Append( iFromSampleRate); //Sampling freq of AAC Code decoder
-
- config.Append( 0 ); // not used ??
-
-
- config.Append( 0 ); // down sampled mode
-
- config.Append( 16 ); // Sample resolution: 16-bit resolution
-
-
-
- // NOTE!: for some reason, the sample rate of the output from AACPlus decoder used
- // to be a half of the proper output sampling rate.
- // eAAC+ data consists of AAC band + enhancement band. The enhancement band is not included
- // in the rate indicated in the header (iFromSampleRate)
- // There was a workaround for the
- // earlier problem not to increase the sampling rate.
- // Now, with 2006 releases it seems to work, and the sampling rate need to be doubled
- // for the sampling rate converter.
-
- if (iProperties.iAudioTypeExtension == EAudExtensionTypeEnhancedAACPlus)
- {
- iFromSampleRate *= 2; // for sample rate converter ->
- config.Append(iFromSampleRate);// Output sampling frequency
- config.Append( 5 ); //Type of extended object (5=SBR/HE AAC profile; 6=PS is present)
-
- }
- else if (iProperties.iAudioTypeExtension == EAudExtensionTypeEnhancedAACPlusParametricStereo)
- {
- iFromSampleRate *= 2; // for sample rate converter ->
- config.Append(iFromSampleRate);// Output sampling frequency
- config.Append( 6 ); //Type of extended object (5=SBR/HE AAC profile; 6=PS is present)
- }
- else
- {
- // AAC, in&out samplerates are equal, and extended object type is 0
- config.Append(iFromSampleRate);// Output sampling frequency
- config.Append( 0 );
-
- }
-
-
- TUid uid ={KUidMmfCodecAudioSettings}; // Use Uid reserved for codec configurations
- TRAPD( err, iSourceCodec->ConfigureL( uid, reinterpret_cast<TDesC8&>(config)));
-
- if ( err != KErrNone )
- {
- PRINT((_L("CProcDecoder::PrepareConverterL() error, Source codec config failed")));
- config.Close();
- User::Leave( err );
- }
- config.Close();
-
- }
-
-
-void CProcDecoder::ConfigureMP3DecoderL()
- {
-
-
- RArray<TInt> config;
-
- TInt stereoToMono = 0;
- if (iToChannels == 1 || iFromChannels == 1)
- {
- stereoToMono = 1;
- }
-
- config.Append( stereoToMono); // stereo to mono
- config.Append( 0 ); //iLeftRight??
- config.Append( iDecimFactor ); //iDecimFactor
- config.Append( 0 ); //iConcealment
- config.Append( 0 ); //iSampleLength??
- config.Append( 0 ); //iSamplingFrequency
-
- TUid uid ={KUidMmfCodecAudioSettings}; // Use Uid reserved for codec configurations
- TRAPD( err, iSourceCodec->ConfigureL( uid, reinterpret_cast<TDesC8&>(config)));
-
- if ( err != KErrNone )
- {
- PRINT((_L("CProcDecoder::PrepareConverterL() error, Source codec config failed")));
- config.Close();
- User::Leave( err );
- }
- config.Close();
- }
-
-
-void CProcDecoder::ReAllocBufferL( CMMFDataBuffer* aBuffer, TInt aNewMaxSize )
- {
- if ( aBuffer->Data().Length() )
- {
- TInt position = aBuffer->Position();
- TInt length = aBuffer->Data().Length();
- HBufC8* oldData = aBuffer->Data().AllocL();
- CleanupStack::PushL( oldData );
- ((CMMFDescriptorBuffer*)aBuffer)->ReAllocBufferL( aNewMaxSize );
- aBuffer->Data().Copy( *oldData );
- CleanupStack::PopAndDestroy( oldData );
- aBuffer->Data().SetLength( length );
- aBuffer->SetPosition( position );
- }
- else
- {
- ((CMMFDescriptorBuffer*)aBuffer)->ReAllocBufferL( aNewMaxSize );
- }
- }
-
-void CProcDecoder::FeedCodecL( CMMFCodec* aCodec, CMMFDataBuffer* aSourceBuffer, CMMFDataBuffer* aDestBuffer )
- {
- PRINT((_L("CProcDecoder::FeedCodecL() in")));
- TBool completed = EFalse;
- TCodecProcessResult result;
-
- while ( !completed )
- {
-
- if (iDoDecoding)
- {
- // decode and check the result
- result = DecodeL(aCodec, aSourceBuffer, aDestBuffer);
- }
- else
- {
-
- // no need for decoding, just perform sample rate and channel conversion
- result.iStatus = TCodecProcessResult::EProcessComplete;
- }
-
-
- switch ( result.iStatus )
- {
- case TCodecProcessResult::EProcessIncomplete:
- // Not all data from input was consumed (DecodeL updated buffer members), but output was generated
-
- if ( iDoSampleRateChannelConversion )
- {
- if ( !iRateConverter )
- {
- PRINT((_L("CProcDecoder::FeedCodecL() error, no rate converter")));
- User::Leave( KErrNotFound );
- }
-
- // Convert buffer size in bytes
- TUint convertBufferSize = aDestBuffer->Data().Length();
-
- // Number of samples in the buffer
- TUint inputSamples = convertBufferSize / (2 * iFromChannels); // 16-bit samples
-
- PRINT((_L("CProcDecoder::FeedCodecL() converting %d samples"), inputSamples));
-
- if ( convertBufferSize > ( iDestInputBuffer->Data().MaxLength() - iDestInputBuffer->Position() ) )
- {
- ReAllocBufferL( iDestInputBuffer, convertBufferSize + iDestInputBuffer->Position() );
- }
-
- TInt outputSamples = iRateConverter->ConvertBufferL( (TInt16*) aDestBuffer->Data().Ptr(),
- (TInt16*) iSampleRateChannelBuffer->Data().Ptr(), inputSamples );
-
- iSampleRateChannelBuffer->Data().SetLength( outputSamples * 2 * iToChannels );
-
- UpdateOutputBufferL(iSampleRateChannelBuffer);
-
- }
- else
- {
- if (iDoDecoding)
- {
-
- UpdateOutputBufferL(aDestBuffer);
- }
- }
-
- break;
-
- case TCodecProcessResult::EProcessComplete:
- // all data from input was used and output was generated
- if ( iDoSampleRateChannelConversion )
- {
- if ( !iRateConverter )
- {
- PRINT((_L("CProcDecoder::FeedCodecL() error, no rate converter")));
- User::Leave( KErrNotFound );
- }
-
-
- CMMFDataBuffer* src = 0;
-
- if (!iDoDecoding)
- {
-
- // if decoding was not needed,
- // the input data for SR converter is in aSourceBuffer
- src = aSourceBuffer;
- }
- else
- {
- // if decoding was needed,
- // the input data for SR converter is in iDestBuffer
-
- src = iDestInputBuffer;
- }
-
- // Convert buffer size in bytes
- TUint convertBufferSize = src->Data().Length();
-
- // Number of samples in the buffer
- TUint inputSamples = convertBufferSize / (2 * iFromChannels); // 16-bit samples
-
- PRINT((_L("CProcDecoder::FeedCodecL() converting %d samples"), inputSamples));
-
- if ( convertBufferSize > ( src->Data().MaxLength() - src->Position() ) )
- {
- ReAllocBufferL( src, convertBufferSize + src->Position() );
- }
-
- TInt outputSamples = iRateConverter->ConvertBufferL( (TInt16*) src->Data().Ptr(),
- (TInt16*) iSampleRateChannelBuffer->Data().Ptr(), inputSamples );
-
- iSampleRateChannelBuffer->Data().SetLength( outputSamples * 2 * iToChannels );
-
- UpdateOutputBufferL(iSampleRateChannelBuffer);
-
- }
- else
- {
- if (iDoDecoding)
- {
- UpdateOutputBufferL(aDestBuffer);
- }
-
- }
-
- completed = ETrue;
- break;
-
- case TCodecProcessResult::EDstNotFilled:
- // need more input data, can't fill the output yet; put it back to the empty queue
- completed = ETrue;
-
- break;
-
- default:
- // EEndOfData, EProcessError, EProcessIncompleteRepositionRequest, EProcessCompleteRepositionRequest
- User::Leave( KErrUnknown );
- }
-
- }
-
-
- PRINT((_L("CProcDecoder::FeedCodecL() out")));
- }
-
-TCodecProcessResult CProcDecoder::DecodeL( CMMFCodec* aCodec, CMMFDataBuffer* aInBuffer, CMMFDataBuffer* aOutBuffer)
- {
- PRINT((_L("CProcDecoder::DecodeL() in, input pos: %d, length: %d"), aInBuffer->Position(), aInBuffer->Data().Length() ));
- TCodecProcessResult result;
-
- result = aCodec->ProcessL (*aInBuffer, *aOutBuffer);
-
- switch (result.iStatus)
- {
- case TCodecProcessResult::EProcessComplete:
- // finished processing source data, all data in sink buffer
- PRINT((_L("CProcDecoder::FeedCodecL() EProcessComplete")));
- aInBuffer->SetPosition( 0 );
- aInBuffer->Data().SetLength(0);
- break;
-
- case TCodecProcessResult::EDstNotFilled:
- // the destination is not full, we need more data. Handled in caller
- PRINT((_L("CProcDecoder::FeedCodecL() EDstNotFilled")));
- aInBuffer->SetPosition( 0 );
- aInBuffer->Data().SetLength(0);
- break;
-
- case TCodecProcessResult::EProcessIncomplete:
- // the sink was filled before all the source was processed
- PRINT((_L("CProcDecoder::FeedCodecL() EProcessIncomplete")));
- aOutBuffer->SetPosition( 0 );
- aInBuffer->SetPosition( aInBuffer->Position() + result.iSrcBytesProcessed );
- break;
-
- default:
- break;
- }
-
- PRINT((_L("CProcDecoder::DecodeL() out, %d -> %d"),result.iSrcBytesProcessed, result.iDstBytesAdded));
- PRINT((_L("CProcDecoder::DecodeL() out, input pos: %d, length: %d"), aInBuffer->Position(), aInBuffer->Data().Length() ));
- return result;
- }
-
-TBool CProcDecoder::GetIsSupportedSourceCodec()
- {
-
- TFourCC fourCC;
- TUid uID;
-
- if (iProperties.iAudioType == EAudAMR)
- {
- fourCC = TFourCC(KMMFFourCCCodeAMR);
- uID = TUid(KMmfAMRNBDecSWCodecUid);
- }
- else if (iProperties.iAudioType == EAudAAC_MPEG4)
- {
- // use eAAC+ also for AAC
- fourCC = TFourCC(KMMFFourCCCodeAACPlus);
- uID = TUid(KMmfUidCodecEnhAACPlusToPCM16);
- }
- else if (iProperties.iAudioType == EAudMP3)
- {
- fourCC = TFourCC(KMMFFourCCCodeMP3);
- uID = TUid(KMmfAdvancedUidCodecMP3ToPCM16);
- }
- else if (iProperties.iAudioType == EAudAMRWB)
- {
- fourCC = TFourCC(KMMFFourCCCodeAWB);
- uID = TUid(KMmfAMRWBDecSWCodecUid);
- }
- else
- {
- //Wav, no codec
- return ETrue;
- }
-
-
-
- _LIT8(emptyFourCCString, " , ");
- TBufC8<9> fourCCString(emptyFourCCString);
- TPtr8 fourCCPtr = fourCCString.Des();
- TPtr8 fourCCPtr1(&fourCCPtr[0], 4);
- TPtr8 fourCCPtr2(&fourCCPtr[5], 4 );
-
- TFourCC srcFourCC(' ','P','1','6');
- fourCC.FourCC(&fourCCPtr1);
- srcFourCC.FourCC(&fourCCPtr2);
-
- TBool found = EFalse;
- TRAPD( err, found = CheckIfCodecAvailableL( fourCCPtr , uID));
-
- if (err == KErrNone)
- {
- return found;
- }
- else
- {
- return EFalse;
- }
- }
-
-
-void CProcDecoder::SetSourceCodecL()
- {
- PRINT((_L("CProcDecoder::SetSourceCodecL() in")));
-
- if ( !GetIsSupportedSourceCodec() )
- {
- PRINT((_L("CProcDecoder::SetSourceCodecL() error, unsupported codec")));
- User::Leave( KErrNotSupported );
- }
-
- if ( iSourceCodec )
- {
- delete iSourceCodec;
- iSourceCodec = NULL;
- }
-
- TFourCC destFourCC = KMMFFourCCCodePCM16;
-
- if (iProperties.iAudioType == EAudAMR)
- {
- iSourceCodec = CMMFCodec::NewL( KMmfAMRNBDecSWCodecUid );
-
- }
- else if (iProperties.iAudioType == EAudAAC_MPEG4)
- {
- // use eAAC+ also for AAC
- iSourceCodec = CMMFCodec::NewL( KMmfUidCodecEnhAACPlusToPCM16 );
-
- }
- else if (iProperties.iAudioType == EAudMP3)
- {
- iSourceCodec = CMMFCodec::NewL( KMmfAdvancedUidCodecMP3ToPCM16 );
-
- }
- else if (iProperties.iAudioType == EAudAMRWB)
- {
- iSourceCodec = CMMFCodec::NewL( KMmfAMRWBDecSWCodecUid );
-
- }
- else
- {
- // Wav, but no codec needed then
- }
-
- iReady = EFalse;
-
- PRINT((_L("CProcDecoder::SetSourceCodecL() out")));
- }
-
-
-
-TBool CProcDecoder::CheckIfCodecAvailableL(const TDesC8& aCodecFourCCString,
- const TUid& aCodecUId )
- {
- PRINT((_L("CProcDecoder::CheckIfCodecAvailableL() in")));
- TBool found = EFalse;
-
- // Create a TEcomResolverParams structure.
- TEComResolverParams resolverParams ;
- resolverParams.SetDataType( aCodecFourCCString ) ;
- resolverParams.SetWildcardMatch( EFalse ) ;
-
- RImplInfoPtrArray plugInArray ; // Array to return matching decoders in (place on cleanupstack _after_ ListImplementationsL() )
-
- TUid UidMmfPluginInterfaceCodec = {KMmfUidPluginInterfaceCodec};
-
- // ListImplementationsL leaves if it cannot find anything so trap the error and ignore it.
- TRAPD( err, REComSession::ListImplementationsL(UidMmfPluginInterfaceCodec, resolverParams, plugInArray ) ) ;
- CleanupResetAndDestroyPushL(plugInArray);
-
-
- if (err == KErrNone)
- {
- found = EFalse;
- for ( TInt i = 0; i < plugInArray.Count(); i++)
- {
- // there is a match, but 1st we need to ensure it is the one we have tested with, and that have compatible implementation of ConfigureL
- PRINT((_L("CProcDecoder::CheckIfCodecAvailable() plugin found with Uid 0x%x"), plugInArray[i]->ImplementationUid().iUid ));
- if ( plugInArray[i]->ImplementationUid() == aCodecUId )
- {
- //match accepted
- PRINT((_L("CProcDecoder::CheckIfCodecAvailable() plugin accepted")));
- found = ETrue;
- }
- }
- }
- else
- {
- PRINT((_L("CProcDecoder::CheckIfCodecAvailable() Error in ListImp.: %d"), err));
- //no match
- found = EFalse;
- }
-
- CleanupStack::PopAndDestroy(); //plugInArray
- PRINT((_L("CProcDecoder::CheckIfCodecAvailableL() out")));
- return found;
- }
-
-TBool CProcDecoder::UpdateOutputBufferL(CMMFDataBuffer* aInBuffer)
- {
- if (iDecBuffer == 0)
- {
- iDecBuffer = HBufC8::NewL(aInBuffer->BufferSize());
- iDecBuffer->Des().Append(aInBuffer->Data());
- }
- else
- {
- iDecBuffer = iDecBuffer->ReAlloc(iDecBuffer->Size()+aInBuffer->BufferSize());
- iDecBuffer->Des().Append(aInBuffer->Data());
- }
-
- aInBuffer->Data().SetLength( 0 );
- aInBuffer->SetPosition( 0 );
-
- return ETrue;
- }
-