videoeditorengine/audioeditorengine/codecs/AMR/src/ProcAMRFrameHandler.cpp
changeset 0 951a5db380a0
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/videoeditorengine/audioeditorengine/codecs/AMR/src/ProcAMRFrameHandler.cpp	Fri Jan 29 14:08:33 2010 +0200
@@ -0,0 +1,895 @@
+/*
+* 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 "ProcAMRFrameHandler.h"
+#include "ProcFrameHandler.h"
+#include "ProcTools.h"
+
+#include <e32math.h>
+
+
+TBool CProcAMRFrameHandler::ManipulateGainL(const HBufC8* aFrameIn, HBufC8*& aFrameOut, TInt8 aGain) 
+{
+    
+    aFrameOut = HBufC8::NewLC(aFrameIn->Size());
+    
+    if (aFrameIn->Size() == 1) // noData element
+        {
+        aFrameOut->Des().Append(aFrameIn[0]);
+        CleanupStack::Pop(); // aFrameOut
+    
+        return ETrue;
+        }
+    
+
+    aGain = static_cast<TInt8>(aGain/2);
+    
+    
+    TInt posNow = 0;
+    TInt nextFrameLength = 1;
+    
+    while (nextFrameLength > 0)
+        {
+
+        nextFrameLength = GetNextFrameLength(aFrameIn, posNow);
+        if (nextFrameLength < 1) break;
+        
+        if (nextFrameLength + posNow > aFrameIn->Size())
+            {
+            // something wrong with the frame, return the original
+            aFrameOut->Des().Append(aFrameIn[0]);
+            CleanupStack::Pop(); // aFrameOut
+            return ETrue;
+            }
+        
+        HBufC8* tmpFrame = HBufC8::NewLC(nextFrameLength);
+        tmpFrame->Des().Copy(aFrameIn->Mid(posNow, nextFrameLength));
+
+        posNow += nextFrameLength;
+        
+        
+        const TUint8 ch = (*tmpFrame)[0];
+        
+        TUint dec_mode = (enum Mode)((ch & 0x0078) >> 3);
+        
+        TInt maxGain;
+        
+        RArray<TInt> gains;
+        GetAMRGains(tmpFrame, gains, maxGain);
+
+        
+        TInt gamma10000 = KAmrGain_dB2Gamma[aGain+127];
+        
+        TInt a = 0;
+        TInt old_gain, old_gain1 = 0;
+        TInt old_pitch, old_pitch1 = 0;
+        TInt new_gain, new_gain1 = 0;
+        TInt8 new_index = 0;
+        
+        
+        
+        switch (dec_mode){
+        case 0:
+            
+            for (a = 0; a < gains.Count()-1 ; a+=4) 
+            {
+                
+                old_gain = gains[a+1];
+                new_gain = static_cast<TInt>((gamma10000*old_gain)/10000);
+                old_pitch = gains[a];
+                
+                old_gain1 = gains[a+3];
+                new_gain1 = static_cast<TInt>((gamma10000*old_gain1)/10000);
+                old_pitch1 = gains[a+2];
+                
+                
+                new_index = ProcTools::FindNewIndex475VQ(new_gain, 
+                    old_pitch, 
+                    new_gain1, 
+                    old_pitch1);
+                
+                if (a == 0) 
+                {
+                    ProcTools::SetValueToShuffledFrame(tmpFrame, 
+                        new_index, 
+                        KAmrGains475_1_2, 
+                        8);
+                }
+                else if(a == 4) 
+                {
+                    ProcTools::SetValueToShuffledFrame(tmpFrame, 
+                        new_index, 
+                        KAmrGains475_3_4, 
+                        8);
+                }
+            }
+            
+            break;
+        case 1:
+            
+            for (a = 0; a < gains.Count()-1 ; a+=2) 
+            {
+                
+                old_gain = gains[a+1];
+                new_gain = static_cast<TInt>((gamma10000*old_gain)/10000);
+                old_pitch = gains[a];
+                
+                new_index = ProcTools::FindNewIndexVQ(new_gain, old_pitch, KAmrGainTable590, 128);
+                if (a == 0) ProcTools::SetValueToShuffledFrame(tmpFrame, new_index, KAmrGains515_1, 6);
+                else if (a == 2) ProcTools::SetValueToShuffledFrame(tmpFrame, new_index, KAmrGains515_2, 6);
+                else if (a == 4) ProcTools::SetValueToShuffledFrame(tmpFrame, new_index, KAmrGains515_3, 6);
+                else if (a == 6) ProcTools::SetValueToShuffledFrame(tmpFrame, new_index, KAmrGains515_4, 6);
+            }
+            
+            break;
+        case 2:
+
+            for (a = 0; a < gains.Count()-1 ; a+=2) 
+            {
+                
+                old_gain = gains[a+1];
+                new_gain = static_cast<TInt>((gamma10000*old_gain)/10000);
+                old_pitch = gains[a];
+                
+                new_index = ProcTools::FindNewIndexVQ(new_gain, old_pitch, KAmrGainTable590, 128);
+                if (a == 0) ProcTools::SetValueToShuffledFrame(tmpFrame, new_index, KAmrGains590_1, 6);
+                else if (a == 2) ProcTools::SetValueToShuffledFrame(tmpFrame, new_index, KAmrGains590_2, 6);
+                else if (a == 4) ProcTools::SetValueToShuffledFrame(tmpFrame, new_index, KAmrGains590_3, 6);
+                else if (a == 6) ProcTools::SetValueToShuffledFrame(tmpFrame, new_index, KAmrGains590_4, 6);
+            }
+            
+            break;
+        case 3:
+
+            for (a = 0; a < gains.Count()-1 ; a+=2) 
+            {
+                
+        
+                old_gain = gains[a+1];
+                new_gain = static_cast<TInt>((gamma10000*old_gain)/10000);
+                old_pitch = gains[a];
+                
+                new_index = ProcTools::FindNewIndexVQ(new_gain, old_pitch, KAmrGainTable102, 256);
+                if (a == 0) ProcTools::SetValueToShuffledFrame(tmpFrame, new_index, KAmrGains670_1, 7);
+                else if (a == 2) ProcTools::SetValueToShuffledFrame(tmpFrame, new_index, KAmrGains670_2, 7);
+                else if (a == 4) ProcTools::SetValueToShuffledFrame(tmpFrame, new_index, KAmrGains670_3, 7);
+                else if (a == 6) ProcTools::SetValueToShuffledFrame(tmpFrame, new_index, KAmrGains670_4, 7);
+            }
+            
+            break;
+        case 4:
+    
+            for (a = 0; a < gains.Count()-1 ; a+=2) 
+            {
+                
+                old_gain = gains[a+1];
+                new_gain = static_cast<TInt>((gamma10000*old_gain)/10000);
+                old_pitch = gains[a];
+                
+                new_index = ProcTools::FindNewIndexVQ(new_gain, old_pitch, KAmrGainTable102, 256);
+                if (a == 0) ProcTools::SetValueToShuffledFrame(tmpFrame, new_index, KAmrGains740_1, 7);
+                else if (a == 2) ProcTools::SetValueToShuffledFrame(tmpFrame, new_index, KAmrGains740_2, 7);
+                else if (a == 4) ProcTools::SetValueToShuffledFrame(tmpFrame, new_index, KAmrGains740_3, 7);
+                else if (a == 6) ProcTools::SetValueToShuffledFrame(tmpFrame, new_index, KAmrGains740_4, 7);
+            }
+            
+            break;
+        case 5:
+        
+            for (a = 0; a < gains.Count() ; a++) 
+            {
+                
+                old_gain = gains[a];
+                new_gain = static_cast<TInt>((gamma10000*old_gain)/10000);
+                
+                new_index = ProcTools::FindNewIndexSQ(new_gain, KAmrGainTable122, 32);
+                if (a == 0) ProcTools::SetValueToShuffledFrame(tmpFrame, new_index, KAmrGains795_1, 5);
+                else if (a == 1) ProcTools::SetValueToShuffledFrame(tmpFrame, new_index, KAmrGains795_2, 5);
+                else if (a == 2) ProcTools::SetValueToShuffledFrame(tmpFrame, new_index, KAmrGains795_3, 5);
+                else if (a == 3) ProcTools::SetValueToShuffledFrame(tmpFrame, new_index, KAmrGains795_4, 5);
+            }
+            
+            break;
+        case 6:
+    
+            
+            for (a = 0; a < gains.Count()-1 ; a+=2) 
+            {
+                
+                old_gain = gains[a+1];
+                new_gain = static_cast<TInt>((gamma10000*old_gain)/10000);
+                old_pitch = gains[a];
+                
+                new_index = ProcTools::FindNewIndexVQ(new_gain, old_pitch, KAmrGainTable102, 256);
+                if (a == 0) ProcTools::SetValueToShuffledFrame(tmpFrame, new_index, KAmrGains102_1, 7);
+                else if (a == 2) ProcTools::SetValueToShuffledFrame(tmpFrame, new_index, KAmrGains102_2, 7);
+                else if (a == 4) ProcTools::SetValueToShuffledFrame(tmpFrame, new_index, KAmrGains102_3, 7);
+                else if (a == 6) ProcTools::SetValueToShuffledFrame(tmpFrame, new_index, KAmrGains102_4, 7);
+            }
+            
+            break;
+            
+        case 7:
+        
+                        
+            for (a = 0; a < gains.Count() ; a++) 
+            {
+                
+                old_gain = gains[a];
+                new_gain = static_cast<TInt>((gamma10000*old_gain)/10000);
+                
+                new_index = ProcTools::FindNewIndexSQ(new_gain, KAmrGainTable122, 32);
+                if (a == 0) ProcTools::SetValueToShuffledFrame(tmpFrame, new_index, KAmrGains122_1, 5);
+                else if (a == 1) ProcTools::SetValueToShuffledFrame(tmpFrame, new_index, KAmrGains122_2, 5);
+                else if (a == 2) ProcTools::SetValueToShuffledFrame(tmpFrame, new_index, KAmrGains122_3, 5);
+                else if (a == 3) ProcTools::SetValueToShuffledFrame(tmpFrame, new_index, KAmrGains122_4, 5);
+            }
+            
+            break;
+        case 8:
+        
+            break;
+        case 15:
+        
+            break;
+        default:
+            
+            break;
+            };
+    
+    
+        gains.Reset();
+        aFrameOut->Des().Append(tmpFrame->Des());
+        CleanupStack::PopAndDestroy(tmpFrame);
+
+        }
+    CleanupStack::Pop(); // aFrameOut
+    
+    return ETrue;
+    }
+
+TBool CProcAMRFrameHandler::GetGainL(const HBufC8* aFrame, RArray<TInt>& aGains, TInt& aMaxGain) const
+    {
+    
+    TBool vectorQuant = EFalse;
+    
+	const TUint8 ch = (*aFrame)[0];
+
+	TUint dec_mode = (enum Mode)((ch & 0x0078) >> 3);
+	
+	TBool mode475 = EFalse;
+
+	switch (dec_mode)
+		{
+		case 0:
+
+			mode475 = ETrue;
+			vectorQuant = ETrue;
+			break;
+		
+		case 1:
+		case 2:
+		case 3:
+		case 4:
+		case 6:
+			vectorQuant = ETrue;
+			break;
+		
+		default:
+			break;
+		};
+
+
+	RArray<TInt> amrGains;
+	RArray<TInt> gpGains;
+
+	TInt maxGain = 0;
+	
+	TReal b[4] = {0.68, 0.58, 0.34, 0.19};
+
+
+	if (aFrame->Size() < 10)
+
+		{
+		// SID or no data
+		for (TInt r = 0; r < 4 ; r++)
+			{
+			iPreviousRn[r] = 0;
+			
+			iPreviousEnergy = 0;
+			
+			
+			}
+
+		aGains.Append(0);
+		aMaxGain = 1;
+        return ETrue;
+		}
+
+	GetAMRGains(aFrame, amrGains, maxGain);
+	GetGPGains(aFrame, gpGains);
+
+	TInt gains = 4;
+	if (mode475)
+		{
+		gains = 2;
+		}
+
+	for (TInt subFrame = 0 ; subFrame < gains ; subFrame++)
+		{
+
+		// calculate gc (fixed codebook gain) ------------------------->
+
+		TReal currentGamma = 0;
+		if (vectorQuant)
+			{
+			currentGamma = (TReal)(amrGains[subFrame*2+1])/4096.0; // Q12, 2^12 = 4096
+			}
+		else
+			{
+			currentGamma = (TReal)(amrGains[subFrame])/4096.0; 
+			}
+
+		TReal E = iPreviousRn[3]*b[0]+iPreviousRn[2]*b[1]+iPreviousRn[1]*b[2]+iPreviousRn[0]*b[3];
+		
+		TReal logGamma = 0;
+		Math::Log(logGamma, currentGamma);
+		TReal R = 20 * logGamma;
+
+		TReal gcPred = 0; //g'c
+		Math::Pow10(gcPred, 0.05*E);
+		TReal gc = gcPred*currentGamma;
+
+
+		// update previous R(n) values --------->
+		for (TInt re = 0; re < 3 ; re++)
+			{
+			iPreviousRn[re] = iPreviousRn[re+1];
+			}
+		iPreviousRn[3] = R;
+		// <---------- update ends
+
+		// <---------- gc calculated
+
+		// calculate energy from adaptive codebook ------------->
+		
+		TReal currentGp = 0;
+		
+		if (vectorQuant)
+			{
+			currentGp = (TReal)(amrGains[subFrame*2])/16384.0; // Q14 = 2^14 = 16384
+			}
+		else
+			{
+			currentGp = (TReal)(gpGains[subFrame])/16384.0; // Q14, 2^13 = 8192
+			}
+
+
+		TReal energyFromAdaptiveCB = (iPreviousEnergy*currentGp)/2;
+
+		// <----------------------- energy from adaptive codebook calculated
+
+		TReal totalEnergy = energyFromAdaptiveCB+(gc*45);
+
+		iPreviousEnergy = totalEnergy;
+
+		TReal logTotalEnergy = 0;
+		
+		if (totalEnergy < 1) totalEnergy = 1;
+		
+		Math::Log(logTotalEnergy, totalEnergy);
+		
+		if (logTotalEnergy > 3.5) 
+		    {
+		    logTotalEnergy = 3.5;
+		    }
+		
+		aGains.Append(logTotalEnergy*100);
+
+        const TInt KMaxGain = 350;
+
+        aMaxGain = KMaxGain;
+        
+        
+		}
+		
+		
+	amrGains.Reset();	
+	gpGains.Reset();
+	return ETrue;
+    }
+
+
+TBool CProcAMRFrameHandler::GetNormalizingMargin(const HBufC8* aFrame, TInt8& aMargin) const
+
+    {
+        
+    const TUint8 ch = (*aFrame)[0];
+
+    TUint dec_mode = (enum Mode)((ch & 0x0078) >> 3);
+    RArray<TInt> gains;
+    
+    TInt error = KErrNone;
+    TRAP(error, CleanupClosePushL(gains) );
+    
+    if (error != KErrNone)
+        return EFalse;
+    
+    TInt gamma10000 = 1;
+    TInt largestGain = 1;
+    TInt a = 0;
+    TInt maxGain;
+
+        switch (dec_mode)
+        {
+        case 0:
+        
+            GetAMRGains(aFrame, gains, maxGain);
+
+            for (a = 1 ; a < gains.Count() ; a+=2)
+                {
+                if (gains[a] > largestGain) 
+                    {
+                    largestGain = gains[a];
+                    }
+
+                }
+
+            gamma10000 = (KAmrLargestGain475*10000)/largestGain;
+
+            break;
+        case 1:
+        case 2:
+
+            // bitrates 515, 590
+            GetAMRGains(aFrame, gains, maxGain);
+            
+            for (a = 1 ; a < gains.Count() ; a+=2)
+                {
+                if (gains[a] > largestGain) 
+                    {
+                    largestGain = gains[a];
+                    }
+
+                }
+            gamma10000 = (KAmrLargestGain590*10000)/largestGain;
+
+
+            break;
+        case 3:
+        case 4:
+        case 6:
+            // bitRate = 670, 740, 1020;
+            GetAMRGains(aFrame, gains, maxGain);
+            
+            for (a = 1 ; a < gains.Count() ; a+=2)
+                {
+                if (gains[a] > largestGain) 
+                    {
+                    largestGain = gains[a];
+                    }
+
+                }
+            gamma10000 = (KAmrLargestGain102*10000)/largestGain;
+
+            break;
+        case 5:
+        case 7:
+            //bitRate = 795 & 12.2
+            GetAMRGains(aFrame, gains, maxGain);
+        
+            
+            for (a = 0 ; a < gains.Count() ; a++)
+                {
+                if (gains[a] > largestGain) 
+                    {
+                    largestGain = gains[a];
+                    }
+
+                }
+            gamma10000 = (KAmrLargestGain122*10000)/largestGain;
+
+
+            break;
+        
+        case 8:
+            
+        case 15:
+            
+        default:
+            aMargin = 100;
+            return ETrue;
+            
+        };
+
+
+    CleanupStack::PopAndDestroy(&gains);
+
+    TUint8 newIndex = ProcTools::FindNewIndexSQ(gamma10000, KAmrGain_dB2Gamma, 256);
+
+    TInt8 newGain = static_cast<TInt8>(newIndex-127); 
+
+
+    if (newGain > 63)
+        {
+        newGain = 63;
+        }
+    else if (newGain < -63)
+        {
+        newGain = -63;
+        }
+
+    aMargin = static_cast<TInt8>(newGain*2);
+    // aMargin is now in dB/2:s
+    return ETrue;
+
+
+    }
+
+CProcAMRFrameHandler::~CProcAMRFrameHandler() 
+    {
+
+    }
+
+CProcAMRFrameHandler* CProcAMRFrameHandler::NewL() 
+    {
+
+    
+    CProcAMRFrameHandler* self = NewLC();
+    CleanupStack::Pop(self);
+    return self;
+
+    }
+CProcAMRFrameHandler* CProcAMRFrameHandler::NewLC() 
+    {
+
+    CProcAMRFrameHandler* self = new (ELeave) CProcAMRFrameHandler();
+    CleanupStack::PushL(self);
+    self->ConstructL();
+    return self;
+
+    }
+
+void CProcAMRFrameHandler::ConstructL() 
+    {
+
+
+    }
+
+CProcAMRFrameHandler::CProcAMRFrameHandler()
+    {
+
+    }
+ 
+TBool CProcAMRFrameHandler::GetAMRGains(const HBufC8* aFrame, 
+                                        RArray<TInt>& aGains, 
+                                        TInt& aMaxGain) const
+
+    {
+
+    
+    const TUint8 ch = (*aFrame)[0];
+
+    TUint dec_mode = (enum Mode)((ch & 0x0078) >> 3);
+    TInt gainIndex = 0;
+    
+
+        switch (dec_mode)
+        {
+        case 0:
+//            bitRate = 475;
+            
+            gainIndex = ProcTools::GetValueFromShuffledFrame(aFrame, KAmrGains475_1_2, 8);
+            aGains.Append(KAmrGainTable475[gainIndex*4]);
+            aGains.Append(KAmrGainTable475[gainIndex*4+1]);
+            aGains.Append(KAmrGainTable475[gainIndex*4+2]);
+            aGains.Append(KAmrGainTable475[gainIndex*4+3]);
+
+            gainIndex = ProcTools::GetValueFromShuffledFrame(aFrame, KAmrGains475_3_4, 8);
+            aGains.Append(KAmrGainTable475[gainIndex*4]);
+            aGains.Append(KAmrGainTable475[gainIndex*4+1]);
+            aGains.Append(KAmrGainTable475[gainIndex*4+2]);
+            aGains.Append(KAmrGainTable475[gainIndex*4+3]);
+
+            break;
+        case 1:
+//            bitRate = 515;
+
+            gainIndex = ProcTools::GetValueFromShuffledFrame(aFrame, KAmrGains515_1, 6);
+            aGains.Append(KAmrGainTable590[gainIndex*2]);
+            aGains.Append(KAmrGainTable590[gainIndex*2+1]);
+
+            gainIndex = ProcTools::GetValueFromShuffledFrame(aFrame, KAmrGains515_2, 6);
+            aGains.Append(KAmrGainTable590[gainIndex*2]);
+            aGains.Append(KAmrGainTable590[gainIndex*2+1]);
+
+            gainIndex = ProcTools::GetValueFromShuffledFrame(aFrame, KAmrGains515_3, 6);
+            aGains.Append(KAmrGainTable590[gainIndex*2]);
+            aGains.Append(KAmrGainTable590[gainIndex*2+1]);
+
+            gainIndex = ProcTools::GetValueFromShuffledFrame(aFrame, KAmrGains515_4, 6);
+            aGains.Append(KAmrGainTable590[gainIndex*2]);
+            aGains.Append(KAmrGainTable590[gainIndex*2+1]);
+            break;
+        case 2:
+//            bitRate = 590;
+
+            gainIndex = ProcTools::GetValueFromShuffledFrame(aFrame, KAmrGains590_1, 6);
+            aGains.Append(KAmrGainTable590[gainIndex*2]);
+            aGains.Append(KAmrGainTable590[gainIndex*2+1]);
+
+            gainIndex = ProcTools::GetValueFromShuffledFrame(aFrame, KAmrGains590_2, 6);
+            aGains.Append(KAmrGainTable590[gainIndex*2]);
+            aGains.Append(KAmrGainTable590[gainIndex*2+1]);
+
+            gainIndex = ProcTools::GetValueFromShuffledFrame(aFrame, KAmrGains590_3, 6);
+            aGains.Append(KAmrGainTable590[gainIndex*2]);
+            aGains.Append(KAmrGainTable590[gainIndex*2+1]);
+
+            gainIndex = ProcTools::GetValueFromShuffledFrame(aFrame, KAmrGains590_4, 6);
+            aGains.Append(KAmrGainTable590[gainIndex*2]);
+            aGains.Append(KAmrGainTable590[gainIndex*2+1]);
+
+            break;
+        case 3:
+//            bitRate = 670;
+
+            gainIndex = ProcTools::GetValueFromShuffledFrame(aFrame, KAmrGains670_1, 7);
+            aGains.Append(KAmrGainTable102[gainIndex*2]);
+            aGains.Append(KAmrGainTable102[gainIndex*2+1]);
+
+            gainIndex = ProcTools::GetValueFromShuffledFrame(aFrame, KAmrGains670_2, 7);
+            aGains.Append(KAmrGainTable102[gainIndex*2]);
+            aGains.Append(KAmrGainTable102[gainIndex*2+1]);
+
+            gainIndex = ProcTools::GetValueFromShuffledFrame(aFrame, KAmrGains670_3, 7);
+            aGains.Append(KAmrGainTable102[gainIndex*2]);
+            aGains.Append(KAmrGainTable102[gainIndex*2+1]);
+
+            gainIndex = ProcTools::GetValueFromShuffledFrame(aFrame, KAmrGains670_4, 7);
+            aGains.Append(KAmrGainTable102[gainIndex*2]);
+            aGains.Append(KAmrGainTable102[gainIndex*2+1]);
+
+            break;
+        case 4:
+//            bitRate = 740;
+
+            gainIndex = ProcTools::GetValueFromShuffledFrame(aFrame, KAmrGains740_1, 7);
+            aGains.Append(KAmrGainTable102[gainIndex*2]);
+            aGains.Append(KAmrGainTable102[gainIndex*2+1]);
+
+            gainIndex = ProcTools::GetValueFromShuffledFrame(aFrame, KAmrGains740_2, 7);
+            aGains.Append(KAmrGainTable102[gainIndex*2]);
+            aGains.Append(KAmrGainTable102[gainIndex*2+1]);
+
+            gainIndex = ProcTools::GetValueFromShuffledFrame(aFrame, KAmrGains740_3, 7);
+            aGains.Append(KAmrGainTable102[gainIndex*2]);
+            aGains.Append(KAmrGainTable102[gainIndex*2+1]);
+
+            gainIndex = ProcTools::GetValueFromShuffledFrame(aFrame, KAmrGains740_4, 7);
+            aGains.Append(KAmrGainTable102[gainIndex*2]);
+            aGains.Append(KAmrGainTable102[gainIndex*2+1]);
+
+            break;
+        case 5:
+//            bitRate = 795;
+            
+            gainIndex = ProcTools::GetValueFromShuffledFrame(aFrame, KAmrGains795_1, 5);
+            aGains.Append(KAmrGainTable122[gainIndex]);
+
+            gainIndex = ProcTools::GetValueFromShuffledFrame(aFrame, KAmrGains795_2, 5);
+            aGains.Append(KAmrGainTable122[gainIndex]);
+
+            gainIndex = ProcTools::GetValueFromShuffledFrame(aFrame, KAmrGains795_3, 5);
+            aGains.Append(KAmrGainTable122[gainIndex]);
+
+            gainIndex = ProcTools::GetValueFromShuffledFrame(aFrame, KAmrGains795_4, 5);
+            aGains.Append(KAmrGainTable122[gainIndex]);
+                
+            break;
+        case 6:
+//            bitRate = 1020;
+
+            gainIndex = ProcTools::GetValueFromShuffledFrame(aFrame, KAmrGains102_1, 7);
+            aGains.Append(KAmrGainTable102[gainIndex*2]);
+            aGains.Append(KAmrGainTable102[gainIndex*2+1]);
+
+            gainIndex = ProcTools::GetValueFromShuffledFrame(aFrame, KAmrGains102_2, 7);
+            aGains.Append(KAmrGainTable102[gainIndex*2]);
+            aGains.Append(KAmrGainTable102[gainIndex*2+1]);
+
+            gainIndex = ProcTools::GetValueFromShuffledFrame(aFrame, KAmrGains102_3, 7);
+            aGains.Append(KAmrGainTable102[gainIndex*2]);
+            aGains.Append(KAmrGainTable102[gainIndex*2+1]);
+
+            gainIndex = ProcTools::GetValueFromShuffledFrame(aFrame, KAmrGains102_4, 7);
+            aGains.Append(KAmrGainTable102[gainIndex*2]);
+            aGains.Append(KAmrGainTable102[gainIndex*2+1]);
+
+            break;
+        case 7:
+//            bitRate = 1220;
+                
+            gainIndex = ProcTools::GetValueFromShuffledFrame(aFrame, KAmrGains122_1, 5);
+            aGains.Append(KAmrGainTable122[gainIndex]);
+
+            gainIndex = ProcTools::GetValueFromShuffledFrame(aFrame, KAmrGains122_2, 5);
+            aGains.Append(KAmrGainTable122[gainIndex]);
+
+            gainIndex = ProcTools::GetValueFromShuffledFrame(aFrame, KAmrGains122_3, 5);
+            aGains.Append(KAmrGainTable122[gainIndex]);
+
+            gainIndex = ProcTools::GetValueFromShuffledFrame(aFrame, KAmrGains122_4, 5);
+            aGains.Append(KAmrGainTable122[gainIndex]);
+                
+                
+            break;
+        case 8:
+//            bitRate = 0;
+            break;
+        case 15:
+//            bitRate = 0;
+            break;
+        default:
+//            bitRate = 0;
+            break;
+        };
+
+
+    aMaxGain = KAmrLargestGain102;
+
+    return ETrue;
+
+
+    }
+
+TInt CProcAMRFrameHandler::GetNextFrameLength(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;
+            }
+            
+        default:
+            return 0+1;
+            
+        };
+    
+
+    }
+    
+
+TBool CProcAMRFrameHandler::GetGPGains(const HBufC8* aFrame, 
+										RArray<TInt>& aGains) const
+
+	{
+
+	
+	const TUint8 ch = (*aFrame)[0];
+
+	TUint dec_mode = (enum Mode)((ch & 0x0078) >> 3);
+	TInt gainIndex = 0;
+	
+
+		switch (dec_mode)
+		{
+		
+		case 7:
+//			bitRate = 1220;
+				
+			gainIndex = ProcTools::GetValueFromShuffledFrame(aFrame, KAmrGPGains122_1, 4);
+			aGains.Append(KAmrGPTable[gainIndex]);
+
+			gainIndex = ProcTools::GetValueFromShuffledFrame(aFrame, KAmrGPGains122_2, 4);
+			aGains.Append(KAmrGPTable[gainIndex]);
+
+			gainIndex = ProcTools::GetValueFromShuffledFrame(aFrame, KAmrGPGains122_3, 4);
+			aGains.Append(KAmrGPTable[gainIndex]);
+
+			gainIndex = ProcTools::GetValueFromShuffledFrame(aFrame, KAmrGPGains122_4, 4);
+			aGains.Append(KAmrGPTable[gainIndex]);
+				
+				
+			break;
+
+		case 5:
+		// 7.95
+			gainIndex = ProcTools::GetValueFromShuffledFrame(aFrame, KAmrGPGains795_1, 4);
+			aGains.Append(KAmrGPTable[gainIndex]);
+
+			gainIndex = ProcTools::GetValueFromShuffledFrame(aFrame, KAmrGPGains795_2, 4);
+			aGains.Append(KAmrGPTable[gainIndex]);
+
+			gainIndex = ProcTools::GetValueFromShuffledFrame(aFrame, KAmrGPGains795_3, 4);
+			aGains.Append(KAmrGPTable[gainIndex]);
+
+			gainIndex = ProcTools::GetValueFromShuffledFrame(aFrame, KAmrGPGains795_4, 4);
+			aGains.Append(KAmrGPTable[gainIndex]);
+			break;
+
+
+
+		default:
+//			return EFalse;
+			break;
+		};
+
+
+	return ETrue;
+
+
+	}