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

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

Issue 898943004: libvpx: Pull from upstream (Closed) Base URL: https://chromium.googlesource.com/chromium/deps/libvpx.git@master
Patch Set: Created 5 years, 10 months 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
« no previous file with comments | « source/libvpx/vp9/common/vp9_reconinter.h ('k') | source/libvpx/vp9/common/vp9_reconintra.c » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
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 <assert.h> 11 #include <assert.h>
12 12
13 #include "./vpx_scale_rtcd.h" 13 #include "./vpx_scale_rtcd.h"
14 #include "./vpx_config.h" 14 #include "./vpx_config.h"
15 15
16 #include "vpx/vpx_integer.h" 16 #include "vpx/vpx_integer.h"
17 17
18 #include "vp9/common/vp9_blockd.h" 18 #include "vp9/common/vp9_blockd.h"
19 #include "vp9/common/vp9_filter.h" 19 #include "vp9/common/vp9_filter.h"
20 #include "vp9/common/vp9_reconinter.h" 20 #include "vp9/common/vp9_reconinter.h"
21 #include "vp9/common/vp9_reconintra.h" 21 #include "vp9/common/vp9_reconintra.h"
22 22
23 static void build_mc_border(const uint8_t *src, int src_stride, 23 void inter_predictor(const uint8_t *src, int src_stride,
24 uint8_t *dst, int dst_stride,
25 int x, int y, int b_w, int b_h, int w, int h) {
26 // Get a pointer to the start of the real data for this row.
27 const uint8_t *ref_row = src - x - y * src_stride;
28
29 if (y >= h)
30 ref_row += (h - 1) * src_stride;
31 else if (y > 0)
32 ref_row += y * src_stride;
33
34 do {
35 int right = 0, copy;
36 int left = x < 0 ? -x : 0;
37
38 if (left > b_w)
39 left = b_w;
40
41 if (x + b_w > w)
42 right = x + b_w - w;
43
44 if (right > b_w)
45 right = b_w;
46
47 copy = b_w - left - right;
48
49 if (left)
50 memset(dst, ref_row[0], left);
51
52 if (copy)
53 memcpy(dst + left, ref_row + x + left, copy);
54
55 if (right)
56 memset(dst + left + copy, ref_row[w - 1], right);
57
58 dst += dst_stride;
59 ++y;
60
61 if (y > 0 && y < h)
62 ref_row += src_stride;
63 } while (--b_h);
64 }
65
66 #if CONFIG_VP9_HIGHBITDEPTH
67 static void high_build_mc_border(const uint8_t *src8, int src_stride,
68 uint16_t *dst, int dst_stride,
69 int x, int y, int b_w, int b_h,
70 int w, int h) {
71 // Get a pointer to the start of the real data for this row.
72 const uint16_t *src = CONVERT_TO_SHORTPTR(src8);
73 const uint16_t *ref_row = src - x - y * src_stride;
74
75 if (y >= h)
76 ref_row += (h - 1) * src_stride;
77 else if (y > 0)
78 ref_row += y * src_stride;
79
80 do {
81 int right = 0, copy;
82 int left = x < 0 ? -x : 0;
83
84 if (left > b_w)
85 left = b_w;
86
87 if (x + b_w > w)
88 right = x + b_w - w;
89
90 if (right > b_w)
91 right = b_w;
92
93 copy = b_w - left - right;
94
95 if (left)
96 vpx_memset16(dst, ref_row[0], left);
97
98 if (copy)
99 memcpy(dst + left, ref_row + x + left, copy * sizeof(uint16_t));
100
101 if (right)
102 vpx_memset16(dst + left + copy, ref_row[w - 1], right);
103
104 dst += dst_stride;
105 ++y;
106
107 if (y > 0 && y < h)
108 ref_row += src_stride;
109 } while (--b_h);
110 }
111 #endif // CONFIG_VP9_HIGHBITDEPTH
112
113 static void inter_predictor(const uint8_t *src, int src_stride,
114 uint8_t *dst, int dst_stride, 24 uint8_t *dst, int dst_stride,
115 const int subpel_x, 25 const int subpel_x,
116 const int subpel_y, 26 const int subpel_y,
117 const struct scale_factors *sf, 27 const struct scale_factors *sf,
118 int w, int h, int ref, 28 int w, int h, int ref,
119 const InterpKernel *kernel, 29 const InterpKernel *kernel,
120 int xs, int ys) { 30 int xs, int ys) {
121 sf->predict[subpel_x != 0][subpel_y != 0][ref]( 31 sf->predict[subpel_x != 0][subpel_y != 0][ref](
122 src, src_stride, dst, dst_stride, 32 src, src_stride, dst, dst_stride,
123 kernel[subpel_x], xs, kernel[subpel_y], ys, w, h); 33 kernel[subpel_x], xs, kernel[subpel_y], ys, w, h);
124 } 34 }
125 35
126 void vp9_build_inter_predictor(const uint8_t *src, int src_stride,
127 uint8_t *dst, int dst_stride,
128 const MV *src_mv,
129 const struct scale_factors *sf,
130 int w, int h, int ref,
131 const InterpKernel *kernel,
132 enum mv_precision precision,
133 int x, int y) {
134 const int is_q4 = precision == MV_PRECISION_Q4;
135 const MV mv_q4 = { is_q4 ? src_mv->row : src_mv->row * 2,
136 is_q4 ? src_mv->col : src_mv->col * 2 };
137 MV32 mv = vp9_scale_mv(&mv_q4, x, y, sf);
138 const int subpel_x = mv.col & SUBPEL_MASK;
139 const int subpel_y = mv.row & SUBPEL_MASK;
140
141 src += (mv.row >> SUBPEL_BITS) * src_stride + (mv.col >> SUBPEL_BITS);
142
143 inter_predictor(src, src_stride, dst, dst_stride, subpel_x, subpel_y,
144 sf, w, h, ref, kernel, sf->x_step_q4, sf->y_step_q4);
145 }
146
147 #if CONFIG_VP9_HIGHBITDEPTH 36 #if CONFIG_VP9_HIGHBITDEPTH
148 static void high_inter_predictor(const uint8_t *src, int src_stride, 37 void high_inter_predictor(const uint8_t *src, int src_stride,
149 uint8_t *dst, int dst_stride, 38 uint8_t *dst, int dst_stride,
150 const int subpel_x, 39 const int subpel_x,
151 const int subpel_y, 40 const int subpel_y,
152 const struct scale_factors *sf, 41 const struct scale_factors *sf,
153 int w, int h, int ref, 42 int w, int h, int ref,
154 const InterpKernel *kernel, 43 const InterpKernel *kernel,
155 int xs, int ys, int bd) { 44 int xs, int ys, int bd) {
156 sf->highbd_predict[subpel_x != 0][subpel_y != 0][ref]( 45 sf->highbd_predict[subpel_x != 0][subpel_y != 0][ref](
157 src, src_stride, dst, dst_stride, 46 src, src_stride, dst, dst_stride,
158 kernel[subpel_x], xs, kernel[subpel_y], ys, w, h, bd); 47 kernel[subpel_x], xs, kernel[subpel_y], ys, w, h, bd);
(...skipping 14 matching lines...) Expand all
173 const int subpel_x = mv.col & SUBPEL_MASK; 62 const int subpel_x = mv.col & SUBPEL_MASK;
174 const int subpel_y = mv.row & SUBPEL_MASK; 63 const int subpel_y = mv.row & SUBPEL_MASK;
175 64
176 src += (mv.row >> SUBPEL_BITS) * src_stride + (mv.col >> SUBPEL_BITS); 65 src += (mv.row >> SUBPEL_BITS) * src_stride + (mv.col >> SUBPEL_BITS);
177 66
178 high_inter_predictor(src, src_stride, dst, dst_stride, subpel_x, subpel_y, 67 high_inter_predictor(src, src_stride, dst, dst_stride, subpel_x, subpel_y,
179 sf, w, h, ref, kernel, sf->x_step_q4, sf->y_step_q4, bd); 68 sf, w, h, ref, kernel, sf->x_step_q4, sf->y_step_q4, bd);
180 } 69 }
181 #endif // CONFIG_VP9_HIGHBITDEPTH 70 #endif // CONFIG_VP9_HIGHBITDEPTH
182 71
72 void vp9_build_inter_predictor(const uint8_t *src, int src_stride,
73 uint8_t *dst, int dst_stride,
74 const MV *src_mv,
75 const struct scale_factors *sf,
76 int w, int h, int ref,
77 const InterpKernel *kernel,
78 enum mv_precision precision,
79 int x, int y) {
80 const int is_q4 = precision == MV_PRECISION_Q4;
81 const MV mv_q4 = { is_q4 ? src_mv->row : src_mv->row * 2,
82 is_q4 ? src_mv->col : src_mv->col * 2 };
83 MV32 mv = vp9_scale_mv(&mv_q4, x, y, sf);
84 const int subpel_x = mv.col & SUBPEL_MASK;
85 const int subpel_y = mv.row & SUBPEL_MASK;
86
87 src += (mv.row >> SUBPEL_BITS) * src_stride + (mv.col >> SUBPEL_BITS);
88
89 inter_predictor(src, src_stride, dst, dst_stride, subpel_x, subpel_y,
90 sf, w, h, ref, kernel, sf->x_step_q4, sf->y_step_q4);
91 }
92
183 static INLINE int round_mv_comp_q4(int value) { 93 static INLINE int round_mv_comp_q4(int value) {
184 return (value < 0 ? value - 2 : value + 2) / 4; 94 return (value < 0 ? value - 2 : value + 2) / 4;
185 } 95 }
186 96
187 static MV mi_mv_pred_q4(const MODE_INFO *mi, int idx) { 97 static MV mi_mv_pred_q4(const MODE_INFO *mi, int idx) {
188 MV res = { round_mv_comp_q4(mi->bmi[0].as_mv[idx].as_mv.row + 98 MV res = { round_mv_comp_q4(mi->bmi[0].as_mv[idx].as_mv.row +
189 mi->bmi[1].as_mv[idx].as_mv.row + 99 mi->bmi[1].as_mv[idx].as_mv.row +
190 mi->bmi[2].as_mv[idx].as_mv.row + 100 mi->bmi[2].as_mv[idx].as_mv.row +
191 mi->bmi[3].as_mv[idx].as_mv.row), 101 mi->bmi[3].as_mv[idx].as_mv.row),
192 round_mv_comp_q4(mi->bmi[0].as_mv[idx].as_mv.col + 102 round_mv_comp_q4(mi->bmi[0].as_mv[idx].as_mv.col +
(...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after
227 137
228 clamp_mv(&clamped_mv, 138 clamp_mv(&clamped_mv,
229 xd->mb_to_left_edge * (1 << (1 - ss_x)) - spel_left, 139 xd->mb_to_left_edge * (1 << (1 - ss_x)) - spel_left,
230 xd->mb_to_right_edge * (1 << (1 - ss_x)) + spel_right, 140 xd->mb_to_right_edge * (1 << (1 - ss_x)) + spel_right,
231 xd->mb_to_top_edge * (1 << (1 - ss_y)) - spel_top, 141 xd->mb_to_top_edge * (1 << (1 - ss_y)) - spel_top,
232 xd->mb_to_bottom_edge * (1 << (1 - ss_y)) + spel_bottom); 142 xd->mb_to_bottom_edge * (1 << (1 - ss_y)) + spel_bottom);
233 143
234 return clamped_mv; 144 return clamped_mv;
235 } 145 }
236 146
237 static MV average_split_mvs(const struct macroblockd_plane *pd, 147 MV average_split_mvs(const struct macroblockd_plane *pd,
238 const MODE_INFO *mi, int ref, int block) { 148 const MODE_INFO *mi, int ref, int block) {
239 const int ss_idx = ((pd->subsampling_x > 0) << 1) | (pd->subsampling_y > 0); 149 const int ss_idx = ((pd->subsampling_x > 0) << 1) | (pd->subsampling_y > 0);
240 MV res = {0, 0}; 150 MV res = {0, 0};
241 switch (ss_idx) { 151 switch (ss_idx) {
242 case 0: 152 case 0:
243 res = mi->bmi[block].as_mv[ref].as_mv; 153 res = mi->bmi[block].as_mv[ref].as_mv;
244 break; 154 break;
245 case 1: 155 case 1:
246 res = mi_mv_pred_q2(mi, ref, block, block + 2); 156 res = mi_mv_pred_q2(mi, ref, block, block + 2);
247 break; 157 break;
248 case 2: 158 case 2:
249 res = mi_mv_pred_q2(mi, ref, block, block + 1); 159 res = mi_mv_pred_q2(mi, ref, block, block + 1);
250 break; 160 break;
251 case 3: 161 case 3:
252 res = mi_mv_pred_q4(mi, ref); 162 res = mi_mv_pred_q4(mi, ref);
253 break; 163 break;
254 default: 164 default:
255 assert(ss_idx <= 3 && ss_idx >= 0); 165 assert(ss_idx <= 3 && ss_idx >= 0);
256 } 166 }
257 return res; 167 return res;
258 } 168 }
259 169
260 static void build_inter_predictors(MACROBLOCKD *xd, int plane, int block, 170 void build_inter_predictors(MACROBLOCKD *xd, int plane, int block,
261 int bw, int bh, 171 int bw, int bh,
262 int x, int y, int w, int h, 172 int x, int y, int w, int h,
263 int mi_x, int mi_y) { 173 int mi_x, int mi_y) {
264 struct macroblockd_plane *const pd = &xd->plane[plane]; 174 struct macroblockd_plane *const pd = &xd->plane[plane];
265 const MODE_INFO *mi = xd->mi[0].src_mi; 175 const MODE_INFO *mi = xd->mi[0].src_mi;
266 const int is_compound = has_second_ref(&mi->mbmi); 176 const int is_compound = has_second_ref(&mi->mbmi);
267 const InterpKernel *kernel = vp9_get_interp_kernel(mi->mbmi.interp_filter); 177 const InterpKernel *kernel = vp9_get_interp_kernel(mi->mbmi.interp_filter);
268 int ref; 178 int ref;
269 179
270 for (ref = 0; ref < 1 + is_compound; ++ref) { 180 for (ref = 0; ref < 1 + is_compound; ++ref) {
(...skipping 87 matching lines...) Expand 10 before | Expand all | Expand 10 after
358 BLOCK_SIZE bsize) { 268 BLOCK_SIZE bsize) {
359 build_inter_predictors_for_planes(xd, bsize, mi_row, mi_col, 1, 269 build_inter_predictors_for_planes(xd, bsize, mi_row, mi_col, 1,
360 MAX_MB_PLANE - 1); 270 MAX_MB_PLANE - 1);
361 } 271 }
362 void vp9_build_inter_predictors_sb(MACROBLOCKD *xd, int mi_row, int mi_col, 272 void vp9_build_inter_predictors_sb(MACROBLOCKD *xd, int mi_row, int mi_col,
363 BLOCK_SIZE bsize) { 273 BLOCK_SIZE bsize) {
364 build_inter_predictors_for_planes(xd, bsize, mi_row, mi_col, 0, 274 build_inter_predictors_for_planes(xd, bsize, mi_row, mi_col, 0,
365 MAX_MB_PLANE - 1); 275 MAX_MB_PLANE - 1);
366 } 276 }
367 277
368 // TODO(jingning): This function serves as a placeholder for decoder prediction
369 // using on demand border extension. It should be moved to /decoder/ directory.
370 static void dec_build_inter_predictors(MACROBLOCKD *xd, int plane, int block,
371 int bw, int bh,
372 int x, int y, int w, int h,
373 int mi_x, int mi_y) {
374 struct macroblockd_plane *const pd = &xd->plane[plane];
375 const MODE_INFO *mi = xd->mi[0].src_mi;
376 const int is_compound = has_second_ref(&mi->mbmi);
377 const InterpKernel *kernel = vp9_get_interp_kernel(mi->mbmi.interp_filter);
378 int ref;
379
380 for (ref = 0; ref < 1 + is_compound; ++ref) {
381 const struct scale_factors *const sf = &xd->block_refs[ref]->sf;
382 struct buf_2d *const pre_buf = &pd->pre[ref];
383 struct buf_2d *const dst_buf = &pd->dst;
384 uint8_t *const dst = dst_buf->buf + dst_buf->stride * y + x;
385 const MV mv = mi->mbmi.sb_type < BLOCK_8X8
386 ? average_split_mvs(pd, mi, ref, block)
387 : mi->mbmi.mv[ref].as_mv;
388
389 const MV mv_q4 = clamp_mv_to_umv_border_sb(xd, &mv, bw, bh,
390 pd->subsampling_x,
391 pd->subsampling_y);
392
393 MV32 scaled_mv;
394 int xs, ys, x0, y0, x0_16, y0_16, frame_width, frame_height, buf_stride,
395 subpel_x, subpel_y;
396 uint8_t *ref_frame, *buf_ptr;
397 const YV12_BUFFER_CONFIG *ref_buf = xd->block_refs[ref]->buf;
398 const int is_scaled = vp9_is_scaled(sf);
399
400 // Get reference frame pointer, width and height.
401 if (plane == 0) {
402 frame_width = ref_buf->y_crop_width;
403 frame_height = ref_buf->y_crop_height;
404 ref_frame = ref_buf->y_buffer;
405 } else {
406 frame_width = ref_buf->uv_crop_width;
407 frame_height = ref_buf->uv_crop_height;
408 ref_frame = plane == 1 ? ref_buf->u_buffer : ref_buf->v_buffer;
409 }
410
411 if (is_scaled) {
412 // Co-ordinate of containing block to pixel precision.
413 int x_start = (-xd->mb_to_left_edge >> (3 + pd->subsampling_x));
414 int y_start = (-xd->mb_to_top_edge >> (3 + pd->subsampling_y));
415
416 // Co-ordinate of the block to 1/16th pixel precision.
417 x0_16 = (x_start + x) << SUBPEL_BITS;
418 y0_16 = (y_start + y) << SUBPEL_BITS;
419
420 // Co-ordinate of current block in reference frame
421 // to 1/16th pixel precision.
422 x0_16 = sf->scale_value_x(x0_16, sf);
423 y0_16 = sf->scale_value_y(y0_16, sf);
424
425 // Map the top left corner of the block into the reference frame.
426 x0 = sf->scale_value_x(x_start + x, sf);
427 y0 = sf->scale_value_y(y_start + y, sf);
428
429 // Scale the MV and incorporate the sub-pixel offset of the block
430 // in the reference frame.
431 scaled_mv = vp9_scale_mv(&mv_q4, mi_x + x, mi_y + y, sf);
432 xs = sf->x_step_q4;
433 ys = sf->y_step_q4;
434 } else {
435 // Co-ordinate of containing block to pixel precision.
436 x0 = (-xd->mb_to_left_edge >> (3 + pd->subsampling_x)) + x;
437 y0 = (-xd->mb_to_top_edge >> (3 + pd->subsampling_y)) + y;
438
439 // Co-ordinate of the block to 1/16th pixel precision.
440 x0_16 = x0 << SUBPEL_BITS;
441 y0_16 = y0 << SUBPEL_BITS;
442
443 scaled_mv.row = mv_q4.row;
444 scaled_mv.col = mv_q4.col;
445 xs = ys = 16;
446 }
447 subpel_x = scaled_mv.col & SUBPEL_MASK;
448 subpel_y = scaled_mv.row & SUBPEL_MASK;
449
450 // Calculate the top left corner of the best matching block in the
451 // reference frame.
452 x0 += scaled_mv.col >> SUBPEL_BITS;
453 y0 += scaled_mv.row >> SUBPEL_BITS;
454 x0_16 += scaled_mv.col;
455 y0_16 += scaled_mv.row;
456
457 // Get reference block pointer.
458 buf_ptr = ref_frame + y0 * pre_buf->stride + x0;
459 buf_stride = pre_buf->stride;
460
461 // Do border extension if there is motion or the
462 // width/height is not a multiple of 8 pixels.
463 if (is_scaled || scaled_mv.col || scaled_mv.row ||
464 (frame_width & 0x7) || (frame_height & 0x7)) {
465 // Get reference block bottom right coordinate.
466 int x1 = ((x0_16 + (w - 1) * xs) >> SUBPEL_BITS) + 1;
467 int y1 = ((y0_16 + (h - 1) * ys) >> SUBPEL_BITS) + 1;
468 int x_pad = 0, y_pad = 0;
469
470 if (subpel_x || (sf->x_step_q4 != SUBPEL_SHIFTS)) {
471 x0 -= VP9_INTERP_EXTEND - 1;
472 x1 += VP9_INTERP_EXTEND;
473 x_pad = 1;
474 }
475
476 if (subpel_y || (sf->y_step_q4 != SUBPEL_SHIFTS)) {
477 y0 -= VP9_INTERP_EXTEND - 1;
478 y1 += VP9_INTERP_EXTEND;
479 y_pad = 1;
480 }
481
482 // Skip border extension if block is inside the frame.
483 if (x0 < 0 || x0 > frame_width - 1 || x1 < 0 || x1 > frame_width - 1 ||
484 y0 < 0 || y0 > frame_height - 1 || y1 < 0 || y1 > frame_height - 1) {
485 uint8_t *buf_ptr1 = ref_frame + y0 * pre_buf->stride + x0;
486 // Extend the border.
487 #if CONFIG_VP9_HIGHBITDEPTH
488 if (xd->cur_buf->flags & YV12_FLAG_HIGHBITDEPTH) {
489 high_build_mc_border(buf_ptr1,
490 pre_buf->stride,
491 xd->mc_buf_high,
492 x1 - x0 + 1,
493 x0,
494 y0,
495 x1 - x0 + 1,
496 y1 - y0 + 1,
497 frame_width,
498 frame_height);
499 buf_stride = x1 - x0 + 1;
500 buf_ptr = CONVERT_TO_BYTEPTR(xd->mc_buf_high) +
501 y_pad * 3 * buf_stride + x_pad * 3;
502 } else {
503 build_mc_border(buf_ptr1,
504 pre_buf->stride,
505 xd->mc_buf,
506 x1 - x0 + 1,
507 x0,
508 y0,
509 x1 - x0 + 1,
510 y1 - y0 + 1,
511 frame_width,
512 frame_height);
513 buf_stride = x1 - x0 + 1;
514 buf_ptr = xd->mc_buf + y_pad * 3 * buf_stride + x_pad * 3;
515 }
516 #else
517 build_mc_border(buf_ptr1,
518 pre_buf->stride,
519 xd->mc_buf,
520 x1 - x0 + 1,
521 x0,
522 y0,
523 x1 - x0 + 1,
524 y1 - y0 + 1,
525 frame_width,
526 frame_height);
527 buf_stride = x1 - x0 + 1;
528 buf_ptr = xd->mc_buf + y_pad * 3 * buf_stride + x_pad * 3;
529 #endif // CONFIG_VP9_HIGHBITDEPTH
530 }
531 }
532
533 #if CONFIG_VP9_HIGHBITDEPTH
534 if (xd->cur_buf->flags & YV12_FLAG_HIGHBITDEPTH) {
535 high_inter_predictor(buf_ptr, buf_stride, dst, dst_buf->stride, subpel_x,
536 subpel_y, sf, w, h, ref, kernel, xs, ys, xd->bd);
537 } else {
538 inter_predictor(buf_ptr, buf_stride, dst, dst_buf->stride, subpel_x,
539 subpel_y, sf, w, h, ref, kernel, xs, ys);
540 }
541 #else
542 inter_predictor(buf_ptr, buf_stride, dst, dst_buf->stride, subpel_x,
543 subpel_y, sf, w, h, ref, kernel, xs, ys);
544 #endif // CONFIG_VP9_HIGHBITDEPTH
545 }
546 }
547
548 void vp9_dec_build_inter_predictors_sb(MACROBLOCKD *xd, int mi_row, int mi_col,
549 BLOCK_SIZE bsize) {
550 int plane;
551 const int mi_x = mi_col * MI_SIZE;
552 const int mi_y = mi_row * MI_SIZE;
553 for (plane = 0; plane < MAX_MB_PLANE; ++plane) {
554 const BLOCK_SIZE plane_bsize = get_plane_block_size(bsize,
555 &xd->plane[plane]);
556 const int num_4x4_w = num_4x4_blocks_wide_lookup[plane_bsize];
557 const int num_4x4_h = num_4x4_blocks_high_lookup[plane_bsize];
558 const int bw = 4 * num_4x4_w;
559 const int bh = 4 * num_4x4_h;
560
561 if (xd->mi[0].src_mi->mbmi.sb_type < BLOCK_8X8) {
562 int i = 0, x, y;
563 assert(bsize == BLOCK_8X8);
564 for (y = 0; y < num_4x4_h; ++y)
565 for (x = 0; x < num_4x4_w; ++x)
566 dec_build_inter_predictors(xd, plane, i++, bw, bh,
567 4 * x, 4 * y, 4, 4, mi_x, mi_y);
568 } else {
569 dec_build_inter_predictors(xd, plane, 0, bw, bh,
570 0, 0, bw, bh, mi_x, mi_y);
571 }
572 }
573 }
574
575 void vp9_setup_dst_planes(struct macroblockd_plane planes[MAX_MB_PLANE], 278 void vp9_setup_dst_planes(struct macroblockd_plane planes[MAX_MB_PLANE],
576 const YV12_BUFFER_CONFIG *src, 279 const YV12_BUFFER_CONFIG *src,
577 int mi_row, int mi_col) { 280 int mi_row, int mi_col) {
578 uint8_t *const buffers[4] = {src->y_buffer, src->u_buffer, src->v_buffer, 281 uint8_t *const buffers[4] = {src->y_buffer, src->u_buffer, src->v_buffer,
579 src->alpha_buffer}; 282 src->alpha_buffer};
580 const int strides[4] = {src->y_stride, src->uv_stride, src->uv_stride, 283 const int strides[4] = {src->y_stride, src->uv_stride, src->uv_stride,
581 src->alpha_stride}; 284 src->alpha_stride};
582 int i; 285 int i;
583 286
584 for (i = 0; i < MAX_MB_PLANE; ++i) { 287 for (i = 0; i < MAX_MB_PLANE; ++i) {
(...skipping 14 matching lines...) Expand all
599 const int strides[4] = {src->y_stride, src->uv_stride, src->uv_stride, 302 const int strides[4] = {src->y_stride, src->uv_stride, src->uv_stride,
600 src->alpha_stride}; 303 src->alpha_stride};
601 304
602 for (i = 0; i < MAX_MB_PLANE; ++i) { 305 for (i = 0; i < MAX_MB_PLANE; ++i) {
603 struct macroblockd_plane *const pd = &xd->plane[i]; 306 struct macroblockd_plane *const pd = &xd->plane[i];
604 setup_pred_plane(&pd->pre[idx], buffers[i], strides[i], mi_row, mi_col, 307 setup_pred_plane(&pd->pre[idx], buffers[i], strides[i], mi_row, mi_col,
605 sf, pd->subsampling_x, pd->subsampling_y); 308 sf, pd->subsampling_x, pd->subsampling_y);
606 } 309 }
607 } 310 }
608 } 311 }
OLDNEW
« no previous file with comments | « source/libvpx/vp9/common/vp9_reconinter.h ('k') | source/libvpx/vp9/common/vp9_reconintra.c » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698