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

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 "mhead.h"
  38. #include "mpadecl3.h"
  39. #define min(a,b)  ((((a)>=(b))?(b):(a))) 
  40. #include "mpalowl3.h"     // low level extern C prototypes
  41. ///////////////////////////////////////////////////////////////////////////////
  42. // Static Data:
  43. ///////////////////////////////////////////////////////////////////////////////
  44. static const int mp_sr20_table_L3[2][4]={441,480,320,-999, 882,960,640,-999};
  45. static const int mp_br_table_L3[2][16]=
  46.     {0,8,16,24,32,40,48,56,64,80,96,112,128,144,160,0,    /* mpeg 2 */
  47.      0,32,40,48,56,64,80,96,112,128,160,192,224,256,320,0};
  48. static const int sr_table_L3[8] =
  49.     { 22050, 24000, 16000, 1,
  50.       44100, 48000, 32000, 1 };
  51. // shorts used to save a few bytes
  52. static const struct  {
  53. short l[23];
  54. short s[14];} sfBandIndexTable[3][3] =   {
  55. /* mpeg-2 */
  56. {
  57. {{0,6,12,18,24,30,36,44,54,66,80,96,116,140,168,200,238,284,336,396,464,522,576},
  58.  {0,4,8,12,18,24,32,42,56,74,100,132,174,192}},
  59. {{0,6,12,18,24,30,36,44,54,66,80,96,114,136,162,194,232,278,332,394,464,540,576},
  60.  {0,4,8,12,18,26,36,48,62,80,104,136,180,192}},
  61. {{0,6,12,18,24,30,36,44,54,66,80,96,116,140,168,200,238,284,336,396,464,522,576},
  62.  {0,4,8,12,18,26,36,48,62,80,104,134,174,192}},
  63. },
  64. /* mpeg-1 */
  65. {
  66. {{0,4,8,12,16,20,24,30,36,44,52,62,74,90,110,134,162,196,238,288,342,418,576},
  67.  {0,4,8,12,16,22,30,40,52,66,84,106,136,192}},
  68. {{0,4,8,12,16,20,24,30,36,42,50,60,72,88,106,128,156,190,230,276,330,384,576},
  69.  {0,4,8,12,16,22,28,38,50,64,80,100,126,192}},
  70. {{0,4,8,12,16,20,24,30,36,44,54,66,82,102,126,156,194,240,296,364,448,550,576},
  71.  {0,4,8,12,16,22,30,42,58,78,104,138,180,192}}
  72. },
  73. /* mpeg-2.5, 11 & 12 KHz seem ok, 8 ok */
  74. {
  75. {{0,6,12,18,24,30,36,44,54,66,80,96,116,140,168,200,238,284,336,396,464,522,576},
  76.  {0,4,8,12,18,26,36,48,62,80,104,134,174,192}},
  77. {{0,6,12,18,24,30,36,44,54,66,80,96,116,140,168,200,238,284,336,396,464,522,576},
  78.  {0,4,8,12,18,26,36,48,62,80,104,134,174,192}},
  79. // this 8khz table, and only 8khz, from mpeg123)
  80. {{0,12,24,36,48,60,72,88,108,132,160,192,232,280,336,400,476,566,568,570,572,574,576},
  81.  {0,8,16,24,36,52,72,96,124,160,162,164,166,192}},
  82. },
  83. };
  84. static const SBT_FUNCTION_L3  sbt_table_L3[2][3][2] = {
  85.     sbt_mono_L3,
  86.     sbt_dual_L3,
  87. #ifdef REDUCTION
  88.     sbt16_mono_L3,
  89.     sbt16_dual_L3,
  90.     sbt8_mono_L3,
  91.     sbt8_dual_L3,
  92. #else
  93.   NULL, NULL, NULL, NULL,
  94. #endif
  95. #ifdef EIGHT_BIT  
  96. /*-- 8 bit output -*/
  97.     sbtB_mono_L3,
  98.     sbtB_dual_L3,
  99. #ifdef REDUCTION
  100.     sbtB16_mono_L3,
  101.     sbtB16_dual_L3,
  102.     sbtB8_mono_L3,
  103.     sbtB8_dual_L3,
  104. #else 
  105.   NULL, NULL, NULL, NULL,
  106. #endif
  107. #endif
  108. };
  109. ///////////////////////////////////////////////////////////////////////////////
  110. // Public Functions
  111. ///////////////////////////////////////////////////////////////////////////////
  112. CMpaDecoderL3::CMpaDecoderL3()
  113.  :  CMpaDecoder(),
  114.     mpeg25_flag(0),
  115.     stereo_flag(0),
  116.     igr(0),
  117.     band_limit(576),
  118.     band_limit21(576),
  119.     band_limit12(576),
  120.     band_limit_nsb(32),
  121.     gain_adjust(0),
  122.     id(1),
  123.     ncbl_mixed(0),
  124.     half_outbytes(0),
  125.     zero_level_pcm(0),
  126.     buf_ptr0(0),
  127.     buf_ptr1(0),
  128.     main_pos_bit(0),
  129. #ifdef REFORMAT
  130.     reformat_bytes(0),
  131.     reformat_side_bytes(0),
  132. #endif
  133.     conceal_flag(0)
  134. {
  135.     // memsets not really needed
  136.     //memset(samp_save, 0, sizeof(samp_save));
  137.     memset(nBand, 0, sizeof(nBand));
  138.     memset(sfBandIndex, 0, sizeof(sfBandIndex));
  139.     memset(cb_info, 0, sizeof(cb_info));
  140.     memset(&is_sf_info, 0, sizeof(is_sf_info));
  141.     memset(buf, 0, sizeof(buf));
  142.     memset(&side_info, 0, sizeof(side_info));
  143.     memset(sf, 0, sizeof(sf));
  144.     memset(nsamp, 0, sizeof(nsamp));
  145.     memset(yout, 0, sizeof(yout));
  146.     memset(sample, 0, sizeof(sample));
  147.     conceal[0] = conceal[1] = NULL;
  148. }
  149. CMpaDecoderL3::~CMpaDecoderL3()
  150. {
  151. int i;
  152.     for(i=0;i<2;i++) {
  153. #if defined (MP3_CONCEAL_LOSS)
  154.         if( conceal[i] != NULL ) delete conceal[i];
  155. #endif //MP3_CONCEAL_LOSS
  156.     }
  157. }
  158. //=======================================================================
  159. int CMpaDecoderL3::audio_decode_init(MPEG_HEAD *h,
  160.                                   int framebytes_arg,
  161.                                   int reduction_code,
  162.                                   int transform_code,
  163.                                   int convert_code,
  164.                                   int freq_limit,
  165.                                   int conceal_enable)
  166. {
  167. int i, j, k;
  168. int samprate;
  169. int limit;
  170. int bit_code;
  171. int out_chans;
  172. // could have multiple inits, free error conceal class if any
  173. for(i=0;i<2;i++) {
  174.     if( conceal[i] != NULL ) {
  175. #if defined (MP3_CONCEAL_LOSS)
  176.         delete conceal[i];
  177.         conceal[i] = NULL;
  178. #endif //MP3_CONCEAL_LOSS
  179.     }
  180. }
  181. conceal_flag = 0;
  182. if( conceal_enable ) conceal_flag = 1;
  183. buf_ptr0 = 0;
  184. buf_ptr1 = 0;
  185. /* check if code handles */
  186. if( h->option != 1 ) return 0;         /* layer III only */
  187. if( h->id ) ncbl_mixed = 8;  /* mpeg-1 */
  188. else        ncbl_mixed = 6;  /* mpeg-2 */
  189. m_bMpeg1 = h->id;
  190. m_nSampsPerFrame = 1152;
  191. if (!m_bMpeg1)
  192.     m_nSampsPerFrame >>=1;
  193. framebytes = framebytes_arg;
  194. transform_code = transform_code;    /* not used, asm compatability */
  195. bit_code = 0;
  196. #ifndef REDUCTION
  197.     reduction_code = 0;
  198. #endif
  199. #ifdef EIGHT_BIT
  200. if( convert_code & 8 ) bit_code = 1;
  201. #endif
  202. convert_code = convert_code & 3;    /* higher bits used by dec8 freq cvt */
  203. if( reduction_code < 0 ) reduction_code = 0;
  204. if( reduction_code > 2 ) reduction_code = 2;
  205. if( freq_limit < 1000 ) freq_limit = 1000;
  206. samprate = sr_table_L3[4*h->id + h->sr_index];
  207. if( (h->sync & 1) == 0 ) samprate = samprate/2;  // mpeg 2.5 
  208. /*----- compute nsb_limit --------*/
  209. nsb_limit = (freq_limit*64L + samprate/2)/samprate;   /*- caller limit -*/
  210. limit = (32>>reduction_code);
  211. if( limit > 8 ) limit--;
  212. if( nsb_limit > limit )  nsb_limit = limit;
  213. limit = 18*nsb_limit;
  214. k = h->id;
  215. if( (h->sync & 1) == 0 ) k = 2;  // mpeg 2.5 
  216. if( k == 1 ) {
  217. band_limit12 = 3*sfBandIndexTable[k][h->sr_index].s[13];
  218. band_limit = band_limit21 = sfBandIndexTable[k][h->sr_index].l[22];
  219. }
  220. else {
  221. band_limit12 = 3*sfBandIndexTable[k][h->sr_index].s[12];
  222. band_limit = band_limit21 = sfBandIndexTable[k][h->sr_index].l[21];
  223. }
  224. band_limit += 8;        /* allow for antialias */
  225. if( band_limit > limit ) band_limit = limit;
  226. if( band_limit21 > band_limit ) band_limit21 = band_limit;
  227. if( band_limit12 > band_limit ) band_limit12 = band_limit;
  228. band_limit_nsb = (band_limit+17)/18;  /* limit nsb's rounded up */
  229. /*----------------------------------------------*/
  230. gain_adjust = 0;     /* adjust gain e.g. cvt to mono sum channel */
  231. if( (h->mode != 3) && (convert_code == 1) ) gain_adjust = -4;
  232. outvalues = 1152 >> reduction_code;
  233. if( h->id == 0 ) outvalues /= 2;
  234. out_chans = 2;
  235. if( h->mode == 3 ) out_chans = 1;
  236. if( convert_code ) out_chans = 1;
  237. sbt_L3 = sbt_table_L3[bit_code][reduction_code][out_chans-1];
  238. k = 1 + convert_code;
  239. if( h->mode == 3 ) k = 0;
  240. // Store the proper xform offset in Xform.  We will need to
  241. // do a switch on Xform and call the appropriate member function.
  242. iXform = k;
  243. //Xform = xform_table[k];
  244. outvalues *= out_chans;
  245. if( bit_code )  outbytes = outvalues;
  246. else            outbytes = sizeof(short)*outvalues;
  247. if( bit_code ) zero_level_pcm = 128;   /* 8 bit output */
  248. else           zero_level_pcm = 0;
  249. decinfo.channels  = out_chans;
  250. decinfo.outvalues = outvalues;
  251. decinfo.samprate =  samprate >> reduction_code;
  252. if( bit_code ) decinfo.bits     = 8;
  253. else           decinfo.bits     = sizeof(short)*8;
  254. decinfo.framebytes = framebytes;
  255. decinfo.type = 0;
  256. half_outbytes = outbytes/2;
  257. /*------------------------------------------*/
  258. /*- init band tables --*/
  259. k = h->id;
  260. if( (h->sync & 1) == 0 ) k = 2;  // mpeg 2.5 
  261. for(i=0;i<22;i++) 
  262.     sfBandIndex[0][i] = sfBandIndexTable[k][h->sr_index].l[i+1];
  263. for(i=0;i<13;i++) 
  264.     sfBandIndex[1][i] = 3*sfBandIndexTable[k][h->sr_index].s[i+1];
  265. for(i=0;i<22;i++) nBand[0][i] = 
  266.     sfBandIndexTable[k][h->sr_index].l[i+1] 
  267.         - sfBandIndexTable[k][h->sr_index].l[i];
  268. for(i=0;i<13;i++) nBand[1][i] = 
  269.     sfBandIndexTable[k][h->sr_index].s[i+1] 
  270.         - sfBandIndexTable[k][h->sr_index].s[i];
  271. /*--- clear buffers --*/
  272. for(i=0;i<576;i++) yout[i] = 0.0f;
  273. for(j=0;j<2;j++) {
  274.     for(k=0;k<2;k++) {
  275.         for(i=0;i<576;i++) {
  276.             sample[j][k][i].x = 0.0f;
  277.             sample[j][k][i].s = 0;
  278.         }
  279.     }
  280. }
  281. // h_id used to select xform routine
  282. h_id = h->id;
  283. // conceal class
  284. //conceal[0] = new CConcealment(band_limit21);
  285. //if( h->mode != 3 ) {   // need two channels of concealment
  286. //    conceal[1] = new CConcealment(band_limit21);
  287. //}
  288. if( conceal_flag ) {
  289. #if defined (MP3_CONCEAL_LOSS)    
  290.     conceal[0] = new CConcealment(576);
  291.     if( h->mode != 3 ) {   // need two channels of concealment
  292.         conceal[1] = new CConcealment(576);
  293.     }
  294. #endif //MP3_CONCEAL_LOSS
  295. }
  296. return 1;
  297. }
  298. //=========================================================================
  299. IN_OUT CMpaDecoderL3::audio_decode(unsigned char *bs, unsigned char *pcm)
  300. {
  301.     if( h_id )  {
  302.         return L3audio_decode_MPEG1(bs, pcm);
  303.     }
  304.     else {
  305.         return L3audio_decode_MPEG2(bs, pcm);
  306.     }
  307. }
  308. ///////////////////////////////////////////////////////////////////////////////
  309. // Private Functions
  310. ///////////////////////////////////////////////////////////////////////////////
  311. /*---------------------------------------------------------*/
  312. IN_OUT CMpaDecoderL3::L3audio_decode_MPEG1(unsigned char *bs, 
  313.                                            unsigned char *pcm)
  314. {
  315.     int sync;
  316.     IN_OUT in_out;
  317.     int side_bytes;
  318.     int nbytes;
  319.     iframe++;
  320.     bitget_init(&bitdat, bs); /* initialize bit getter */
  321.     /* test sync */
  322.     in_out.in_bytes = 0;      /* assume fail */
  323.     in_out.out_bytes = 0;
  324.     sync = bitget(&bitdat, 12);
  325.     if( sync != 0xFFF ) return in_out;       /* sync fail */
  326.     /*-----------*/
  327.     /*-- unpack side info --*/
  328.     side_bytes = unpack_side_MPEG1();
  329.     if( framebytes <= 0 ) return in_out;  // fail bad sr or br index
  330.     padframebytes = framebytes+pad;
  331.     in_out.in_bytes = padframebytes;
  332.     /*-- load main data and update buf pointer --*/
  333.     /*------------------------------------------- 
  334.       if start point < 0, must just cycle decoder 
  335.       if jumping into middle of stream, 
  336.       ---------------------------------------------*/
  337.     buf_ptr0 = buf_ptr1 - side_info.main_data_begin;   /* decode start point */
  338.     if( buf_ptr1 > BUF_TRIGGER ) {          /* shift buffer */
  339.         memmove(buf, buf+buf_ptr0, side_info.main_data_begin);
  340.         buf_ptr0 = 0;
  341.         buf_ptr1 = side_info.main_data_begin;
  342.     }
  343.     nbytes = padframebytes - side_bytes - crcbytes;
  344.     if( nbytes>0 )
  345.     {
  346.         memmove(buf+buf_ptr1, bs+side_bytes+crcbytes, nbytes);
  347.         buf_ptr1 += nbytes;
  348.     }
  349.     
  350.     /*-----------------------*/
  351.  
  352.     if( buf_ptr0 >= 0 ) {
  353.         main_pos_bit = buf_ptr0 << 3;
  354.         unpack_main(buf, 0);
  355.         Xform(pcm, 0);
  356.         unpack_main(buf, 1);
  357.         Xform(pcm+half_outbytes, 1);
  358.         in_out.out_bytes = outbytes;
  359.     }
  360.     else {
  361.         memset(pcm, zero_level_pcm, outbytes);  /* fill out skipped frames */
  362.         in_out.out_bytes = outbytes;
  363.     }
  364.     return in_out;
  365. }
  366. //=========================================================================
  367. IN_OUT CMpaDecoderL3::L3audio_decode_MPEG2(unsigned char *bs, unsigned char *pcm)
  368. {
  369. int sync;
  370. IN_OUT in_out;
  371. int side_bytes;
  372. int nbytes;
  373. iframe++;
  374. bitget_init(&bitdat, bs);          /* initialize bit getter */
  375. /* test sync */
  376. in_out.in_bytes = 0;     /* assume fail */
  377. in_out.out_bytes = 0;
  378. sync = bitget(&bitdat, 12);
  379. //if( sync != 0xFFF ) return in_out;       /* sync fail */
  380. mpeg25_flag = 0;
  381. if( sync != 0xFFF ) {
  382.     mpeg25_flag = 1;       /* mpeg 2.5 sync */
  383.     if( sync != 0xFFE ) return in_out;  /* sync fail */
  384. }
  385. /*-----------*/
  386. /*-- unpack side info --*/
  387. side_bytes = unpack_side_MPEG2(igr);
  388. if( framebytes <= 0 ) return in_out;  // fail bad sr or br index
  389. padframebytes = framebytes+pad;
  390. in_out.in_bytes = padframebytes;
  391. buf_ptr0 = buf_ptr1 - side_info.main_data_begin;   /* decode start point */
  392. if( buf_ptr1 > BUF_TRIGGER ) {          /* shift buffer */
  393.     memmove(buf, buf+buf_ptr0, side_info.main_data_begin);
  394.     buf_ptr0 = 0;
  395.     buf_ptr1 = side_info.main_data_begin;
  396. }
  397. nbytes = padframebytes - side_bytes - crcbytes;
  398. memmove(buf+buf_ptr1, bs+side_bytes+crcbytes, nbytes);
  399. buf_ptr1 += nbytes;
  400. /*-----------------------*/
  401. if( buf_ptr0 >= 0 ) {
  402.     main_pos_bit = buf_ptr0 << 3;
  403.     unpack_main(buf, igr);
  404.     Xform(pcm, igr);
  405.     in_out.out_bytes = outbytes;
  406. }
  407. else {
  408.     memset(pcm, zero_level_pcm, outbytes);  /* fill out skipped frames */
  409.     in_out.out_bytes = outbytes;
  410. }
  411. igr = igr^1;
  412. return in_out;
  413. }
  414. /*====================================================================*/
  415. int CMpaDecoderL3::unpack_side_MPEG1()
  416. {
  417. int prot;
  418. int br_index;
  419. int igr, ch;
  420. int side_bytes;
  421. /* decode partial header plus initial side info */
  422. /* at entry bit getter points at id, sync skipped by caller */
  423. id = bitget(&bitdat, 1);   /* id */
  424. bitget(&bitdat, 2);        /* skip layer */
  425. prot = bitget(&bitdat, 1);     /* bitget prot bit */
  426. br_index = bitget(&bitdat, 4);
  427. sr_index = bitget(&bitdat, 2);
  428. pad = bitget(&bitdat, 1);
  429. bitget(&bitdat, 1);            /* skip to mode */
  430. side_info.mode = bitget(&bitdat, 2);        /* mode */
  431. side_info.mode_ext = bitget(&bitdat, 2);    /* mode ext */
  432. if( side_info.mode != 1 ) side_info.mode_ext = 0;
  433. /* adjust global gain in ms mode to avoid having to mult by 1/sqrt(2) */
  434. ms_mode = side_info.mode_ext >> 1;
  435. is_mode = side_info.mode_ext & 1;
  436. crcbytes = 0;
  437. if( prot ) bitget(&bitdat, 4);    /* skip to data */
  438. else {
  439.     bitget(&bitdat, 20);          /* skip crc */
  440.     crcbytes = 2;
  441. }
  442. if( br_index > 0 )      /* framebytes fixed for free format */
  443.     framebytes =
  444.         2880 * mp_br_table_L3[id][br_index]/mp_sr20_table_L3[id][sr_index];
  445. side_info.main_data_begin = bitget(&bitdat, 9);
  446. if( side_info.mode == 3 ) {
  447.     side_info.private_bits  = bitget(&bitdat, 5);
  448.     nchan = 1;
  449.     stereo_flag = 0;
  450.     side_bytes = (4+17);   /*-- with header --*/
  451. }
  452. else {                      
  453.     side_info.private_bits  = bitget(&bitdat, 3);
  454.     nchan = 2;
  455.     stereo_flag = 1;
  456.     side_bytes = (4+32);   /*-- with header --*/
  457. }
  458. for(ch=0;ch<nchan;ch++) side_info.scfsi[ch] = bitget(&bitdat, 4);
  459. /* this always 0 (both igr) for short blocks */
  460. for(igr=0;igr<2;igr++) {
  461. for(ch=0;ch<nchan;ch++) {
  462.     side_info.gr[igr][ch].part2_3_length   = bitget(&bitdat, 12);
  463.     side_info.gr[igr][ch].big_values       = bitget(&bitdat, 9);
  464.     side_info.gr[igr][ch].global_gain      = bitget(&bitdat, 8) + gain_adjust;
  465.     if( ms_mode ) side_info.gr[igr][ch].global_gain -= 2;
  466.     side_info.gr[igr][ch].scalefac_compress      = bitget(&bitdat, 4);
  467.     side_info.gr[igr][ch].window_switching_flag  = bitget(&bitdat, 1);
  468.     if( side_info.gr[igr][ch].window_switching_flag ) {
  469.         side_info.gr[igr][ch].block_type          = bitget(&bitdat, 2);
  470.         side_info.gr[igr][ch].mixed_block_flag    = bitget(&bitdat, 1);
  471.         side_info.gr[igr][ch].table_select[0]     = bitget(&bitdat, 5);
  472.         side_info.gr[igr][ch].table_select[1]     = bitget(&bitdat, 5);
  473.         side_info.gr[igr][ch].subblock_gain[0]    = bitget(&bitdat, 3);
  474.         side_info.gr[igr][ch].subblock_gain[1]    = bitget(&bitdat, 3);
  475.         side_info.gr[igr][ch].subblock_gain[2]    = bitget(&bitdat, 3);
  476.         /* region count set in terms of long block cb's/bands */
  477.         /* r1 set so r0+r1+1 = 21 (lookup produces 576 bands ) */
  478.         /* if(window_switching_flag) always 36 samples in region0 */
  479.         side_info.gr[igr][ch].region0_count = (8-1);    /* 36 samples */
  480.         side_info.gr[igr][ch].region1_count = 20-(8-1);
  481.     }
  482.     else {
  483.         side_info.gr[igr][ch].mixed_block_flag    = 0;
  484.         side_info.gr[igr][ch].block_type          = 0;
  485.         side_info.gr[igr][ch].table_select[0]     = bitget(&bitdat, 5);
  486.         side_info.gr[igr][ch].table_select[1]     = bitget(&bitdat, 5);
  487.         side_info.gr[igr][ch].table_select[2]     = bitget(&bitdat, 5);
  488.         side_info.gr[igr][ch].region0_count       = bitget(&bitdat, 4);
  489.         side_info.gr[igr][ch].region1_count       = bitget(&bitdat, 3);
  490.     }
  491.     side_info.gr[igr][ch].preflag             = bitget(&bitdat, 1);
  492.     side_info.gr[igr][ch].scalefac_scale      = bitget(&bitdat, 1);
  493.     side_info.gr[igr][ch].count1table_select  = bitget(&bitdat, 1);
  494. }
  495. }    
  496. /* return  bytes in header + side info */
  497. return side_bytes;
  498. }
  499. /*====================================================================*/
  500. int CMpaDecoderL3::unpack_side_MPEG2(int igr)
  501. {
  502. int prot;
  503. int br_index;
  504. int ch;
  505. int side_bytes;
  506. /* decode partial header plus initial side info */
  507. /* at entry bit getter points at id, sync skipped by caller */
  508. id = bitget(&bitdat, 1);   /* id */
  509. bitget(&bitdat, 2);        /* skip layer */
  510. prot = bitget(&bitdat, 1);     /* bitget prot bit */
  511. br_index = bitget(&bitdat, 4);
  512. sr_index = bitget(&bitdat, 2);
  513. pad = bitget(&bitdat, 1);
  514. bitget(&bitdat, 1);            /* skip to mode */
  515. side_info.mode = bitget(&bitdat, 2);        /* mode */
  516. side_info.mode_ext = bitget(&bitdat, 2);    /* mode ext */
  517. if( side_info.mode != 1 ) side_info.mode_ext = 0;
  518. /* adjust global gain in ms mode to avoid having to mult by 1/sqrt(2) */
  519. ms_mode = side_info.mode_ext >> 1;
  520. is_mode = side_info.mode_ext & 1;
  521. crcbytes = 0;
  522. if( prot ) bitget(&bitdat, 4);    /* skip to data */
  523. else {
  524.     bitget(&bitdat, 20);          /* skip crc */
  525.     crcbytes = 2;
  526. }
  527. if( br_index > 0 )  {       /* framebytes fixed for free format */
  528.   if( mpeg25_flag == 0 ) {
  529.     framebytes =
  530.         1440 * mp_br_table_L3[id][br_index]/mp_sr20_table_L3[id][sr_index];
  531.   }
  532.   else {
  533.     framebytes =
  534.         2880 * mp_br_table_L3[id][br_index]/mp_sr20_table_L3[id][sr_index];
  535.     //if( sr_index == 2 ) return 0;  // fail mpeg25 8khz
  536.   }
  537. }
  538. side_info.main_data_begin = bitget(&bitdat, 8);
  539. if( side_info.mode == 3 ) {
  540.     side_info.private_bits  = bitget(&bitdat, 1);
  541.     nchan = 1;
  542.     stereo_flag = 0;
  543.     side_bytes = (4+9);   /*-- with header --*/
  544. }
  545. else {                      
  546.     side_info.private_bits  = bitget(&bitdat, 2);
  547.     nchan = 2;
  548.     stereo_flag = 1;
  549.     side_bytes = (4+17);   /*-- with header --*/
  550. }
  551. side_info.scfsi[1] = side_info.scfsi[0] = 0;
  552. for(ch=0;ch<nchan;ch++) {
  553.     side_info.gr[igr][ch].part2_3_length   = bitget(&bitdat, 12);
  554.     side_info.gr[igr][ch].big_values       = bitget(&bitdat, 9);
  555.     side_info.gr[igr][ch].global_gain      = bitget(&bitdat, 8) + gain_adjust;
  556.     if( ms_mode ) side_info.gr[igr][ch].global_gain -= 2;
  557.     side_info.gr[igr][ch].scalefac_compress      = bitget(&bitdat, 9);
  558.     side_info.gr[igr][ch].window_switching_flag  = bitget(&bitdat, 1);
  559.     if( side_info.gr[igr][ch].window_switching_flag ) {
  560.         side_info.gr[igr][ch].block_type          = bitget(&bitdat, 2);
  561.         side_info.gr[igr][ch].mixed_block_flag    = bitget(&bitdat, 1);
  562.         side_info.gr[igr][ch].table_select[0]     = bitget(&bitdat, 5);
  563.         side_info.gr[igr][ch].table_select[1]     = bitget(&bitdat, 5);
  564.         side_info.gr[igr][ch].subblock_gain[0]    = bitget(&bitdat, 3);
  565.         side_info.gr[igr][ch].subblock_gain[1]    = bitget(&bitdat, 3);
  566.         side_info.gr[igr][ch].subblock_gain[2]    = bitget(&bitdat, 3);
  567.         /* region count set in terms of long block cb's/bands  */
  568.         /* r1 set so r0+r1+1 = 21 (lookup produces 576 bands ) */
  569.         /* bt=1 or 3       54 samples */
  570.         /* bt=2 mixed=0    36 samples */
  571.         /* bt=2 mixed=1    54 (8 long sf) samples? or maybe 36 */
  572.         /* region0 discussion says 54 but this would mix long */
  573.         /* and short in region0 if scale factors switch */
  574.         /* at band 36 (6 long scale factors) */
  575.         if( (side_info.gr[igr][ch].block_type == 2) ) {
  576.             side_info.gr[igr][ch].region0_count = (6-1); /* 36 samples */
  577.             side_info.gr[igr][ch].region1_count = 20-(6-1);
  578.         }
  579.         else {  /* long block type 1 or 3 */
  580.             side_info.gr[igr][ch].region0_count = (8-1); /* 54 samples */
  581.             side_info.gr[igr][ch].region1_count = 20-(8-1);
  582.         }
  583.     }
  584.     else {
  585.         side_info.gr[igr][ch].mixed_block_flag    = 0;
  586.         side_info.gr[igr][ch].block_type          = 0;
  587.         side_info.gr[igr][ch].table_select[0]     = bitget(&bitdat, 5);
  588.         side_info.gr[igr][ch].table_select[1]     = bitget(&bitdat, 5);
  589.         side_info.gr[igr][ch].table_select[2]     = bitget(&bitdat, 5);
  590.         side_info.gr[igr][ch].region0_count       = bitget(&bitdat, 4);
  591.         side_info.gr[igr][ch].region1_count       = bitget(&bitdat, 3);
  592.     }
  593.     side_info.gr[igr][ch].preflag             = 0;
  594.     side_info.gr[igr][ch].scalefac_scale      = bitget(&bitdat, 1);
  595.     side_info.gr[igr][ch].count1table_select  = bitget(&bitdat, 1);
  596. }
  597. /* return  bytes in header + side info */
  598. return side_bytes;
  599. }
  600. /*====================================================================*/
  601. void CMpaDecoderL3::unpack_main(unsigned char *buf, int igr)
  602. {
  603. int ch;
  604. int bit0;
  605. int n1, n2, n3, n4, nn2, nn3;
  606. int nn4;
  607. int qbits;
  608. int m0;
  609. for(ch=0;ch<nchan;ch++) {
  610.     bitget_init(&bitdat, buf + (main_pos_bit >> 3));
  611.     bit0 = (main_pos_bit & 7);
  612.     if( bit0 ) bitget(&bitdat, bit0);
  613.     main_pos_bit +=  side_info.gr[igr][ch].part2_3_length;
  614.     bitget_init_end(&bitdat, buf + ((main_pos_bit+39) >> 3));
  615.     /*-- scale factors --*/
  616.     if( id ) 
  617.         unpack_sf_sub_MPEG1(&sf[igr][ch], 
  618.             &side_info.gr[igr][ch], side_info.scfsi[ch],  igr, &bitdat);
  619.     else 
  620.         unpack_sf_sub_MPEG2(&sf[igr][ch], 
  621.             &side_info.gr[igr][ch], is_mode & ch, &is_sf_info, &bitdat);
  622.     /*--- huff data ---*/
  623.     n1 = sfBandIndex[0][side_info.gr[igr][ch].region0_count];
  624.     n2 = sfBandIndex[0][side_info.gr[igr][ch].region0_count
  625.                         + side_info.gr[igr][ch].region1_count+1];
  626.     n3 =  side_info.gr[igr][ch].big_values;
  627.     n3 = n3 + n3;
  628.     
  629.     if( n3 > band_limit ) n3 = band_limit;
  630.     if( n2 > n3 ) n2 = n3;
  631.     if( n1 > n3 ) n1 = n3;
  632.     nn3 = n3 - n2;
  633.     nn2 = n2 - n1;
  634.     unpack_huff(sample[ch][igr],     n1, side_info.gr[igr][ch].table_select[0], &bitdat);
  635.     unpack_huff(sample[ch][igr]+n1, nn2, side_info.gr[igr][ch].table_select[1], &bitdat);
  636.     unpack_huff(sample[ch][igr]+n2, nn3, side_info.gr[igr][ch].table_select[2], &bitdat);
  637.     qbits = side_info.gr[igr][ch].part2_3_length - (bitget_bits_used(&bitdat)-bit0);
  638.     nn4 = unpack_huff_quad(sample[ch][igr]+n3, band_limit - n3, qbits, 
  639.             side_info.gr[igr][ch].count1table_select, &bitdat);
  640.     n4 = n3 + nn4;
  641.     nsamp[igr][ch] = n4;
  642.     //limit n4 or allow deqaunt to sf band 22
  643.     if( side_info.gr[igr][ch].block_type == 2 ) n4 = min(n4,band_limit12);
  644.     else  n4 = min(n4,band_limit21);
  645.     if( n4 < 576 ) memset(sample[ch][igr]+n4, 0, sizeof(SAMPLE)*(576-n4));
  646.     if(  bitget_overrun(&bitdat) ) { // bad data overrun
  647.         memset(sample[ch][igr], 0, sizeof(SAMPLE)*(576));
  648.     }
  649. }
  650. /*--- dequant ---*/
  651. for(ch=0;ch<nchan;ch++) {
  652.     dequant(sample[ch][igr], 
  653.         &nsamp[igr][ch],    /* nsamp updated for shorts */
  654.         &sf[igr][ch], &side_info.gr[igr][ch], 
  655.         &cb_info[igr][ch], ncbl_mixed, nBand, re_buf);
  656. }
  657. /*--- ms stereo processing  ---*/
  658. if( ms_mode ) {
  659.     if( is_mode == 0 ) {
  660.         m0 = nsamp[igr][0];    /* process to longer of left/right */
  661.         if( m0 < nsamp[igr][1] ) m0 = nsamp[igr][1];
  662.     }
  663.     else {  /* process to last cb in right */
  664.         m0  = sfBandIndex[cb_info[igr][1].cbtype][cb_info[igr][1].cbmax];
  665.     }
  666.     ms_process(sample[0][igr], m0);    
  667. }
  668. /*--- is stereo processing  ---*/
  669. if( is_mode ) {
  670.     if( id ) 
  671.         is_process_MPEG1(sample[0][igr], &sf[igr][1], 
  672.             cb_info[igr], nsamp[igr][0], ms_mode, nBand, sfBandIndex);
  673.     else
  674.         is_process_MPEG2(sample[0][igr], &sf[igr][1], 
  675.             cb_info[igr], &is_sf_info,
  676.             nsamp[igr][0], ms_mode, nBand, sfBandIndex);
  677. }
  678. /*-- adjust ms and is modes to max of left/right */
  679. if( side_info.mode_ext ) {
  680.     if(nsamp[igr][0] < nsamp[igr][1]) nsamp[igr][0] = nsamp[igr][1];
  681.     else  nsamp[igr][1] = nsamp[igr][0];
  682. }
  683. /*--- antialias ---*/
  684. for(ch=0;ch<nchan;ch++) {
  685.     if( cb_info[igr][ch].ncbl == 0 ) continue; /* have no long blocks */
  686.     if( side_info.gr[igr][ch].mixed_block_flag ) n1 = 1; /* 1 -> 36 samples */
  687.     else n1 = (nsamp[igr][ch]+7)/18;
  688.     if( n1 > 31 ) n1 = 31;
  689.     antialias(sample[ch][igr], n1);
  690.     n1 = 18*n1+8;       /* update number of samples */
  691.     if( n1 > nsamp[igr][ch] ) nsamp[igr][ch] = n1;
  692. }
  693. //Xform(pcm, igr);
  694. /*-- done --*/
  695. }
  696. /*====================================================================*/
  697. void CMpaDecoderL3::Xform(unsigned char *pcm, int igr)
  698. {
  699.     switch(iXform) {
  700.     default:
  701.     case 0:
  702.         Xform_mono(pcm, igr);
  703.         break;
  704.     case 1:
  705.         Xform_dual(pcm,igr);
  706.         break;
  707.     case 2:
  708.         Xform_dual_mono(pcm,igr);
  709.         break;
  710.     case 3:
  711.         Xform_mono(pcm,igr);
  712.         break;
  713.     case 4:
  714.         Xform_dual_right(pcm,igr);
  715.         break;
  716.     }
  717. }    
  718. /*====================================================================*/
  719. void CMpaDecoderL3::Xform_mono(unsigned char *pcm, int igr)
  720. {
  721. int igr_prev, n1, n2;
  722. /*--- hybrid + sbt ---*/
  723. n1 = n2 = nsamp[igr][0];   /* total number bands */
  724. if( side_info.gr[igr][0].block_type == 2 ) { /* long bands */
  725.     n1 = 0;     
  726.     if( side_info.gr[igr][0].mixed_block_flag ) 
  727.                 n1 = sfBandIndex[0][ncbl_mixed-1];
  728. }
  729. if( n1 > band_limit ) n1 = band_limit;
  730. if( n2 > band_limit ) n2 = band_limit;
  731. igr_prev = igr^1;
  732. nsamp[igr][0] = hybrid(sample[0][igr], sample[0][igr_prev], 
  733.      yout, side_info.gr[igr][0].block_type, n1, n2, nsamp[igr_prev][0], band_limit_nsb);
  734. FreqInvert(yout, nsamp[igr][0]);
  735. sbt_L3(yout, pcm, 0, vbuf, vb_ptr);
  736. }
  737. /*--------------------------------------------------------------------*/
  738. void CMpaDecoderL3::Xform_dual_right(unsigned char *pcm, int igr)
  739. {
  740. int igr_prev, n1, n2;
  741. /*--- hybrid + sbt ---*/
  742. n1 = n2 = nsamp[igr][1];   /* total number bands */
  743. if( side_info.gr[igr][1].block_type == 2 ) { /* long bands */
  744.     n1 = 0;     
  745.     if( side_info.gr[igr][1].mixed_block_flag ) 
  746.                 n1 = sfBandIndex[0][ncbl_mixed-1];
  747. }
  748. if( n1 > band_limit ) n1 = band_limit;
  749. if( n2 > band_limit ) n2 = band_limit;
  750. igr_prev = igr^1;
  751. nsamp[igr][1] = hybrid(sample[1][igr], sample[1][igr_prev], 
  752.       yout, side_info.gr[igr][1].block_type, n1, n2, nsamp[igr_prev][1], band_limit_nsb);
  753. FreqInvert(yout, nsamp[igr][1]);
  754. sbt_L3(yout, pcm, 0, vbuf, vb_ptr);
  755. }
  756. /*--------------------------------------------------------------------*/
  757. void CMpaDecoderL3::Xform_dual(unsigned char *pcm, int igr)
  758. {
  759. int ch;
  760. int igr_prev, n1, n2;
  761. /*--- hybrid + sbt ---*/
  762. igr_prev = igr^1;
  763. for(ch=0;ch<nchan;ch++) {
  764.     n1 = n2 = nsamp[igr][ch];   /* total number bands */
  765.     if( side_info.gr[igr][ch].block_type == 2 ) { /* long bands */
  766.         n1 = 0;     
  767.         if( side_info.gr[igr][ch].mixed_block_flag ) 
  768.                     n1 = sfBandIndex[0][ncbl_mixed-1];
  769.     }
  770.     if( n1 > band_limit ) n1 = band_limit;
  771.     if( n2 > band_limit ) n2 = band_limit;
  772.     nsamp[igr][ch] = hybrid(sample[ch][igr], sample[ch][igr_prev], 
  773.         yout, side_info.gr[igr][ch].block_type, n1, n2, nsamp[igr_prev][ch], band_limit_nsb);
  774.     FreqInvert(yout, nsamp[igr][ch]);
  775.     sbt_L3(yout, pcm, ch, vbuf, vb_ptr);
  776. }
  777. }
  778. /*--------------------------------------------------------------------*/
  779. void CMpaDecoderL3::Xform_dual_mono(unsigned char *pcm, int igr)
  780. {
  781. int igr_prev, n1, n2, n3;
  782. /*--- hybrid + sbt ---*/
  783. igr_prev = igr^1;
  784. if( (side_info.gr[igr][0].block_type == side_info.gr[igr][1].block_type)
  785.       && (side_info.gr[igr][0].mixed_block_flag == 0)
  786.       && (side_info.gr[igr][1].mixed_block_flag == 0) ) 
  787. {
  788.     n2 = nsamp[igr][0];   /* total number bands max of L R */
  789.     if( n2 < nsamp[igr][1] ) n2 = nsamp[igr][1];
  790.     if( n2 > band_limit ) n2 = band_limit;
  791.     n1 = n2;  /* n1 = number long bands */
  792.     if( side_info.gr[igr][0].block_type == 2 ) n1 = 0;
  793.     sum_f_bands(sample[0][igr], sample[1][igr], n2);
  794.     n3 = nsamp[igr][0] = hybrid(sample[0][igr], sample[0][igr_prev], 
  795.         yout, side_info.gr[igr][0].block_type, n1, n2, nsamp[igr_prev][0], band_limit_nsb);
  796. }
  797. else 
  798. {       /* transform and then sum (not tested - never happens in test)*/
  799.     /*-- left chan --*/
  800.     n1 = n2 = nsamp[igr][0];   /* total number bands */
  801.     if( side_info.gr[igr][0].block_type == 2 ) { 
  802.         n1 = 0;     /* long bands */
  803.         if( side_info.gr[igr][0].mixed_block_flag ) 
  804.                     n1 = sfBandIndex[0][ncbl_mixed-1];
  805.     }
  806.     n3 = nsamp[igr][0] = hybrid(sample[0][igr], sample[0][igr_prev], 
  807.         yout, side_info.gr[igr][0].block_type, n1, n2, nsamp[igr_prev][0], band_limit_nsb);
  808.     /*-- right chan --*/
  809.     n1 = n2 = nsamp[igr][1];   /* total number bands */
  810.     if( side_info.gr[igr][1].block_type == 2 ) { 
  811.         n1 = 0;     /* long bands */
  812.         if( side_info.gr[igr][1].mixed_block_flag ) 
  813.                     n1 = sfBandIndex[0][ncbl_mixed-1];
  814.     }
  815.     nsamp[igr][1] = hybrid_sum(sample[1][igr], sample[0][igr], 
  816.         yout, side_info.gr[igr][1].block_type, n1, n2);
  817.     if( n3 < nsamp[igr][1] ) n1 = nsamp[igr][1];
  818. }
  819. /*--------*/
  820. FreqInvert(yout, n3);
  821. sbt_L3(yout, pcm, 0, vbuf, vb_ptr);
  822. }
  823. /*------------------------------------------------------------------*/
  824. /*==================================================================*/
  825. /*====================concealment/reformatted frames================*/
  826. /*==================================================================*/
  827. #ifdef REFORMAT
  828. // test routine - reformats frame
  829. IN_OUT CMpaDecoderL3::audio_decode_reformat(unsigned char *bs, 
  830.                                             unsigned char *bs_out)
  831. {
  832.     if( h_id )  {
  833.         return L3reformat_MPEG1(bs, bs_out);
  834.     }
  835.     else {
  836.         return L3reformat_MPEG2(bs, bs_out);
  837.     }
  838. }
  839. //============================================================
  840. // test routine - reformats frame
  841. IN_OUT CMpaDecoderL3::L3reformat_MPEG1(unsigned char *bs, 
  842.                                        unsigned char *bs_out)
  843. {
  844. int sync;
  845. IN_OUT in_out;
  846. int side_bytes;
  847. int nbytes, nbytes_r;
  848. //iframe++;
  849. bitget_init(bs);          /* initialize bit getter */
  850. /* test sync */
  851. in_out.in_bytes = 0;     /* assume fail */
  852. in_out.out_bytes = 0;
  853. sync = bitget(&bitdat, 12);
  854. if( sync != 0xFFF ) return in_out;       /* sync fail */
  855. /*-----------*/
  856. /*-- unpack side info --*/
  857. side_bytes = unpack_side_MPEG1();
  858. if( framebytes <= 0 ) return in_out;  // fail bad sr or br index
  859. padframebytes = framebytes+pad;
  860. in_out.in_bytes = padframebytes;
  861. /*-- load main data and update buf pointer --*/
  862. /*------------------------------------------- 
  863.    if start point < 0, must just cycle decoder 
  864.    if jumping into middle of stream, 
  865. ---------------------------------------------*/
  866. nbytes_r = reformat_side_bytes + reformat_bytes - side_info.main_data_begin;
  867. if( nbytes_r > 0 ) {
  868.     memmove(bs_out, reformat_buf, nbytes_r);
  869.     in_out.out_bytes = nbytes_r;
  870. }
  871. buf_ptr0 = buf_ptr1 - side_info.main_data_begin;   /* decode start point */
  872. if( buf_ptr1 > BUF_TRIGGER ) {          /* shift buffer */
  873.     memmove(buf, buf+buf_ptr0, side_info.main_data_begin);
  874.     buf_ptr0 = 0;
  875.     buf_ptr1 = side_info.main_data_begin;
  876. }
  877. nbytes = padframebytes - side_bytes - crcbytes;
  878. memmove(buf+buf_ptr1, bs+side_bytes+crcbytes, nbytes);
  879. buf_ptr1 += nbytes;
  880. /*-----------------------*/
  881. if( buf_ptr0 >= 0 ) {
  882.     reformat_side_bytes = side_bytes+crcbytes;
  883.     memmove(reformat_buf, bs, reformat_side_bytes);
  884.     reformat_buf[4+crcbytes]    = 0;      // set main data begin = 0
  885.     reformat_buf[4+crcbytes+1] &= 0x7F;   // set main data begin = 0
  886.     reformat_bytes = buf_ptr1 - buf_ptr0;
  887.     if( reformat_bytes > 0 ) {
  888.         memmove(reformat_buf+reformat_side_bytes, 
  889.             buf+buf_ptr0, reformat_bytes);
  890.     }
  891. }
  892. else {
  893.     reformat_side_bytes = 0;
  894.     reformat_bytes = 0;
  895. }
  896. return in_out;
  897. }
  898. /*=========================================================*/
  899. // test routine - reformats frame
  900. IN_OUT CMpaDecoderL3::L3reformat_MPEG2(unsigned char *bs, 
  901.                                        unsigned char *bs_out)
  902. {
  903. int sync;
  904. IN_OUT in_out;
  905. int side_bytes;
  906. int nbytes, nbytes_r;
  907. //iframe++;
  908. bitget_init(bs);          /* initialize bit getter */
  909. /* test sync */
  910. in_out.in_bytes = 0;     /* assume fail */
  911. in_out.out_bytes = 0;
  912. sync = bitget(&bitdat, 12);
  913. //if( sync != 0xFFF ) return in_out;       /* sync fail */
  914. mpeg25_flag = 0;
  915. if( sync != 0xFFF ) {
  916.     mpeg25_flag = 1;       /* mpeg 2.5 sync */
  917.     if( sync != 0xFFE ) return in_out;  /* sync fail */
  918. }
  919. /*-- unpack side info --*/
  920. side_bytes = unpack_side_MPEG2(igr);
  921. if( framebytes <= 0 ) return in_out;  // fail bad sr or br index
  922. padframebytes = framebytes+pad;
  923. in_out.in_bytes = padframebytes;
  924. nbytes_r = reformat_side_bytes + reformat_bytes - side_info.main_data_begin;
  925. if( nbytes_r > 0 ) {
  926.     memmove(bs_out, reformat_buf, nbytes_r);
  927.     in_out.out_bytes = nbytes_r;
  928. }
  929. buf_ptr0 = buf_ptr1 - side_info.main_data_begin;   /* decode start point */
  930. if( buf_ptr1 > BUF_TRIGGER ) {          /* shift buffer */
  931.     memmove(buf, buf+buf_ptr0, side_info.main_data_begin);
  932.     buf_ptr0 = 0;
  933.     buf_ptr1 = side_info.main_data_begin;
  934. }
  935. nbytes = padframebytes - side_bytes - crcbytes;
  936. memmove(buf+buf_ptr1, bs+side_bytes+crcbytes, nbytes);
  937. buf_ptr1 += nbytes;
  938. /*-----------------------*/
  939. if( buf_ptr0 >= 0 ) {
  940.     reformat_side_bytes = side_bytes+crcbytes;
  941.     memmove(reformat_buf, bs, reformat_side_bytes);
  942.     reformat_buf[4+crcbytes]    = 0;      // set main data begin = 0
  943.     reformat_bytes = buf_ptr1 - buf_ptr0;
  944.     if( reformat_bytes > 0 ) {
  945.         memmove(reformat_buf+reformat_side_bytes, 
  946.             buf+buf_ptr0, reformat_bytes);
  947.     }
  948. }
  949. else {
  950.     reformat_side_bytes = 0;
  951.     reformat_bytes = 0;
  952. }
  953. //igr = igr^1;   //  must be done by decode_reformatted
  954. return in_out;
  955. }
  956. #endif  // REFORMAT 
  957. //=========================================================================
  958. //=========================================================================
  959. IN_OUT CMpaDecoderL3::audio_decode(unsigned char *bs, unsigned char *pcm, int size)
  960. {
  961.     if (!size)
  962.         return audio_decode(bs, pcm);
  963. // overloaded for reformatted frames.   main_data_begin == 0
  964.     if( h_id )  {
  965.         return L3audio_decode_reformattedMPEG1(bs, pcm, size);
  966.     }
  967.     else {
  968.         return L3audio_decode_reformattedMPEG2(bs, pcm, size);
  969.     }
  970. }
  971. /*====================================================================*/
  972. IN_OUT CMpaDecoderL3::L3audio_decode_reformattedMPEG1(unsigned char *bs, 
  973.                            unsigned char *pcm, int size)
  974. {
  975. int sync;
  976. IN_OUT in_out;
  977. int side_bytes;
  978. // decode reformatted (self contained) frame 
  979. // fails if main_data_begin != 0
  980. iframe++;
  981. in_out.in_bytes  = 0;   // assume fail  e.g. sync fail
  982. in_out.out_bytes = 0;
  983. if( size > 0 ) {
  984.     bitget_init(&bitdat, bs);          /* initialize bit getter */
  985.     /* test sync */
  986.     sync = bitget(&bitdat, 12);
  987.     if( sync != 0xFFF ) return in_out;       /* sync fail */
  988.     /*-----------*/
  989.     /*-- unpack side info --*/
  990.     side_bytes = unpack_side_MPEG1();
  991.     if( framebytes <= 0 ) return in_out;  // fail bad sr or br index
  992.     if( side_info.main_data_begin ) return in_out;  // fail if data not self contained
  993.     in_out.in_bytes = size;
  994.     in_out.out_bytes = outbytes;
  995.     main_pos_bit = (side_bytes+crcbytes) << 3;  // set for unpack_main
  996.     unpack_main(bs, 0);          // first granule
  997.     conceal_insert(0);
  998.     Xform(pcm, 0);
  999.     unpack_main(bs, 1);          // second granule
  1000.     conceal_insert(1);
  1001.     Xform(pcm+half_outbytes, 1);
  1002. }
  1003. else {      // size <= 0, missing frame 
  1004.     in_out.in_bytes = size;
  1005.     in_out.out_bytes = outbytes;
  1006.     conceal_fixup(0);
  1007.     Xform(pcm, 0);
  1008.     conceal_fixup(1);
  1009.     Xform(pcm+half_outbytes, 1);
  1010. }
  1011. return in_out;
  1012. }
  1013. //=========================================================================
  1014. IN_OUT CMpaDecoderL3::L3audio_decode_reformattedMPEG2(unsigned char *bs, 
  1015.                              unsigned char *pcm, int size)
  1016. {
  1017. int sync;
  1018. IN_OUT in_out;
  1019. int side_bytes;
  1020. // decode reformatted (self contained) frame 
  1021. // fails if main_data_begin != 0
  1022. iframe++;
  1023. in_out.in_bytes = 0;     /* assume fail */
  1024. in_out.out_bytes = 0;
  1025. if( size > 0 ) {
  1026.     bitget_init(&bitdat, bs);          /* initialize bit getter */
  1027.     /* test sync */
  1028.     sync = bitget(&bitdat, 12);
  1029.     //if( sync != 0xFFF ) return in_out;       /* sync fail */
  1030.     mpeg25_flag = 0;
  1031.     if( sync != 0xFFF ) {
  1032.         mpeg25_flag = 1;       /* mpeg 2.5 sync */
  1033.         if( sync != 0xFFE ) return in_out;  /* sync fail */
  1034.     }
  1035.     /*-- unpack side info --*/
  1036.     side_bytes = unpack_side_MPEG2(igr);
  1037.     if( framebytes <= 0 ) return in_out;  // fail bad sr or br index
  1038.     if( side_info.main_data_begin ) return in_out;  // fail if data not self contained
  1039.     in_out.in_bytes = size;
  1040.     in_out.out_bytes = outbytes;
  1041.     main_pos_bit = (side_bytes+crcbytes) << 3;  // set for unpack_main
  1042.     unpack_main(bs, igr);
  1043.     conceal_insert(igr);
  1044.     Xform(pcm, igr);
  1045. }
  1046. else {      // size <= 0, missing frame 
  1047.     in_out.in_bytes = size;
  1048.     in_out.out_bytes = outbytes;
  1049.     conceal_fixup(igr);
  1050.     Xform(pcm, igr);
  1051. }
  1052. igr = igr^1;
  1053. return in_out;
  1054. }
  1055. /*====================================================================*/
  1056. void CMpaDecoderL3::conceal_insert(int igr)
  1057. {
  1058. int ch, nlines, blockType, i;
  1059. if( conceal_flag ) {
  1060.     for(ch=0;ch<nchan;ch++) {
  1061. #if defined (MP3_CONCEAL_LOSS)        
  1062.         conceal[ch]->insert(&sample[ch][igr][0].x, 
  1063.             side_info.gr[igr][ch].block_type, nsamp[igr][ch]);
  1064.         nlines = conceal[ch]->retrieve(&sample[ch][igr][0].x, blockType);
  1065. #endif //MP3_CONCEAL_LOSS
  1066.         
  1067.         side_info.gr[igr][ch].mixed_block_flag      = 0;
  1068.         side_info.gr[igr][ch].block_type            = blockType;
  1069.         side_info.gr[igr][ch].window_switching_flag = (blockType != 0) ? 1 : 0;
  1070.         nsamp[igr][ch] = nlines;
  1071.         for(i=nlines;i<576;i++) sample[ch][igr][i].x = 0.0f;
  1072.     }
  1073. }
  1074. }
  1075. /*====================================================================*/
  1076. void CMpaDecoderL3::conceal_fixup(int igr)
  1077. {
  1078. int ch, nlines, blockType, i;
  1079. if( conceal_flag ) {
  1080.     for(ch=0;ch<nchan;ch++) {
  1081. #if defined (MP3_CONCEAL_LOSS)        
  1082.         conceal[ch]->insert();
  1083.         nlines = conceal[ch]->retrieve(&sample[ch][igr][0].x, blockType);
  1084. #endif //MP3_CONCEAL_LOSS
  1085.         
  1086.         side_info.gr[igr][ch].mixed_block_flag      = 0;
  1087.         side_info.gr[igr][ch].block_type            = blockType;
  1088.         side_info.gr[igr][ch].window_switching_flag = (blockType != 0) ? 1 : 0;
  1089.         nsamp[igr][ch] = nlines;
  1090.         for(i=nlines;i<576;i++) sample[ch][igr][i].x = 0.0f;
  1091.     }
  1092. }
  1093. else {       // mute
  1094.     for(ch=0;ch<nchan;ch++) {
  1095.         side_info.gr[igr][ch].mixed_block_flag      = 0;
  1096.         side_info.gr[igr][ch].block_type            = 0;
  1097.         side_info.gr[igr][ch].window_switching_flag = 0;
  1098.         for(i=0;i<576;i++) sample[ch][igr][i].x = 0.0f;
  1099.     }
  1100. }
  1101. }
  1102. /*====================================================================*/