Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(1454)

Side by Side Diff: source/libvpx/vp9/common/vp9_reconintra.c

Issue 11555023: libvpx: Add VP9 decoder. (Closed) Base URL: svn://chrome-svn/chrome/trunk/deps/third_party/libvpx/
Patch Set: Created 8 years ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
Property Changes:
Added: svn:eol-style
+ LF
OLDNEW
(Empty)
1 /*
2 * Copyright (c) 2010 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
11 #include <stdio.h>
12 #include "vpx_ports/config.h"
13 #include "vp9_rtcd.h"
14 #include "vp9/common/vp9_reconintra.h"
15 #include "vpx_mem/vpx_mem.h"
16
17 /* For skip_recon_mb(), add vp9_build_intra_predictors_mby_s(MACROBLOCKD *xd)
18 * and vp9_build_intra_predictors_mbuv_s(MACROBLOCKD *xd).
19 */
20
21 static void d27_predictor(uint8_t *ypred_ptr, int y_stride, int n,
22 uint8_t *yabove_row, uint8_t *yleft_col) {
23 int r, c, h, w, v;
24 int a, b;
25 r = 0;
26 for (c = 0; c < n - 2; c++) {
27 if (c & 1)
28 a = yleft_col[r + 1];
29 else
30 a = (yleft_col[r] + yleft_col[r + 1] + 1) >> 1;
31 b = yabove_row[c + 2];
32 ypred_ptr[c] = (2 * a + (c + 1) * b + (c + 3) / 2) / (c + 3);
33 }
34 for (r = 1; r < n / 2 - 1; r++) {
35 for (c = 0; c < n - 2 - 2 * r; c++) {
36 if (c & 1)
37 a = yleft_col[r + 1];
38 else
39 a = (yleft_col[r] + yleft_col[r + 1] + 1) >> 1;
40 b = ypred_ptr[(r - 1) * y_stride + c + 2];
41 ypred_ptr[r * y_stride + c] = (2 * a + (c + 1) * b + (c + 3) / 2) / (c + 3 );
42 }
43 }
44 for (; r < n - 1; ++r) {
45 for (c = 0; c < n; c++) {
46 v = (c & 1 ? yleft_col[r + 1] : (yleft_col[r] + yleft_col[r + 1] + 1) >> 1 );
47 h = r - c / 2;
48 ypred_ptr[h * y_stride + c] = v;
49 }
50 }
51 c = 0;
52 r = n - 1;
53 ypred_ptr[r * y_stride] = (ypred_ptr[(r - 1) * y_stride] +
54 yleft_col[r] + 1) >> 1;
55 for (r = n - 2; r >= n / 2; --r) {
56 w = c + (n - 1 - r) * 2;
57 ypred_ptr[r * y_stride + w] = (ypred_ptr[(r - 1) * y_stride + w] +
58 ypred_ptr[r * y_stride + w - 1] + 1) >> 1;
59 }
60 for (c = 1; c < n; c++) {
61 for (r = n - 1; r >= n / 2 + c / 2; --r) {
62 w = c + (n - 1 - r) * 2;
63 ypred_ptr[r * y_stride + w] = (ypred_ptr[(r - 1) * y_stride + w] +
64 ypred_ptr[r * y_stride + w - 1] + 1) >> 1;
65 }
66 }
67 }
68
69 static void d63_predictor(uint8_t *ypred_ptr, int y_stride, int n,
70 uint8_t *yabove_row, uint8_t *yleft_col) {
71 int r, c, h, w, v;
72 int a, b;
73 c = 0;
74 for (r = 0; r < n - 2; r++) {
75 if (r & 1)
76 a = yabove_row[c + 1];
77 else
78 a = (yabove_row[c] + yabove_row[c + 1] + 1) >> 1;
79 b = yleft_col[r + 2];
80 ypred_ptr[r * y_stride] = (2 * a + (r + 1) * b + (r + 3) / 2) / (r + 3);
81 }
82 for (c = 1; c < n / 2 - 1; c++) {
83 for (r = 0; r < n - 2 - 2 * c; r++) {
84 if (r & 1)
85 a = yabove_row[c + 1];
86 else
87 a = (yabove_row[c] + yabove_row[c + 1] + 1) >> 1;
88 b = ypred_ptr[(r + 2) * y_stride + c - 1];
89 ypred_ptr[r * y_stride + c] = (2 * a + (c + 1) * b + (c + 3) / 2) / (c + 3 );
90 }
91 }
92 for (; c < n - 1; ++c) {
93 for (r = 0; r < n; r++) {
94 v = (r & 1 ? yabove_row[c + 1] : (yabove_row[c] + yabove_row[c + 1] + 1) > > 1);
95 w = c - r / 2;
96 ypred_ptr[r * y_stride + w] = v;
97 }
98 }
99 r = 0;
100 c = n - 1;
101 ypred_ptr[c] = (ypred_ptr[(c - 1)] + yabove_row[c] + 1) >> 1;
102 for (c = n - 2; c >= n / 2; --c) {
103 h = r + (n - 1 - c) * 2;
104 ypred_ptr[h * y_stride + c] = (ypred_ptr[h * y_stride + c - 1] +
105 ypred_ptr[(h - 1) * y_stride + c] + 1) >> 1;
106 }
107 for (r = 1; r < n; r++) {
108 for (c = n - 1; c >= n / 2 + r / 2; --c) {
109 h = r + (n - 1 - c) * 2;
110 ypred_ptr[h * y_stride + c] = (ypred_ptr[h * y_stride + c - 1] +
111 ypred_ptr[(h - 1) * y_stride + c] + 1) >> 1 ;
112 }
113 }
114 }
115
116 static void d45_predictor(uint8_t *ypred_ptr, int y_stride, int n,
117 uint8_t *yabove_row, uint8_t *yleft_col) {
118 int r, c;
119 for (r = 0; r < n - 1; ++r) {
120 for (c = 0; c <= r; ++c) {
121 ypred_ptr[(r - c) * y_stride + c] =
122 (yabove_row[r + 1] * (c + 1) +
123 yleft_col[r + 1] * (r - c + 1) + r / 2 + 1) / (r + 2);
124 }
125 }
126 for (c = 0; c <= r; ++c) {
127 int yabove_ext = yabove_row[r]; // 2*yabove_row[r] - yabove_row[r-1];
128 int yleft_ext = yleft_col[r]; // 2*yleft_col[r] - yleft_col[r-1];
129 yabove_ext = (yabove_ext > 255 ? 255 : (yabove_ext < 0 ? 0 : yabove_ext));
130 yleft_ext = (yleft_ext > 255 ? 255 : (yleft_ext < 0 ? 0 : yleft_ext));
131 ypred_ptr[(r - c) * y_stride + c] =
132 (yabove_ext * (c + 1) +
133 yleft_ext * (r - c + 1) + r / 2 + 1) / (r + 2);
134 }
135 for (r = 1; r < n; ++r) {
136 for (c = n - r; c < n; ++c)
137 ypred_ptr[r * y_stride + c] = (ypred_ptr[(r - 1) * y_stride + c] +
138 ypred_ptr[r * y_stride + c - 1] + 1) >> 1;
139 }
140 }
141
142 static void d117_predictor(uint8_t *ypred_ptr, int y_stride, int n,
143 uint8_t *yabove_row, uint8_t *yleft_col) {
144 int r, c;
145 for (c = 0; c < n; c++)
146 ypred_ptr[c] = (yabove_row[c - 1] + yabove_row[c] + 1) >> 1;
147 ypred_ptr += y_stride;
148 for (c = 0; c < n; c++)
149 ypred_ptr[c] = yabove_row[c - 1];
150 ypred_ptr += y_stride;
151 for (r = 2; r < n; ++r) {
152 ypred_ptr[0] = yleft_col[r - 2];
153 for (c = 1; c < n; c++)
154 ypred_ptr[c] = ypred_ptr[-2 * y_stride + c - 1];
155 ypred_ptr += y_stride;
156 }
157 }
158
159 static void d135_predictor(uint8_t *ypred_ptr, int y_stride, int n,
160 uint8_t *yabove_row, uint8_t *yleft_col) {
161 int r, c;
162 ypred_ptr[0] = yabove_row[-1];
163 for (c = 1; c < n; c++)
164 ypred_ptr[c] = yabove_row[c - 1];
165 for (r = 1; r < n; ++r)
166 ypred_ptr[r * y_stride] = yleft_col[r - 1];
167
168 ypred_ptr += y_stride;
169 for (r = 1; r < n; ++r) {
170 for (c = 1; c < n; c++) {
171 ypred_ptr[c] = ypred_ptr[-y_stride + c - 1];
172 }
173 ypred_ptr += y_stride;
174 }
175 }
176
177 static void d153_predictor(uint8_t *ypred_ptr, int y_stride, int n,
178 uint8_t *yabove_row, uint8_t *yleft_col) {
179 int r, c;
180 ypred_ptr[0] = (yabove_row[-1] + yleft_col[0] + 1) >> 1;
181 for (r = 1; r < n; r++)
182 ypred_ptr[r * y_stride] = (yleft_col[r - 1] + yleft_col[r] + 1) >> 1;
183 ypred_ptr++;
184 ypred_ptr[0] = yabove_row[-1];
185 for (r = 1; r < n; r++)
186 ypred_ptr[r * y_stride] = yleft_col[r - 1];
187 ypred_ptr++;
188
189 for (c = 0; c < n - 2; c++)
190 ypred_ptr[c] = yabove_row[c];
191 ypred_ptr += y_stride;
192 for (r = 1; r < n; ++r) {
193 for (c = 0; c < n - 2; c++)
194 ypred_ptr[c] = ypred_ptr[-y_stride + c - 2];
195 ypred_ptr += y_stride;
196 }
197 }
198
199 static void corner_predictor(unsigned char *ypred_ptr, int y_stride, int n,
200 unsigned char *yabove_row,
201 unsigned char *yleft_col) {
202 int mh, mv, maxgradh, maxgradv, x, y, nx, ny;
203 int i, j;
204 int top_left = yabove_row[-1];
205 mh = mv = 0;
206 maxgradh = yabove_row[1] - top_left;
207 maxgradv = yleft_col[1] - top_left;
208 for (i = 2; i < n; ++i) {
209 int gh = yabove_row[i] - yabove_row[i - 2];
210 int gv = yleft_col[i] - yleft_col[i - 2];
211 if (gh > maxgradh) {
212 maxgradh = gh;
213 mh = i - 1;
214 }
215 if (gv > maxgradv) {
216 maxgradv = gv;
217 mv = i - 1;
218 }
219 }
220 nx = mh + mv + 3;
221 ny = 2 * n + 1 - nx;
222
223 x = top_left;
224 for (i = 0; i <= mh; ++i) x += yabove_row[i];
225 for (i = 0; i <= mv; ++i) x += yleft_col[i];
226 x += (nx >> 1);
227 x /= nx;
228 y = 0;
229 for (i = mh + 1; i < n; ++i) y += yabove_row[i];
230 for (i = mv + 1; i < n; ++i) y += yleft_col[i];
231 y += (ny >> 1);
232 y /= ny;
233
234 for (i = 0; i < n; ++i) {
235 for (j = 0; j < n; ++j)
236 ypred_ptr[j] = (i <= mh && j <= mv ? x : y);
237 ypred_ptr += y_stride;
238 }
239 }
240
241 void vp9_recon_intra_mbuv(MACROBLOCKD *xd) {
242 int i;
243 for (i = 16; i < 24; i += 2) {
244 BLOCKD *b = &xd->block[i];
245 vp9_recon2b(b->predictor, b->diff, *(b->base_dst) + b->dst, b->dst_stride);
246 }
247 }
248
249 void vp9_build_intra_predictors_internal(unsigned char *src, int src_stride,
250 unsigned char *ypred_ptr,
251 int y_stride, int mode, int bsize,
252 int up_available, int left_available) {
253
254 unsigned char *yabove_row = src - src_stride;
255 unsigned char yleft_col[32];
256 unsigned char ytop_left = yabove_row[-1];
257 int r, c, i;
258
259 for (i = 0; i < bsize; i++) {
260 yleft_col[i] = src[i * src_stride - 1];
261 }
262
263 /* for Y */
264 switch (mode) {
265 case DC_PRED: {
266 int expected_dc;
267 int i;
268 int shift;
269 int average = 0;
270 int log2_bsize_minus_1;
271
272 assert(bsize == 4 || bsize == 8 || bsize == 16 || bsize == 32);
273 if (bsize == 4) {
274 log2_bsize_minus_1 = 1;
275 } else if (bsize == 8) {
276 log2_bsize_minus_1 = 2;
277 } else if (bsize == 16) {
278 log2_bsize_minus_1 = 3;
279 } else /* bsize == 32 */ {
280 log2_bsize_minus_1 = 4;
281 }
282
283 if (up_available || left_available) {
284 if (up_available) {
285 for (i = 0; i < bsize; i++) {
286 average += yabove_row[i];
287 }
288 }
289
290 if (left_available) {
291 for (i = 0; i < bsize; i++) {
292 average += yleft_col[i];
293 }
294 }
295 shift = log2_bsize_minus_1 + up_available + left_available;
296 expected_dc = (average + (1 << (shift - 1))) >> shift;
297 } else {
298 expected_dc = 128;
299 }
300
301 for (r = 0; r < bsize; r++) {
302 vpx_memset(ypred_ptr, expected_dc, bsize);
303 ypred_ptr += y_stride;
304 }
305 }
306 break;
307 case V_PRED: {
308 for (r = 0; r < bsize; r++) {
309 memcpy(ypred_ptr, yabove_row, bsize);
310 ypred_ptr += y_stride;
311 }
312 }
313 break;
314 case H_PRED: {
315 for (r = 0; r < bsize; r++) {
316 vpx_memset(ypred_ptr, yleft_col[r], bsize);
317 ypred_ptr += y_stride;
318 }
319 }
320 break;
321 case TM_PRED: {
322 for (r = 0; r < bsize; r++) {
323 for (c = 0; c < bsize; c++) {
324 int pred = yleft_col[r] + yabove_row[ c] - ytop_left;
325
326 if (pred < 0)
327 pred = 0;
328
329 if (pred > 255)
330 pred = 255;
331
332 ypred_ptr[c] = pred;
333 }
334
335 ypred_ptr += y_stride;
336 }
337 }
338 break;
339 case D45_PRED: {
340 d45_predictor(ypred_ptr, y_stride, bsize, yabove_row, yleft_col);
341 }
342 break;
343 case D135_PRED: {
344 d135_predictor(ypred_ptr, y_stride, bsize, yabove_row, yleft_col);
345 }
346 break;
347 case D117_PRED: {
348 d117_predictor(ypred_ptr, y_stride, bsize, yabove_row, yleft_col);
349 }
350 break;
351 case D153_PRED: {
352 d153_predictor(ypred_ptr, y_stride, bsize, yabove_row, yleft_col);
353 }
354 break;
355 case D27_PRED: {
356 d27_predictor(ypred_ptr, y_stride, bsize, yabove_row, yleft_col);
357 }
358 break;
359 case D63_PRED: {
360 d63_predictor(ypred_ptr, y_stride, bsize, yabove_row, yleft_col);
361 }
362 break;
363 case I8X8_PRED:
364 case B_PRED:
365 case NEARESTMV:
366 case NEARMV:
367 case ZEROMV:
368 case NEWMV:
369 case SPLITMV:
370 case MB_MODE_COUNT:
371 break;
372 }
373 }
374
375 #if CONFIG_COMP_INTERINTRA_PRED
376 static void combine_interintra(MB_PREDICTION_MODE mode,
377 unsigned char *interpred,
378 int interstride,
379 unsigned char *intrapred,
380 int intrastride,
381 int size) {
382 // TODO(debargha): Explore different ways of combining predictors
383 // or designing the tables below
384 static const int scale_bits = 8;
385 static const int scale_max = 256; // 1 << scale_bits;
386 static const int scale_round = 127; // (1 << (scale_bits - 1));
387 // This table is a function A + B*exp(-kx), where x is hor. index
388 static const int weights1d[32] = {
389 128, 122, 116, 111, 107, 103, 99, 96,
390 93, 90, 88, 85, 83, 81, 80, 78,
391 77, 76, 75, 74, 73, 72, 71, 70,
392 70, 69, 69, 68, 68, 68, 67, 67,
393 };
394 // This table is a function A + B*exp(-k.sqrt(xy)), where x, y are
395 // hor. and vert. indices
396 static const int weights2d[1024] = {
397 128, 128, 128, 128, 128, 128, 128, 128,
398 128, 128, 128, 128, 128, 128, 128, 128,
399 128, 128, 128, 128, 128, 128, 128, 128,
400 128, 128, 128, 128, 128, 128, 128, 128,
401 128, 122, 120, 118, 116, 115, 114, 113,
402 112, 111, 111, 110, 109, 109, 108, 107,
403 107, 106, 106, 105, 105, 104, 104, 104,
404 103, 103, 102, 102, 102, 101, 101, 101,
405 128, 120, 116, 114, 112, 111, 109, 108,
406 107, 106, 105, 104, 103, 102, 102, 101,
407 100, 100, 99, 99, 98, 97, 97, 96,
408 96, 96, 95, 95, 94, 94, 93, 93,
409 128, 118, 114, 111, 109, 107, 106, 104,
410 103, 102, 101, 100, 99, 98, 97, 97,
411 96, 95, 95, 94, 93, 93, 92, 92,
412 91, 91, 90, 90, 90, 89, 89, 88,
413 128, 116, 112, 109, 107, 105, 103, 102,
414 100, 99, 98, 97, 96, 95, 94, 93,
415 93, 92, 91, 91, 90, 90, 89, 89,
416 88, 88, 87, 87, 86, 86, 85, 85,
417 128, 115, 111, 107, 105, 103, 101, 99,
418 98, 97, 96, 94, 93, 93, 92, 91,
419 90, 89, 89, 88, 88, 87, 86, 86,
420 85, 85, 84, 84, 84, 83, 83, 82,
421 128, 114, 109, 106, 103, 101, 99, 97,
422 96, 95, 93, 92, 91, 90, 90, 89,
423 88, 87, 87, 86, 85, 85, 84, 84,
424 83, 83, 82, 82, 82, 81, 81, 80,
425 128, 113, 108, 104, 102, 99, 97, 96,
426 94, 93, 92, 91, 90, 89, 88, 87,
427 86, 85, 85, 84, 84, 83, 83, 82,
428 82, 81, 81, 80, 80, 79, 79, 79,
429 128, 112, 107, 103, 100, 98, 96, 94,
430 93, 91, 90, 89, 88, 87, 86, 85,
431 85, 84, 83, 83, 82, 82, 81, 80,
432 80, 80, 79, 79, 78, 78, 78, 77,
433 128, 111, 106, 102, 99, 97, 95, 93,
434 91, 90, 89, 88, 87, 86, 85, 84,
435 83, 83, 82, 81, 81, 80, 80, 79,
436 79, 78, 78, 77, 77, 77, 76, 76,
437 128, 111, 105, 101, 98, 96, 93, 92,
438 90, 89, 88, 86, 85, 84, 84, 83,
439 82, 81, 81, 80, 80, 79, 79, 78,
440 78, 77, 77, 76, 76, 76, 75, 75,
441 128, 110, 104, 100, 97, 94, 92, 91,
442 89, 88, 86, 85, 84, 83, 83, 82,
443 81, 80, 80, 79, 79, 78, 78, 77,
444 77, 76, 76, 75, 75, 75, 74, 74,
445 128, 109, 103, 99, 96, 93, 91, 90,
446 88, 87, 85, 84, 83, 82, 82, 81,
447 80, 79, 79, 78, 78, 77, 77, 76,
448 76, 75, 75, 75, 74, 74, 74, 73,
449 128, 109, 102, 98, 95, 93, 90, 89,
450 87, 86, 84, 83, 82, 81, 81, 80,
451 79, 78, 78, 77, 77, 76, 76, 75,
452 75, 75, 74, 74, 73, 73, 73, 73,
453 128, 108, 102, 97, 94, 92, 90, 88,
454 86, 85, 84, 83, 82, 81, 80, 79,
455 78, 78, 77, 77, 76, 76, 75, 75,
456 74, 74, 73, 73, 73, 73, 72, 72,
457 128, 107, 101, 97, 93, 91, 89, 87,
458 85, 84, 83, 82, 81, 80, 79, 78,
459 78, 77, 76, 76, 75, 75, 74, 74,
460 74, 73, 73, 73, 72, 72, 72, 71,
461 128, 107, 100, 96, 93, 90, 88, 86,
462 85, 83, 82, 81, 80, 79, 78, 78,
463 77, 76, 76, 75, 75, 74, 74, 73,
464 73, 73, 72, 72, 72, 71, 71, 71,
465 128, 106, 100, 95, 92, 89, 87, 85,
466 84, 83, 81, 80, 79, 78, 78, 77,
467 76, 76, 75, 75, 74, 74, 73, 73,
468 72, 72, 72, 72, 71, 71, 71, 70,
469 128, 106, 99, 95, 91, 89, 87, 85,
470 83, 82, 81, 80, 79, 78, 77, 76,
471 76, 75, 75, 74, 74, 73, 73, 72,
472 72, 72, 71, 71, 71, 71, 70, 70,
473 128, 105, 99, 94, 91, 88, 86, 84,
474 83, 81, 80, 79, 78, 77, 77, 76,
475 75, 75, 74, 74, 73, 73, 72, 72,
476 72, 71, 71, 71, 70, 70, 70, 70,
477 128, 105, 98, 93, 90, 88, 85, 84,
478 82, 81, 80, 79, 78, 77, 76, 75,
479 75, 74, 74, 73, 73, 72, 72, 71,
480 71, 71, 71, 70, 70, 70, 70, 69,
481 128, 104, 97, 93, 90, 87, 85, 83,
482 82, 80, 79, 78, 77, 76, 76, 75,
483 74, 74, 73, 73, 72, 72, 71, 71,
484 71, 70, 70, 70, 70, 69, 69, 69,
485 128, 104, 97, 92, 89, 86, 84, 83,
486 81, 80, 79, 78, 77, 76, 75, 74,
487 74, 73, 73, 72, 72, 71, 71, 71,
488 70, 70, 70, 70, 69, 69, 69, 69,
489 128, 104, 96, 92, 89, 86, 84, 82,
490 80, 79, 78, 77, 76, 75, 75, 74,
491 73, 73, 72, 72, 71, 71, 71, 70,
492 70, 70, 70, 69, 69, 69, 69, 68,
493 128, 103, 96, 91, 88, 85, 83, 82,
494 80, 79, 78, 77, 76, 75, 74, 74,
495 73, 72, 72, 72, 71, 71, 70, 70,
496 70, 70, 69, 69, 69, 69, 68, 68,
497 128, 103, 96, 91, 88, 85, 83, 81,
498 80, 78, 77, 76, 75, 75, 74, 73,
499 73, 72, 72, 71, 71, 70, 70, 70,
500 70, 69, 69, 69, 69, 68, 68, 68,
501 128, 102, 95, 90, 87, 84, 82, 81,
502 79, 78, 77, 76, 75, 74, 73, 73,
503 72, 72, 71, 71, 71, 70, 70, 70,
504 69, 69, 69, 69, 68, 68, 68, 68,
505 128, 102, 95, 90, 87, 84, 82, 80,
506 79, 77, 76, 75, 75, 74, 73, 73,
507 72, 72, 71, 71, 70, 70, 70, 69,
508 69, 69, 69, 68, 68, 68, 68, 68,
509 128, 102, 94, 90, 86, 84, 82, 80,
510 78, 77, 76, 75, 74, 73, 73, 72,
511 72, 71, 71, 70, 70, 70, 69, 69,
512 69, 69, 68, 68, 68, 68, 68, 67,
513 128, 101, 94, 89, 86, 83, 81, 79,
514 78, 77, 76, 75, 74, 73, 73, 72,
515 71, 71, 71, 70, 70, 69, 69, 69,
516 69, 68, 68, 68, 68, 68, 67, 67,
517 128, 101, 93, 89, 85, 83, 81, 79,
518 78, 76, 75, 74, 74, 73, 72, 72,
519 71, 71, 70, 70, 70, 69, 69, 69,
520 68, 68, 68, 68, 68, 67, 67, 67,
521 128, 101, 93, 88, 85, 82, 80, 79,
522 77, 76, 75, 74, 73, 73, 72, 71,
523 71, 70, 70, 70, 69, 69, 69, 68,
524 68, 68, 68, 68, 67, 67, 67, 67,
525 };
526 int size_scale = (size == 32 ? 1 :
527 size == 16 ? 2 :
528 size == 8 ? 4 : 8);
529 int i, j;
530 switch (mode) {
531 case V_PRED:
532 for (i = 0; i < size; ++i) {
533 for (j = 0; j < size; ++j) {
534 int k = i * interstride + j;
535 int scale = weights1d[i * size_scale];
536 interpred[k] =
537 ((scale_max - scale) * interpred[k] +
538 scale * intrapred[i * intrastride + j] + scale_round)
539 >> scale_bits;
540 }
541 }
542 break;
543
544 case H_PRED:
545 for (i = 0; i < size; ++i) {
546 for (j = 0; j < size; ++j) {
547 int k = i * interstride + j;
548 int scale = weights1d[j * size_scale];
549 interpred[k] =
550 ((scale_max - scale) * interpred[k] +
551 scale * intrapred[i * intrastride + j] + scale_round)
552 >> scale_bits;
553 }
554 }
555 break;
556
557 case D63_PRED:
558 case D117_PRED:
559 for (i = 0; i < size; ++i) {
560 for (j = 0; j < size; ++j) {
561 int k = i * interstride + j;
562 int scale = (weights2d[i * size_scale * 32 + j * size_scale] +
563 weights1d[i * size_scale]) >> 1;
564 interpred[k] =
565 ((scale_max - scale) * interpred[k] +
566 scale * intrapred[i * intrastride + j] + scale_round)
567 >> scale_bits;
568 }
569 }
570 break;
571
572 case D27_PRED:
573 case D153_PRED:
574 for (i = 0; i < size; ++i) {
575 for (j = 0; j < size; ++j) {
576 int k = i * interstride + j;
577 int scale = (weights2d[i * size_scale * 32 + j * size_scale] +
578 weights1d[j * size_scale]) >> 1;
579 interpred[k] =
580 ((scale_max - scale) * interpred[k] +
581 scale * intrapred[i * intrastride + j] + scale_round)
582 >> scale_bits;
583 }
584 }
585 break;
586
587 case D135_PRED:
588 for (i = 0; i < size; ++i) {
589 for (j = 0; j < size; ++j) {
590 int k = i * interstride + j;
591 int scale = weights2d[i * size_scale * 32 + j * size_scale];
592 interpred[k] =
593 ((scale_max - scale) * interpred[k] +
594 scale * intrapred[i * intrastride + j] + scale_round)
595 >> scale_bits;
596 }
597 }
598 break;
599
600 case D45_PRED:
601 case DC_PRED:
602 case TM_PRED:
603 default:
604 // simple average
605 for (i = 0; i < size; ++i) {
606 for (j = 0; j < size; ++j) {
607 int k = i * interstride + j;
608 interpred[k] = (interpred[k] + intrapred[i * intrastride + j]) >> 1;
609 }
610 }
611 break;
612 }
613 }
614
615 void vp9_build_interintra_16x16_predictors_mb(MACROBLOCKD *xd,
616 unsigned char *ypred,
617 unsigned char *upred,
618 unsigned char *vpred,
619 int ystride, int uvstride) {
620 vp9_build_interintra_16x16_predictors_mby(xd, ypred, ystride);
621 vp9_build_interintra_16x16_predictors_mbuv(xd, upred, vpred, uvstride);
622 }
623
624 void vp9_build_interintra_16x16_predictors_mby(MACROBLOCKD *xd,
625 unsigned char *ypred,
626 int ystride) {
627 unsigned char intrapredictor[256];
628 vp9_build_intra_predictors_internal(
629 xd->dst.y_buffer, xd->dst.y_stride,
630 intrapredictor, 16,
631 xd->mode_info_context->mbmi.interintra_mode, 16,
632 xd->up_available, xd->left_available);
633 combine_interintra(xd->mode_info_context->mbmi.interintra_mode,
634 ypred, ystride, intrapredictor, 16, 16);
635 }
636
637 void vp9_build_interintra_16x16_predictors_mbuv(MACROBLOCKD *xd,
638 unsigned char *upred,
639 unsigned char *vpred,
640 int uvstride) {
641 unsigned char uintrapredictor[64];
642 unsigned char vintrapredictor[64];
643 vp9_build_intra_predictors_internal(
644 xd->dst.u_buffer, xd->dst.uv_stride,
645 uintrapredictor, 8,
646 xd->mode_info_context->mbmi.interintra_uv_mode, 8,
647 xd->up_available, xd->left_available);
648 vp9_build_intra_predictors_internal(
649 xd->dst.v_buffer, xd->dst.uv_stride,
650 vintrapredictor, 8,
651 xd->mode_info_context->mbmi.interintra_uv_mode, 8,
652 xd->up_available, xd->left_available);
653 combine_interintra(xd->mode_info_context->mbmi.interintra_uv_mode,
654 upred, uvstride, uintrapredictor, 8, 8);
655 combine_interintra(xd->mode_info_context->mbmi.interintra_uv_mode,
656 vpred, uvstride, vintrapredictor, 8, 8);
657 }
658
659 #if CONFIG_SUPERBLOCKS
660 void vp9_build_interintra_32x32_predictors_sby(MACROBLOCKD *xd,
661 unsigned char *ypred,
662 int ystride) {
663 unsigned char intrapredictor[1024];
664 vp9_build_intra_predictors_internal(
665 xd->dst.y_buffer, xd->dst.y_stride,
666 intrapredictor, 32,
667 xd->mode_info_context->mbmi.interintra_mode, 32,
668 xd->up_available, xd->left_available);
669 combine_interintra(xd->mode_info_context->mbmi.interintra_mode,
670 ypred, ystride, intrapredictor, 32, 32);
671 }
672
673 void vp9_build_interintra_32x32_predictors_sbuv(MACROBLOCKD *xd,
674 unsigned char *upred,
675 unsigned char *vpred,
676 int uvstride) {
677 unsigned char uintrapredictor[256];
678 unsigned char vintrapredictor[256];
679 vp9_build_intra_predictors_internal(
680 xd->dst.u_buffer, xd->dst.uv_stride,
681 uintrapredictor, 16,
682 xd->mode_info_context->mbmi.interintra_uv_mode, 16,
683 xd->up_available, xd->left_available);
684 vp9_build_intra_predictors_internal(
685 xd->dst.v_buffer, xd->dst.uv_stride,
686 vintrapredictor, 16,
687 xd->mode_info_context->mbmi.interintra_uv_mode, 16,
688 xd->up_available, xd->left_available);
689 combine_interintra(xd->mode_info_context->mbmi.interintra_uv_mode,
690 upred, uvstride, uintrapredictor, 16, 16);
691 combine_interintra(xd->mode_info_context->mbmi.interintra_uv_mode,
692 vpred, uvstride, vintrapredictor, 16, 16);
693 }
694
695 void vp9_build_interintra_32x32_predictors_sb(MACROBLOCKD *xd,
696 unsigned char *ypred,
697 unsigned char *upred,
698 unsigned char *vpred,
699 int ystride,
700 int uvstride) {
701 vp9_build_interintra_32x32_predictors_sby(xd, ypred, ystride);
702 vp9_build_interintra_32x32_predictors_sbuv(xd, upred, vpred, uvstride);
703 }
704 #endif
705 #endif
706
707 void vp9_build_intra_predictors_mby(MACROBLOCKD *xd) {
708 vp9_build_intra_predictors_internal(xd->dst.y_buffer, xd->dst.y_stride,
709 xd->predictor, 16,
710 xd->mode_info_context->mbmi.mode, 16,
711 xd->up_available, xd->left_available);
712 }
713
714 void vp9_build_intra_predictors_mby_s(MACROBLOCKD *xd) {
715 vp9_build_intra_predictors_internal(xd->dst.y_buffer, xd->dst.y_stride,
716 xd->dst.y_buffer, xd->dst.y_stride,
717 xd->mode_info_context->mbmi.mode, 16,
718 xd->up_available, xd->left_available);
719 }
720
721 #if CONFIG_SUPERBLOCKS
722 void vp9_build_intra_predictors_sby_s(MACROBLOCKD *xd) {
723 vp9_build_intra_predictors_internal(xd->dst.y_buffer, xd->dst.y_stride,
724 xd->dst.y_buffer, xd->dst.y_stride,
725 xd->mode_info_context->mbmi.mode, 32,
726 xd->up_available, xd->left_available);
727 }
728 #endif
729
730 #if CONFIG_COMP_INTRA_PRED
731 void vp9_build_comp_intra_predictors_mby(MACROBLOCKD *xd) {
732 unsigned char predictor[2][256];
733 int i;
734
735 vp9_build_intra_predictors_internal(xd->dst.y_buffer, xd->dst.y_stride,
736 predictor[0], 16,
737 xd->mode_info_context->mbmi.mode,
738 16, xd->up_available,
739 xd->left_available);
740 vp9_build_intra_predictors_internal(xd->dst.y_buffer, xd->dst.y_stride,
741 predictor[1], 16,
742 xd->mode_info_context->mbmi.second_mode,
743 16, xd->up_available,
744 xd->left_available);
745
746 for (i = 0; i < 256; i++) {
747 xd->predictor[i] = (predictor[0][i] + predictor[1][i] + 1) >> 1;
748 }
749 }
750 #endif
751
752 void vp9_build_intra_predictors_mbuv_internal(MACROBLOCKD *xd,
753 unsigned char *upred_ptr,
754 unsigned char *vpred_ptr,
755 int uv_stride,
756 int mode, int bsize) {
757 vp9_build_intra_predictors_internal(xd->dst.u_buffer, xd->dst.uv_stride,
758 upred_ptr, uv_stride, mode, bsize,
759 xd->up_available, xd->left_available);
760 vp9_build_intra_predictors_internal(xd->dst.v_buffer, xd->dst.uv_stride,
761 vpred_ptr, uv_stride, mode, bsize,
762 xd->up_available, xd->left_available);
763 }
764
765 void vp9_build_intra_predictors_mbuv(MACROBLOCKD *xd) {
766 vp9_build_intra_predictors_mbuv_internal(xd, &xd->predictor[256],
767 &xd->predictor[320], 8,
768 xd->mode_info_context->mbmi.uv_mode,
769 8);
770 }
771
772 void vp9_build_intra_predictors_mbuv_s(MACROBLOCKD *xd) {
773 vp9_build_intra_predictors_mbuv_internal(xd, xd->dst.u_buffer,
774 xd->dst.v_buffer,
775 xd->dst.uv_stride,
776 xd->mode_info_context->mbmi.uv_mode,
777 8);
778 }
779
780 #if CONFIG_SUPERBLOCKS
781 void vp9_build_intra_predictors_sbuv_s(MACROBLOCKD *xd) {
782 vp9_build_intra_predictors_mbuv_internal(xd, xd->dst.u_buffer,
783 xd->dst.v_buffer, xd->dst.uv_stride,
784 xd->mode_info_context->mbmi.uv_mode,
785 16);
786 }
787 #endif
788
789 #if CONFIG_COMP_INTRA_PRED
790 void vp9_build_comp_intra_predictors_mbuv(MACROBLOCKD *xd) {
791 unsigned char predictor[2][2][64];
792 int i;
793
794 vp9_build_intra_predictors_mbuv_internal(
795 xd, predictor[0][0], predictor[1][0], 8,
796 xd->mode_info_context->mbmi.uv_mode, 8);
797 vp9_build_intra_predictors_mbuv_internal(
798 xd, predictor[0][1], predictor[1][1], 8,
799 xd->mode_info_context->mbmi.second_uv_mode, 8);
800 for (i = 0; i < 64; i++) {
801 xd->predictor[256 + i] = (predictor[0][0][i] + predictor[0][1][i] + 1) >> 1;
802 xd->predictor[256 + 64 + i] = (predictor[1][0][i] +
803 predictor[1][1][i] + 1) >> 1;
804 }
805 }
806 #endif
807
808 void vp9_intra8x8_predict(BLOCKD *xd,
809 int mode,
810 unsigned char *predictor) {
811 vp9_build_intra_predictors_internal(*(xd->base_dst) + xd->dst,
812 xd->dst_stride, predictor, 16,
813 mode, 8, 1, 1);
814 }
815
816 #if CONFIG_COMP_INTRA_PRED
817 void vp9_comp_intra8x8_predict(BLOCKD *xd,
818 int mode, int second_mode,
819 unsigned char *out_predictor) {
820 unsigned char predictor[2][8 * 16];
821 int i, j;
822
823 vp9_intra8x8_predict(xd, mode, predictor[0]);
824 vp9_intra8x8_predict(xd, second_mode, predictor[1]);
825
826 for (i = 0; i < 8 * 16; i += 16) {
827 for (j = i; j < i + 8; j++) {
828 out_predictor[j] = (predictor[0][j] + predictor[1][j] + 1) >> 1;
829 }
830 }
831 }
832 #endif
833
834 void vp9_intra_uv4x4_predict(BLOCKD *xd,
835 int mode,
836 unsigned char *predictor) {
837 vp9_build_intra_predictors_internal(*(xd->base_dst) + xd->dst,
838 xd->dst_stride, predictor, 8,
839 mode, 4, 1, 1);
840 }
841
842 #if CONFIG_COMP_INTRA_PRED
843 void vp9_comp_intra_uv4x4_predict(BLOCKD *xd,
844 int mode, int mode2,
845 unsigned char *out_predictor) {
846 unsigned char predictor[2][8 * 4];
847 int i, j;
848
849 vp9_intra_uv4x4_predict(xd, mode, predictor[0]);
850 vp9_intra_uv4x4_predict(xd, mode2, predictor[1]);
851
852 for (i = 0; i < 4 * 8; i += 8) {
853 for (j = i; j < i + 4; j++) {
854 out_predictor[j] = (predictor[0][j] + predictor[1][j] + 1) >> 1;
855 }
856 }
857 }
858 #endif
859
860 /* TODO: try different ways of use Y-UV mode correlation
861 Current code assumes that a uv 4x4 block use same mode
862 as corresponding Y 8x8 area
863 */
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698