videoeditorengine/audioeditorengine/src/ProcVisProcessor.cpp
changeset 0 951a5db380a0
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/videoeditorengine/audioeditorengine/src/ProcVisProcessor.cpp	Fri Jan 29 14:08:33 2010 +0200
@@ -0,0 +1,464 @@
+/*
+* 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 "ProcVisProcessor.h"
+#include "audconstants.h"
+
+#include "ProcMP4InFileHandler.h"
+#include "ProcADTSInFileHandler.h"
+#include "ProcMP3InFileHandler.h"
+#include "ProcAWBInFileHandler.h"
+#include "ProcWAVInFileHandler.h"
+#include "ProcAMRInFileHandler.h"
+
+
+#include "ProcAMRFrameHandler.h"
+#include "ProcAACFrameHandler.h"
+#include "ProcMP3FrameHandler.h"
+#include "ProcAWBFrameHandler.h"
+#include "ProcWAVFrameHandler.h"
+
+CProcVisProcessor* CProcVisProcessor::NewL()
+    {
+
+
+    CProcVisProcessor* self = new (ELeave) CProcVisProcessor();
+    CleanupStack::PushL(self);
+    self->ConstructL();
+    CleanupStack::Pop(self);
+    return self;
+    }
+
+CProcVisProcessor* CProcVisProcessor::NewLC()
+    {
+    CProcVisProcessor* self = new (ELeave) CProcVisProcessor();
+    CleanupStack::PushL(self);
+    self->ConstructL();
+    return self;
+    }
+
+
+CProcVisProcessor::~CProcVisProcessor()
+    {
+
+    if (iVisualization != 0)
+        {
+        delete[] iVisualization;
+        }
+    if (iInFile != 0)
+        {
+        delete iInFile;
+        }
+    if (iFrameHandler != 0)
+        {
+        delete iFrameHandler;
+        }
+
+    }
+
+void CProcVisProcessor::VisualizeClipL(const CAudClipInfo* aClipInfo, TInt aSize)
+    {
+
+        // initialize...
+    iClipInfo = aClipInfo;
+    iVisualizationSize = aSize;
+    iVisualization = new (ELeave) TInt8[iVisualizationSize];
+    
+
+    if (aClipInfo->Properties().iFileFormat == EAudFormatAMR) 
+        {
+        CProcInFileHandler* inFileHandler = CProcAMRInFileHandler::NewL(aClipInfo->FileName(), 
+                                                                        aClipInfo->FileHandle(), 
+                                                                        0, 2048);
+        iInFile = inFileHandler;
+        iFrameHandler = CProcAMRFrameHandler::NewL();
+        TAudFileProperties properties;
+        inFileHandler->GetPropertiesL(&properties);
+        inFileHandler->SetPropertiesL(properties);
+        iFrameAmount = properties.iFrameCount;
+        inFileHandler->SeekAudioFrame(0);
+        }
+    else if (aClipInfo->Properties().iFileFormat == EAudFormatAMRWB) 
+        {
+        CProcInFileHandler* inFileHandler = CProcAWBInFileHandler::NewL(aClipInfo->FileName(), 
+                                                                        aClipInfo->FileHandle(), 
+                                                                        0, 2048);
+        iInFile = inFileHandler;
+        iFrameHandler = CProcAWBFrameHandler::NewL();
+        TAudFileProperties properties;
+        inFileHandler->GetPropertiesL(&properties);
+        inFileHandler->SetPropertiesL(properties);
+        iFrameAmount = properties.iFrameCount;
+        inFileHandler->SeekAudioFrame(0);
+        }
+    else if (aClipInfo->Properties().iFileFormat == EAudFormatMP3) 
+        {
+        CProcInFileHandler* inFileHandler = CProcMP3InFileHandler::NewL(aClipInfo->FileName(), 
+                                                                        aClipInfo->FileHandle(), 
+                                                                        0, 2048);
+        iInFile = inFileHandler;
+        iFrameHandler = CProcMP3FrameHandler::NewL();
+        TAudFileProperties properties;
+        inFileHandler->GetPropertiesL(&properties);
+        inFileHandler->SetPropertiesL(properties);
+        iFrameAmount = properties.iFrameCount;
+        inFileHandler->SeekAudioFrame(0);
+        }
+    else if (aClipInfo->Properties().iFileFormat == EAudFormatWAV) 
+        {
+        CProcInFileHandler* inFileHandler = CProcWAVInFileHandler::NewL(aClipInfo->FileName(), 
+                                                                        aClipInfo->FileHandle(), 
+                                                                        0, 8192);
+        iInFile = inFileHandler;
+        TAudFileProperties properties;
+        inFileHandler->GetPropertiesL(&properties);
+        inFileHandler->SetPropertiesL(properties);
+        iFrameAmount = properties.iFrameCount;
+        inFileHandler->SeekAudioFrame(0);
+        iFrameHandler = CProcWAVFrameHandler::NewL(properties.iNumberOfBitsPerSample);
+        }
+    
+
+    else if (aClipInfo->Properties().iFileFormat == EAudFormatMP4 &&                                                           
+            aClipInfo->Properties().iAudioType == EAudAAC_MPEG4)
+        {
+
+        CProcInFileHandler* inFileHandler = CProcMP4InFileHandler::NewL(aClipInfo->FileName(), 
+                                                                        aClipInfo->FileHandle(), 
+                                                                        0, 8192);
+
+        iInFile = inFileHandler;
+        TAudFileProperties properties;
+        
+        inFileHandler->GetPropertiesL(&properties);
+        
+        inFileHandler->SetPropertiesL(properties);
+        //inFileHandler->SetPropertiesL(properties);
+        iFrameAmount = properties.iFrameCount;
+        inFileHandler->SeekAudioFrame(0);
+
+        TAACFrameHandlerInfo frameInfo;
+        CProcMP4InFileHandler* MP4inFileHandler = static_cast<CProcMP4InFileHandler*>(inFileHandler);
+        MP4inFileHandler->GetInfoForFrameHandler(frameInfo);
+        
+        iFrameHandler = CProcAACFrameHandler::NewL(frameInfo);    
+
+        }
+    else if (aClipInfo->Properties().iFileFormat == EAudFormatMP4 &&
+            (aClipInfo->Properties().iAudioType == EAudAMR))
+        {
+
+        CProcInFileHandler* inFileHandler = CProcMP4InFileHandler::NewL(aClipInfo->FileName(), 
+                                                                        aClipInfo->FileHandle(), 
+                                                                        0, 8092);
+
+        iInFile = inFileHandler;
+        TAudFileProperties properties;
+        
+        inFileHandler->GetPropertiesL(&properties);
+        
+        inFileHandler->SetPropertiesL(properties);
+        //inFileHandler->SetPropertiesL(properties);
+        iFrameAmount = properties.iFrameCount;
+        inFileHandler->SeekAudioFrame(0);
+
+        iFrameHandler = CProcAMRFrameHandler::NewL();    
+
+        }
+    else if (aClipInfo->Properties().iFileFormat == EAudFormatMP4 &&
+            (aClipInfo->Properties().iAudioType == EAudAMRWB))
+        {
+
+        CProcInFileHandler* inFileHandler = CProcMP4InFileHandler::NewL(aClipInfo->FileName(), 
+                                                                        aClipInfo->FileHandle(), 
+                                                                        0, 8092);
+
+        iInFile = inFileHandler;
+        TAudFileProperties properties;
+        
+        inFileHandler->GetPropertiesL(&properties);
+        
+        inFileHandler->SetPropertiesL(properties);
+        //inFileHandler->SetPropertiesL(properties);
+        iFrameAmount = properties.iFrameCount;
+        inFileHandler->SeekAudioFrame(0);
+
+        iFrameHandler = CProcAWBFrameHandler::NewL();    
+
+        }
+    else if (aClipInfo->Properties().iFileFormat == EAudFormatAAC_ADTS &&
+            aClipInfo->Properties().iAudioType == EAudAAC_MPEG4
+            )
+        {
+
+        CProcInFileHandler* inFileHandler = CProcADTSInFileHandler::NewL(aClipInfo->FileName(), 
+                                                                         aClipInfo->FileHandle(), 
+                                                                        0, 8092);
+
+
+
+        iInFile = inFileHandler;
+        TAudFileProperties properties;
+        
+        inFileHandler->GetPropertiesL(&properties);
+        
+        inFileHandler->SetPropertiesL(properties);
+        iFrameAmount = properties.iFrameCount;
+        inFileHandler->SeekAudioFrame(0);
+
+        TAACFrameHandlerInfo frameInfo;
+        CProcADTSInFileHandler* ADTSinFileHandler = static_cast<CProcADTSInFileHandler*>(inFileHandler);
+        ADTSinFileHandler->GetInfoForFrameHandler(frameInfo);
+        
+        iFrameHandler = CProcAACFrameHandler::NewL(frameInfo);    
+
+        }
+
+
+    }
+
+TBool CProcVisProcessor::VisualizeClipPieceL(TInt &aProgress)
+    {
+
+    if (iInFile == 0)
+        return ETrue;
+    
+    if (iVisualizationPos >= iVisualizationSize) 
+    {
+        if (iInFile != 0)
+        {
+            delete iInFile;
+            iInFile = 0;
+        }
+        
+        if (iFrameHandler != 0)
+        {
+            delete iFrameHandler;
+            iFrameHandler = 0;
+        }
+        return ETrue;
+    }
+    
+    HBufC8* point = 0;
+    TInt siz;
+    TInt32 tim = 0;
+    
+    RArray<TInt> gains;
+    
+    TAudType audType = iClipInfo->Properties().iAudioType;
+    
+    
+    TInt maxGain = 0;
+    TInt gainAmount = 0;
+    TInt divider = 0;
+    for (TInt b = 0 ; b < 2 ; b++)
+    {
+        gains.Reset();
+        
+        
+        TBool decReq = iInFile->DecodingRequired();
+        iInFile->SetDecodingRequired(EFalse);
+        TBool tmp = EFalse;
+        
+        if (!iInFile->GetAudioFrameL(point, siz, tim, tmp)) 
+        {
+            iInFile->SetDecodingRequired(decReq);
+            
+            delete iInFile;
+            iInFile = 0;
+            delete iFrameHandler;
+            iFrameHandler = 0;
+            return ETrue;
+            
+        }
+        iInFile->SetDecodingRequired(decReq);
+        CleanupStack::PushL(point);
+        
+        iFramesProcessed++;
+        if (siz > 0) 
+        {
+            
+            
+            iFrameHandler->GetGainL(point, gains, maxGain);
+            
+            if (point != NULL) 
+            {
+                CleanupStack::PopAndDestroy(point);
+            }
+            
+            
+            if (audType == EAudAMR || audType == EAudAMRWB)
+            {
+                
+                for (TInt c = 0 ; c < gains.Count() ; c++)
+                {
+                    if (gains[c] > gainAmount)
+                    {
+                        gainAmount = gains[c];
+                    }
+                    
+                    //gainAmount+=gains[c];
+                }
+            }
+            else if (audType == EAudAAC_MPEG4)
+            {
+                for (TInt c = 0 ; c < gains.Count() ; c++)
+                {
+                    if (gains[c] > gainAmount)
+                    {
+                        gainAmount = gains[c];
+                    }
+                    
+                    //gainAmount+=gains[c];
+                }
+            }        
+            else if (audType == EAudMP3)
+            {
+                for (TInt c = 0 ; c < gains.Count() ; c++)
+                {
+                    
+                    gainAmount+=gains[c];
+                    divider++;
+                }
+                //gainAmount /= gains.Count();
+            }
+            else if (audType == EAudWAV)
+                {
+                for (TInt c = 0 ; c < gains.Count() ; c++)
+                    {
+                    
+                    gainAmount+=gains[c];
+                    divider++;
+                    }
+                //gainAmount /= gains.Count();
+                }
+            
+        }
+        
+        else 
+        {
+            CleanupStack::PopAndDestroy(point);
+            // silent frame
+            gains.Append(0);
+            gains.Append(0);
+            maxGain = 1;
+        }
+    }
+    
+    
+    if (audType == EAudMP3 && divider > 0) gainAmount/= divider;
+    if (audType == EAudWAV && divider > 0) gainAmount/= divider;
+    
+    
+    
+    iVisualizationProcessed = (iFramesProcessed*KAedMaxVisualizationResolution)/iFrameAmount;
+    
+    
+    while (iVisualizationWritten <= iVisualizationProcessed)
+    {
+        if (iVisualizationPos >= iVisualizationSize)
+        {
+            break;
+        }
+        
+        if (audType == EAudAAC_MPEG4)
+        {
+            
+            TReal ga(gainAmount-100);
+            TReal exponent= ga/36;
+            TReal visResult(0);
+            Math::Pow(visResult, 10, exponent);
+            
+            TInt16 visR = 0;
+            TInt err = Math::Int(visR, visResult);
+            
+            if (visR > 127) visR = 127;
+            
+            if (err == KErrNone)
+            {
+                iVisualization[iVisualizationPos] = static_cast<TInt8>(visR);
+            }
+            else
+            {
+                iVisualization[iVisualizationPos] = 0;
+                
+            }
+            
+        }
+        else 
+        {
+            TInt visValue = (127*gainAmount)/maxGain;
+            
+            if (visValue < 0)
+                {
+                visValue = 0;
+                }
+            else if (visValue > KMaxTInt8)
+                {
+                visValue = KMaxTInt8;
+                }
+        
+            iVisualization[iVisualizationPos] = static_cast<TInt8>(visValue);
+        }
+        iVisualizationPos++;
+        iVisualizationWritten = (KAedMaxVisualizationResolution*iVisualizationPos)/iVisualizationSize;
+    }
+    
+    
+    gains.Reset();
+    aProgress = iVisualizationWritten/(KAedMaxVisualizationResolution/100); // convert resolution to percentages
+    return EFalse;
+
+
+    }
+
+void CProcVisProcessor::GetFinalVisualizationL(TInt8*& aVisualization, TInt& aSize)
+    {
+
+    if (iVisualization == 0)
+        {
+        User::Leave(KErrNotReady);
+        }
+
+    aVisualization = new (ELeave) TInt8[iVisualizationSize];
+    
+    for (TInt a = 0 ; a < iVisualizationSize ; a++)
+        {
+        aVisualization[a] = iVisualization[a];
+        }
+    aSize = iVisualizationSize;
+
+    delete[] iVisualization;
+    iVisualization = 0;
+
+    }
+
+
+void CProcVisProcessor::ConstructL()
+    {
+
+    }
+
+CProcVisProcessor::CProcVisProcessor()
+    {
+
+    }
+