sbr_dec.c
上传用户:wstnjxml
上传日期:2014-04-03
资源大小:7248k
文件大小:16k
源码类别:

Windows CE

开发平台:

C/C++

  1. /*
  2. ** FAAD2 - Freeware Advanced Audio (AAC) Decoder including SBR decoding
  3. ** Copyright (C) 2003-2004 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. ** Commercial non-GPL licensing of this software is possible.
  23. ** For more info contact Ahead Software through Mpeg4AAClicense@nero.com.
  24. **
  25. ** $Id: sbr_dec.c,v 1.39 2004/09/04 14:56:28 menno Exp $
  26. **/
  27. #include "common.h"
  28. #include "structs.h"
  29. #ifdef SBR_DEC
  30. #include <string.h>
  31. #include <stdlib.h>
  32. #include "syntax.h"
  33. #include "bits.h"
  34. #include "sbr_syntax.h"
  35. #include "sbr_qmf.h"
  36. #include "sbr_hfgen.h"
  37. #include "sbr_hfadj.h"
  38. /* static function declarations */
  39. static uint8_t sbr_save_prev_data(sbr_info *sbr, uint8_t ch);
  40. static void sbr_save_matrix(sbr_info *sbr, uint8_t ch);
  41. sbr_info *sbrDecodeInit(uint16_t framelength, uint8_t id_aac,
  42.                         uint32_t sample_rate, uint8_t downSampledSBR
  43. #ifdef DRM
  44. , uint8_t IsDRM
  45. #endif
  46.                         )
  47. {
  48.     sbr_info *sbr = faad_malloc(sizeof(sbr_info));
  49.     memset(sbr, 0, sizeof(sbr_info));
  50.     /* save id of the parent element */
  51.     sbr->id_aac = id_aac;
  52.     sbr->sample_rate = sample_rate;
  53.     sbr->bs_freq_scale = 2;
  54.     sbr->bs_alter_scale = 1;
  55.     sbr->bs_noise_bands = 2;
  56.     sbr->bs_limiter_bands = 2;
  57.     sbr->bs_limiter_gains = 2;
  58.     sbr->bs_interpol_freq = 1;
  59.     sbr->bs_smoothing_mode = 1;
  60.     sbr->bs_start_freq = 5;
  61.     sbr->bs_amp_res = 1;
  62.     sbr->bs_samplerate_mode = 1;
  63.     sbr->prevEnvIsShort[0] = -1;
  64.     sbr->prevEnvIsShort[1] = -1;
  65.     sbr->header_count = 0;
  66.     sbr->Reset = 1;
  67. #ifdef DRM
  68.     sbr->Is_DRM_SBR = IsDRM;
  69. #endif
  70.     sbr->tHFGen = T_HFGEN;
  71.     sbr->tHFAdj = T_HFADJ;
  72.     sbr->bsco = 0;
  73.     sbr->bsco_prev = 0;
  74.     sbr->M_prev = 0;
  75.     sbr->frame_len = framelength;
  76.     /* force sbr reset */
  77.     sbr->bs_start_freq_prev = -1;
  78.     if (framelength == 960)
  79.     {
  80.         sbr->numTimeSlotsRate = RATE * NO_TIME_SLOTS_960;
  81.         sbr->numTimeSlots = NO_TIME_SLOTS_960;
  82.     } else {
  83.         sbr->numTimeSlotsRate = RATE * NO_TIME_SLOTS;
  84.         sbr->numTimeSlots = NO_TIME_SLOTS;
  85.     }
  86.     sbr->GQ_ringbuf_index[0] = 0;
  87.     sbr->GQ_ringbuf_index[1] = 0;
  88.     if (id_aac == ID_CPE)
  89.     {
  90.         /* stereo */
  91.         uint8_t j;
  92.         sbr->qmfa[0] = qmfa_init(32);
  93.         sbr->qmfa[1] = qmfa_init(32);
  94.         sbr->qmfs[0] = qmfs_init((downSampledSBR)?32:64);
  95.         sbr->qmfs[1] = qmfs_init((downSampledSBR)?32:64);
  96.         for (j = 0; j < 5; j++)
  97.         {
  98.             sbr->G_temp_prev[0][j] = faad_malloc(64*sizeof(real_t));
  99.             sbr->G_temp_prev[1][j] = faad_malloc(64*sizeof(real_t));
  100.             sbr->Q_temp_prev[0][j] = faad_malloc(64*sizeof(real_t));
  101.             sbr->Q_temp_prev[1][j] = faad_malloc(64*sizeof(real_t));
  102.         }
  103.         memset(sbr->Xsbr[0], 0, (sbr->numTimeSlotsRate+sbr->tHFGen)*64 * sizeof(qmf_t));
  104.         memset(sbr->Xsbr[1], 0, (sbr->numTimeSlotsRate+sbr->tHFGen)*64 * sizeof(qmf_t));
  105.     } else {
  106.         /* mono */
  107.         uint8_t j;
  108.         sbr->qmfa[0] = qmfa_init(32);
  109.         sbr->qmfs[0] = qmfs_init((downSampledSBR)?32:64);
  110.         sbr->qmfs[1] = NULL;
  111.         for (j = 0; j < 5; j++)
  112.         {
  113.             sbr->G_temp_prev[0][j] = faad_malloc(64*sizeof(real_t));
  114.             sbr->Q_temp_prev[0][j] = faad_malloc(64*sizeof(real_t));
  115.         }
  116.         memset(sbr->Xsbr[0], 0, (sbr->numTimeSlotsRate+sbr->tHFGen)*64 * sizeof(qmf_t));
  117.     }
  118.     return sbr;
  119. }
  120. void sbrDecodeEnd(sbr_info *sbr)
  121. {
  122.     uint8_t j;
  123.     if (sbr)
  124.     {
  125.         qmfa_end(sbr->qmfa[0]);
  126.         qmfs_end(sbr->qmfs[0]);
  127.         if (sbr->qmfs[1] != NULL)
  128.         {
  129.             qmfa_end(sbr->qmfa[1]);
  130.             qmfs_end(sbr->qmfs[1]);
  131.         }
  132.         for (j = 0; j < 5; j++)
  133.         {
  134.             if (sbr->G_temp_prev[0][j]) faad_free(sbr->G_temp_prev[0][j]);
  135.             if (sbr->Q_temp_prev[0][j]) faad_free(sbr->Q_temp_prev[0][j]);
  136.             if (sbr->G_temp_prev[1][j]) faad_free(sbr->G_temp_prev[1][j]);
  137.             if (sbr->Q_temp_prev[1][j]) faad_free(sbr->Q_temp_prev[1][j]);
  138.         }
  139. #ifdef PS_DEC
  140.         if (sbr->ps != NULL) 
  141.             ps_free(sbr->ps);
  142. #endif
  143. #ifdef DRM_PS
  144.         if (sbr->drm_ps != NULL)
  145.             drm_ps_free(sbr->drm_ps);
  146. #endif
  147.         faad_free(sbr);
  148.     }
  149. }
  150. static uint8_t sbr_save_prev_data(sbr_info *sbr, uint8_t ch)
  151. {
  152.     uint8_t i;
  153.     /* save data for next frame */
  154.     sbr->kx_prev = sbr->kx;
  155.     sbr->M_prev = sbr->M;
  156.     sbr->bsco_prev = sbr->bsco;
  157.     sbr->L_E_prev[ch] = sbr->L_E[ch];
  158.     /* sbr->L_E[ch] can become 0 on files with bit errors */
  159.     if (sbr->L_E[ch] <= 0)
  160.         return 19;
  161.     sbr->f_prev[ch] = sbr->f[ch][sbr->L_E[ch] - 1];
  162.     for (i = 0; i < MAX_M; i++)
  163.     {
  164.         sbr->E_prev[ch][i] = sbr->E[ch][i][sbr->L_E[ch] - 1];
  165.         sbr->Q_prev[ch][i] = sbr->Q[ch][i][sbr->L_Q[ch] - 1];
  166.     }
  167.     for (i = 0; i < MAX_M; i++)
  168.     {
  169.         sbr->bs_add_harmonic_prev[ch][i] = sbr->bs_add_harmonic[ch][i];
  170.     }
  171.     sbr->bs_add_harmonic_flag_prev[ch] = sbr->bs_add_harmonic_flag[ch];
  172.     if (sbr->l_A[ch] == sbr->L_E[ch])
  173.         sbr->prevEnvIsShort[ch] = 0;
  174.     else
  175.         sbr->prevEnvIsShort[ch] = -1;
  176.     return 0;
  177. }
  178. static void sbr_save_matrix(sbr_info *sbr, uint8_t ch)
  179. {
  180.     uint8_t i;
  181.     for (i = 0; i < sbr->tHFGen; i++)
  182.     {
  183.         memmove(sbr->Xsbr[ch][i], sbr->Xsbr[ch][i+sbr->numTimeSlotsRate], 64 * sizeof(qmf_t));
  184.     }
  185.     for (i = sbr->tHFGen; i < MAX_NTSRHFG; i++)
  186.     {
  187.         memset(sbr->Xsbr[ch][i], 0, 64 * sizeof(qmf_t));
  188.     }
  189. }
  190. static void sbr_process_channel(sbr_info *sbr, real_t *channel_buf, qmf_t X[MAX_NTSR][64],
  191.                                 uint8_t ch, uint8_t dont_process,
  192.                                 const uint8_t downSampledSBR)
  193. {
  194.     int16_t k, l;
  195. #ifdef SBR_LOW_POWER
  196.     ALIGN real_t deg[64];
  197. #endif
  198. #ifdef DRM
  199.     if (sbr->Is_DRM_SBR)
  200.     {
  201.         sbr->bsco = max((int32_t)sbr->maxAACLine*32/(int32_t)sbr->frame_len - (int32_t)sbr->kx, 0);
  202.     } else {
  203. #endif
  204.         sbr->bsco = 0;
  205. #ifdef DRM
  206.     }
  207. #endif
  208. //#define PRE_QMF_PRINT
  209. #ifdef PRE_QMF_PRINT
  210.     {
  211.         int i;
  212.         for (i = 0; i < 1024; i++)
  213.         {
  214.             printf("%dn", channel_buf[i]);
  215.         }
  216.     }
  217. #endif
  218.     /* subband analysis */
  219.     if (dont_process)
  220.         sbr_qmf_analysis_32(sbr, sbr->qmfa[ch], channel_buf, sbr->Xsbr[ch], sbr->tHFGen, 32);
  221.     else
  222.         sbr_qmf_analysis_32(sbr, sbr->qmfa[ch], channel_buf, sbr->Xsbr[ch], sbr->tHFGen, sbr->kx);
  223.     if (!dont_process)
  224.     {
  225. #if 1
  226.         /* insert high frequencies here */
  227.         /* hf generation using patching */
  228.         hf_generation(sbr, sbr->Xsbr[ch], sbr->Xsbr[ch]
  229. #ifdef SBR_LOW_POWER
  230.             ,deg
  231. #endif
  232.             ,ch);
  233. #endif
  234. #ifdef SBR_LOW_POWER
  235.         for (l = sbr->t_E[ch][0]; l < sbr->t_E[ch][sbr->L_E[ch]]; l++)
  236.         {
  237.             for (k = 0; k < sbr->kx; k++)
  238.             {
  239.                 QMF_RE(sbr->Xsbr[ch][sbr->tHFAdj + l][k]) = 0;
  240.             }
  241.         }
  242. #endif
  243. #if 1
  244.         /* hf adjustment */
  245.         hf_adjustment(sbr, sbr->Xsbr[ch]
  246. #ifdef SBR_LOW_POWER
  247.             ,deg
  248. #endif
  249.             ,ch);
  250. #endif
  251.     }
  252.     if ((sbr->just_seeked != 0) || dont_process)
  253.     {
  254.         for (l = 0; l < sbr->numTimeSlotsRate; l++)
  255.         {
  256.             for (k = 0; k < 32; k++)
  257.             {
  258.                 QMF_RE(X[l][k]) = QMF_RE(sbr->Xsbr[ch][l + sbr->tHFAdj][k]);
  259. #ifndef SBR_LOW_POWER
  260.                 QMF_IM(X[l][k]) = QMF_IM(sbr->Xsbr[ch][l + sbr->tHFAdj][k]);
  261. #endif
  262.             }
  263.             for (k = 32; k < 64; k++)
  264.             {
  265.                 QMF_RE(X[l][k]) = 0;
  266. #ifndef SBR_LOW_POWER
  267.                 QMF_IM(X[l][k]) = 0;
  268. #endif
  269.             }
  270.         }
  271.     } else {
  272.         for (l = 0; l < sbr->numTimeSlotsRate; l++)
  273.         {
  274.             uint8_t kx_band, M_band, bsco_band;
  275.             if (l < sbr->t_E[ch][0])
  276.             {
  277.                 kx_band = sbr->kx_prev;
  278.                 M_band = sbr->M_prev;
  279.                 bsco_band = sbr->bsco_prev;
  280.             } else {
  281.                 kx_band = sbr->kx;
  282.                 M_band = sbr->M;
  283.                 bsco_band = sbr->bsco;
  284.             }
  285. #ifndef SBR_LOW_POWER
  286.             for (k = 0; k < kx_band + bsco_band; k++)
  287.             {
  288.                 QMF_RE(X[l][k]) = QMF_RE(sbr->Xsbr[ch][l + sbr->tHFAdj][k]);
  289.                 QMF_IM(X[l][k]) = QMF_IM(sbr->Xsbr[ch][l + sbr->tHFAdj][k]);
  290.             }
  291.             for (k = kx_band + bsco_band; k < kx_band + M_band; k++)
  292.             {
  293.                 QMF_RE(X[l][k]) = QMF_RE(sbr->Xsbr[ch][l + sbr->tHFAdj][k]);
  294.                 QMF_IM(X[l][k]) = QMF_IM(sbr->Xsbr[ch][l + sbr->tHFAdj][k]);
  295.             }
  296.             for (k = max(kx_band + bsco_band, kx_band + M_band); k < 64; k++)
  297.             {
  298.                 QMF_RE(X[l][k]) = 0;
  299.                 QMF_IM(X[l][k]) = 0;
  300.             }
  301. #else
  302.             for (k = 0; k < kx_band + bsco_band; k++)
  303.             {
  304.                 QMF_RE(X[l][k]) = QMF_RE(sbr->Xsbr[ch][l + sbr->tHFAdj][k]);
  305.             }
  306.             for (k = kx_band + bsco_band; k < min(kx_band + M_band, 63); k++)
  307.             {
  308.                 QMF_RE(X[l][k]) = QMF_RE(sbr->Xsbr[ch][l + sbr->tHFAdj][k]);
  309.             }
  310.             for (k = max(kx_band + bsco_band, kx_band + M_band); k < 64; k++)
  311.             {
  312.                 QMF_RE(X[l][k]) = 0;
  313.             }
  314.             QMF_RE(X[l][kx_band - 1 + bsco_band]) +=
  315.                 QMF_RE(sbr->Xsbr[ch][l + sbr->tHFAdj][kx_band - 1 + bsco_band]);
  316. #endif
  317.         }
  318.     }
  319. }
  320. uint8_t sbrDecodeCoupleFrame(sbr_info *sbr, real_t *left_chan, real_t *right_chan,
  321.                              const uint8_t just_seeked, const uint8_t downSampledSBR)
  322. {
  323.     uint8_t dont_process = 0;
  324.     uint8_t ret = 0;
  325.     ALIGN qmf_t X[MAX_NTSR][64];
  326.     if (sbr == NULL)
  327.         return 20;
  328.     /* case can occur due to bit errors */
  329.     if (sbr->id_aac != ID_CPE)
  330.         return 21;
  331.     if (sbr->ret || (sbr->header_count == 0))
  332.     {
  333.         /* don't process just upsample */
  334.         dont_process = 1;
  335.         /* Re-activate reset for next frame */
  336.         if (sbr->ret && sbr->Reset)
  337.             sbr->bs_start_freq_prev = -1;
  338.     }
  339.     if (just_seeked)
  340.     {
  341.         sbr->just_seeked = 1;
  342.     } else {
  343.         sbr->just_seeked = 0;
  344.     }
  345.     sbr_process_channel(sbr, left_chan, X, 0, dont_process, downSampledSBR);
  346.     /* subband synthesis */
  347.     if (downSampledSBR)
  348.     {
  349.         sbr_qmf_synthesis_32(sbr, sbr->qmfs[0], X, left_chan);
  350.     } else {
  351.         sbr_qmf_synthesis_64(sbr, sbr->qmfs[0], X, left_chan);
  352.     }
  353.     sbr_process_channel(sbr, right_chan, X, 1, dont_process, downSampledSBR);
  354.     /* subband synthesis */
  355.     if (downSampledSBR)
  356.     {
  357.         sbr_qmf_synthesis_32(sbr, sbr->qmfs[1], X, right_chan);
  358.     } else {
  359.         sbr_qmf_synthesis_64(sbr, sbr->qmfs[1], X, right_chan);
  360.     }
  361.     if (sbr->bs_header_flag)
  362.         sbr->just_seeked = 0;
  363.     if (sbr->header_count != 0 && sbr->ret == 0)
  364.     {
  365.         ret = sbr_save_prev_data(sbr, 0);
  366.         if (ret) return ret;
  367.         ret = sbr_save_prev_data(sbr, 1);
  368.         if (ret) return ret;
  369.     }
  370.     sbr_save_matrix(sbr, 0);
  371.     sbr_save_matrix(sbr, 1);
  372.     sbr->frame++;
  373. //#define POST_QMF_PRINT
  374. #ifdef POST_QMF_PRINT
  375.     {
  376.         int i;
  377.         for (i = 0; i < 2048; i++)
  378.         {
  379.             printf("%dn", left_chan[i]);
  380.         }
  381.         for (i = 0; i < 2048; i++)
  382.         {
  383.             printf("%dn", right_chan[i]);
  384.         }
  385.     }
  386. #endif
  387.     return 0;
  388. }
  389. uint8_t sbrDecodeSingleFrame(sbr_info *sbr, real_t *channel,
  390.                              const uint8_t just_seeked, const uint8_t downSampledSBR)
  391. {
  392.     uint8_t dont_process = 0;
  393.     uint8_t ret = 0;
  394.     ALIGN qmf_t X[MAX_NTSR][64];
  395.     if (sbr == NULL)
  396.         return 20;
  397.     /* case can occur due to bit errors */
  398.     if (sbr->id_aac != ID_SCE && sbr->id_aac != ID_LFE)
  399.         return 21;
  400.     if (sbr->ret || (sbr->header_count == 0))
  401.     {
  402.         /* don't process just upsample */
  403.         dont_process = 1;
  404.         /* Re-activate reset for next frame */
  405.         if (sbr->ret && sbr->Reset)
  406.             sbr->bs_start_freq_prev = -1;
  407.     }
  408.     if (just_seeked)
  409.     {
  410.         sbr->just_seeked = 1;
  411.     } else {
  412.         sbr->just_seeked = 0;
  413.     }
  414.     sbr_process_channel(sbr, channel, X, 0, dont_process, downSampledSBR);
  415.     /* subband synthesis */
  416.     if (downSampledSBR)
  417.     {
  418.         sbr_qmf_synthesis_32(sbr, sbr->qmfs[0], X, channel);
  419.     } else {
  420.         sbr_qmf_synthesis_64(sbr, sbr->qmfs[0], X, channel);
  421.     }
  422.     if (sbr->bs_header_flag)
  423.         sbr->just_seeked = 0;
  424.     if (sbr->header_count != 0 && sbr->ret == 0)
  425.     {
  426.         ret = sbr_save_prev_data(sbr, 0);
  427.         if (ret) return ret;
  428.     }
  429.     sbr_save_matrix(sbr, 0);
  430.     sbr->frame++;
  431. //#define POST_QMF_PRINT
  432. #ifdef POST_QMF_PRINT
  433.     {
  434.         int i;
  435.         for (i = 0; i < 2048; i++)
  436.         {
  437.             printf("%dn", channel[i]);
  438.         }
  439.     }
  440. #endif
  441.     return 0;
  442. }
  443. #if (defined(PS_DEC) || defined(DRM_PS))
  444. uint8_t sbrDecodeSingleFramePS(sbr_info *sbr, real_t *left_channel, real_t *right_channel,
  445.                                const uint8_t just_seeked, const uint8_t downSampledSBR)
  446. {
  447.     uint8_t l, k;
  448.     uint8_t dont_process = 0;
  449.     uint8_t ret = 0;
  450.     ALIGN qmf_t X_left[38][64] = {{0}};
  451.     ALIGN qmf_t X_right[38][64] = {{0}}; /* must set this to 0 */
  452.     if (sbr == NULL)
  453.         return 20;
  454.     /* case can occur due to bit errors */
  455.     if (sbr->id_aac != ID_SCE && sbr->id_aac != ID_LFE)
  456.         return 21;
  457.     if (sbr->ret || (sbr->header_count == 0))
  458.     {
  459.         /* don't process just upsample */
  460.         dont_process = 1;
  461.         /* Re-activate reset for next frame */
  462.         if (sbr->ret && sbr->Reset)
  463.             sbr->bs_start_freq_prev = -1;
  464.     }
  465.     if (just_seeked)
  466.     {
  467.         sbr->just_seeked = 1;
  468.     } else {
  469.         sbr->just_seeked = 0;
  470.     }
  471.     if (sbr->qmfs[1] == NULL)
  472.     {
  473.         sbr->qmfs[1] = qmfs_init((downSampledSBR)?32:64);
  474.     }
  475.     sbr_process_channel(sbr, left_channel, X_left, 0, dont_process, downSampledSBR);
  476.     /* copy some extra data for PS */
  477.     for (l = 32; l < 38; l++)
  478.     {
  479.         for (k = 0; k < 5; k++)
  480.         {
  481.             QMF_RE(X_left[l][k]) = QMF_RE(sbr->Xsbr[0][sbr->tHFAdj+l][k]);
  482.             QMF_IM(X_left[l][k]) = QMF_IM(sbr->Xsbr[0][sbr->tHFAdj+l][k]);
  483.         }
  484.     }
  485.     /* perform parametric stereo */
  486. #ifdef DRM_PS
  487.     if (sbr->Is_DRM_SBR)
  488.     {
  489.         drm_ps_decode(sbr->drm_ps, (sbr->ret > 0), sbr->sample_rate, X_left, X_right);
  490.     } else {
  491. #endif
  492. #ifdef PS_DEC
  493.         ps_decode(sbr->ps, X_left, X_right);
  494. #endif
  495. #ifdef DRM_PS
  496.     }
  497. #endif
  498.     /* subband synthesis */
  499.     if (downSampledSBR)
  500.     {
  501.         sbr_qmf_synthesis_32(sbr, sbr->qmfs[0], X_left, left_channel);
  502.         sbr_qmf_synthesis_32(sbr, sbr->qmfs[1], X_right, right_channel);
  503.     } else {
  504.         sbr_qmf_synthesis_64(sbr, sbr->qmfs[0], X_left, left_channel);
  505.         sbr_qmf_synthesis_64(sbr, sbr->qmfs[1], X_right, right_channel);
  506.     }
  507.     if (sbr->bs_header_flag)
  508.         sbr->just_seeked = 0;
  509.     if (sbr->header_count != 0 && sbr->ret == 0)
  510.     {
  511.         ret = sbr_save_prev_data(sbr, 0);
  512.         if (ret) return ret;
  513.     }
  514.     sbr_save_matrix(sbr, 0);
  515.     sbr->frame++;
  516.     return 0;
  517. }
  518. #endif
  519. #endif