[FFmpeg-devel] Audio conversion and floating-point codecs
Frank Barchard
fbarchard
Tue May 18 00:05:38 CEST 2010
On Sat, May 15, 2010 at 12:17 PM, M?ns Rullg?rd <mans at mansr.com> wrote:
> There is a long-standing desire from some to make the floating-point
> decoders output float samples instead of converting to int16
> internally, and I agree with the reasons for this. However, making
> this change hastily will make decoding orders of magnitude slower on
> many CPUs. The reason is that when a decoder outputs float samples,
> the fast asm code for float-to-int conversion is not used.
>
> In order to change the output format of these decoders without
> impacting performance, we must first make a few improvements to the
> avcodec API and to the generic audio format conversion code.
>
> What we have
> ------------
>
> - Very fast float-to-int16 conversion code in dsputil. These
> functions require input scaled to -32k..32k.
>
Adding scaling to this code wouldnt slow it down much. Here's a scalar
float to int I used for wmapro conversion:
const __m128 kFloatScaler = _mm_set1_ps( 2147483648.0f );static void
FloatToIntSaturate(float* p) { __m128 a = _mm_set1_ps(*p); a =
_mm_mul_ss(a, kFloatScaler); *reinterpret_cast<int32*>(p) =
_mm_cvtss_si32(a);}
>
> - The codecs in question all scale the output to the correct range as
> part of transforms or filters. The scaling is thus effectively free.
>
> - Generic sample format conversion code (audioconvert.c). This code
> requires float input in the range -1..1. It does not use any asm
> and is thus excruciatingly slow. Decoding wmapro on Cortex-A8
> spends more than 50% of the total time here.
>
Short term, I would prefer wmapro output int16 and have ffmpeg do it
efficiently on arm.
If you pass thru float asis to Pulse or kmixer, performance is poor and/or
you get stutter.
If you leave conversion to applications, they'll tend to do it poorly,
especially on less common CPUs.
> What we need
> ------------
>
> - The libavcodec API needs to be amended such that a specific scaling
> can be requested of the decoders. This should probably be done
> similarly to how channel down-mixing is already handled.
>
Its better to require a consistent -1 to 1.
>
> - The decoders should output planar audio instead of interleaved for
> multichannel streams. This probably means introducing
> avcodec_decode_audio4() with an AVFrame output.
>
Planar requires interleaving before it can be played. Is there a compelling
advantage?
> - A better audio conversion system needs to be implemented. Ideally,
> this should be able to reuse existing asm code. To this end, the
> desired input range should be exported after configuration, allowing
> it to be passed back to decoders.
>
> - The conversion system should be designed to allow up/down-mixing of
> channels within the same API. This is a feature currently missing
> from FFmpeg, making playback of multi-channel AAC or Vorbis on a
> stereo output difficult. Implementing this is not a prerequisite
> for switching the output format of the decoders.
>
agreed.
> - All the pieces above need to be tied together in ffmpeg.c.
>
> None of the above is especially difficult to do, but it is important
> that it is done properly, or performance will suffer.
>
Also note that at some point, float video channels would be good.
More information about the ffmpeg-devel
mailing list