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

多媒体编程

开发平台:

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