mirror of
				https://github.com/webmproject/libwebp.git
				synced 2025-10-31 18:35:41 +01:00 
			
		
		
		
	Split off common lossless dsp inline functions.
Change-Id: I64f96897b11d1c21f033c7e47b21edccb5c68738
This commit is contained in:
		| @@ -286,6 +286,7 @@ HDRS = \ | |||||||
|     src/dsp/common_sse2.h \ |     src/dsp/common_sse2.h \ | ||||||
|     src/dsp/dsp.h \ |     src/dsp/dsp.h \ | ||||||
|     src/dsp/lossless.h \ |     src/dsp/lossless.h \ | ||||||
|  |     src/dsp/lossless_common.h \ | ||||||
|     src/dsp/mips_macro.h \ |     src/dsp/mips_macro.h \ | ||||||
|     src/dsp/msa_macro.h \ |     src/dsp/msa_macro.h \ | ||||||
|     src/dsp/neon.h \ |     src/dsp/neon.h \ | ||||||
|   | |||||||
| @@ -18,6 +18,7 @@ | |||||||
| #include "./vp8li.h" | #include "./vp8li.h" | ||||||
| #include "../dsp/dsp.h" | #include "../dsp/dsp.h" | ||||||
| #include "../dsp/lossless.h" | #include "../dsp/lossless.h" | ||||||
|  | #include "../dsp/lossless_common.h" | ||||||
| #include "../dsp/yuv.h" | #include "../dsp/yuv.h" | ||||||
| #include "../utils/endian_inl.h" | #include "../utils/endian_inl.h" | ||||||
| #include "../utils/huffman.h" | #include "../utils/huffman.h" | ||||||
|   | |||||||
| @@ -25,6 +25,7 @@ COMMON_SOURCES += filters.c | |||||||
| COMMON_SOURCES += filters_mips_dsp_r2.c | COMMON_SOURCES += filters_mips_dsp_r2.c | ||||||
| COMMON_SOURCES += lossless.c | COMMON_SOURCES += lossless.c | ||||||
| COMMON_SOURCES += lossless.h | COMMON_SOURCES += lossless.h | ||||||
|  | COMMON_SOURCES += lossless_common.h | ||||||
| COMMON_SOURCES += lossless_mips_dsp_r2.c | COMMON_SOURCES += lossless_mips_dsp_r2.c | ||||||
| COMMON_SOURCES += mips_macro.h | COMMON_SOURCES += mips_macro.h | ||||||
| COMMON_SOURCES += rescaler.c | COMMON_SOURCES += rescaler.c | ||||||
|   | |||||||
| @@ -20,6 +20,7 @@ | |||||||
| #include "../dec/vp8li.h" | #include "../dec/vp8li.h" | ||||||
| #include "../utils/endian_inl.h" | #include "../utils/endian_inl.h" | ||||||
| #include "./lossless.h" | #include "./lossless.h" | ||||||
|  | #include "./lossless_common.h" | ||||||
|  |  | ||||||
| #define MAX_DIFF_COST (1e30f) | #define MAX_DIFF_COST (1e30f) | ||||||
|  |  | ||||||
|   | |||||||
| @@ -72,23 +72,6 @@ extern VP8LConvertFunc VP8LConvertBGRAToBGR; | |||||||
| void VP8LConvertFromBGRA(const uint32_t* const in_data, int num_pixels, | void VP8LConvertFromBGRA(const uint32_t* const in_data, int num_pixels, | ||||||
|                          WEBP_CSP_MODE out_colorspace, uint8_t* const rgba); |                          WEBP_CSP_MODE out_colorspace, uint8_t* const rgba); | ||||||
|  |  | ||||||
| // color mapping related functions. |  | ||||||
| static WEBP_INLINE uint32_t VP8GetARGBIndex(uint32_t idx) { |  | ||||||
|   return (idx >> 8) & 0xff; |  | ||||||
| } |  | ||||||
|  |  | ||||||
| static WEBP_INLINE uint8_t VP8GetAlphaIndex(uint8_t idx) { |  | ||||||
|   return idx; |  | ||||||
| } |  | ||||||
|  |  | ||||||
| static WEBP_INLINE uint32_t VP8GetARGBValue(uint32_t val) { |  | ||||||
|   return val; |  | ||||||
| } |  | ||||||
|  |  | ||||||
| static WEBP_INLINE uint8_t VP8GetAlphaValue(uint32_t val) { |  | ||||||
|   return (val >> 8) & 0xff; |  | ||||||
| } |  | ||||||
|  |  | ||||||
| typedef void (*VP8LMapARGBFunc)(const uint32_t* src, | typedef void (*VP8LMapARGBFunc)(const uint32_t* src, | ||||||
|                                 const uint32_t* const color_map, |                                 const uint32_t* const color_map, | ||||||
|                                 uint32_t* dst, int y_start, |                                 uint32_t* dst, int y_start, | ||||||
| @@ -164,52 +147,6 @@ void VP8LResidualImage(int width, int height, int bits, int low_effort, | |||||||
| void VP8LColorSpaceTransform(int width, int height, int bits, int quality, | void VP8LColorSpaceTransform(int width, int height, int bits, int quality, | ||||||
|                              uint32_t* const argb, uint32_t* image); |                              uint32_t* const argb, uint32_t* image); | ||||||
|  |  | ||||||
| //------------------------------------------------------------------------------ |  | ||||||
| // Misc methods. |  | ||||||
|  |  | ||||||
| // Computes sampled size of 'size' when sampling using 'sampling bits'. |  | ||||||
| static WEBP_INLINE uint32_t VP8LSubSampleSize(uint32_t size, |  | ||||||
|                                               uint32_t sampling_bits) { |  | ||||||
|   return (size + (1 << sampling_bits) - 1) >> sampling_bits; |  | ||||||
| } |  | ||||||
|  |  | ||||||
| // Converts near lossless quality into max number of bits shaved off. |  | ||||||
| static WEBP_INLINE int VP8LNearLosslessBits(int near_lossless_quality) { |  | ||||||
|   //    100 -> 0 |  | ||||||
|   // 80..99 -> 1 |  | ||||||
|   // 60..79 -> 2 |  | ||||||
|   // 40..59 -> 3 |  | ||||||
|   // 20..39 -> 4 |  | ||||||
|   //  0..19 -> 5 |  | ||||||
|   return 5 - near_lossless_quality / 20; |  | ||||||
| } |  | ||||||
|  |  | ||||||
| // ----------------------------------------------------------------------------- |  | ||||||
| // Faster logarithm for integers. Small values use a look-up table. |  | ||||||
|  |  | ||||||
| // The threshold till approximate version of log_2 can be used. |  | ||||||
| // Practically, we can get rid of the call to log() as the two values match to |  | ||||||
| // very high degree (the ratio of these two is 0.99999x). |  | ||||||
| // Keeping a high threshold for now. |  | ||||||
| #define APPROX_LOG_WITH_CORRECTION_MAX  65536 |  | ||||||
| #define APPROX_LOG_MAX                   4096 |  | ||||||
| #define LOG_2_RECIPROCAL 1.44269504088896338700465094007086 |  | ||||||
| #define LOG_LOOKUP_IDX_MAX 256 |  | ||||||
| extern const float kLog2Table[LOG_LOOKUP_IDX_MAX]; |  | ||||||
| extern const float kSLog2Table[LOG_LOOKUP_IDX_MAX]; |  | ||||||
| typedef float (*VP8LFastLog2SlowFunc)(uint32_t v); |  | ||||||
|  |  | ||||||
| extern VP8LFastLog2SlowFunc VP8LFastLog2Slow; |  | ||||||
| extern VP8LFastLog2SlowFunc VP8LFastSLog2Slow; |  | ||||||
|  |  | ||||||
| static WEBP_INLINE float VP8LFastLog2(uint32_t v) { |  | ||||||
|   return (v < LOG_LOOKUP_IDX_MAX) ? kLog2Table[v] : VP8LFastLog2Slow(v); |  | ||||||
| } |  | ||||||
| // Fast calculation of v * log2(v) for integer input. |  | ||||||
| static WEBP_INLINE float VP8LFastSLog2(uint32_t v) { |  | ||||||
|   return (v < LOG_LOOKUP_IDX_MAX) ? kSLog2Table[v] : VP8LFastSLog2Slow(v); |  | ||||||
| } |  | ||||||
|  |  | ||||||
| // ----------------------------------------------------------------------------- | // ----------------------------------------------------------------------------- | ||||||
| // Huffman-cost related functions. | // Huffman-cost related functions. | ||||||
|  |  | ||||||
| @@ -279,86 +216,6 @@ typedef int (*VP8LVectorMismatchFunc)(const uint32_t* const array1, | |||||||
| // Returns the first index where array1 and array2 are different. | // Returns the first index where array1 and array2 are different. | ||||||
| extern VP8LVectorMismatchFunc VP8LVectorMismatch; | extern VP8LVectorMismatchFunc VP8LVectorMismatch; | ||||||
|  |  | ||||||
| static WEBP_INLINE int VP8LBitsLog2Ceiling(uint32_t n) { |  | ||||||
|   const int log_floor = BitsLog2Floor(n); |  | ||||||
|   if (n == (n & ~(n - 1))) {  // zero or a power of two. |  | ||||||
|     return log_floor; |  | ||||||
|   } |  | ||||||
|   return log_floor + 1; |  | ||||||
| } |  | ||||||
|  |  | ||||||
| // Splitting of distance and length codes into prefixes and |  | ||||||
| // extra bits. The prefixes are encoded with an entropy code |  | ||||||
| // while the extra bits are stored just as normal bits. |  | ||||||
| static WEBP_INLINE void VP8LPrefixEncodeBitsNoLUT(int distance, int* const code, |  | ||||||
|                                                   int* const extra_bits) { |  | ||||||
|   const int highest_bit = BitsLog2Floor(--distance); |  | ||||||
|   const int second_highest_bit = (distance >> (highest_bit - 1)) & 1; |  | ||||||
|   *extra_bits = highest_bit - 1; |  | ||||||
|   *code = 2 * highest_bit + second_highest_bit; |  | ||||||
| } |  | ||||||
|  |  | ||||||
| static WEBP_INLINE void VP8LPrefixEncodeNoLUT(int distance, int* const code, |  | ||||||
|                                               int* const extra_bits, |  | ||||||
|                                               int* const extra_bits_value) { |  | ||||||
|   const int highest_bit = BitsLog2Floor(--distance); |  | ||||||
|   const int second_highest_bit = (distance >> (highest_bit - 1)) & 1; |  | ||||||
|   *extra_bits = highest_bit - 1; |  | ||||||
|   *extra_bits_value = distance & ((1 << *extra_bits) - 1); |  | ||||||
|   *code = 2 * highest_bit + second_highest_bit; |  | ||||||
| } |  | ||||||
|  |  | ||||||
| #define PREFIX_LOOKUP_IDX_MAX   512 |  | ||||||
| typedef struct { |  | ||||||
|   int8_t code_; |  | ||||||
|   int8_t extra_bits_; |  | ||||||
| } VP8LPrefixCode; |  | ||||||
|  |  | ||||||
| // These tables are derived using VP8LPrefixEncodeNoLUT. |  | ||||||
| extern const VP8LPrefixCode kPrefixEncodeCode[PREFIX_LOOKUP_IDX_MAX]; |  | ||||||
| extern const uint8_t kPrefixEncodeExtraBitsValue[PREFIX_LOOKUP_IDX_MAX]; |  | ||||||
| static WEBP_INLINE void VP8LPrefixEncodeBits(int distance, int* const code, |  | ||||||
|                                              int* const extra_bits) { |  | ||||||
|   if (distance < PREFIX_LOOKUP_IDX_MAX) { |  | ||||||
|     const VP8LPrefixCode prefix_code = kPrefixEncodeCode[distance]; |  | ||||||
|     *code = prefix_code.code_; |  | ||||||
|     *extra_bits = prefix_code.extra_bits_; |  | ||||||
|   } else { |  | ||||||
|     VP8LPrefixEncodeBitsNoLUT(distance, code, extra_bits); |  | ||||||
|   } |  | ||||||
| } |  | ||||||
|  |  | ||||||
| static WEBP_INLINE void VP8LPrefixEncode(int distance, int* const code, |  | ||||||
|                                          int* const extra_bits, |  | ||||||
|                                          int* const extra_bits_value) { |  | ||||||
|   if (distance < PREFIX_LOOKUP_IDX_MAX) { |  | ||||||
|     const VP8LPrefixCode prefix_code = kPrefixEncodeCode[distance]; |  | ||||||
|     *code = prefix_code.code_; |  | ||||||
|     *extra_bits = prefix_code.extra_bits_; |  | ||||||
|     *extra_bits_value = kPrefixEncodeExtraBitsValue[distance]; |  | ||||||
|   } else { |  | ||||||
|     VP8LPrefixEncodeNoLUT(distance, code, extra_bits, extra_bits_value); |  | ||||||
|   } |  | ||||||
| } |  | ||||||
|  |  | ||||||
| // Sum of each component, mod 256. |  | ||||||
| static WEBP_UBSAN_IGNORE_UNSIGNED_OVERFLOW WEBP_INLINE |  | ||||||
| uint32_t VP8LAddPixels(uint32_t a, uint32_t b) { |  | ||||||
|   const uint32_t alpha_and_green = (a & 0xff00ff00u) + (b & 0xff00ff00u); |  | ||||||
|   const uint32_t red_and_blue = (a & 0x00ff00ffu) + (b & 0x00ff00ffu); |  | ||||||
|   return (alpha_and_green & 0xff00ff00u) | (red_and_blue & 0x00ff00ffu); |  | ||||||
| } |  | ||||||
|  |  | ||||||
| // Difference of each component, mod 256. |  | ||||||
| static WEBP_UBSAN_IGNORE_UNSIGNED_OVERFLOW WEBP_INLINE |  | ||||||
| uint32_t VP8LSubPixels(uint32_t a, uint32_t b) { |  | ||||||
|   const uint32_t alpha_and_green = |  | ||||||
|       0x00ff00ffu + (a & 0xff00ff00u) - (b & 0xff00ff00u); |  | ||||||
|   const uint32_t red_and_blue = |  | ||||||
|       0xff00ff00u + (a & 0x00ff00ffu) - (b & 0x00ff00ffu); |  | ||||||
|   return (alpha_and_green & 0xff00ff00u) | (red_and_blue & 0x00ff00ffu); |  | ||||||
| } |  | ||||||
|  |  | ||||||
| void VP8LBundleColorMap(const uint8_t* const row, int width, | void VP8LBundleColorMap(const uint8_t* const row, int width, | ||||||
|                         int xbits, uint32_t* const dst); |                         int xbits, uint32_t* const dst); | ||||||
|  |  | ||||||
|   | |||||||
							
								
								
									
										182
									
								
								src/dsp/lossless_common.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										182
									
								
								src/dsp/lossless_common.h
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,182 @@ | |||||||
|  | // Copyright 2012 Google Inc. All Rights Reserved. | ||||||
|  | // | ||||||
|  | // Use of this source code is governed by a BSD-style license | ||||||
|  | // that can be found in the COPYING file in the root of the source | ||||||
|  | // tree. An additional intellectual property rights grant can be found | ||||||
|  | // in the file PATENTS. All contributing project authors may | ||||||
|  | // be found in the AUTHORS file in the root of the source tree. | ||||||
|  | // ----------------------------------------------------------------------------- | ||||||
|  | // | ||||||
|  | // Image transforms and color space conversion methods for lossless decoder. | ||||||
|  | // | ||||||
|  | // Authors: Vikas Arora (vikaas.arora@gmail.com) | ||||||
|  | //          Jyrki Alakuijala (jyrki@google.com) | ||||||
|  | //          Vincent Rabaud (vrabaud@google.com) | ||||||
|  |  | ||||||
|  | #ifndef WEBP_DSP_LOSSLESS_COMMON_H_ | ||||||
|  | #define WEBP_DSP_LOSSLESS_COMMON_H_ | ||||||
|  |  | ||||||
|  | #include "../webp/types.h" | ||||||
|  |  | ||||||
|  | #include "../utils/utils.h" | ||||||
|  |  | ||||||
|  | #ifdef __cplusplus | ||||||
|  | extern "C" { | ||||||
|  | #endif | ||||||
|  |  | ||||||
|  | //------------------------------------------------------------------------------ | ||||||
|  | // Decoding | ||||||
|  |  | ||||||
|  | // color mapping related functions. | ||||||
|  | static WEBP_INLINE uint32_t VP8GetARGBIndex(uint32_t idx) { | ||||||
|  |   return (idx >> 8) & 0xff; | ||||||
|  | } | ||||||
|  |  | ||||||
|  | static WEBP_INLINE uint8_t VP8GetAlphaIndex(uint8_t idx) { | ||||||
|  |   return idx; | ||||||
|  | } | ||||||
|  |  | ||||||
|  | static WEBP_INLINE uint32_t VP8GetARGBValue(uint32_t val) { | ||||||
|  |   return val; | ||||||
|  | } | ||||||
|  |  | ||||||
|  | static WEBP_INLINE uint8_t VP8GetAlphaValue(uint32_t val) { | ||||||
|  |   return (val >> 8) & 0xff; | ||||||
|  | } | ||||||
|  |  | ||||||
|  | //------------------------------------------------------------------------------ | ||||||
|  | // Misc methods. | ||||||
|  |  | ||||||
|  | // Computes sampled size of 'size' when sampling using 'sampling bits'. | ||||||
|  | static WEBP_INLINE uint32_t VP8LSubSampleSize(uint32_t size, | ||||||
|  |                                               uint32_t sampling_bits) { | ||||||
|  |   return (size + (1 << sampling_bits) - 1) >> sampling_bits; | ||||||
|  | } | ||||||
|  |  | ||||||
|  | // Converts near lossless quality into max number of bits shaved off. | ||||||
|  | static WEBP_INLINE int VP8LNearLosslessBits(int near_lossless_quality) { | ||||||
|  |   //    100 -> 0 | ||||||
|  |   // 80..99 -> 1 | ||||||
|  |   // 60..79 -> 2 | ||||||
|  |   // 40..59 -> 3 | ||||||
|  |   // 20..39 -> 4 | ||||||
|  |   //  0..19 -> 5 | ||||||
|  |   return 5 - near_lossless_quality / 20; | ||||||
|  | } | ||||||
|  |  | ||||||
|  | // ----------------------------------------------------------------------------- | ||||||
|  | // Faster logarithm for integers. Small values use a look-up table. | ||||||
|  |  | ||||||
|  | // The threshold till approximate version of log_2 can be used. | ||||||
|  | // Practically, we can get rid of the call to log() as the two values match to | ||||||
|  | // very high degree (the ratio of these two is 0.99999x). | ||||||
|  | // Keeping a high threshold for now. | ||||||
|  | #define APPROX_LOG_WITH_CORRECTION_MAX  65536 | ||||||
|  | #define APPROX_LOG_MAX                   4096 | ||||||
|  | #define LOG_2_RECIPROCAL 1.44269504088896338700465094007086 | ||||||
|  | #define LOG_LOOKUP_IDX_MAX 256 | ||||||
|  | extern const float kLog2Table[LOG_LOOKUP_IDX_MAX]; | ||||||
|  | extern const float kSLog2Table[LOG_LOOKUP_IDX_MAX]; | ||||||
|  | typedef float (*VP8LFastLog2SlowFunc)(uint32_t v); | ||||||
|  |  | ||||||
|  | extern VP8LFastLog2SlowFunc VP8LFastLog2Slow; | ||||||
|  | extern VP8LFastLog2SlowFunc VP8LFastSLog2Slow; | ||||||
|  |  | ||||||
|  | static WEBP_INLINE float VP8LFastLog2(uint32_t v) { | ||||||
|  |   return (v < LOG_LOOKUP_IDX_MAX) ? kLog2Table[v] : VP8LFastLog2Slow(v); | ||||||
|  | } | ||||||
|  | // Fast calculation of v * log2(v) for integer input. | ||||||
|  | static WEBP_INLINE float VP8LFastSLog2(uint32_t v) { | ||||||
|  |   return (v < LOG_LOOKUP_IDX_MAX) ? kSLog2Table[v] : VP8LFastSLog2Slow(v); | ||||||
|  | } | ||||||
|  |  | ||||||
|  | // ----------------------------------------------------------------------------- | ||||||
|  | // PrefixEncode() | ||||||
|  |  | ||||||
|  | static WEBP_INLINE int VP8LBitsLog2Ceiling(uint32_t n) { | ||||||
|  |   const int log_floor = BitsLog2Floor(n); | ||||||
|  |   if (n == (n & ~(n - 1))) {  // zero or a power of two. | ||||||
|  |     return log_floor; | ||||||
|  |   } | ||||||
|  |   return log_floor + 1; | ||||||
|  | } | ||||||
|  |  | ||||||
|  | // Splitting of distance and length codes into prefixes and | ||||||
|  | // extra bits. The prefixes are encoded with an entropy code | ||||||
|  | // while the extra bits are stored just as normal bits. | ||||||
|  | static WEBP_INLINE void VP8LPrefixEncodeBitsNoLUT(int distance, int* const code, | ||||||
|  |                                                   int* const extra_bits) { | ||||||
|  |   const int highest_bit = BitsLog2Floor(--distance); | ||||||
|  |   const int second_highest_bit = (distance >> (highest_bit - 1)) & 1; | ||||||
|  |   *extra_bits = highest_bit - 1; | ||||||
|  |   *code = 2 * highest_bit + second_highest_bit; | ||||||
|  | } | ||||||
|  |  | ||||||
|  | static WEBP_INLINE void VP8LPrefixEncodeNoLUT(int distance, int* const code, | ||||||
|  |                                               int* const extra_bits, | ||||||
|  |                                               int* const extra_bits_value) { | ||||||
|  |   const int highest_bit = BitsLog2Floor(--distance); | ||||||
|  |   const int second_highest_bit = (distance >> (highest_bit - 1)) & 1; | ||||||
|  |   *extra_bits = highest_bit - 1; | ||||||
|  |   *extra_bits_value = distance & ((1 << *extra_bits) - 1); | ||||||
|  |   *code = 2 * highest_bit + second_highest_bit; | ||||||
|  | } | ||||||
|  |  | ||||||
|  | #define PREFIX_LOOKUP_IDX_MAX   512 | ||||||
|  | typedef struct { | ||||||
|  |   int8_t code_; | ||||||
|  |   int8_t extra_bits_; | ||||||
|  | } VP8LPrefixCode; | ||||||
|  |  | ||||||
|  | // These tables are derived using VP8LPrefixEncodeNoLUT. | ||||||
|  | extern const VP8LPrefixCode kPrefixEncodeCode[PREFIX_LOOKUP_IDX_MAX]; | ||||||
|  | extern const uint8_t kPrefixEncodeExtraBitsValue[PREFIX_LOOKUP_IDX_MAX]; | ||||||
|  | static WEBP_INLINE void VP8LPrefixEncodeBits(int distance, int* const code, | ||||||
|  |                                              int* const extra_bits) { | ||||||
|  |   if (distance < PREFIX_LOOKUP_IDX_MAX) { | ||||||
|  |     const VP8LPrefixCode prefix_code = kPrefixEncodeCode[distance]; | ||||||
|  |     *code = prefix_code.code_; | ||||||
|  |     *extra_bits = prefix_code.extra_bits_; | ||||||
|  |   } else { | ||||||
|  |     VP8LPrefixEncodeBitsNoLUT(distance, code, extra_bits); | ||||||
|  |   } | ||||||
|  | } | ||||||
|  |  | ||||||
|  | static WEBP_INLINE void VP8LPrefixEncode(int distance, int* const code, | ||||||
|  |                                          int* const extra_bits, | ||||||
|  |                                          int* const extra_bits_value) { | ||||||
|  |   if (distance < PREFIX_LOOKUP_IDX_MAX) { | ||||||
|  |     const VP8LPrefixCode prefix_code = kPrefixEncodeCode[distance]; | ||||||
|  |     *code = prefix_code.code_; | ||||||
|  |     *extra_bits = prefix_code.extra_bits_; | ||||||
|  |     *extra_bits_value = kPrefixEncodeExtraBitsValue[distance]; | ||||||
|  |   } else { | ||||||
|  |     VP8LPrefixEncodeNoLUT(distance, code, extra_bits, extra_bits_value); | ||||||
|  |   } | ||||||
|  | } | ||||||
|  |  | ||||||
|  | // Sum of each component, mod 256. | ||||||
|  | static WEBP_UBSAN_IGNORE_UNSIGNED_OVERFLOW WEBP_INLINE | ||||||
|  | uint32_t VP8LAddPixels(uint32_t a, uint32_t b) { | ||||||
|  |   const uint32_t alpha_and_green = (a & 0xff00ff00u) + (b & 0xff00ff00u); | ||||||
|  |   const uint32_t red_and_blue = (a & 0x00ff00ffu) + (b & 0x00ff00ffu); | ||||||
|  |   return (alpha_and_green & 0xff00ff00u) | (red_and_blue & 0x00ff00ffu); | ||||||
|  | } | ||||||
|  |  | ||||||
|  | // Difference of each component, mod 256. | ||||||
|  | static WEBP_UBSAN_IGNORE_UNSIGNED_OVERFLOW WEBP_INLINE | ||||||
|  | uint32_t VP8LSubPixels(uint32_t a, uint32_t b) { | ||||||
|  |   const uint32_t alpha_and_green = | ||||||
|  |       0x00ff00ffu + (a & 0xff00ff00u) - (b & 0xff00ff00u); | ||||||
|  |   const uint32_t red_and_blue = | ||||||
|  |       0xff00ff00u + (a & 0x00ff00ffu) - (b & 0x00ff00ffu); | ||||||
|  |   return (alpha_and_green & 0xff00ff00u) | (red_and_blue & 0x00ff00ffu); | ||||||
|  | } | ||||||
|  |  | ||||||
|  | //------------------------------------------------------------------------------ | ||||||
|  |  | ||||||
|  | #ifdef __cplusplus | ||||||
|  | }    // extern "C" | ||||||
|  | #endif | ||||||
|  |  | ||||||
|  | #endif  // WEBP_DSP_LOSSLESS_COMMON_H_ | ||||||
| @@ -20,6 +20,7 @@ | |||||||
| #include "../dec/vp8li.h" | #include "../dec/vp8li.h" | ||||||
| #include "../utils/endian_inl.h" | #include "../utils/endian_inl.h" | ||||||
| #include "./lossless.h" | #include "./lossless.h" | ||||||
|  | #include "./lossless_common.h" | ||||||
| #include "./yuv.h" | #include "./yuv.h" | ||||||
|  |  | ||||||
| #define MAX_DIFF_COST (1e30f) | #define MAX_DIFF_COST (1e30f) | ||||||
|   | |||||||
| @@ -14,6 +14,7 @@ | |||||||
|  |  | ||||||
| #include "./dsp.h" | #include "./dsp.h" | ||||||
| #include "./lossless.h" | #include "./lossless.h" | ||||||
|  | #include "./lossless_common.h" | ||||||
|  |  | ||||||
| #if defined(WEBP_USE_MIPS32) | #if defined(WEBP_USE_MIPS32) | ||||||
|  |  | ||||||
|   | |||||||
| @@ -17,6 +17,7 @@ | |||||||
| #include <assert.h> | #include <assert.h> | ||||||
| #include <emmintrin.h> | #include <emmintrin.h> | ||||||
| #include "./lossless.h" | #include "./lossless.h" | ||||||
|  | #include "./lossless_common.h" | ||||||
|  |  | ||||||
| // For sign-extended multiplying constants, pre-shifted by 5: | // For sign-extended multiplying constants, pre-shifted by 5: | ||||||
| #define CST_5b(X)  (((int16_t)((uint16_t)X << 8)) >> 5) | #define CST_5b(X)  (((int16_t)((uint16_t)X << 8)) >> 5) | ||||||
|   | |||||||
| @@ -17,6 +17,7 @@ | |||||||
| #if defined(WEBP_USE_MIPS_DSP_R2) | #if defined(WEBP_USE_MIPS_DSP_R2) | ||||||
|  |  | ||||||
| #include "./lossless.h" | #include "./lossless.h" | ||||||
|  | #include "./lossless_common.h" | ||||||
|  |  | ||||||
| #define MAP_COLOR_FUNCS(FUNC_NAME, TYPE, GET_INDEX, GET_VALUE)                 \ | #define MAP_COLOR_FUNCS(FUNC_NAME, TYPE, GET_INDEX, GET_VALUE)                 \ | ||||||
| static void FUNC_NAME(const TYPE* src,                                         \ | static void FUNC_NAME(const TYPE* src,                                         \ | ||||||
|   | |||||||
| @@ -16,6 +16,7 @@ | |||||||
| #include "./backward_references.h" | #include "./backward_references.h" | ||||||
| #include "./histogram.h" | #include "./histogram.h" | ||||||
| #include "../dsp/lossless.h" | #include "../dsp/lossless.h" | ||||||
|  | #include "../dsp/lossless_common.h" | ||||||
| #include "../dsp/dsp.h" | #include "../dsp/dsp.h" | ||||||
| #include "../utils/color_cache.h" | #include "../utils/color_cache.h" | ||||||
| #include "../utils/utils.h" | #include "../utils/utils.h" | ||||||
|   | |||||||
| @@ -18,6 +18,7 @@ | |||||||
| #include "./backward_references.h" | #include "./backward_references.h" | ||||||
| #include "./histogram.h" | #include "./histogram.h" | ||||||
| #include "../dsp/lossless.h" | #include "../dsp/lossless.h" | ||||||
|  | #include "../dsp/lossless_common.h" | ||||||
| #include "../utils/utils.h" | #include "../utils/utils.h" | ||||||
|  |  | ||||||
| #define MAX_COST 1.e38 | #define MAX_COST 1.e38 | ||||||
|   | |||||||
| @@ -17,7 +17,7 @@ | |||||||
| #include <assert.h> | #include <assert.h> | ||||||
| #include <stdlib.h> | #include <stdlib.h> | ||||||
|  |  | ||||||
| #include "../dsp/lossless.h" | #include "../dsp/lossless_common.h" | ||||||
| #include "../utils/utils.h" | #include "../utils/utils.h" | ||||||
| #include "./vp8enci.h" | #include "./vp8enci.h" | ||||||
|  |  | ||||||
|   | |||||||
| @@ -20,6 +20,7 @@ | |||||||
| #include "./vp8enci.h" | #include "./vp8enci.h" | ||||||
| #include "./vp8li.h" | #include "./vp8li.h" | ||||||
| #include "../dsp/lossless.h" | #include "../dsp/lossless.h" | ||||||
|  | #include "../dsp/lossless_common.h" | ||||||
| #include "../utils/bit_writer.h" | #include "../utils/bit_writer.h" | ||||||
| #include "../utils/huffman_encode.h" | #include "../utils/huffman_encode.h" | ||||||
| #include "../utils/utils.h" | #include "../utils/utils.h" | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user