📄 aac_enc_quantization_fp.c
字号:
pBlock->start_common_scalefac = -SF_OFFSET;
pBlock->finish_common_scalefac = -SF_OFFSET;
if (pBlock->ns_mode) {
Ipp32s startSF[MAX_SECTION_NUMBER];
Ipp32s finishSF[MAX_SECTION_NUMBER];
Ipp16s maxXQuant[MAX_SECTION_NUMBER];
Ipp16s* ns_scale_factors = pBlock->ns_scale_factors;
Ipp16s* pMaxXQuant = maxXQuant;
Ipp32s numSfb = pStream->num_window_groups * pStream->max_sfb;
Ipp32s minSf = 100000;
Ipp32s maxSf = -100000;
for (sfb = 0; sfb < numSfb; sfb++) {
aac_LimitSF(mdct_scaled + sfb_offset[sfb], sfb_width[sfb],
&startSF[sfb], &finishSF[sfb]);
}
aac_FindSF(pStream, qData, mdct_scaled, mdct_line_abs, startSF,
finishSF, ns_scale_factors, maxXQuant);
aac_MinMaxSF(pStream, mdct_scaled, startSF, ns_scale_factors,
maxXQuant, &minSf, &maxSf, 60);
aac_UpdateSF(pStream, mdct_scaled, mdct_line_abs, startSF,
ns_scale_factors, maxXQuant, minSf, *bitsToPeCoeff,
0.2f * pBlock->bits_per_frame);
aac_MinMaxSF(pStream, mdct_scaled, startSF, ns_scale_factors,
maxXQuant, &minSf, &maxSf, 60);
for (sfb = 0; sfb < numSfb; sfb++) {
if (maxXQuant[sfb] != 0) {
ns_scale_factors[sfb] = (Ipp16s)(maxSf - ns_scale_factors[sfb]);
if (ns_scale_factors[sfb] > 0) {
Ipp32f mul = (Ipp32f)scalefac_pow[SF_OFFSET - ns_scale_factors[sfb]];
ippsMulC_32f_I(mul, mdct_scaled + sfb_offset[sfb], sfb_width[sfb]);
}
}
}
for (win = 0; win < pStream->num_window_groups; win++) {
firstNonZeroSfb = -1;
for (sfb = 0; sfb < pStream->max_sfb; sfb++) {
if (pMaxXQuant[sfb] != 0) {
if (firstNonZeroSfb < 0) {
firstNonZeroSfb = sfb;
}
}
}
if (firstNonZeroSfb < 0) {
for (sfb = 0; sfb < pStream->max_sfb; sfb++) {
ns_scale_factors[sfb] = 0;
}
} else {
for (sfb = 0; sfb < firstNonZeroSfb; sfb++) {
ns_scale_factors[sfb] = ns_scale_factors[firstNonZeroSfb];
}
for (sfb = firstNonZeroSfb + 1; sfb < pStream->max_sfb; sfb++) {
if (pMaxXQuant[sfb] == 0) {
ns_scale_factors[sfb] = ns_scale_factors[sfb - 1];
}
}
}
ns_scale_factors += pStream->max_sfb;
pMaxXQuant += pStream->max_sfb;
}
ns_scale_factors = pBlock->ns_scale_factors;
pBlock->last_frame_common_scalefactor[0] = maxSf;
pBlock->common_scalefactor_update[0] = 1;
}
aac_LimitSF(mdct_scaled, pStream->max_line,
&pBlock->start_common_scalefac,
&pBlock->finish_common_scalefac);
main_loop(pBlock, pStream, mdct_line, mdct_scaled,
&bitsForScaleFactorData);
if (pBlock->ns_mode) {
Ipp32f mdct_rqnt[N_LONG/2];
Ipp16s x_quant_unsigned[N_LONG/2];
Ipp32s numSfb = pStream->num_window_groups * pStream->max_sfb;
Ipp32f noise[MAX_SECTION_NUMBER], real_sf;
Ipp32f pe = 0;
*scalefactorDataBits = (*scalefactorDataBits) * 0.9f +
bitsForScaleFactorData * 0.1f;
for (sfb = 0; sfb < numSfb; sfb++) {
Ipp32s scalefactor = pStream->scale_factors[sfb] + pBlock->ns_scale_factors[sfb];
Ipp32f sf = (Ipp32f)scalefac_pow[scalefactor];
Ipp32f temp = (Ipp32f)(MAGIC_NUMBER - 0.5f)/sf;
Ipp32s sfb_start = sfb_offset[sfb];
Ipp32f energy = qData->energy[sfb];
ippsAddC_32f(mdct_scaled + sfb_start, temp, mdct_rqnt, sfb_width[sfb]);
ippsMulC_Low_32f16s(mdct_rqnt, sf, x_quant_unsigned, sfb_width[sfb]);
ippsPow43_16s32f(x_quant_unsigned, mdct_rqnt, sfb_width[sfb]);
ippsCalcSF_16s32f(&pStream->scale_factors[sfb], SF_OFFSET, &real_sf, 1);
ippsMulC_32f_I(real_sf, mdct_rqnt, sfb_width[sfb]);
ippsSub_32f_I(mdct_line_abs + sfb_start, mdct_rqnt, sfb_width[sfb]);
ippsDotProd_32f(mdct_rqnt, mdct_rqnt, sfb_width[sfb], &noise[sfb]);
if (energy > noise[sfb]) {
pe += (Ipp32f)(sfb_width[sfb] * log10(energy / noise[sfb]));
}
}
qData->outPe = pe;
if (pe > 0) {
*bitsToPeCoeff = (*bitsToPeCoeff) * 0.9f +
(pe/(pBlock->used_bits - bitsForScaleFactorData)) * 0.1f;
}
}
}
/****************************************************************************/
void main_loop(sQuantizationBlock* pBlock,
sEnc_individual_channel_stream* pStream,
Ipp32f* mdct_line,
Ipp32f* mdct_scaled,
Ipp32s* bitsForScaleFactorData)
{
Ipp32f tmp_x_quant[N_LONG/2];
Ipp16s mdct_sign[N_LONG/2];
Ipp16s x_quant_unsigned[N_LONG/2];
Ipp16s x_quant_signed_pred[N_LONG/2];
Ipp16s maxXQuant[MAX_SECTION_NUMBER];
Ipp32f sf, temp;
Ipp32s start_common_scalefac = pBlock->start_common_scalefac;
Ipp32s finish_common_scalefac = pBlock->finish_common_scalefac;
Ipp32s common_scalefactor;
Ipp32s common_scalefactor_update;
Ipp32s needed_bits, bits_for_scale_factor_data;
Ipp32s num_scale_factor;
Ipp32s i;
num_scale_factor = pStream->num_window_groups * pStream->max_sfb;
for (i = 0; i < pStream->max_line; i++) {
mdct_sign[i] = SIGN(mdct_line[i]);
}
common_scalefactor = pBlock->last_frame_common_scalefactor[0];
common_scalefactor_update = pBlock->common_scalefactor_update[0];
if (common_scalefactor < start_common_scalefac)
common_scalefactor = start_common_scalefac;
if (common_scalefactor > finish_common_scalefac)
common_scalefactor = finish_common_scalefac;
for(;;) {
sf = (Ipp32f)scalefac_pow[common_scalefactor + SF_OFFSET];
temp = (Ipp32f)(MAGIC_NUMBER - 0.5f)/sf;
ippsAddC_32f(mdct_scaled, temp, tmp_x_quant, pStream->max_line);
ippsMulC_Low_32f16s(tmp_x_quant, sf, x_quant_unsigned, pStream->max_line);
ippsMul_16s(mdct_sign, x_quant_unsigned, pStream->x_quant, pStream->max_line);
if (pBlock->ns_mode) {
int win, sfb, firstNonZeroSfb;
Ipp16s* ns_scale_factors = pBlock->ns_scale_factors;
Ipp16s* pMaxXQuant = maxXQuant;
for (sfb = 0; sfb < pStream->num_window_groups * pStream->max_sfb; sfb++) {
Ipp32s sfb_start = pStream->sfb_offset[sfb];
Ipp32s width = pStream->sfb_width[sfb];
ippsMax_16s(x_quant_unsigned + sfb_start, width, maxXQuant + sfb);
}
for (win = 0; win < pStream->num_window_groups; win++) {
firstNonZeroSfb = -1;
for (sfb = 0; sfb < pStream->max_sfb; sfb++) {
if (pMaxXQuant[sfb] != 0) {
if (firstNonZeroSfb < 0) {
firstNonZeroSfb = sfb;
}
}
}
if (firstNonZeroSfb < 0) {
for (sfb = 0; sfb < pStream->max_sfb; sfb++) {
ns_scale_factors[sfb] = 0;
}
} else {
for (sfb = 0; sfb < firstNonZeroSfb; sfb++) {
ns_scale_factors[sfb] = ns_scale_factors[firstNonZeroSfb];
}
for (sfb = firstNonZeroSfb + 1; sfb < pStream->max_sfb; sfb++) {
if (pMaxXQuant[sfb] == 0) {
ns_scale_factors[sfb] = ns_scale_factors[sfb - 1];
}
}
}
ns_scale_factors += pStream->max_sfb;
pMaxXQuant += pStream->max_sfb;
}
}
needed_bits = best_codebooks_search(pStream, x_quant_unsigned,
pStream->x_quant, NULL,
x_quant_signed_pred);
if (pBlock->ns_mode) {
common_scalefactor += SF_OFFSET;
for (i = 0; i < num_scale_factor; i++) {
pStream->scale_factors[i] = (Ipp16s)(common_scalefactor -
pBlock->ns_scale_factors[i]);
}
common_scalefactor -= SF_OFFSET;
bits_for_scale_factor_data = enc_scale_factor_data(pStream, NULL, 0);
} else {
bits_for_scale_factor_data = num_scale_factor;
for (i = 0; i < num_scale_factor; i++) {
if (pStream->sfb_cb[i] == 0)
bits_for_scale_factor_data--;
}
}
needed_bits += bits_for_scale_factor_data;
if (needed_bits == pBlock->available_bits)
break;
if (needed_bits > pBlock->available_bits) {
if (common_scalefactor == finish_common_scalefac)
break;
if (common_scalefactor_update < 0) {
common_scalefactor_update = -common_scalefactor_update;
}
common_scalefactor_update = (common_scalefactor_update + 1) >> 1;
} else {
if (common_scalefactor == start_common_scalefac)
break;
if (common_scalefactor_update == 1)
break;
if (common_scalefactor_update > 0) {
common_scalefactor_update = -common_scalefactor_update;
}
common_scalefactor_update >>= 1;
}
common_scalefactor += common_scalefactor_update;
if (common_scalefactor < start_common_scalefac)
common_scalefactor = start_common_scalefac;
if (common_scalefactor > finish_common_scalefac)
common_scalefactor = finish_common_scalefac;
}
pBlock->common_scalefactor_update[0] =
common_scalefactor - pBlock->last_frame_common_scalefactor[0];
pBlock->last_frame_common_scalefactor[0] = common_scalefactor;
if (pBlock->common_scalefactor_update[0] >= 0) {
if (pBlock->common_scalefactor_update[0] <= 2)
pBlock->common_scalefactor_update[0] = 2;
} else {
if (pBlock->common_scalefactor_update[0] >= -2)
pBlock->common_scalefactor_update[0] = -2;
}
pBlock->used_bits = needed_bits;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -