/src/libwebp/src/dsp/lossless_common.h
Line  | Count  | Source (jump to first uncovered line)  | 
1  |  | // Copyright 2012 Google Inc. All Rights Reserved.  | 
2  |  | //  | 
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  | 
5  |  | // tree. An additional intellectual property rights grant can be found  | 
6  |  | // in the file PATENTS. All contributing project authors may  | 
7  |  | // be found in the AUTHORS file in the root of the source tree.  | 
8  |  | // -----------------------------------------------------------------------------  | 
9  |  | //  | 
10  |  | // Image transforms and color space conversion methods for lossless decoder.  | 
11  |  | //  | 
12  |  | // Authors: Vikas Arora (vikaas.arora@gmail.com)  | 
13  |  | //          Jyrki Alakuijala (jyrki@google.com)  | 
14  |  | //          Vincent Rabaud (vrabaud@google.com)  | 
15  |  |  | 
16  |  | #ifndef WEBP_DSP_LOSSLESS_COMMON_H_  | 
17  |  | #define WEBP_DSP_LOSSLESS_COMMON_H_  | 
18  |  |  | 
19  |  | #include <assert.h>  | 
20  |  | #include <stddef.h>  | 
21  |  |  | 
22  |  | #include "src/dsp/cpu.h"  | 
23  |  | #include "src/utils/utils.h"  | 
24  |  | #include "src/webp/types.h"  | 
25  |  |  | 
26  |  | #ifdef __cplusplus  | 
27  |  | extern "C" { | 
28  |  | #endif  | 
29  |  |  | 
30  |  | //------------------------------------------------------------------------------  | 
31  |  | // Decoding  | 
32  |  |  | 
33  |  | // color mapping related functions.  | 
34  | 0  | static WEBP_INLINE uint32_t VP8GetARGBIndex(uint32_t idx) { | 
35  | 0  |   return (idx >> 8) & 0xff;  | 
36  | 0  | } Unexecuted instantiation: vp8l_dec.c:VP8GetARGBIndex Unexecuted instantiation: lossless.c:VP8GetARGBIndex Unexecuted instantiation: lossless_sse2.c:VP8GetARGBIndex Unexecuted instantiation: vp8l_enc.c:VP8GetARGBIndex Unexecuted instantiation: palette.c:VP8GetARGBIndex Unexecuted instantiation: lossless_enc.c:VP8GetARGBIndex Unexecuted instantiation: lossless_enc_sse2.c:VP8GetARGBIndex Unexecuted instantiation: backward_references_enc.c:VP8GetARGBIndex Unexecuted instantiation: histogram_enc.c:VP8GetARGBIndex Unexecuted instantiation: near_lossless_enc.c:VP8GetARGBIndex Unexecuted instantiation: predictor_enc.c:VP8GetARGBIndex Unexecuted instantiation: backward_references_cost_enc.c:VP8GetARGBIndex  | 
37  |  |  | 
38  | 0  | static WEBP_INLINE uint8_t VP8GetAlphaIndex(uint8_t idx) { | 
39  | 0  |   return idx;  | 
40  | 0  | } Unexecuted instantiation: vp8l_dec.c:VP8GetAlphaIndex Unexecuted instantiation: lossless.c:VP8GetAlphaIndex Unexecuted instantiation: lossless_sse2.c:VP8GetAlphaIndex Unexecuted instantiation: vp8l_enc.c:VP8GetAlphaIndex Unexecuted instantiation: palette.c:VP8GetAlphaIndex Unexecuted instantiation: lossless_enc.c:VP8GetAlphaIndex Unexecuted instantiation: lossless_enc_sse2.c:VP8GetAlphaIndex Unexecuted instantiation: backward_references_enc.c:VP8GetAlphaIndex Unexecuted instantiation: histogram_enc.c:VP8GetAlphaIndex Unexecuted instantiation: near_lossless_enc.c:VP8GetAlphaIndex Unexecuted instantiation: predictor_enc.c:VP8GetAlphaIndex Unexecuted instantiation: backward_references_cost_enc.c:VP8GetAlphaIndex  | 
41  |  |  | 
42  | 0  | static WEBP_INLINE uint32_t VP8GetARGBValue(uint32_t val) { | 
43  | 0  |   return val;  | 
44  | 0  | } Unexecuted instantiation: vp8l_dec.c:VP8GetARGBValue Unexecuted instantiation: lossless.c:VP8GetARGBValue Unexecuted instantiation: lossless_sse2.c:VP8GetARGBValue Unexecuted instantiation: vp8l_enc.c:VP8GetARGBValue Unexecuted instantiation: palette.c:VP8GetARGBValue Unexecuted instantiation: lossless_enc.c:VP8GetARGBValue Unexecuted instantiation: lossless_enc_sse2.c:VP8GetARGBValue Unexecuted instantiation: backward_references_enc.c:VP8GetARGBValue Unexecuted instantiation: histogram_enc.c:VP8GetARGBValue Unexecuted instantiation: near_lossless_enc.c:VP8GetARGBValue Unexecuted instantiation: predictor_enc.c:VP8GetARGBValue Unexecuted instantiation: backward_references_cost_enc.c:VP8GetARGBValue  | 
45  |  |  | 
46  | 0  | static WEBP_INLINE uint8_t VP8GetAlphaValue(uint32_t val) { | 
47  | 0  |   return (val >> 8) & 0xff;  | 
48  | 0  | } Unexecuted instantiation: vp8l_dec.c:VP8GetAlphaValue Unexecuted instantiation: lossless.c:VP8GetAlphaValue Unexecuted instantiation: lossless_sse2.c:VP8GetAlphaValue Unexecuted instantiation: vp8l_enc.c:VP8GetAlphaValue Unexecuted instantiation: palette.c:VP8GetAlphaValue Unexecuted instantiation: lossless_enc.c:VP8GetAlphaValue Unexecuted instantiation: lossless_enc_sse2.c:VP8GetAlphaValue Unexecuted instantiation: backward_references_enc.c:VP8GetAlphaValue Unexecuted instantiation: histogram_enc.c:VP8GetAlphaValue Unexecuted instantiation: near_lossless_enc.c:VP8GetAlphaValue Unexecuted instantiation: predictor_enc.c:VP8GetAlphaValue Unexecuted instantiation: backward_references_cost_enc.c:VP8GetAlphaValue  | 
49  |  |  | 
50  |  | //------------------------------------------------------------------------------  | 
51  |  | // Misc methods.  | 
52  |  |  | 
53  |  | // Computes sampled size of 'size' when sampling using 'sampling bits'.  | 
54  |  | static WEBP_INLINE uint32_t VP8LSubSampleSize(uint32_t size,  | 
55  | 0  |                                               uint32_t sampling_bits) { | 
56  | 0  |   return (size + (1 << sampling_bits) - 1) >> sampling_bits;  | 
57  | 0  | } Unexecuted instantiation: vp8l_dec.c:VP8LSubSampleSize Unexecuted instantiation: lossless.c:VP8LSubSampleSize Unexecuted instantiation: lossless_sse2.c:VP8LSubSampleSize Unexecuted instantiation: vp8l_enc.c:VP8LSubSampleSize Unexecuted instantiation: palette.c:VP8LSubSampleSize Unexecuted instantiation: lossless_enc.c:VP8LSubSampleSize Unexecuted instantiation: lossless_enc_sse2.c:VP8LSubSampleSize Unexecuted instantiation: backward_references_enc.c:VP8LSubSampleSize Unexecuted instantiation: histogram_enc.c:VP8LSubSampleSize Unexecuted instantiation: near_lossless_enc.c:VP8LSubSampleSize Unexecuted instantiation: predictor_enc.c:VP8LSubSampleSize Unexecuted instantiation: backward_references_cost_enc.c:VP8LSubSampleSize  | 
58  |  |  | 
59  |  | // Converts near lossless quality into max number of bits shaved off.  | 
60  | 0  | static WEBP_INLINE int VP8LNearLosslessBits(int near_lossless_quality) { | 
61  |  |   //    100 -> 0  | 
62  |  |   // 80..99 -> 1  | 
63  |  |   // 60..79 -> 2  | 
64  |  |   // 40..59 -> 3  | 
65  |  |   // 20..39 -> 4  | 
66  |  |   //  0..19 -> 5  | 
67  | 0  |   return 5 - near_lossless_quality / 20;  | 
68  | 0  | } Unexecuted instantiation: vp8l_dec.c:VP8LNearLosslessBits Unexecuted instantiation: lossless.c:VP8LNearLosslessBits Unexecuted instantiation: lossless_sse2.c:VP8LNearLosslessBits Unexecuted instantiation: vp8l_enc.c:VP8LNearLosslessBits Unexecuted instantiation: palette.c:VP8LNearLosslessBits Unexecuted instantiation: lossless_enc.c:VP8LNearLosslessBits Unexecuted instantiation: lossless_enc_sse2.c:VP8LNearLosslessBits Unexecuted instantiation: backward_references_enc.c:VP8LNearLosslessBits Unexecuted instantiation: histogram_enc.c:VP8LNearLosslessBits Unexecuted instantiation: near_lossless_enc.c:VP8LNearLosslessBits Unexecuted instantiation: predictor_enc.c:VP8LNearLosslessBits Unexecuted instantiation: backward_references_cost_enc.c:VP8LNearLosslessBits  | 
69  |  |  | 
70  |  | // -----------------------------------------------------------------------------  | 
71  |  | // Faster logarithm for integers. Small values use a look-up table.  | 
72  |  |  | 
73  |  | // The threshold till approximate version of log_2 can be used.  | 
74  |  | // Practically, we can get rid of the call to log() as the two values match to  | 
75  |  | // very high degree (the ratio of these two is 0.99999x).  | 
76  |  | // Keeping a high threshold for now.  | 
77  | 0  | #define APPROX_LOG_WITH_CORRECTION_MAX  65536  | 
78  | 0  | #define APPROX_LOG_MAX                   4096  | 
79  |  | // VP8LFastLog2 and VP8LFastSLog2 are used on elements from image histograms.  | 
80  |  | // The histogram values cannot exceed the maximum number of pixels, which  | 
81  |  | // is (1 << 14) * (1 << 14). Therefore S * log(S) < (1 << 33).  | 
82  |  | // No more than 32 bits of precision should be chosen.  | 
83  |  | // To match the original float implementation, 23 bits of precision are used.  | 
84  | 0  | #define LOG_2_PRECISION_BITS 23  | 
85  |  | #define LOG_2_RECIPROCAL 1.44269504088896338700465094007086  | 
86  |  | // LOG_2_RECIPROCAL * (1 << LOG_2_PRECISION_BITS)  | 
87  | 0  | #define LOG_2_RECIPROCAL_FIXED_DOUBLE 12102203.161561485379934310913085937500  | 
88  | 0  | #define LOG_2_RECIPROCAL_FIXED ((uint64_t)12102203)  | 
89  | 0  | #define LOG_LOOKUP_IDX_MAX 256  | 
90  |  | extern const uint32_t kLog2Table[LOG_LOOKUP_IDX_MAX];  | 
91  |  | extern const uint64_t kSLog2Table[LOG_LOOKUP_IDX_MAX];  | 
92  |  | typedef uint32_t (*VP8LFastLog2SlowFunc)(uint32_t v);  | 
93  |  | typedef uint64_t (*VP8LFastSLog2SlowFunc)(uint32_t v);  | 
94  |  |  | 
95  |  | extern VP8LFastLog2SlowFunc VP8LFastLog2Slow;  | 
96  |  | extern VP8LFastSLog2SlowFunc VP8LFastSLog2Slow;  | 
97  |  |  | 
98  | 0  | static WEBP_INLINE uint32_t VP8LFastLog2(uint32_t v) { | 
99  | 0  |   return (v < LOG_LOOKUP_IDX_MAX) ? kLog2Table[v] : VP8LFastLog2Slow(v);  | 
100  | 0  | } Unexecuted instantiation: vp8l_dec.c:VP8LFastLog2 Unexecuted instantiation: lossless.c:VP8LFastLog2 Unexecuted instantiation: lossless_sse2.c:VP8LFastLog2 Unexecuted instantiation: vp8l_enc.c:VP8LFastLog2 Unexecuted instantiation: palette.c:VP8LFastLog2 Unexecuted instantiation: lossless_enc.c:VP8LFastLog2 Unexecuted instantiation: lossless_enc_sse2.c:VP8LFastLog2 Unexecuted instantiation: backward_references_enc.c:VP8LFastLog2 Unexecuted instantiation: histogram_enc.c:VP8LFastLog2 Unexecuted instantiation: near_lossless_enc.c:VP8LFastLog2 Unexecuted instantiation: predictor_enc.c:VP8LFastLog2 Unexecuted instantiation: backward_references_cost_enc.c:VP8LFastLog2  | 
101  |  | // Fast calculation of v * log2(v) for integer input.  | 
102  | 0  | static WEBP_INLINE uint64_t VP8LFastSLog2(uint32_t v) { | 
103  | 0  |   return (v < LOG_LOOKUP_IDX_MAX) ? kSLog2Table[v] : VP8LFastSLog2Slow(v);  | 
104  | 0  | } Unexecuted instantiation: vp8l_dec.c:VP8LFastSLog2 Unexecuted instantiation: lossless.c:VP8LFastSLog2 Unexecuted instantiation: lossless_sse2.c:VP8LFastSLog2 Unexecuted instantiation: vp8l_enc.c:VP8LFastSLog2 Unexecuted instantiation: palette.c:VP8LFastSLog2 Unexecuted instantiation: lossless_enc.c:VP8LFastSLog2 Unexecuted instantiation: lossless_enc_sse2.c:VP8LFastSLog2 Unexecuted instantiation: backward_references_enc.c:VP8LFastSLog2 Unexecuted instantiation: histogram_enc.c:VP8LFastSLog2 Unexecuted instantiation: near_lossless_enc.c:VP8LFastSLog2 Unexecuted instantiation: predictor_enc.c:VP8LFastSLog2 Unexecuted instantiation: backward_references_cost_enc.c:VP8LFastSLog2  | 
105  |  |  | 
106  | 0  | static WEBP_INLINE uint64_t RightShiftRound(uint64_t v, uint32_t shift) { | 
107  | 0  |   return (v + (1ull << shift >> 1)) >> shift;  | 
108  | 0  | } Unexecuted instantiation: vp8l_dec.c:RightShiftRound Unexecuted instantiation: lossless.c:RightShiftRound Unexecuted instantiation: lossless_sse2.c:RightShiftRound Unexecuted instantiation: vp8l_enc.c:RightShiftRound Unexecuted instantiation: palette.c:RightShiftRound Unexecuted instantiation: lossless_enc.c:RightShiftRound Unexecuted instantiation: lossless_enc_sse2.c:RightShiftRound Unexecuted instantiation: backward_references_enc.c:RightShiftRound Unexecuted instantiation: histogram_enc.c:RightShiftRound Unexecuted instantiation: near_lossless_enc.c:RightShiftRound Unexecuted instantiation: predictor_enc.c:RightShiftRound Unexecuted instantiation: backward_references_cost_enc.c:RightShiftRound  | 
109  |  |  | 
110  | 0  | static WEBP_INLINE int64_t DivRound(int64_t a, int64_t b) { | 
111  | 0  |   return ((a < 0) == (b < 0)) ? ((a + b / 2) / b) : ((a - b / 2) / b);  | 
112  | 0  | } Unexecuted instantiation: vp8l_dec.c:DivRound Unexecuted instantiation: lossless.c:DivRound Unexecuted instantiation: lossless_sse2.c:DivRound Unexecuted instantiation: vp8l_enc.c:DivRound Unexecuted instantiation: palette.c:DivRound Unexecuted instantiation: lossless_enc.c:DivRound Unexecuted instantiation: lossless_enc_sse2.c:DivRound Unexecuted instantiation: backward_references_enc.c:DivRound Unexecuted instantiation: histogram_enc.c:DivRound Unexecuted instantiation: near_lossless_enc.c:DivRound Unexecuted instantiation: predictor_enc.c:DivRound Unexecuted instantiation: backward_references_cost_enc.c:DivRound  | 
113  |  |  | 
114  | 0  | #define WEBP_INT64_MAX ((int64_t)((1ull << 63) - 1))  | 
115  | 0  | #define WEBP_UINT64_MAX (~0ull)  | 
116  |  |  | 
117  |  | // -----------------------------------------------------------------------------  | 
118  |  | // PrefixEncode()  | 
119  |  |  | 
120  |  | // Splitting of distance and length codes into prefixes and  | 
121  |  | // extra bits. The prefixes are encoded with an entropy code  | 
122  |  | // while the extra bits are stored just as normal bits.  | 
123  |  | static WEBP_INLINE void VP8LPrefixEncodeBitsNoLUT(int distance, int* const code,  | 
124  | 0  |                                                   int* const extra_bits) { | 
125  | 0  |   const int highest_bit = BitsLog2Floor(--distance);  | 
126  | 0  |   const int second_highest_bit = (distance >> (highest_bit - 1)) & 1;  | 
127  | 0  |   *extra_bits = highest_bit - 1;  | 
128  | 0  |   *code = 2 * highest_bit + second_highest_bit;  | 
129  | 0  | } Unexecuted instantiation: vp8l_dec.c:VP8LPrefixEncodeBitsNoLUT Unexecuted instantiation: lossless.c:VP8LPrefixEncodeBitsNoLUT Unexecuted instantiation: lossless_sse2.c:VP8LPrefixEncodeBitsNoLUT Unexecuted instantiation: vp8l_enc.c:VP8LPrefixEncodeBitsNoLUT Unexecuted instantiation: palette.c:VP8LPrefixEncodeBitsNoLUT Unexecuted instantiation: lossless_enc.c:VP8LPrefixEncodeBitsNoLUT Unexecuted instantiation: lossless_enc_sse2.c:VP8LPrefixEncodeBitsNoLUT Unexecuted instantiation: backward_references_enc.c:VP8LPrefixEncodeBitsNoLUT Unexecuted instantiation: histogram_enc.c:VP8LPrefixEncodeBitsNoLUT Unexecuted instantiation: near_lossless_enc.c:VP8LPrefixEncodeBitsNoLUT Unexecuted instantiation: predictor_enc.c:VP8LPrefixEncodeBitsNoLUT Unexecuted instantiation: backward_references_cost_enc.c:VP8LPrefixEncodeBitsNoLUT  | 
130  |  |  | 
131  |  | static WEBP_INLINE void VP8LPrefixEncodeNoLUT(int distance, int* const code,  | 
132  |  |                                               int* const extra_bits,  | 
133  | 0  |                                               int* const extra_bits_value) { | 
134  | 0  |   const int highest_bit = BitsLog2Floor(--distance);  | 
135  | 0  |   const int second_highest_bit = (distance >> (highest_bit - 1)) & 1;  | 
136  | 0  |   *extra_bits = highest_bit - 1;  | 
137  | 0  |   *extra_bits_value = distance & ((1 << *extra_bits) - 1);  | 
138  | 0  |   *code = 2 * highest_bit + second_highest_bit;  | 
139  | 0  | } Unexecuted instantiation: vp8l_dec.c:VP8LPrefixEncodeNoLUT Unexecuted instantiation: lossless.c:VP8LPrefixEncodeNoLUT Unexecuted instantiation: lossless_sse2.c:VP8LPrefixEncodeNoLUT Unexecuted instantiation: vp8l_enc.c:VP8LPrefixEncodeNoLUT Unexecuted instantiation: palette.c:VP8LPrefixEncodeNoLUT Unexecuted instantiation: lossless_enc.c:VP8LPrefixEncodeNoLUT Unexecuted instantiation: lossless_enc_sse2.c:VP8LPrefixEncodeNoLUT Unexecuted instantiation: backward_references_enc.c:VP8LPrefixEncodeNoLUT Unexecuted instantiation: histogram_enc.c:VP8LPrefixEncodeNoLUT Unexecuted instantiation: near_lossless_enc.c:VP8LPrefixEncodeNoLUT Unexecuted instantiation: predictor_enc.c:VP8LPrefixEncodeNoLUT Unexecuted instantiation: backward_references_cost_enc.c:VP8LPrefixEncodeNoLUT  | 
140  |  |  | 
141  | 0  | #define PREFIX_LOOKUP_IDX_MAX   512  | 
142  |  | typedef struct { | 
143  |  |   int8_t code;  | 
144  |  |   int8_t extra_bits;  | 
145  |  | } VP8LPrefixCode;  | 
146  |  |  | 
147  |  | // These tables are derived using VP8LPrefixEncodeNoLUT.  | 
148  |  | extern const VP8LPrefixCode kPrefixEncodeCode[PREFIX_LOOKUP_IDX_MAX];  | 
149  |  | extern const uint8_t kPrefixEncodeExtraBitsValue[PREFIX_LOOKUP_IDX_MAX];  | 
150  |  | static WEBP_INLINE void VP8LPrefixEncodeBits(int distance, int* const code,  | 
151  | 0  |                                              int* const extra_bits) { | 
152  | 0  |   if (distance < PREFIX_LOOKUP_IDX_MAX) { | 
153  | 0  |     const VP8LPrefixCode prefix_code = kPrefixEncodeCode[distance];  | 
154  | 0  |     *code = prefix_code.code;  | 
155  | 0  |     *extra_bits = prefix_code.extra_bits;  | 
156  | 0  |   } else { | 
157  | 0  |     VP8LPrefixEncodeBitsNoLUT(distance, code, extra_bits);  | 
158  | 0  |   }  | 
159  | 0  | } Unexecuted instantiation: vp8l_dec.c:VP8LPrefixEncodeBits Unexecuted instantiation: lossless.c:VP8LPrefixEncodeBits Unexecuted instantiation: lossless_sse2.c:VP8LPrefixEncodeBits Unexecuted instantiation: vp8l_enc.c:VP8LPrefixEncodeBits Unexecuted instantiation: palette.c:VP8LPrefixEncodeBits Unexecuted instantiation: lossless_enc.c:VP8LPrefixEncodeBits Unexecuted instantiation: lossless_enc_sse2.c:VP8LPrefixEncodeBits Unexecuted instantiation: backward_references_enc.c:VP8LPrefixEncodeBits Unexecuted instantiation: histogram_enc.c:VP8LPrefixEncodeBits Unexecuted instantiation: near_lossless_enc.c:VP8LPrefixEncodeBits Unexecuted instantiation: predictor_enc.c:VP8LPrefixEncodeBits Unexecuted instantiation: backward_references_cost_enc.c:VP8LPrefixEncodeBits  | 
160  |  |  | 
161  |  | static WEBP_INLINE void VP8LPrefixEncode(int distance, int* const code,  | 
162  |  |                                          int* const extra_bits,  | 
163  | 0  |                                          int* const extra_bits_value) { | 
164  | 0  |   if (distance < PREFIX_LOOKUP_IDX_MAX) { | 
165  | 0  |     const VP8LPrefixCode prefix_code = kPrefixEncodeCode[distance];  | 
166  | 0  |     *code = prefix_code.code;  | 
167  | 0  |     *extra_bits = prefix_code.extra_bits;  | 
168  | 0  |     *extra_bits_value = kPrefixEncodeExtraBitsValue[distance];  | 
169  | 0  |   } else { | 
170  | 0  |     VP8LPrefixEncodeNoLUT(distance, code, extra_bits, extra_bits_value);  | 
171  | 0  |   }  | 
172  | 0  | } Unexecuted instantiation: vp8l_dec.c:VP8LPrefixEncode Unexecuted instantiation: lossless.c:VP8LPrefixEncode Unexecuted instantiation: lossless_sse2.c:VP8LPrefixEncode Unexecuted instantiation: vp8l_enc.c:VP8LPrefixEncode Unexecuted instantiation: palette.c:VP8LPrefixEncode Unexecuted instantiation: lossless_enc.c:VP8LPrefixEncode Unexecuted instantiation: lossless_enc_sse2.c:VP8LPrefixEncode Unexecuted instantiation: backward_references_enc.c:VP8LPrefixEncode Unexecuted instantiation: histogram_enc.c:VP8LPrefixEncode Unexecuted instantiation: near_lossless_enc.c:VP8LPrefixEncode Unexecuted instantiation: predictor_enc.c:VP8LPrefixEncode Unexecuted instantiation: backward_references_cost_enc.c:VP8LPrefixEncode  | 
173  |  |  | 
174  |  | // Sum of each component, mod 256.  | 
175  |  | static WEBP_UBSAN_IGNORE_UNSIGNED_OVERFLOW WEBP_INLINE  | 
176  | 0  | uint32_t VP8LAddPixels(uint32_t a, uint32_t b) { | 
177  | 0  |   const uint32_t alpha_and_green = (a & 0xff00ff00u) + (b & 0xff00ff00u);  | 
178  | 0  |   const uint32_t red_and_blue = (a & 0x00ff00ffu) + (b & 0x00ff00ffu);  | 
179  | 0  |   return (alpha_and_green & 0xff00ff00u) | (red_and_blue & 0x00ff00ffu);  | 
180  | 0  | } Unexecuted instantiation: vp8l_dec.c:VP8LAddPixels Unexecuted instantiation: lossless.c:VP8LAddPixels Unexecuted instantiation: lossless_sse2.c:VP8LAddPixels Unexecuted instantiation: vp8l_enc.c:VP8LAddPixels Unexecuted instantiation: palette.c:VP8LAddPixels Unexecuted instantiation: lossless_enc.c:VP8LAddPixels Unexecuted instantiation: lossless_enc_sse2.c:VP8LAddPixels Unexecuted instantiation: backward_references_enc.c:VP8LAddPixels Unexecuted instantiation: histogram_enc.c:VP8LAddPixels Unexecuted instantiation: near_lossless_enc.c:VP8LAddPixels Unexecuted instantiation: predictor_enc.c:VP8LAddPixels Unexecuted instantiation: backward_references_cost_enc.c:VP8LAddPixels  | 
181  |  |  | 
182  |  | // Difference of each component, mod 256.  | 
183  |  | static WEBP_UBSAN_IGNORE_UNSIGNED_OVERFLOW WEBP_INLINE  | 
184  | 0  | uint32_t VP8LSubPixels(uint32_t a, uint32_t b) { | 
185  | 0  |   const uint32_t alpha_and_green =  | 
186  | 0  |       0x00ff00ffu + (a & 0xff00ff00u) - (b & 0xff00ff00u);  | 
187  | 0  |   const uint32_t red_and_blue =  | 
188  | 0  |       0xff00ff00u + (a & 0x00ff00ffu) - (b & 0x00ff00ffu);  | 
189  | 0  |   return (alpha_and_green & 0xff00ff00u) | (red_and_blue & 0x00ff00ffu);  | 
190  | 0  | } Unexecuted instantiation: vp8l_dec.c:VP8LSubPixels Unexecuted instantiation: lossless.c:VP8LSubPixels Unexecuted instantiation: lossless_sse2.c:VP8LSubPixels Unexecuted instantiation: vp8l_enc.c:VP8LSubPixels Unexecuted instantiation: palette.c:VP8LSubPixels Unexecuted instantiation: lossless_enc.c:VP8LSubPixels Unexecuted instantiation: lossless_enc_sse2.c:VP8LSubPixels Unexecuted instantiation: backward_references_enc.c:VP8LSubPixels Unexecuted instantiation: histogram_enc.c:VP8LSubPixels Unexecuted instantiation: near_lossless_enc.c:VP8LSubPixels Unexecuted instantiation: predictor_enc.c:VP8LSubPixels Unexecuted instantiation: backward_references_cost_enc.c:VP8LSubPixels  | 
191  |  |  | 
192  |  | //------------------------------------------------------------------------------  | 
193  |  | // Transform-related functions used in both encoding and decoding.  | 
194  |  |  | 
195  |  | // Macros used to create a batch predictor that iteratively uses a  | 
196  |  | // one-pixel predictor.  | 
197  |  |  | 
198  |  | // The predictor is added to the output pixel (which  | 
199  |  | // is therefore considered as a residual) to get the final prediction.  | 
200  |  | #define GENERATE_PREDICTOR_ADD(PREDICTOR, PREDICTOR_ADD)                 \  | 
201  |  | static void PREDICTOR_ADD(const uint32_t* in, const uint32_t* upper,     \  | 
202  | 0  |                           int num_pixels, uint32_t* WEBP_RESTRICT out) { \ | 
203  | 0  |   int x;                                                                 \  | 
204  | 0  |   assert(upper != NULL);                                                 \  | 
205  | 0  |   for (x = 0; x < num_pixels; ++x) {                                     \ | 
206  | 0  |     const uint32_t pred = (PREDICTOR)(&out[x - 1], upper + x);           \  | 
207  | 0  |     out[x] = VP8LAddPixels(in[x], pred);                                 \  | 
208  | 0  |   }                                                                      \  | 
209  | 0  | } Unexecuted instantiation: lossless.c:PredictorAdd2_C Unexecuted instantiation: lossless.c:PredictorAdd3_C Unexecuted instantiation: lossless.c:PredictorAdd4_C Unexecuted instantiation: lossless.c:PredictorAdd5_C Unexecuted instantiation: lossless.c:PredictorAdd6_C Unexecuted instantiation: lossless.c:PredictorAdd7_C Unexecuted instantiation: lossless.c:PredictorAdd8_C Unexecuted instantiation: lossless.c:PredictorAdd9_C Unexecuted instantiation: lossless.c:PredictorAdd10_C Unexecuted instantiation: lossless.c:PredictorAdd11_C Unexecuted instantiation: lossless.c:PredictorAdd12_C Unexecuted instantiation: lossless.c:PredictorAdd13_C Unexecuted instantiation: lossless_sse2.c:PredictorAdd5_SSE2 Unexecuted instantiation: lossless_sse2.c:PredictorAdd6_SSE2 Unexecuted instantiation: lossless_sse2.c:PredictorAdd7_SSE2 Unexecuted instantiation: lossless_sse2.c:PredictorAdd13_SSE2  | 
210  |  |  | 
211  |  | #ifdef __cplusplus  | 
212  |  | }    // extern "C"  | 
213  |  | #endif  | 
214  |  |  | 
215  |  | #endif  // WEBP_DSP_LOSSLESS_COMMON_H_  |