ic_predict.c
上传用户:xjjlds
上传日期:2015-12-05
资源大小:22823k
文件大小:7k
源码类别:

多媒体编程

开发平台:

Visual C++

  1. /*
  2. ** FAAD2 - Freeware Advanced Audio (AAC) Decoder including SBR decoding
  3. ** Copyright (C) 2003-2005 M. Bakker, Ahead Software AG, http://www.nero.com
  4. **  
  5. ** This program is free software; you can redistribute it and/or modify
  6. ** it under the terms of the GNU General Public License as published by
  7. ** the Free Software Foundation; either version 2 of the License, or
  8. ** (at your option) any later version.
  9. ** 
  10. ** This program 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
  13. ** GNU General Public License for more details.
  14. ** 
  15. ** You should have received a copy of the GNU General Public License
  16. ** along with this program; if not, write to the Free Software 
  17. ** Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
  18. **
  19. ** Any non-GPL usage of this software or parts of this software is strictly
  20. ** forbidden.
  21. **
  22. ** Software using this code must display the following message visibly in the
  23. ** software:
  24. ** "FAAD2 AAC/HE-AAC/HE-AACv2/DRM decoder (c) Ahead Software, www.nero.com"
  25. ** in, for example, the about-box or help/startup screen.
  26. **
  27. ** Commercial non-GPL licensing of this software is possible.
  28. ** For more info contact Ahead Software through Mpeg4AAClicense@nero.com.
  29. **
  30. ** $Id: ic_predict.c,v 1.2 2005/11/01 21:41:43 gabest Exp $
  31. **/
  32. #include "common.h"
  33. #include "structs.h"
  34. #ifdef MAIN_DEC
  35. #include "syntax.h"
  36. #include "ic_predict.h"
  37. #include "pns.h"
  38. static void flt_round(float32_t *pf)
  39. {
  40.     int32_t flg;
  41.     uint32_t tmp, tmp1, tmp2;
  42.     tmp = *(uint32_t*)pf;
  43.     flg = tmp & (uint32_t)0x00008000;
  44.     tmp &= (uint32_t)0xffff0000;
  45.     tmp1 = tmp;
  46.     /* round 1/2 lsb toward infinity */
  47.     if (flg)
  48.     {
  49.         tmp &= (uint32_t)0xff800000;       /* extract exponent and sign */
  50.         tmp |= (uint32_t)0x00010000;       /* insert 1 lsb */
  51.         tmp2 = tmp;                             /* add 1 lsb and elided one */
  52.         tmp &= (uint32_t)0xff800000;       /* extract exponent and sign */
  53.         
  54.         *pf = *(float32_t*)&tmp1 + *(float32_t*)&tmp2 - *(float32_t*)&tmp;
  55.     } else {
  56.         *pf = *(float32_t*)&tmp;
  57.     }
  58. }
  59. static int16_t quant_pred(float32_t x)
  60. {
  61.     int16_t q;
  62.     uint32_t *tmp = (uint32_t*)&x;
  63.     q = (int16_t)(*tmp>>16);
  64.     return q;
  65. }
  66. static float32_t inv_quant_pred(int16_t q)
  67. {
  68.     float32_t x;
  69.     uint32_t *tmp = (uint32_t*)&x;
  70.     *tmp = ((uint32_t)q)<<16;
  71.     return x;
  72. }
  73. static void ic_predict(pred_state *state, real_t input, real_t *output, uint8_t pred)
  74. {
  75.     uint16_t tmp;
  76.     int16_t i, j;
  77.     real_t dr1, predictedvalue;
  78.     real_t e0, e1;
  79.     real_t k1, k2;
  80.     real_t r[2];
  81.     real_t COR[2];
  82.     real_t VAR[2];
  83.     r[0] = inv_quant_pred(state->r[0]);
  84.     r[1] = inv_quant_pred(state->r[1]);
  85.     COR[0] = inv_quant_pred(state->COR[0]);
  86.     COR[1] = inv_quant_pred(state->COR[1]);
  87.     VAR[0] = inv_quant_pred(state->VAR[0]);
  88.     VAR[1] = inv_quant_pred(state->VAR[1]);
  89. #if 1
  90.     tmp = state->VAR[0];
  91.     j = (tmp >> 7);
  92.     i = tmp & 0x7f;
  93.     if (j >= 128)
  94.     {
  95.         j -= 128;
  96.         k1 = COR[0] * exp_table[j] * mnt_table[i];
  97.     } else {
  98.         k1 = REAL_CONST(0);
  99.     }
  100. #else
  101.     {
  102. #define B 0.953125
  103.         real_t c = COR[0];
  104.         real_t v = VAR[0];
  105.         real_t tmp;
  106.         if (c == 0 || v <= 1)
  107.         {
  108.             k1 = 0;
  109.         } else {
  110.             tmp = B / v;
  111.             flt_round(&tmp);
  112.             k1 = c * tmp;
  113.         }
  114.     }
  115. #endif
  116.     if (pred)
  117.     {
  118. #if 1
  119.         tmp = state->VAR[1];
  120.         j = (tmp >> 7);
  121.         i = tmp & 0x7f;
  122.         if (j >= 128)
  123.         {
  124.             j -= 128;
  125.             k2 = COR[1] * exp_table[j] * mnt_table[i];
  126.         } else {
  127.             k2 = REAL_CONST(0);
  128.         }
  129. #else
  130. #define B 0.953125
  131.         real_t c = COR[1];
  132.         real_t v = VAR[1];
  133.         real_t tmp;
  134.         if (c == 0 || v <= 1)
  135.         {
  136.             k2 = 0;
  137.         } else {
  138.             tmp = B / v;
  139.             flt_round(&tmp);
  140.             k2 = c * tmp;
  141.         }
  142. #endif
  143.         predictedvalue = k1*r[0] + k2*r[1];
  144.         flt_round(&predictedvalue);
  145.         *output = input + predictedvalue;
  146.     }
  147.     /* calculate new state data */
  148.     e0 = *output;
  149.     e1 = e0 - k1*r[0];
  150.     dr1 = k1*e0;
  151.     VAR[0] = ALPHA*VAR[0] + 0.5f * (r[0]*r[0] + e0*e0);
  152.     COR[0] = ALPHA*COR[0] + r[0]*e0;
  153.     VAR[1] = ALPHA*VAR[1] + 0.5f * (r[1]*r[1] + e1*e1);
  154.     COR[1] = ALPHA*COR[1] + r[1]*e1;
  155.     r[1] = A * (r[0]-dr1);
  156.     r[0] = A * e0;
  157.     state->r[0] = quant_pred(r[0]);
  158.     state->r[1] = quant_pred(r[1]);
  159.     state->COR[0] = quant_pred(COR[0]);
  160.     state->COR[1] = quant_pred(COR[1]);
  161.     state->VAR[0] = quant_pred(VAR[0]);
  162.     state->VAR[1] = quant_pred(VAR[1]);
  163. }
  164. static void reset_pred_state(pred_state *state)
  165. {
  166.     state->r[0]   = 0;
  167.     state->r[1]   = 0;
  168.     state->COR[0] = 0;
  169.     state->COR[1] = 0;
  170.     state->VAR[0] = 0x3F80;
  171.     state->VAR[1] = 0x3F80;
  172. }
  173. void pns_reset_pred_state(ic_stream *ics, pred_state *state)
  174. {
  175.     uint8_t sfb, g, b;
  176.     uint16_t i, offs, offs2;
  177.     /* prediction only for long blocks */
  178.     if (ics->window_sequence == EIGHT_SHORT_SEQUENCE)
  179.         return;
  180.     for (g = 0; g < ics->num_window_groups; g++)
  181.     {
  182.         for (b = 0; b < ics->window_group_length[g]; b++)
  183.         {
  184.             for (sfb = 0; sfb < ics->max_sfb; sfb++)
  185.             {
  186.                 if (is_noise(ics, g, sfb))
  187.                 {
  188.                     offs = ics->swb_offset[sfb];
  189.                     offs2 = ics->swb_offset[sfb+1];
  190.                     for (i = offs; i < offs2; i++)
  191.                         reset_pred_state(&state[i]);
  192.                 }
  193.             }
  194.         }
  195.     }
  196. }
  197. void reset_all_predictors(pred_state *state, uint16_t frame_len)
  198. {
  199.     uint16_t i;
  200.     for (i = 0; i < frame_len; i++)
  201.         reset_pred_state(&state[i]);
  202. }
  203. /* intra channel prediction */
  204. void ic_prediction(ic_stream *ics, real_t *spec, pred_state *state,
  205.                    uint16_t frame_len, uint8_t sf_index)
  206. {
  207.     uint8_t sfb;
  208.     uint16_t bin;
  209.     if (ics->window_sequence == EIGHT_SHORT_SEQUENCE)
  210.     {
  211.         reset_all_predictors(state, frame_len);
  212.     } else {
  213.         for (sfb = 0; sfb < max_pred_sfb(sf_index); sfb++)
  214.         {
  215.             uint16_t low  = ics->swb_offset[sfb];
  216.             uint16_t high = ics->swb_offset[sfb+1];
  217.             for (bin = low; bin < high; bin++)
  218.             {
  219.                 ic_predict(&state[bin], spec[bin], &spec[bin],
  220.                     (ics->predictor_data_present && ics->pred.prediction_used[sfb]));
  221.             }
  222.         }
  223.         if (ics->predictor_data_present)
  224.         {
  225.             if (ics->pred.predictor_reset)
  226.             {
  227.                 for (bin = ics->pred.predictor_reset_group_number - 1;
  228.                      bin < frame_len; bin += 30)
  229.                 {
  230.                     reset_pred_state(&state[bin]);
  231.                 }
  232.             }
  233.         }
  234.     }
  235. }
  236. #endif