stream_encoder.c : Fix an arithmetic overflow in the RICE2 partitioner.
authorErik de Castro Lopo <erikd@mega-nerd.com>
Wed, 17 Jul 2013 08:38:45 +0000 (18:38 +1000)
committerErik de Castro Lopo <erikd@mega-nerd.com>
Wed, 17 Jul 2013 09:42:12 +0000 (19:42 +1000)
commit6f7ec60c7e7f05f5ab0b1cf6b7b0945e44afcd4b
tree6274c79ef35c55e01d94db485f82ef576bc7e82e
parentcf0277bde98d96cf97642fbb27f4c19551b09abd
stream_encoder.c : Fix an arithmetic overflow in the RICE2 partitioner.

For a specific 24 bit WAV file provided by Leigh Dyer

    http://lists.xiph.org/pipermail/flac-dev/2013-July/004284.html

encoding with compression level 7 was generating a file a couple of
orders of magintude larger than the original.

Debugging showed that variable abs_residual_partition_sum (a FLAC__uint32)
in function precompute_partition_info_sums_() was suffering from an
arithmetic overflowing on some 24 bit input files although this value
overflowing did not always cause larger output files.

Since the value abs_residual_partition_sum is eventually stored in an
array of FLAC__uint64, it makes sense to make abs_residual_partition_sum
a FLAC__uint64 anyway.

Debugging this problem was made easier by use of the Clang compiler's
-fsanitize=integer option.
src/libFLAC/stream_encoder.c