upsf.c
上传用户:zhongxx05
上传日期:2007-06-06
资源大小:33641k
文件大小:11k
源码类别:

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 "l3.h"
  37. #ifdef __cplusplus
  38. extern "C" {
  39. #endif
  40. unsigned int bitget(BITDAT *bitdat, int n);
  41. void unpack_sf_sub_MPEG1(SCALEFACT sf[],
  42.                          GR *grdat,
  43.  int scfsi,
  44.  int gr, BITDAT *bitdat);
  45. void unpack_sf_sub_MPEG2(SCALEFACT sf[], 
  46.                          GR *grdat,
  47.                          int is_and_ch, IS_SF_INFO *sf_info, BITDAT *bitdat);
  48. #ifdef __cplusplus
  49. }
  50. #endif
  51. /*------------------------------------------------------------*/
  52. /* JR - made const */
  53. static const int slen_table[16][2] = {
  54.     0, 0,    0, 1,
  55.     0, 2,    0, 3,
  56.     3, 0,    1, 1,
  57.     1, 2,    1, 3,
  58.     2, 1,    2, 2,
  59.     2, 3,    3, 1,
  60.     3, 2,    3, 3,
  61.     4, 2,    4, 3,
  62. };
  63. /* nr_table[size+3*is_right][block type 0,1,3  2, 2+mixed][4]  */
  64. /* for bt=2 nr is count for group of 3 */
  65. /* JR - made const */
  66. static const int nr_table[6][3][4] = {
  67. 6, 5, 5, 5,
  68. 3, 3, 3, 3,
  69. 6, 3, 3, 3,
  70. 6, 5, 7, 3, 
  71. 3, 3, 4, 2,
  72. 6, 3, 4, 2,
  73. 11, 10, 0, 0,
  74. 6, 6, 0, 0,
  75. 6, 3, 6, 0,  /* adjusted */  /* 15, 18, 0, 0,   */
  76. /*-intensity stereo right chan--*/
  77. 7, 7, 7, 0,
  78. 4, 4, 4, 0,
  79. 6, 5, 4, 0,
  80. 6, 6, 6, 3, 
  81. 4, 3, 3, 2,
  82. 6, 4, 3, 2,
  83. 8, 8, 5, 0,
  84. 5, 4, 3, 0,
  85. 6, 6, 3, 0,
  86. };
  87. /*=============================================================*/
  88. void unpack_sf_sub_MPEG1(SCALEFACT sf[],
  89.                             GR *grdat,
  90.                             int scfsi,   /* bit flag */
  91.                             int gr, BITDAT *bitdat)
  92. {
  93. int sfb;
  94. int slen0, slen1;
  95. int block_type, mixed_block_flag, scalefac_compress;
  96. block_type        = grdat->block_type;
  97. mixed_block_flag  = grdat->mixed_block_flag;
  98. scalefac_compress = grdat->scalefac_compress;
  99. slen0 = slen_table[scalefac_compress][0];
  100. slen1 = slen_table[scalefac_compress][1];
  101. if( block_type == 2 ) { 
  102.   if( mixed_block_flag ) {          /* mixed */
  103.      for (sfb = 0; sfb < 8; sfb++) 
  104.         sf[0].l[sfb] = bitget(bitdat, slen0);
  105.      for (sfb = 3; sfb < 6; sfb++) {
  106.            sf[0].s[0][sfb] = bitget(bitdat, slen0);
  107.            sf[0].s[1][sfb] = bitget(bitdat, slen0);
  108.            sf[0].s[2][sfb] = bitget(bitdat, slen0);
  109.      }
  110.      for (sfb = 6; sfb < 12; sfb++) {
  111.            sf[0].s[0][sfb] = bitget(bitdat, slen1);
  112.            sf[0].s[1][sfb] = bitget(bitdat, slen1);
  113.            sf[0].s[2][sfb] = bitget(bitdat, slen1);
  114.      }
  115.   return;
  116.   }
  117.   for (sfb = 0; sfb < 6; sfb++) {
  118.           sf[0].s[0][sfb] = bitget(bitdat, slen0);
  119.           sf[0].s[1][sfb] = bitget(bitdat, slen0);
  120.           sf[0].s[2][sfb] = bitget(bitdat, slen0);
  121.      }
  122.   for ( ; sfb < 12; sfb++) {
  123.           sf[0].s[0][sfb] = bitget(bitdat, slen1);
  124.           sf[0].s[1][sfb] = bitget(bitdat, slen1);
  125.           sf[0].s[2][sfb] = bitget(bitdat, slen1);
  126.      }
  127.   return;
  128. }          
  129. /* long blocks types 0 1 3, first granule */
  130. if( gr == 0 ) {
  131.     for (sfb=0; sfb<11; sfb++) sf[0].l[sfb] = bitget(bitdat, slen0);
  132.     for (     ; sfb<21; sfb++) sf[0].l[sfb] = bitget(bitdat, slen1);
  133. return;
  134. }
  135. /* long blocks 0, 1, 3, second granule */
  136. sfb = 0;
  137. if(scfsi & 8) for(;sfb<6 ;sfb++) sf[0].l[sfb] = sf[-2].l[sfb];
  138. else          for(;sfb<6 ;sfb++) sf[0].l[sfb] = bitget(bitdat, slen0);
  139. if(scfsi & 4) for(;sfb<11;sfb++) sf[0].l[sfb] = sf[-2].l[sfb];
  140. else          for(;sfb<11;sfb++) sf[0].l[sfb] = bitget(bitdat, slen0);
  141. if(scfsi & 2) for(;sfb<16;sfb++) sf[0].l[sfb] = sf[-2].l[sfb];
  142. else          for(;sfb<16;sfb++) sf[0].l[sfb] = bitget(bitdat, slen1);
  143. if(scfsi & 1) for(;sfb<21;sfb++) sf[0].l[sfb] = sf[-2].l[sfb];
  144. else          for(;sfb<21;sfb++) sf[0].l[sfb] = bitget(bitdat, slen1);
  145. return;
  146. }
  147. /*=============================================================*/
  148. void unpack_sf_sub_MPEG2(SCALEFACT sf[], 
  149.                             GR *grdat,
  150.                             int is_and_ch, IS_SF_INFO *sf_info, BITDAT *bitdat)
  151. {
  152. int sfb;
  153. int slen1, slen2, slen3, slen4;
  154. int nr1, nr2, nr3, nr4;
  155. int i, k;
  156. int preflag, intensity_scale;
  157. int block_type, mixed_block_flag, scalefac_compress;
  158. block_type        = grdat->block_type;
  159. mixed_block_flag  = grdat->mixed_block_flag;
  160. scalefac_compress = grdat->scalefac_compress;
  161. preflag = 0;
  162. intensity_scale = 0;  /* to avoid compiler warning */
  163. if( is_and_ch == 0 ) {
  164.     if( scalefac_compress < 400 ) {
  165.         slen2 = scalefac_compress >> 4;
  166.         slen1 = slen2 / 5;
  167.         slen2 = slen2 % 5;
  168.         slen4 = scalefac_compress & 15;
  169.         slen3 = slen4 >> 2;
  170.         slen4 = slen4 & 3;
  171.         k = 0;
  172.     }
  173.     else if( scalefac_compress < 500 ) {
  174.         scalefac_compress -= 400;
  175.         slen2 = scalefac_compress >> 2;
  176.         slen1 = slen2 / 5;
  177.         slen2 = slen2 % 5;
  178.         slen3 = scalefac_compress & 3;
  179.         slen4 = 0;
  180.         k = 1;
  181.     }
  182.     else {
  183.         scalefac_compress -= 500;
  184.         slen1 = scalefac_compress / 3;
  185.         slen2 = scalefac_compress % 3;
  186.         slen3 = slen4 = 0;
  187.         if( mixed_block_flag ) {
  188.             slen3 = slen2;  /* adjust for long/short mix logic */
  189.             slen2 = slen1;
  190.         }  
  191.         preflag = 1;
  192.         k = 2;
  193.     }
  194. }
  195. else {    /* intensity stereo ch = 1 (right) */
  196.     intensity_scale = scalefac_compress & 1;
  197.     scalefac_compress >>= 1;
  198.     if( scalefac_compress < 180 ) {
  199.         slen1 = scalefac_compress / 36;
  200.         slen2 = scalefac_compress % 36;
  201.         slen3 = slen2 % 6;
  202.         slen2 = slen2 / 6;
  203.         slen4 = 0;
  204.         k = 3+0;
  205.     }
  206.     else if( scalefac_compress < 244 ) {
  207.         scalefac_compress -= 180;
  208.         slen3 = scalefac_compress & 3;
  209.         scalefac_compress >>= 2;
  210.         slen2 = scalefac_compress & 3;
  211.         slen1 = scalefac_compress >> 2;
  212.         slen4 = 0;
  213.         k = 3+1;
  214.     }
  215.     else {
  216.         scalefac_compress -= 244;
  217.         slen1 = scalefac_compress / 3;
  218.         slen2 = scalefac_compress % 3;
  219.         slen3 = slen4 = 0;
  220.         k = 3+2;
  221.     }
  222. }
  223. i = 0;
  224. if( block_type == 2 ) i = (mixed_block_flag & 1) + 1;
  225. nr1 = nr_table[k][i][0];
  226. nr2 = nr_table[k][i][1];
  227. nr3 = nr_table[k][i][2];
  228. nr4 = nr_table[k][i][3];
  229. /* return is scale factor info (for right chan is mode) */
  230. if( is_and_ch ) {
  231.     sf_info->nr[0] = nr1;
  232.     sf_info->nr[1] = nr2;
  233.     sf_info->nr[2] = nr3;
  234.     sf_info->slen[0] = slen1;
  235.     sf_info->slen[1] = slen2;
  236.     sf_info->slen[2] = slen3;
  237.     sf_info->intensity_scale = intensity_scale;
  238. }
  239. grdat->preflag = preflag;   /* return preflag */
  240. /*--------------------------------------*/
  241. if( block_type == 2 ) { 
  242. if( mixed_block_flag ) {          /* mixed */
  243.     if( slen1 != 0 )            /* long block portion */
  244.         for (sfb=0; sfb < 6; sfb++) sf[0].l[sfb] = bitget(bitdat, slen1);
  245.     else
  246.         for (sfb=0; sfb < 6; sfb++) sf[0].l[sfb] = 0;
  247.     sfb = 3;  /* start sfb for short */
  248. }
  249. else {      /* all short, initial short blocks */
  250.     sfb = 0;
  251.     if( slen1 != 0 ) 
  252.         for (i=0; i<nr1; i++, sfb++) {
  253.            sf[0].s[0][sfb] = bitget(bitdat, slen1);
  254.            sf[0].s[1][sfb] = bitget(bitdat, slen1);
  255.            sf[0].s[2][sfb] = bitget(bitdat, slen1);
  256.         }
  257.     else 
  258.         for (i=0; i<nr1; i++, sfb++) {
  259.            sf[0].s[0][sfb] = 0;
  260.            sf[0].s[1][sfb] = 0;
  261.            sf[0].s[2][sfb] = 0;
  262.         }
  263. }
  264. /* remaining short blocks */
  265. if( slen2 != 0 ) 
  266.     for (i=0; i<nr2; i++, sfb++) {
  267.        sf[0].s[0][sfb] = bitget(bitdat, slen2);
  268.        sf[0].s[1][sfb] = bitget(bitdat, slen2);
  269.        sf[0].s[2][sfb] = bitget(bitdat, slen2);
  270.     }
  271. else 
  272.     for (i=0; i<nr2; i++, sfb++) {
  273.        sf[0].s[0][sfb] = 0;
  274.        sf[0].s[1][sfb] = 0;
  275.        sf[0].s[2][sfb] = 0;
  276.     }
  277. if( slen3 != 0 ) 
  278.     for (i=0; i<nr3; i++, sfb++) {
  279.        sf[0].s[0][sfb] = bitget(bitdat, slen3);
  280.        sf[0].s[1][sfb] = bitget(bitdat, slen3);
  281.        sf[0].s[2][sfb] = bitget(bitdat, slen3);
  282.     }
  283. else 
  284.     for (i=0; i<nr3; i++, sfb++) {
  285.        sf[0].s[0][sfb] = 0;
  286.        sf[0].s[1][sfb] = 0;
  287.        sf[0].s[2][sfb] = 0;
  288.     }
  289. if( slen4 != 0 ) 
  290.     for (i=0; i<nr4; i++, sfb++) {
  291.        sf[0].s[0][sfb] = bitget(bitdat, slen4);
  292.        sf[0].s[1][sfb] = bitget(bitdat, slen4);
  293.        sf[0].s[2][sfb] = bitget(bitdat, slen4);
  294.     }
  295. else 
  296.     for (i=0; i<nr4; i++, sfb++) {
  297.        sf[0].s[0][sfb] = 0;
  298.        sf[0].s[1][sfb] = 0;
  299.        sf[0].s[2][sfb] = 0;
  300.     }
  301. return;
  302. }
  303. /* long blocks types 0 1 3 */
  304. sfb = 0;
  305. if( slen1 != 0 ) for(i=0; i<nr1; i++, sfb++) sf[0].l[sfb] = bitget(bitdat, slen1);
  306. else             for(i=0; i<nr1; i++, sfb++) sf[0].l[sfb] = 0;
  307. if( slen2 != 0 ) for(i=0; i<nr2; i++, sfb++) sf[0].l[sfb] = bitget(bitdat, slen2);
  308. else             for(i=0; i<nr2; i++, sfb++) sf[0].l[sfb] = 0;
  309. if( slen3 != 0 ) for(i=0; i<nr3; i++, sfb++) sf[0].l[sfb] = bitget(bitdat, slen3);
  310. else             for(i=0; i<nr3; i++, sfb++) sf[0].l[sfb] = 0;
  311. if( slen4 != 0 ) for(i=0; i<nr4; i++, sfb++) sf[0].l[sfb] = bitget(bitdat, slen4);
  312. else             for(i=0; i<nr4; i++, sfb++) sf[0].l[sfb] = 0;
  313. }
  314. /*-------------------------------------------------*/