OLD | NEW |
1 // Copyright 2012 Google Inc. All Rights Reserved. | 1 // Copyright 2012 Google Inc. All Rights Reserved. |
2 // | 2 // |
3 // Use of this source code is governed by a BSD-style license | 3 // Use of this source code is governed by a BSD-style license |
4 // that can be found in the COPYING file in the root of the source | 4 // that can be found in the COPYING file in the root of the source |
5 // tree. An additional intellectual property rights grant can be found | 5 // tree. An additional intellectual property rights grant can be found |
6 // in the file PATENTS. All contributing project authors may | 6 // in the file PATENTS. All contributing project authors may |
7 // be found in the AUTHORS file in the root of the source tree. | 7 // be found in the AUTHORS file in the root of the source tree. |
8 // ----------------------------------------------------------------------------- | 8 // ----------------------------------------------------------------------------- |
9 // | 9 // |
10 // Image transforms and color space conversion methods for lossless decoder. | 10 // Image transforms and color space conversion methods for lossless decoder. |
(...skipping 140 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
151 void VP8LCollectColorBlueTransforms_C(const uint32_t* argb, int stride, | 151 void VP8LCollectColorBlueTransforms_C(const uint32_t* argb, int stride, |
152 int tile_width, int tile_height, | 152 int tile_width, int tile_height, |
153 int green_to_blue, int red_to_blue, | 153 int green_to_blue, int red_to_blue, |
154 int histo[]); | 154 int histo[]); |
155 | 155 |
156 //------------------------------------------------------------------------------ | 156 //------------------------------------------------------------------------------ |
157 // Image transforms. | 157 // Image transforms. |
158 | 158 |
159 void VP8LResidualImage(int width, int height, int bits, int low_effort, | 159 void VP8LResidualImage(int width, int height, int bits, int low_effort, |
160 uint32_t* const argb, uint32_t* const argb_scratch, | 160 uint32_t* const argb, uint32_t* const argb_scratch, |
161 uint32_t* const image, int exact); | 161 uint32_t* const image, int near_lossless, int exact, |
| 162 int used_subtract_green); |
162 | 163 |
163 void VP8LColorSpaceTransform(int width, int height, int bits, int quality, | 164 void VP8LColorSpaceTransform(int width, int height, int bits, int quality, |
164 uint32_t* const argb, uint32_t* image); | 165 uint32_t* const argb, uint32_t* image); |
165 | 166 |
166 //------------------------------------------------------------------------------ | 167 //------------------------------------------------------------------------------ |
167 // Misc methods. | 168 // Misc methods. |
168 | 169 |
169 // Computes sampled size of 'size' when sampling using 'sampling bits'. | 170 // Computes sampled size of 'size' when sampling using 'sampling bits'. |
170 static WEBP_INLINE uint32_t VP8LSubSampleSize(uint32_t size, | 171 static WEBP_INLINE uint32_t VP8LSubSampleSize(uint32_t size, |
171 uint32_t sampling_bits) { | 172 uint32_t sampling_bits) { |
172 return (size + (1 << sampling_bits) - 1) >> sampling_bits; | 173 return (size + (1 << sampling_bits) - 1) >> sampling_bits; |
173 } | 174 } |
174 | 175 |
| 176 // Converts near lossless quality into max number of bits shaved off. |
| 177 static WEBP_INLINE int VP8LNearLosslessBits(int near_lossless_quality) { |
| 178 // 100 -> 0 |
| 179 // 80..99 -> 1 |
| 180 // 60..79 -> 2 |
| 181 // 40..59 -> 3 |
| 182 // 20..39 -> 4 |
| 183 // 0..19 -> 5 |
| 184 return 5 - near_lossless_quality / 20; |
| 185 } |
| 186 |
175 // ----------------------------------------------------------------------------- | 187 // ----------------------------------------------------------------------------- |
176 // Faster logarithm for integers. Small values use a look-up table. | 188 // Faster logarithm for integers. Small values use a look-up table. |
177 | 189 |
178 // The threshold till approximate version of log_2 can be used. | 190 // The threshold till approximate version of log_2 can be used. |
179 // Practically, we can get rid of the call to log() as the two values match to | 191 // Practically, we can get rid of the call to log() as the two values match to |
180 // very high degree (the ratio of these two is 0.99999x). | 192 // very high degree (the ratio of these two is 0.99999x). |
181 // Keeping a high threshold for now. | 193 // Keeping a high threshold for now. |
182 #define APPROX_LOG_WITH_CORRECTION_MAX 65536 | 194 #define APPROX_LOG_WITH_CORRECTION_MAX 65536 |
183 #define APPROX_LOG_MAX 4096 | 195 #define APPROX_LOG_MAX 4096 |
184 #define LOG_2_RECIPROCAL 1.44269504088896338700465094007086 | 196 #define LOG_2_RECIPROCAL 1.44269504088896338700465094007086 |
(...skipping 70 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
255 extern GetEntropyUnrefinedHelperFunc VP8LGetEntropyUnrefinedHelper; | 267 extern GetEntropyUnrefinedHelperFunc VP8LGetEntropyUnrefinedHelper; |
256 | 268 |
257 typedef void (*VP8LHistogramAddFunc)(const VP8LHistogram* const a, | 269 typedef void (*VP8LHistogramAddFunc)(const VP8LHistogram* const a, |
258 const VP8LHistogram* const b, | 270 const VP8LHistogram* const b, |
259 VP8LHistogram* const out); | 271 VP8LHistogram* const out); |
260 extern VP8LHistogramAddFunc VP8LHistogramAdd; | 272 extern VP8LHistogramAddFunc VP8LHistogramAdd; |
261 | 273 |
262 // ----------------------------------------------------------------------------- | 274 // ----------------------------------------------------------------------------- |
263 // PrefixEncode() | 275 // PrefixEncode() |
264 | 276 |
| 277 typedef int (*VP8LVectorMismatchFunc)(const uint32_t* const array1, |
| 278 const uint32_t* const array2, int length); |
| 279 // Returns the first index where array1 and array2 are different. |
| 280 extern VP8LVectorMismatchFunc VP8LVectorMismatch; |
| 281 |
265 static WEBP_INLINE int VP8LBitsLog2Ceiling(uint32_t n) { | 282 static WEBP_INLINE int VP8LBitsLog2Ceiling(uint32_t n) { |
266 const int log_floor = BitsLog2Floor(n); | 283 const int log_floor = BitsLog2Floor(n); |
267 if (n == (n & ~(n - 1))) // zero or a power of two. | 284 if (n == (n & ~(n - 1))) // zero or a power of two. |
268 return log_floor; | 285 return log_floor; |
269 else | 286 else |
270 return log_floor + 1; | 287 return log_floor + 1; |
271 } | 288 } |
272 | 289 |
273 // Splitting of distance and length codes into prefixes and | 290 // Splitting of distance and length codes into prefixes and |
274 // extra bits. The prefixes are encoded with an entropy code | 291 // extra bits. The prefixes are encoded with an entropy code |
(...skipping 42 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
317 if (distance < PREFIX_LOOKUP_IDX_MAX) { | 334 if (distance < PREFIX_LOOKUP_IDX_MAX) { |
318 const VP8LPrefixCode prefix_code = kPrefixEncodeCode[distance]; | 335 const VP8LPrefixCode prefix_code = kPrefixEncodeCode[distance]; |
319 *code = prefix_code.code_; | 336 *code = prefix_code.code_; |
320 *extra_bits = prefix_code.extra_bits_; | 337 *extra_bits = prefix_code.extra_bits_; |
321 *extra_bits_value = kPrefixEncodeExtraBitsValue[distance]; | 338 *extra_bits_value = kPrefixEncodeExtraBitsValue[distance]; |
322 } else { | 339 } else { |
323 VP8LPrefixEncodeNoLUT(distance, code, extra_bits, extra_bits_value); | 340 VP8LPrefixEncodeNoLUT(distance, code, extra_bits, extra_bits_value); |
324 } | 341 } |
325 } | 342 } |
326 | 343 |
327 // In-place difference of each component with mod 256. | 344 // Sum of each component, mod 256. |
| 345 static WEBP_INLINE uint32_t VP8LAddPixels(uint32_t a, uint32_t b) { |
| 346 const uint32_t alpha_and_green = (a & 0xff00ff00u) + (b & 0xff00ff00u); |
| 347 const uint32_t red_and_blue = (a & 0x00ff00ffu) + (b & 0x00ff00ffu); |
| 348 return (alpha_and_green & 0xff00ff00u) | (red_and_blue & 0x00ff00ffu); |
| 349 } |
| 350 |
| 351 // Difference of each component, mod 256. |
328 static WEBP_INLINE uint32_t VP8LSubPixels(uint32_t a, uint32_t b) { | 352 static WEBP_INLINE uint32_t VP8LSubPixels(uint32_t a, uint32_t b) { |
329 const uint32_t alpha_and_green = | 353 const uint32_t alpha_and_green = |
330 0x00ff00ffu + (a & 0xff00ff00u) - (b & 0xff00ff00u); | 354 0x00ff00ffu + (a & 0xff00ff00u) - (b & 0xff00ff00u); |
331 const uint32_t red_and_blue = | 355 const uint32_t red_and_blue = |
332 0xff00ff00u + (a & 0x00ff00ffu) - (b & 0x00ff00ffu); | 356 0xff00ff00u + (a & 0x00ff00ffu) - (b & 0x00ff00ffu); |
333 return (alpha_and_green & 0xff00ff00u) | (red_and_blue & 0x00ff00ffu); | 357 return (alpha_and_green & 0xff00ff00u) | (red_and_blue & 0x00ff00ffu); |
334 } | 358 } |
335 | 359 |
336 void VP8LBundleColorMap(const uint8_t* const row, int width, | 360 void VP8LBundleColorMap(const uint8_t* const row, int width, |
337 int xbits, uint32_t* const dst); | 361 int xbits, uint32_t* const dst); |
338 | 362 |
339 // Must be called before calling any of the above methods. | 363 // Must be called before calling any of the above methods. |
340 void VP8LEncDspInit(void); | 364 void VP8LEncDspInit(void); |
341 | 365 |
342 //------------------------------------------------------------------------------ | 366 //------------------------------------------------------------------------------ |
343 | 367 |
344 #ifdef __cplusplus | 368 #ifdef __cplusplus |
345 } // extern "C" | 369 } // extern "C" |
346 #endif | 370 #endif |
347 | 371 |
348 #endif // WEBP_DSP_LOSSLESS_H_ | 372 #endif // WEBP_DSP_LOSSLESS_H_ |
OLD | NEW |