Hi, ? >> + >> +/** >> + * Reconstructs LPC coefficients from the line spectral pair >> frequencies. >> + * >> + * TIA/EIA/IS-733 2.4.3.3.5 >> + */ >> +void qcelp_lspf2lpc(const float *lspf, float *lpc); >> + >> +#endif /* AVCODEC_QCELP_H */ > > >> Index: libavcodec/qcelpdata.h >> =================================================================== >> --- libavcodec/qcelpdata.h (revision 15955) >> +++ libavcodec/qcelpdata.h (working copy) >> @@ -34,6 +34,37 @@ >> #include "libavutil/common.h" >> >> /** >> + * QCELP unpacked data frame >> + */ >> +typedef struct { >> +/// @defgroup qcelp_codebook_parameters QCELP excitation codebook >> parameters >> +/// @{ >> + uint8_t cbsign[16]; ///!< sign of the codebook gain for each >> codebook subframe >> + uint8_t cbgain[16]; ///!< unsigned codebook gain for each >> codebook subframe >> + uint8_t cindex[16]; ///!< codebook index for each codebook >> subframe >> +/// @} >> + >> +/// @defgroup qcelp_pitch_parameters QCELP pitch prediction >> parameters >> +/// @{ >> + uint8_t plag[4]; ///!< pitch lag for each pitch subframe >> + uint8_t pfrac[4]; ///!< fractional pitch lag for each pitch >> subframe >> + uint8_t pgain[4]; ///!< pitch gain for each pitch subframe >> +/// @} >> + >> + /** >> + * line spectral pair frequencies (LSP) for RATE_OCTAVE, >> + * line spectral pair frequencies grouped into five vectors >> + * of dimension two (LSPV) for other rates >> + */ >> + uint8_t lspv[10]; >> + > > ok > > >> + /** >> + * reserved bits on all bitrate but bitrate 1/2 packets > > this is unclear, field that is on all but ... , vs. field that > exists always but > is reserved on all but ..... > is "reserved bits only set for bitrate 1, 1/4 and 1/8" better ? [...] >> Index: libavcodec/qcelpdec.c >> =================================================================== >> --- libavcodec/qcelpdec.c (revision 15955) >> +++ libavcodec/qcelpdec.c (working copy) >> @@ -40,6 +40,27 @@ >> #undef NDEBUG >> #include <assert.h> >> >> +typedef struct { >> + GetBitContext gb; >> + qcelp_packet_rate bitrate; >> + QCELPFrame frame; /*!< unpacked data >> frame */ >> + uint8_t erasure_count; >> + uint8_t octave_count; /*!< count the >> consecutive RATE_OCTAVE frames */ >> + float prev_lspf[10]; >> + float predictor_lspf[10]; /*!< LSP predictor, > > ok > > >> + only use for >> RATE_OCTAVE and I_F_Q */ >> + float pitch_synthesis_filter_mem[303]; >> + float pitch_pre_filter_mem[303]; > >> + float rnd_fir_filter_mem[180]; > > is it correct to use the random values from the last frame? I > faintly remember > seeing that this wasnt done in previous patches ... just asking to > make sure > no bug slipt in ... it was not up to specs. From TIA 733 2.4.8.1.2 rnd(n) is band-pass filtered before being scaled by the appropriate codebook gain. The filter states are saved from the last Rate 1/4 frame that used the filter. The sequence, rnd_bpf(n), is generated by band-pass filtering rnd(n) with the FIR filter described in Table 2.4.8.1.2-1. [...] >> @@ -381,6 +479. >> * > > >> @@ -432,6 +588,46 @@ >> return -1; >> } >> > >> +/* >> + * Determine the bitrate from the frame size and/or the first byte >> of the frame. > > /** done > >> + * >> + * @param avctx the AV codec context >> + * @param buf_size length of the buffer >> + * @param buf the bufffer >> + * >> + * @return the bitrate on success, >> + * I_F_Q if the bitrate cannot be satisfactorily determined >> + * >> + * TIA/EIA/IS-733 2.4.8.7.1 >> + */ >> +static int determine_bitrate(AVCodecContext *avctx, >> + const int buf_size, >> + uint8_t **buf) { >> + qcelp_packet_rate bitrate; >> + >> + if ((bitrate = buf_size2bitrate(buf_size)) >= 0) { >> + if (bitrate > **buf) { >> + av_log(avctx, AV_LOG_WARNING, "Claimed bitrate and >> buffer size mismatch.\n"); >> + bitrate = **buf; >> + } else if (bitrate < **buf) { > >> + av_log(avctx, AV_LOG_WARNING, "Buffer is too small for >> the claimed bitrate.\n"); > > i think tis should be AV_LOG_ERROR done >> + return I_F_Q; >> + } >> + (*buf)++; >> + } else if ((bitrate = buf_size2bitrate(buf_size + 1)) >= 0) { >> + av_log(avctx, AV_LOG_WARNING, >> + "Bitrate byte is missing, guessing the bitrate from >> packet size.\n"); >> + } else >> + return I_F_Q; >> + >> + if (bitrate == SILENCE) { >> + // FIXME: the decoder should not handle SILENCE frames as >> I_F_Q frames >> + av_log_missing_feature(avctx, "Blank frame", 1); >> + bitrate = I_F_Q; >> + } >> + return bitrate; >> +} >> + >> static void warn_insufficient_frame_quality(AVCodecContext *avctx, >> const char *message) >> { > [...] thanks for all the reviewing :) Kenan