diff -r 951a5db380a0 -r e0b5df5c0969 videoeditorengine/audioeditorengine/codecs/AMR/src/ProcAMRInFileHandler.cpp --- a/videoeditorengine/audioeditorengine/codecs/AMR/src/ProcAMRInFileHandler.cpp Fri Jan 29 14:08:33 2010 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,526 +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 "ProcAMRInFileHandler.h" -#include "ProcAMRFrameHandler.h" -#include "ProcTools.h" -#include "AudPanic.h" - - -CProcAMRInFileHandler* CProcAMRInFileHandler::NewL(const TDesC& aFileName, - RFile* aFileHandle, - CAudClip* aClip, - TInt aReadBufferSize, - TInt aTargetSampleRate, - TChannelMode aChannelMode) - { - - CProcAMRInFileHandler* self = NewLC(aFileName, aFileHandle, aClip, aReadBufferSize, - aTargetSampleRate, aChannelMode); - CleanupStack::Pop(self); - return self; - } - -CProcAMRInFileHandler* CProcAMRInFileHandler::NewLC(const TDesC& aFileName, - RFile* aFileHandle, - CAudClip* aClip, - TInt aReadBufferSize, - TInt aTargetSampleRate, - TChannelMode aChannelMode) - { - - CProcAMRInFileHandler* self = new (ELeave) CProcAMRInFileHandler(); - CleanupStack::PushL(self); - self->ConstructL(aFileName, aFileHandle, aClip, aReadBufferSize, - aTargetSampleRate, aChannelMode); - return self; - } - -CProcAMRInFileHandler::CProcAMRInFileHandler() : CProcInFileHandler() - { - - - } - -void CProcAMRInFileHandler::GetPropertiesL(TAudFileProperties* aProperties) - { - - if (iProperties != 0) - { - *aProperties = *iProperties; - return; - } - aProperties->iAudioTypeExtension = EAudExtensionTypeNoExtension; - if (iFileOpen) - { - aProperties->iFileFormat = EAudFormatAMR; - - TInt oldPos = iFilePos; - - TInt fileSize = 0; - iFile.Size(fileSize); - - TBuf8<6> header; - //iFile.Read(0, header); - BufferedFileRead(0, header); - if (header.Compare(_L8("#!AMR\n")) == 0) - { - aProperties->iAudioType = EAudAMR; - aProperties->iSamplingRate = 8000; - aProperties->iChannelMode = EAudSingleChannel; - aProperties->iBitrateMode = EAudVariable; - - TBuf8<1> buf; - // iFile.Read(6, buf); - BufferedFileRead(6, buf); - TUint dec_mode = (enum Mode)((buf[0] & 0x0078) >> 3); - - aProperties->iBitrate = KAmrBitRates[dec_mode]; - TInt durationMilli = 0; - TInt frameAmount = 0; - TInt frameDuration = 0; - TInt frameSize = 0; - - GetFrameInfo(durationMilli, frameAmount, frameDuration, frameSize); - - TInt64 tmp = (TInt64)(TInt)durationMilli*1000; - // milliseconds->microseconds - TTimeIntervalMicroSeconds durationMicro(tmp); - aProperties->iDuration = durationMicro; - aProperties->iFrameCount = frameAmount; - - tmp = (TInt64)(TInt)frameDuration*1000; - TTimeIntervalMicroSeconds frameDurationMicro(tmp); - aProperties->iFrameDuration = frameDurationMicro; - aProperties->iFrameLen = frameSize; - - - } - BufferedFileSetFilePos(oldPos); - } - else - { - TAudPanic::Panic(TAudPanic::EInternal); - } - - if (iProperties == 0) - { - iProperties = new (ELeave) TAudFileProperties; - *iProperties = *aProperties; - } - - - - - - } - -TBool CProcAMRInFileHandler::SeekAudioFrame(TInt32 aTime) - { - - - if (!iFileOpen) - { - TAudPanic::Panic(TAudPanic::EInternal); - } - - TInt fileSize = 0; - iFile.Size(fileSize); - - - TInt firstModeByte = 6; - TInt readSize = 0; - TBuf8<1> modeByte; - iCurrentTimeMilliseconds = 0; - - TUint dec_mode; - //iFile.Seek(ESeekStart, firstModeByte); - BufferedFileSetFilePos(firstModeByte); - - while(iCurrentTimeMilliseconds < aTime) - { - - //iFile.Read(modeByte, 1); - BufferedFileRead(modeByte); - if (modeByte.Size() == 0) - { - return EFalse; - } - - dec_mode = (enum Mode)((modeByte[0] & 0x0078) >> 3); - - switch (dec_mode) - { - case 0: - readSize = 12; - break; - case 1: - readSize = 13; - break; - case 2: - readSize = 15; - break; - case 3: - readSize = 17; - break; - case 4: - readSize = 19; - break; - case 5: - readSize = 20; - break; - case 6: - readSize = 26; - break; - case 7: - readSize = 31; - break; - case 8: - readSize = 5; - break; - case 15: - readSize = 0; - break; - default: - readSize = 0; - break; - }; - // read the next audio frame - //iFile.Read(audioFrame, read_size); - //if (iFile.Seek(ESeekCurrent, readSize) != KErrNone) { - // return EFalse; - //} - if (!(BufferedFileSetFilePos(BufferedFileGetFilePos()+readSize))) - { - - // EOF - return EFalse; - } - iCurrentTimeMilliseconds += 20; - } - return ETrue; - } - -TBool CProcAMRInFileHandler::SeekCutInFrame() - { - - iCurrentTimeMilliseconds = iCutInTime; - return SeekAudioFrame(iCutInTime); - } - - - - -void CProcAMRInFileHandler::ConstructL(const TDesC& aFileName, - RFile* aFileHandle, - CAudClip* aClip, - TInt aReadBufferSize, - TInt aTargetSampleRate, - TChannelMode aChannelMode) - { - - - - iTargetSampleRate = aTargetSampleRate; - iChannelMode = aChannelMode; - - InitAndOpenFileL(aFileName, aFileHandle, aReadBufferSize); - - - if (aClip != 0) - { - iCutInTime = ProcTools::MilliSeconds(aClip->CutInTime()); - - } - - const TInt KSilentFrameSize = 13; - - TUint8 silentFrame[KSilentFrameSize]= - { - 0x04,0x63,0x3C,0xC7,0xF0,0x03,0x04,0x39,0xFF,0xE0, - 0x00,0x00,0x00 - - }; - - - iSilentFrame = HBufC8::NewL(KSilentFrameSize); - iSilentFrame->Des().Append(silentFrame, KSilentFrameSize); - iSilentFrameDuration = 20; - - - iClip = aClip; - - TAudFileProperties prop; - GetPropertiesL(&prop); - - iDecoder = CProcDecoder::NewL(); - - iDecodingPossible = iDecoder->InitL(prop, aTargetSampleRate, aChannelMode); - - - // Generate a frame handler ---------------------> - - iFrameHandler = CProcAMRFrameHandler::NewL(); - - if (iClip != 0 && iClip->Normalizing()) - { - SetNormalizingGainL(iFrameHandler); - } - - - } - -TBool CProcAMRInFileHandler::GetEncAudioFrameL(HBufC8*& aFrame, TInt& aSize, TInt32& aTime) - { - if (!iFileOpen) - { - TAudPanic::Panic(TAudPanic::EInternal); - } - - aFrame = NULL; - TInt readSize = 0; - TBuf8<1> modeByte; -// TBuf8<32> audioFrame; - TUint dec_mode; - - - //iFile.Read(modeByte); - BufferedFileRead(modeByte); - if (modeByte.Size() == 0) - { - return EFalse; - } - - dec_mode = (enum Mode)((modeByte[0] & 0x0078) >> 3); - - switch (dec_mode) - { - case 0: - readSize = 12; - break; - case 1: - readSize = 13; - break; - case 2: - readSize = 15; - break; - case 3: - readSize = 17; - break; - case 4: - readSize = 19; - break; - case 5: - readSize = 20; - break; - case 6: - readSize = 26; - break; - case 7: - readSize = 31; - break; - case 8: - readSize = 5; - break; - case 15: - readSize = 0; - break; - default: - readSize = 0; - break; - }; - - HBufC8* audioFrame = HBufC8::NewL(readSize+1); - - TPtr8 tmpDes((TPtr8)audioFrame->Des()); - - BufferedFileRead((TPtr8&) tmpDes, readSize); - audioFrame->Des().Insert(0, modeByte); - - aFrame = audioFrame; - - TRAPD(err, ManipulateGainL(aFrame)); - - if (err != KErrNone) - { - // something went wrong with the gain manipulation - // continue by returning the original frame - } - - - aSize = aFrame->Size(); - aTime = 20; - iCurrentTimeMilliseconds += 20; - - return ETrue; - } - - - -CProcAMRInFileHandler::~CProcAMRInFileHandler() - { - - if (iSilentFrame != 0) delete iSilentFrame; - - ResetAndCloseFile(); - - delete iDecoder; - - delete iFrameHandler; - - } - - -TBool CProcAMRInFileHandler::GetFrameInfo(TInt& aSongDuration, - TInt& aFrameAmount, - TInt& aAverageFrameDuration, - TInt& aAverageFrameSize) - { - - - - - if (!iFileOpen) - { - TAudPanic::Panic(TAudPanic::EInternal); - } - - TInt fileSize = 0; - iFile.Size(fileSize); - - - TInt firstModeByte = 6; - TInt frameIndex = 1; - TInt readSize = 0; - TBuf8<1> modeByte; - - TInt32 frameSizeSum = 0; - - TInt filePos = iFilePos; - - TUint dec_mode; - - BufferedFileSetFilePos(firstModeByte); - - while(frameIndex < 180000) // 1 hour - { - - BufferedFileRead(modeByte); - if (modeByte.Size() == 0) - { - break; - } - - dec_mode = (enum Mode)((modeByte[0] & 0x0078) >> 3); - - switch (dec_mode) - { - case 0: - readSize = 12; - break; - case 1: - readSize = 13; - break; - case 2: - readSize = 15; - break; - case 3: - readSize = 17; - break; - case 4: - readSize = 19; - break; - case 5: - readSize = 20; - break; - case 6: - readSize = 26; - break; - case 7: - readSize = 31; - break; - case 8: - readSize = 5; - break; - case 15: - readSize = 0; - break; - default: - readSize = 0; - break; - }; - if (!(BufferedFileSetFilePos(BufferedFileGetFilePos()+readSize))) - { - - break; // EOF - } - frameSizeSum += readSize; - aSongDuration += 20; - frameIndex++; - } - - aAverageFrameSize = frameSizeSum/frameIndex; - aFrameAmount = frameIndex; - aAverageFrameDuration = aSongDuration/aFrameAmount; - BufferedFileSetFilePos(filePos); - return ETrue; - - - } - - -TBool CProcAMRInFileHandler::SetNormalizingGainL(const CProcFrameHandler* aFrameHandler) - { - - HBufC8* point = 0; - TInt siz; - TInt32 tim = 0; - TInt8 margin = 0; - TInt minMargin = KMaxTInt; - TInt tmpGain = 0; - TInt frameCounter = 0; - while(GetEncAudioFrameL(point, siz, tim)) - - { - aFrameHandler->GetNormalizingMargin(point, margin); - tmpGain += margin; - - delete point; - point = 0; - frameCounter++; - if (frameCounter > 1) - { - tmpGain = tmpGain/3; - - if (tmpGain < minMargin) - { - minMargin = tmpGain; - } - - frameCounter = 0; - tmpGain = 0; - } - } - - iNormalizingMargin = static_cast(minMargin); - - return ETrue; - } -