Line data Source code
1 : /*
2 : * Copyright (c) 2016 The WebM project authors. All Rights Reserved.
3 : *
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
6 : * tree. An additional intellectual property rights grant can be found
7 : * in the file PATENTS. All contributing project authors may
8 : * be found in the AUTHORS file in the root of the source tree.
9 : */
10 : #include <stdlib.h>
11 : #include "vpx/vpx_integer.h"
12 :
13 : const int16_t vpx_rv[] = {
14 : 8, 5, 2, 2, 8, 12, 4, 9, 8, 3, 0, 3, 9, 0, 0, 0, 8, 3, 14,
15 : 4, 10, 1, 11, 14, 1, 14, 9, 6, 12, 11, 8, 6, 10, 0, 0, 8, 9, 0,
16 : 3, 14, 8, 11, 13, 4, 2, 9, 0, 3, 9, 6, 1, 2, 3, 14, 13, 1, 8,
17 : 2, 9, 7, 3, 3, 1, 13, 13, 6, 6, 5, 2, 7, 11, 9, 11, 8, 7, 3,
18 : 2, 0, 13, 13, 14, 4, 12, 5, 12, 10, 8, 10, 13, 10, 4, 14, 4, 10, 0,
19 : 8, 11, 1, 13, 7, 7, 14, 6, 14, 13, 2, 13, 5, 4, 4, 0, 10, 0, 5,
20 : 13, 2, 12, 7, 11, 13, 8, 0, 4, 10, 7, 2, 7, 2, 2, 5, 3, 4, 7,
21 : 3, 3, 14, 14, 5, 9, 13, 3, 14, 3, 6, 3, 0, 11, 8, 13, 1, 13, 1,
22 : 12, 0, 10, 9, 7, 6, 2, 8, 5, 2, 13, 7, 1, 13, 14, 7, 6, 7, 9,
23 : 6, 10, 11, 7, 8, 7, 5, 14, 8, 4, 4, 0, 8, 7, 10, 0, 8, 14, 11,
24 : 3, 12, 5, 7, 14, 3, 14, 5, 2, 6, 11, 12, 12, 8, 0, 11, 13, 1, 2,
25 : 0, 5, 10, 14, 7, 8, 0, 4, 11, 0, 8, 0, 3, 10, 5, 8, 0, 11, 6,
26 : 7, 8, 10, 7, 13, 9, 2, 5, 1, 5, 10, 2, 4, 3, 5, 6, 10, 8, 9,
27 : 4, 11, 14, 0, 10, 0, 5, 13, 2, 12, 7, 11, 13, 8, 0, 4, 10, 7, 2,
28 : 7, 2, 2, 5, 3, 4, 7, 3, 3, 14, 14, 5, 9, 13, 3, 14, 3, 6, 3,
29 : 0, 11, 8, 13, 1, 13, 1, 12, 0, 10, 9, 7, 6, 2, 8, 5, 2, 13, 7,
30 : 1, 13, 14, 7, 6, 7, 9, 6, 10, 11, 7, 8, 7, 5, 14, 8, 4, 4, 0,
31 : 8, 7, 10, 0, 8, 14, 11, 3, 12, 5, 7, 14, 3, 14, 5, 2, 6, 11, 12,
32 : 12, 8, 0, 11, 13, 1, 2, 0, 5, 10, 14, 7, 8, 0, 4, 11, 0, 8, 0,
33 : 3, 10, 5, 8, 0, 11, 6, 7, 8, 10, 7, 13, 9, 2, 5, 1, 5, 10, 2,
34 : 4, 3, 5, 6, 10, 8, 9, 4, 11, 14, 3, 8, 3, 7, 8, 5, 11, 4, 12,
35 : 3, 11, 9, 14, 8, 14, 13, 4, 3, 1, 2, 14, 6, 5, 4, 4, 11, 4, 6,
36 : 2, 1, 5, 8, 8, 12, 13, 5, 14, 10, 12, 13, 0, 9, 5, 5, 11, 10, 13,
37 : 9, 10, 13,
38 : };
39 :
40 0 : void vpx_post_proc_down_and_across_mb_row_c(unsigned char *src_ptr,
41 : unsigned char *dst_ptr,
42 : int src_pixels_per_line,
43 : int dst_pixels_per_line, int cols,
44 : unsigned char *f, int size) {
45 : unsigned char *p_src, *p_dst;
46 : int row;
47 : int col;
48 : unsigned char v;
49 : unsigned char d[4];
50 :
51 0 : for (row = 0; row < size; row++) {
52 : /* post_proc_down for one row */
53 0 : p_src = src_ptr;
54 0 : p_dst = dst_ptr;
55 :
56 0 : for (col = 0; col < cols; col++) {
57 0 : unsigned char p_above2 = p_src[col - 2 * src_pixels_per_line];
58 0 : unsigned char p_above1 = p_src[col - src_pixels_per_line];
59 0 : unsigned char p_below1 = p_src[col + src_pixels_per_line];
60 0 : unsigned char p_below2 = p_src[col + 2 * src_pixels_per_line];
61 :
62 0 : v = p_src[col];
63 :
64 0 : if ((abs(v - p_above2) < f[col]) && (abs(v - p_above1) < f[col]) &&
65 0 : (abs(v - p_below1) < f[col]) && (abs(v - p_below2) < f[col])) {
66 : unsigned char k1, k2, k3;
67 0 : k1 = (p_above2 + p_above1 + 1) >> 1;
68 0 : k2 = (p_below2 + p_below1 + 1) >> 1;
69 0 : k3 = (k1 + k2 + 1) >> 1;
70 0 : v = (k3 + v + 1) >> 1;
71 : }
72 :
73 0 : p_dst[col] = v;
74 : }
75 :
76 : /* now post_proc_across */
77 0 : p_src = dst_ptr;
78 0 : p_dst = dst_ptr;
79 :
80 0 : p_src[-2] = p_src[-1] = p_src[0];
81 0 : p_src[cols] = p_src[cols + 1] = p_src[cols - 1];
82 :
83 0 : for (col = 0; col < cols; col++) {
84 0 : v = p_src[col];
85 :
86 0 : if ((abs(v - p_src[col - 2]) < f[col]) &&
87 0 : (abs(v - p_src[col - 1]) < f[col]) &&
88 0 : (abs(v - p_src[col + 1]) < f[col]) &&
89 0 : (abs(v - p_src[col + 2]) < f[col])) {
90 : unsigned char k1, k2, k3;
91 0 : k1 = (p_src[col - 2] + p_src[col - 1] + 1) >> 1;
92 0 : k2 = (p_src[col + 2] + p_src[col + 1] + 1) >> 1;
93 0 : k3 = (k1 + k2 + 1) >> 1;
94 0 : v = (k3 + v + 1) >> 1;
95 : }
96 :
97 0 : d[col & 3] = v;
98 :
99 0 : if (col >= 2) p_dst[col - 2] = d[(col - 2) & 3];
100 : }
101 :
102 : /* handle the last two pixels */
103 0 : p_dst[col - 2] = d[(col - 2) & 3];
104 0 : p_dst[col - 1] = d[(col - 1) & 3];
105 :
106 : /* next row */
107 0 : src_ptr += src_pixels_per_line;
108 0 : dst_ptr += dst_pixels_per_line;
109 : }
110 0 : }
111 :
112 0 : void vpx_mbpost_proc_across_ip_c(unsigned char *src, int pitch, int rows,
113 : int cols, int flimit) {
114 : int r, c, i;
115 :
116 0 : unsigned char *s = src;
117 : unsigned char d[16];
118 :
119 0 : for (r = 0; r < rows; r++) {
120 0 : int sumsq = 16;
121 0 : int sum = 0;
122 :
123 0 : for (i = -8; i < 0; i++) s[i] = s[0];
124 :
125 : /* 17 avoids valgrind warning - we buffer values in c in d
126 : * and only write them when we've read 8 ahead...
127 : */
128 0 : for (i = 0; i < 17; i++) s[i + cols] = s[cols - 1];
129 :
130 0 : for (i = -8; i <= 6; i++) {
131 0 : sumsq += s[i] * s[i];
132 0 : sum += s[i];
133 0 : d[i + 8] = 0;
134 : }
135 :
136 0 : for (c = 0; c < cols + 8; c++) {
137 0 : int x = s[c + 7] - s[c - 8];
138 0 : int y = s[c + 7] + s[c - 8];
139 :
140 0 : sum += x;
141 0 : sumsq += x * y;
142 :
143 0 : d[c & 15] = s[c];
144 :
145 0 : if (sumsq * 15 - sum * sum < flimit) {
146 0 : d[c & 15] = (8 + sum + s[c]) >> 4;
147 : }
148 :
149 0 : s[c - 8] = d[(c - 8) & 15];
150 : }
151 :
152 0 : s += pitch;
153 : }
154 0 : }
155 :
156 0 : void vpx_mbpost_proc_down_c(unsigned char *dst, int pitch, int rows, int cols,
157 : int flimit) {
158 : int r, c, i;
159 :
160 0 : for (c = 0; c < cols; c++) {
161 0 : unsigned char *s = &dst[c];
162 0 : int sumsq = 0;
163 0 : int sum = 0;
164 : unsigned char d[16];
165 :
166 0 : for (i = -8; i < 0; i++) s[i * pitch] = s[0];
167 :
168 : /* 17 avoids valgrind warning - we buffer values in c in d
169 : * and only write them when we've read 8 ahead...
170 : */
171 0 : for (i = 0; i < 17; i++) s[(i + rows) * pitch] = s[(rows - 1) * pitch];
172 :
173 0 : for (i = -8; i <= 6; i++) {
174 0 : sumsq += s[i * pitch] * s[i * pitch];
175 0 : sum += s[i * pitch];
176 : }
177 :
178 0 : for (r = 0; r < rows + 8; r++) {
179 0 : sumsq += s[7 * pitch] * s[7 * pitch] - s[-8 * pitch] * s[-8 * pitch];
180 0 : sum += s[7 * pitch] - s[-8 * pitch];
181 0 : d[r & 15] = s[0];
182 :
183 0 : if (sumsq * 15 - sum * sum < flimit) {
184 0 : d[r & 15] = (vpx_rv[(r & 127) + (c & 7)] + sum + s[0]) >> 4;
185 : }
186 0 : if (r >= 8) s[-8 * pitch] = d[(r - 8) & 15];
187 0 : s += pitch;
188 : }
189 : }
190 0 : }
|