On Tuesday, October 1, 2013, Diego Biurrun wrote:
> From: Maxim Poliakovski <[email protected] <javascript:;>>
>
> Move it to the ATRAC common code, to reuse in the upcoming ATRAC3+ decoder.
>
> Signed-off-by: Diego Biurrun <[email protected] <javascript:;>>
> ---
>
> Dropped some unnecessary cosmetic changes and split off 1/3.
>
> libavcodec/atrac.c | 62 ++++++++++++++++++++++++++++++++++++
> libavcodec/atrac.h | 45 ++++++++++++++++++++++++++
> libavcodec/atrac3.c | 87
> +++++++--------------------------------------------
> 3 files changed, 119 insertions(+), 75 deletions(-)
>
> diff --git a/libavcodec/atrac.c b/libavcodec/atrac.c
> index b34bff3..d08a113 100644
> --- a/libavcodec/atrac.c
> +++ b/libavcodec/atrac.c
> @@ -63,6 +63,68 @@ void ff_atrac_generate_tables(void)
> +
> + gc_scale = gc_next->num_points ? gctx->gain_tab1[gc_next->lev_code[0]]
> + : 1.0f;
> +
> + if (!gc_now->num_points) {
> + for (pos = 0; pos < num_samples; pos++)
> + out[pos] = in[pos] * gc_scale + prev[pos];
> + } else {
> + pos = 0;
> +
> + for (i = 0; i < gc_now->num_points; i++) {
> + lastpos = gc_now->loc_code[i] << gctx->loc_scale;
> +
> + lev = gctx->gain_tab1[gc_now->lev_code[i]];
> + gain_inc = gctx->gain_tab2[(i + 1 < gc_now->num_points
> + ? gc_now->lev_code[i + 1]
> + : gctx->id2exp_offset)
> + - gc_now->lev_code[i] + 15];
Nit: should ? : and - be on the right hand side?
> +
> + /* apply constant gain level and overlap */
> + for (; pos < lastpos; pos++)
> + out[pos] = (in[pos] * gc_scale + prev[pos]) * lev;
> +
> + /* interpolate between two different gain levels */
> + for (; pos < lastpos + gctx->loc_size; pos++) {
> + out[pos] = (in[pos] * gc_scale + prev[pos]) * lev;
> + lev *= gain_inc;
> + }
> + }
> +
> + for (; pos < num_samples; pos++)
> + out[pos] = in[pos] * gc_scale + prev[pos];
> + }
> +
> + /* copy the overlapping part into the delay buffer */
> + memcpy(prev, &in[num_samples], num_samples * sizeof(float));
> +}
> +
> void ff_atrac_iqmf (float *inlo, float *inhi, unsigned int nIn, float
> *pOut, float *delayBuf, float *temp)
> {
> int i, j;
> diff --git a/libavcodec/atrac.h b/libavcodec/atrac.h
> index 4923caa..994b9f4 100644
> --- a/libavcodec/atrac.h
> +++ b/libavcodec/atrac.h
> @@ -29,6 +29,26 @@
> /**
> + * Initialize gain compensation context.
> + *
> + * @param gctx pointer to gain compensation context to
> initialize
> + * @param id2exp_offset offset for converting level index into level
> exponent
> + * @param loc_scale location size factor
> + */
> +void ff_atrac_init_gain_compensation(AtracGCContext *gctx, int
> id2exp_offset,
> + int loc_scale);
> +
> +/*
> + * Apply gain compensation and perform the MDCT overlapping part.
> + *
> + * @param gctx pointer to gain compensation context
> + * @param in input buffer
> + * @param prev previous buffer to perform overlap against
> + * @param gc_now gain control information for current frame
> + * @param gc_next gain control information for next frame
> + * @param num_samples number of samples to process
> + * @param out output data goes here
> + */
Missing doxygen /**
+void ff_atrac_gain_compensation(AtracGCContext *gctx, float *in, float
> *prev,
> + AtracGainInfo *gc_now, AtracGainInfo
> *gc_next,
> + int num_samples, float *out);
> +
> +/**
> * Quadrature mirror synthesis filter.
> *
> * @param inlo lower part of spectrum
> diff --git a/libavcodec/atrac3.c b/libavcodec/atrac3.c
> index 30bf010..91791ea 100644
> --- a/libavcodec/atrac3.c
> +++ b/libavcodec/atrac3.c
> @@ -54,14 +54,8 @@
> #define SAMPLES_PER_FRAME 1024
> #define MDCT_SIZE 512
>
> -typedef struct GainInfo {
> - int num_gain_data;
> - int lev_code[8];
> - int loc_code[8];
> -} GainInfo;
> -
> typedef struct GainBlock {
> - GainInfo g_block[4];
> + AtracGainInfo g_block[4];
> } GainBlock;
>
> typedef struct TonalComponent {
> @@ -111,6 +105,7 @@ typedef struct ATRAC3Context {
> int scrambled_stream;
> //@}
>
> + AtracGCContext gainc_ctx;
> FFTContext mdct_ctx;
> FmtConvertContext fmt_conv;
> AVFloatDSPContext fdsp;
> @@ -417,18 +412,17 @@ static int decode_tonal_components(GetBitContext *gb,
> static int decode_gain_control(GetBitContext *gb, GainBlock *block,
> int num_bands)
> {
> - int i, j, num_data;
> + int i, j;
> int *level, *loc;
>
> - GainInfo *gain = block->g_block;
> + AtracGainInfo *gain = block->g_block;
>
> for (i = 0; i <= num_bands; i++) {
> - num_data = get_bits(gb, 3);
> - gain[i].num_gain_data = num_data;
> + gain[i].num_points = get_bits(gb, 3);
> level = gain[i].lev_code;
> loc = gain[i].loc_code;
>
> - for (j = 0; j < gain[i].num_gain_data; j++) {
> + for (j = 0; j < gain[i].num_points; j++) {
> level[j] = get_bits(gb, 4);
> loc [j] = get_bits(gb, 5);
> if (j && loc[j] <= loc[j - 1])
> @@ -438,69 +432,12 @@ static int decode_gain_control(GetBitContext *gb,
> GainBlock *block,
>
> /* Clear the unused blocks. */
> for (; i < 4 ; i++)
> - gain[i].num_gain_data = 0;
> + gain[i].num_points = 0;
>
> return 0;
> }
>
> /*
> - * Apply gain parameters and perform the MDCT overlapping part
> - *
> - * @param input input buffer
> - * @param prev previous buffer to perform overlap against
> - * @param output output buffer
> - * @param gain1 current band gain info
> - * @param gain2 next band gain info
> - */
> -static void gain_compensate_and_overlap(float *input, float *prev,
> - float *output, GainInfo *gain1,
> - GainInfo *gain2)
> -{
> - float g1, g2, gain_inc;
> - int i, j, num_data, start_loc, end_loc;
> -
> -
> - if (gain2->num_gain_data == 0)
> - g1 = 1.0;
> - else
> - g1 = gain_tab1[gain2->lev_code[0]];
> -
> - if (gain1->num_gain_data == 0) {
> - for (i = 0; i < 256; i++)
> - output[i] = input[i] * g1 + prev[i];
> - } else {
> - num_data = gain1->num_gain_data;
> - gain1->loc_code[num_data] = 32;
> - gain1->lev_code[num_data] = 4;
> -
> - for (i = 0, j = 0; i < num_data; i++) {
> - start_loc = gain1->loc_code[i] * 8;
> - end_loc = start_loc + 8;
> -
> - g2 = gain_tab1[gain1->lev_code[i]];
> - gain_inc = gain_tab2[gain1->lev_code[i + 1] -
> - gain1->lev_code[i ] + 15];
> -
> - /* interpolate */
> - for (; j < start_loc; j++)
> - output[j] = (input[j] * g1 + prev[j]) * g2;
> -
> - /* interpolation is done over eight samples */
> - for (; j < end_loc; j++) {
> - output[j] = (input[j] * g1 + prev[j]) * g2;
> - g2 *= gain_inc;
> - }
> - }
> -
> - for (; j < 256; j++)
> - output[j] = input[j] * g1 + prev[j];
> - }
> -
> - /* Delay for the overlapping part. */
> - memcpy(prev, &input[256], 256 * sizeof(*prev));
> -}
> -
> -/*
> * Combine the tonal band spectrum and regular band spectrum
> *
> * @param spectrum output spectrum buffer
Ditto
> @@ -690,11 +627,10 @@ static int decode_channel_sound_unit(ATRAC3Context
> *q, GetBitContext *gb,
> memset(snd->imdct_buf, 0, 512 * sizeof(*snd->imdct_buf));
>
> /* gain compensation and overlapping */
> - gain_compensate_and_overlap(snd->imdct_buf,
> - &snd->prev_frame[band * 256],
> - &output[band * 256],
> - &gain1->g_block[band],
> - &gain2->g_block[band]);
> + ff_atrac_gain_compensation(&q->gainc_ctx, snd->imdct_buf,
> + &snd->prev_frame[band * 256],
> + &gain1->g_block[band],
> &gain2->g_block[band],
> + 256, &output[band * 256]);
> }
>
> /* Swap the gain control buffers for the next frame. */
> @@ -982,6 +918,7 @@ static av_cold int atrac3_decode_init(AVCodecContext
> *avctx)
> q->matrix_coeff_index_next[i] = 3;
> }
>
> + ff_atrac_init_gain_compensation(&q->gainc_ctx, 4, 3);
> avpriv_float_dsp_init(&q->fdsp, avctx->flags & CODEC_FLAG_BITEXACT);
> ff_fmt_convert_init(&q->fmt_conv, avctx);
>
> --
> 1.7.9.5
>
> _______________________________________________
> libav-devel mailing list
> [email protected] <javascript:;>
> https://lists.libav.org/mailman/listinfo/libav-devel
>
Vittorio
_______________________________________________
libav-devel mailing list
[email protected]
https://lists.libav.org/mailman/listinfo/libav-devel