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

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 "mpadecl1.h"
  40. #include "mpalow.h"     // low level extern C prototypes
  41. ///////////////////////////////////////////////////////////////////////////////
  42. // Static Data:
  43. ///////////////////////////////////////////////////////////////////////////////
  44. static const int sr_table_L1[8] =
  45.     { 22050, 24000, 16000, 1,
  46.       44100, 48000, 32000, 1 };
  47. static const int  out_chans_L1[5] = { 1, 2, 1, 1, 1 };
  48. static const int look_joint_L1[16] = {  /* lookup stereo sb's by mode+ext */
  49. 64, 64, 64, 64,         /* stereo */
  50. 2*4, 2*8, 2*12, 2*16,   /* joint */
  51. 64, 64, 64, 64,         /* dual */
  52. 32, 32, 32, 32,         /* mono */
  53. };
  54. static const int bat_bit_master_L1[] = {
  55. 0, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16 };
  56. static const SBT_FUNCTION  sbt_table_L1[2][3][5] = {
  57. // 16 bit (usually short) pcm output
  58.     sbt_mono,   
  59.     sbt_dual,   
  60.     sbt_dual_mono, 
  61. #ifdef REDUCTION
  62.     sbt_dual_left, 
  63.     sbt_dual_right,
  64.     sbt16_mono, 
  65.     sbt16_dual, 
  66.     sbt16_dual_mono, 
  67.     sbt16_dual_left, 
  68.     sbt16_dual_right,
  69.     sbt8_mono,  
  70.     sbt8_dual,  
  71.     sbt8_dual_mono, 
  72.     sbt8_dual_left, 
  73.     sbt8_dual_right,
  74. #else     // no reduction
  75.     NULL, NULL, NULL, NULL, NULL, NULL, 
  76.     NULL, NULL, NULL, NULL, NULL, NULL, 
  77. #endif
  78. // 8 bit pcm output
  79. #ifdef EIGHT_BIT
  80.     sbtB_mono,
  81.     sbtB_dual,
  82.     sbtB_dual_mono,
  83. #ifdef REDUCTION
  84.     sbtB_dual_left,
  85.     sbtB_dual_right,
  86.     sbtB16_mono,
  87.     sbtB16_dual,
  88.     sbtB16_dual_mono,
  89.     sbtB16_dual_left,
  90.     sbtB16_dual_right,
  91.     sbtB8_mono,
  92.     sbtB8_dual,
  93.     sbtB8_dual_mono,
  94.     sbtB8_dual_left,
  95.     sbtB8_dual_right,
  96. #else   // no reduction
  97.     NULL, NULL, NULL, NULL, NULL, NULL, 
  98.     NULL, NULL, NULL, NULL, NULL, NULL, 
  99. #endif
  100. #else       // no eight_bit
  101.     NULL, NULL, NULL,
  102.     NULL, NULL, NULL, NULL, NULL, NULL, 
  103.     NULL, NULL, NULL, NULL, NULL, NULL, 
  104. #endif
  105.  
  106. };
  107. ///////////////////////////////////////////////////////////////////////////////
  108. // Public Functions
  109. ///////////////////////////////////////////////////////////////////////////////
  110. CMpaDecoderL1::CMpaDecoderL1()
  111.  :  CMpaDecoder()
  112. {
  113.     table_init();
  114. }
  115. CMpaDecoderL1::~CMpaDecoderL1()
  116. {
  117. }
  118. //IN_OUT CMpaDecoderL1::audio_decode(unsigned char *bs, unsigned char *pcm, int size)
  119. //{
  120. //return audio_decode(bs, pcm);
  121. //}
  122. #ifdef REFORMAT
  123. IN_OUT  CMpaDecoderL1::audio_decode_reformat(unsigned char *bs,
  124.                          unsigned char *bs_out)
  125. {
  126.     IN_OUT x;
  127.     x.in_bytes = 0;     // signal fail, not relevant Layer 1
  128.     x.out_bytes = 0;
  129.     return x;
  130. }
  131. #endif
  132. //=======================================================================
  133. int CMpaDecoderL1::audio_decode_init(MPEG_HEAD *h,
  134.                                   int framebytes_arg,
  135.                                   int reduction_code,
  136.                                   int transform_code,
  137.                                   int convert_code,
  138.                                   int freq_limit,
  139.                                   int conceal_enable)
  140. {
  141. int i,k;
  142. int samprate;
  143. int limit;
  144. int bit_code;
  145. /* check if code handles */
  146. if( h->option != 3 )  return 0;  /* layer I only */
  147. #ifndef REDUCTION
  148.     reduction_code = 0;
  149. #endif
  150. #ifndef EIGHT_BIT
  151.     convert_code = 0;
  152. #endif
  153. m_bMpeg1 = h->id;
  154. m_nSampsPerFrame = 384;
  155. transform_code = transform_code;    /* not used, asm compatability */
  156. bit_code = 0;
  157. if( convert_code & 8 ) bit_code = 1;
  158. convert_code = convert_code & 3;    /* higher bits used by dec8 freq cvt */
  159. if( reduction_code < 0 ) reduction_code = 0;
  160. if( reduction_code > 2 ) reduction_code = 2;
  161. if( freq_limit < 1000 ) freq_limit = 1000;
  162. framebytes = framebytes_arg;
  163. /* check if code handles */
  164. if( h->option != 3 ) return 0;         /* layer I only */
  165. nbatL1 = 32;
  166. max_sb = nbatL1;
  167. /*----- compute nsb_limit --------*/
  168. samprate = sr_table_L1[4*h->id + h->sr_index];
  169. nsb_limit = (freq_limit*64L + samprate/2)/samprate;   /*- caller limit -*/
  170. /*---- limit = 0.94*(32>>reduction_code);  ----*/
  171. limit = (32>>reduction_code);
  172. if( limit > 8 ) limit--;
  173. if( nsb_limit > limit )  nsb_limit = limit;
  174. if( nsb_limit > max_sb ) nsb_limit = max_sb;
  175. outvalues = 384 >> reduction_code;
  176. if( h->mode != 3 ) {         /* adjust for 2 channel modes */
  177.           nbatL1    *= 2;
  178.           max_sb    *= 2;
  179.           nsb_limit *= 2;
  180. }
  181. /* set sbt function */
  182. k = 1 + convert_code;
  183. if( h->mode == 3 ) {
  184.           k = 0;
  185.           }
  186. sbt = sbt_table_L1[bit_code][reduction_code][k];
  187. outvalues *= out_chans_L1[k];
  188. if( bit_code ) outbytes = outvalues;
  189. else           outbytes = sizeof(short)*outvalues;
  190. decinfo.channels  = out_chans_L1[k];
  191. decinfo.outvalues = outvalues;
  192. decinfo.samprate =  samprate >> reduction_code;
  193. if( bit_code ) decinfo.bits     = 8;
  194. else           decinfo.bits     = sizeof(short)*8;
  195. decinfo.framebytes = framebytes;
  196. decinfo.type = 0;
  197. /* clear sample buffer, unused sub bands must be 0 */
  198. for(i=0;i<768;i++) sample[i] = 0.0F;
  199. return 1;
  200. }
  201. //=========================================================================
  202. IN_OUT CMpaDecoderL1::audio_decode(unsigned char *bs, unsigned char *pcm, int size)
  203. {
  204. int sync, prot;
  205. IN_OUT in_out;
  206. load_init(bs);          /* initialize bit getter */
  207. /* test sync */
  208. in_out.in_bytes = 0;     /* assume fail */
  209. in_out.out_bytes = 0;
  210. sync = load(12);
  211. if( sync != 0xFFF ) return in_out;       /* sync fail */
  212. load(3);   /* skip id and option (checked by init) */
  213. prot = load(1);     /* load prot bit */
  214. load(6);            /* skip to pad */
  215. pad = (load(1)) << 2;
  216. load(1);            /* skip to mode */
  217. stereo_sb = look_joint_L1[load(4)];
  218. if( prot ) load(4);           /* skip to data */
  219. else       load(20);          /* skip crc */
  220. unpack_baL1();        /* unpack bit allocation */
  221. unpack_sfL1();        /* unpack scale factor */
  222. unpack_sampL1();      /* unpack samples */
  223. sbt(sample, pcm, 12, vbuf, vb_ptr);
  224. /*-----------*/
  225. in_out.in_bytes = framebytes + pad;
  226. in_out.out_bytes = outbytes;
  227. return in_out;
  228. }
  229. ///////////////////////////////////////////////////////////////////////////////
  230. // Private Functions
  231. ///////////////////////////////////////////////////////////////////////////////
  232. void CMpaDecoderL1::table_init()
  233. {
  234. int i;
  235. int step;
  236. /*--  c_values (dequant) --*/
  237. for(step=4, i=1; i<16; i++, step<<=1)
  238.                    look_c_valueL1[i] = (float)(2.0/(step-1));
  239. /*--  scale factor table, scale by 32768 for 16 pcm output  --*/
  240. for(i=0;i<64;i++) sf_table[i] = (float)(32768.0*2.0*pow(2.0,-i/3.0));
  241. }
  242. /*---------------------------------------------------------*/
  243. /*---------------------------------------------------------*/
  244. /*------------- bit getter --------------------------------*/
  245. /*---------------------------------------------------------*/
  246. void CMpaDecoderL1::load_init( unsigned char *buf)
  247. {
  248. bs_ptr = buf;
  249. bits = 0;
  250. bitbuf = 0;
  251. }
  252. /*------------- get n bits from bitstream -------------*/
  253. int CMpaDecoderL1::load( int n)
  254. {
  255. unsigned int x;
  256. if( bits < n ) {           /* refill bit buf if necessary */
  257.           while( bits <= 24 ) {
  258.              bitbuf = (bitbuf << 8) | *bs_ptr++;
  259.              bits += 8;
  260.           }
  261. }
  262. bits -= n;
  263. x = bitbuf >> bits;
  264. bitbuf -= x << bits;
  265. return x;
  266. }
  267. /*------------- skip over n bits in bitstream -------------*/
  268. void CMpaDecoderL1::skip( int n)
  269. {
  270. int k;
  271. if( bits < n ) {
  272.           n -= bits;
  273.           k = n >> 3;     /*--- bytes = n/8 --*/
  274.           bs_ptr+=k;
  275.           n -= k << 3;
  276.           bitbuf =  *bs_ptr++;
  277.           bits = 8;
  278.           }
  279. bits -= n;
  280. bitbuf -= (bitbuf >> bits) << bits;
  281. }
  282. /*--------------------------------------------------------------*/
  283. #define mac_load_check(n)                     
  284.    if( bits < (n) ) {                           
  285.           while( bits <= 24 ) {               
  286.              bitbuf = (bitbuf << 8) | *bs_ptr++;  
  287.              bits += 8;                       
  288.           }                                   
  289.    }
  290. /*--------------------------------------------------------------*/
  291. #define mac_load(n)                    
  292.        ( bits -= n,                    
  293.          bitval = bitbuf >> bits,      
  294.          bitbuf -= bitval << bits,     
  295.          bitval )
  296. /*======================================================================*/
  297. void CMpaDecoderL1::unpack_baL1()
  298. {
  299. int j;
  300. int nstereo;
  301. bit_skip = 0;
  302. nstereo = stereo_sb;
  303. for(j=0;j<nbatL1; j++) {
  304.   mac_load_check(4);
  305.   ballo[j] = samp_dispatch[j] =  mac_load(4);
  306.   if( j >= nsb_limit )  bit_skip += bat_bit_master_L1[samp_dispatch[j]];
  307.   c_value[j] = look_c_valueL1[samp_dispatch[j]];
  308.   if( --nstereo < 0 ) {
  309.       ballo[j+1] = ballo[j];
  310.       samp_dispatch[j] += 15;  /* flag as joint */
  311.       samp_dispatch[j+1] = samp_dispatch[j];  /* flag for sf */
  312.       c_value[j+1] = c_value[j];
  313.       j++;
  314.   }
  315. }
  316. /*-- terminate with bit skip and end --*/
  317. samp_dispatch[nsb_limit] = 31;
  318. samp_dispatch[j]         = 30;
  319. }
  320. /*-------------------------------------------------------------------------*/
  321. void CMpaDecoderL1::unpack_sfL1(void)    /* unpack scale factor */
  322. {                          /* combine dequant and scale factors */
  323. int i;
  324. for(i=0;i<nbatL1;i++) {
  325.   if( ballo[i] ) {
  326.     mac_load_check(6);
  327.     cs_factorL1[i] = c_value[i]*sf_table[mac_load(6)];
  328.   }
  329. }
  330. /*-- done --*/
  331. }
  332. /*-------------------------------------------------------------------------*/
  333. #define UNPACKL1_N(n)                                        
  334.     s[k]     =  cs_factorL1[k]*(load(n)-((1 << n-1) -1));    
  335.     goto dispatch;
  336. #define UNPACKL1J_N(n)                                       
  337.     tmp        =  (load(n)-((1 << n-1) -1));                 
  338.     s[k]       =  cs_factorL1[k]*tmp;                        
  339.     s[k+1]     =  cs_factorL1[k+1]*tmp;                      
  340.     k++;                                                     
  341.     goto dispatch;
  342. /*-------------------------------------------------------------------------*/
  343. /*-------------------------------------------------------------------------*/
  344. void CMpaDecoderL1::unpack_sampL1()    /* unpack samples */
  345. {
  346. int j, k;
  347. float *s;
  348. long tmp;
  349. s = sample;
  350. for(j=0;j<12;j++)  {
  351. k = -1;
  352. dispatch:   switch (samp_dispatch[++k]) {
  353. case 0:
  354.     s[k]     =  0.0F;
  355.     goto dispatch;
  356. case 1:     UNPACKL1_N(2)     /*  3 levels */
  357. case 2:     UNPACKL1_N(3)     /*  7 levels */
  358. case 3:     UNPACKL1_N(4)     /* 15 levels */
  359. case 4:     UNPACKL1_N(5)     /* 31 levels */
  360. case 5:     UNPACKL1_N(6)     /* 63 levels */
  361. case 6:     UNPACKL1_N(7)     /* 127 levels */
  362. case 7:     UNPACKL1_N(8)     /* 255 levels */
  363. case 8:     UNPACKL1_N(9)     /* 511 levels */
  364. case 9:     UNPACKL1_N(10)    /* 1023 levels */
  365. case 10:    UNPACKL1_N(11)    /* 2047 levels */
  366. case 11:    UNPACKL1_N(12)    /* 4095 levels */
  367. case 12:    UNPACKL1_N(13)    /* 8191 levels */
  368. case 13:    UNPACKL1_N(14)    /* 16383 levels */
  369. case 14:    UNPACKL1_N(15)    /* 32767 levels */
  370. /* -- joint ---- */
  371. case 15+0:
  372.     s[k+1] = s[k] =  0.0F;
  373.     k++;       /* skip right chan dispatch */
  374.     goto dispatch;
  375. /* -- joint ---- */
  376. case 15+1:     UNPACKL1J_N(2)     /*  3 levels */
  377. case 15+2:     UNPACKL1J_N(3)     /*  7 levels */
  378. case 15+3:     UNPACKL1J_N(4)     /* 15 levels */
  379. case 15+4:     UNPACKL1J_N(5)     /* 31 levels */
  380. case 15+5:     UNPACKL1J_N(6)     /* 63 levels */
  381. case 15+6:     UNPACKL1J_N(7)     /* 127 levels */
  382. case 15+7:     UNPACKL1J_N(8)     /* 255 levels */
  383. case 15+8:     UNPACKL1J_N(9)     /* 511 levels */
  384. case 15+9:     UNPACKL1J_N(10)    /* 1023 levels */
  385. case 15+10:    UNPACKL1J_N(11)    /* 2047 levels */
  386. case 15+11:    UNPACKL1J_N(12)    /* 4095 levels */
  387. case 15+12:    UNPACKL1J_N(13)     /* 8191 levels */
  388. case 15+13:    UNPACKL1J_N(14)     /* 16383 levels */
  389. case 15+14:    UNPACKL1J_N(15)     /* 32767 levels */
  390. /* -- end of dispatch -- */
  391. case 31:
  392.    skip(bit_skip);
  393. case 30:
  394.    s += 64;
  395. } /* end switch */
  396. } /* end j loop */
  397. /*-- done --*/
  398. }
  399. /*-------------------------------------------------------------------*/