[FFmpeg-devel] [PATCH] hook up the atrac1 decoder

Benjamin Larsson banan
Mon Sep 21 22:55:55 CEST 2009


Vitor Sessak wrote:
> Benjamin Larsson wrote:
>> Well there is no patch I lied. But is the decoder in good enough shape
>> to be activated ?
> 
> Some comments...
> 
>>     int                 idwls[AT1_MAX_BFU];                 ///< the
>> word length indexes for each BFU
>>     int                 idsfs[AT1_MAX_BFU];                 ///< the
>> scalefactor indexes for each BFU
>>  
> 
> Used only in at1_unpack_dequant(), can be just allocated in the stack.
> Also fit in uint8_t for better cache usage.
> 
>> static void at1_imdct(AT1Ctx *q, float *spec, float *out, int nbits,
>>                       int rev_spec)
>> {
>>     FFTContext* mdct_context;
>>     int transf_size = 1 << nbits;
>>
>>     mdct_context = &q->mdct_ctx[nbits - 5 - (nbits > 6)];
> 
> nit: merge init and declaration
> 
>>         if (num_blocks == 1) {
>>             /* long blocks */
>>             at1_imdct(q, &q->spec[pos], &su->spectrum[0][ref_pos],
>> nbits, band_num);
>>             pos += block_size; // move to the next mdct block in the
>> spectrum
>>
>>             /* overlap and window long blocks */
>>             q->dsp.vector_fmul_window(q->bands[band_num],
>> &su->spectrum[1][ref_pos + band_samples - 16],
>>                                       &su->spectrum[0][ref_pos],
>> short_window, 0, 16);
>>             memcpy(q->bands[band_num] + 32, &su->spectrum[0][ref_pos +
>> 16], 240 * sizeof(float));
>>         } else {
>>             /* short blocks */
>>             float *prev_buf;
>>             start_pos = 0;
>>             prev_buf = &su->spectrum[1][ref_pos + band_samples - 16];
>>             for (; num_blocks != 0; num_blocks--) {
>>                 at1_imdct(q, &q->spec[pos], &su->spectrum[0][ref_pos +
>> start_pos], 5, band_num);
>>
>>                 /* overlap and window between short blocks */
>>                
>> q->dsp.vector_fmul_window(&q->bands[band_num][start_pos], prev_buf,
>>                                           &su->spectrum[0][ref_pos +
>> start_pos], short_window, 0, 16);
>>
>>                 prev_buf = &su->spectrum[0][ref_pos+start_pos + 16];
>>                 start_pos += 32; // use hardcoded block_size
>>                 pos += 32;
>>             }
>>         }
> 
> I think a good deal of code of both branches of the if() can be
> factorized out.
> 
>>      /* read in the spectral data and reconstruct MDCT spectrum of
>> this channel */
>>     for (band_num = 0; band_num < AT1_QMF_BANDS; band_num++) {
>>         for (bfu_num = bfu_bands_t[band_num]; bfu_num <
>> bfu_bands_t[band_num+1]; bfu_num++) {
>>             int pos;
>>
>>             int num_specs = specs_per_bfu[bfu_num];
>>             int word_len  = !!su->idwls[bfu_num] + su->idwls[bfu_num];
>>             float scale_factor = sf_table[su->idsfs[bfu_num]];
>>             bits_used    += word_len * num_specs; /* add number of
>> bits consumed by current BFU */
>                         ^^^^
> Nit: weird formatting
> 
>>     for (ch = 0; ch < q->channels; ch++) {
>>         AT1SUCtx* su = &q->SUs[ch];
>>
>>         init_get_bits(&gb, &buf[212 * ch], 212 * 8);
>>
>>         /* parse block_size_mode, 1st byte */
>>         ret = at1_parse_bsm(&gb, su->log2_block_count);
>>         if (ret < 0)
>>             return ret;
>>
>>         ret = at1_unpack_dequant(&gb, su, q->spec);
>>         if (ret < 0)
>>             return ret;
>>
>>         ret = at1_imdct_block(su, q);
>>         if (ret < 0)
>>             return ret;
>>         at1_subband_synthesis(q, su, q->out_samples[ch]);
>>     }
> 
> I have a slightly preference for calling init_get_bits() just one per
> frame and skipping a few bits if needed.

In this case the frame always start there but it's not sure when the
parsing of the old frame ends. So then I would need to add some
calculation to skip to the correct position which I think is not nice as
I already know where to start.


> 
>> AVCodec atrac1_decoder = {
>>     .name = "atrac1",
>>     .type = CODEC_TYPE_AUDIO,
>>     .id = CODEC_ID_ATRAC1,
>>     .priv_data_size = sizeof(AT1Ctx),
>>     .init = atrac1_decode_init,
>>     .close = NULL,
> 
> I think a atrac1_decode_close() that calls ff_mdct_end() is missing.
> 
> Somewhat unrelated to this thread, atrac_iqmf() is pretty time consuming
> and would gain a nice speed boost from SIMD (at least the inner loop
> evaluating s1 and s2)...
> 
> -Vitor


MvH
Benjamin Larsson



More information about the ffmpeg-devel mailing list