videoeditorengine/audioeditorengine/codecs/AMR/src/ProcAMRFrameHandler.cpp
changeset 0 951a5db380a0
equal deleted inserted replaced
-1:000000000000 0:951a5db380a0
       
     1 /*
       
     2 * Copyright (c) 2010 Ixonos Plc.
       
     3 * All rights reserved.
       
     4 * This component and the accompanying materials are made available
       
     5 * under the terms of the "Eclipse Public License v1.0"
       
     6 * which accompanies this distribution, and is available
       
     7 * at the URL "http://www.eclipse.org/legal/epl-v10.html".
       
     8 *
       
     9 * Initial Contributors:
       
    10 * Nokia Corporation - Initial contribution
       
    11 *
       
    12 * Contributors:
       
    13 * Ixonos Plc
       
    14 *
       
    15 * Description:  
       
    16 *
       
    17 */
       
    18 
       
    19 
       
    20 
       
    21 
       
    22 #include "ProcAMRFrameHandler.h"
       
    23 #include "ProcFrameHandler.h"
       
    24 #include "ProcTools.h"
       
    25 
       
    26 #include <e32math.h>
       
    27 
       
    28 
       
    29 TBool CProcAMRFrameHandler::ManipulateGainL(const HBufC8* aFrameIn, HBufC8*& aFrameOut, TInt8 aGain) 
       
    30 {
       
    31     
       
    32     aFrameOut = HBufC8::NewLC(aFrameIn->Size());
       
    33     
       
    34     if (aFrameIn->Size() == 1) // noData element
       
    35         {
       
    36         aFrameOut->Des().Append(aFrameIn[0]);
       
    37         CleanupStack::Pop(); // aFrameOut
       
    38     
       
    39         return ETrue;
       
    40         }
       
    41     
       
    42 
       
    43     aGain = static_cast<TInt8>(aGain/2);
       
    44     
       
    45     
       
    46     TInt posNow = 0;
       
    47     TInt nextFrameLength = 1;
       
    48     
       
    49     while (nextFrameLength > 0)
       
    50         {
       
    51 
       
    52         nextFrameLength = GetNextFrameLength(aFrameIn, posNow);
       
    53         if (nextFrameLength < 1) break;
       
    54         
       
    55         if (nextFrameLength + posNow > aFrameIn->Size())
       
    56             {
       
    57             // something wrong with the frame, return the original
       
    58             aFrameOut->Des().Append(aFrameIn[0]);
       
    59             CleanupStack::Pop(); // aFrameOut
       
    60             return ETrue;
       
    61             }
       
    62         
       
    63         HBufC8* tmpFrame = HBufC8::NewLC(nextFrameLength);
       
    64         tmpFrame->Des().Copy(aFrameIn->Mid(posNow, nextFrameLength));
       
    65 
       
    66         posNow += nextFrameLength;
       
    67         
       
    68         
       
    69         const TUint8 ch = (*tmpFrame)[0];
       
    70         
       
    71         TUint dec_mode = (enum Mode)((ch & 0x0078) >> 3);
       
    72         
       
    73         TInt maxGain;
       
    74         
       
    75         RArray<TInt> gains;
       
    76         GetAMRGains(tmpFrame, gains, maxGain);
       
    77 
       
    78         
       
    79         TInt gamma10000 = KAmrGain_dB2Gamma[aGain+127];
       
    80         
       
    81         TInt a = 0;
       
    82         TInt old_gain, old_gain1 = 0;
       
    83         TInt old_pitch, old_pitch1 = 0;
       
    84         TInt new_gain, new_gain1 = 0;
       
    85         TInt8 new_index = 0;
       
    86         
       
    87         
       
    88         
       
    89         switch (dec_mode){
       
    90         case 0:
       
    91             
       
    92             for (a = 0; a < gains.Count()-1 ; a+=4) 
       
    93             {
       
    94                 
       
    95                 old_gain = gains[a+1];
       
    96                 new_gain = static_cast<TInt>((gamma10000*old_gain)/10000);
       
    97                 old_pitch = gains[a];
       
    98                 
       
    99                 old_gain1 = gains[a+3];
       
   100                 new_gain1 = static_cast<TInt>((gamma10000*old_gain1)/10000);
       
   101                 old_pitch1 = gains[a+2];
       
   102                 
       
   103                 
       
   104                 new_index = ProcTools::FindNewIndex475VQ(new_gain, 
       
   105                     old_pitch, 
       
   106                     new_gain1, 
       
   107                     old_pitch1);
       
   108                 
       
   109                 if (a == 0) 
       
   110                 {
       
   111                     ProcTools::SetValueToShuffledFrame(tmpFrame, 
       
   112                         new_index, 
       
   113                         KAmrGains475_1_2, 
       
   114                         8);
       
   115                 }
       
   116                 else if(a == 4) 
       
   117                 {
       
   118                     ProcTools::SetValueToShuffledFrame(tmpFrame, 
       
   119                         new_index, 
       
   120                         KAmrGains475_3_4, 
       
   121                         8);
       
   122                 }
       
   123             }
       
   124             
       
   125             break;
       
   126         case 1:
       
   127             
       
   128             for (a = 0; a < gains.Count()-1 ; a+=2) 
       
   129             {
       
   130                 
       
   131                 old_gain = gains[a+1];
       
   132                 new_gain = static_cast<TInt>((gamma10000*old_gain)/10000);
       
   133                 old_pitch = gains[a];
       
   134                 
       
   135                 new_index = ProcTools::FindNewIndexVQ(new_gain, old_pitch, KAmrGainTable590, 128);
       
   136                 if (a == 0) ProcTools::SetValueToShuffledFrame(tmpFrame, new_index, KAmrGains515_1, 6);
       
   137                 else if (a == 2) ProcTools::SetValueToShuffledFrame(tmpFrame, new_index, KAmrGains515_2, 6);
       
   138                 else if (a == 4) ProcTools::SetValueToShuffledFrame(tmpFrame, new_index, KAmrGains515_3, 6);
       
   139                 else if (a == 6) ProcTools::SetValueToShuffledFrame(tmpFrame, new_index, KAmrGains515_4, 6);
       
   140             }
       
   141             
       
   142             break;
       
   143         case 2:
       
   144 
       
   145             for (a = 0; a < gains.Count()-1 ; a+=2) 
       
   146             {
       
   147                 
       
   148                 old_gain = gains[a+1];
       
   149                 new_gain = static_cast<TInt>((gamma10000*old_gain)/10000);
       
   150                 old_pitch = gains[a];
       
   151                 
       
   152                 new_index = ProcTools::FindNewIndexVQ(new_gain, old_pitch, KAmrGainTable590, 128);
       
   153                 if (a == 0) ProcTools::SetValueToShuffledFrame(tmpFrame, new_index, KAmrGains590_1, 6);
       
   154                 else if (a == 2) ProcTools::SetValueToShuffledFrame(tmpFrame, new_index, KAmrGains590_2, 6);
       
   155                 else if (a == 4) ProcTools::SetValueToShuffledFrame(tmpFrame, new_index, KAmrGains590_3, 6);
       
   156                 else if (a == 6) ProcTools::SetValueToShuffledFrame(tmpFrame, new_index, KAmrGains590_4, 6);
       
   157             }
       
   158             
       
   159             break;
       
   160         case 3:
       
   161 
       
   162             for (a = 0; a < gains.Count()-1 ; a+=2) 
       
   163             {
       
   164                 
       
   165         
       
   166                 old_gain = gains[a+1];
       
   167                 new_gain = static_cast<TInt>((gamma10000*old_gain)/10000);
       
   168                 old_pitch = gains[a];
       
   169                 
       
   170                 new_index = ProcTools::FindNewIndexVQ(new_gain, old_pitch, KAmrGainTable102, 256);
       
   171                 if (a == 0) ProcTools::SetValueToShuffledFrame(tmpFrame, new_index, KAmrGains670_1, 7);
       
   172                 else if (a == 2) ProcTools::SetValueToShuffledFrame(tmpFrame, new_index, KAmrGains670_2, 7);
       
   173                 else if (a == 4) ProcTools::SetValueToShuffledFrame(tmpFrame, new_index, KAmrGains670_3, 7);
       
   174                 else if (a == 6) ProcTools::SetValueToShuffledFrame(tmpFrame, new_index, KAmrGains670_4, 7);
       
   175             }
       
   176             
       
   177             break;
       
   178         case 4:
       
   179     
       
   180             for (a = 0; a < gains.Count()-1 ; a+=2) 
       
   181             {
       
   182                 
       
   183                 old_gain = gains[a+1];
       
   184                 new_gain = static_cast<TInt>((gamma10000*old_gain)/10000);
       
   185                 old_pitch = gains[a];
       
   186                 
       
   187                 new_index = ProcTools::FindNewIndexVQ(new_gain, old_pitch, KAmrGainTable102, 256);
       
   188                 if (a == 0) ProcTools::SetValueToShuffledFrame(tmpFrame, new_index, KAmrGains740_1, 7);
       
   189                 else if (a == 2) ProcTools::SetValueToShuffledFrame(tmpFrame, new_index, KAmrGains740_2, 7);
       
   190                 else if (a == 4) ProcTools::SetValueToShuffledFrame(tmpFrame, new_index, KAmrGains740_3, 7);
       
   191                 else if (a == 6) ProcTools::SetValueToShuffledFrame(tmpFrame, new_index, KAmrGains740_4, 7);
       
   192             }
       
   193             
       
   194             break;
       
   195         case 5:
       
   196         
       
   197             for (a = 0; a < gains.Count() ; a++) 
       
   198             {
       
   199                 
       
   200                 old_gain = gains[a];
       
   201                 new_gain = static_cast<TInt>((gamma10000*old_gain)/10000);
       
   202                 
       
   203                 new_index = ProcTools::FindNewIndexSQ(new_gain, KAmrGainTable122, 32);
       
   204                 if (a == 0) ProcTools::SetValueToShuffledFrame(tmpFrame, new_index, KAmrGains795_1, 5);
       
   205                 else if (a == 1) ProcTools::SetValueToShuffledFrame(tmpFrame, new_index, KAmrGains795_2, 5);
       
   206                 else if (a == 2) ProcTools::SetValueToShuffledFrame(tmpFrame, new_index, KAmrGains795_3, 5);
       
   207                 else if (a == 3) ProcTools::SetValueToShuffledFrame(tmpFrame, new_index, KAmrGains795_4, 5);
       
   208             }
       
   209             
       
   210             break;
       
   211         case 6:
       
   212     
       
   213             
       
   214             for (a = 0; a < gains.Count()-1 ; a+=2) 
       
   215             {
       
   216                 
       
   217                 old_gain = gains[a+1];
       
   218                 new_gain = static_cast<TInt>((gamma10000*old_gain)/10000);
       
   219                 old_pitch = gains[a];
       
   220                 
       
   221                 new_index = ProcTools::FindNewIndexVQ(new_gain, old_pitch, KAmrGainTable102, 256);
       
   222                 if (a == 0) ProcTools::SetValueToShuffledFrame(tmpFrame, new_index, KAmrGains102_1, 7);
       
   223                 else if (a == 2) ProcTools::SetValueToShuffledFrame(tmpFrame, new_index, KAmrGains102_2, 7);
       
   224                 else if (a == 4) ProcTools::SetValueToShuffledFrame(tmpFrame, new_index, KAmrGains102_3, 7);
       
   225                 else if (a == 6) ProcTools::SetValueToShuffledFrame(tmpFrame, new_index, KAmrGains102_4, 7);
       
   226             }
       
   227             
       
   228             break;
       
   229             
       
   230         case 7:
       
   231         
       
   232                         
       
   233             for (a = 0; a < gains.Count() ; a++) 
       
   234             {
       
   235                 
       
   236                 old_gain = gains[a];
       
   237                 new_gain = static_cast<TInt>((gamma10000*old_gain)/10000);
       
   238                 
       
   239                 new_index = ProcTools::FindNewIndexSQ(new_gain, KAmrGainTable122, 32);
       
   240                 if (a == 0) ProcTools::SetValueToShuffledFrame(tmpFrame, new_index, KAmrGains122_1, 5);
       
   241                 else if (a == 1) ProcTools::SetValueToShuffledFrame(tmpFrame, new_index, KAmrGains122_2, 5);
       
   242                 else if (a == 2) ProcTools::SetValueToShuffledFrame(tmpFrame, new_index, KAmrGains122_3, 5);
       
   243                 else if (a == 3) ProcTools::SetValueToShuffledFrame(tmpFrame, new_index, KAmrGains122_4, 5);
       
   244             }
       
   245             
       
   246             break;
       
   247         case 8:
       
   248         
       
   249             break;
       
   250         case 15:
       
   251         
       
   252             break;
       
   253         default:
       
   254             
       
   255             break;
       
   256             };
       
   257     
       
   258     
       
   259         gains.Reset();
       
   260         aFrameOut->Des().Append(tmpFrame->Des());
       
   261         CleanupStack::PopAndDestroy(tmpFrame);
       
   262 
       
   263         }
       
   264     CleanupStack::Pop(); // aFrameOut
       
   265     
       
   266     return ETrue;
       
   267     }
       
   268 
       
   269 TBool CProcAMRFrameHandler::GetGainL(const HBufC8* aFrame, RArray<TInt>& aGains, TInt& aMaxGain) const
       
   270     {
       
   271     
       
   272     TBool vectorQuant = EFalse;
       
   273     
       
   274 	const TUint8 ch = (*aFrame)[0];
       
   275 
       
   276 	TUint dec_mode = (enum Mode)((ch & 0x0078) >> 3);
       
   277 	
       
   278 	TBool mode475 = EFalse;
       
   279 
       
   280 	switch (dec_mode)
       
   281 		{
       
   282 		case 0:
       
   283 
       
   284 			mode475 = ETrue;
       
   285 			vectorQuant = ETrue;
       
   286 			break;
       
   287 		
       
   288 		case 1:
       
   289 		case 2:
       
   290 		case 3:
       
   291 		case 4:
       
   292 		case 6:
       
   293 			vectorQuant = ETrue;
       
   294 			break;
       
   295 		
       
   296 		default:
       
   297 			break;
       
   298 		};
       
   299 
       
   300 
       
   301 	RArray<TInt> amrGains;
       
   302 	RArray<TInt> gpGains;
       
   303 
       
   304 	TInt maxGain = 0;
       
   305 	
       
   306 	TReal b[4] = {0.68, 0.58, 0.34, 0.19};
       
   307 
       
   308 
       
   309 	if (aFrame->Size() < 10)
       
   310 
       
   311 		{
       
   312 		// SID or no data
       
   313 		for (TInt r = 0; r < 4 ; r++)
       
   314 			{
       
   315 			iPreviousRn[r] = 0;
       
   316 			
       
   317 			iPreviousEnergy = 0;
       
   318 			
       
   319 			
       
   320 			}
       
   321 
       
   322 		aGains.Append(0);
       
   323 		aMaxGain = 1;
       
   324         return ETrue;
       
   325 		}
       
   326 
       
   327 	GetAMRGains(aFrame, amrGains, maxGain);
       
   328 	GetGPGains(aFrame, gpGains);
       
   329 
       
   330 	TInt gains = 4;
       
   331 	if (mode475)
       
   332 		{
       
   333 		gains = 2;
       
   334 		}
       
   335 
       
   336 	for (TInt subFrame = 0 ; subFrame < gains ; subFrame++)
       
   337 		{
       
   338 
       
   339 		// calculate gc (fixed codebook gain) ------------------------->
       
   340 
       
   341 		TReal currentGamma = 0;
       
   342 		if (vectorQuant)
       
   343 			{
       
   344 			currentGamma = (TReal)(amrGains[subFrame*2+1])/4096.0; // Q12, 2^12 = 4096
       
   345 			}
       
   346 		else
       
   347 			{
       
   348 			currentGamma = (TReal)(amrGains[subFrame])/4096.0; 
       
   349 			}
       
   350 
       
   351 		TReal E = iPreviousRn[3]*b[0]+iPreviousRn[2]*b[1]+iPreviousRn[1]*b[2]+iPreviousRn[0]*b[3];
       
   352 		
       
   353 		TReal logGamma = 0;
       
   354 		Math::Log(logGamma, currentGamma);
       
   355 		TReal R = 20 * logGamma;
       
   356 
       
   357 		TReal gcPred = 0; //g'c
       
   358 		Math::Pow10(gcPred, 0.05*E);
       
   359 		TReal gc = gcPred*currentGamma;
       
   360 
       
   361 
       
   362 		// update previous R(n) values --------->
       
   363 		for (TInt re = 0; re < 3 ; re++)
       
   364 			{
       
   365 			iPreviousRn[re] = iPreviousRn[re+1];
       
   366 			}
       
   367 		iPreviousRn[3] = R;
       
   368 		// <---------- update ends
       
   369 
       
   370 		// <---------- gc calculated
       
   371 
       
   372 		// calculate energy from adaptive codebook ------------->
       
   373 		
       
   374 		TReal currentGp = 0;
       
   375 		
       
   376 		if (vectorQuant)
       
   377 			{
       
   378 			currentGp = (TReal)(amrGains[subFrame*2])/16384.0; // Q14 = 2^14 = 16384
       
   379 			}
       
   380 		else
       
   381 			{
       
   382 			currentGp = (TReal)(gpGains[subFrame])/16384.0; // Q14, 2^13 = 8192
       
   383 			}
       
   384 
       
   385 
       
   386 		TReal energyFromAdaptiveCB = (iPreviousEnergy*currentGp)/2;
       
   387 
       
   388 		// <----------------------- energy from adaptive codebook calculated
       
   389 
       
   390 		TReal totalEnergy = energyFromAdaptiveCB+(gc*45);
       
   391 
       
   392 		iPreviousEnergy = totalEnergy;
       
   393 
       
   394 		TReal logTotalEnergy = 0;
       
   395 		
       
   396 		if (totalEnergy < 1) totalEnergy = 1;
       
   397 		
       
   398 		Math::Log(logTotalEnergy, totalEnergy);
       
   399 		
       
   400 		if (logTotalEnergy > 3.5) 
       
   401 		    {
       
   402 		    logTotalEnergy = 3.5;
       
   403 		    }
       
   404 		
       
   405 		aGains.Append(logTotalEnergy*100);
       
   406 
       
   407         const TInt KMaxGain = 350;
       
   408 
       
   409         aMaxGain = KMaxGain;
       
   410         
       
   411         
       
   412 		}
       
   413 		
       
   414 		
       
   415 	amrGains.Reset();	
       
   416 	gpGains.Reset();
       
   417 	return ETrue;
       
   418     }
       
   419 
       
   420 
       
   421 TBool CProcAMRFrameHandler::GetNormalizingMargin(const HBufC8* aFrame, TInt8& aMargin) const
       
   422 
       
   423     {
       
   424         
       
   425     const TUint8 ch = (*aFrame)[0];
       
   426 
       
   427     TUint dec_mode = (enum Mode)((ch & 0x0078) >> 3);
       
   428     RArray<TInt> gains;
       
   429     
       
   430     TInt error = KErrNone;
       
   431     TRAP(error, CleanupClosePushL(gains) );
       
   432     
       
   433     if (error != KErrNone)
       
   434         return EFalse;
       
   435     
       
   436     TInt gamma10000 = 1;
       
   437     TInt largestGain = 1;
       
   438     TInt a = 0;
       
   439     TInt maxGain;
       
   440 
       
   441         switch (dec_mode)
       
   442         {
       
   443         case 0:
       
   444         
       
   445             GetAMRGains(aFrame, gains, maxGain);
       
   446 
       
   447             for (a = 1 ; a < gains.Count() ; a+=2)
       
   448                 {
       
   449                 if (gains[a] > largestGain) 
       
   450                     {
       
   451                     largestGain = gains[a];
       
   452                     }
       
   453 
       
   454                 }
       
   455 
       
   456             gamma10000 = (KAmrLargestGain475*10000)/largestGain;
       
   457 
       
   458             break;
       
   459         case 1:
       
   460         case 2:
       
   461 
       
   462             // bitrates 515, 590
       
   463             GetAMRGains(aFrame, gains, maxGain);
       
   464             
       
   465             for (a = 1 ; a < gains.Count() ; a+=2)
       
   466                 {
       
   467                 if (gains[a] > largestGain) 
       
   468                     {
       
   469                     largestGain = gains[a];
       
   470                     }
       
   471 
       
   472                 }
       
   473             gamma10000 = (KAmrLargestGain590*10000)/largestGain;
       
   474 
       
   475 
       
   476             break;
       
   477         case 3:
       
   478         case 4:
       
   479         case 6:
       
   480             // bitRate = 670, 740, 1020;
       
   481             GetAMRGains(aFrame, gains, maxGain);
       
   482             
       
   483             for (a = 1 ; a < gains.Count() ; a+=2)
       
   484                 {
       
   485                 if (gains[a] > largestGain) 
       
   486                     {
       
   487                     largestGain = gains[a];
       
   488                     }
       
   489 
       
   490                 }
       
   491             gamma10000 = (KAmrLargestGain102*10000)/largestGain;
       
   492 
       
   493             break;
       
   494         case 5:
       
   495         case 7:
       
   496             //bitRate = 795 & 12.2
       
   497             GetAMRGains(aFrame, gains, maxGain);
       
   498         
       
   499             
       
   500             for (a = 0 ; a < gains.Count() ; a++)
       
   501                 {
       
   502                 if (gains[a] > largestGain) 
       
   503                     {
       
   504                     largestGain = gains[a];
       
   505                     }
       
   506 
       
   507                 }
       
   508             gamma10000 = (KAmrLargestGain122*10000)/largestGain;
       
   509 
       
   510 
       
   511             break;
       
   512         
       
   513         case 8:
       
   514             
       
   515         case 15:
       
   516             
       
   517         default:
       
   518             aMargin = 100;
       
   519             return ETrue;
       
   520             
       
   521         };
       
   522 
       
   523 
       
   524     CleanupStack::PopAndDestroy(&gains);
       
   525 
       
   526     TUint8 newIndex = ProcTools::FindNewIndexSQ(gamma10000, KAmrGain_dB2Gamma, 256);
       
   527 
       
   528     TInt8 newGain = static_cast<TInt8>(newIndex-127); 
       
   529 
       
   530 
       
   531     if (newGain > 63)
       
   532         {
       
   533         newGain = 63;
       
   534         }
       
   535     else if (newGain < -63)
       
   536         {
       
   537         newGain = -63;
       
   538         }
       
   539 
       
   540     aMargin = static_cast<TInt8>(newGain*2);
       
   541     // aMargin is now in dB/2:s
       
   542     return ETrue;
       
   543 
       
   544 
       
   545     }
       
   546 
       
   547 CProcAMRFrameHandler::~CProcAMRFrameHandler() 
       
   548     {
       
   549 
       
   550     }
       
   551 
       
   552 CProcAMRFrameHandler* CProcAMRFrameHandler::NewL() 
       
   553     {
       
   554 
       
   555     
       
   556     CProcAMRFrameHandler* self = NewLC();
       
   557     CleanupStack::Pop(self);
       
   558     return self;
       
   559 
       
   560     }
       
   561 CProcAMRFrameHandler* CProcAMRFrameHandler::NewLC() 
       
   562     {
       
   563 
       
   564     CProcAMRFrameHandler* self = new (ELeave) CProcAMRFrameHandler();
       
   565     CleanupStack::PushL(self);
       
   566     self->ConstructL();
       
   567     return self;
       
   568 
       
   569     }
       
   570 
       
   571 void CProcAMRFrameHandler::ConstructL() 
       
   572     {
       
   573 
       
   574 
       
   575     }
       
   576 
       
   577 CProcAMRFrameHandler::CProcAMRFrameHandler()
       
   578     {
       
   579 
       
   580     }
       
   581  
       
   582 TBool CProcAMRFrameHandler::GetAMRGains(const HBufC8* aFrame, 
       
   583                                         RArray<TInt>& aGains, 
       
   584                                         TInt& aMaxGain) const
       
   585 
       
   586     {
       
   587 
       
   588     
       
   589     const TUint8 ch = (*aFrame)[0];
       
   590 
       
   591     TUint dec_mode = (enum Mode)((ch & 0x0078) >> 3);
       
   592     TInt gainIndex = 0;
       
   593     
       
   594 
       
   595         switch (dec_mode)
       
   596         {
       
   597         case 0:
       
   598 //            bitRate = 475;
       
   599             
       
   600             gainIndex = ProcTools::GetValueFromShuffledFrame(aFrame, KAmrGains475_1_2, 8);
       
   601             aGains.Append(KAmrGainTable475[gainIndex*4]);
       
   602             aGains.Append(KAmrGainTable475[gainIndex*4+1]);
       
   603             aGains.Append(KAmrGainTable475[gainIndex*4+2]);
       
   604             aGains.Append(KAmrGainTable475[gainIndex*4+3]);
       
   605 
       
   606             gainIndex = ProcTools::GetValueFromShuffledFrame(aFrame, KAmrGains475_3_4, 8);
       
   607             aGains.Append(KAmrGainTable475[gainIndex*4]);
       
   608             aGains.Append(KAmrGainTable475[gainIndex*4+1]);
       
   609             aGains.Append(KAmrGainTable475[gainIndex*4+2]);
       
   610             aGains.Append(KAmrGainTable475[gainIndex*4+3]);
       
   611 
       
   612             break;
       
   613         case 1:
       
   614 //            bitRate = 515;
       
   615 
       
   616             gainIndex = ProcTools::GetValueFromShuffledFrame(aFrame, KAmrGains515_1, 6);
       
   617             aGains.Append(KAmrGainTable590[gainIndex*2]);
       
   618             aGains.Append(KAmrGainTable590[gainIndex*2+1]);
       
   619 
       
   620             gainIndex = ProcTools::GetValueFromShuffledFrame(aFrame, KAmrGains515_2, 6);
       
   621             aGains.Append(KAmrGainTable590[gainIndex*2]);
       
   622             aGains.Append(KAmrGainTable590[gainIndex*2+1]);
       
   623 
       
   624             gainIndex = ProcTools::GetValueFromShuffledFrame(aFrame, KAmrGains515_3, 6);
       
   625             aGains.Append(KAmrGainTable590[gainIndex*2]);
       
   626             aGains.Append(KAmrGainTable590[gainIndex*2+1]);
       
   627 
       
   628             gainIndex = ProcTools::GetValueFromShuffledFrame(aFrame, KAmrGains515_4, 6);
       
   629             aGains.Append(KAmrGainTable590[gainIndex*2]);
       
   630             aGains.Append(KAmrGainTable590[gainIndex*2+1]);
       
   631             break;
       
   632         case 2:
       
   633 //            bitRate = 590;
       
   634 
       
   635             gainIndex = ProcTools::GetValueFromShuffledFrame(aFrame, KAmrGains590_1, 6);
       
   636             aGains.Append(KAmrGainTable590[gainIndex*2]);
       
   637             aGains.Append(KAmrGainTable590[gainIndex*2+1]);
       
   638 
       
   639             gainIndex = ProcTools::GetValueFromShuffledFrame(aFrame, KAmrGains590_2, 6);
       
   640             aGains.Append(KAmrGainTable590[gainIndex*2]);
       
   641             aGains.Append(KAmrGainTable590[gainIndex*2+1]);
       
   642 
       
   643             gainIndex = ProcTools::GetValueFromShuffledFrame(aFrame, KAmrGains590_3, 6);
       
   644             aGains.Append(KAmrGainTable590[gainIndex*2]);
       
   645             aGains.Append(KAmrGainTable590[gainIndex*2+1]);
       
   646 
       
   647             gainIndex = ProcTools::GetValueFromShuffledFrame(aFrame, KAmrGains590_4, 6);
       
   648             aGains.Append(KAmrGainTable590[gainIndex*2]);
       
   649             aGains.Append(KAmrGainTable590[gainIndex*2+1]);
       
   650 
       
   651             break;
       
   652         case 3:
       
   653 //            bitRate = 670;
       
   654 
       
   655             gainIndex = ProcTools::GetValueFromShuffledFrame(aFrame, KAmrGains670_1, 7);
       
   656             aGains.Append(KAmrGainTable102[gainIndex*2]);
       
   657             aGains.Append(KAmrGainTable102[gainIndex*2+1]);
       
   658 
       
   659             gainIndex = ProcTools::GetValueFromShuffledFrame(aFrame, KAmrGains670_2, 7);
       
   660             aGains.Append(KAmrGainTable102[gainIndex*2]);
       
   661             aGains.Append(KAmrGainTable102[gainIndex*2+1]);
       
   662 
       
   663             gainIndex = ProcTools::GetValueFromShuffledFrame(aFrame, KAmrGains670_3, 7);
       
   664             aGains.Append(KAmrGainTable102[gainIndex*2]);
       
   665             aGains.Append(KAmrGainTable102[gainIndex*2+1]);
       
   666 
       
   667             gainIndex = ProcTools::GetValueFromShuffledFrame(aFrame, KAmrGains670_4, 7);
       
   668             aGains.Append(KAmrGainTable102[gainIndex*2]);
       
   669             aGains.Append(KAmrGainTable102[gainIndex*2+1]);
       
   670 
       
   671             break;
       
   672         case 4:
       
   673 //            bitRate = 740;
       
   674 
       
   675             gainIndex = ProcTools::GetValueFromShuffledFrame(aFrame, KAmrGains740_1, 7);
       
   676             aGains.Append(KAmrGainTable102[gainIndex*2]);
       
   677             aGains.Append(KAmrGainTable102[gainIndex*2+1]);
       
   678 
       
   679             gainIndex = ProcTools::GetValueFromShuffledFrame(aFrame, KAmrGains740_2, 7);
       
   680             aGains.Append(KAmrGainTable102[gainIndex*2]);
       
   681             aGains.Append(KAmrGainTable102[gainIndex*2+1]);
       
   682 
       
   683             gainIndex = ProcTools::GetValueFromShuffledFrame(aFrame, KAmrGains740_3, 7);
       
   684             aGains.Append(KAmrGainTable102[gainIndex*2]);
       
   685             aGains.Append(KAmrGainTable102[gainIndex*2+1]);
       
   686 
       
   687             gainIndex = ProcTools::GetValueFromShuffledFrame(aFrame, KAmrGains740_4, 7);
       
   688             aGains.Append(KAmrGainTable102[gainIndex*2]);
       
   689             aGains.Append(KAmrGainTable102[gainIndex*2+1]);
       
   690 
       
   691             break;
       
   692         case 5:
       
   693 //            bitRate = 795;
       
   694             
       
   695             gainIndex = ProcTools::GetValueFromShuffledFrame(aFrame, KAmrGains795_1, 5);
       
   696             aGains.Append(KAmrGainTable122[gainIndex]);
       
   697 
       
   698             gainIndex = ProcTools::GetValueFromShuffledFrame(aFrame, KAmrGains795_2, 5);
       
   699             aGains.Append(KAmrGainTable122[gainIndex]);
       
   700 
       
   701             gainIndex = ProcTools::GetValueFromShuffledFrame(aFrame, KAmrGains795_3, 5);
       
   702             aGains.Append(KAmrGainTable122[gainIndex]);
       
   703 
       
   704             gainIndex = ProcTools::GetValueFromShuffledFrame(aFrame, KAmrGains795_4, 5);
       
   705             aGains.Append(KAmrGainTable122[gainIndex]);
       
   706                 
       
   707             break;
       
   708         case 6:
       
   709 //            bitRate = 1020;
       
   710 
       
   711             gainIndex = ProcTools::GetValueFromShuffledFrame(aFrame, KAmrGains102_1, 7);
       
   712             aGains.Append(KAmrGainTable102[gainIndex*2]);
       
   713             aGains.Append(KAmrGainTable102[gainIndex*2+1]);
       
   714 
       
   715             gainIndex = ProcTools::GetValueFromShuffledFrame(aFrame, KAmrGains102_2, 7);
       
   716             aGains.Append(KAmrGainTable102[gainIndex*2]);
       
   717             aGains.Append(KAmrGainTable102[gainIndex*2+1]);
       
   718 
       
   719             gainIndex = ProcTools::GetValueFromShuffledFrame(aFrame, KAmrGains102_3, 7);
       
   720             aGains.Append(KAmrGainTable102[gainIndex*2]);
       
   721             aGains.Append(KAmrGainTable102[gainIndex*2+1]);
       
   722 
       
   723             gainIndex = ProcTools::GetValueFromShuffledFrame(aFrame, KAmrGains102_4, 7);
       
   724             aGains.Append(KAmrGainTable102[gainIndex*2]);
       
   725             aGains.Append(KAmrGainTable102[gainIndex*2+1]);
       
   726 
       
   727             break;
       
   728         case 7:
       
   729 //            bitRate = 1220;
       
   730                 
       
   731             gainIndex = ProcTools::GetValueFromShuffledFrame(aFrame, KAmrGains122_1, 5);
       
   732             aGains.Append(KAmrGainTable122[gainIndex]);
       
   733 
       
   734             gainIndex = ProcTools::GetValueFromShuffledFrame(aFrame, KAmrGains122_2, 5);
       
   735             aGains.Append(KAmrGainTable122[gainIndex]);
       
   736 
       
   737             gainIndex = ProcTools::GetValueFromShuffledFrame(aFrame, KAmrGains122_3, 5);
       
   738             aGains.Append(KAmrGainTable122[gainIndex]);
       
   739 
       
   740             gainIndex = ProcTools::GetValueFromShuffledFrame(aFrame, KAmrGains122_4, 5);
       
   741             aGains.Append(KAmrGainTable122[gainIndex]);
       
   742                 
       
   743                 
       
   744             break;
       
   745         case 8:
       
   746 //            bitRate = 0;
       
   747             break;
       
   748         case 15:
       
   749 //            bitRate = 0;
       
   750             break;
       
   751         default:
       
   752 //            bitRate = 0;
       
   753             break;
       
   754         };
       
   755 
       
   756 
       
   757     aMaxGain = KAmrLargestGain102;
       
   758 
       
   759     return ETrue;
       
   760 
       
   761 
       
   762     }
       
   763 
       
   764 TInt CProcAMRFrameHandler::GetNextFrameLength(const HBufC8* aFrame, TInt aPosNow)
       
   765     {
       
   766 
       
   767 
       
   768     if (aPosNow >= aFrame->Size()) return -1;
       
   769 
       
   770 
       
   771     const TUint8 ch = (*aFrame)[aPosNow];
       
   772 
       
   773     TUint dec_mode = (enum Mode)((ch & 0x0078) >> 3);
       
   774     
       
   775     switch (dec_mode)
       
   776         {
       
   777         case 0:
       
   778             {
       
   779             return 12+1;
       
   780             }
       
   781             
       
   782         case 1:
       
   783             {
       
   784             return 13+1;
       
   785             }
       
   786             
       
   787         case 2:
       
   788             {
       
   789             return 15+1;
       
   790             }
       
   791             
       
   792         case 3:
       
   793             {
       
   794             return 17+1;
       
   795             }
       
   796             
       
   797         case 4:
       
   798             {
       
   799             return 19+1;
       
   800             }
       
   801             
       
   802         case 5:
       
   803             {
       
   804             return 20+1;
       
   805             }
       
   806             
       
   807         case 6:
       
   808             {
       
   809             return 26+1;
       
   810             }
       
   811             
       
   812         case 7:
       
   813             {
       
   814             return 31+1;
       
   815             }
       
   816             
       
   817         case 8:
       
   818             {
       
   819             return 5+1;
       
   820             }
       
   821             
       
   822         case 15:
       
   823             {
       
   824             return 0;
       
   825             }
       
   826             
       
   827         default:
       
   828             return 0+1;
       
   829             
       
   830         };
       
   831     
       
   832 
       
   833     }
       
   834     
       
   835 
       
   836 TBool CProcAMRFrameHandler::GetGPGains(const HBufC8* aFrame, 
       
   837 										RArray<TInt>& aGains) const
       
   838 
       
   839 	{
       
   840 
       
   841 	
       
   842 	const TUint8 ch = (*aFrame)[0];
       
   843 
       
   844 	TUint dec_mode = (enum Mode)((ch & 0x0078) >> 3);
       
   845 	TInt gainIndex = 0;
       
   846 	
       
   847 
       
   848 		switch (dec_mode)
       
   849 		{
       
   850 		
       
   851 		case 7:
       
   852 //			bitRate = 1220;
       
   853 				
       
   854 			gainIndex = ProcTools::GetValueFromShuffledFrame(aFrame, KAmrGPGains122_1, 4);
       
   855 			aGains.Append(KAmrGPTable[gainIndex]);
       
   856 
       
   857 			gainIndex = ProcTools::GetValueFromShuffledFrame(aFrame, KAmrGPGains122_2, 4);
       
   858 			aGains.Append(KAmrGPTable[gainIndex]);
       
   859 
       
   860 			gainIndex = ProcTools::GetValueFromShuffledFrame(aFrame, KAmrGPGains122_3, 4);
       
   861 			aGains.Append(KAmrGPTable[gainIndex]);
       
   862 
       
   863 			gainIndex = ProcTools::GetValueFromShuffledFrame(aFrame, KAmrGPGains122_4, 4);
       
   864 			aGains.Append(KAmrGPTable[gainIndex]);
       
   865 				
       
   866 				
       
   867 			break;
       
   868 
       
   869 		case 5:
       
   870 		// 7.95
       
   871 			gainIndex = ProcTools::GetValueFromShuffledFrame(aFrame, KAmrGPGains795_1, 4);
       
   872 			aGains.Append(KAmrGPTable[gainIndex]);
       
   873 
       
   874 			gainIndex = ProcTools::GetValueFromShuffledFrame(aFrame, KAmrGPGains795_2, 4);
       
   875 			aGains.Append(KAmrGPTable[gainIndex]);
       
   876 
       
   877 			gainIndex = ProcTools::GetValueFromShuffledFrame(aFrame, KAmrGPGains795_3, 4);
       
   878 			aGains.Append(KAmrGPTable[gainIndex]);
       
   879 
       
   880 			gainIndex = ProcTools::GetValueFromShuffledFrame(aFrame, KAmrGPGains795_4, 4);
       
   881 			aGains.Append(KAmrGPTable[gainIndex]);
       
   882 			break;
       
   883 
       
   884 
       
   885 
       
   886 		default:
       
   887 //			return EFalse;
       
   888 			break;
       
   889 		};
       
   890 
       
   891 
       
   892 	return ETrue;
       
   893 
       
   894 
       
   895 	}