| @@ -34,6 +34,7 @@ | |||||
| #include "g729.h" | #include "g729.h" | ||||
| #include "lsp.h" | #include "lsp.h" | ||||
| #include "celp_math.h" | #include "celp_math.h" | ||||
| #include "celp_filters.h" | |||||
| #include "acelp_filters.h" | #include "acelp_filters.h" | ||||
| #include "acelp_pitch_delay.h" | #include "acelp_pitch_delay.h" | ||||
| #include "acelp_vectors.h" | #include "acelp_vectors.h" | ||||
| @@ -57,6 +58,9 @@ | |||||
| */ | */ | ||||
| #define LSFQ_DIFF_MIN 321 | #define LSFQ_DIFF_MIN 321 | ||||
| /// interpolation filter length | |||||
| #define INTERPOL_LEN 11 | |||||
| /** | /** | ||||
| * minimum gain pitch value (3.8, Equation 47) | * minimum gain pitch value (3.8, Equation 47) | ||||
| * 0.2 in (1.14) | * 0.2 in (1.14) | ||||
| @@ -111,6 +115,9 @@ typedef struct { | |||||
| int16_t quant_energy[4]; ///< (5.10) past quantized energy | int16_t quant_energy[4]; ///< (5.10) past quantized energy | ||||
| /// previous speech data for LP synthesis filter | |||||
| int16_t syn_filter_data[10]; | |||||
| /// (1.14) pitch gain of current and five previous subframes | /// (1.14) pitch gain of current and five previous subframes | ||||
| int16_t past_gain_pitch[6]; | int16_t past_gain_pitch[6]; | ||||
| @@ -283,6 +290,8 @@ static int decode_frame(AVCodecContext *avctx, void *data, int *data_size, | |||||
| int pitch_delay_int; // pitch delay, integer part | int pitch_delay_int; // pitch delay, integer part | ||||
| int pitch_delay_3x; // pitch delay, multiplied by 3 | int pitch_delay_3x; // pitch delay, multiplied by 3 | ||||
| int16_t fc[SUBFRAME_SIZE]; // fixed-codebook vector | int16_t fc[SUBFRAME_SIZE]; // fixed-codebook vector | ||||
| int16_t synth[SUBFRAME_SIZE+10]; // fixed-codebook vector | |||||
| int j; | |||||
| int is_periodic = 0; // whether one of the subframes is declared as periodic or not | int is_periodic = 0; // whether one of the subframes is declared as periodic or not | ||||
| if (*data_size < SUBFRAME_SIZE << 2) { | if (*data_size < SUBFRAME_SIZE << 2) { | ||||
| @@ -476,10 +485,42 @@ static int decode_frame(AVCodecContext *avctx, void *data, int *data_size, | |||||
| ( ctx->was_periodic && frame_erasure) ? 0 : ctx->past_gain_code[0], | ( ctx->was_periodic && frame_erasure) ? 0 : ctx->past_gain_code[0], | ||||
| 1 << 13, 14, SUBFRAME_SIZE); | 1 << 13, 14, SUBFRAME_SIZE); | ||||
| memcpy(synth, ctx->syn_filter_data, 10 * sizeof(int16_t)); | |||||
| /* Temporary synth buffer is required since filter needs additional space at top of buffer and, thus, | |||||
| synthesis can not be done directly to output buffer. This buffer will be reused by future | |||||
| postprocessing filters. */ | |||||
| if (ff_celp_lp_synthesis_filter( | |||||
| synth+10, | |||||
| &lp[i][1], | |||||
| ctx->exc + i * SUBFRAME_SIZE, | |||||
| SUBFRAME_SIZE, | |||||
| 10, | |||||
| 1, | |||||
| 0x800)) { | |||||
| /* Overflow occured, downscale excitation signal... */ | |||||
| for (j = 0; j < 2 * SUBFRAME_SIZE + PITCH_DELAY_MAX + INTERPOL_LEN; j++) | |||||
| ctx->exc_base[j] >>= 2; | |||||
| ff_celp_lp_synthesis_filter( | |||||
| synth+10, | |||||
| &lp[i][1], | |||||
| ctx->exc + i * SUBFRAME_SIZE, | |||||
| SUBFRAME_SIZE, | |||||
| 10, | |||||
| 0, | |||||
| 0x800); | |||||
| } | |||||
| /* Save data (without postfilter) for use in next subframe. */ | |||||
| memcpy(ctx->syn_filter_data, synth+SUBFRAME_SIZE, 10 * sizeof(int16_t)); | |||||
| if (frame_erasure) | if (frame_erasure) | ||||
| ctx->pitch_delay_int_prev = FFMIN(ctx->pitch_delay_int_prev + 1, PITCH_DELAY_MAX); | ctx->pitch_delay_int_prev = FFMIN(ctx->pitch_delay_int_prev + 1, PITCH_DELAY_MAX); | ||||
| else | else | ||||
| ctx->pitch_delay_int_prev = pitch_delay_int; | ctx->pitch_delay_int_prev = pitch_delay_int; | ||||
| /* Dumb. Will be replaced by high-pass filter */ | |||||
| memcpy(out_frame + i * SUBFRAME_SIZE, synth + 10, SUBFRAME_SIZE * sizeof(int16_t)); | |||||
| } | } | ||||
| ctx->was_periodic = is_periodic; | ctx->was_periodic = is_periodic; | ||||