|
|
@ -111,7 +111,7 @@ static av_cold int amrwb_decode_init(AVCodecContext *avctx) |
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
/**
|
|
|
|
* Decode the frame header in the "MIME/storage" format. This format |
|
|
|
* Decode the frame header in the "MIME/storage" format. This format |
|
|
|
* is simpler and does not carry the auxiliary information of the frame |
|
|
|
* is simpler and does not carry the auxiliary frame information. |
|
|
|
* |
|
|
|
* |
|
|
|
* @param[in] ctx The Context |
|
|
|
* @param[in] ctx The Context |
|
|
|
* @param[in] buf Pointer to the input buffer |
|
|
|
* @param[in] buf Pointer to the input buffer |
|
|
@ -133,7 +133,7 @@ static int decode_mime_header(AMRWBContext *ctx, const uint8_t *buf) |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
/**
|
|
|
|
* Decodes quantized ISF vectors using 36-bit indexes (6K60 mode only) |
|
|
|
* Decode quantized ISF vectors using 36-bit indexes (6K60 mode only). |
|
|
|
* |
|
|
|
* |
|
|
|
* @param[in] ind Array of 5 indexes |
|
|
|
* @param[in] ind Array of 5 indexes |
|
|
|
* @param[out] isf_q Buffer for isf_q[LP_ORDER] |
|
|
|
* @param[out] isf_q Buffer for isf_q[LP_ORDER] |
|
|
@ -160,7 +160,7 @@ static void decode_isf_indices_36b(uint16_t *ind, float *isf_q) |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
/**
|
|
|
|
* Decodes quantized ISF vectors using 46-bit indexes (except 6K60 mode) |
|
|
|
* Decode quantized ISF vectors using 46-bit indexes (except 6K60 mode). |
|
|
|
* |
|
|
|
* |
|
|
|
* @param[in] ind Array of 7 indexes |
|
|
|
* @param[in] ind Array of 7 indexes |
|
|
|
* @param[out] isf_q Buffer for isf_q[LP_ORDER] |
|
|
|
* @param[out] isf_q Buffer for isf_q[LP_ORDER] |
|
|
@ -193,8 +193,8 @@ static void decode_isf_indices_46b(uint16_t *ind, float *isf_q) |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
/**
|
|
|
|
* Apply mean and past ISF values using the prediction factor |
|
|
|
* Apply mean and past ISF values using the prediction factor. |
|
|
|
* Updates past ISF vector |
|
|
|
* Updates past ISF vector. |
|
|
|
* |
|
|
|
* |
|
|
|
* @param[in,out] isf_q Current quantized ISF |
|
|
|
* @param[in,out] isf_q Current quantized ISF |
|
|
|
* @param[in,out] isf_past Past quantized ISF |
|
|
|
* @param[in,out] isf_past Past quantized ISF |
|
|
@ -215,7 +215,7 @@ static void isf_add_mean_and_past(float *isf_q, float *isf_past) |
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
/**
|
|
|
|
* Interpolate the fourth ISP vector from current and past frames |
|
|
|
* Interpolate the fourth ISP vector from current and past frames |
|
|
|
* to obtain a ISP vector for each subframe |
|
|
|
* to obtain an ISP vector for each subframe. |
|
|
|
* |
|
|
|
* |
|
|
|
* @param[in,out] isp_q ISPs for each subframe |
|
|
|
* @param[in,out] isp_q ISPs for each subframe |
|
|
|
* @param[in] isp4_past Past ISP for subframe 4 |
|
|
|
* @param[in] isp4_past Past ISP for subframe 4 |
|
|
@ -232,9 +232,9 @@ static void interpolate_isp(double isp_q[4][LP_ORDER], const double *isp4_past) |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
/**
|
|
|
|
* Decode an adaptive codebook index into pitch lag (except 6k60, 8k85 modes) |
|
|
|
* Decode an adaptive codebook index into pitch lag (except 6k60, 8k85 modes). |
|
|
|
* Calculate integer lag and fractional lag always using 1/4 resolution |
|
|
|
* Calculate integer lag and fractional lag always using 1/4 resolution. |
|
|
|
* In 1st and 3rd subframes the index is relative to last subframe integer lag |
|
|
|
* In 1st and 3rd subframes the index is relative to last subframe integer lag. |
|
|
|
* |
|
|
|
* |
|
|
|
* @param[out] lag_int Decoded integer pitch lag |
|
|
|
* @param[out] lag_int Decoded integer pitch lag |
|
|
|
* @param[out] lag_frac Decoded fractional pitch lag |
|
|
|
* @param[out] lag_frac Decoded fractional pitch lag |
|
|
@ -271,9 +271,9 @@ static void decode_pitch_lag_high(int *lag_int, int *lag_frac, int pitch_index, |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
/**
|
|
|
|
* Decode a adaptive codebook index into pitch lag for 8k85 and 6k60 modes |
|
|
|
* Decode an adaptive codebook index into pitch lag for 8k85 and 6k60 modes. |
|
|
|
* Description is analogous to decode_pitch_lag_high, but in 6k60 relative |
|
|
|
* The description is analogous to decode_pitch_lag_high, but in 6k60 the |
|
|
|
* index is used for all subframes except the first |
|
|
|
* relative index is used for all subframes except the first. |
|
|
|
*/ |
|
|
|
*/ |
|
|
|
static void decode_pitch_lag_low(int *lag_int, int *lag_frac, int pitch_index, |
|
|
|
static void decode_pitch_lag_low(int *lag_int, int *lag_frac, int pitch_index, |
|
|
|
uint8_t *base_lag_int, int subframe, enum Mode mode) |
|
|
|
uint8_t *base_lag_int, int subframe, enum Mode mode) |
|
|
@ -298,7 +298,7 @@ static void decode_pitch_lag_low(int *lag_int, int *lag_frac, int pitch_index, |
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
/**
|
|
|
|
* Find the pitch vector by interpolating the past excitation at the |
|
|
|
* Find the pitch vector by interpolating the past excitation at the |
|
|
|
* pitch delay, which is obtained in this function |
|
|
|
* pitch delay, which is obtained in this function. |
|
|
|
* |
|
|
|
* |
|
|
|
* @param[in,out] ctx The context |
|
|
|
* @param[in,out] ctx The context |
|
|
|
* @param[in] amr_subframe Current subframe data |
|
|
|
* @param[in] amr_subframe Current subframe data |
|
|
@ -351,10 +351,10 @@ static void decode_pitch_vector(AMRWBContext *ctx, |
|
|
|
/**
|
|
|
|
/**
|
|
|
|
* The next six functions decode_[i]p_track decode exactly i pulses |
|
|
|
* The next six functions decode_[i]p_track decode exactly i pulses |
|
|
|
* positions and amplitudes (-1 or 1) in a subframe track using |
|
|
|
* positions and amplitudes (-1 or 1) in a subframe track using |
|
|
|
* an encoded pulse indexing (TS 26.190 section 5.8.2) |
|
|
|
* an encoded pulse indexing (TS 26.190 section 5.8.2). |
|
|
|
* |
|
|
|
* |
|
|
|
* The results are given in out[], in which a negative number means |
|
|
|
* The results are given in out[], in which a negative number means |
|
|
|
* amplitude -1 and vice versa (i.e., ampl(x) = x / abs(x) ) |
|
|
|
* amplitude -1 and vice versa (i.e., ampl(x) = x / abs(x) ). |
|
|
|
* |
|
|
|
* |
|
|
|
* @param[out] out Output buffer (writes i elements) |
|
|
|
* @param[out] out Output buffer (writes i elements) |
|
|
|
* @param[in] code Pulse index (no. of bits varies, see below) |
|
|
|
* @param[in] code Pulse index (no. of bits varies, see below) |
|
|
@ -470,7 +470,7 @@ static void decode_6p_track(int *out, int code, int m, int off) ///code: 6m-2 bi |
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
/**
|
|
|
|
* Decode the algebraic codebook index to pulse positions and signs, |
|
|
|
* Decode the algebraic codebook index to pulse positions and signs, |
|
|
|
* then construct the algebraic codebook vector |
|
|
|
* then construct the algebraic codebook vector. |
|
|
|
* |
|
|
|
* |
|
|
|
* @param[out] fixed_vector Buffer for the fixed codebook excitation |
|
|
|
* @param[out] fixed_vector Buffer for the fixed codebook excitation |
|
|
|
* @param[in] pulse_hi MSBs part of the pulse index array (higher modes only) |
|
|
|
* @param[in] pulse_hi MSBs part of the pulse index array (higher modes only) |
|
|
@ -541,7 +541,7 @@ static void decode_fixed_vector(float *fixed_vector, const uint16_t *pulse_hi, |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
/**
|
|
|
|
* Decode pitch gain and fixed gain correction factor |
|
|
|
* Decode pitch gain and fixed gain correction factor. |
|
|
|
* |
|
|
|
* |
|
|
|
* @param[in] vq_gain Vector-quantized index for gains |
|
|
|
* @param[in] vq_gain Vector-quantized index for gains |
|
|
|
* @param[in] mode Mode of the current frame |
|
|
|
* @param[in] mode Mode of the current frame |
|
|
@ -559,7 +559,7 @@ static void decode_gains(const uint8_t vq_gain, const enum Mode mode, |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
/**
|
|
|
|
* Apply pitch sharpening filters to the fixed codebook vector |
|
|
|
* Apply pitch sharpening filters to the fixed codebook vector. |
|
|
|
* |
|
|
|
* |
|
|
|
* @param[in] ctx The context |
|
|
|
* @param[in] ctx The context |
|
|
|
* @param[in,out] fixed_vector Fixed codebook excitation |
|
|
|
* @param[in,out] fixed_vector Fixed codebook excitation |
|
|
@ -580,7 +580,7 @@ static void pitch_sharpening(AMRWBContext *ctx, float *fixed_vector) |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
/**
|
|
|
|
* Calculate the voicing factor (-1.0 = unvoiced to 1.0 = voiced) |
|
|
|
* Calculate the voicing factor (-1.0 = unvoiced to 1.0 = voiced). |
|
|
|
* |
|
|
|
* |
|
|
|
* @param[in] p_vector, f_vector Pitch and fixed excitation vectors |
|
|
|
* @param[in] p_vector, f_vector Pitch and fixed excitation vectors |
|
|
|
* @param[in] p_gain, f_gain Pitch and fixed gains |
|
|
|
* @param[in] p_gain, f_gain Pitch and fixed gains |
|
|
@ -599,8 +599,8 @@ static float voice_factor(float *p_vector, float p_gain, |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
/**
|
|
|
|
* Reduce fixed vector sparseness by smoothing with one of three IR filters |
|
|
|
* Reduce fixed vector sparseness by smoothing with one of three IR filters, |
|
|
|
* Also known as "adaptive phase dispersion" |
|
|
|
* also known as "adaptive phase dispersion". |
|
|
|
* |
|
|
|
* |
|
|
|
* @param[in] ctx The context |
|
|
|
* @param[in] ctx The context |
|
|
|
* @param[in,out] fixed_vector Unfiltered fixed vector |
|
|
|
* @param[in,out] fixed_vector Unfiltered fixed vector |
|
|
@ -670,7 +670,7 @@ static float *anti_sparseness(AMRWBContext *ctx, |
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
/**
|
|
|
|
* Calculate a stability factor {teta} based on distance between |
|
|
|
* Calculate a stability factor {teta} based on distance between |
|
|
|
* current and past isf. A value of 1 shows maximum signal stability |
|
|
|
* current and past isf. A value of 1 shows maximum signal stability. |
|
|
|
*/ |
|
|
|
*/ |
|
|
|
static float stability_factor(const float *isf, const float *isf_past) |
|
|
|
static float stability_factor(const float *isf, const float *isf_past) |
|
|
|
{ |
|
|
|
{ |
|
|
@ -687,7 +687,7 @@ static float stability_factor(const float *isf, const float *isf_past) |
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
/**
|
|
|
|
* Apply a non-linear fixed gain smoothing in order to reduce |
|
|
|
* Apply a non-linear fixed gain smoothing in order to reduce |
|
|
|
* fluctuation in the energy of excitation |
|
|
|
* fluctuation in the energy of excitation. |
|
|
|
* |
|
|
|
* |
|
|
|
* @param[in] fixed_gain Unsmoothed fixed gain |
|
|
|
* @param[in] fixed_gain Unsmoothed fixed gain |
|
|
|
* @param[in,out] prev_tr_gain Previous threshold gain (updated) |
|
|
|
* @param[in,out] prev_tr_gain Previous threshold gain (updated) |
|
|
@ -718,7 +718,7 @@ static float noise_enhancer(float fixed_gain, float *prev_tr_gain, |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
/**
|
|
|
|
* Filter the fixed_vector to emphasize the higher frequencies |
|
|
|
* Filter the fixed_vector to emphasize the higher frequencies. |
|
|
|
* |
|
|
|
* |
|
|
|
* @param[in,out] fixed_vector Fixed codebook vector |
|
|
|
* @param[in,out] fixed_vector Fixed codebook vector |
|
|
|
* @param[in] voice_fac Frame voicing factor |
|
|
|
* @param[in] voice_fac Frame voicing factor |
|
|
@ -742,7 +742,7 @@ static void pitch_enhancer(float *fixed_vector, float voice_fac) |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
/**
|
|
|
|
* Conduct 16th order linear predictive coding synthesis from excitation |
|
|
|
* Conduct 16th order linear predictive coding synthesis from excitation. |
|
|
|
* |
|
|
|
* |
|
|
|
* @param[in] ctx Pointer to the AMRWBContext |
|
|
|
* @param[in] ctx Pointer to the AMRWBContext |
|
|
|
* @param[in] lpc Pointer to the LPC coefficients |
|
|
|
* @param[in] lpc Pointer to the LPC coefficients |
|
|
@ -802,7 +802,7 @@ static void de_emphasis(float *out, float *in, float m, float mem[1]) |
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
/**
|
|
|
|
* Upsample a signal by 5/4 ratio (from 12.8kHz to 16kHz) using |
|
|
|
* Upsample a signal by 5/4 ratio (from 12.8kHz to 16kHz) using |
|
|
|
* a FIR interpolation filter. Uses past data from before *in address |
|
|
|
* a FIR interpolation filter. Uses past data from before *in address. |
|
|
|
* |
|
|
|
* |
|
|
|
* @param[out] out Buffer for interpolated signal |
|
|
|
* @param[out] out Buffer for interpolated signal |
|
|
|
* @param[in] in Current signal data (length 0.8*o_size) |
|
|
|
* @param[in] in Current signal data (length 0.8*o_size) |
|
|
@ -832,7 +832,7 @@ static void upsample_5_4(float *out, const float *in, int o_size) |
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
/**
|
|
|
|
* Calculate the high-band gain based on encoded index (23k85 mode) or |
|
|
|
* Calculate the high-band gain based on encoded index (23k85 mode) or |
|
|
|
* on the low-band speech signal and the Voice Activity Detection flag |
|
|
|
* on the low-band speech signal and the Voice Activity Detection flag. |
|
|
|
* |
|
|
|
* |
|
|
|
* @param[in] ctx The context |
|
|
|
* @param[in] ctx The context |
|
|
|
* @param[in] synth LB speech synthesis at 12.8k |
|
|
|
* @param[in] synth LB speech synthesis at 12.8k |
|
|
@ -857,7 +857,7 @@ static float find_hb_gain(AMRWBContext *ctx, const float *synth, |
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
/**
|
|
|
|
* Generate the high-band excitation with the same energy from the lower |
|
|
|
* Generate the high-band excitation with the same energy from the lower |
|
|
|
* one and scaled by the given gain |
|
|
|
* one and scaled by the given gain. |
|
|
|
* |
|
|
|
* |
|
|
|
* @param[in] ctx The context |
|
|
|
* @param[in] ctx The context |
|
|
|
* @param[out] hb_exc Buffer for the excitation |
|
|
|
* @param[out] hb_exc Buffer for the excitation |
|
|
@ -880,7 +880,7 @@ static void scaled_hb_excitation(AMRWBContext *ctx, float *hb_exc, |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
/**
|
|
|
|
* Calculate the auto-correlation for the ISF difference vector |
|
|
|
* Calculate the auto-correlation for the ISF difference vector. |
|
|
|
*/ |
|
|
|
*/ |
|
|
|
static float auto_correlation(float *diff_isf, float mean, int lag) |
|
|
|
static float auto_correlation(float *diff_isf, float mean, int lag) |
|
|
|
{ |
|
|
|
{ |
|
|
@ -896,7 +896,7 @@ static float auto_correlation(float *diff_isf, float mean, int lag) |
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
/**
|
|
|
|
* Extrapolate a ISF vector to the 16kHz range (20th order LP) |
|
|
|
* Extrapolate a ISF vector to the 16kHz range (20th order LP) |
|
|
|
* used at mode 6k60 LP filter for the high frequency band |
|
|
|
* used at mode 6k60 LP filter for the high frequency band. |
|
|
|
* |
|
|
|
* |
|
|
|
* @param[out] out Buffer for extrapolated isf |
|
|
|
* @param[out] out Buffer for extrapolated isf |
|
|
|
* @param[in] isf Input isf vector |
|
|
|
* @param[in] isf Input isf vector |
|
|
@ -981,7 +981,7 @@ static void lpc_weighting(float *out, const float *lpc, float gamma, int size) |
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
/**
|
|
|
|
* Conduct 20th order linear predictive coding synthesis for the high |
|
|
|
* Conduct 20th order linear predictive coding synthesis for the high |
|
|
|
* frequency band excitation at 16kHz |
|
|
|
* frequency band excitation at 16kHz. |
|
|
|
* |
|
|
|
* |
|
|
|
* @param[in] ctx The context |
|
|
|
* @param[in] ctx The context |
|
|
|
* @param[in] subframe Current subframe index (0 to 3) |
|
|
|
* @param[in] subframe Current subframe index (0 to 3) |
|
|
@ -1019,8 +1019,8 @@ static void hb_synthesis(AMRWBContext *ctx, int subframe, float *samples, |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
/**
|
|
|
|
* Apply to high-band samples a 15th order filter |
|
|
|
* Apply a 15th order filter to high-band samples. |
|
|
|
* The filter characteristic depends on the given coefficients |
|
|
|
* The filter characteristic depends on the given coefficients. |
|
|
|
* |
|
|
|
* |
|
|
|
* @param[out] out Buffer for filtered output |
|
|
|
* @param[out] out Buffer for filtered output |
|
|
|
* @param[in] fir_coef Filter coefficients |
|
|
|
* @param[in] fir_coef Filter coefficients |
|
|
@ -1048,7 +1048,7 @@ static void hb_fir_filter(float *out, const float fir_coef[HB_FIR_SIZE + 1], |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
/**
|
|
|
|
* Update context state before the next subframe |
|
|
|
* Update context state before the next subframe. |
|
|
|
*/ |
|
|
|
*/ |
|
|
|
static void update_sub_state(AMRWBContext *ctx) |
|
|
|
static void update_sub_state(AMRWBContext *ctx) |
|
|
|
{ |
|
|
|
{ |
|
|
|