| Index: source/libvpx/vp9/encoder/vp9_rd.c
|
| diff --git a/source/libvpx/vp9/encoder/vp9_rd.c b/source/libvpx/vp9/encoder/vp9_rd.c
|
| index ae5a01226f73b65d41e361df7ef3b826cce2be28..194001c51a260ca9bc35e6037377561bc1ffc87f 100644
|
| --- a/source/libvpx/vp9/encoder/vp9_rd.c
|
| +++ b/source/libvpx/vp9/encoder/vp9_rd.c
|
| @@ -419,8 +419,8 @@ void vp9_get_entropy_contexts(BLOCK_SIZE bsize, TX_SIZE tx_size,
|
| int i;
|
| switch (tx_size) {
|
| case TX_4X4:
|
| - vpx_memcpy(t_above, above, sizeof(ENTROPY_CONTEXT) * num_4x4_w);
|
| - vpx_memcpy(t_left, left, sizeof(ENTROPY_CONTEXT) * num_4x4_h);
|
| + memcpy(t_above, above, sizeof(ENTROPY_CONTEXT) * num_4x4_w);
|
| + memcpy(t_left, left, sizeof(ENTROPY_CONTEXT) * num_4x4_h);
|
| break;
|
| case TX_8X8:
|
| for (i = 0; i < num_4x4_w; i += 2)
|
| @@ -450,13 +450,14 @@ void vp9_mv_pred(VP9_COMP *cpi, MACROBLOCK *x,
|
| uint8_t *ref_y_buffer, int ref_y_stride,
|
| int ref_frame, BLOCK_SIZE block_size) {
|
| MACROBLOCKD *xd = &x->e_mbd;
|
| - MB_MODE_INFO *mbmi = &xd->mi[0].src_mi->mbmi;
|
| + MB_MODE_INFO *mbmi = &xd->mi[0]->mbmi;
|
| int i;
|
| int zero_seen = 0;
|
| int best_index = 0;
|
| int best_sad = INT_MAX;
|
| int this_sad = INT_MAX;
|
| int max_mv = 0;
|
| + int near_same_nearest;
|
| uint8_t *src_y_ptr = x->plane[0].src.buf;
|
| uint8_t *ref_y_ptr;
|
| const int num_mv_refs = MAX_MV_REF_CANDIDATES +
|
| @@ -469,23 +470,27 @@ void vp9_mv_pred(VP9_COMP *cpi, MACROBLOCK *x,
|
| pred_mv[2] = x->pred_mv[ref_frame];
|
| assert(num_mv_refs <= (int)(sizeof(pred_mv) / sizeof(pred_mv[0])));
|
|
|
| + near_same_nearest =
|
| + mbmi->ref_mvs[ref_frame][0].as_int == mbmi->ref_mvs[ref_frame][1].as_int;
|
| // Get the sad for each candidate reference mv.
|
| for (i = 0; i < num_mv_refs; ++i) {
|
| const MV *this_mv = &pred_mv[i];
|
| + int fp_row, fp_col;
|
|
|
| - max_mv = MAX(max_mv, MAX(abs(this_mv->row), abs(this_mv->col)) >> 3);
|
| - if (is_zero_mv(this_mv) && zero_seen)
|
| + if (i == 1 && near_same_nearest)
|
| continue;
|
| + fp_row = (this_mv->row + 3 + (this_mv->row >= 0)) >> 3;
|
| + fp_col = (this_mv->col + 3 + (this_mv->col >= 0)) >> 3;
|
| + max_mv = MAX(max_mv, MAX(abs(this_mv->row), abs(this_mv->col)) >> 3);
|
|
|
| - zero_seen |= is_zero_mv(this_mv);
|
| -
|
| - ref_y_ptr =
|
| - &ref_y_buffer[ref_y_stride * (this_mv->row >> 3) + (this_mv->col >> 3)];
|
| + if (fp_row ==0 && fp_col == 0 && zero_seen)
|
| + continue;
|
| + zero_seen |= (fp_row ==0 && fp_col == 0);
|
|
|
| + ref_y_ptr =&ref_y_buffer[ref_y_stride * fp_row + fp_col];
|
| // Find sad for current vector.
|
| this_sad = cpi->fn_ptr[block_size].sdf(src_y_ptr, x->plane[0].src.stride,
|
| ref_y_ptr, ref_y_stride);
|
| -
|
| // Note if it is the best so far.
|
| if (this_sad < best_sad) {
|
| best_sad = this_sad;
|
| @@ -545,7 +550,7 @@ YV12_BUFFER_CONFIG *vp9_get_scaled_ref_frame(const VP9_COMP *cpi,
|
| }
|
|
|
| int vp9_get_switchable_rate(const VP9_COMP *cpi, const MACROBLOCKD *const xd) {
|
| - const MB_MODE_INFO *const mbmi = &xd->mi[0].src_mi->mbmi;
|
| + const MB_MODE_INFO *const mbmi = &xd->mi[0]->mbmi;
|
| const int ctx = vp9_get_pred_context_switchable_interp(xd);
|
| return SWITCHABLE_INTERP_RATE_FACTOR *
|
| cpi->switchable_interp_costs[ctx][mbmi->interp_filter];
|
| @@ -611,8 +616,7 @@ void vp9_set_rd_speed_thresholds_sub8x8(VP9_COMP *cpi) {
|
| {2000, 2000, 2000, 4000, 4000, 2000}};
|
| RD_OPT *const rd = &cpi->rd;
|
| const int idx = cpi->oxcf.mode == BEST;
|
| - vpx_memcpy(rd->thresh_mult_sub8x8, thresh_mult[idx],
|
| - sizeof(thresh_mult[idx]));
|
| + memcpy(rd->thresh_mult_sub8x8, thresh_mult[idx], sizeof(thresh_mult[idx]));
|
| }
|
|
|
| void vp9_update_rd_thresh_fact(int (*factor_buf)[MAX_MODES], int rd_thresh,
|
|
|