|
|
|
@ -874,137 +874,137 @@ static int g723_1_decode_frame(AVCodecContext *avctx, void *data, |
|
|
|
|
return ret; |
|
|
|
|
|
|
|
|
|
for (int ch = 0; ch < avctx->channels; ch++) { |
|
|
|
|
G723_1_ChannelContext *p = &s->ch[ch]; |
|
|
|
|
int16_t *audio = p->audio; |
|
|
|
|
G723_1_ChannelContext *p = &s->ch[ch]; |
|
|
|
|
int16_t *audio = p->audio; |
|
|
|
|
|
|
|
|
|
if (unpack_bitstream(p, buf, buf_size) < 0) { |
|
|
|
|
bad_frame = 1; |
|
|
|
|
if (p->past_frame_type == ACTIVE_FRAME) |
|
|
|
|
p->cur_frame_type = ACTIVE_FRAME; |
|
|
|
|
else |
|
|
|
|
p->cur_frame_type = UNTRANSMITTED_FRAME; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
if (unpack_bitstream(p, buf, buf_size) < 0) { |
|
|
|
|
bad_frame = 1; |
|
|
|
|
if (p->past_frame_type == ACTIVE_FRAME) |
|
|
|
|
p->cur_frame_type = ACTIVE_FRAME; |
|
|
|
|
else |
|
|
|
|
p->cur_frame_type = UNTRANSMITTED_FRAME; |
|
|
|
|
} |
|
|
|
|
out = (int16_t *)frame->extended_data[ch]; |
|
|
|
|
|
|
|
|
|
out = (int16_t *)frame->extended_data[ch]; |
|
|
|
|
|
|
|
|
|
if (p->cur_frame_type == ACTIVE_FRAME) { |
|
|
|
|
if (!bad_frame) |
|
|
|
|
p->erased_frames = 0; |
|
|
|
|
else if (p->erased_frames != 3) |
|
|
|
|
p->erased_frames++; |
|
|
|
|
|
|
|
|
|
ff_g723_1_inverse_quant(cur_lsp, p->prev_lsp, p->lsp_index, bad_frame); |
|
|
|
|
ff_g723_1_lsp_interpolate(lpc, cur_lsp, p->prev_lsp); |
|
|
|
|
|
|
|
|
|
/* Save the lsp_vector for the next frame */ |
|
|
|
|
memcpy(p->prev_lsp, cur_lsp, LPC_ORDER * sizeof(*p->prev_lsp)); |
|
|
|
|
|
|
|
|
|
/* Generate the excitation for the frame */ |
|
|
|
|
memcpy(p->excitation, p->prev_excitation, |
|
|
|
|
PITCH_MAX * sizeof(*p->excitation)); |
|
|
|
|
if (!p->erased_frames) { |
|
|
|
|
int16_t *vector_ptr = p->excitation + PITCH_MAX; |
|
|
|
|
|
|
|
|
|
/* Update interpolation gain memory */ |
|
|
|
|
p->interp_gain = fixed_cb_gain[(p->subframe[2].amp_index + |
|
|
|
|
p->subframe[3].amp_index) >> 1]; |
|
|
|
|
for (i = 0; i < SUBFRAMES; i++) { |
|
|
|
|
gen_fcb_excitation(vector_ptr, &p->subframe[i], p->cur_rate, |
|
|
|
|
p->pitch_lag[i >> 1], i); |
|
|
|
|
ff_g723_1_gen_acb_excitation(acb_vector, |
|
|
|
|
&p->excitation[SUBFRAME_LEN * i], |
|
|
|
|
p->pitch_lag[i >> 1], |
|
|
|
|
&p->subframe[i], p->cur_rate); |
|
|
|
|
/* Get the total excitation */ |
|
|
|
|
for (j = 0; j < SUBFRAME_LEN; j++) { |
|
|
|
|
int v = av_clip_int16(vector_ptr[j] * 2); |
|
|
|
|
vector_ptr[j] = av_clip_int16(v + acb_vector[j]); |
|
|
|
|
} |
|
|
|
|
vector_ptr += SUBFRAME_LEN; |
|
|
|
|
} |
|
|
|
|
if (p->cur_frame_type == ACTIVE_FRAME) { |
|
|
|
|
if (!bad_frame) |
|
|
|
|
p->erased_frames = 0; |
|
|
|
|
else if (p->erased_frames != 3) |
|
|
|
|
p->erased_frames++; |
|
|
|
|
|
|
|
|
|
vector_ptr = p->excitation + PITCH_MAX; |
|
|
|
|
|
|
|
|
|
p->interp_index = comp_interp_index(p, p->pitch_lag[1], |
|
|
|
|
&p->sid_gain, &p->cur_gain); |
|
|
|
|
|
|
|
|
|
/* Perform pitch postfiltering */ |
|
|
|
|
if (s->postfilter) { |
|
|
|
|
i = PITCH_MAX; |
|
|
|
|
for (j = 0; j < SUBFRAMES; i += SUBFRAME_LEN, j++) |
|
|
|
|
comp_ppf_coeff(p, i, p->pitch_lag[j >> 1], |
|
|
|
|
ppf + j, p->cur_rate); |
|
|
|
|
|
|
|
|
|
for (i = 0, j = 0; j < SUBFRAMES; i += SUBFRAME_LEN, j++) |
|
|
|
|
ff_acelp_weighted_vector_sum(p->audio + LPC_ORDER + i, |
|
|
|
|
vector_ptr + i, |
|
|
|
|
vector_ptr + i + ppf[j].index, |
|
|
|
|
ppf[j].sc_gain, |
|
|
|
|
ppf[j].opt_gain, |
|
|
|
|
1 << 14, 15, SUBFRAME_LEN); |
|
|
|
|
} else { |
|
|
|
|
audio = vector_ptr - LPC_ORDER; |
|
|
|
|
} |
|
|
|
|
ff_g723_1_inverse_quant(cur_lsp, p->prev_lsp, p->lsp_index, bad_frame); |
|
|
|
|
ff_g723_1_lsp_interpolate(lpc, cur_lsp, p->prev_lsp); |
|
|
|
|
|
|
|
|
|
/* Save the excitation for the next frame */ |
|
|
|
|
memcpy(p->prev_excitation, p->excitation + FRAME_LEN, |
|
|
|
|
/* Save the lsp_vector for the next frame */ |
|
|
|
|
memcpy(p->prev_lsp, cur_lsp, LPC_ORDER * sizeof(*p->prev_lsp)); |
|
|
|
|
|
|
|
|
|
/* Generate the excitation for the frame */ |
|
|
|
|
memcpy(p->excitation, p->prev_excitation, |
|
|
|
|
PITCH_MAX * sizeof(*p->excitation)); |
|
|
|
|
} else { |
|
|
|
|
p->interp_gain = (p->interp_gain * 3 + 2) >> 2; |
|
|
|
|
if (p->erased_frames == 3) { |
|
|
|
|
/* Mute output */ |
|
|
|
|
memset(p->excitation, 0, |
|
|
|
|
(FRAME_LEN + PITCH_MAX) * sizeof(*p->excitation)); |
|
|
|
|
memset(p->prev_excitation, 0, |
|
|
|
|
PITCH_MAX * sizeof(*p->excitation)); |
|
|
|
|
memset(frame->data[0], 0, |
|
|
|
|
(FRAME_LEN + LPC_ORDER) * sizeof(int16_t)); |
|
|
|
|
} else { |
|
|
|
|
int16_t *buf = p->audio + LPC_ORDER; |
|
|
|
|
if (!p->erased_frames) { |
|
|
|
|
int16_t *vector_ptr = p->excitation + PITCH_MAX; |
|
|
|
|
|
|
|
|
|
/* Update interpolation gain memory */ |
|
|
|
|
p->interp_gain = fixed_cb_gain[(p->subframe[2].amp_index + |
|
|
|
|
p->subframe[3].amp_index) >> 1]; |
|
|
|
|
for (i = 0; i < SUBFRAMES; i++) { |
|
|
|
|
gen_fcb_excitation(vector_ptr, &p->subframe[i], p->cur_rate, |
|
|
|
|
p->pitch_lag[i >> 1], i); |
|
|
|
|
ff_g723_1_gen_acb_excitation(acb_vector, |
|
|
|
|
&p->excitation[SUBFRAME_LEN * i], |
|
|
|
|
p->pitch_lag[i >> 1], |
|
|
|
|
&p->subframe[i], p->cur_rate); |
|
|
|
|
/* Get the total excitation */ |
|
|
|
|
for (j = 0; j < SUBFRAME_LEN; j++) { |
|
|
|
|
int v = av_clip_int16(vector_ptr[j] * 2); |
|
|
|
|
vector_ptr[j] = av_clip_int16(v + acb_vector[j]); |
|
|
|
|
} |
|
|
|
|
vector_ptr += SUBFRAME_LEN; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
/* Regenerate frame */ |
|
|
|
|
residual_interp(p->excitation, buf, p->interp_index, |
|
|
|
|
p->interp_gain, &p->random_seed); |
|
|
|
|
vector_ptr = p->excitation + PITCH_MAX; |
|
|
|
|
|
|
|
|
|
p->interp_index = comp_interp_index(p, p->pitch_lag[1], |
|
|
|
|
&p->sid_gain, &p->cur_gain); |
|
|
|
|
|
|
|
|
|
/* Perform pitch postfiltering */ |
|
|
|
|
if (s->postfilter) { |
|
|
|
|
i = PITCH_MAX; |
|
|
|
|
for (j = 0; j < SUBFRAMES; i += SUBFRAME_LEN, j++) |
|
|
|
|
comp_ppf_coeff(p, i, p->pitch_lag[j >> 1], |
|
|
|
|
ppf + j, p->cur_rate); |
|
|
|
|
|
|
|
|
|
for (i = 0, j = 0; j < SUBFRAMES; i += SUBFRAME_LEN, j++) |
|
|
|
|
ff_acelp_weighted_vector_sum(p->audio + LPC_ORDER + i, |
|
|
|
|
vector_ptr + i, |
|
|
|
|
vector_ptr + i + ppf[j].index, |
|
|
|
|
ppf[j].sc_gain, |
|
|
|
|
ppf[j].opt_gain, |
|
|
|
|
1 << 14, 15, SUBFRAME_LEN); |
|
|
|
|
} else { |
|
|
|
|
audio = vector_ptr - LPC_ORDER; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
/* Save the excitation for the next frame */ |
|
|
|
|
memcpy(p->prev_excitation, buf + (FRAME_LEN - PITCH_MAX), |
|
|
|
|
memcpy(p->prev_excitation, p->excitation + FRAME_LEN, |
|
|
|
|
PITCH_MAX * sizeof(*p->excitation)); |
|
|
|
|
} else { |
|
|
|
|
p->interp_gain = (p->interp_gain * 3 + 2) >> 2; |
|
|
|
|
if (p->erased_frames == 3) { |
|
|
|
|
/* Mute output */ |
|
|
|
|
memset(p->excitation, 0, |
|
|
|
|
(FRAME_LEN + PITCH_MAX) * sizeof(*p->excitation)); |
|
|
|
|
memset(p->prev_excitation, 0, |
|
|
|
|
PITCH_MAX * sizeof(*p->excitation)); |
|
|
|
|
memset(frame->data[0], 0, |
|
|
|
|
(FRAME_LEN + LPC_ORDER) * sizeof(int16_t)); |
|
|
|
|
} else { |
|
|
|
|
int16_t *buf = p->audio + LPC_ORDER; |
|
|
|
|
|
|
|
|
|
/* Regenerate frame */ |
|
|
|
|
residual_interp(p->excitation, buf, p->interp_index, |
|
|
|
|
p->interp_gain, &p->random_seed); |
|
|
|
|
|
|
|
|
|
/* Save the excitation for the next frame */ |
|
|
|
|
memcpy(p->prev_excitation, buf + (FRAME_LEN - PITCH_MAX), |
|
|
|
|
PITCH_MAX * sizeof(*p->excitation)); |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
p->cng_random_seed = CNG_RANDOM_SEED; |
|
|
|
|
} else { |
|
|
|
|
if (p->cur_frame_type == SID_FRAME) { |
|
|
|
|
p->sid_gain = sid_gain_to_lsp_index(p->subframe[0].amp_index); |
|
|
|
|
ff_g723_1_inverse_quant(p->sid_lsp, p->prev_lsp, p->lsp_index, 0); |
|
|
|
|
} else if (p->past_frame_type == ACTIVE_FRAME) { |
|
|
|
|
p->sid_gain = estimate_sid_gain(p); |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
p->cng_random_seed = CNG_RANDOM_SEED; |
|
|
|
|
} else { |
|
|
|
|
if (p->cur_frame_type == SID_FRAME) { |
|
|
|
|
p->sid_gain = sid_gain_to_lsp_index(p->subframe[0].amp_index); |
|
|
|
|
ff_g723_1_inverse_quant(p->sid_lsp, p->prev_lsp, p->lsp_index, 0); |
|
|
|
|
} else if (p->past_frame_type == ACTIVE_FRAME) { |
|
|
|
|
p->sid_gain = estimate_sid_gain(p); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
if (p->past_frame_type == ACTIVE_FRAME) |
|
|
|
|
p->cur_gain = p->sid_gain; |
|
|
|
|
else |
|
|
|
|
p->cur_gain = (p->cur_gain * 7 + p->sid_gain) >> 3; |
|
|
|
|
generate_noise(p); |
|
|
|
|
ff_g723_1_lsp_interpolate(lpc, p->sid_lsp, p->prev_lsp); |
|
|
|
|
/* Save the lsp_vector for the next frame */ |
|
|
|
|
memcpy(p->prev_lsp, p->sid_lsp, LPC_ORDER * sizeof(*p->prev_lsp)); |
|
|
|
|
} |
|
|
|
|
if (p->past_frame_type == ACTIVE_FRAME) |
|
|
|
|
p->cur_gain = p->sid_gain; |
|
|
|
|
else |
|
|
|
|
p->cur_gain = (p->cur_gain * 7 + p->sid_gain) >> 3; |
|
|
|
|
generate_noise(p); |
|
|
|
|
ff_g723_1_lsp_interpolate(lpc, p->sid_lsp, p->prev_lsp); |
|
|
|
|
/* Save the lsp_vector for the next frame */ |
|
|
|
|
memcpy(p->prev_lsp, p->sid_lsp, LPC_ORDER * sizeof(*p->prev_lsp)); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
p->past_frame_type = p->cur_frame_type; |
|
|
|
|
p->past_frame_type = p->cur_frame_type; |
|
|
|
|
|
|
|
|
|
memcpy(p->audio, p->synth_mem, LPC_ORDER * sizeof(*p->audio)); |
|
|
|
|
for (i = LPC_ORDER, j = 0; j < SUBFRAMES; i += SUBFRAME_LEN, j++) |
|
|
|
|
ff_celp_lp_synthesis_filter(p->audio + i, &lpc[j * LPC_ORDER], |
|
|
|
|
audio + i, SUBFRAME_LEN, LPC_ORDER, |
|
|
|
|
0, 1, 1 << 12); |
|
|
|
|
memcpy(p->synth_mem, p->audio + FRAME_LEN, LPC_ORDER * sizeof(*p->audio)); |
|
|
|
|
memcpy(p->audio, p->synth_mem, LPC_ORDER * sizeof(*p->audio)); |
|
|
|
|
for (i = LPC_ORDER, j = 0; j < SUBFRAMES; i += SUBFRAME_LEN, j++) |
|
|
|
|
ff_celp_lp_synthesis_filter(p->audio + i, &lpc[j * LPC_ORDER], |
|
|
|
|
audio + i, SUBFRAME_LEN, LPC_ORDER, |
|
|
|
|
0, 1, 1 << 12); |
|
|
|
|
memcpy(p->synth_mem, p->audio + FRAME_LEN, LPC_ORDER * sizeof(*p->audio)); |
|
|
|
|
|
|
|
|
|
if (s->postfilter) { |
|
|
|
|
formant_postfilter(p, lpc, p->audio, out); |
|
|
|
|
} else { // if output is not postfiltered it should be scaled by 2
|
|
|
|
|
for (i = 0; i < FRAME_LEN; i++) |
|
|
|
|
out[i] = av_clip_int16(p->audio[LPC_ORDER + i] << 1); |
|
|
|
|
} |
|
|
|
|
if (s->postfilter) { |
|
|
|
|
formant_postfilter(p, lpc, p->audio, out); |
|
|
|
|
} else { // if output is not postfiltered it should be scaled by 2
|
|
|
|
|
for (i = 0; i < FRAME_LEN; i++) |
|
|
|
|
out[i] = av_clip_int16(p->audio[LPC_ORDER + i] << 1); |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
*got_frame_ptr = 1; |
|
|
|
|