OLD | NEW |
1 /* | 1 /* |
2 * Copyright (c) 2010 The WebM project authors. All Rights Reserved. | 2 * Copyright (c) 2010 The WebM project authors. All Rights Reserved. |
3 * | 3 * |
4 * Use of this source code is governed by a BSD-style license | 4 * Use of this source code is governed by a BSD-style license |
5 * that can be found in the LICENSE file in the root of the source | 5 * that can be found in the LICENSE file in the root of the source |
6 * tree. An additional intellectual property rights grant can be found | 6 * tree. An additional intellectual property rights grant can be found |
7 * in the file PATENTS. All contributing project authors may | 7 * in the file PATENTS. All contributing project authors may |
8 * be found in the AUTHORS file in the root of the source tree. | 8 * be found in the AUTHORS file in the root of the source tree. |
9 */ | 9 */ |
10 | 10 |
(...skipping 62 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
73 static const tran_high_t cospi_30_64 = 1606; | 73 static const tran_high_t cospi_30_64 = 1606; |
74 static const tran_high_t cospi_31_64 = 804; | 74 static const tran_high_t cospi_31_64 = 804; |
75 | 75 |
76 // 16384 * sqrt(2) * sin(kPi/9) * 2 / 3 | 76 // 16384 * sqrt(2) * sin(kPi/9) * 2 / 3 |
77 static const tran_high_t sinpi_1_9 = 5283; | 77 static const tran_high_t sinpi_1_9 = 5283; |
78 static const tran_high_t sinpi_2_9 = 9929; | 78 static const tran_high_t sinpi_2_9 = 9929; |
79 static const tran_high_t sinpi_3_9 = 13377; | 79 static const tran_high_t sinpi_3_9 = 13377; |
80 static const tran_high_t sinpi_4_9 = 15212; | 80 static const tran_high_t sinpi_4_9 = 15212; |
81 | 81 |
82 static INLINE tran_low_t check_range(tran_high_t input) { | 82 static INLINE tran_low_t check_range(tran_high_t input) { |
83 #if CONFIG_VP9_HIGHBITDEPTH | 83 #if CONFIG_COEFFICIENT_RANGE_CHECKING |
84 // For valid highbitdepth VP9 streams, intermediate stage coefficients will | |
85 // stay within the ranges: | |
86 // - 8 bit: signed 16 bit integer | |
87 // - 10 bit: signed 18 bit integer | |
88 // - 12 bit: signed 20 bit integer | |
89 #elif CONFIG_COEFFICIENT_RANGE_CHECKING | |
90 // For valid VP9 input streams, intermediate stage coefficients should always | 84 // For valid VP9 input streams, intermediate stage coefficients should always |
91 // stay within the range of a signed 16 bit integer. Coefficients can go out | 85 // stay within the range of a signed 16 bit integer. Coefficients can go out |
92 // of this range for invalid/corrupt VP9 streams. However, strictly checking | 86 // of this range for invalid/corrupt VP9 streams. However, strictly checking |
93 // this range for every intermediate coefficient can burdensome for a decoder, | 87 // this range for every intermediate coefficient can burdensome for a decoder, |
94 // therefore the following assertion is only enabled when configured with | 88 // therefore the following assertion is only enabled when configured with |
95 // --enable-coefficient-range-checking. | 89 // --enable-coefficient-range-checking. |
96 assert(INT16_MIN <= input); | 90 assert(INT16_MIN <= input); |
97 assert(input <= INT16_MAX); | 91 assert(input <= INT16_MAX); |
98 #endif | 92 #endif // CONFIG_COEFFICIENT_RANGE_CHECKING |
99 return (tran_low_t)input; | 93 return (tran_low_t)input; |
100 } | 94 } |
101 | 95 |
102 static INLINE tran_low_t dct_const_round_shift(tran_high_t input) { | 96 static INLINE tran_low_t dct_const_round_shift(tran_high_t input) { |
103 tran_high_t rv = ROUND_POWER_OF_TWO(input, DCT_CONST_BITS); | 97 tran_high_t rv = ROUND_POWER_OF_TWO(input, DCT_CONST_BITS); |
104 return check_range(rv); | 98 return check_range(rv); |
105 } | 99 } |
106 | 100 |
| 101 #if CONFIG_VP9_HIGHBITDEPTH |
| 102 static INLINE tran_low_t highbd_check_range(tran_high_t input, |
| 103 int bd) { |
| 104 #if CONFIG_COEFFICIENT_RANGE_CHECKING |
| 105 // For valid highbitdepth VP9 streams, intermediate stage coefficients will |
| 106 // stay within the ranges: |
| 107 // - 8 bit: signed 16 bit integer |
| 108 // - 10 bit: signed 18 bit integer |
| 109 // - 12 bit: signed 20 bit integer |
| 110 const int32_t int_max = (1 << (7 + bd)) - 1; |
| 111 const int32_t int_min = -int_max - 1; |
| 112 assert(int_min <= input); |
| 113 assert(input <= int_max); |
| 114 (void) int_min; |
| 115 #endif // CONFIG_COEFFICIENT_RANGE_CHECKING |
| 116 (void) bd; |
| 117 return (tran_low_t)input; |
| 118 } |
| 119 |
| 120 static INLINE tran_low_t highbd_dct_const_round_shift(tran_high_t input, |
| 121 int bd) { |
| 122 tran_high_t rv = ROUND_POWER_OF_TWO(input, DCT_CONST_BITS); |
| 123 return highbd_check_range(rv, bd); |
| 124 } |
| 125 #endif // CONFIG_VP9_HIGHBITDEPTH |
| 126 |
107 typedef void (*transform_1d)(const tran_low_t*, tran_low_t*); | 127 typedef void (*transform_1d)(const tran_low_t*, tran_low_t*); |
108 | 128 |
109 typedef struct { | 129 typedef struct { |
110 transform_1d cols, rows; // vertical and horizontal | 130 transform_1d cols, rows; // vertical and horizontal |
111 } transform_2d; | 131 } transform_2d; |
112 | 132 |
113 #if CONFIG_VP9_HIGHBITDEPTH | 133 #if CONFIG_VP9_HIGHBITDEPTH |
114 typedef void (*highbd_transform_1d)(const tran_low_t*, tran_low_t*, int bd); | 134 typedef void (*highbd_transform_1d)(const tran_low_t*, tran_low_t*, int bd); |
115 | 135 |
116 typedef struct { | 136 typedef struct { |
(...skipping 65 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
182 int bd) { | 202 int bd) { |
183 trans = WRAPLOW(trans, bd); | 203 trans = WRAPLOW(trans, bd); |
184 return clip_pixel_highbd(WRAPLOW(dest + trans, bd), bd); | 204 return clip_pixel_highbd(WRAPLOW(dest + trans, bd), bd); |
185 } | 205 } |
186 #endif // CONFIG_VP9_HIGHBITDEPTH | 206 #endif // CONFIG_VP9_HIGHBITDEPTH |
187 #ifdef __cplusplus | 207 #ifdef __cplusplus |
188 } // extern "C" | 208 } // extern "C" |
189 #endif | 209 #endif |
190 | 210 |
191 #endif // VP9_COMMON_VP9_IDCT_H_ | 211 #endif // VP9_COMMON_VP9_IDCT_H_ |
OLD | NEW |