📄 sbr_dec.c
字号:
,deg
#endif
,ch);
#endif
#if 0 //def SBR_LOW_POWER
for (l = sbr->t_E[ch][0]; l < sbr->t_E[ch][sbr->L_E[ch]]; l++)
{
for (k = 0; k < sbr->kx; k++)
{
QMF_RE(sbr->Xsbr[ch][sbr->tHFAdj + l][k]) = 0;
}
}
#endif
#if 1
/* hf adjustment */
ret = hf_adjustment(sbr, sbr->Xsbr[ch]
#ifdef SBR_LOW_POWER
,deg
#endif
,ch);
#endif
if (ret > 0)
{
dont_process = 1;
}
}
if ((sbr->just_seeked != 0) || dont_process)
{
for (l = 0; l < sbr->numTimeSlotsRate; l++)
{
for (k = 0; k < 32; k++)
{
QMF_RE(X[l][k]) = QMF_RE(sbr->Xsbr[ch][l + sbr->tHFAdj][k]);
#ifndef SBR_LOW_POWER
QMF_IM(X[l][k]) = QMF_IM(sbr->Xsbr[ch][l + sbr->tHFAdj][k]);
#endif
}
for (k = 32; k < 64; k++)
{
QMF_RE(X[l][k]) = 0;
#ifndef SBR_LOW_POWER
QMF_IM(X[l][k]) = 0;
#endif
}
}
} else {
for (l = 0; l < sbr->numTimeSlotsRate; l++)
{
uint8_t kx_band, M_band, bsco_band;
if (l < sbr->t_E[ch][0])
{
kx_band = sbr->kx_prev;
M_band = sbr->M_prev;
bsco_band = sbr->bsco_prev;
} else {
kx_band = sbr->kx;
M_band = sbr->M;
bsco_band = sbr->bsco;
}
#ifndef SBR_LOW_POWER
for (k = 0; k < kx_band + bsco_band; k++)
{
QMF_RE(X[l][k]) = QMF_RE(sbr->Xsbr[ch][l + sbr->tHFAdj][k]);
QMF_IM(X[l][k]) = QMF_IM(sbr->Xsbr[ch][l + sbr->tHFAdj][k]);
}
for (k = kx_band + bsco_band; k < kx_band + M_band; k++)
{
QMF_RE(X[l][k]) = QMF_RE(sbr->Xsbr[ch][l + sbr->tHFAdj][k]);
QMF_IM(X[l][k]) = QMF_IM(sbr->Xsbr[ch][l + sbr->tHFAdj][k]);
}
for (k = max(kx_band + bsco_band, kx_band + M_band); k < 64; k++)
{
QMF_RE(X[l][k]) = 0;
QMF_IM(X[l][k]) = 0;
}
#else
for (k = 0; k < kx_band + bsco_band; k++)
{
QMF_RE(X[l][k]) = QMF_RE(sbr->Xsbr[ch][l + sbr->tHFAdj][k]);
}
for (k = kx_band + bsco_band; k < min(kx_band + M_band, 63); k++)
{
QMF_RE(X[l][k]) = QMF_RE(sbr->Xsbr[ch][l + sbr->tHFAdj][k]);
}
for (k = max(kx_band + bsco_band, kx_band + M_band); k < 64; k++)
{
QMF_RE(X[l][k]) = 0;
}
QMF_RE(X[l][kx_band - 1 + bsco_band]) +=
QMF_RE(sbr->Xsbr[ch][l + sbr->tHFAdj][kx_band - 1 + bsco_band]);
#endif
}
}
return ret;
}
uint8_t sbrDecodeCoupleFrame(sbr_info *sbr, real_t *left_chan, real_t *right_chan,
const uint8_t just_seeked, const uint8_t downSampledSBR)
{
uint8_t dont_process = 0;
uint8_t ret = 0;
ALIGN qmf_t X[MAX_NTSR][64];
if (sbr == NULL)
return 20;
/* case can occur due to bit errors */
if (sbr->id_aac != ID_CPE)
return 21;
if (sbr->ret || (sbr->header_count == 0))
{
/* don't process just upsample */
dont_process = 1;
/* Re-activate reset for next frame */
if (sbr->ret && sbr->Reset)
sbr->bs_start_freq_prev = -1;
}
if (just_seeked)
{
sbr->just_seeked = 1;
} else {
sbr->just_seeked = 0;
}
sbr->ret += sbr_process_channel(sbr, left_chan, X, 0, dont_process, downSampledSBR);
/* subband synthesis */
if (downSampledSBR)
{
sbr_qmf_synthesis_32(sbr, sbr->qmfs[0], X, left_chan);
} else {
sbr_qmf_synthesis_64(sbr, sbr->qmfs[0], X, left_chan);
}
sbr->ret += sbr_process_channel(sbr, right_chan, X, 1, dont_process, downSampledSBR);
/* subband synthesis */
if (downSampledSBR)
{
sbr_qmf_synthesis_32(sbr, sbr->qmfs[1], X, right_chan);
} else {
sbr_qmf_synthesis_64(sbr, sbr->qmfs[1], X, right_chan);
}
if (sbr->bs_header_flag)
sbr->just_seeked = 0;
if (sbr->header_count != 0 && sbr->ret == 0)
{
ret = sbr_save_prev_data(sbr, 0);
if (ret) return ret;
ret = sbr_save_prev_data(sbr, 1);
if (ret) return ret;
}
sbr_save_matrix(sbr, 0);
sbr_save_matrix(sbr, 1);
sbr->frame++;
//#define POST_QMF_PRINT
#ifdef POST_QMF_PRINT
{
int i;
for (i = 0; i < 2048; i++)
{
printf("%d\n", left_chan[i]);
}
for (i = 0; i < 2048; i++)
{
printf("%d\n", right_chan[i]);
}
}
#endif
return 0;
}
uint8_t sbrDecodeSingleFrame(sbr_info *sbr, real_t *channel,
const uint8_t just_seeked, const uint8_t downSampledSBR)
{
uint8_t dont_process = 0;
uint8_t ret = 0;
ALIGN qmf_t X[MAX_NTSR][64];
if (sbr == NULL)
return 20;
/* case can occur due to bit errors */
if (sbr->id_aac != ID_SCE && sbr->id_aac != ID_LFE)
return 21;
if (sbr->ret || (sbr->header_count == 0))
{
/* don't process just upsample */
dont_process = 1;
/* Re-activate reset for next frame */
if (sbr->ret && sbr->Reset)
sbr->bs_start_freq_prev = -1;
}
if (just_seeked)
{
sbr->just_seeked = 1;
} else {
sbr->just_seeked = 0;
}
sbr->ret += sbr_process_channel(sbr, channel, X, 0, dont_process, downSampledSBR);
/* subband synthesis */
if (downSampledSBR)
{
sbr_qmf_synthesis_32(sbr, sbr->qmfs[0], X, channel);
} else {
sbr_qmf_synthesis_64(sbr, sbr->qmfs[0], X, channel);
}
if (sbr->bs_header_flag)
sbr->just_seeked = 0;
if (sbr->header_count != 0 && sbr->ret == 0)
{
ret = sbr_save_prev_data(sbr, 0);
if (ret) return ret;
}
sbr_save_matrix(sbr, 0);
sbr->frame++;
//#define POST_QMF_PRINT
#ifdef POST_QMF_PRINT
{
int i;
for (i = 0; i < 2048; i++)
{
printf("%d\n", channel[i]);
}
}
#endif
return 0;
}
#if (defined(PS_DEC) || defined(DRM_PS))
uint8_t sbrDecodeSingleFramePS(sbr_info *sbr, real_t *left_channel, real_t *right_channel,
const uint8_t just_seeked, const uint8_t downSampledSBR)
{
uint8_t l, k;
uint8_t dont_process = 0;
uint8_t ret = 0;
ALIGN qmf_t X_left[38][64] = {{0}};
ALIGN qmf_t X_right[38][64] = {{0}}; /* must set this to 0 */
if (sbr == NULL)
return 20;
/* case can occur due to bit errors */
if (sbr->id_aac != ID_SCE && sbr->id_aac != ID_LFE)
return 21;
if (sbr->ret || (sbr->header_count == 0))
{
/* don't process just upsample */
dont_process = 1;
/* Re-activate reset for next frame */
if (sbr->ret && sbr->Reset)
sbr->bs_start_freq_prev = -1;
}
if (just_seeked)
{
sbr->just_seeked = 1;
} else {
sbr->just_seeked = 0;
}
if (sbr->qmfs[1] == NULL)
{
sbr->qmfs[1] = qmfs_init((downSampledSBR)?32:64);
}
sbr->ret += sbr_process_channel(sbr, left_channel, X_left, 0, dont_process, downSampledSBR);
/* copy some extra data for PS */
for (l = 32; l < 38; l++)
{
for (k = 0; k < 5; k++)
{
QMF_RE(X_left[l][k]) = QMF_RE(sbr->Xsbr[0][sbr->tHFAdj+l][k]);
QMF_IM(X_left[l][k]) = QMF_IM(sbr->Xsbr[0][sbr->tHFAdj+l][k]);
}
}
/* perform parametric stereo */
#ifdef DRM_PS
if (sbr->Is_DRM_SBR)
{
drm_ps_decode(sbr->drm_ps, (sbr->ret > 0), X_left, X_right);
} else {
#endif
#ifdef PS_DEC
ps_decode(sbr->ps, X_left, X_right);
#endif
#ifdef DRM_PS
}
#endif
/* subband synthesis */
if (downSampledSBR)
{
sbr_qmf_synthesis_32(sbr, sbr->qmfs[0], X_left, left_channel);
sbr_qmf_synthesis_32(sbr, sbr->qmfs[1], X_right, right_channel);
} else {
sbr_qmf_synthesis_64(sbr, sbr->qmfs[0], X_left, left_channel);
sbr_qmf_synthesis_64(sbr, sbr->qmfs[1], X_right, right_channel);
}
if (sbr->bs_header_flag)
sbr->just_seeked = 0;
if (sbr->header_count != 0 && sbr->ret == 0)
{
ret = sbr_save_prev_data(sbr, 0);
if (ret) return ret;
}
sbr_save_matrix(sbr, 0);
sbr->frame++;
return 0;
}
#endif
#endif
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -