videoeditorengine/audioeditorengine/src/ProcVisProcessor.cpp
author Mikael Laine <mikael.laine@ixonos.com>
Fri, 29 Jan 2010 14:08:33 +0200
changeset 0 951a5db380a0
permissions -rw-r--r--
Committing the Video Editor package under the Eclipse Public License

/*
* 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()
    {

    }