videoeditorengine/mp3aacManipLib/AACGain/src/sfbdata.cpp
branchRCL_3
changeset 3 e0b5df5c0969
parent 0 951a5db380a0
child 5 4c409de21d23
equal deleted inserted replaced
0:951a5db380a0 3:e0b5df5c0969
     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   sfbdata.cpp - Sfb table definitions for AAC.
       
    22  
       
    23   Author(s): Juha Ojanpera
       
    24   Copyright (c) 2000-2004 by Nokia Research Center, Speech and Audio Systems.
       
    25   *************************************************************************/
       
    26 
       
    27 /*-- Project Headers. --*/
       
    28 #include "aacdef.h"
       
    29 
       
    30 /*
       
    31    Purpose:     Sfb widths (long and short block) for each sampling rate.
       
    32    Explanation: Supports frame lengths 1024 and 960. */
       
    33 
       
    34 const int16 sfb_96_1024[] = {
       
    35   4, 8, 12, 16, 20, 24, 28, 32, 36, 40, 44, 48, 52, 56, 64, 72, 80, 88, 96, 
       
    36   108, 120, 132, 144, 156, 172, 188, 212, 240, 276, 320, 384, 448, 512, 576, 
       
    37   640, 704, 768, 832, 896, 960, 1024};
       
    38 
       
    39 const int16 sfb_96_128[] = {4, 8, 12, 16, 20, 24, 32, 40, 48, 64, 92, 128};
       
    40 const int16 sfb_96_120[] = {4, 8, 12, 16, 20, 24, 32, 40, 48, 64, 92, 120};
       
    41 
       
    42 const int16 sfb_64_1024[] = {
       
    43   4, 8, 12, 16, 20, 24, 28, 32, 36, 40, 44, 48, 52, 56, 64, 72, 80, 88, 100, 
       
    44   112, 124, 140, 156, 172, 192, 216, 240, 268, 304, 344, 384, 424, 464, 504, 
       
    45   544, 584, 624, 664, 704, 744, 784, 824, 864, 904, 944, 984, 1024};
       
    46 const int16 sfb_64_960[] = { 
       
    47   4, 8, 12, 16, 20, 24, 28, 32, 36, 40, 44, 48, 52, 56, 64, 72, 80, 88, 100, 
       
    48   112, 124, 140, 156, 172, 192, 216, 240, 268, 304, 344, 384, 424, 464, 504, 
       
    49   544, 584, 624, 664, 704, 744, 784, 824, 864, 904, 944, 960};
       
    50 
       
    51 const int16 sfb_64_128[] = {4, 8, 12, 16, 20, 24, 32, 40, 48, 64, 92, 128};
       
    52 const int16 sfb_64_120[] = {4, 8, 12, 16, 20, 24, 32, 40, 48, 64, 92, 120};
       
    53 
       
    54 const int16 sfb_48_1024[] = {
       
    55   4, 8, 12, 16, 20, 24, 28, 32, 36, 40, 48, 56, 64, 72, 80, 88, 96, 108, 120, 
       
    56   132, 144, 160, 176, 196, 216, 240, 264, 292, 320, 352, 384, 416, 448, 480, 
       
    57   512, 544, 576, 608, 640, 672, 704, 736, 768, 800, 832, 864, 896, 928, 1024};
       
    58 const int16 sfb_48_960[] = { 
       
    59   4, 8, 12, 16, 20, 24, 28, 32, 36, 40, 48, 56, 64, 72, 80, 88, 96, 108, 120, 
       
    60   132, 144, 160, 176, 196, 216, 240, 264, 292, 320, 352, 384, 416, 448, 480, 
       
    61   512, 544, 576, 608, 640, 672, 704, 736, 768, 800, 832, 864, 896, 928, 960, 0};
       
    62 
       
    63 const int16 sfb_48_128[] = 
       
    64 {4, 8, 12, 16, 20, 28, 36, 44, 56, 68, 80, 96, 112, 128};
       
    65 const int16 sfb_48_120[] =
       
    66 {4, 8, 12, 16, 20, 28, 36, 44, 56, 68, 80, 96, 112, 120};
       
    67 
       
    68 const int16 sfb_32_1024[] = {
       
    69   4, 8, 12, 16, 20, 24, 28, 32, 36, 40, 48, 56, 64, 72, 80, 88, 96, 108, 120, 
       
    70   132, 144, 160, 176, 196, 216, 240, 264, 292, 320, 352, 384, 416, 448, 480, 
       
    71   512, 544, 576, 608, 640, 672, 704, 736, 768, 800, 832, 864, 896, 928, 960,
       
    72   992, 1024};
       
    73 const int16 sfb_32_960[] =
       
    74 { 4, 8, 12, 16, 20, 24, 28, 32, 36, 40, 48, 56, 64, 72, 80, 88, 96, 108, 120, 
       
    75   132, 144, 160, 176, 196, 216, 240, 264, 292, 320, 352, 384, 416, 448, 480, 
       
    76   512, 544, 576, 608, 640, 672, 704, 736, 768, 800, 832, 864, 896, 928, 960, 0};
       
    77 
       
    78 const int16 sfb_24_1024[] = {
       
    79   4, 8, 12, 16, 20, 24, 28, 32, 36, 40, 44, 52, 60, 68, 76, 84, 92, 100, 108, 
       
    80   116, 124, 136, 148, 160, 172, 188, 204, 220, 240, 260, 284, 308, 336, 364, 
       
    81   396, 432, 468, 508, 552, 600, 652, 704, 768, 832, 896, 960, 1024};
       
    82 
       
    83 const int16 sfb_24_128[] =
       
    84 { 4, 8, 12, 16, 20, 24, 28, 36, 44, 52, 64, 76, 92, 108, 128};
       
    85 const int16 sfb_24_120[] =
       
    86 { 4, 8, 12, 16, 20, 24, 28, 36, 44, 52, 64, 76, 92, 108, 120};
       
    87 
       
    88 const int16 sfb_16_1024[] = {
       
    89   8, 16, 24, 32, 40, 48, 56, 64, 72, 80, 88, 100, 112, 124, 136, 148, 160, 
       
    90   172, 184, 196, 212, 228, 244, 260, 280, 300, 320, 344, 368, 396, 424, 456, 
       
    91   492, 532, 572, 616, 664, 716, 772, 832, 896, 960, 1024};
       
    92 
       
    93 const int16 sfb_16_128[] = 
       
    94 { 4, 8, 12, 16, 20, 24, 28, 32, 40, 48, 60, 72, 88, 108, 128};
       
    95 const int16 sfb_16_120[] =
       
    96 { 4, 8, 12, 16, 20, 24, 28, 32, 40, 48, 60, 72, 88, 108, 120};
       
    97 
       
    98 const int16 sfb_8_1024[] = {
       
    99   12, 24, 36, 48, 60, 72, 84, 96, 108, 120, 132, 144, 156, 172, 188, 204, 220, 
       
   100   236, 252, 268, 288, 308, 328, 348, 372, 396, 420, 448, 476, 508, 544, 580, 
       
   101   620, 664, 712, 764, 820, 880, 944, 1024};
       
   102 const int16 sfb_8_960[] =
       
   103 { 12, 24, 36, 48, 60, 72, 84, 96, 108, 120, 132, 144, 156, 172, 188, 204, 
       
   104   220, 236, 252, 268, 288, 308, 328, 348, 372, 396, 420, 448, 476, 508, 544, 
       
   105   580, 620, 664, 712, 764, 820, 880, 944, 960};
       
   106 
       
   107 const int16 sfb_8_128[] = 
       
   108 { 4, 8, 12, 16, 20, 24, 28, 36, 44, 52, 60, 72, 88, 108, 128};
       
   109 const int16 sfb_8_120[] =
       
   110 { 4, 8, 12, 16, 20, 24, 28, 36, 44, 52, 60, 72, 88, 108, 120};
       
   111 
       
   112 /*
       
   113    Purpose:     Block parameters for each sampling rate.
       
   114    Explanation: - */
       
   115 const SR_Info AAC_sampleRateInfo[(1 << LEN_SAMP_IDX)] = {
       
   116 
       
   117   /* 96000 */
       
   118   {96000, 41, sfb_96_1024, 12, sfb_96_128, 40, sfb_96_1024, 12, sfb_96_120},
       
   119 
       
   120   /* 88200 */
       
   121   {88200, 41, sfb_96_1024, 12, sfb_96_128, 40, sfb_96_1024, 12, sfb_96_120},
       
   122 
       
   123   /* 64000 */
       
   124   {64000, 47, sfb_64_1024, 12, sfb_64_128, 46, sfb_64_960,  12, sfb_64_120},
       
   125 
       
   126   /* 48000 */
       
   127   {48000, 49, sfb_48_1024, 14, sfb_48_128, 49, sfb_48_960,  14, sfb_48_120},
       
   128 
       
   129   /* 44100 */
       
   130   {44100, 49, sfb_48_1024, 14, sfb_48_128, 49, sfb_48_960,  14, sfb_48_120},
       
   131 
       
   132   /* 32000 */
       
   133   {32000, 51, sfb_32_1024, 14, sfb_48_128, 49, sfb_32_960,  14, sfb_48_120}, 
       
   134 
       
   135   /* 24000 */
       
   136   {24000, 47, sfb_24_1024, 15, sfb_24_128, 46, sfb_24_1024, 15, sfb_24_120},
       
   137 
       
   138   /* 22050 */
       
   139   {22050, 47, sfb_24_1024, 15, sfb_24_128, 46, sfb_24_1024, 15, sfb_24_120},
       
   140 
       
   141   /* 16000 */
       
   142   {16000, 43, sfb_16_1024, 15, sfb_16_128, 42, sfb_16_1024, 15, sfb_16_120},
       
   143 
       
   144   /* 12000 */
       
   145   {12000, 43, sfb_16_1024, 15, sfb_16_128, 42, sfb_16_1024, 15, sfb_16_120},
       
   146 
       
   147   /* 11025 */
       
   148   {11025, 43, sfb_16_1024, 15, sfb_16_128, 42, sfb_16_1024, 15, sfb_16_120},
       
   149 
       
   150   /* 8000  */
       
   151   { 8000, 40,  sfb_8_1024, 15, sfb_8_128,  40, sfb_8_960,   15, sfb_8_120},
       
   152 
       
   153   {0,0,0,0,0,0,0,0,0}, {0,0,0,0,0,0,0,0,0}, {0,0,0,0,0,0,0,0,0}, {0,0,0,0,0,0,0,0,0}};
       
   154 
       
   155 /*
       
   156  * Retrieves AAC sample rate corresponding to the specified sample rate index.
       
   157  */
       
   158 int32
       
   159 AACSampleRate(uint8 sampleRateIdx)
       
   160 {
       
   161   int32 sampleRate = 0;
       
   162 
       
   163   if(sampleRateIdx > 0 && sampleRateIdx < 12)
       
   164     sampleRate = AAC_sampleRateInfo[sampleRateIdx].samp_rate;
       
   165 
       
   166   return (sampleRate);
       
   167 }
       
   168 
       
   169 /*
       
   170  * Initializes SFB and sample rate tables for the specified AAC encoder.
       
   171  */
       
   172 void
       
   173 AACSfbInfoInit(CSfb_Info *sfb, uint8 sIndex, uint8 is960)
       
   174 {
       
   175   CInfo *ip;
       
   176   const SR_Info *sip;
       
   177   const int16 *sfbands;
       
   178   int16 i, j, k, n, ws;
       
   179 
       
   180   sip = &AAC_sampleRateInfo[sIndex];
       
   181 
       
   182   /*-- Long block info. --*/
       
   183   ip = sfb->only_long_info;
       
   184   sfb->winmap[ONLY_LONG_WND] = ip;
       
   185 
       
   186   ip->nsbk = 1;
       
   187   ip->islong = 1;
       
   188   ip->bins_per_bk = (int16) ((is960) ? LN2_960 : LN2);
       
   189   for(i = 0; i < ip->nsbk; i++)
       
   190   {
       
   191     if(is960)
       
   192     {
       
   193       ip->sfb_per_sbk[i] = sip->nsfb960;
       
   194       ip->sbk_sfb_top[i] = sip->SFbands960;
       
   195     }
       
   196     else
       
   197     {
       
   198       ip->sfb_per_sbk[i] = sip->nsfb1024;
       
   199       ip->sbk_sfb_top[i] = sip->SFbands1024;
       
   200     }
       
   201   }
       
   202   ip->sfb_width_128 = NULL;
       
   203   ip->num_groups = 1;
       
   204   ip->group_len[0] = 1;
       
   205   ip->group_offs[0] = 0;
       
   206 
       
   207   /*-- Short block info. --*/
       
   208   ip = sfb->eight_short_info;
       
   209   sfb->winmap[ONLY_SHORT_WND] = ip;
       
   210 
       
   211   ip->islong = 0;
       
   212   ip->nsbk = NSHORT;
       
   213   ip->bins_per_bk = (int16) ((is960) ? LN2_960 : LN2);
       
   214   for(i = 0; i < ip->nsbk; i++)
       
   215   {
       
   216     if(is960)
       
   217     {
       
   218       ip->sfb_per_sbk[i] = sip->nsfb120;
       
   219       ip->sbk_sfb_top[i] = sip->SFbands120;
       
   220     }
       
   221     else
       
   222     {
       
   223       ip->sfb_per_sbk[i] = sip->nsfb128;
       
   224       ip->sbk_sfb_top[i] = sip->SFbands128;
       
   225     }
       
   226   }
       
   227   
       
   228   /*-- Construct sfb width table. --*/
       
   229   ip->sfb_width_128 = sfb->sfbwidth128;
       
   230   for(i = 0, j = 0, n = ip->sfb_per_sbk[0]; i < n; i++)
       
   231   {
       
   232     k = ip->sbk_sfb_top[0][i];
       
   233     ip->sfb_width_128[i] = (int16) (k - j);
       
   234     j = k;
       
   235   }
       
   236 
       
   237   /*-- Common to long and short. --*/
       
   238   for(ws = 0; ws < NUM_WIN_SEQ; ws++)
       
   239   {
       
   240     if(ws == 1 || ws == 3)
       
   241       continue;
       
   242 
       
   243     ip = sfb->winmap[ws];
       
   244     ip->sfb_per_bk = 0;
       
   245     for(i = 0, k= 0, n = 0; i < ip->nsbk; i++)
       
   246     {
       
   247       /*-- Compute bins_per_sbk. --*/
       
   248       ip->bins_per_sbk[i] = (int16) (ip->bins_per_bk / ip->nsbk);
       
   249 
       
   250       /*-- Compute sfb_per_bk. --*/
       
   251       ip->sfb_per_bk = (int16) (ip->sfb_per_bk + ip->sfb_per_sbk[i]);
       
   252 
       
   253       /*-- Construct default (non-interleaved) bk_sfb_top[]. --*/
       
   254       sfbands = ip->sbk_sfb_top[i];
       
   255       for(j = 0; j < ip->sfb_per_sbk[i]; j++)
       
   256         ip->bk_sfb_top[j + k] = (int16) (sfbands[j] + n);
       
   257 
       
   258       n = (int16) (n + ip->bins_per_sbk[i]);
       
   259       k = (int16) (k + ip->sfb_per_sbk[i]);
       
   260     }
       
   261   }
       
   262 
       
   263   sfb->winmap[1] = sfb->winmap[ONLY_LONG_WND];
       
   264   sfb->winmap[3] = sfb->winmap[ONLY_LONG_WND];
       
   265 }