[FFmpeg-devel] [PATCH 1/3] avcodec: add siren audio decoder

Lynne dev at lynne.ee
Wed Feb 19 17:01:23 EET 2020


Feb 19, 2020, 10:30 by onemda at gmail.com:

> Signed-off-by: Paul B Mahol <> onemda at gmail.com> >
> ---
> libavcodec/Makefile     |   1 +
> libavcodec/allcodecs.c  |   1 +
> libavcodec/avcodec.h    |   1 +
> libavcodec/codec_desc.c |   7 +
> libavcodec/siren.c      | 776 ++++++++++++++++++++++++++++++++++++++++
> libavformat/vivo.c      |   5 +
> 6 files changed, 791 insertions(+)
> create mode 100644 libavcodec/siren.c
>
>
> +
> +    for (i = 0; i < 64; i++) {
> +        float region_power = powf(10, (i - 24) * 0.3010299957);
> +
> +        s->standard_deviation[i] = sqrtf(region_power);
> +    }
>

Remove the stray newline?



> +
> +    for (int i = 0; i < rate_control; i++) {
> +        s->power_categories[s->category_balance[i]]++;
> +    }
>

No need for brackets.



> +
> +    ret = decode_vector(s, s->number_of_regions, get_bits_left(gb),
> +                        s->decoder_standard_deviation, s->power_categories,
> +                        s->imdct_in, s->scale_factor);
> +    if (ret < 0)
> +        return ret;
> +
> +    if (get_bits_left(gb) > 0) {
> +        do {
> +            if (!get_bits1(gb))
> +                frame_error = 1;
>

frame_error |= !get_bits1(gb);



>
> +
> +    if (frame_error) {
> +        for (int i = 0; i < number_of_valid_coefs; i++) {
> +            s->imdct_in[i] = s->backup_frame[i];
> +            s->backup_frame[i] = 0;
>

memcpy(s->imdct_in, s->backup_frame, number_of_valid_coefs*sizeof(float));
memset(s->backup_frame, 0, number_of_valid_coefs*sizeof(float));



> +        }
> +    } else {
> +        for (int i = 0; i < number_of_valid_coefs; i++)
> +            s->backup_frame[i] = s->imdct_in[i];
>

memcpy(s->backup_frame, s->imdct_in, number_of_valid_coefs*sizeof(float));



> +    }
> +
> +    frame->nb_samples = FRAME_SIZE;
> +    if ((ret = ff_get_buffer(avctx, frame, 0)) < 0)
> +        return ret;
> +
> +    for (int i = 0; i < 320; i += 2)
> +        s->imdct_in[i] *= -1;
> +
> +    s->tx_fn(s->tx_ctx, s->imdct_out, s->imdct_in, sizeof(float));
> +    s->fdsp->vector_fmul_window((float *)frame->data[0],
> +                                s->imdct_prev + (FRAME_SIZE >> 1),
> +                                s->imdct_out, s->window,
> +                                FRAME_SIZE >> 1);
> +    FFSWAP(float *, s->imdct_out, s->imdct_prev);
> +
> +    *got_frame = 1;
> +
> +    return avpkt->size;
>

Return AVERROR_INVALIDDATA if frame_error == 1?




> +
> +        coefs_ptr = coefs + (region * s->region_size);
> +
> +        if (category == 5) {
> +            i = 0;
> +            for (j = 0; j < s->region_size; j++) {
> +                if (*coefs_ptr != 0) {
> +                    i++;
> +                }
>

No need for brackets here.



> +                coefs_ptr++;
> +            }
> +
> +            noise = decoder_standard_deviation[region] * noise_category5[i];
> +        } else if (category == 6) {
> +            i = 0;
> +            for (j = 0; j < s->region_size; j++) {
> +                if (*coefs_ptr++ != 0)
> +                    i++;
> +            }
> +
> +            noise = decoder_standard_deviation[region] * noise_category6[i];
> +        } else if (category == 7) {
> +            noise = decoder_standard_deviation[region] * 0.70711f;
> +        } else {
> +            noise = 0;
> +        }
> +
> +        coefs_ptr = coefs + (region * s->region_size);
> +
> +        if (category == 5 || category == 6 || category == 7) {
> +            dw1 = get_dw(s);
> +            dw2 = get_dw(s);
> +
> +            for (j = 0; j < 10; j++) {
> +                if (category == 7 || *coefs_ptr == 0) {
> +                    if (dw1 & 1)
> +                        *coefs_ptr = noise;
> +                    else
> +                        *coefs_ptr = -noise;
> +                }
>

*coefs_ptr = dw1 & 1 ? noise : -noise;


> +                coefs_ptr++;
> +                dw1 >>= 1;
> +
> +                if (category == 7 || *coefs_ptr == 0) {
> +                    if (dw2 & 1)
> +                        *coefs_ptr = noise;
> +                    else
> +                        *coefs_ptr = -noise;
> +                }
> +                coefs_ptr++;
> +                dw2 >>= 1;
>

Same.


Apart from that patch LGTM.



More information about the ffmpeg-devel mailing list