diff --git a/configure b/configure index 789e6c30a3c476bb6a7f3985421f747cf29438c1..92ca061b91267e6152ea437d87fc260ac10147a6 100755 --- a/configure +++ b/configure @@ -46,6 +46,9 @@ Advanced options: ${toggle_realtime_only} enable this option while building for real-time encoding ${toggle_onthefly_bitpacking} enable on-the-fly bitpacking in real-time encoding ${toggle_error_concealment} enable this option to get a decoder which is able to conceal losses + ${toggle_coefficient_range_checking} + enable decoder to check if intermediate + transform coefficients are in valid range ${toggle_runtime_cpu_detect} runtime cpu detection ${toggle_shared} shared library support ${toggle_static} static library support @@ -327,6 +330,7 @@ CONFIG_LIST=" encode_perf_tests multi_res_encoding temporal_denoising + coefficient_range_checking experimental size_limit ${EXPERIMENT_LIST} @@ -384,6 +388,7 @@ CMDLINE_SELECT=" encode_perf_tests multi_res_encoding temporal_denoising + coefficient_range_checking experimental " diff --git a/vp9/common/vp9_idct.h b/vp9/common/vp9_idct.h index 3253bcbf4a6cee9c923ae332e84dad706c8fefb8..7f595e1cca205b7793b67cbfb859198b4117cc2a 100644 --- a/vp9/common/vp9_idct.h +++ b/vp9/common/vp9_idct.h @@ -81,6 +81,16 @@ static const int sinpi_4_9 = 15212; static INLINE int dct_const_round_shift(int input) { int rv = ROUND_POWER_OF_TWO(input, DCT_CONST_BITS); +#if CONFIG_COEFFICIENT_RANGE_CHECKING + // For valid VP9 input streams, intermediate stage coefficients should always + // stay within the range of a signed 16 bit integer. Coefficients can go out + // of this range for invalid/corrupt VP9 streams. However, strictly checking + // this range for every intermediate coefficient can burdensome for a decoder, + // therefore the following assertion is only enabled when configured with + // --enable-coefficient-range-checking. + assert(INT16_MIN <= rv); + assert(rv <= INT16_MAX); +#endif return (int16_t)rv; }