00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034 #include "common.h"
00035 #include "structs.h"
00036
00037 #ifdef SBR_DEC
00038
00039 #include <string.h>
00040 #include <stdlib.h>
00041
00042 #include "syntax.h"
00043 #include "bits.h"
00044 #include "sbr_syntax.h"
00045 #include "sbr_qmf.h"
00046 #include "sbr_hfgen.h"
00047 #include "sbr_hfadj.h"
00048
00049
00050
00051 static uint8_t sbr_save_prev_data(sbr_info *sbr, uint8_t ch);
00052 static void sbr_save_matrix(sbr_info *sbr, uint8_t ch);
00053
00054
00055 sbr_info *sbrDecodeInit(uint16_t framelength, uint8_t id_aac,
00056 uint32_t sample_rate, uint8_t downSampledSBR
00057 #ifdef DRM
00058 , uint8_t IsDRM
00059 #endif
00060 )
00061 {
00062 sbr_info *sbr = faad_malloc(sizeof(sbr_info));
00063 memset(sbr, 0, sizeof(sbr_info));
00064
00065
00066 sbr->id_aac = id_aac;
00067 sbr->sample_rate = sample_rate;
00068
00069 sbr->bs_freq_scale = 2;
00070 sbr->bs_alter_scale = 1;
00071 sbr->bs_noise_bands = 2;
00072 sbr->bs_limiter_bands = 2;
00073 sbr->bs_limiter_gains = 2;
00074 sbr->bs_interpol_freq = 1;
00075 sbr->bs_smoothing_mode = 1;
00076 sbr->bs_start_freq = 5;
00077 sbr->bs_amp_res = 1;
00078 sbr->bs_samplerate_mode = 1;
00079 sbr->prevEnvIsShort[0] = -1;
00080 sbr->prevEnvIsShort[1] = -1;
00081 sbr->header_count = 0;
00082 sbr->Reset = 1;
00083
00084 #ifdef DRM
00085 sbr->Is_DRM_SBR = IsDRM;
00086 #endif
00087 sbr->tHFGen = T_HFGEN;
00088 sbr->tHFAdj = T_HFADJ;
00089
00090 sbr->bsco = 0;
00091 sbr->bsco_prev = 0;
00092 sbr->M_prev = 0;
00093 sbr->frame_len = framelength;
00094
00095
00096 sbr->bs_start_freq_prev = -1;
00097
00098 if (framelength == 960)
00099 {
00100 sbr->numTimeSlotsRate = RATE * NO_TIME_SLOTS_960;
00101 sbr->numTimeSlots = NO_TIME_SLOTS_960;
00102 } else {
00103 sbr->numTimeSlotsRate = RATE * NO_TIME_SLOTS;
00104 sbr->numTimeSlots = NO_TIME_SLOTS;
00105 }
00106
00107 sbr->GQ_ringbuf_index[0] = 0;
00108 sbr->GQ_ringbuf_index[1] = 0;
00109
00110 if (id_aac == ID_CPE)
00111 {
00112
00113 uint8_t j;
00114 sbr->qmfa[0] = qmfa_init(32);
00115 sbr->qmfa[1] = qmfa_init(32);
00116 sbr->qmfs[0] = qmfs_init((downSampledSBR)?32:64);
00117 sbr->qmfs[1] = qmfs_init((downSampledSBR)?32:64);
00118
00119 for (j = 0; j < 5; j++)
00120 {
00121 sbr->G_temp_prev[0][j] = faad_malloc(64*sizeof(real_t));
00122 sbr->G_temp_prev[1][j] = faad_malloc(64*sizeof(real_t));
00123 sbr->Q_temp_prev[0][j] = faad_malloc(64*sizeof(real_t));
00124 sbr->Q_temp_prev[1][j] = faad_malloc(64*sizeof(real_t));
00125 }
00126
00127 memset(sbr->Xsbr[0], 0, (sbr->numTimeSlotsRate+sbr->tHFGen)*64 * sizeof(qmf_t));
00128 memset(sbr->Xsbr[1], 0, (sbr->numTimeSlotsRate+sbr->tHFGen)*64 * sizeof(qmf_t));
00129 } else {
00130
00131 uint8_t j;
00132 sbr->qmfa[0] = qmfa_init(32);
00133 sbr->qmfs[0] = qmfs_init((downSampledSBR)?32:64);
00134 sbr->qmfs[1] = NULL;
00135
00136 for (j = 0; j < 5; j++)
00137 {
00138 sbr->G_temp_prev[0][j] = faad_malloc(64*sizeof(real_t));
00139 sbr->Q_temp_prev[0][j] = faad_malloc(64*sizeof(real_t));
00140 }
00141
00142 memset(sbr->Xsbr[0], 0, (sbr->numTimeSlotsRate+sbr->tHFGen)*64 * sizeof(qmf_t));
00143 }
00144
00145 return sbr;
00146 }
00147
00148 void sbrDecodeEnd(sbr_info *sbr)
00149 {
00150 uint8_t j;
00151
00152 if (sbr)
00153 {
00154 qmfa_end(sbr->qmfa[0]);
00155 qmfs_end(sbr->qmfs[0]);
00156 if (sbr->qmfs[1] != NULL)
00157 {
00158 qmfa_end(sbr->qmfa[1]);
00159 qmfs_end(sbr->qmfs[1]);
00160 }
00161
00162 for (j = 0; j < 5; j++)
00163 {
00164 if (sbr->G_temp_prev[0][j]) faad_free(sbr->G_temp_prev[0][j]);
00165 if (sbr->Q_temp_prev[0][j]) faad_free(sbr->Q_temp_prev[0][j]);
00166 if (sbr->G_temp_prev[1][j]) faad_free(sbr->G_temp_prev[1][j]);
00167 if (sbr->Q_temp_prev[1][j]) faad_free(sbr->Q_temp_prev[1][j]);
00168 }
00169
00170 #ifdef PS_DEC
00171 if (sbr->ps != NULL)
00172 ps_free(sbr->ps);
00173 #endif
00174
00175 #ifdef DRM_PS
00176 if (sbr->drm_ps != NULL)
00177 drm_ps_free(sbr->drm_ps);
00178 #endif
00179
00180 faad_free(sbr);
00181 }
00182 }
00183
00184 void sbrReset(sbr_info *sbr)
00185 {
00186 uint8_t j;
00187 if (sbr->qmfa[0] != NULL)
00188 memset(sbr->qmfa[0]->x, 0, 2 * sbr->qmfa[0]->channels * 10 * sizeof(real_t));
00189 if (sbr->qmfa[1] != NULL)
00190 memset(sbr->qmfa[1]->x, 0, 2 * sbr->qmfa[1]->channels * 10 * sizeof(real_t));
00191 if (sbr->qmfs[0] != NULL)
00192 memset(sbr->qmfs[0]->v, 0, 2 * sbr->qmfs[0]->channels * 20 * sizeof(real_t));
00193 if (sbr->qmfs[1] != NULL)
00194 memset(sbr->qmfs[1]->v, 0, 2 * sbr->qmfs[1]->channels * 20 * sizeof(real_t));
00195
00196 for (j = 0; j < 5; j++)
00197 {
00198 if (sbr->G_temp_prev[0][j] != NULL)
00199 memset(sbr->G_temp_prev[0][j], 0, 64*sizeof(real_t));
00200 if (sbr->G_temp_prev[1][j] != NULL)
00201 memset(sbr->G_temp_prev[1][j], 0, 64*sizeof(real_t));
00202 if (sbr->Q_temp_prev[0][j] != NULL)
00203 memset(sbr->Q_temp_prev[0][j], 0, 64*sizeof(real_t));
00204 if (sbr->Q_temp_prev[1][j] != NULL)
00205 memset(sbr->Q_temp_prev[1][j], 0, 64*sizeof(real_t));
00206 }
00207
00208 memset(sbr->Xsbr[0], 0, (sbr->numTimeSlotsRate+sbr->tHFGen)*64 * sizeof(qmf_t));
00209 memset(sbr->Xsbr[1], 0, (sbr->numTimeSlotsRate+sbr->tHFGen)*64 * sizeof(qmf_t));
00210
00211 sbr->GQ_ringbuf_index[0] = 0;
00212 sbr->GQ_ringbuf_index[1] = 0;
00213 sbr->header_count = 0;
00214 sbr->Reset = 1;
00215
00216 sbr->L_E_prev[0] = 0;
00217 sbr->L_E_prev[1] = 0;
00218 sbr->bs_freq_scale = 2;
00219 sbr->bs_alter_scale = 1;
00220 sbr->bs_noise_bands = 2;
00221 sbr->bs_limiter_bands = 2;
00222 sbr->bs_limiter_gains = 2;
00223 sbr->bs_interpol_freq = 1;
00224 sbr->bs_smoothing_mode = 1;
00225 sbr->bs_start_freq = 5;
00226 sbr->bs_amp_res = 1;
00227 sbr->bs_samplerate_mode = 1;
00228 sbr->prevEnvIsShort[0] = -1;
00229 sbr->prevEnvIsShort[1] = -1;
00230 sbr->bsco = 0;
00231 sbr->bsco_prev = 0;
00232 sbr->M_prev = 0;
00233 sbr->bs_start_freq_prev = -1;
00234
00235 sbr->f_prev[0] = 0;
00236 sbr->f_prev[1] = 0;
00237 for (j = 0; j < MAX_M; j++)
00238 {
00239 sbr->E_prev[0][j] = 0;
00240 sbr->Q_prev[0][j] = 0;
00241 sbr->E_prev[1][j] = 0;
00242 sbr->Q_prev[1][j] = 0;
00243 sbr->bs_add_harmonic_prev[0][j] = 0;
00244 sbr->bs_add_harmonic_prev[1][j] = 0;
00245 }
00246 sbr->bs_add_harmonic_flag_prev[0] = 0;
00247 sbr->bs_add_harmonic_flag_prev[1] = 0;
00248 }
00249
00250 static uint8_t sbr_save_prev_data(sbr_info *sbr, uint8_t ch)
00251 {
00252 uint8_t i;
00253
00254
00255 sbr->kx_prev = sbr->kx;
00256 sbr->M_prev = sbr->M;
00257 sbr->bsco_prev = sbr->bsco;
00258
00259 sbr->L_E_prev[ch] = sbr->L_E[ch];
00260
00261
00262 if (sbr->L_E[ch] <= 0)
00263 return 19;
00264
00265 sbr->f_prev[ch] = sbr->f[ch][sbr->L_E[ch] - 1];
00266 for (i = 0; i < MAX_M; i++)
00267 {
00268 sbr->E_prev[ch][i] = sbr->E[ch][i][sbr->L_E[ch] - 1];
00269 sbr->Q_prev[ch][i] = sbr->Q[ch][i][sbr->L_Q[ch] - 1];
00270 }
00271
00272 for (i = 0; i < MAX_M; i++)
00273 {
00274 sbr->bs_add_harmonic_prev[ch][i] = sbr->bs_add_harmonic[ch][i];
00275 }
00276 sbr->bs_add_harmonic_flag_prev[ch] = sbr->bs_add_harmonic_flag[ch];
00277
00278 if (sbr->l_A[ch] == sbr->L_E[ch])
00279 sbr->prevEnvIsShort[ch] = 0;
00280 else
00281 sbr->prevEnvIsShort[ch] = -1;
00282
00283 return 0;
00284 }
00285
00286 static void sbr_save_matrix(sbr_info *sbr, uint8_t ch)
00287 {
00288 uint8_t i;
00289
00290 for (i = 0; i < sbr->tHFGen; i++)
00291 {
00292 memmove(sbr->Xsbr[ch][i], sbr->Xsbr[ch][i+sbr->numTimeSlotsRate], 64 * sizeof(qmf_t));
00293 }
00294 for (i = sbr->tHFGen; i < MAX_NTSRHFG; i++)
00295 {
00296 memset(sbr->Xsbr[ch][i], 0, 64 * sizeof(qmf_t));
00297 }
00298 }
00299
00300 static uint8_t sbr_process_channel(sbr_info *sbr, real_t *channel_buf, qmf_t X[MAX_NTSR][64],
00301 uint8_t ch, uint8_t dont_process,
00302 const uint8_t downSampledSBR)
00303 {
00304 int16_t k, l;
00305 uint8_t ret = 0;
00306
00307 #ifdef SBR_LOW_POWER
00308 ALIGN real_t deg[64];
00309 #endif
00310
00311 #ifdef DRM
00312 if (sbr->Is_DRM_SBR)
00313 {
00314 sbr->bsco = max((int32_t)sbr->maxAACLine*32/(int32_t)sbr->frame_len - (int32_t)sbr->kx, 0);
00315 } else {
00316 #endif
00317 sbr->bsco = 0;
00318 #ifdef DRM
00319 }
00320 #endif
00321
00322
00323
00324 #ifdef PRE_QMF_PRINT
00325 {
00326 int i;
00327 for (i = 0; i < 1024; i++)
00328 {
00329 printf("%d\n", channel_buf[i]);
00330 }
00331 }
00332 #endif
00333
00334
00335
00336 if (dont_process)
00337 sbr_qmf_analysis_32(sbr, sbr->qmfa[ch], channel_buf, sbr->Xsbr[ch], sbr->tHFGen, 32);
00338 else
00339 sbr_qmf_analysis_32(sbr, sbr->qmfa[ch], channel_buf, sbr->Xsbr[ch], sbr->tHFGen, sbr->kx);
00340
00341 if (!dont_process)
00342 {
00343 #if 1
00344
00345
00346 hf_generation(sbr, sbr->Xsbr[ch], sbr->Xsbr[ch]
00347 #ifdef SBR_LOW_POWER
00348 ,deg
00349 #endif
00350 ,ch);
00351 #endif
00352
00353 #if 0 //def SBR_LOW_POWER
00354 for (l = sbr->t_E[ch][0]; l < sbr->t_E[ch][sbr->L_E[ch]]; l++)
00355 {
00356 for (k = 0; k < sbr->kx; k++)
00357 {
00358 QMF_RE(sbr->Xsbr[ch][sbr->tHFAdj + l][k]) = 0;
00359 }
00360 }
00361 #endif
00362
00363 #if 1
00364
00365 ret = hf_adjustment(sbr, sbr->Xsbr[ch]
00366 #ifdef SBR_LOW_POWER
00367 ,deg
00368 #endif
00369 ,ch);
00370 #endif
00371 if (ret > 0)
00372 {
00373 dont_process = 1;
00374 }
00375 }
00376
00377 if ((sbr->just_seeked != 0) || dont_process)
00378 {
00379 for (l = 0; l < sbr->numTimeSlotsRate; l++)
00380 {
00381 for (k = 0; k < 32; k++)
00382 {
00383 QMF_RE(X[l][k]) = QMF_RE(sbr->Xsbr[ch][l + sbr->tHFAdj][k]);
00384 #ifndef SBR_LOW_POWER
00385 QMF_IM(X[l][k]) = QMF_IM(sbr->Xsbr[ch][l + sbr->tHFAdj][k]);
00386 #endif
00387 }
00388 for (k = 32; k < 64; k++)
00389 {
00390 QMF_RE(X[l][k]) = 0;
00391 #ifndef SBR_LOW_POWER
00392 QMF_IM(X[l][k]) = 0;
00393 #endif
00394 }
00395 }
00396 } else {
00397 for (l = 0; l < sbr->numTimeSlotsRate; l++)
00398 {
00399 uint8_t kx_band, M_band, bsco_band;
00400
00401 if (l < sbr->t_E[ch][0])
00402 {
00403 kx_band = sbr->kx_prev;
00404 M_band = sbr->M_prev;
00405 bsco_band = sbr->bsco_prev;
00406 } else {
00407 kx_band = sbr->kx;
00408 M_band = sbr->M;
00409 bsco_band = sbr->bsco;
00410 }
00411
00412 #ifndef SBR_LOW_POWER
00413 for (k = 0; k < kx_band + bsco_band; k++)
00414 {
00415 QMF_RE(X[l][k]) = QMF_RE(sbr->Xsbr[ch][l + sbr->tHFAdj][k]);
00416 QMF_IM(X[l][k]) = QMF_IM(sbr->Xsbr[ch][l + sbr->tHFAdj][k]);
00417 }
00418 for (k = kx_band + bsco_band; k < kx_band + M_band; k++)
00419 {
00420 QMF_RE(X[l][k]) = QMF_RE(sbr->Xsbr[ch][l + sbr->tHFAdj][k]);
00421 QMF_IM(X[l][k]) = QMF_IM(sbr->Xsbr[ch][l + sbr->tHFAdj][k]);
00422 }
00423 for (k = max(kx_band + bsco_band, kx_band + M_band); k < 64; k++)
00424 {
00425 QMF_RE(X[l][k]) = 0;
00426 QMF_IM(X[l][k]) = 0;
00427 }
00428 #else
00429 for (k = 0; k < kx_band + bsco_band; k++)
00430 {
00431 QMF_RE(X[l][k]) = QMF_RE(sbr->Xsbr[ch][l + sbr->tHFAdj][k]);
00432 }
00433 for (k = kx_band + bsco_band; k < min(kx_band + M_band, 63); k++)
00434 {
00435 QMF_RE(X[l][k]) = QMF_RE(sbr->Xsbr[ch][l + sbr->tHFAdj][k]);
00436 }
00437 for (k = max(kx_band + bsco_band, kx_band + M_band); k < 64; k++)
00438 {
00439 QMF_RE(X[l][k]) = 0;
00440 }
00441 QMF_RE(X[l][kx_band - 1 + bsco_band]) +=
00442 QMF_RE(sbr->Xsbr[ch][l + sbr->tHFAdj][kx_band - 1 + bsco_band]);
00443 #endif
00444 }
00445 }
00446
00447 return ret;
00448 }
00449
00450 uint8_t sbrDecodeCoupleFrame(sbr_info *sbr, real_t *left_chan, real_t *right_chan,
00451 const uint8_t just_seeked, const uint8_t downSampledSBR)
00452 {
00453 uint8_t dont_process = 0;
00454 uint8_t ret = 0;
00455 ALIGN qmf_t X[MAX_NTSR][64];
00456
00457 if (sbr == NULL)
00458 return 20;
00459
00460
00461 if (sbr->id_aac != ID_CPE)
00462 return 21;
00463
00464 if (sbr->ret || (sbr->header_count == 0))
00465 {
00466
00467 dont_process = 1;
00468
00469
00470 if (sbr->ret && sbr->Reset)
00471 sbr->bs_start_freq_prev = -1;
00472 }
00473
00474 if (just_seeked)
00475 {
00476 sbr->just_seeked = 1;
00477 } else {
00478 sbr->just_seeked = 0;
00479 }
00480
00481 sbr->ret += sbr_process_channel(sbr, left_chan, X, 0, dont_process, downSampledSBR);
00482
00483 if (downSampledSBR)
00484 {
00485 sbr_qmf_synthesis_32(sbr, sbr->qmfs[0], X, left_chan);
00486 } else {
00487 sbr_qmf_synthesis_64(sbr, sbr->qmfs[0], X, left_chan);
00488 }
00489
00490 sbr->ret += sbr_process_channel(sbr, right_chan, X, 1, dont_process, downSampledSBR);
00491
00492 if (downSampledSBR)
00493 {
00494 sbr_qmf_synthesis_32(sbr, sbr->qmfs[1], X, right_chan);
00495 } else {
00496 sbr_qmf_synthesis_64(sbr, sbr->qmfs[1], X, right_chan);
00497 }
00498
00499 if (sbr->bs_header_flag)
00500 sbr->just_seeked = 0;
00501
00502 if (sbr->header_count != 0 && sbr->ret == 0)
00503 {
00504 ret = sbr_save_prev_data(sbr, 0);
00505 if (ret) return ret;
00506 ret = sbr_save_prev_data(sbr, 1);
00507 if (ret) return ret;
00508 }
00509
00510 sbr_save_matrix(sbr, 0);
00511 sbr_save_matrix(sbr, 1);
00512
00513 sbr->frame++;
00514
00515
00516 #ifdef POST_QMF_PRINT
00517 {
00518 int i;
00519 for (i = 0; i < 2048; i++)
00520 {
00521 printf("%d\n", left_chan[i]);
00522 }
00523 for (i = 0; i < 2048; i++)
00524 {
00525 printf("%d\n", right_chan[i]);
00526 }
00527 }
00528 #endif
00529
00530 return 0;
00531 }
00532
00533 uint8_t sbrDecodeSingleFrame(sbr_info *sbr, real_t *channel,
00534 const uint8_t just_seeked, const uint8_t downSampledSBR)
00535 {
00536 uint8_t dont_process = 0;
00537 uint8_t ret = 0;
00538 ALIGN qmf_t X[MAX_NTSR][64];
00539
00540 if (sbr == NULL)
00541 return 20;
00542
00543
00544 if (sbr->id_aac != ID_SCE && sbr->id_aac != ID_LFE)
00545 return 21;
00546
00547 if (sbr->ret || (sbr->header_count == 0))
00548 {
00549
00550 dont_process = 1;
00551
00552
00553 if (sbr->ret && sbr->Reset)
00554 sbr->bs_start_freq_prev = -1;
00555 }
00556
00557 if (just_seeked)
00558 {
00559 sbr->just_seeked = 1;
00560 } else {
00561 sbr->just_seeked = 0;
00562 }
00563
00564 sbr->ret += sbr_process_channel(sbr, channel, X, 0, dont_process, downSampledSBR);
00565
00566 if (downSampledSBR)
00567 {
00568 sbr_qmf_synthesis_32(sbr, sbr->qmfs[0], X, channel);
00569 } else {
00570 sbr_qmf_synthesis_64(sbr, sbr->qmfs[0], X, channel);
00571 }
00572
00573 if (sbr->bs_header_flag)
00574 sbr->just_seeked = 0;
00575
00576 if (sbr->header_count != 0 && sbr->ret == 0)
00577 {
00578 ret = sbr_save_prev_data(sbr, 0);
00579 if (ret) return ret;
00580 }
00581
00582 sbr_save_matrix(sbr, 0);
00583
00584 sbr->frame++;
00585
00586
00587 #ifdef POST_QMF_PRINT
00588 {
00589 int i;
00590 for (i = 0; i < 2048; i++)
00591 {
00592 printf("%d\n", channel[i]);
00593 }
00594 }
00595 #endif
00596
00597 return 0;
00598 }
00599
00600 #if (defined(PS_DEC) || defined(DRM_PS))
00601 uint8_t sbrDecodeSingleFramePS(sbr_info *sbr, real_t *left_channel, real_t *right_channel,
00602 const uint8_t just_seeked, const uint8_t downSampledSBR)
00603 {
00604 uint8_t l, k;
00605 uint8_t dont_process = 0;
00606 uint8_t ret = 0;
00607 ALIGN qmf_t X_left[38][64] = {{0}};
00608 ALIGN qmf_t X_right[38][64] = {{0}};
00609
00610 if (sbr == NULL)
00611 return 20;
00612
00613
00614 if (sbr->id_aac != ID_SCE && sbr->id_aac != ID_LFE)
00615 return 21;
00616
00617 if (sbr->ret || (sbr->header_count == 0))
00618 {
00619
00620 dont_process = 1;
00621
00622
00623 if (sbr->ret && sbr->Reset)
00624 sbr->bs_start_freq_prev = -1;
00625 }
00626
00627 if (just_seeked)
00628 {
00629 sbr->just_seeked = 1;
00630 } else {
00631 sbr->just_seeked = 0;
00632 }
00633
00634 if (sbr->qmfs[1] == NULL)
00635 {
00636 sbr->qmfs[1] = qmfs_init((downSampledSBR)?32:64);
00637 }
00638
00639 sbr->ret += sbr_process_channel(sbr, left_channel, X_left, 0, dont_process, downSampledSBR);
00640
00641
00642 for (l = 32; l < 38; l++)
00643 {
00644 for (k = 0; k < 5; k++)
00645 {
00646 QMF_RE(X_left[l][k]) = QMF_RE(sbr->Xsbr[0][sbr->tHFAdj+l][k]);
00647 QMF_IM(X_left[l][k]) = QMF_IM(sbr->Xsbr[0][sbr->tHFAdj+l][k]);
00648 }
00649 }
00650
00651
00652 #ifdef DRM_PS
00653 if (sbr->Is_DRM_SBR)
00654 {
00655 drm_ps_decode(sbr->drm_ps, (sbr->ret > 0), X_left, X_right);
00656 } else {
00657 #endif
00658 #ifdef PS_DEC
00659 ps_decode(sbr->ps, X_left, X_right);
00660 #endif
00661 #ifdef DRM_PS
00662 }
00663 #endif
00664
00665
00666 if (downSampledSBR)
00667 {
00668 sbr_qmf_synthesis_32(sbr, sbr->qmfs[0], X_left, left_channel);
00669 sbr_qmf_synthesis_32(sbr, sbr->qmfs[1], X_right, right_channel);
00670 } else {
00671 sbr_qmf_synthesis_64(sbr, sbr->qmfs[0], X_left, left_channel);
00672 sbr_qmf_synthesis_64(sbr, sbr->qmfs[1], X_right, right_channel);
00673 }
00674
00675 if (sbr->bs_header_flag)
00676 sbr->just_seeked = 0;
00677
00678 if (sbr->header_count != 0 && sbr->ret == 0)
00679 {
00680 ret = sbr_save_prev_data(sbr, 0);
00681 if (ret) return ret;
00682 }
00683
00684 sbr_save_matrix(sbr, 0);
00685
00686 sbr->frame++;
00687
00688 return 0;
00689 }
00690 #endif
00691
00692 #endif