[FFmpeg-devel] [PATCH] avcodec/wmalosslessdec: real 24bit support

Christophe Gisquet christophe.gisquet at gmail.com
Thu Apr 14 07:56:12 CEST 2016


Hi,

2016-04-12 22:53 GMT+02:00 Paul B Mahol <onemda at gmail.com>:

> -    LLAudDSPContext dsp;                           ///< accelerated

And later:

> +static int scalarproduct_and_madd_int(int *v1, const int *v2,
> +                                      const int *v3,
> +                                      int order, int mul)
> +{
> +    int res = 0;
> +
> +    av_assert0(order >= 0);
> +    while (order--) {
> +        res   += *v1 * *v2++;
> +        *v1++ += mul * *v3++;
> +    }
> +    return res;
> +}

As Hendrik said, please move it to LLAudDSPContext.

On a side note, is this through RE or guess (I'm asking because the
guess was not difficult) ?

Because having an accumulator on 32 bits only may lead to overflows.

> +    int     mclms_prevvalues[WMALL_MAX_CHANNELS * 2 * 32];
> +    int     mclms_updates[WMALL_MAX_CHANNELS * 2 * 32];
>      int     mclms_recent;
>
>      int     movave_scaling;
> @@ -146,9 +144,9 @@ typedef struct WmallDecodeCtx {
>          int scaling;
>          int coefsend;
>          int bitsend;
> -        DECLARE_ALIGNED(16, int16_t, coefs)[MAX_ORDER +
> WMALL_COEFF_PAD_SIZE/sizeof(int16_t)];
> -        DECLARE_ALIGNED(16, int16_t, lms_prevvalues)[MAX_ORDER * 2 +
> WMALL_COEFF_PAD_SIZE/sizeof(int16_t)];
> -        DECLARE_ALIGNED(16, int16_t, lms_updates)[MAX_ORDER * 2 +
> WMALL_COEFF_PAD_SIZE/sizeof(int16_t)];
> +        int coefs[MAX_ORDER + WMALL_COEFF_PAD_SIZE];
> +        int lms_prevvalues[MAX_ORDER * 2 + WMALL_COEFF_PAD_SIZE];
> +        int lms_updates[MAX_ORDER * 2 + WMALL_COEFF_PAD_SIZE];

I prefer int32_t just because it's something to dspize. Plus at some
point someone would have to redo the alignment.


> -               sizeof(int16_t) * order * num_channels);
> +               sizeof(int) * order * num_channels);

The format has the bitdepth stored and put into s->bits_per_sample.
The decoder actually uses it to select how to store the samples later
on.
In any such case, this should be dynamic. Either you use int size =
s->bits_per_sample>16 ? 4 : 2 (because sizeof(int16_t isn't going to
change much...)

Or FFALIGN(s->bits_per_sample>>3, 2)? Whatever floats your boat.

> -            pred +=
> s->dsp.scalarproduct_and_madd_int16(s->cdlms[ch][ilms].coefs,
> -
> s->cdlms[ch][ilms].lms_prevvalues
> -                                                            +
> s->cdlms[ch][ilms].recent,
> -
> s->cdlms[ch][ilms].lms_updates
> -                                                            +
> s->cdlms[ch][ilms].recent,
> -
> FFALIGN(s->cdlms[ch][ilms].order,
> -
> WMALL_COEFF_PAD_SIZE),
> -                                                        WMASIGN(residue));
> +            pred += scalarproduct_and_madd_int(s->cdlms[ch][ilms].coefs,
> +
> s->cdlms[ch][ilms].lms_prevvalues
> +                                                   + s->cdlms[ch][ilms].recent,
> +                                               s->cdlms[ch][ilms].lms_updates
> +                                                   + s->cdlms[ch][ilms].recent,
> +                                               s->cdlms[ch][ilms].order,
> +                                               WMASIGN(residue));

And then here:
- switch based on bitdepth (the needed 'if' wouldn't be the end of the
world but it's not actually needed);
- or use a function pointer in the context

For the later point, unless going through a proxy, it may, obviously, look like:
int (*scalarproduct_and_madd_int)(void *v1, const void *v2,
                                      const void *v3, int order, int mul)
but there might be compilation warning on call or setting the variable.

-- 
Christophe


More information about the ffmpeg-devel mailing list