[FFmpeg-devel] [PATCH 1/5] AAC: use table for cbrtf(n)*n

Måns Rullgård mans
Mon Jan 11 14:20:54 CET 2010


Alex Converse <alex.converse at gmail.com> writes:

> On Mon, Jan 11, 2010 at 7:37 AM, Mans Rullgard <mans at mansr.com> wrote:
>> Up to 10% faster on Cortex-A8.
>> ---
>> ?libavcodec/aac.c | ? ?6 +++++-
>> ?1 files changed, 5 insertions(+), 1 deletions(-)
>>
>> diff --git a/libavcodec/aac.c b/libavcodec/aac.c
>> index 2bb05b8..14849d4 100644
>> --- a/libavcodec/aac.c
>> +++ b/libavcodec/aac.c
>> @@ -101,6 +101,7 @@ union float754 {
>> ?static VLC vlc_scalefactors;
>> ?static VLC vlc_spectral[11];
>>
>> +static float cbrt_tab[1<<15];
>>
>> ?static ChannelElement *get_che(AACContext *ac, int type, int elem_id)
>> ?{
>> @@ -555,6 +556,9 @@ static av_cold int aac_decode_init(AVCodecContext *avccontext)
>> ? ? ff_init_ff_sine_windows(10);
>> ? ? ff_init_ff_sine_windows( 7);
>>
>> + ? ?for (i = 0; i < 1<<15; i++)
>> + ? ? ? ?cbrt_tab[i] = cbrtf(i) * i;
>> +
>> ? ? return 0;
>> ?}
>>
>
> This 2**15 value seems big.
>
> """
> 4.6.3.3	Decoding process
>
> The ESC codebook is a special case. It represents values from 0 to 16
> inclusive, but values from 0 to 15 encode actual data values, and the
> value16 is an escape_flag that signals the presence of hcod_esc_y or
> hcod_esc_z, either of which will be denoted as an escape_sequence.
> This escape_sequence permits quantized spectral elements of LAV>15 to
> be encoded. It consists of an escape_prefix of N 1's, followed by an
> escape_separator of one zero, followed by an escape_word of N+4 bits
> representing an unsigned integer value. The escape_sequence has a
> decoded value of  2^(N+4)+escape_word. The desired quantized spectral
> coefficient is then the sign indicated by the pair_sign_bits  applied
> to the value of the escape_sequence. In other words, an
> escape_sequence of 00000 would decode as 16, an escape_sequence of
> 01111 as 31, an escape_sequence of 1000000 as 32, one of 1011111 as
> 63, and so on. Note that restrictions in subclause 4.6.1.3 dictate
> that the length of the escape_sequence is always less than 22 bits.
> For escape Huffman codewords the ordering of data elements is Huffman
> codeword followed by 0 to 2 sign bits followed by 0 to 2 escape
> sequences.
>
> 4.6.1.3	Decoding process
> ...
> The maximum allowed absolute amplitude for x_quant is 8191....
> """
>
> It seems that a 22-bit escape sequence the maximum value encoded could
> be 111111110111111111111 -> 2^(8+4)+(2^12-1) = 8191. Going bigger
> wasn't as much of an issue with a free function call but we can save
> 96K of table space by tightening this constraint.

Thanks for that.

So the 15 in the original code is bogus?  The comment in the code is
clearly wrong, so I didn't know what to trust.

-- 
M?ns Rullg?rd
mans at mansr.com



More information about the ffmpeg-devel mailing list