Index: source/libvpx/vp9/encoder/vp9_pickmode.c |
=================================================================== |
--- source/libvpx/vp9/encoder/vp9_pickmode.c (revision 251189) |
+++ source/libvpx/vp9/encoder/vp9_pickmode.c (working copy) |
@@ -80,7 +80,7 @@ |
step_param = 6; |
further_steps = (cpi->sf.max_step_search_steps - 1) - step_param; |
- for (i = LAST_FRAME; i <= ALTREF_FRAME && cpi->common.show_frame; ++i) { |
+ for (i = LAST_FRAME; i <= LAST_FRAME && cpi->common.show_frame; ++i) { |
if ((x->pred_mv_sad[ref] >> 3) > x->pred_mv_sad[i]) { |
tmp_mv->as_int = INVALID_MV; |
@@ -98,11 +98,8 @@ |
mvp_full.col >>= 3; |
mvp_full.row >>= 3; |
- bestsme = vp9_full_pixel_diamond(cpi, x, &mvp_full, step_param, |
- sadpb, further_steps, 1, |
- &cpi->fn_ptr[bsize], |
- &ref_mv.as_mv, tmp_mv); |
- |
+ vp9_full_pixel_diamond(cpi, x, &mvp_full, step_param, sadpb, further_steps, 1, |
+ &cpi->fn_ptr[bsize], &ref_mv.as_mv, &tmp_mv->as_mv); |
x->mv_col_min = tmp_col_min; |
x->mv_col_max = tmp_col_max; |
x->mv_row_min = tmp_row_min; |
@@ -124,8 +121,8 @@ |
stride, 0x7fffffff); |
// scale to 1/8 pixel resolution |
- tmp_mv->as_mv.row = tmp_mv->as_mv.row << 3; |
- tmp_mv->as_mv.col = tmp_mv->as_mv.col << 3; |
+ tmp_mv->as_mv.row = tmp_mv->as_mv.row * 8; |
+ tmp_mv->as_mv.col = tmp_mv->as_mv.col * 8; |
// calculate the bit cost on motion vector |
*rate_mv = vp9_mv_bit_cost(&tmp_mv->as_mv, &ref_mv.as_mv, |
@@ -142,8 +139,7 @@ |
int mi_row, int mi_col, |
int *returnrate, |
int64_t *returndistortion, |
- BLOCK_SIZE bsize, |
- PICK_MODE_CONTEXT *ctx) { |
+ BLOCK_SIZE bsize) { |
MACROBLOCKD *xd = &x->e_mbd; |
MB_MODE_INFO *mbmi = &xd->mi_8x8[0]->mbmi; |
const BLOCK_SIZE block_size = get_plane_block_size(bsize, &xd->plane[0]); |
@@ -155,6 +151,7 @@ |
VP9_ALT_FLAG }; |
int64_t best_rd = INT64_MAX; |
int64_t this_rd; |
+ int64_t cost[4]= { 0, 100, 150, 205 }; |
x->skip_encode = cpi->sf.skip_encode_frame && x->q_index < QIDX_SKIP_THRESH; |
@@ -170,8 +167,12 @@ |
mbmi->ref_frame[1] = NONE; |
mbmi->tx_size = MIN(max_txsize_lookup[bsize], |
tx_mode_to_biggest_tx_size[cpi->common.tx_mode]); |
+ mbmi->interp_filter = cpi->common.interp_filter == SWITCHABLE ? |
+ EIGHTTAP : cpi->common.interp_filter; |
+ mbmi->skip = 0; |
+ mbmi->segment_id = 0; |
- for (ref_frame = LAST_FRAME; ref_frame <= ALTREF_FRAME; ++ref_frame) { |
+ for (ref_frame = LAST_FRAME; ref_frame <= LAST_FRAME ; ++ref_frame) { |
x->pred_mv_sad[ref_frame] = INT_MAX; |
if (cpi->ref_frame_flags & flag_list[ref_frame]) { |
vp9_setup_buffer_inter(cpi, x, tile, |
@@ -182,7 +183,7 @@ |
frame_mv[ZEROMV][ref_frame].as_int = 0; |
} |
- for (ref_frame = LAST_FRAME; ref_frame <= ALTREF_FRAME; ++ref_frame) { |
+ for (ref_frame = LAST_FRAME; ref_frame <= LAST_FRAME ; ++ref_frame) { |
int rate_mv = 0; |
if (!(cpi->ref_frame_flags & flag_list[ref_frame])) |
@@ -191,29 +192,35 @@ |
// Select prediction reference frames. |
xd->plane[0].pre[0] = yv12_mb[ref_frame][0]; |
- |
- x->mode_sad[ref_frame][INTER_OFFSET(NEWMV)] = |
- full_pixel_motion_search(cpi, x, tile, bsize, mi_row, mi_col, |
- &frame_mv[NEWMV][ref_frame], &rate_mv); |
- |
- if (frame_mv[NEWMV][ref_frame].as_int == INVALID_MV) |
- continue; |
- |
clamp_mv2(&frame_mv[NEARESTMV][ref_frame].as_mv, xd); |
clamp_mv2(&frame_mv[NEARMV][ref_frame].as_mv, xd); |
for (this_mode = NEARESTMV; this_mode <= NEWMV; ++this_mode) { |
- int rate = x->inter_mode_cost[mbmi->mode_context[ref_frame]] |
- [INTER_OFFSET(this_mode)]; |
- int64_t dist = x->mode_sad[ref_frame][INTER_OFFSET(this_mode)] * |
- x->mode_sad[ref_frame][INTER_OFFSET(this_mode)]; |
- this_rd = RDCOST(x->rdmult, x->rddiv, rate, dist); |
+ int rate = cost[INTER_OFFSET(this_mode)]; |
+ int64_t dist; |
+ if (this_mode == NEWMV) { |
+ if (this_rd < 300) |
+ continue; |
+ |
+ x->mode_sad[ref_frame][INTER_OFFSET(NEWMV)] = |
+ full_pixel_motion_search(cpi, x, tile, bsize, mi_row, mi_col, |
+ &frame_mv[NEWMV][ref_frame], &rate_mv); |
+ |
+ if (frame_mv[NEWMV][ref_frame].as_int == INVALID_MV) |
+ continue; |
+ } |
+ |
+ dist = x->mode_sad[ref_frame][INTER_OFFSET(this_mode)]; |
+ this_rd = rate + dist; |
+ |
if (this_rd < best_rd) { |
best_rd = this_rd; |
mbmi->mode = this_mode; |
mbmi->ref_frame[0] = ref_frame; |
mbmi->mv[0].as_int = frame_mv[this_mode][ref_frame].as_int; |
+ xd->mi_8x8[0]->bmi[0].as_mv[0].as_int = mbmi->mv[0].as_int; |
+ mbmi->uv_mode = this_mode; |
} |
} |
} |
@@ -223,8 +230,5 @@ |
// TODO(jingning) intra prediction search, if the best SAD is above a certain |
// threshold. |
- // store mode decisions |
- ctx->mic = *xd->mi_8x8[0]; |
- |
return INT64_MAX; |
} |