videoeditorengine/audioeditorengine/codecs/AMR/src/ProcAMRInFileHandler.cpp
changeset 0 951a5db380a0
--- /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<TInt8>(minMargin);
+
+    return ETrue;
+    }
+