[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