backpred.c
上传用户:sun1608
上传日期:2007-02-02
资源大小:6116k
文件大小:11k
源码类别:

流媒体/Mpeg4/MP4

开发平台:

Visual C++

  1. /*
  2.  * FAAC - Freeware Advanced Audio Coder
  3.  * Copyright (C) 2001 Menno Bakker
  4.  *
  5.  * This library is free software; you can redistribute it and/or
  6.  * modify it under the terms of the GNU Lesser General Public
  7.  * License as published by the Free Software Foundation; either
  8.  * version 2.1 of the License, or (at your option) any later version.
  9.  *
  10.  * This library is distributed in the hope that it will be useful,
  11.  * but WITHOUT ANY WARRANTY; without even the implied warranty of
  12.  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
  13.  * Lesser General Public License for more details.
  14.  * You should have received a copy of the GNU Lesser General Public
  15.  * License along with this library; if not, write to the Free Software
  16.  * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
  17.  *
  18.  * $Id: backpred.c,v 1.3 2001/06/04 23:02:24 wmay Exp $
  19.  */
  20. #include <math.h>
  21. #include "frame.h"
  22. #include "coder.h"
  23. #include "channels.h"
  24. #include "backpred.h"
  25. void PredInit(faacEncHandle hEncoder)
  26. {
  27. unsigned int channel;
  28. for (channel = 0; channel < hEncoder->numChannels; channel++) {
  29. BwpInfo *bwpInfo = &(hEncoder->coderInfo[channel].bwpInfo);
  30. bwpInfo->psy_init_mc = 0;
  31. bwpInfo->reset_count_mc = 0;
  32. }
  33. }
  34.  
  35. void PredCalcPrediction(double *act_spec, double *last_spec, int btype, 
  36. int nsfb, 
  37. int *isfb_width, 
  38. CoderInfo *coderInfo,
  39. ChannelInfo *channelInfo,
  40. int chanNum) 
  41. {
  42. int i, k, j, cb_long;
  43. int leftChanNum;
  44. int isRightWithCommonWindow;
  45. double num_bit, snr[SBMAX_L];
  46. double energy[BLOCK_LEN_LONG], snr_p[BLOCK_LEN_LONG], temp1, temp2;
  47. ChannelInfo *thisChannel;
  48. /* Set pointers for specified channel number */
  49. /* int psy_init; */
  50. int *psy_init;
  51. double (*dr)[BLOCK_LEN_LONG],(*e)[BLOCK_LEN_LONG];
  52. double (*K)[BLOCK_LEN_LONG], (*R)[BLOCK_LEN_LONG];
  53. double (*VAR)[BLOCK_LEN_LONG], (*KOR)[BLOCK_LEN_LONG];
  54. double *sb_samples_pred;
  55. int *thisLineNeedsResetting;
  56. /* int reset_count; */
  57. int *reset_count;
  58. int *pred_global_flag;
  59. int *pred_sfb_flag;
  60. int *reset_group;
  61. /* Set pointers for this chanNum */
  62. pred_global_flag = &(coderInfo[chanNum].pred_global_flag);
  63. pred_sfb_flag = coderInfo[chanNum].pred_sfb_flag;
  64. reset_group = &(coderInfo[chanNum].reset_group_number);
  65. psy_init = &coderInfo[chanNum].bwpInfo.psy_init_mc;
  66. dr = &coderInfo[chanNum].bwpInfo.dr_mc[0];
  67. e = &coderInfo[chanNum].bwpInfo.e_mc[0];
  68. K = &coderInfo[chanNum].bwpInfo.K_mc[0]; 
  69. R = &coderInfo[chanNum].bwpInfo.R_mc[0];
  70. VAR = &coderInfo[chanNum].bwpInfo.VAR_mc[0];
  71. KOR = &coderInfo[chanNum].bwpInfo.KOR_mc[0];
  72. sb_samples_pred = &coderInfo[chanNum].bwpInfo.sb_samples_pred_mc[0];
  73. thisLineNeedsResetting = &coderInfo[chanNum].bwpInfo.thisLineNeedsResetting_mc[0];
  74. reset_count = &coderInfo[chanNum].bwpInfo.reset_count_mc;
  75. thisChannel = &(channelInfo[chanNum]);
  76. *psy_init = (*psy_init && (btype!=2));
  77. if((*psy_init) == 0) {
  78. for (j=0; j<BLOCK_LEN_LONG; j++) {
  79. thisLineNeedsResetting[j]=1;
  80. }
  81. *psy_init = 1;
  82. }
  83. if (btype==2) {
  84. pred_global_flag[0]=0;
  85. /* SHORT WINDOWS reset all the co-efficients    */
  86. if (thisChannel->ch_is_left) {
  87. (*reset_count)++;
  88. if (*reset_count >= 31 * RESET_FRAME)
  89. *reset_count = RESET_FRAME;
  90. }
  91. return;
  92. }
  93. /**************************************************/
  94. /*  Compute state using last_spec                 */
  95. /**************************************************/
  96. for (i=0;i<BLOCK_LEN_LONG;i++) 
  97.     {
  98. /* e[0][i]=last_spec[i]; */ 
  99. e[0][i]=last_spec[i]+sb_samples_pred[i];
  100. for(j=1;j<=LPC;j++)
  101. e[j][i] = e[j-1][i]-K[j][i]*R[j-1][i];
  102. for(j=1;j<LPC;j++) 
  103. dr[j][i] = K[j][i]*e[j-1][i];
  104. for(j=1;j<=LPC;j++) {
  105. VAR[j][i] = ALPHA*VAR[j][i]+.5*(R[j-1][i]*R[j-1][i]+e[j-1][i]*e[j-1][i]);
  106. KOR[j][i] = ALPHA*KOR[j][i]+R[j-1][i]*e[j-1][i];
  107. }
  108. for(j=LPC-1;j>=1;j--) 
  109. R[j][i] = A*(R[j-1][i]-dr[j][i]);
  110. R[0][i] = A*e[0][i];
  111.     }
  112. /**************************************************/
  113. /* Reset state here if resets were sent           */
  114. /**************************************************/
  115. for (i=0;i<BLOCK_LEN_LONG;i++) {
  116. if (thisLineNeedsResetting[i]) {
  117. for (j = 0; j <= LPC; j++)
  118. {
  119. K[j][i] = 0.0;
  120. e[j][i] = 0.0;
  121. R[j][i] = 0.0;
  122. VAR[j][i] = 1.0;
  123. KOR[j][i] = 0.0;
  124. dr[j][i] = 0.0;
  125. }
  126. }
  127. }
  128. /**************************************************/
  129. /* Compute predictor coefficients, predicted data */
  130. /**************************************************/
  131. for (i=0;i<BLOCK_LEN_LONG;i++) 
  132.     {
  133. for(j=1;j<=LPC;j++) {
  134. if(VAR[j][i]>MINVAR)
  135. K[j][i] = KOR[j][i]/VAR[j][i]*B;
  136. else
  137. K[j][i] = 0;
  138. }
  139.     }
  140. for (k=0; k<BLOCK_LEN_LONG; k++)
  141.     {
  142. sb_samples_pred[k]=0.0;
  143. for (i=1; i<=LPC; i++)
  144. sb_samples_pred[k]+=K[i][k]*R[i-1][k];
  145.     }
  146. /***********************************************************/
  147. /* If this is the right channel of a channel_pair_element, */
  148. /* AND common_window is 1 in this channel_pair_element,    */
  149. /* THEN copy predictor data to use from the left channel.  */
  150. /* ELSE determine independent predictor data and resets.   */
  151. /***********************************************************/
  152. /* BE CAREFUL HERE, this assumes that predictor data has   */
  153. /* already been determined for the left channel!!          */
  154. /***********************************************************/
  155. isRightWithCommonWindow = 0;     /* Is this a right channel with common_window?*/
  156. if ((thisChannel->cpe)&&( !(thisChannel->ch_is_left))) {
  157. leftChanNum = thisChannel->paired_ch;
  158. if (channelInfo[leftChanNum].common_window) {
  159. isRightWithCommonWindow = 1;
  160. }
  161. }
  162. if (isRightWithCommonWindow) {
  163. /**************************************************/
  164. /* Use predictor data from the left channel.      */
  165. /**************************************************/
  166. CopyPredInfo(&(coderInfo[chanNum]),&(coderInfo[leftChanNum]));
  167. /* Make sure to turn off bands with intensity stereo */
  168. #if 0
  169. if (thisChannel->is_info.is_present) {
  170. for (i=0; i<nsfb; i++) {
  171. if (thisChannel->is_info.is_used[i]) {
  172. pred_sfb_flag[i] = 0;
  173. }
  174. }
  175. }
  176. #endif
  177. cb_long=0;
  178. for (i=0; i<nsfb; i++)
  179. {
  180. if (!pred_sfb_flag[i]) {
  181. for (j=cb_long; j<cb_long+isfb_width[i]; j++)
  182. sb_samples_pred[j]=0.0; 
  183. }
  184. cb_long+=isfb_width[i];
  185. }
  186. /* Disable prediction for bands nsfb through SBMAX_L */ 
  187. for (i=j;i<BLOCK_LEN_LONG;i++) {
  188. sb_samples_pred[i]=0.0;
  189. }
  190. for (i=nsfb;i<SBMAX_L;i++) {
  191. pred_sfb_flag[i]=0;
  192. }
  193. /* Is global enable set, if not enabled predicted samples are zeroed */
  194. if(!pred_global_flag[0]) {
  195. for (j=0; j<BLOCK_LEN_LONG; j++)
  196. sb_samples_pred[j]=0.0; 
  197. }
  198. for (j=0; j<BLOCK_LEN_LONG; j++)
  199. act_spec[j]-=sb_samples_pred[j];
  200. } else {
  201. /**************************************************/
  202. /* Determine whether to enable/disable prediction */
  203. /**************************************************/
  204. for (k=0; k<BLOCK_LEN_LONG; k++) {
  205. energy[k]=act_spec[k]*act_spec[k];
  206. snr_p[k]=(act_spec[k]-sb_samples_pred[k])*(act_spec[k]-sb_samples_pred[k]);
  207. }
  208. cb_long=0;
  209. for (i=0; i<nsfb; i++) {
  210. pred_sfb_flag[i]=1;
  211. temp1=0.0;
  212. temp2=0.0;
  213. for (j=cb_long; j<cb_long+isfb_width[i]; j++) {
  214. temp1+=energy[j];
  215. temp2+=snr_p[j];
  216. }
  217. if(temp2<1.e-20)
  218. temp2=1.e-20;
  219. if(temp1!=0.0)
  220. snr[i]=-10.*log10((double ) temp2/temp1);
  221. else
  222. snr[i]=0.0;
  223. if(snr[i]<=0.0) {
  224. pred_sfb_flag[i]=0; 
  225. for (j=cb_long; j<cb_long+isfb_width[i]; j++)
  226. sb_samples_pred[j]=0.0;
  227. }
  228. cb_long+=isfb_width[i];
  229. }
  230. /* Disable prediction for bands nsfb through SBMAX_L */ 
  231. for (i=j;i<BLOCK_LEN_LONG;i++) {
  232. sb_samples_pred[i]=0.0;
  233. }
  234. for (i=nsfb;i<SBMAX_L;i++) {
  235. pred_sfb_flag[i]=0;
  236. }
  237. num_bit=0.0;
  238. for (i=0; i<nsfb; i++)
  239. if(snr[i]>0.0)
  240. num_bit+=snr[i]/6.*isfb_width[i];
  241. /* Determine global enable, if not enabled predicted samples are zeroed */
  242. pred_global_flag[0]=1;
  243. if(num_bit<50) {
  244. pred_global_flag[0]=0; num_bit=0.0; 
  245. for (j=0; j<BLOCK_LEN_LONG; j++)
  246. sb_samples_pred[j]=0.0; 
  247. }
  248. for (j=0; j<BLOCK_LEN_LONG; j++)
  249. act_spec[j]-=sb_samples_pred[j];
  250. }
  251. /**********************************************************/
  252. /* If this is a left channel, determine pred resets.      */
  253. /* If this is a right channel, using pred reset data from */
  254. /* left channel.  Keep left and right resets in sync.     */
  255. /**********************************************************/
  256. if ((thisChannel->cpe)&&( !(thisChannel->ch_is_left))) {
  257. /*  if (!thisChannel->ch_is_left) {*/
  258. /**********************************************************/
  259. /* Using predictor reset data from the left channel.      */
  260. /**********************************************************/
  261. reset_count = &coderInfo[leftChanNum].bwpInfo.reset_count_mc;
  262. /* Reset the frame counter */
  263. for (i=0;i<BLOCK_LEN_LONG;i++) {
  264. thisLineNeedsResetting[i]=0;
  265. }
  266. reset_group = &(coderInfo[chanNum].reset_group_number);
  267. if (*reset_count % RESET_FRAME == 0)
  268. { /* Send a reset in this frame */
  269. *reset_group = *reset_count / 8;
  270. for (i = *reset_group - 1; i < BLOCK_LEN_LONG; i += 30)
  271. {
  272. thisLineNeedsResetting[i]=1;
  273. }
  274. }
  275. else
  276. *reset_group = -1;
  277. } else {
  278. /******************************************************************/
  279. /* Determine whether a prediction reset is required - if so, then */
  280. /* set reset flag for the appropriate group.                      */
  281. /******************************************************************/
  282. /* Increase counter on left channel, keep left and right resets in sync */
  283. (*reset_count)++;
  284. /* Reset the frame counter */
  285. for (i=0;i<BLOCK_LEN_LONG;i++) {
  286. thisLineNeedsResetting[i]=0;
  287. }
  288. if (*reset_count >= 31 * RESET_FRAME)
  289. *reset_count = RESET_FRAME;
  290. if (*reset_count % RESET_FRAME == 0)
  291. { /* Send a reset in this frame */
  292. *reset_group = *reset_count / 8;
  293. for (i = *reset_group - 1; i < BLOCK_LEN_LONG; i += 30)
  294. {
  295. thisLineNeedsResetting[i]=1;
  296. }
  297. }
  298. else
  299. *reset_group = -1;
  300. }
  301. /* Ensure that prediction data is sent when there is a prediction
  302. * reset.
  303. */
  304. if (*reset_group != -1 && pred_global_flag[0] == 0)
  305.     {
  306. pred_global_flag[0] = 1;
  307. for (i = 0; i < nsfb; i++)
  308. pred_sfb_flag[i] = 0;
  309.     }
  310. }
  311. void CopyPredInfo(CoderInfo *right, CoderInfo *left)
  312. {
  313. int band;
  314. right->pred_global_flag = left->pred_global_flag;
  315. right->reset_group_number = left->reset_group_number;
  316. for (band = 0; band<MAX_SCFAC_BANDS; band++) {
  317. right->pred_sfb_flag[band] = left->pred_sfb_flag[band];
  318. }
  319. }