📄 aac_enc_api_int.c
字号:
used_bits += enc_channel_pair_element(&cpe,
state_com->chInfo[ch].element_instance_tag, pBS, 0, 0);
save_bits = (used_bits + 1) >> 1;
}
lim_bits = (29491 * max_bits_in_buf) >> 15; /* 0.9 in Q15 */
if (bits_in_buf > lim_bits) {
available_bits += bits_in_buf - lim_bits;
bits_from_buffer = lim_bits;
} else {
available_bits = available_bits - (available_bits >> 3);
bits_from_buffer = bits_in_buf;
}
available_bits -= used_bits;
available_bits /= procCh;
com_additional_bits = 0;
for (i = 0; i < procCh; i++) {
additional_bits[i] =
state->psychoacoustic_block[ch+i].curr_frame_PE - 1400;
additional_bits[i] = (additional_bits[i] * 3) >> 2;
if (additional_bits[i] < 0) {
additional_bits[i] = 0;
} else if (additional_bits[i] > (available_bits + (available_bits >> 1))) {
additional_bits[i] = available_bits + (available_bits >> 1);
} else if ((ics[i].windows_sequence == EIGHT_SHORT_SEQUENCE) &&
(additional_bits[i] < (available_bits >> 1))) {
additional_bits[i] = available_bits >> 1;
}
com_additional_bits += additional_bits[i];
}
if (bits_from_buffer > 0) {
if (com_additional_bits > bits_from_buffer) {
norm_bits = (bits_from_buffer * 32768) / com_additional_bits;
for (i = 0; i < procCh; i++) {
additional_bits[i] = (additional_bits[i] * norm_bits) >> 15;
}
} else {
for (i = 0; i < procCh; i++) {
additional_bits[i] = 0;
}
}
}
for (i = 0; i < procCh; i++) {
Ipp32s index = state->psychoacoustic_block_com.nb_prev_index;
quantization_block.available_bits =
available_bits + additional_bits[i];
//quantization_block.available_bits =
// (state_com->chInfo[ch].mean_bits - used_bits) /procCh;
if (state->psychoacoustic_block[ch].stereo_mode[index] == AAC_MS_STEREO) {
if (i == 0) {
Ipp32s coeff = (state->psychoacoustic_block[ch].ms_coef[index] /* in Q4 */ - 8)
* state->ms_mul /* in Q11*/ ;
if (coeff > 32768) coeff = 32768;
else if (coeff < -32768) coeff = -32768;
//else if (coeff < 0) coeff = 0;
ms_add_bits = additional_bits[0];
if (additional_bits[0] > additional_bits[1])
ms_add_bits = additional_bits[1];
/* Some bits should be remained (50) */
ms_add_bits += (available_bits - 50);
if (ms_add_bits < 0) ms_add_bits = 0;
ms_add_bits = (ms_add_bits * coeff) >> 15;
quantization_block.available_bits += ms_add_bits;
} else {
quantization_block.available_bits -= ms_add_bits;
}
}
if (quantization_block.available_bits > (768 * 8 - save_bits)) {
quantization_block.available_bits = 768 * 8 - save_bits;
} else if (quantization_block.available_bits < 0) {
quantization_block.available_bits = 0;
}
quantization_block.common_scalefactor_update =
&(state_com->chInfo[ch+i].common_scalefactor_update);
quantization_block.last_frame_common_scalefactor =
&(state_com->chInfo[ch+i].last_frame_common_scalefactor);
ics[i].num_window_groups = 1;
ics[i].len_window_group[0] = 1;
win_seq = ics[i].windows_sequence;
if (win_seq == EIGHT_SHORT_SEQUENCE) {
p_smr = state->psychoacoustic_block[ch+i].smr_short[index];
} else {
p_smr = state->psychoacoustic_block[ch+i].smr_long[index];
}
quantization_block.ns_mode = state->psychoacoustic_block_com.ns_mode;
quantization_block.sfb_width_scale =
state->psychoacoustic_block_com.sfb_width_longScale;
p_mdct_line = mdct_line[i];
/* Ipp16s block interleave */
if (win_seq == EIGHT_SHORT_SEQUENCE) {
Ipp32s *len_window_group = ics[i].len_window_group;
Ipp32s *scale_factor_grouping = ics[i].scale_factor_grouping;
Ipp32s *tmp_sfb_offset = state_com->sfb_offset[win_seq];
Ipp32s num_window_groups = 1;
Ipp32s max_sfb = ics[i].max_sfb;
Ipp16s *ptrIn = mdct_line[i];
Ipp16s *ptrOut = mdct_line_i;
Ipp32s g, sfb, w, ind, max_len;
for (j = 0; j < 7; j++) {
if (scale_factor_grouping[j] == 0) {
len_window_group[num_window_groups] = 1;
num_window_groups++;
} else {
len_window_group[num_window_groups - 1]++;
}
}
ics[i].num_window_groups = num_window_groups;
max_len = 1;
sfb_offset[0] = 0;
ind = 1;
for (g = 0; g < num_window_groups; g++) {
for (sfb = 0; sfb < max_sfb; sfb++) {
Ipp32s sfb_start = tmp_sfb_offset[sfb];
Ipp32s sfb_end = tmp_sfb_offset[sfb+1];
Ipp32s sfb_width = sfb_end - sfb_start;
sfb_offset[ind] = sfb_offset[ind - 1] +
sfb_width * len_window_group[g];
ind++;
if (max_len < len_window_group[g])
max_len = len_window_group[g];
for (j = 0; j < len_window_group[g]; j++) {
for (w = 0; w < sfb_width; w++) {
*ptrOut = ptrIn[w + sfb_start + 128 * j];
ptrOut++;
}
}
}
ptrIn += 128 * len_window_group[g];
}
if (quantization_block.ns_mode) {
ptrSmrOut = smr_short_i;
ptrSmrIn = p_smr;
for (g = 0; g < num_window_groups; g++) {
for (sfb = 0; sfb < max_sfb; sfb++) {
for (j = 0; j < len_window_group[g]; j++) {
*ptrSmrOut = ptrSmrIn[sfb + MAX_SFB_SHORT * j];
ptrSmrOut++;
}
}
ptrSmrIn += MAX_SFB_SHORT * len_window_group[g];
}
p_smr = smr_short_i;
}
ics[i].sfb_offset = sfb_offset;
p_mdct_line = mdct_line_i;
if (max_len == 1) {
quantization_block.sfb_width_scale =
state->psychoacoustic_block_com.sfb_width_shortScale;
} else if (max_len == 2) {
quantization_block.sfb_width_scale =
state->psychoacoustic_block_com.sfb_width_shortScale + 1;
} else if (max_len <= 4) {
quantization_block.sfb_width_scale =
state->psychoacoustic_block_com.sfb_width_shortScale + 2;
} else {
quantization_block.sfb_width_scale =
state->psychoacoustic_block_com.sfb_width_shortScale + 3;
}
}
aaciencQuantization(&quantization_block, &ics[i],
p_mdct_line, p_mdct_line_pred[i],
mdct_scaleFactor[i], p_smr);
if (state_com->audioObjectType == AOT_AAC_LTP) {
if (win_seq != EIGHT_SHORT_SEQUENCE) {
ics[i].predictor_data_present = ics[i].ltp_data_present;
if (ics[i].predictor_data_present) {
for (sfb = 0; sfb < max_sfb_pred; sfb++) {
if (!ics[i].ltp_long_used[sfb]) {
Ipp32s begin = ics[i].sfb_offset[sfb];
Ipp32s end = ics[i].sfb_offset[sfb+1];
for (j = begin; j < end; j++) {
predictedSpectrum[i][j] = 0;
}
}
}
}
}
}
}
if (state_com->audioObjectType == AOT_AAC_LTP) {
Ipp32s *predSpectrum[2];
Ipp16s *ltp_buff[2];
Ipp32s *ltp_overlap[2];
Ipp32s prev_window_shape[2];
for (i = 0; i < procCh; i++) {
predSpectrum[i] = predictedSpectrum[i];
ltp_buff[i] = state->ltp_buff[ch+i];
ltp_overlap[i] = state->ltp_overlap[ch+i];
prev_window_shape[i] = state_com->chInfo[ch+i].prev_window_shape;
}
aaciencLtpBufferUpdate(ltp_buff, ltp_overlap, predSpectrum, &cpe,
state_com->sfb_offset[EIGHT_SHORT_SEQUENCE],
prev_window_shape, procCh);
}
for (i = 0; i < procCh; i++) {
state_com->chInfo[ch+i].prev_window_shape = win_shape;
}
GET_BITS_COUNT(pBS, save_bits)
/* Put bits into bitstream */
if (state_com->chInfo[ch].element_id == ID_SCE) {
PUT_BITS(pBS,ID_SCE,3);
enc_single_channel_element(&sce, state_com->chInfo[ch].element_instance_tag,
pBS, 1, pCrcSaveTable);
pCrcSaveTable++;
} else if (state_com->chInfo[ch].element_id == ID_LFE) {
PUT_BITS(pBS,ID_LFE,3);
enc_single_channel_element(&sce, state_com->chInfo[ch].element_instance_tag,
pBS, 1, pCrcSaveTable);
pCrcSaveTable++;
} else {
if (cpe.common_window) {
if (state_com->audioObjectType == AOT_AAC_LTP) {
if (ics[1].predictor_data_present) {
ics[0].predictor_data_present = 1;
}
}
}
PUT_BITS(pBS,ID_CPE,3);
enc_channel_pair_element(&cpe, state_com->chInfo[ch].element_instance_tag,
pBS, 1, pCrcSaveTable);
pCrcSaveTable += 2;
}
GET_BITS_COUNT(pBS, used_bits)
used_bits -= save_bits;
state_com->chInfo[ch].bits_in_buf +=
state_com->chInfo[ch].mean_bits - used_bits;
if (state_com->chInfo[ch].bits_in_buf > state_com->chInfo[ch].max_bits_in_buf)
state_com->chInfo[ch].bits_in_buf = state_com->chInfo[ch].max_bits_in_buf;
}
PUT_BITS(pBS,ID_END,3);
SAVE_BITSTREAM(pBS)
Byte_alignment(pBS);
state_com->m_buff_prev_index++;
if (state_com->m_buff_prev_index == 3)
state_com->m_buff_prev_index = 0;
state_com->m_buff_curr_index++;
if (state_com->m_buff_curr_index == 3)
state_com->m_buff_curr_index = 0;
state_com->m_buff_next_index++;
if (state_com->m_buff_next_index == 3)
state_com->m_buff_next_index = 0;
state->psychoacoustic_block_com.prev_prev_f_r_index = state_com->m_buff_prev_index;
state->psychoacoustic_block_com.prev_f_r_index = state_com->m_buff_curr_index;
state->psychoacoustic_block_com.current_f_r_index = state_com->m_buff_next_index;
state->psychoacoustic_block_com.nb_curr_index++;
state->psychoacoustic_block_com.nb_curr_index &= 1;
state->psychoacoustic_block_com.nb_prev_index++;
state->psychoacoustic_block_com.nb_prev_index &= 1;
GET_BITS_COUNT(pBS, (*encodedBytes))
*encodedBytes >>= 3;
state_com->m_frame_number++;
return AAC_OK;
}
/********************************************************************/
AACStatus aaciencFillProgramConfigElement(sProgram_config_element* p_data,
Ipp32s element_instance_tag,
AACEnc *state)
{
Ipp32s ret = fill_program_config_element(p_data, element_instance_tag,
&(state->com));
if (ret < 0) return AAC_BAD_PARAMETER;
return AAC_OK;
}
/********************************************************************/
AACStatus aaciencClose(AACEnc *state)
{
if (state == NULL)
return AAC_OK;
return AAC_OK;
}
/********************************************************************/
AACStatus aaciencGetCrcSaveTable(sCrcSaveTable **crcSaveTable,
AACEnc *state)
{
if (!state)
return AAC_NULL_PTR;
if (!crcSaveTable)
return AAC_NULL_PTR;
*crcSaveTable = state->com.crcSaveTable;
return AAC_OK;
}
/********************************************************************/
AACStatus aaciencGetSampleFrequencyIndex(Ipp32s *freq_index,
AACEnc *state)
{
if (!state)
return AAC_NULL_PTR;
*freq_index = state->com.sampling_frequency_index;
return AAC_OK;
}
/********************************************************************/
AACStatus aaciencGetNumEncodedFrames(Ipp32s *m_frame_number,
AACEnc *state)
{
if (!state)
return AAC_NULL_PTR;
*m_frame_number = state->com.m_frame_number;
return AAC_OK;
}
/********************************************************************/
AACStatus aaciencGetDuration(Ipp32f *p_duration,
AACEnc *state)
{
Ipp32f duration;
duration = (Ipp32f)(state->com.m_frame_number) * 1024;
*p_duration = duration / (Ipp32f)(state->com.m_sampling_frequency);
return AAC_OK;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -