mpadecl2.cpp
上传用户:zhongxx05
上传日期:2007-06-06
资源大小:33641k
文件大小:22k
源码类别:

Symbian

开发平台:

C/C++

  1. /* ***** BEGIN LICENSE BLOCK ***** 
  2.  * Version: RCSL 1.0/RPSL 1.0 
  3.  *  
  4.  * Portions Copyright (c) 1995-2002 RealNetworks, Inc. All Rights Reserved. 
  5.  *      
  6.  * The contents of this file, and the files included with this file, are 
  7.  * subject to the current version of the RealNetworks Public Source License 
  8.  * Version 1.0 (the "RPSL") available at 
  9.  * http://www.helixcommunity.org/content/rpsl unless you have licensed 
  10.  * the file under the RealNetworks Community Source License Version 1.0 
  11.  * (the "RCSL") available at http://www.helixcommunity.org/content/rcsl, 
  12.  * in which case the RCSL will apply. You may also obtain the license terms 
  13.  * directly from RealNetworks.  You may not use this file except in 
  14.  * compliance with the RPSL or, if you have a valid RCSL with RealNetworks 
  15.  * applicable to this file, the RCSL.  Please see the applicable RPSL or 
  16.  * RCSL for the rights, obligations and limitations governing use of the 
  17.  * contents of the file.  
  18.  *  
  19.  * This file is part of the Helix DNA Technology. RealNetworks is the 
  20.  * developer of the Original Code and owns the copyrights in the portions 
  21.  * it created. 
  22.  *  
  23.  * This file, and the files included with this file, is distributed and made 
  24.  * available on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER 
  25.  * EXPRESS OR IMPLIED, AND REALNETWORKS HEREBY DISCLAIMS ALL SUCH WARRANTIES, 
  26.  * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, FITNESS 
  27.  * FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT. 
  28.  * 
  29.  * Technology Compatibility Kit Test Suite(s) Location: 
  30.  *    http://www.helixcommunity.org/content/tck 
  31.  * 
  32.  * Contributor(s): 
  33.  *  
  34.  * ***** END LICENSE BLOCK ***** */ 
  35. #include "statname.h"
  36. #include "hlxclib/string.h"
  37. #include "hlxclib/math.h"
  38. #include "mhead.h"
  39. #include "mpadecl2.h"
  40. #include "mpalow.h"     // low level extern C prototypes
  41. ///////////////////////////////////////////////////////////////////////////////
  42. // Static Data:
  43. ///////////////////////////////////////////////////////////////////////////////
  44. static const int look_joint_L2[16] = {  /* lookup stereo sb's by mode+ext */
  45. 64, 64, 64, 64,         /* stereo */
  46. 2*4, 2*8, 2*12, 2*16,   /* joint */
  47. 64, 64, 64, 64,         /* dual */
  48. 32, 32, 32, 32,         /* mono */
  49. };
  50. static const int bat_bit_master_L2[] = {
  51.   0, 5, 7, 9, 10, 12, 15, 18, 21, 24, 27, 30, 33, 36, 39, 42, 45, 48 };
  52. //
  53. // -------- init data -----------------
  54. //
  55. static const int steps[18] = {
  56. 0, 3, 5, 7, 9, 15, 31, 63, 127,
  57. 255, 511, 1023, 2047, 4095, 8191, 16383, 32767, 65535 };
  58. /*  ABCD_INDEX = lookqt[mode][sr_index][br_index]  */
  59. /*   -1 = invalid  */
  60. static const signed char lookqt[4][3][16]={ /* Flawfinder: ignore */
  61.   1,-1,-1,-1,2,-1,2,0,0,0,1,1,1,1,1,-1,           /*  44ks stereo */
  62.   0,-1,-1,-1,2,-1,2,0,0,0,0,0,0,0,0,-1,           /*  48ks */
  63.   1,-1,-1,-1,3,-1,3,0,0,0,1,1,1,1,1,-1,           /*  32ks */
  64.   1,-1,-1,-1,2,-1,2,0,0,0,1,1,1,1,1,-1,           /*  44ks joint stereo */
  65.   0,-1,-1,-1,2,-1,2,0,0,0,0,0,0,0,0,-1,           /*  48ks */
  66.   1,-1,-1,-1,3,-1,3,0,0,0,1,1,1,1,1,-1,           /*  32ks */
  67.   1,-1,-1,-1,2,-1,2,0,0,0,1,1,1,1,1,-1,           /*  44ks dual chan */
  68.   0,-1,-1,-1,2,-1,2,0,0,0,0,0,0,0,0,-1,           /*  48ks */
  69.   1,-1,-1,-1,3,-1,3,0,0,0,1,1,1,1,1,-1,           /*  32ks */
  70. // mono extended beyond legal br index
  71. //  1,2,2,0,0,0,1,1,1,1,1,1,1,1,1,-1,          /*  44ks single chan */
  72. //  0,2,2,0,0,0,0,0,0,0,0,0,0,0,0,-1,          /*  48ks */
  73. //  1,3,3,0,0,0,1,1,1,1,1,1,1,1,1,-1,          /*  32ks */
  74. // legal mono
  75.  1,2,2,0,0,0,1,1,1,1,1,-1,-1,-1,-1,-1,          /*  44ks single chan */
  76.  0,2,2,0,0,0,0,0,0,0,0,-1,-1,-1,-1,-1,          /*  48ks */
  77.  1,3,3,0,0,0,1,1,1,1,1,-1,-1,-1,-1,-1,          /*  32ks */
  78. };
  79. static const int sr_table_L2[8] =
  80.     { 22050, 24000, 16000, 1,
  81.       44100, 48000, 32000, 1 };
  82. /* bit allocation table look up */
  83. /* table per mpeg spec tables 3b2a/b/c/d  /e is mpeg2 */
  84. /* look_bat[abcd_index][4][16]  */
  85. static const unsigned char look_bat[5][4][16] = { /* Flawfinder: ignore */
  86. /* LOOK_BATA */
  87.  0, 1, 3, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17,
  88.  0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 17,
  89.  0, 1, 2, 3, 4, 5, 6, 17, 0,0,0,0, 0,0,0,0,
  90.  0, 1, 2, 17,  0,0,0,0, 0,0,0,0, 0,0,0,0,
  91. /* LOOK_BATB */
  92.  0, 1, 3, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17,
  93.  0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 17,
  94.  0, 1, 2, 3, 4, 5, 6, 17, 0,0,0,0, 0,0,0,0,
  95.  0, 1, 2, 17,  0,0,0,0, 0,0,0,0, 0,0,0,0,
  96. /* LOOK_BATC */
  97.  0, 1, 2, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16,
  98.  0,0,0,0, 0,0,0,0, 0,0,0,0, 0,0,0,0,
  99.  0, 1, 2, 4, 5, 6, 7, 8,   0,0,0,0, 0,0,0,0,
  100.  0,0,0,0, 0,0,0,0, 0,0,0,0, 0,0,0,0,
  101. /* LOOK_BATD */
  102.  0, 1, 2, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16,
  103.  0,0,0,0, 0,0,0,0, 0,0,0,0, 0,0,0,0,
  104.  0, 1, 2, 4, 5, 6, 7, 8, 0,0,0,0, 0,0,0,0,
  105.  0,0,0,0, 0,0,0,0, 0,0,0,0, 0,0,0,0,
  106. /* LOOK_BATE */
  107.  0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15,
  108.  0,0,0,0, 0,0,0,0, 0,0,0,0, 0,0,0,0,
  109.  0, 1, 2, 4, 5, 6, 7, 8, 0,0,0,0, 0,0,0,0,
  110.  0, 1, 2, 4, 0,0,0,0, 0,0,0,0, 0,0,0,0,
  111. };
  112. /* look_nbat[abcd_index]][4] */
  113. static const unsigned char look_nbat[5][4] = { /* Flawfinder: ignore */
  114.   3, 8, 12, 4,
  115.   3, 8, 12, 7,
  116.   2, 0, 6, 0,
  117.   2, 0, 10, 0,
  118.   4, 0, 7, 19,
  119. };
  120. static const int  out_chans_L2[5] = { 1, 2, 1, 1, 1 };
  121. static const SBT_FUNCTION  sbt_table_L2[2][3][5] = {
  122. // 16 bit (usually short) pcm output
  123.     sbt_mono,   
  124.     sbt_dual,   
  125.     sbt_dual_mono, 
  126. #ifdef REDUCTION
  127.     sbt_dual_left, 
  128.     sbt_dual_right,
  129.     sbt16_mono, 
  130.     sbt16_dual, 
  131.     sbt16_dual_mono, 
  132.     sbt16_dual_left, 
  133.     sbt16_dual_right,
  134.     sbt8_mono,  
  135.     sbt8_dual,  
  136.     sbt8_dual_mono, 
  137.     sbt8_dual_left, 
  138.     sbt8_dual_right,
  139. #else     // no reduction
  140.     NULL, NULL, NULL, NULL, NULL, NULL, 
  141.     NULL, NULL, NULL, NULL, NULL, NULL, 
  142. #endif
  143. // 8 bit pcm output
  144. #ifdef EIGHT_BIT
  145.     sbtB_mono,
  146.     sbtB_dual,
  147.     sbtB_dual_mono,
  148. #ifdef REDUCTION
  149.     sbtB_dual_left,
  150.     sbtB_dual_right,
  151.     sbtB16_mono,
  152.     sbtB16_dual,
  153.     sbtB16_dual_mono,
  154.     sbtB16_dual_left,
  155.     sbtB16_dual_right,
  156.     sbtB8_mono,
  157.     sbtB8_dual,
  158.     sbtB8_dual_mono,
  159.     sbtB8_dual_left,
  160.     sbtB8_dual_right,
  161. #else   // no reduction
  162.     NULL, NULL, NULL, NULL, NULL, NULL, 
  163.     NULL, NULL, NULL, NULL, NULL, NULL, 
  164. #endif
  165. #else       // no eight_bit
  166.     NULL, NULL, NULL,
  167.     NULL, NULL, NULL, NULL, NULL, NULL, 
  168.     NULL, NULL, NULL, NULL, NULL, NULL, 
  169. #endif
  170.  
  171. };
  172. ///////////////////////////////////////////////////////////////////////////////
  173. // Public Functions
  174. ///////////////////////////////////////////////////////////////////////////////
  175. CMpaDecoderL2::CMpaDecoderL2()
  176.  :  CMpaDecoder()
  177. {
  178. table_init();
  179. }
  180. CMpaDecoderL2::~CMpaDecoderL2()
  181. {
  182. }
  183. #ifdef REFORMAT
  184. IN_OUT  CMpaDecoderL2::audio_decode_reformat(unsigned char *bs,
  185.                          unsigned char *bs_out)
  186. {
  187.     IN_OUT x;
  188.     x.in_bytes = 0;     // signal fail, not relevant for Layer 2
  189.     x.out_bytes = 0;
  190.     return x;
  191. }
  192. #endif
  193. //================================================================
  194. int CMpaDecoderL2::audio_decode_init(MPEG_HEAD *h,
  195.                                        int framebytes_arg,
  196.                                        int reduction_code,
  197.                                        int transform_code,
  198.                                        int convert_code,
  199.                                        int freq_limit,
  200.                                        int conceal_enable)
  201. {
  202. int i, j, k;
  203. int abcd_index;
  204. long samprate;
  205. int limit;
  206. int bit_code;
  207. /* check if code handles */
  208. if( h->option != 2 )  return 0;  /* layer II only */
  209. #ifndef REDUCTION
  210.     reduction_code = 0;
  211. #endif
  212. #ifndef EIGHT_BIT
  213.     convert_code = 0;
  214. #endif
  215. m_bMpeg1 = h->id;
  216. m_nSampsPerFrame = 1152;
  217. transform_code = transform_code;    /* not used, asm compatability */
  218. bit_code = 0;
  219. if( convert_code & 8 ) bit_code = 1;
  220. convert_code = convert_code & 3;    /* higher bits used by dec8 freq cvt */
  221. if( reduction_code < 0 ) reduction_code = 0;
  222. if( reduction_code > 2 ) reduction_code = 2;
  223. if( freq_limit < 1000 ) freq_limit = 1000;
  224. framebytes = framebytes_arg;
  225. /* check if code handles */
  226. if( h->sr_index == 3 ) return 0;       /* reserved */
  227. /* compute abcd index for bit allo table selection */
  228. if( h->id )                /* mpeg 1 */
  229.    abcd_index = lookqt[h->mode][h->sr_index][h->br_index];
  230. else  abcd_index = 4;      /* mpeg 2 */
  231. if( abcd_index < 0 ) return 0;  // fail invalid Layer II bit rate index
  232. for(i=0;i<4;i++) {
  233.     for(j=0;j<16;j++) bat[i][j] = look_bat[abcd_index][i][j];
  234. }
  235. for(i=0;i<4;i++) nbat[i] = look_nbat[abcd_index][i];
  236. max_sb = nbat[0] + nbat[1] + nbat[2] + nbat[3];
  237. /*----- compute nsb_limit --------*/
  238. samprate = sr_table_L2[4*h->id + h->sr_index];
  239. nsb_limit = (freq_limit*64L + samprate/2)/samprate;   /*- caller limit -*/
  240. /*---- limit = 0.94*(32>>reduction_code);  ----*/
  241. limit = (32>>reduction_code);
  242. if( limit > 8 ) limit--;
  243. if( nsb_limit > limit )  nsb_limit = limit;
  244. if( nsb_limit > max_sb ) nsb_limit = max_sb;
  245. outvalues = 1152 >> reduction_code;
  246. if( h->mode != 3 ) {         /* adjust for 2 channel modes */
  247.           for(i=0;i<4;i++) nbat[i] *= 2;
  248.           max_sb *= 2;
  249.           nsb_limit *= 2;
  250. }
  251. /* set sbt function */
  252. k = 1 + convert_code;
  253. if( h->mode == 3 ) {
  254.           k = 0;
  255.           }
  256. sbt = sbt_table_L2[bit_code][reduction_code][k];
  257. outvalues *= out_chans_L2[k];
  258. if( bit_code )  outbytes = outvalues;
  259. else            outbytes = sizeof(short)*outvalues;
  260. decinfo.channels  = out_chans_L2[k];
  261. decinfo.outvalues = outvalues;
  262. decinfo.samprate =  samprate >> reduction_code;
  263. if( bit_code ) decinfo.bits     = 8;
  264. else           decinfo.bits     = sizeof(short)*8;
  265. decinfo.framebytes = framebytes;
  266. decinfo.type = 0;
  267. /* clear sample buffer, unused sub bands must be 0 */
  268. for(i=0;i<2304;i++) sample[i] = 0.0F;
  269. return 1;
  270. }
  271. /*---------------------------------------------------------*/
  272. IN_OUT CMpaDecoderL2::audio_decode(unsigned char *bs,
  273.                                    unsigned char *pcm,
  274.                                    int size)
  275. {
  276. int sync, prot;
  277. IN_OUT in_out;
  278. load_init(bs);          /* initialize bit getter */
  279. /* test sync */
  280. in_out.in_bytes = 0;     /* assume fail */
  281. in_out.out_bytes = 0;
  282. sync = load(12);
  283. if( sync != 0xFFF ) return in_out;       /* sync fail */
  284. load(3);   /* skip id and option (checked by init) */
  285. prot = load(1);     /* load prot bit */
  286. load(6);            /* skip to pad */
  287. pad = load(1);
  288. load(1);            /* skip to mode */
  289. stereo_sb = look_joint_L2[load(4)];
  290. if( prot ) load(4);           /* skip to data */
  291. else       load(20);          /* skip crc */
  292. unpack_ba();        /* unpack bit allocation */
  293. unpack_sfs();       /* unpack scale factor selectors */
  294. unpack_sf();        /* unpack scale factor */
  295. unpack_samp();      /* unpack samples */
  296. sbt(sample, pcm, 36, vbuf, vb_ptr);
  297. /*-----------*/
  298. in_out.in_bytes = framebytes + pad;
  299. in_out.out_bytes = outbytes;
  300. return in_out;
  301. }
  302. ///////////////////////////////////////////////////////////////////////////////
  303. // Private Functions
  304. ///////////////////////////////////////////////////////////////////////////////
  305. void CMpaDecoderL2::table_init()
  306. {
  307. int i, j;
  308. int code;
  309. /*--  c_values (dequant) --*/
  310. for(i=1;i<18;i++) look_c_value[i] = 2.0F/steps[i];
  311. /*--  scale factor table, scale by 32768 for 16 pcm output  --*/
  312. for(i=0;i<64;i++) sf_table[i] = (float)(32768.0*2.0*pow(2.0,-i/3.0));
  313. /*--  grouped 3 level lookup table 5 bit token --*/
  314. for(i=0;i<32;i++) {
  315.    code = i;
  316.    for(j=0;j<3;j++) {
  317.       group3_table[i][j] = (char)(( code % 3 ) - 1);
  318.       code /= 3;
  319.   }
  320. }
  321. /*--  grouped 5 level lookup table 7 bit token --*/
  322. for(i=0;i<128;i++) {
  323.    code = i;
  324.    for(j=0;j<3;j++) {
  325.       group5_table[i][j] = (char)(( code % 5 ) - 2);
  326.       code /= 5;
  327.   }
  328. }
  329. /*--  grouped 9 level lookup table 10 bit token --*/
  330. for(i=0;i<1024;i++) {
  331.    code = i;
  332.    for(j=0;j<3;j++) {
  333.       group9_table[i][j] = (short)(( code % 9 ) - 4);
  334.       code /= 9;
  335.   }
  336. }
  337. }
  338. /*---------------------------------------------------------*/
  339. /*------------- bit getter --------------------------------*/
  340. /*---------------------------------------------------------*/
  341. void CMpaDecoderL2::load_init( unsigned char *buf)
  342. {
  343. bs_ptr = buf;
  344. bits = 0;
  345. bitbuf = 0;
  346. }
  347. /*------------- get n bits from bitstream -------------*/
  348. int CMpaDecoderL2::load( int n)
  349. {
  350. unsigned int x;
  351. if( bits < n ) {           /* refill bit buf if necessary */
  352.           while( bits <= 24 ) {
  353.              bitbuf = (bitbuf << 8) | *bs_ptr++;
  354.              bits += 8;
  355.           }
  356. }
  357. bits -= n;
  358. x = bitbuf >> bits;
  359. bitbuf -= x << bits;
  360. return x;
  361. }
  362. /*------------- skip over n bits in bitstream -------------*/
  363. void CMpaDecoderL2::skip( int n)
  364. {
  365. int k;
  366. if( bits < n ) {
  367.           n -= bits;
  368.           k = n >> 3;     /*--- bytes = n/8 --*/
  369.           bs_ptr+=k;
  370.           n -= k << 3;
  371.           bitbuf =  *bs_ptr++;
  372.           bits = 8;
  373.           }
  374. bits -= n;
  375. bitbuf -= (bitbuf >> bits) << bits;
  376. }
  377. /*--------------------------------------------------------------*/
  378. #define mac_load_check(n)                     
  379.    if( bits < (n) ) {                           
  380.           while( bits <= 24 ) {               
  381.              bitbuf = (bitbuf << 8) | *bs_ptr++;  
  382.              bits += 8;                       
  383.           }                                   
  384.    }
  385. /*--------------------------------------------------------------*/
  386. #define mac_load(n)                    
  387.        ( bits -= n,                    
  388.          bitval = bitbuf >> bits,      
  389.          bitbuf -= bitval << bits,     
  390.          bitval )
  391. static const int nbit[4] = { 4, 4, 3, 2 };
  392. /*======================================================================*/
  393. void CMpaDecoderL2::unpack_ba()
  394. {
  395. int i, j, k;
  396. int nstereo;
  397. bit_skip = 0;
  398. nstereo = stereo_sb;
  399. k = 0;
  400. for(i=0;i<4;i++) {
  401.    for(j=0;j<nbat[i]; j++, k++) {
  402.    mac_load_check(4);
  403.    ballo[k] = samp_dispatch[k] = bat[i][mac_load(nbit[i])];
  404.    if( k >= nsb_limit )  bit_skip += bat_bit_master_L2[samp_dispatch[k]];
  405.    c_value[k] = look_c_value[samp_dispatch[k]];
  406.    if( --nstereo < 0 ) {
  407.        ballo[k+1] = ballo[k];
  408.        samp_dispatch[k] += 18;  /* flag as joint */
  409.        samp_dispatch[k+1] = samp_dispatch[k];  /* flag for sf */
  410.        c_value[k+1] = c_value[k];
  411.        k++;
  412.        j++;
  413.    }
  414.    }
  415. }
  416. samp_dispatch[nsb_limit] = 37;   /* terminate the dispatcher with skip */
  417. samp_dispatch[k] = 36;           /* terminate the dispatcher */
  418. }
  419. /*-------------------------------------------------------------------------*/
  420. void CMpaDecoderL2::unpack_sfs()    /* unpack scale factor selectors */
  421. {
  422. int i;
  423. for(i=0;i<max_sb;i++) {
  424.   mac_load_check(2);
  425.   if( ballo[i] ) sf_dispatch[i] = mac_load(2);
  426.   else           sf_dispatch[i] = 4;           /* no allo */
  427. }
  428. sf_dispatch[i] = 5;    /* terminate dispatcher */
  429. }
  430. /*-------------------------------------------------------------------------*/
  431. void CMpaDecoderL2::unpack_sf()    /* unpack scale factor */
  432. {                          /* combine dequant and scale factors */
  433. int i;
  434. i = -1;
  435. dispatch:   switch (sf_dispatch[++i]) {
  436. case 0:              /* 3 factors 012 */
  437.   mac_load_check(18);
  438.   cs_factor[0][i] = c_value[i]*sf_table[mac_load(6)];
  439.   cs_factor[1][i] = c_value[i]*sf_table[mac_load(6)];
  440.   cs_factor[2][i] = c_value[i]*sf_table[mac_load(6)];
  441.   goto dispatch;
  442. case 1:             /* 2 factors 002 */
  443.   mac_load_check(12);
  444.   cs_factor[1][i] = cs_factor[0][i] = c_value[i]*sf_table[mac_load(6)];
  445.   cs_factor[2][i] = c_value[i]*sf_table[mac_load(6)];
  446.   goto dispatch;
  447. case 2:             /* 1 factor 000 */
  448.   mac_load_check(6);
  449.   cs_factor[2][i] = cs_factor[1][i] = cs_factor[0][i] =
  450.                                        c_value[i]*sf_table[mac_load(6)];
  451.   goto dispatch;
  452. case 3:             /* 2 factors 022 */
  453.   mac_load_check(12);
  454.   cs_factor[0][i] = c_value[i]*sf_table[mac_load(6)];
  455.   cs_factor[2][i] = cs_factor[1][i] = c_value[i]*sf_table[mac_load(6)];
  456.   goto dispatch;
  457. case 4:             /* no allo */
  458.   /*-- cs_factor[2][i] = cs_factor[1][i] = cs_factor[0][i] = 0.0;  --*/
  459.   goto dispatch;
  460. case 5:             /* all done */
  461. ;
  462. } /* end switch */
  463. }
  464. /*-------------------------------------------------------------------------*/
  465. #define UNPACK_N(n)                                          
  466.     s[k]     =  cs_factor[i][k]*(load(n)-((1 << n-1) -1));   
  467.     s[k+64]  =  cs_factor[i][k]*(load(n)-((1 << n-1) -1));   
  468.     s[k+128] =  cs_factor[i][k]*(load(n)-((1 << n-1) -1));   
  469.     goto dispatch;
  470. #define UNPACK_N2(n)                                             
  471.     mac_load_check(3*n);                                         
  472.     s[k]     =  cs_factor[i][k]*(mac_load(n)-((1 << n-1) -1));   
  473.     s[k+64]  =  cs_factor[i][k]*(mac_load(n)-((1 << n-1) -1));   
  474.     s[k+128] =  cs_factor[i][k]*(mac_load(n)-((1 << n-1) -1));   
  475.     goto dispatch;
  476. #define UNPACK_N3(n)                                             
  477.     mac_load_check(2*n);                                         
  478.     s[k]     =  cs_factor[i][k]*(mac_load(n)-((1 << n-1) -1));   
  479.     s[k+64]  =  cs_factor[i][k]*(mac_load(n)-((1 << n-1) -1));   
  480.     mac_load_check(n);                                           
  481.     s[k+128] =  cs_factor[i][k]*(mac_load(n)-((1 << n-1) -1));   
  482.     goto dispatch;
  483. #define UNPACKJ_N(n)                                         
  484.     tmp        =  (load(n)-((1 << n-1) -1));                 
  485.     s[k]       =  cs_factor[i][k]*tmp;                       
  486.     s[k+1]     =  cs_factor[i][k+1]*tmp;                     
  487.     tmp        =  (load(n)-((1 << n-1) -1));                 
  488.     s[k+64]    =  cs_factor[i][k]*tmp;                       
  489.     s[k+64+1]  =  cs_factor[i][k+1]*tmp;                     
  490.     tmp        =  (load(n)-((1 << n-1) -1));                 
  491.     s[k+128]   =  cs_factor[i][k]*tmp;                       
  492.     s[k+128+1] =  cs_factor[i][k+1]*tmp;                     
  493.     k++;       /* skip right chan dispatch */                
  494.     goto dispatch;
  495. /*-------------------------------------------------------------------------*/
  496. void CMpaDecoderL2::unpack_samp()    /* unpack samples */
  497. {
  498. int i, j, k;
  499. float *s;
  500. int n;
  501. long tmp;
  502. s = sample;
  503. for(i=0;i<3;i++)  {           /* 3 groups of scale factors */
  504. for(j=0;j<4;j++)  {
  505. k = -1;
  506. dispatch:   switch (samp_dispatch[++k]) {
  507. case 0:
  508.    s[k+128] = s[k+64] = s[k] =  0.0F;
  509.    goto dispatch;
  510. case 1:                     /* 3 levels grouped 5 bits */
  511.     mac_load_check(5);
  512.     n = mac_load(5);
  513.     s[k]     =  cs_factor[i][k]*group3_table[n][0];
  514.     s[k+64]  =  cs_factor[i][k]*group3_table[n][1];
  515.     s[k+128] =  cs_factor[i][k]*group3_table[n][2];
  516.     goto dispatch;
  517. case 2:                     /* 5 levels grouped 7 bits */
  518.     mac_load_check(7);
  519.     n = mac_load(7);
  520.     s[k]     =  cs_factor[i][k]*group5_table[n][0];
  521.     s[k+64]  =  cs_factor[i][k]*group5_table[n][1];
  522.     s[k+128] =  cs_factor[i][k]*group5_table[n][2];
  523.     goto dispatch;
  524. case 3:     UNPACK_N2(3)     /* 7 levels */
  525. case 4:                     /* 9 levels grouped 10 bits */
  526.     mac_load_check(10);
  527.     n = mac_load(10);
  528.     s[k]     =  cs_factor[i][k]*group9_table[n][0];
  529.     s[k+64]  =  cs_factor[i][k]*group9_table[n][1];
  530.     s[k+128] =  cs_factor[i][k]*group9_table[n][2];
  531.     goto dispatch;
  532. case 5:     UNPACK_N2(4)     /* 15 levels */
  533. case 6:     UNPACK_N2(5)     /* 31 levels */
  534. case 7:     UNPACK_N2(6)     /* 63 levels */
  535. case 8:     UNPACK_N2(7)     /* 127 levels */
  536. case 9:     UNPACK_N2(8)     /* 255 levels */
  537. case 10:    UNPACK_N3(9)     /* 511 levels */
  538. case 11:    UNPACK_N3(10)    /* 1023 levels */
  539. case 12:    UNPACK_N3(11)    /* 2047 levels */
  540. case 13:    UNPACK_N3(12)    /* 4095 levels */
  541. case 14:    UNPACK_N(13)    /* 8191 levels */
  542. case 15:    UNPACK_N(14)    /* 16383 levels */
  543. case 16:    UNPACK_N(15)    /* 32767 levels */
  544. case 17:    UNPACK_N(16)    /* 65535 levels */
  545. /* -- joint ---- */
  546. case 18+0:
  547.     s[k+128+1] = s[k+128] = s[k+64+1] = s[k+64] = s[k+1] = s[k] =  0.0F;
  548.     k++;       /* skip right chan dispatch */
  549.     goto dispatch;
  550. case 18+1:                    /* 3 levels grouped 5 bits */
  551.     n = load(5);
  552.     s[k]       =  cs_factor[i][k]*group3_table[n][0];
  553.     s[k+1]     =  cs_factor[i][k+1]*group3_table[n][0];
  554.     s[k+64]    =  cs_factor[i][k]*group3_table[n][1];
  555.     s[k+64+1]  =  cs_factor[i][k+1]*group3_table[n][1];
  556.     s[k+128]   =  cs_factor[i][k]*group3_table[n][2];
  557.     s[k+128+1] =  cs_factor[i][k+1]*group3_table[n][2];
  558.     k++;       /* skip right chan dispatch */
  559.     goto dispatch;
  560. case 18+2:                     /* 5 levels grouped 7 bits */
  561.     n = load(7);
  562.     s[k]       =  cs_factor[i][k]*group5_table[n][0];
  563.     s[k+1]     =  cs_factor[i][k+1]*group5_table[n][0];
  564.     s[k+64]    =  cs_factor[i][k]*group5_table[n][1];
  565.     s[k+64+1]  =  cs_factor[i][k+1]*group5_table[n][1];
  566.     s[k+128]   =  cs_factor[i][k]*group5_table[n][2];
  567.     s[k+128+1] =  cs_factor[i][k+1]*group5_table[n][2];
  568.     k++;       /* skip right chan dispatch */
  569.     goto dispatch;
  570. case 18+3:     UNPACKJ_N(3)     /* 7 levels */
  571. case 18+4:                     /* 9 levels grouped 10 bits */
  572.     n = load(10);
  573.     s[k]      =  cs_factor[i][k]*group9_table[n][0];
  574.     s[k+1]    =  cs_factor[i][k+1]*group9_table[n][0];
  575.     s[k+64]   =  cs_factor[i][k]*group9_table[n][1];
  576.     s[k+64+1] =  cs_factor[i][k+1]*group9_table[n][1];
  577.     s[k+128]  =  cs_factor[i][k]*group9_table[n][2];
  578.     s[k+128+1]=  cs_factor[i][k+1]*group9_table[n][2];
  579.     k++;       /* skip right chan dispatch */
  580.     goto dispatch;
  581. case 18+5:     UNPACKJ_N(4)     /* 15 levels */
  582. case 18+6:     UNPACKJ_N(5)     /* 31 levels */
  583. case 18+7:     UNPACKJ_N(6)     /* 63 levels */
  584. case 18+8:     UNPACKJ_N(7)     /* 127 levels */
  585. case 18+9:     UNPACKJ_N(8)     /* 255 levels */
  586. case 18+10:    UNPACKJ_N(9)     /* 511 levels */
  587. case 18+11:    UNPACKJ_N(10)    /* 1023 levels */
  588. case 18+12:    UNPACKJ_N(11)    /* 2047 levels */
  589. case 18+13:    UNPACKJ_N(12)    /* 4095 levels */
  590. case 18+14:    UNPACKJ_N(13)    /* 8191 levels */
  591. case 18+15:    UNPACKJ_N(14)    /* 16383 levels */
  592. case 18+16:    UNPACKJ_N(15)    /* 32767 levels */
  593. case 18+17:    UNPACKJ_N(16)    /* 65535 levels */
  594. /* -- end of dispatch -- */
  595. case 37:
  596.    skip(bit_skip);
  597. case 36:
  598.    s += 3*64;
  599. } /* end switch */
  600. } /* end j loop */
  601. } /* end i loop */
  602. }
  603. /*-------------------------------------------------------------------------*/