OLD | NEW |
1 /* | 1 /* |
2 * Copyright (c) 2010 The WebM project authors. All Rights Reserved. | 2 * Copyright (c) 2010 The WebM project authors. All Rights Reserved. |
3 * | 3 * |
4 * Use of this source code is governed by a BSD-style license | 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 | 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 | 6 * tree. An additional intellectual property rights grant can be found |
7 * in the file PATENTS. All contributing project authors may | 7 * in the file PATENTS. All contributing project authors may |
8 * be found in the AUTHORS file in the root of the source tree. | 8 * be found in the AUTHORS file in the root of the source tree. |
9 */ | 9 */ |
10 | 10 |
11 #include <stdio.h> | 11 #include "./vpx_config.h" |
12 | 12 |
13 #include "./vpx_config.h" | |
14 #include "vp9_rtcd.h" | |
15 #include "vp9/common/vp9_reconintra.h" | |
16 #include "vp9/common/vp9_onyxc_int.h" | |
17 #include "vpx_mem/vpx_mem.h" | 13 #include "vpx_mem/vpx_mem.h" |
18 #include "vpx_ports/vpx_once.h" | 14 #include "vpx_ports/vpx_once.h" |
19 | 15 |
| 16 #include "vp9_rtcd.h" |
| 17 |
| 18 #include "vp9/common/vp9_reconintra.h" |
| 19 #include "vp9/common/vp9_onyxc_int.h" |
| 20 |
20 const TX_TYPE mode2txfm_map[MB_MODE_COUNT] = { | 21 const TX_TYPE mode2txfm_map[MB_MODE_COUNT] = { |
21 DCT_DCT, // DC | 22 DCT_DCT, // DC |
22 ADST_DCT, // V | 23 ADST_DCT, // V |
23 DCT_ADST, // H | 24 DCT_ADST, // H |
24 DCT_DCT, // D45 | 25 DCT_DCT, // D45 |
25 ADST_ADST, // D135 | 26 ADST_ADST, // D135 |
26 ADST_DCT, // D117 | 27 ADST_DCT, // D117 |
27 DCT_ADST, // D153 | 28 DCT_ADST, // D153 |
28 DCT_ADST, // D27 | 29 DCT_ADST, // D207 |
29 ADST_DCT, // D63 | 30 ADST_DCT, // D63 |
30 ADST_ADST, // TM | 31 ADST_ADST, // TM |
31 DCT_DCT, // NEARESTMV | 32 DCT_DCT, // NEARESTMV |
32 DCT_DCT, // NEARMV | 33 DCT_DCT, // NEARMV |
33 DCT_DCT, // ZEROMV | 34 DCT_DCT, // ZEROMV |
34 DCT_DCT // NEWMV | 35 DCT_DCT // NEWMV |
35 }; | 36 }; |
36 | 37 |
37 #define intra_pred_sized(type, size) \ | 38 #define intra_pred_sized(type, size) \ |
38 void vp9_##type##_predictor_##size##x##size##_c(uint8_t *pred_ptr, \ | 39 void vp9_##type##_predictor_##size##x##size##_c(uint8_t *dst, \ |
39 ptrdiff_t stride, \ | 40 ptrdiff_t stride, \ |
40 uint8_t *above_row, \ | 41 const uint8_t *above, \ |
41 uint8_t *left_col) { \ | 42 const uint8_t *left) { \ |
42 type##_predictor(pred_ptr, stride, size, above_row, left_col); \ | 43 type##_predictor(dst, stride, size, above, left); \ |
43 } | 44 } |
| 45 |
44 #define intra_pred_allsizes(type) \ | 46 #define intra_pred_allsizes(type) \ |
45 intra_pred_sized(type, 4) \ | 47 intra_pred_sized(type, 4) \ |
46 intra_pred_sized(type, 8) \ | 48 intra_pred_sized(type, 8) \ |
47 intra_pred_sized(type, 16) \ | 49 intra_pred_sized(type, 16) \ |
48 intra_pred_sized(type, 32) | 50 intra_pred_sized(type, 32) |
49 | 51 |
50 static INLINE void d27_predictor(uint8_t *pred_ptr, ptrdiff_t stride, int bs, | 52 static INLINE void d207_predictor(uint8_t *dst, ptrdiff_t stride, int bs, |
51 uint8_t *above_row, uint8_t *left_col) { | 53 const uint8_t *above, const uint8_t *left) { |
52 int r, c; | 54 int r, c; |
| 55 |
53 // first column | 56 // first column |
54 for (r = 0; r < bs - 1; ++r) { | 57 for (r = 0; r < bs - 1; ++r) |
55 pred_ptr[r * stride] = ROUND_POWER_OF_TWO(left_col[r] + | 58 dst[r * stride] = ROUND_POWER_OF_TWO(left[r] + left[r + 1], 1); |
56 left_col[r + 1], 1); | 59 dst[(bs - 1) * stride] = left[bs - 1]; |
57 } | 60 dst++; |
58 pred_ptr[(bs - 1) * stride] = left_col[bs - 1]; | 61 |
59 pred_ptr++; | |
60 // second column | 62 // second column |
61 for (r = 0; r < bs - 2; ++r) { | 63 for (r = 0; r < bs - 2; ++r) |
62 pred_ptr[r * stride] = ROUND_POWER_OF_TWO(left_col[r] + | 64 dst[r * stride] = ROUND_POWER_OF_TWO(left[r] + left[r + 1] * 2 + |
63 left_col[r + 1] * 2 + | 65 left[r + 2], 2); |
64 left_col[r + 2], 2); | 66 dst[(bs - 2) * stride] = ROUND_POWER_OF_TWO(left[bs - 2] + |
65 } | 67 left[bs - 1] * 3, 2); |
66 pred_ptr[(bs - 2) * stride] = ROUND_POWER_OF_TWO(left_col[bs - 2] + | 68 dst[(bs - 1) * stride] = left[bs - 1]; |
67 left_col[bs - 1] * 3, | 69 dst++; |
68 2); | |
69 pred_ptr[(bs - 1) * stride] = left_col[bs - 1]; | |
70 pred_ptr++; | |
71 | 70 |
72 // rest of last row | 71 // rest of last row |
73 for (c = 0; c < bs - 2; ++c) { | 72 for (c = 0; c < bs - 2; ++c) |
74 pred_ptr[(bs - 1) * stride + c] = left_col[bs - 1]; | 73 dst[(bs - 1) * stride + c] = left[bs - 1]; |
75 } | 74 |
76 | 75 for (r = bs - 2; r >= 0; --r) |
77 for (r = bs - 2; r >= 0; --r) { | 76 for (c = 0; c < bs - 2; ++c) |
78 for (c = 0; c < bs - 2; ++c) { | 77 dst[r * stride + c] = dst[(r + 1) * stride + c - 2]; |
79 pred_ptr[r * stride + c] = pred_ptr[(r + 1) * stride + c - 2]; | 78 } |
80 } | 79 intra_pred_allsizes(d207) |
81 } | 80 |
82 } | 81 static INLINE void d63_predictor(uint8_t *dst, ptrdiff_t stride, int bs, |
83 intra_pred_allsizes(d27) | 82 const uint8_t *above, const uint8_t *left) { |
84 | |
85 static INLINE void d63_predictor(uint8_t *pred_ptr, ptrdiff_t stride, int bs, | |
86 uint8_t *above_row, uint8_t *left_col) { | |
87 int r, c; | 83 int r, c; |
88 for (r = 0; r < bs; ++r) { | 84 for (r = 0; r < bs; ++r) { |
89 for (c = 0; c < bs; ++c) { | 85 for (c = 0; c < bs; ++c) |
90 if (r & 1) { | 86 dst[c] = r & 1 ? ROUND_POWER_OF_TWO(above[r/2 + c] + |
91 pred_ptr[c] = ROUND_POWER_OF_TWO(above_row[r/2 + c] + | 87 above[r/2 + c + 1] * 2 + |
92 above_row[r/2 + c + 1] * 2 + | 88 above[r/2 + c + 2], 2) |
93 above_row[r/2 + c + 2], 2); | 89 : ROUND_POWER_OF_TWO(above[r/2 + c] + |
94 } else { | 90 above[r/2 + c + 1], 1); |
95 pred_ptr[c] = ROUND_POWER_OF_TWO(above_row[r/2 + c] + | 91 dst += stride; |
96 above_row[r/2+ c + 1], 1); | |
97 } | |
98 } | |
99 pred_ptr += stride; | |
100 } | 92 } |
101 } | 93 } |
102 intra_pred_allsizes(d63) | 94 intra_pred_allsizes(d63) |
103 | 95 |
104 static INLINE void d45_predictor(uint8_t *pred_ptr, ptrdiff_t stride, int bs, | 96 static INLINE void d45_predictor(uint8_t *dst, ptrdiff_t stride, int bs, |
105 uint8_t *above_row, uint8_t *left_col) { | 97 const uint8_t *above, const uint8_t *left) { |
106 int r, c; | 98 int r, c; |
107 for (r = 0; r < bs; ++r) { | 99 for (r = 0; r < bs; ++r) { |
108 for (c = 0; c < bs; ++c) { | 100 for (c = 0; c < bs; ++c) |
109 if (r + c + 2 < bs * 2) | 101 dst[c] = r + c + 2 < bs * 2 ? ROUND_POWER_OF_TWO(above[r + c] + |
110 pred_ptr[c] = ROUND_POWER_OF_TWO(above_row[r + c] + | 102 above[r + c + 1] * 2 + |
111 above_row[r + c + 1] * 2 + | 103 above[r + c + 2], 2) |
112 above_row[r + c + 2], 2); | 104 : above[bs * 2 - 1]; |
113 else | 105 dst += stride; |
114 pred_ptr[c] = above_row[bs * 2 - 1]; | |
115 } | |
116 pred_ptr += stride; | |
117 } | 106 } |
118 } | 107 } |
119 intra_pred_allsizes(d45) | 108 intra_pred_allsizes(d45) |
120 | 109 |
121 static INLINE void d117_predictor(uint8_t *pred_ptr, ptrdiff_t stride, int bs, | 110 static INLINE void d117_predictor(uint8_t *dst, ptrdiff_t stride, int bs, |
122 uint8_t *above_row, uint8_t *left_col) { | 111 const uint8_t *above, const uint8_t *left) { |
123 int r, c; | 112 int r, c; |
| 113 |
124 // first row | 114 // first row |
125 for (c = 0; c < bs; c++) | 115 for (c = 0; c < bs; c++) |
126 pred_ptr[c] = ROUND_POWER_OF_TWO(above_row[c - 1] + above_row[c], 1); | 116 dst[c] = ROUND_POWER_OF_TWO(above[c - 1] + above[c], 1); |
127 pred_ptr += stride; | 117 dst += stride; |
128 | 118 |
129 // second row | 119 // second row |
130 pred_ptr[0] = ROUND_POWER_OF_TWO(left_col[0] + | 120 dst[0] = ROUND_POWER_OF_TWO(left[0] + above[-1] * 2 + above[0], 2); |
131 above_row[-1] * 2 + | |
132 above_row[0], 2); | |
133 for (c = 1; c < bs; c++) | 121 for (c = 1; c < bs; c++) |
134 pred_ptr[c] = ROUND_POWER_OF_TWO(above_row[c - 2] + | 122 dst[c] = ROUND_POWER_OF_TWO(above[c - 2] + above[c - 1] * 2 + above[c], 2); |
135 above_row[c - 1] * 2 + | 123 dst += stride; |
136 above_row[c], 2); | |
137 pred_ptr += stride; | |
138 | 124 |
139 // the rest of first col | 125 // the rest of first col |
140 pred_ptr[0] = ROUND_POWER_OF_TWO(above_row[-1] + | 126 dst[0] = ROUND_POWER_OF_TWO(above[-1] + left[0] * 2 + left[1], 2); |
141 left_col[0] * 2 + | |
142 left_col[1], 2); | |
143 for (r = 3; r < bs; ++r) | 127 for (r = 3; r < bs; ++r) |
144 pred_ptr[(r-2) * stride] = ROUND_POWER_OF_TWO(left_col[r - 3] + | 128 dst[(r - 2) * stride] = ROUND_POWER_OF_TWO(left[r - 3] + left[r - 2] * 2 + |
145 left_col[r - 2] * 2 + | 129 left[r - 1], 2); |
146 left_col[r - 1], 2); | 130 |
147 // the rest of the block | 131 // the rest of the block |
148 for (r = 2; r < bs; ++r) { | 132 for (r = 2; r < bs; ++r) { |
149 for (c = 1; c < bs; c++) | 133 for (c = 1; c < bs; c++) |
150 pred_ptr[c] = pred_ptr[-2 * stride + c - 1]; | 134 dst[c] = dst[-2 * stride + c - 1]; |
151 pred_ptr += stride; | 135 dst += stride; |
152 } | 136 } |
153 } | 137 } |
154 intra_pred_allsizes(d117) | 138 intra_pred_allsizes(d117) |
155 | 139 |
156 static INLINE void d135_predictor(uint8_t *pred_ptr, ptrdiff_t stride, int bs, | 140 static INLINE void d135_predictor(uint8_t *dst, ptrdiff_t stride, int bs, |
157 uint8_t *above_row, uint8_t *left_col) { | 141 const uint8_t *above, const uint8_t *left) { |
158 int r, c; | 142 int r, c; |
159 pred_ptr[0] = ROUND_POWER_OF_TWO(left_col[0] + | 143 dst[0] = ROUND_POWER_OF_TWO(left[0] + above[-1] * 2 + above[0], 2); |
160 above_row[-1] * 2 + | |
161 above_row[0], 2); | |
162 for (c = 1; c < bs; c++) | 144 for (c = 1; c < bs; c++) |
163 pred_ptr[c] = ROUND_POWER_OF_TWO(above_row[c - 2] + | 145 dst[c] = ROUND_POWER_OF_TWO(above[c - 2] + above[c - 1] * 2 + above[c], 2); |
164 above_row[c - 1] * 2 + | 146 |
165 above_row[c], 2); | 147 dst[stride] = ROUND_POWER_OF_TWO(above[-1] + left[0] * 2 + left[1], 2); |
166 | |
167 pred_ptr[stride] = ROUND_POWER_OF_TWO(above_row[-1] + | |
168 left_col[0] * 2 + | |
169 left_col[1], 2); | |
170 for (r = 2; r < bs; ++r) | 148 for (r = 2; r < bs; ++r) |
171 pred_ptr[r * stride] = ROUND_POWER_OF_TWO(left_col[r - 2] + | 149 dst[r * stride] = ROUND_POWER_OF_TWO(left[r - 2] + left[r - 1] * 2 + |
172 left_col[r - 1] * 2 + | 150 left[r], 2); |
173 left_col[r], 2); | 151 |
174 | 152 dst += stride; |
175 pred_ptr += stride; | |
176 for (r = 1; r < bs; ++r) { | 153 for (r = 1; r < bs; ++r) { |
177 for (c = 1; c < bs; c++) | 154 for (c = 1; c < bs; c++) |
178 pred_ptr[c] = pred_ptr[-stride + c - 1]; | 155 dst[c] = dst[-stride + c - 1]; |
179 pred_ptr += stride; | 156 dst += stride; |
180 } | 157 } |
181 } | 158 } |
182 intra_pred_allsizes(d135) | 159 intra_pred_allsizes(d135) |
183 | 160 |
184 static INLINE void d153_predictor(uint8_t *pred_ptr, ptrdiff_t stride, int bs, | 161 static INLINE void d153_predictor(uint8_t *dst, ptrdiff_t stride, int bs, |
185 uint8_t *above_row, uint8_t *left_col) { | 162 const uint8_t *above, const uint8_t *left) { |
186 int r, c; | 163 int r, c; |
187 pred_ptr[0] = ROUND_POWER_OF_TWO(above_row[-1] + left_col[0], 1); | 164 dst[0] = ROUND_POWER_OF_TWO(above[-1] + left[0], 1); |
188 for (r = 1; r < bs; r++) | 165 for (r = 1; r < bs; r++) |
189 pred_ptr[r * stride] = | 166 dst[r * stride] = ROUND_POWER_OF_TWO(left[r - 1] + left[r], 1); |
190 ROUND_POWER_OF_TWO(left_col[r - 1] + left_col[r], 1); | 167 dst++; |
191 pred_ptr++; | 168 |
192 | 169 dst[0] = ROUND_POWER_OF_TWO(left[0] + above[-1] * 2 + above[0], 2); |
193 pred_ptr[0] = ROUND_POWER_OF_TWO(left_col[0] + | 170 dst[stride] = ROUND_POWER_OF_TWO(above[-1] + left[0] * 2 + left[1], 2); |
194 above_row[-1] * 2 + | |
195 above_row[0], 2); | |
196 pred_ptr[stride] = ROUND_POWER_OF_TWO(above_row[-1] + | |
197 left_col[0] * 2 + | |
198 left_col[1], 2); | |
199 for (r = 2; r < bs; r++) | 171 for (r = 2; r < bs; r++) |
200 pred_ptr[r * stride] = ROUND_POWER_OF_TWO(left_col[r - 2] + | 172 dst[r * stride] = ROUND_POWER_OF_TWO(left[r - 2] + left[r - 1] * 2 + |
201 left_col[r - 1] * 2 + | 173 left[r], 2); |
202 left_col[r], 2); | 174 dst++; |
203 pred_ptr++; | |
204 | 175 |
205 for (c = 0; c < bs - 2; c++) | 176 for (c = 0; c < bs - 2; c++) |
206 pred_ptr[c] = ROUND_POWER_OF_TWO(above_row[c - 1] + | 177 dst[c] = ROUND_POWER_OF_TWO(above[c - 1] + above[c] * 2 + above[c + 1], 2); |
207 above_row[c] * 2 + | 178 dst += stride; |
208 above_row[c + 1], 2); | 179 |
209 pred_ptr += stride; | |
210 for (r = 1; r < bs; ++r) { | 180 for (r = 1; r < bs; ++r) { |
211 for (c = 0; c < bs - 2; c++) | 181 for (c = 0; c < bs - 2; c++) |
212 pred_ptr[c] = pred_ptr[-stride + c - 2]; | 182 dst[c] = dst[-stride + c - 2]; |
213 pred_ptr += stride; | 183 dst += stride; |
214 } | 184 } |
215 } | 185 } |
216 intra_pred_allsizes(d153) | 186 intra_pred_allsizes(d153) |
217 | 187 |
218 static INLINE void v_predictor(uint8_t *pred_ptr, ptrdiff_t stride, int bs, | 188 static INLINE void v_predictor(uint8_t *dst, ptrdiff_t stride, int bs, |
219 uint8_t *above_row, uint8_t *left_col) { | 189 const uint8_t *above, const uint8_t *left) { |
220 int r; | 190 int r; |
221 | 191 |
222 for (r = 0; r < bs; r++) { | 192 for (r = 0; r < bs; r++) { |
223 vpx_memcpy(pred_ptr, above_row, bs); | 193 vpx_memcpy(dst, above, bs); |
224 pred_ptr += stride; | 194 dst += stride; |
225 } | 195 } |
226 } | 196 } |
227 intra_pred_allsizes(v) | 197 intra_pred_allsizes(v) |
228 | 198 |
229 static INLINE void h_predictor(uint8_t *pred_ptr, ptrdiff_t stride, int bs, | 199 static INLINE void h_predictor(uint8_t *dst, ptrdiff_t stride, int bs, |
230 uint8_t *above_row, uint8_t *left_col) { | 200 const uint8_t *above, const uint8_t *left) { |
231 int r; | 201 int r; |
232 | 202 |
233 for (r = 0; r < bs; r++) { | 203 for (r = 0; r < bs; r++) { |
234 vpx_memset(pred_ptr, left_col[r], bs); | 204 vpx_memset(dst, left[r], bs); |
235 pred_ptr += stride; | 205 dst += stride; |
236 } | 206 } |
237 } | 207 } |
238 intra_pred_allsizes(h) | 208 intra_pred_allsizes(h) |
239 | 209 |
240 static INLINE void tm_predictor(uint8_t *pred_ptr, ptrdiff_t stride, int bs, | 210 static INLINE void tm_predictor(uint8_t *dst, ptrdiff_t stride, int bs, |
241 uint8_t *above_row, uint8_t *left_col) { | 211 const uint8_t *above, const uint8_t *left) { |
242 int r, c; | 212 int r, c; |
243 int ytop_left = above_row[-1]; | 213 int ytop_left = above[-1]; |
244 | 214 |
245 for (r = 0; r < bs; r++) { | 215 for (r = 0; r < bs; r++) { |
246 for (c = 0; c < bs; c++) | 216 for (c = 0; c < bs; c++) |
247 pred_ptr[c] = clip_pixel(left_col[r] + above_row[c] - ytop_left); | 217 dst[c] = clip_pixel(left[r] + above[c] - ytop_left); |
248 pred_ptr += stride; | 218 dst += stride; |
249 } | 219 } |
250 } | 220 } |
251 intra_pred_allsizes(tm) | 221 intra_pred_allsizes(tm) |
252 | 222 |
253 static INLINE void dc_128_predictor(uint8_t *pred_ptr, ptrdiff_t stride, int bs, | 223 static INLINE void dc_128_predictor(uint8_t *dst, ptrdiff_t stride, int bs, |
254 uint8_t *above_row, uint8_t *left_col) { | 224 const uint8_t *above, const uint8_t *left) { |
255 int r; | 225 int r; |
256 | 226 |
257 for (r = 0; r < bs; r++) { | 227 for (r = 0; r < bs; r++) { |
258 vpx_memset(pred_ptr, 128, bs); | 228 vpx_memset(dst, 128, bs); |
259 pred_ptr += stride; | 229 dst += stride; |
260 } | 230 } |
261 } | 231 } |
262 intra_pred_allsizes(dc_128) | 232 intra_pred_allsizes(dc_128) |
263 | 233 |
264 static INLINE void dc_left_predictor(uint8_t *pred_ptr, ptrdiff_t stride, | 234 static INLINE void dc_left_predictor(uint8_t *dst, ptrdiff_t stride, int bs, |
265 int bs, | 235 const uint8_t *above, |
266 uint8_t *above_row, uint8_t *left_col) { | 236 const uint8_t *left) { |
267 int i, r; | 237 int i, r, expected_dc, sum = 0; |
268 int expected_dc = 128; | |
269 int average = 0; | |
270 const int count = bs; | |
271 | 238 |
272 for (i = 0; i < bs; i++) | 239 for (i = 0; i < bs; i++) |
273 average += left_col[i]; | 240 sum += left[i]; |
274 expected_dc = (average + (count >> 1)) / count; | 241 expected_dc = (sum + (bs >> 1)) / bs; |
275 | 242 |
276 for (r = 0; r < bs; r++) { | 243 for (r = 0; r < bs; r++) { |
277 vpx_memset(pred_ptr, expected_dc, bs); | 244 vpx_memset(dst, expected_dc, bs); |
278 pred_ptr += stride; | 245 dst += stride; |
279 } | 246 } |
280 } | 247 } |
281 intra_pred_allsizes(dc_left) | 248 intra_pred_allsizes(dc_left) |
282 | 249 |
283 static INLINE void dc_top_predictor(uint8_t *pred_ptr, ptrdiff_t stride, int bs, | 250 static INLINE void dc_top_predictor(uint8_t *dst, ptrdiff_t stride, int bs, |
284 uint8_t *above_row, uint8_t *left_col) { | 251 const uint8_t *above, const uint8_t *left) { |
285 int i, r; | 252 int i, r, expected_dc, sum = 0; |
286 int expected_dc = 128; | |
287 int average = 0; | |
288 const int count = bs; | |
289 | 253 |
290 for (i = 0; i < bs; i++) | 254 for (i = 0; i < bs; i++) |
291 average += above_row[i]; | 255 sum += above[i]; |
292 expected_dc = (average + (count >> 1)) / count; | 256 expected_dc = (sum + (bs >> 1)) / bs; |
293 | 257 |
294 for (r = 0; r < bs; r++) { | 258 for (r = 0; r < bs; r++) { |
295 vpx_memset(pred_ptr, expected_dc, bs); | 259 vpx_memset(dst, expected_dc, bs); |
296 pred_ptr += stride; | 260 dst += stride; |
297 } | 261 } |
298 } | 262 } |
299 intra_pred_allsizes(dc_top) | 263 intra_pred_allsizes(dc_top) |
300 | 264 |
301 static INLINE void dc_predictor(uint8_t *pred_ptr, ptrdiff_t stride, int bs, | 265 static INLINE void dc_predictor(uint8_t *dst, ptrdiff_t stride, int bs, |
302 uint8_t *above_row, uint8_t *left_col) { | 266 const uint8_t *above, const uint8_t *left) { |
303 int i, r; | 267 int i, r, expected_dc, sum = 0; |
304 int expected_dc = 128; | |
305 int average = 0; | |
306 const int count = 2 * bs; | 268 const int count = 2 * bs; |
307 | 269 |
308 for (i = 0; i < bs; i++) | 270 for (i = 0; i < bs; i++) { |
309 average += above_row[i]; | 271 sum += above[i]; |
310 for (i = 0; i < bs; i++) | 272 sum += left[i]; |
311 average += left_col[i]; | 273 } |
312 expected_dc = (average + (count >> 1)) / count; | 274 |
313 | 275 expected_dc = (sum + (count >> 1)) / count; |
314 for (r = 0; r < bs; r++) { | 276 |
315 vpx_memset(pred_ptr, expected_dc, bs); | 277 for (r = 0; r < bs; r++) { |
316 pred_ptr += stride; | 278 vpx_memset(dst, expected_dc, bs); |
| 279 dst += stride; |
317 } | 280 } |
318 } | 281 } |
319 intra_pred_allsizes(dc) | 282 intra_pred_allsizes(dc) |
320 #undef intra_pred_allsizes | 283 #undef intra_pred_allsizes |
321 | 284 |
322 typedef void (*intra_pred_fn)(uint8_t *pred_ptr, ptrdiff_t stride, | 285 typedef void (*intra_pred_fn)(uint8_t *dst, ptrdiff_t stride, |
323 uint8_t *above_row, uint8_t *left_col); | 286 const uint8_t *above, const uint8_t *left); |
324 | 287 |
325 static intra_pred_fn pred[VP9_INTRA_MODES][4]; | 288 static intra_pred_fn pred[INTRA_MODES][4]; |
326 static intra_pred_fn dc_pred[2][2][4]; | 289 static intra_pred_fn dc_pred[2][2][4]; |
327 | 290 |
328 static void init_intra_pred_fn_ptrs(void) { | 291 static void init_intra_pred_fn_ptrs(void) { |
329 #define intra_pred_allsizes(l, type) \ | 292 #define intra_pred_allsizes(l, type) \ |
330 l[0] = vp9_##type##_predictor_4x4; \ | 293 l[0] = vp9_##type##_predictor_4x4; \ |
331 l[1] = vp9_##type##_predictor_8x8; \ | 294 l[1] = vp9_##type##_predictor_8x8; \ |
332 l[2] = vp9_##type##_predictor_16x16; \ | 295 l[2] = vp9_##type##_predictor_16x16; \ |
333 l[3] = vp9_##type##_predictor_32x32 | 296 l[3] = vp9_##type##_predictor_32x32 |
334 | 297 |
335 intra_pred_allsizes(pred[V_PRED], v); | 298 intra_pred_allsizes(pred[V_PRED], v); |
336 intra_pred_allsizes(pred[H_PRED], h); | 299 intra_pred_allsizes(pred[H_PRED], h); |
337 intra_pred_allsizes(pred[D27_PRED], d27); | 300 intra_pred_allsizes(pred[D207_PRED], d207); |
338 intra_pred_allsizes(pred[D45_PRED], d45); | 301 intra_pred_allsizes(pred[D45_PRED], d45); |
339 intra_pred_allsizes(pred[D63_PRED], d63); | 302 intra_pred_allsizes(pred[D63_PRED], d63); |
340 intra_pred_allsizes(pred[D117_PRED], d117); | 303 intra_pred_allsizes(pred[D117_PRED], d117); |
341 intra_pred_allsizes(pred[D135_PRED], d135); | 304 intra_pred_allsizes(pred[D135_PRED], d135); |
342 intra_pred_allsizes(pred[D153_PRED], d153); | 305 intra_pred_allsizes(pred[D153_PRED], d153); |
343 intra_pred_allsizes(pred[TM_PRED], tm); | 306 intra_pred_allsizes(pred[TM_PRED], tm); |
344 | 307 |
345 intra_pred_allsizes(dc_pred[0][0], dc_128); | 308 intra_pred_allsizes(dc_pred[0][0], dc_128); |
346 intra_pred_allsizes(dc_pred[0][1], dc_top); | 309 intra_pred_allsizes(dc_pred[0][1], dc_top); |
347 intra_pred_allsizes(dc_pred[1][0], dc_left); | 310 intra_pred_allsizes(dc_pred[1][0], dc_left); |
348 intra_pred_allsizes(dc_pred[1][1], dc); | 311 intra_pred_allsizes(dc_pred[1][1], dc); |
349 | 312 |
350 #undef intra_pred_allsizes | 313 #undef intra_pred_allsizes |
351 } | 314 } |
352 | 315 |
353 static void build_intra_predictors(uint8_t *src, int src_stride, | 316 static void build_intra_predictors(const uint8_t *ref, int ref_stride, |
354 uint8_t *pred_ptr, int stride, | 317 uint8_t *dst, int dst_stride, |
355 MB_PREDICTION_MODE mode, TX_SIZE txsz, | 318 MB_PREDICTION_MODE mode, TX_SIZE tx_size, |
356 int up_available, int left_available, | 319 int up_available, int left_available, |
357 int right_available) { | 320 int right_available) { |
358 int i; | 321 int i; |
359 DECLARE_ALIGNED_ARRAY(16, uint8_t, left_col, 64); | 322 DECLARE_ALIGNED_ARRAY(16, uint8_t, left_col, 64); |
360 DECLARE_ALIGNED_ARRAY(16, uint8_t, yabove_data, 128 + 16); | 323 DECLARE_ALIGNED_ARRAY(16, uint8_t, above_data, 128 + 16); |
361 uint8_t *above_row = yabove_data + 16; | 324 uint8_t *above_row = above_data + 16; |
362 const int bs = 4 << txsz; | 325 const uint8_t *const_above_row = above_row; |
| 326 const int bs = 4 << tx_size; |
363 | 327 |
364 // 127 127 127 .. 127 127 127 127 127 127 | 328 // 127 127 127 .. 127 127 127 127 127 127 |
365 // 129 A B .. Y Z | 329 // 129 A B .. Y Z |
366 // 129 C D .. W X | 330 // 129 C D .. W X |
367 // 129 E F .. U V | 331 // 129 E F .. U V |
368 // 129 G H .. S T T T T T | 332 // 129 G H .. S T T T T T |
369 // .. | 333 // .. |
370 | 334 |
371 once(init_intra_pred_fn_ptrs); | 335 once(init_intra_pred_fn_ptrs); |
| 336 |
| 337 // left |
372 if (left_available) { | 338 if (left_available) { |
373 for (i = 0; i < bs; i++) | 339 for (i = 0; i < bs; i++) |
374 left_col[i] = src[i * src_stride - 1]; | 340 left_col[i] = ref[i * ref_stride - 1]; |
375 } else { | 341 } else { |
376 vpx_memset(left_col, 129, bs); | 342 vpx_memset(left_col, 129, bs); |
377 } | 343 } |
378 | 344 |
| 345 // above |
379 if (up_available) { | 346 if (up_available) { |
380 uint8_t *above_ptr = src - src_stride; | 347 const uint8_t *above_ref = ref - ref_stride; |
381 if (bs == 4 && right_available && left_available) { | 348 if (bs == 4 && right_available && left_available) { |
382 above_row = above_ptr; | 349 const_above_row = above_ref; |
383 } else { | 350 } else { |
384 vpx_memcpy(above_row, above_ptr, bs); | 351 vpx_memcpy(above_row, above_ref, bs); |
385 if (bs == 4 && right_available) | 352 if (bs == 4 && right_available) |
386 vpx_memcpy(above_row + bs, above_ptr + bs, bs); | 353 vpx_memcpy(above_row + bs, above_ref + bs, bs); |
387 else | 354 else |
388 vpx_memset(above_row + bs, above_row[bs - 1], bs); | 355 vpx_memset(above_row + bs, above_row[bs - 1], bs); |
389 above_row[-1] = left_available ? above_ptr[-1] : 129; | 356 above_row[-1] = left_available ? above_ref[-1] : 129; |
390 } | 357 } |
391 } else { | 358 } else { |
392 vpx_memset(above_row, 127, bs * 2); | 359 vpx_memset(above_row, 127, bs * 2); |
393 above_row[-1] = 127; | 360 above_row[-1] = 127; |
394 } | 361 } |
395 | 362 |
| 363 // predict |
396 if (mode == DC_PRED) { | 364 if (mode == DC_PRED) { |
397 dc_pred[left_available][up_available][txsz](pred_ptr, stride, | 365 dc_pred[left_available][up_available][tx_size](dst, dst_stride, |
398 above_row, left_col); | 366 const_above_row, left_col); |
399 } else { | 367 } else { |
400 pred[mode][txsz](pred_ptr, stride, above_row, left_col); | 368 pred[mode][tx_size](dst, dst_stride, const_above_row, left_col); |
401 } | 369 } |
402 } | 370 } |
403 | 371 |
404 void vp9_predict_intra_block(MACROBLOCKD *xd, | 372 void vp9_predict_intra_block(MACROBLOCKD *xd, int block_idx, int bwl_in, |
405 int block_idx, | 373 TX_SIZE tx_size, int mode, |
406 int bwl_in, | 374 const uint8_t *ref, int ref_stride, |
407 TX_SIZE tx_size, | 375 uint8_t *dst, int dst_stride) { |
408 int mode, | |
409 uint8_t *reference, int ref_stride, | |
410 uint8_t *predictor, int pre_stride) { | |
411 const int bwl = bwl_in - tx_size; | 376 const int bwl = bwl_in - tx_size; |
412 const int wmask = (1 << bwl) - 1; | 377 const int wmask = (1 << bwl) - 1; |
413 const int have_top = (block_idx >> bwl) || xd->up_available; | 378 const int have_top = (block_idx >> bwl) || xd->up_available; |
414 const int have_left = (block_idx & wmask) || xd->left_available; | 379 const int have_left = (block_idx & wmask) || xd->left_available; |
415 const int have_right = ((block_idx & wmask) != wmask); | 380 const int have_right = ((block_idx & wmask) != wmask); |
416 | 381 |
417 assert(bwl >= 0); | 382 assert(bwl >= 0); |
418 build_intra_predictors(reference, ref_stride, | 383 build_intra_predictors(ref, ref_stride, dst, dst_stride, mode, tx_size, |
419 predictor, pre_stride, | 384 have_top, have_left, have_right); |
420 mode, | |
421 tx_size, | |
422 have_top, have_left, | |
423 have_right); | |
424 } | 385 } |
OLD | NEW |