diff options
Diffstat (limited to 'vp9/encoder/vp9_pickmode.c')
-rw-r--r-- | vp9/encoder/vp9_pickmode.c | 68 |
1 files changed, 40 insertions, 28 deletions
diff --git a/vp9/encoder/vp9_pickmode.c b/vp9/encoder/vp9_pickmode.c index b45032456..319a47833 100644 --- a/vp9/encoder/vp9_pickmode.c +++ b/vp9/encoder/vp9_pickmode.c @@ -249,14 +249,14 @@ static void model_rd_for_sb_y(VP9_COMP *cpi, BLOCK_SIZE bsize, #if CONFIG_VP9_HIGHBITDEPTH if (xd->cur_buf->flags & YV12_FLAG_HIGHBITDEPTH) { - vp9_model_rd_from_var_lapndz(sse - var, 1 << num_pels_log2_lookup[bsize], + vp9_model_rd_from_var_lapndz(sse - var, num_pels_log2_lookup[bsize], dc_quant >> (xd->bd - 5), &rate, &dist); } else { - vp9_model_rd_from_var_lapndz(sse - var, 1 << num_pels_log2_lookup[bsize], + vp9_model_rd_from_var_lapndz(sse - var, num_pels_log2_lookup[bsize], dc_quant >> 3, &rate, &dist); } #else - vp9_model_rd_from_var_lapndz(sse - var, 1 << num_pels_log2_lookup[bsize], + vp9_model_rd_from_var_lapndz(sse - var, num_pels_log2_lookup[bsize], dc_quant >> 3, &rate, &dist); #endif // CONFIG_VP9_HIGHBITDEPTH @@ -265,14 +265,14 @@ static void model_rd_for_sb_y(VP9_COMP *cpi, BLOCK_SIZE bsize, #if CONFIG_VP9_HIGHBITDEPTH if (xd->cur_buf->flags & YV12_FLAG_HIGHBITDEPTH) { - vp9_model_rd_from_var_lapndz(var, 1 << num_pels_log2_lookup[bsize], + vp9_model_rd_from_var_lapndz(var, num_pels_log2_lookup[bsize], ac_quant >> (xd->bd - 5), &rate, &dist); } else { - vp9_model_rd_from_var_lapndz(var, 1 << num_pels_log2_lookup[bsize], + vp9_model_rd_from_var_lapndz(var, num_pels_log2_lookup[bsize], ac_quant >> 3, &rate, &dist); } #else - vp9_model_rd_from_var_lapndz(var, 1 << num_pels_log2_lookup[bsize], + vp9_model_rd_from_var_lapndz(var, num_pels_log2_lookup[bsize], ac_quant >> 3, &rate, &dist); #endif // CONFIG_VP9_HIGHBITDEPTH @@ -447,11 +447,10 @@ static void estimate_block_intra(int plane, int block, BLOCK_SIZE plane_bsize, args->dist += dist; } -static const THR_MODES mode_idx[MAX_REF_FRAMES][4] = { +static const THR_MODES mode_idx[MAX_REF_FRAMES - 1][4] = { {THR_DC, THR_H_PRED, THR_V_PRED, THR_TM}, {THR_NEARESTMV, THR_NEARMV, THR_ZEROMV, THR_NEWMV}, {THR_NEARESTG, THR_NEARG, THR_ZEROG, THR_NEWG}, - {THR_NEARESTA, THR_NEARA, THR_ZEROA, THR_NEWA}, }; static const PREDICTION_MODE intra_mode_list[] = { @@ -522,8 +521,7 @@ void vp9_pick_inter_mode(VP9_COMP *cpi, MACROBLOCK *x, struct macroblockd_plane *const pd = &xd->plane[0]; PREDICTION_MODE best_mode = ZEROMV; MV_REFERENCE_FRAME ref_frame, best_ref_frame = LAST_FRAME; - TX_SIZE best_tx_size = MIN(max_txsize_lookup[bsize], - tx_mode_to_biggest_tx_size[cm->tx_mode]); + TX_SIZE best_tx_size = TX_SIZES; INTERP_FILTER best_pred_filter = EIGHTTAP; int_mv frame_mv[MB_MODE_COUNT][MAX_REF_FRAMES]; struct buf_2d yv12_mb[4][MAX_MB_PLANE]; @@ -537,9 +535,9 @@ void vp9_pick_inter_mode(VP9_COMP *cpi, MACROBLOCK *x, // Reduce the intra cost penalty for small blocks (<=16x16). const int reduction_fac = (cpi->sf.partition_search_type == VAR_BASED_PARTITION && - bsize <= BLOCK_16X16) ? 4 : 1; + bsize <= BLOCK_16X16) ? 2 : 0; const int intra_cost_penalty = vp9_get_intra_cost_penalty( - cm->base_qindex, cm->y_dc_delta_q, cm->bit_depth) / reduction_fac; + cm->base_qindex, cm->y_dc_delta_q, cm->bit_depth) >> reduction_fac; const int64_t inter_mode_thresh = RDCOST(x->rdmult, x->rddiv, intra_cost_penalty, 0); const int8_t segment_id = mbmi->segment_id; @@ -839,13 +837,15 @@ void vp9_pick_inter_mode(VP9_COMP *cpi, MACROBLOCK *x, // Perform intra prediction search, if the best SAD is above a certain // threshold. - if (!x->skip && best_rdc.rdcost > inter_mode_thresh && - bsize <= cpi->sf.max_intra_bsize) { + if (best_rdc.rdcost == INT64_MAX || + (!x->skip && best_rdc.rdcost > inter_mode_thresh && + bsize <= cpi->sf.max_intra_bsize)) { struct estimate_block_intra_args args = { cpi, x, DC_PRED, 0, 0 }; const TX_SIZE intra_tx_size = MIN(max_txsize_lookup[bsize], tx_mode_to_biggest_tx_size[cpi->common.tx_mode]); int i; + TX_SIZE best_intra_tx_size = TX_SIZES; if (reuse_inter_pred && best_pred != NULL) { if (best_pred->data == orig_dst.buf) { @@ -870,11 +870,9 @@ void vp9_pick_inter_mode(VP9_COMP *cpi, MACROBLOCK *x, pd->dst = orig_dst; for (i = 0; i < 4; ++i) { - const TX_SIZE saved_tx_size = mbmi->tx_size; const PREDICTION_MODE this_mode = intra_mode_list[i]; if (!((1 << this_mode) & cpi->sf.intra_y_mode_mask[intra_tx_size])) continue; - skip_txfm = x->skip_txfm[0]; args.mode = this_mode; args.rate = 0; args.dist = 0; @@ -891,15 +889,20 @@ void vp9_pick_inter_mode(VP9_COMP *cpi, MACROBLOCK *x, if (this_rdc.rdcost < best_rdc.rdcost) { best_rdc = this_rdc; mbmi->mode = this_mode; - mbmi->tx_size = intra_tx_size; + best_intra_tx_size = mbmi->tx_size; mbmi->ref_frame[0] = INTRA_FRAME; mbmi->uv_mode = this_mode; mbmi->mv[0].as_int = INVALID_MV; - } else { - x->skip_txfm[0] = best_mode_skip_txfm; - mbmi->tx_size = saved_tx_size; } } + + // Reset mb_mode_info to the best inter mode. + if (mbmi->ref_frame[0] != INTRA_FRAME) { + x->skip_txfm[0] = best_mode_skip_txfm; + mbmi->tx_size = best_tx_size; + } else { + mbmi->tx_size = best_intra_tx_size; + } } pd->dst = orig_dst; @@ -923,14 +926,23 @@ void vp9_pick_inter_mode(VP9_COMP *cpi, MACROBLOCK *x, } } - if (is_inter_block(mbmi)) - vp9_update_rd_thresh_fact(tile_data->thresh_freq_fact, - cpi->sf.adaptive_rd_thresh, bsize, - mode_idx[best_ref_frame][INTER_OFFSET(mbmi->mode)]); - else - vp9_update_rd_thresh_fact(tile_data->thresh_freq_fact, - cpi->sf.adaptive_rd_thresh, bsize, - mode_idx[INTRA_FRAME][mbmi->mode]); + if (cpi->sf.adaptive_rd_thresh) { + THR_MODES best_mode_idx = is_inter_block(mbmi) ? + mode_idx[best_ref_frame][INTER_OFFSET(mbmi->mode)] : + mode_idx[INTRA_FRAME][mbmi->mode]; + PREDICTION_MODE this_mode; + for (ref_frame = LAST_FRAME; ref_frame <= GOLDEN_FRAME; ++ref_frame) { + for (this_mode = NEARESTMV; this_mode <= NEWMV; ++this_mode) { + THR_MODES thr_mode_idx = mode_idx[ref_frame][INTER_OFFSET(this_mode)]; + int *freq_fact = &tile_data->thresh_freq_fact[bsize][thr_mode_idx]; + if (thr_mode_idx == best_mode_idx) + *freq_fact -= (*freq_fact >> 4); + else + *freq_fact = MIN(*freq_fact + RD_THRESH_INC, + cpi->sf.adaptive_rd_thresh * RD_THRESH_MAX_FACT); + } + } + } *rd_cost = best_rdc; } |