| 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 <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 Loading... |
| 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 Loading... |
| 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 Loading... |
| 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 Loading... |
| 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 } |
| OLD | NEW |