diff -r 000000000000 -r 951a5db380a0 videoeditorengine/audioeditorengine/src/ProcTools.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/videoeditorengine/audioeditorengine/src/ProcTools.cpp Fri Jan 29 14:08:33 2010 +0200 @@ -0,0 +1,1043 @@ +/* +* 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 "ProcTools.h" +#include "AudPanic.h" + +#include "mime_io.h" + + +TBool ProcTools::Dec2Bin(TUint8 aDec, TBuf8<8>& aBinary) + { + + // clear aBinary just in case + aBinary.Delete(0, aBinary.Length()); + + aBinary.AppendNum(aDec, EBinary); + + TInt zerosNeeded = 0; + if (aBinary.Length() == 8) + { + // the MSB is one -> no padding needed + } + else + { + + zerosNeeded = 8 - aBinary.Length(); + for(TInt as = 0 ; as < zerosNeeded ; as++) + { + aBinary.AppendNum(0); + } + + for (TInt tr = 8 - 1 ; tr >= 0 ; tr--) + { + + if (tr >= zerosNeeded) + { + aBinary[tr] = aBinary[tr-zerosNeeded]; + } + else + { + aBinary[tr] = '0'; + } + + } + } + + + return ETrue; + } + +TBool ProcTools::Dec2BinL(TUint32 aDec, HBufC8*& aBin) + { + + // 32 bits, the leftmost is one + TUint32 bitMask = 0x80000000; + + TBool onlyZeros = ETrue; + for (TInt a = 32 ; a > 0 ; a--) + { + TUint32 res = bitMask & aDec; + + if (res > 0 && onlyZeros) + { + // the first one from left found + onlyZeros = EFalse; + aBin = HBufC8::NewL(a); + aBin->Des().Append('1'); + } + else if (res > 0 && !onlyZeros) + { + aBin->Des().Append('1'); + } + else if (res == 0 && !onlyZeros) + { + aBin->Des().Append('0'); + + } + bitMask >>= 1; + } + + return ETrue; + + } + +TBool ProcTools::Bin2Dec(const TDesC8& aBin, TUint& aDec) + { + + TLex8 leks(aBin); + + if (leks.Val(aDec, EBinary) != KErrNone) + { + return EFalse; + } + return ETrue; + + } + +TBool ProcTools::Des2Dec(TDesC8& aDes, TUint& aDec) + { + + TLex8 leks(aDes); + + if (leks.Val(aDec, EDecimal) != KErrNone) + { + return EFalse; + } + return ETrue; + + + } + +TBool ProcTools::Des2BinL(const TDesC8& aDes, HBufC8*& aBin) + { + + aBin = HBufC8::NewL(aDes.Length()*8); + // clear aBinary just in case + + for (TInt a = 0 ; a < aDes.Length() ; a++) + { + + TUint8 chDec = aDes[a]; + + aBin->Des().AppendNum(chDec, EBinary); + + TInt zerosNeeded = 0; + if (aBin->Des().Length() == (a+1)*8) + { + // the MSB is one -> no padding needed + } + else + { + + zerosNeeded = (a+1)*8 - aBin->Des().Length(); + for(TInt as = 0 ; as < zerosNeeded ; as++) + { + aBin->Des().Insert(a*8, _L8("0")); + //AppendNum(0); + } + + } + } + + + return ETrue; + + } + +TInt ProcTools::MilliSeconds(TTimeIntervalMicroSeconds aMicroSeconds) + { + +#ifndef EKA2 + return (aMicroSeconds.Int64()/1000).GetTInt(); +#else + return (aMicroSeconds.Int64()/1000); +#endif + + } + +TTimeIntervalMicroSeconds ProcTools::MicroSeconds(TInt aMilliSeconds) + { + + TTimeIntervalMicroSeconds mic(aMilliSeconds*1000); + return mic; + } + +TInt ProcTools::GetTInt(TInt64 aTInt64) + { + +#ifndef EKA2 + return aTInt64.GetTInt(); +#else + return aTInt64; +#endif + + } + +TInt ProcTools::GetValueFromShuffledFrame(const HBufC8* aFrame, + const TUint8 aBitPositions[], + const TInt aSize) + { + + HBufC8* inBytes = 0; + TRAPD(err, inBytes = HBufC8::NewL(aSize)); + if (err != KErrNone) + { + inBytes = 0; + return -1; + } + + + _LIT8(KZero, "0"); + _LIT8(KOne, "1"); + + + for (TInt a = 0 ; a < aSize ; a++) + { + + TUint8 mask = 0x80; // 1000 0000b + TUint byteNumber = aBitPositions[a]/8; + TUint bitNumber = aBitPositions[a]%8; + + const TUint8 byteNow = (*aFrame)[byteNumber]; + + mask >>= bitNumber; + + //TUint8 masked = byteNow & mask; + // why casting is needed, dunno? + + TUint8 masked = static_cast(byteNow & mask); + + if (masked == 0) + { + inBytes->Des().Append(KZero); + } + else + { + inBytes->Des().Append(KOne); + } + } + TUint dec = 0; + Bin2Dec(inBytes->Des(), dec); + delete inBytes; + inBytes = 0; + return dec; + + + } + + + +TInt ProcTools::GetValueFromShuffledAWBFrameL(const HBufC8* aFrame, TInt aBitRate, TInt aBitPosition, TInt aLength) + { + + HBufC8* inBytes = HBufC8::NewLC(aLength); + + + _LIT8(KZero, "0"); + _LIT8(KOne, "1"); + + const TInt* table = 0; + TInt tableSize = 0; + + switch(aBitRate) + { + case(23850): + { + table = sort_2385; + tableSize = 477; + break; + } + case(23050): + { + table = sort_2305; + tableSize = 461; + break; + } + case(19850): + { + table = sort_1985; + tableSize = 397; + break; + } + case(18250): + { + table = sort_1825; + tableSize = 365; + break; + } + case(15850): + { + table = sort_1585; + tableSize = 317; + break; + } + case(14250): + { + table = sort_1425; + tableSize = 285; + break; + } + case(12650): + { + table = sort_1265; + tableSize = 253; + break; + } + case(8850): + { + table = sort_885; + tableSize = 177; + break; + } + case(6600): + { + table = sort_660; + tableSize = 132; + break; + } + default: + { + // illegal bitrate + CleanupStack::PopAndDestroy(inBytes); + return -1; + } + + } + + + for (TInt a = 0 ; a < aLength ; a++) + { + TInt bitIndex = FindIndex(aBitPosition+a, table, tableSize)+8; + + TUint8 mask = 0x80; // 1000 0000b + TUint byteNumber = bitIndex/8; + TUint bitNumber = bitIndex%8; + + const TUint8 byteNow = (*aFrame)[byteNumber]; + + mask >>= bitNumber; + + //TUint8 masked = byteNow & mask; + // why casting is needed, dunno? + + TUint8 masked = static_cast(byteNow & mask); + + if (masked == 0) + { + inBytes->Des().Append(KZero); + } + else + { + inBytes->Des().Append(KOne); + } + } + + TUint dec = 0; + Bin2Dec(inBytes->Des(), dec); + CleanupStack::PopAndDestroy(inBytes); + + inBytes = 0; + return dec; + + } + + +TBool ProcTools::SetValueToShuffledAWBFrame(TUint8 aNewValue, HBufC8* aFrame, + TInt aBitRate, TInt aBitPosition, TInt aLength) + { + + const TInt* table = 0; + TInt tableSize = 0; + + switch(aBitRate) + { + case(23850): + { + table = sort_2385; + tableSize = 477; + + break; + } + case(23050): + { + table = sort_2305; + tableSize = 461; + + break; + } + case(19850): + { + table = sort_1985; + tableSize = 397; + + break; + } + case(18250): + { + table = sort_1825; + tableSize = 365; + + break; + } + case(15850): + { + table = sort_1585; + tableSize = 317; + + break; + } + case(14250): + { + table = sort_1425; + tableSize = 285; + + break; + } + case(12650): + { + table = sort_1265; + tableSize = 253; + + break; + } + case(8850): + { + table = sort_885; + tableSize = 177; + + break; + } + case(6600): + { + table = sort_660; + tableSize = 132; + + break; + } + default: + { + // illegal bitrate + return -1; + } + + } + + + _LIT8(KZero, "0"); + + TBuf8<8> newValueBin; + Dec2Bin(aNewValue, newValueBin); + // remove leading zeros + newValueBin.Delete(0, 8-aLength); + + + + TPtr8 framePtr(aFrame->Des()); + + for (TInt a = 0 ; a < newValueBin.Size() ; a++) + { + + TInt bitIndex = FindIndex(aBitPosition+a, table, tableSize)+8; + + TUint8 bitPositionInByte = static_cast(bitIndex%8); + TUint byteNumber = bitIndex/8; + + if (newValueBin.Mid(a,1).Compare(KZero) == 0) + { + + TUint8 mask = 0x80; // 0111 1111b + mask >>= bitPositionInByte; + mask = static_cast(~mask); + + //---> +// TUint8 oldByte = framePtr[byteNumber]; + // TUint8 newByte = oldByte & mask; + //<-- + + framePtr[byteNumber] = static_cast(framePtr[byteNumber] & mask); + + } + else + { + + TUint8 mask = 0x80; // 1000 0000b + mask >>= bitPositionInByte; + + //---> +// TUint8 oldByte = framePtr[byteNumber]; +// TUint8 newByte = oldByte & mask; + //<-- + framePtr[byteNumber] = static_cast(framePtr[byteNumber] | mask); + + } + + } + + return EFalse; + } + +TBool ProcTools::SetValueToShuffledFrame(HBufC8* aFrame, TUint8 aNewValue, + const TUint8 aBitPositions[], + TInt aSize) + { + + + _LIT8(KZero, "0"); + + TBuf8<8> newValueBin; + Dec2Bin(aNewValue, newValueBin); + newValueBin.Delete(0, 8-aSize); + + TPtr8 framePtr(aFrame->Des()); + + for (TInt a = 0 ; a < aSize ; a++) + { + + TUint8 bitPosition = static_cast(aBitPositions[a]%8); + TUint byteNumber = aBitPositions[a]/8; + + if (newValueBin.Mid(a,1).Compare(KZero) == 0) + { + + TUint8 mask = 0x80; // 0111 1111b + mask >>= bitPosition; + mask = static_cast(~mask); + + //---> +// TUint8 oldByte = framePtr[byteNumber]; + // TUint8 newByte = oldByte & mask; + //<-- + + framePtr[byteNumber] = static_cast(framePtr[byteNumber] & mask); + + } + else + { + + TUint8 mask = 0x80; // 1000 0000b + mask >>= bitPosition; + + //---> +// TUint8 oldByte = framePtr[byteNumber]; +// TUint8 newByte = oldByte & mask; + //<-- + framePtr[byteNumber] = static_cast(framePtr[byteNumber] | mask); + + } + + + + } + + return ETrue; + + } + + + +TBool ProcTools::WriteValuesToFileL(const RArray& aArray, const TDesC& aFilename) + { + + RFs fs; + User::LeaveIfError(fs.Connect()); + + RFile file; + TInt err=file.Open(fs, aFilename, EFileWrite); + + if (err==KErrNotFound) + { + err=file.Create(fs, aFilename, EFileWrite); + } + TInt nolla = 0; + file.Seek(ESeekEnd, nolla); + for (TInt a = 0; a < aArray.Count() ; a++) + { + TBuf8<8> num; + num.AppendNum(aArray[a]); + file.Write(num); + file.Write(_L8("\n")); + + + } + + file.Close(); + fs.Close(); + + return ETrue; + } + + +TUint8 ProcTools::FindNewIndexSQ(TInt aNewGain, const TInt aGainTable[], TInt aTableSize) + { + + if (aTableSize > 256) + { + TAudPanic::Panic(TAudPanic::EInternal); + } + + TUint8 tableSize = static_cast(aTableSize-1); + + TInt minimum = 0xFFFF; + TUint8 indexFound = 0; + + for (TUint a = 0 ; a <= tableSize ; a++) + { + + if (Abs(aGainTable[a]-aNewGain) < minimum) + { + minimum = Abs(aGainTable[a]-aNewGain); + indexFound = static_cast(a); + } + } + + return indexFound; + + } + +TUint8 ProcTools::FindNewIndexVQ(TInt aNewGain, TInt aOldPitch, const TInt aGainTable[], TInt aTableSize) + { + + if (aTableSize > 256) + { + TAudPanic::Panic(TAudPanic::EInternal); + } + + TUint8 tableSize = static_cast(aTableSize-1); + + + + TInt minimum = KMaxTInt; + TUint8 indexFound = 0; + + for (TUint a = 0 ; a <= tableSize ; a+=2) + { + + // gpitch: Q14 , 2^14 = 16384 + TInt distance_pitch = (100*(Abs(aGainTable[a]-aOldPitch)))/16384; + + // g_fac: Q12 , 2^12 = 4096 + TInt distance_fc = (100*Abs(aGainTable[a+1]-aNewGain))/4096; + + + TInt distance = distance_pitch*distance_pitch + distance_fc*distance_fc; + + if (distance < minimum) + { + minimum = distance; + indexFound = static_cast(a); + } + } + + return static_cast(indexFound/2); + + } + +TUint8 ProcTools::FindNewIndexVQ2(TInt aNewGain, TInt aOldPitch, const TInt aGainTable[], TInt aTableSize) + { + + if (aTableSize > 256) + { + TAudPanic::Panic(TAudPanic::EInternal); + } + + TUint8 tableSize = static_cast(aTableSize-1); + + TInt minimum = KMaxTInt; + TUint8 indexFound = 0; + + for (TUint a = 0 ; a <= tableSize ; a+=2) + { + + // gpitch: Q14 , 2^14 = 16384 + TInt distance_pitch = (100*(Abs(aGainTable[a]-aOldPitch)))/16384; + + // g_fac: Q11 , 2^11 = 2048 + TInt distance_fc = (100*Abs(aGainTable[a+1]-aNewGain))/2048; + + + TInt distance = distance_pitch*distance_pitch + distance_fc*distance_fc; + + if (distance < minimum) + { + minimum = distance; + indexFound = static_cast(a); + } + } + + return static_cast(indexFound/2); + + + + + } + + +TUint8 ProcTools::FindNewIndex475VQ(TInt aNewGain0, TInt aOldPitch0, TInt aNewGain1, TInt aOldPitch1) + { + + TInt minimum = KMaxTInt; + TInt indexFound = -1; + + TInt tableSize = 256*4; + + + for (TInt a = 0 ; a < tableSize-3 ; a+=4) + { + + // gpitch: Q14 , 2^14 = 16384 + TInt distance_pitch0 = (100*(Abs(KAmrGainTable475[a]-aOldPitch0)))/16384; + TInt distance_pitch1 = (100*(Abs(KAmrGainTable475[a+2]-aOldPitch1)))/16384; + + // g_fac: Q12 , 2^12 = 4096 + TInt distance_fc0 = (100*Abs(KAmrGainTable475[a+1]-aNewGain0))/4096; + TInt distance_fc1 = (100*Abs(KAmrGainTable475[a+3]-aNewGain1))/4096; + + TInt distance = distance_pitch0*distance_pitch0 + distance_fc0*distance_fc0 + + distance_pitch1*distance_pitch1 + distance_fc1*distance_fc1; + + if (distance < minimum) + { + minimum = distance; + indexFound = a; + } + } + + return static_cast(indexFound/4); + + } + +TInt ProcTools::FindIndex(TInt aKey, const TInt aBitPositions[], TInt aTableLength) + { + + for (TInt a = 0 ; a < aTableLength ; a++) + { + if (aBitPositions[a] == aKey) return a; + } + + return -1; + + } + +TBool ProcTools::GenerateADTSHeaderL(TBuf8<7>& aHeader, TInt aFrameLength, TAudFileProperties aProperties) + { + TUint8 byte1 = 0xFF; + + TUint8 byte2 = 0x0; + if (aProperties.iAudioType == EAudAAC_MPEG2) + { + byte2 = 0xF9; + } + else if (aProperties.iAudioType == EAudAAC_MPEG4) + { + byte2 = 0xF1; + } + else return EFalse; + TBuf8<8> byte3b(8); + TBuf8<8> byte4b(8); + TBuf8<8> byte5b(8); + TBuf8<8> byte6b(8); + TBuf8<8> byte7b(8); + + byte3b.Fill('0'); + byte4b.Fill('0'); + byte5b.Fill('0'); + byte6b.Fill('0'); + byte7b.Fill('0'); + + + const TInt KAAC_SAMPLING_RATES[16] = {96000,88200,64000,48000,44100,32000,24000, + 22050,16000,12000,11025,8000,0,0,0,0}; + + TBool srFound = EFalse; + TUint8 srIndex = 0; + for (srIndex = 0 ; srIndex < 14 ; srIndex++) + { + if (KAAC_SAMPLING_RATES[srIndex] == aProperties.iSamplingRate) + { + srFound = ETrue; + break; + } + } + + if (srFound) + { + TBuf8<8> srB; + ProcTools::Dec2Bin(srIndex, srB); + + // Sampling rate + byte3b[2] = srB[4]; + byte3b[3] = srB[5]; + byte3b[4] = srB[6]; + byte3b[5] = srB[7]; + + } + + + + // private bit + byte3b[6] = '0'; + + // channel configuration + byte3b[7] = '0'; + if (aProperties.iChannelMode == EAudStereo) + { + byte4b[0] = '1'; + byte4b[1] = '0'; + + } + else if(aProperties.iChannelMode == EAudSingleChannel) + { + byte4b[0] = '0'; + byte4b[1] = '1'; + + } + else + { + return EFalse; + } + + //original/copy & home + byte4b[2] = '0'; + byte4b[3] = '0'; + // copyright identification & start + byte4b[4] = '0'; + byte4b[5] = '0'; + + HBufC8* lenBin = 0; + if (ProcTools::Dec2BinL(aFrameLength+7, lenBin)) + { + + TInt fromRight = 0; + for(TInt i = lenBin->Size()-1 ; i >= 0 ; i--) + { + if (fromRight < 3) + { + // byte7 + byte6b[2-fromRight] = lenBin->Des()[i]; + } + else if (fromRight < 11) + { + // byte6 + byte5b[10-fromRight] = lenBin->Des()[i]; + + } + else if (fromRight < 13) + { + // byte5 + byte4b[18-fromRight] = lenBin->Des()[i]; + } + + fromRight++; + } + + delete lenBin; + } + + TInt bitInd = 0; + for (bitInd = 3 ; bitInd < 8 ; bitInd++) + { + byte6b[bitInd] = '1'; + } + for (bitInd = 0 ; bitInd < 6 ; bitInd++) + { + byte7b[bitInd] = '1'; + } + + + aHeader.Append(byte1); + aHeader.Append(byte2); + + TUint tmpByte = 0; + ProcTools::Bin2Dec(byte3b, tmpByte); + + // profile + TUint8 bitMask = aProperties.iAACObjectType; + bitMask <<= 6; + tmpByte = tmpByte | bitMask; + + aHeader.Append(static_cast(tmpByte)); + + ProcTools::Bin2Dec(byte4b, tmpByte); + aHeader.Append(static_cast(tmpByte)); + + ProcTools::Bin2Dec(byte5b, tmpByte); + aHeader.Append(static_cast(tmpByte)); + + ProcTools::Bin2Dec(byte6b, tmpByte); + aHeader.Append(static_cast(tmpByte)); + + ProcTools::Bin2Dec(byte7b, tmpByte); + aHeader.Append(static_cast(tmpByte)); + + return ETrue; + + } + +TInt ProcTools::GetNextAMRFrameLength(const HBufC8* aFrame, TInt aPosNow) + { + + + if (aPosNow >= aFrame->Size()) return -1; + + + const TUint8 ch = (*aFrame)[aPosNow]; + + TUint dec_mode = (enum Mode)((ch & 0x0078) >> 3); + + switch (dec_mode) + { + case 0: + { + return 12+1; + } + + case 1: + { + return 13+1; + } + + case 2: + { + return 15+1; + } + + case 3: + { + return 17+1; + } + + case 4: + { + return 19+1; + } + + case 5: + { + return 20+1; + } + + case 6: + { + return 26+1; + } + + case 7: + { + return 31+1; + } + + case 8: + { + return 5+1; + } + + case 15: + { + return 0+1; + } + + default: + return 0+1; + + }; + + + } + + +CProcessingEvent* CProcessingEvent::NewL() + { + CProcessingEvent* self = new (ELeave) CProcessingEvent(); + CleanupStack::PushL(self); + self->ConstructL(); + CleanupStack::Pop(self); + return self; + + } + +void CProcessingEvent::ConstructL() + { + } + +CProcessingEvent::~CProcessingEvent() + { + iAllIndexes.Close(); + } + + +CProcessingEvent::CProcessingEvent() + { + } + +void CProcessingEvent::InsertIndex(TInt aIndex) + { + iAllIndexes.Append(aIndex); + } + +TInt CProcessingEvent::GetIndex(TInt aProcessingEventIndex) + { + return iAllIndexes[aProcessingEventIndex]; + } + +TBool CProcessingEvent::GetAllIndexes(RArray& aAllIndexes) + { + for (TInt a = 0 ; a < iAllIndexes.Count() ; a++) + { + aAllIndexes.Append(iAllIndexes[a]); + + } + return ETrue; + } + +TInt CProcessingEvent::IndexCount() + { + return iAllIndexes.Count(); + } + +TInt CProcessingEvent::FindIndex(TInt aClipIndex) + { + return iAllIndexes.Find(aClipIndex); + } + +void CProcessingEvent::RemoveIndex(TInt aProcessingEventIndex) + { + iAllIndexes.Remove(aProcessingEventIndex); + } + + +TInt CProcessingEvent::Compare(const CProcessingEvent& c1, const CProcessingEvent& c2) + { + + if (c1.iPosition > c2.iPosition) + { + return 1; + } + else if (c1.iPosition < c2.iPosition) + { + return -1; + } + else + { + return 0; + } + } + +