diff -r 000000000000 -r 951a5db380a0 videoeditorengine/audioeditorengine/codecs/AMR/src/ProcAMRInFileHandler.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/videoeditorengine/audioeditorengine/codecs/AMR/src/ProcAMRInFileHandler.cpp Fri Jan 29 14:08:33 2010 +0200 @@ -0,0 +1,526 @@ +/* +* 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; + } +