[FFmpeg-devel] [PATCH] avcodec: add native Speex decoder

Andreas Rheinhardt andreas.rheinhardt at outlook.com
Thu Oct 7 22:47:01 EEST 2021


Paul B Mahol:
> +typedef struct SpeexBMode {
> +    int frame_size; /**< Size of frames used for decoding */
> +    int subframe_size; /**< Size of sub-frames used for decoding */
> +    int lpc_size; /**< Order of LPC filter */
> +    float folding_gain; /**< Folding gain */
> +    const SpeexSubmode *submodes[NB_SUBMODES]; /**< Sub-mode data for the mode */
> +    int default_submode; /**< Default sub-mode to use when decoding */
> +} SpeexBMode;
> +
> +
> +typedef struct SpeexMode {
> +    const void *mode; /** Pointer to the low-level mode data */
> +    int modeID; /** ID of the mode */
> +    int (*decode)(AVCodecContext *avctx, DecoderState *dec, GetBitContext *gb, float *out);
> +} SpeexMode;
> +
> +
> +static const SpeexBMode narrowband_mode =
> +{
> +    .frame_size = NB_FRAME_SIZE,
> +    .subframe_size = NB_SUBFRAME_SIZE,
> +    .lpc_size = NB_ORDER,
> +    .submodes = {
> +        NULL, &nb_submode1, &nb_submode2, &nb_submode3, &nb_submode4,
> +        &nb_submode5, &nb_submode6, &nb_submode7, &nb_submode8
> +    },
> +    .default_submode = 5,
> +};
> +
> +static const SpeexBMode wideband_mode = {
> +    .frame_size = NB_FRAME_SIZE,
> +    .subframe_size = NB_SUBFRAME_SIZE,
> +    .lpc_size = 8,
> +    .folding_gain = 0.9f,
> +    .submodes = {
> +        NULL, &wb_submode1, &wb_submode2, &wb_submode3, &wb_submode4
> +    },
> +    .default_submode = 3,
> +};
> +
> +static const SpeexBMode ultrawideband_mode = {
> +    .frame_size = 320,
> +    .subframe_size = 80,
> +    .lpc_size = 8,
> +    .folding_gain = 0.7f,
> +    .submodes = {
> +        NULL, &wb_submode1
> +    },
> +    .default_submode = 1,
> +};
> +
> +
> +static const SpeexMode narrowband = {
> +    .mode = &narrowband_mode,
> +    .modeID = 0,
> +    .decode = nb_decode,
> +};
> +
> +static const SpeexMode wideband = {
> +    .mode = &wideband_mode,
> +    .modeID = 1,
> +    .decode = sb_decode,
> +};
> +
> +static const SpeexMode ultrawideband = {
> +    .mode = &ultrawideband_mode,
> +    .modeID = 2,
> +    .decode = sb_decode,
> +};

SpeexMode.mode always points to a SpeexBMode, so there is no reason for
it to be a pointer to const void; furthermore, there is a 1-1
correspondence between SpeexModes and SpeexBModes, so you can just put
the relevant SpeexBModes into SpeexModes. Or even remove SpeexBModes
completely and put its current contents directly in SpeexModes.

> +
> +static const SpeexMode *const speex_modes[SPEEX_NB_MODES] = {
> +    &narrowband,
> +    &wideband,
> +    &ultrawideband,
> +};

The pointed-to objects here have always the same type and size, so one
could put them directly into an array of SpeexModes and remove the array
of pointers.

> +static int parse_speex_extradata(AVCodecContext *avctx,
> +    const uint8_t *extradata, int extradata_size)
> +{
> +    SpeexContext *s = avctx->priv_data;
> +    const uint8_t *buf = extradata;
> +    uint8_t header[8];
> +
> +    bytestream_get_buffer(&buf, header, sizeof(header));
> +
> +    if (memcmp(header, "Speex   ", sizeof(header)))
> +        return AVERROR_INVALIDDATA;

Why the extra header buffer?

- Andreas


More information about the ffmpeg-devel mailing list