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

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 "hlxclib/string.h"
  36. #include "statname.h"
  37. /****  msis.c  ***************************************************
  38.   Layer III  
  39.  antialias, ms and is stereo precessing
  40. **** is_process assumes never switch 
  41.       from short to long in is region *****
  42.      
  43. is_process does ms or stereo in "forbidded sf regions"
  44.     //ms_mode = 0 
  45.     lr[0][i][0] = 1.0f;
  46.     lr[0][i][1] = 0.0f;
  47.     // ms_mode = 1, in is bands is routine does ms processing 
  48.     lr[1][i][0] = 1.0f;
  49.     lr[1][i][1] = 1.0f;
  50. ******************************************************************/
  51. #include "l3.h"
  52. #ifdef __cplusplus
  53. extern "C" {
  54. #endif
  55. void antialias(float x[], int n);
  56. void ms_process(float x[][1152], int n);
  57. void is_process_MPEG1(float x[][1152],
  58.                 SCALEFACT *sf, 
  59.                 CB_INFO cb_info[2],
  60.                 int nsamp, int ms_mode, int nBand[2][22], int sfBandIndex[2][22]);
  61. void is_process_MPEG2(float x[][1152],
  62.                 SCALEFACT *sf, 
  63.                 CB_INFO cb_info[2],
  64.                 IS_SF_INFO *is_sf_info,
  65.                 int nsamp, int ms_mode, int nBand[2][22], int sfBandIndex[2][22]);  
  66. #ifdef __cplusplus
  67. }
  68. #endif
  69. typedef float ARRAY2[2];
  70. typedef float ARRAY8_2[8][2];
  71. typedef float ARRAY2_64_2[2][64][2];
  72. typedef float ARRAY64_2[64][2];
  73. extern const float lr[2][8][2];
  74. extern const float lr2[2][2][64][2];
  75. /* antialias 
  76. for(i=0;i<8;i++) {
  77.     csa[i][0] = (float)(1.0/sqrt(1.0 + Ci[i]*Ci[i]));
  78.     csa[i][1] = (float)(Ci[i]/sqrt(1.0 + Ci[i]*Ci[i]));
  79. }
  80. */
  81. static const float csa[8][2] = {
  82. {8.5749292374e-001f, -5.1449579000e-001f},  {8.8174200058e-001f, -4.7173199058e-001f}, 
  83. {9.4962865114e-001f, -3.1337746978e-001f},  {9.8331457376e-001f, -1.8191319704e-001f}, 
  84. {9.9551779032e-001f, -9.4574190676e-002f},  {9.9916058779e-001f, -4.0965583175e-002f}, 
  85. {9.9989920855e-001f, -1.4198568650e-002f},  {9.9999314547e-001f, -3.6999746226e-003f}, 
  86. };
  87. /*===============================================================*/
  88. void antialias(float x[], int n)
  89. {
  90. int i, k;
  91. float a, b;
  92. for(k=0;k<n;k++) {
  93.     for(i=0;i<8;i++) {
  94.         a = x[17-i];
  95.         b = x[18+i];
  96.         x[17-i] = a*csa[i][0] - b*csa[i][1];
  97.         x[18+i] = b*csa[i][0] + a*csa[i][1];
  98.     }
  99.     x+=18;
  100. }
  101. }
  102. /*===============================================================*/
  103. void ms_process(float x[][1152], int n)  /* sum-difference stereo */
  104. {
  105. int i;
  106. float xl, xr;
  107. /*-- note: sqrt(2) done scaling by dequant ---*/
  108. for(i=0;i<n;i++) {
  109.     xl = x[0][i] + x[1][i];
  110.     xr = x[0][i] - x[1][i];
  111.     x[0][i] = xl;
  112.     x[1][i] = xr;
  113. }
  114. return;
  115. }
  116. /*===============================================================*/
  117. void is_process_MPEG1(float x[][1152],    /* intensity stereo */
  118.                 SCALEFACT *sf, 
  119.                 CB_INFO cb_info[2],         /* [ch] */
  120.                 int nsamp, int ms_mode, int nBand[2][22], int sfBandIndex[2][22])  
  121. {
  122. int i, j, n, cb, w;
  123. float fl, fr;
  124. int m;
  125. int isf;
  126. float fls[3], frs[3];
  127. int cb0;
  128. cb0  = cb_info[1].cbmax;  /* start at end of right */
  129. i    = sfBandIndex[cb_info[1].cbtype][cb0];
  130. cb0++;
  131. m    = nsamp - i;    /* process to len of left */
  132. if( cb_info[1].cbtype ) goto short_blocks;
  133. /*------------------------*/
  134. /* long_blocks: */
  135. for(cb=cb0;cb<21;cb++) {
  136.     isf = sf->l[cb];
  137.     n = nBand[0][cb];
  138.     fl = lr[ms_mode][isf][0];
  139.     fr = lr[ms_mode][isf][1];
  140.     for(j=0;j<n;j++,i++) {
  141.         if( --m < 0 ) goto exit;
  142.         x[1][i] = fr*x[0][i];
  143.         x[0][i] = fl*x[0][i];
  144.     }
  145. }
  146. return;
  147. /*------------------------*/
  148. short_blocks:
  149. for(cb=cb0;cb<12;cb++) {
  150.     for(w=0;w<3;w++) {
  151.         isf = sf->s[w][cb];
  152.         fls[w] = lr[ms_mode][isf][0];
  153.         frs[w] = lr[ms_mode][isf][1];
  154.     }
  155.     n = nBand[1][cb];
  156.     for(j=0;j<n;j++) {
  157.         m-=3;
  158.         if( m < 0 ) goto exit;
  159.         x[1][i]   = frs[0]*x[0][i];
  160.         x[0][i]   = fls[0]*x[0][i];
  161.         x[1][1+i] = frs[1]*x[0][1+i];
  162.         x[0][1+i] = fls[1]*x[0][1+i];
  163.         x[1][2+i] = frs[2]*x[0][2+i];
  164.         x[0][2+i] = fls[2]*x[0][2+i];
  165.         i+=3;
  166.     }
  167. }
  168. exit:
  169. return;
  170. }
  171. /*===============================================================*/
  172. void is_process_MPEG2(float x[][1152],    /* intensity stereo */
  173.                 SCALEFACT *sf, 
  174.                 CB_INFO cb_info[2],     /* [ch] */
  175.                 IS_SF_INFO *is_sf_info,
  176.                 int nsamp, int ms_mode, int nBand[2][22], int sfBandIndex[2][22])  
  177. {
  178. int i, j, k, n, cb, w;
  179. float fl, fr;
  180. int m;
  181. int isf;
  182. int il[21];
  183. int tmp;
  184. int r;
  185. const ARRAY2 *lr;
  186. int cb0, cb1;
  187. memset((void*)il, 0, sizeof(il));
  188. lr = lr2[is_sf_info->intensity_scale][ms_mode];
  189. if( cb_info[1].cbtype ) goto short_blocks;
  190. /*------------------------*/
  191. /* long_blocks: */
  192. cb0  = cb_info[1].cbmax;  /* start at end of right */
  193. i    = sfBandIndex[0][cb0];
  194. m    = nsamp - i;    /* process to len of left */
  195. /* gen sf info */
  196. for(k=r=0;r<3;r++) {
  197.     tmp = (1 << is_sf_info->slen[r]) -1;
  198.     for(j=0;j<is_sf_info->nr[r];j++, k++) il[k] = tmp;
  199. }
  200. for(cb=cb0+1; cb<21;cb++) {
  201.     isf = il[cb] + sf->l[cb];
  202.     fl = lr[isf][0];
  203.     fr = lr[isf][1];
  204.     n = nBand[0][cb];
  205.     for(j=0;j<n;j++,i++) {
  206.         if( --m < 0 ) goto exit;
  207.         x[1][i] = fr*x[0][i];
  208.         x[0][i] = fl*x[0][i];
  209.     }
  210. }
  211. return;
  212. /*------------------------*/
  213. short_blocks:
  214. for(k=r=0;r<3;r++) {
  215.     tmp = (1 << is_sf_info->slen[r]) -1;
  216.     for(j=0;j<is_sf_info->nr[r];j++, k++) il[k] = tmp;
  217. }
  218. for(w=0;w<3;w++) {
  219. cb0  = cb_info[1].cbmax_s[w];  /* start at end of right */
  220. i    = sfBandIndex[1][cb0] + w;
  221. cb1  = cb_info[0].cbmax_s[w];  /* process to end of left */
  222. for(cb=cb0+1;cb<=cb1;cb++) {
  223.     isf = il[cb] + sf->s[w][cb];
  224.     fl = lr[isf][0];
  225.     fr = lr[isf][1];
  226.     n = nBand[1][cb];
  227.     for(j=0;j<n;j++) {
  228.         x[1][i]   = fr*x[0][i];
  229.         x[0][i]   = fl*x[0][i];
  230.         i+=3;
  231.     }
  232. }
  233. }
  234. exit:
  235. return;
  236. }
  237. /*===============================================================*/