[flac-dev] A condition in precompute_partition_info_sums_()

lvqcl lvqcl.mail at gmail.com
Mon May 18 09:47:15 PDT 2015


The commit http://git.xiph.org/?p=flac.git;a=commitdiff;h=0a0a10f358345f749e4a05021301461994f1ffc5
(from 31 Mar 2007) adds the following conditional:

        if(FLAC__bitmath_ilog2(default_partition_samples) + bps < 32)

And the commit http://git.xiph.org/?p=flac.git;a=commitdiff;h=f081524c19eeafd08f4db6ee5d52a9634c60f475
has this:

        if(FLAC__bitmath_ilog2(default_partition_samples) + bps + FLAC__MAX_EXTRA_RESIDUAL_BPS < 32)


The question is: why ... < 32, not ... <= 32 ?

Basically we want to know the number of bits that is necessary to represent
the value of (default_partition_samples * max_value_of_residual) product.

Let's assume that the bitness of the residual signal is N. The minimum value
is -2^(N-1), the max is 2^(N-1)-1. For the absolute value: max = 2^(N-1).

The number of bits in default_partition_samples is equal to
     FLAC__bitmath_ilog2(default_partition_samples) + 1.
When we multiply default_partition_samples with 2^(N-1) we add N-1 zeroes to it,
so the number of bits in (default_partition_samples*max_value_of_residual) is equal to

     FLAC__bitmath_ilog2(default_partition_samples) + 1 + N - 1, i.e.
     FLAC__bitmath_ilog2(default_partition_samples) + N

The value of (default_partition_samples*max_value_of_residual) should fit
into unsigned 32-bit variable, so the condition should be:

     FLAC__bitmath_ilog2(default_partition_samples) + N <= 32


More information about the flac-dev mailing list