/src/brunsli/c/common/predict.cc
Line | Count | Source |
1 | | // Copyright (c) Google LLC 2019 |
2 | | // |
3 | | // Use of this source code is governed by an MIT-style |
4 | | // license that can be found in the LICENSE file or at |
5 | | // https://opensource.org/licenses/MIT. |
6 | | |
7 | | #include "./predict.h" |
8 | | |
9 | | #include <brunsli/jpeg_data.h> |
10 | | |
11 | | namespace brunsli { |
12 | | |
13 | | namespace { |
14 | | |
15 | 40.5M | int AdaptiveMedian(int w, int n, int nw) { |
16 | 40.5M | const int mx = (w > n) ? w : n; |
17 | 40.5M | const int mn = w + n - mx; |
18 | 40.5M | if (nw > mx) { |
19 | 2.23M | return mn; |
20 | 38.3M | } else if (nw < mn) { |
21 | 973k | return mx; |
22 | 37.3M | } else { |
23 | 37.3M | return n + w - nw; |
24 | 37.3M | } |
25 | 40.5M | } |
26 | | |
27 | | } // namespace |
28 | | |
29 | 41.9M | int PredictWithAdaptiveMedian(const coeff_t* coeffs, int x, int y, int stride) { |
30 | 41.9M | const int offset1 = -kDCTBlockSize; |
31 | 41.9M | const int offset2 = -stride; |
32 | 41.9M | const int offset3 = offset2 + offset1; |
33 | 41.9M | if (y != 0) { |
34 | 40.9M | if (x != 0) { |
35 | 40.5M | return AdaptiveMedian(coeffs[offset1], coeffs[offset2], coeffs[offset3]); |
36 | 40.5M | } else { |
37 | 358k | return coeffs[offset2]; |
38 | 358k | } |
39 | 40.9M | } else { |
40 | 998k | return x ? coeffs[offset1] : 0; |
41 | 998k | } |
42 | 41.9M | } |
43 | | |
44 | | } // namespace brunsli |