[FFmpeg-cvslog] r23646 - in trunk/libavcodec: mpegaudio.h mpegaudiodec.c

Vitor Sessak vitor1001
Sat Jun 19 15:59:44 CEST 2010


On 06/19/2010 03:46 PM, M?ns Rullg?rd wrote:
> Vitor Sessak<vitor1001 at gmail.com>  writes:
>
>> On 06/19/2010 01:13 PM, M?ns Rullg?rd wrote:
>>> vitor<subversion at mplayerhq.hu>   writes:
>>>
>>>> Author: vitor
>>>> Date: Sat Jun 19 11:56:05 2010
>>>> New Revision: 23646
>>>>
>>>> Log:
>>>> Factorize the mpegaudio windowing code in a function and call it by a
>>>> function pointer. Should allow for ASM optimizations.
>>>>
>>>> Modified:
>>>>      trunk/libavcodec/mpegaudio.h
>>>>      trunk/libavcodec/mpegaudiodec.c
>>>>
>>>> +/* 32 sub band synthesis filter. Input: 32 sub band samples, Output:
>>>> +   32 samples. */
>>>> +/* XXX: optimize by avoiding ring buffer usage */
>
> BTW, any plans for doing that?

Not for the moment...

>>>> +#if CONFIG_FLOAT
>>>> [...]
>>>> +#endif
>>>> +
>>>> +    offset = *synth_buf_offset;
>>>> +    synth_buf = synth_buf_ptr + offset;
>>>> +
>>>> +#if FRAC_BITS<= 15&&   !CONFIG_FLOAT
>>>
>>> !CONFIG_FLOAT is always true here.
>>
>> Of course. I noticed that but I thought it would be better not to
>> touch the original function in the first patch. If we settle for the
>> code as is, I will remove it.
>
> OK, just don't forget it.
>
>>>> +    dct32(tmp, sb_samples);
>>>> +    for(j=0;j<32;j++) {
>>>> +        /* NOTE: can cause a loss in precision if very high amplitude
>>>> +           sound */
>>>> +        synth_buf[j] = av_clip_int16(tmp[j]);
>>>> +    }
>>>> +#else
>>>> +    dct32(synth_buf, sb_samples);
>>>> +#endif
>>>> +
>>>> +    apply_window_mp3_c(synth_buf, window, dither_state, samples, incr);
>>>
>>> Why doesn't this use a function pointer too?
>>
>> Because this is a public function used by other codecs (mpc and
>> qdm2).
>
> It's not public API, so we can change it whenever we please.
>
>> It would need either to make them store and initialize a
>> MPADecodeContext just for this function or to create some
>> MPADSPContext just for this function, which is also silly.
>
> There are probably other functions that could benefit from asm
> optimisations too.

Yes, mostly the 32-point DCT and the 36-point IMDCT (that IMHO belongs 
to DCTContext and MDCTContext respectivelly). But, yes, those contexts 
can be inside the MPADSPContext struct.

> Starting with one might look silly, but it's still
> the right way to go.  I did that with DTS and nobody objected.
>
>> Of course, everything changes if you are planning to write a NEON
>> optimized version of this function...
>
> Maybe not NEON, but optimised fixed-point functions would make sense
> on many CPUs (and DSPs).
>
>>>>        offset = (offset - 32)&   511;
>>>>        *synth_buf_offset = offset;
>>>>    }
>>>> +#endif
>>>>
>>>>    #define C3 FIXHR(0.86602540378443864676/2)
>>>>
>>>> @@ -2227,7 +2262,11 @@ static int mp_decode_frame(MPADecodeCont
>>>>        for(ch=0;ch<s->nb_channels;ch++) {
>>>>            samples_ptr = samples + ch;
>>>>            for(i=0;i<nb_frames;i++) {
>>>> -            RENAME(ff_mpa_synth_filter)(s->synth_buf[ch],&(s->synth_buf_offset[ch]),
>>>> +            RENAME(ff_mpa_synth_filter)(
>>>> +#if CONFIG_FLOAT
>>>> +                         s,
>>>> +#endif
>>>
>>> Do I really need to tell you that this is hideously ugly?
>>
>> No, that's why I was expecting some suggestion ;)
>
> If we pointerise it as discussed above, this will go away, right?

Sure, I'll just wait for Michael's feedback on that approach so I'm sure 
not to lose my time for nothing.

-Vitor

PS: this discussion do not block the patch for the asm optimization nor 
the one of moving the dct code to DCTContext...



More information about the ffmpeg-cvslog mailing list