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

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. #ifndef _CARBON
  37. #include "hlxclib/math.h"
  38. #endif
  39. #include "hlxclib/string.h"
  40. #include "l3.h"
  41. #ifdef __cplusplus
  42. extern "C" {
  43. #endif
  44. void dequant(SAMPLE Sample[], int *nsamp, 
  45.              SCALEFACT *sf, 
  46.              GR *gr,
  47.              CB_INFO *cb_info, int ncbl_mixed, int nBand[2][22], float re_buf[192][3]);
  48. #ifdef __cplusplus
  49. }
  50. #endif
  51. /* JR - added undefs */
  52. #ifdef min
  53. #undef min
  54. #endif
  55. #ifdef max
  56. #undef max
  57. #endif
  58. #define min(a,b)  ((((a)>=(b))?(b):(a))) 
  59. #define max(a,b)  ((((a)>=(b))?(a):(b))) 
  60. /*----------
  61. static struct  {
  62. int l[23];
  63. int s[14];} sfBandTable[3] =   
  64. {{{0,4,8,12,16,20,24,30,36,44,52,62,74,90,110,134,162,196,238,288,342,418,576},
  65.  {0,4,8,12,16,22,30,40,52,66,84,106,136,192}},
  66. {{0,4,8,12,16,20,24,30,36,42,50,60,72,88,106,128,156,190,230,276,330,384,576},
  67.  {0,4,8,12,16,22,28,38,50,64,80,100,126,192}},
  68. {{0,4,8,12,16,20,24,30,36,44,54,66,82,102,126,156,194,240,296,364,448,550,576},
  69.  {0,4,8,12,16,22,30,42,58,78,104,138,180,192}}};
  70. ----------*/
  71. /*--------------------------------*/
  72. static const int pretab[2][22] = {
  73. {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
  74. {0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,2,2,3,3,3,2,0},
  75. };
  76. extern const float look_global[256+2+4]; /* JR - made into ROM table */
  77. extern const float look_scale[2][4][32]; /* JR - made into ROM table */
  78. #define ISMAX 32
  79. extern const float look_pow[2*ISMAX];  
  80. extern const float look_subblock[8];
  81. /*-- reorder buffer ---*/
  82. typedef float ARRAY3[3];
  83. /*=============================================================*/
  84. void dequant(SAMPLE Sample[], int *nsamp, 
  85.              SCALEFACT *sf, 
  86.              GR *gr,
  87.              CB_INFO *cb_info, int ncbl_mixed, int nBand[2][22], float re_buf[192][3])
  88. {
  89. int i, j;
  90. int cb, n, w;
  91. float x0, xs;
  92. float xsb[3];
  93. double tmp;
  94. int ncbl;
  95. int cbs0;
  96. ARRAY3 *buf;    /* short block reorder */
  97. int nbands;
  98. int i0;
  99. int non_zero;
  100. int cbmax[3];
  101. int p;
  102. nbands = *nsamp;
  103. ncbl = 22;      /* long block cb end */
  104. cbs0 = 12;      /* short block cb start */
  105. /* ncbl_mixed = 8 or 6  mpeg1 or 2 */
  106. if( gr->block_type == 2 ) {
  107.     ncbl = 0; cbs0 = 0;
  108.     if( gr->mixed_block_flag ) { ncbl = ncbl_mixed; cbs0 = 3; }
  109. }
  110. /* fill in cb_info --*/
  111. cb_info->lb_type = gr->block_type;
  112. if( gr->block_type == 2 ) cb_info->lb_type;
  113. cb_info->cbs0 = cbs0;
  114. cb_info->ncbl = ncbl;
  115. cbmax[2] = cbmax[1] = cbmax[0] = 0;
  116. /* global gain pre-adjusted by 2 if ms_mode, 0 otherwise */
  117. // mod 7/23/99  min max on global gain lookup
  118. //     may use global gain for volume control
  119. p = max(0, (2+4)+gr->global_gain);
  120. p = min(p, 255+(2+4) );
  121. x0 = look_global[p];
  122. i=0;
  123. /*----- long blocks ---*/
  124. for(cb=0;cb<ncbl;cb++) {
  125.     non_zero = 0;
  126.     xs = x0*look_scale[gr->scalefac_scale][pretab[gr->preflag][cb]][sf->l[cb]];
  127.     n = nBand[0][cb];
  128.     for(j=0;j<n;j++,i++) {
  129.         if( Sample[i].s == 0 ) Sample[i].x = 0.0F;
  130.         else {
  131.             non_zero = 1;
  132.             if( (Sample[i].s >= (-ISMAX) ) && (Sample[i].s < ISMAX) ) 
  133.                     Sample[i].x = xs*look_pow[ISMAX+Sample[i].s];
  134.             else {
  135.                 tmp = (double)Sample[i].s;
  136.                 Sample[i].x = (float)(xs*tmp*pow(fabs(tmp),(1.0/3.0)));
  137.             }
  138.         }
  139.     }
  140.     if( non_zero ) cbmax[0] = cb;
  141.     if( i >= nbands ) break;
  142. }
  143. cb_info->cbmax  = cbmax[0];
  144. cb_info->cbtype = 0;     // type = long
  145. if( cbs0 >= 12 ) return;
  146. /*---------------------------
  147. block type = 2  short blocks
  148. ----------------------------*/
  149. cbmax[2] = cbmax[1] = cbmax[0] = cbs0;
  150. i0 = i;     /* save for reorder */
  151. buf = re_buf;
  152. for(w=0;w<3;w++) xsb[w] = x0*look_subblock[gr->subblock_gain[w]];
  153. for(cb=cbs0;cb<13;cb++) {
  154.     n = nBand[1][cb];
  155.     for(w=0;w<3;w++) {
  156.         non_zero =  0;
  157.         xs = xsb[w]*look_scale[gr->scalefac_scale][0][sf->s[w][cb]];
  158.         for(j=0;j<n;j++,i++) {
  159.             if( Sample[i].s == 0 ) buf[j][w] = 0.0F;
  160.             else {
  161.                 non_zero = 1;
  162.                 if( (Sample[i].s >= (-ISMAX) ) && (Sample[i].s < ISMAX) ) 
  163.                     buf[j][w] = xs*look_pow[ISMAX+Sample[i].s];
  164.                 else {
  165.                     tmp = (double)Sample[i].s;
  166.                     buf[j][w] = (float)(xs*tmp*pow(fabs(tmp),(1.0/3.0)));
  167.                 }
  168.             }
  169.         }
  170.         if( non_zero ) cbmax[w] = cb;
  171.     }
  172.     if( i >= nbands ) break;
  173.     buf += n;
  174. }
  175. memmove(&Sample[i0].x, &re_buf[0][0], sizeof(float)*(i-i0));
  176. *nsamp = i;   /* update nsamp */
  177. cb_info->cbmax_s[0] = cbmax[0];
  178. cb_info->cbmax_s[1] = cbmax[1];
  179. cb_info->cbmax_s[2] = cbmax[2];
  180. if( cbmax[1] > cbmax[0] ) cbmax[0] = cbmax[1];
  181. if( cbmax[2] > cbmax[0] ) cbmax[0] = cbmax[2];
  182. cb_info->cbmax  = cbmax[0];
  183. cb_info->cbtype = 1;     /* type = short */
  184. return;
  185. }
  186. /*-------------------------------------------------------------*/