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