| Index: source/libvpx/vp9/encoder/vp9_pickmode.c
|
| diff --git a/source/libvpx/vp9/encoder/vp9_pickmode.c b/source/libvpx/vp9/encoder/vp9_pickmode.c
|
| index 6831be8d55cab98e4708e8321207b8308258322f..a065f5944581d606d82aefedafec367dcaae64df 100644
|
| --- a/source/libvpx/vp9/encoder/vp9_pickmode.c
|
| +++ b/source/libvpx/vp9/encoder/vp9_pickmode.c
|
| @@ -293,8 +293,8 @@ static void model_rd_for_sb_y_large(VP9_COMP *cpi, BLOCK_SIZE bsize,
|
|
|
| if (cpi->common.tx_mode == TX_MODE_SELECT) {
|
| if (sse > (var << 2))
|
| - tx_size = MIN(max_txsize_lookup[bsize],
|
| - tx_mode_to_biggest_tx_size[cpi->common.tx_mode]);
|
| + tx_size = VPXMIN(max_txsize_lookup[bsize],
|
| + tx_mode_to_biggest_tx_size[cpi->common.tx_mode]);
|
| else
|
| tx_size = TX_8X8;
|
|
|
| @@ -304,8 +304,8 @@ static void model_rd_for_sb_y_large(VP9_COMP *cpi, BLOCK_SIZE bsize,
|
| else if (tx_size > TX_16X16)
|
| tx_size = TX_16X16;
|
| } else {
|
| - tx_size = MIN(max_txsize_lookup[bsize],
|
| - tx_mode_to_biggest_tx_size[cpi->common.tx_mode]);
|
| + tx_size = VPXMIN(max_txsize_lookup[bsize],
|
| + tx_mode_to_biggest_tx_size[cpi->common.tx_mode]);
|
| }
|
|
|
| assert(tx_size >= TX_8X8);
|
| @@ -475,8 +475,8 @@ static void model_rd_for_sb_y(VP9_COMP *cpi, BLOCK_SIZE bsize,
|
| if (cpi->common.tx_mode == TX_MODE_SELECT) {
|
| if (sse > (var << 2))
|
| xd->mi[0]->mbmi.tx_size =
|
| - MIN(max_txsize_lookup[bsize],
|
| - tx_mode_to_biggest_tx_size[cpi->common.tx_mode]);
|
| + VPXMIN(max_txsize_lookup[bsize],
|
| + tx_mode_to_biggest_tx_size[cpi->common.tx_mode]);
|
| else
|
| xd->mi[0]->mbmi.tx_size = TX_8X8;
|
|
|
| @@ -487,8 +487,8 @@ static void model_rd_for_sb_y(VP9_COMP *cpi, BLOCK_SIZE bsize,
|
| xd->mi[0]->mbmi.tx_size = TX_16X16;
|
| } else {
|
| xd->mi[0]->mbmi.tx_size =
|
| - MIN(max_txsize_lookup[bsize],
|
| - tx_mode_to_biggest_tx_size[cpi->common.tx_mode]);
|
| + VPXMIN(max_txsize_lookup[bsize],
|
| + tx_mode_to_biggest_tx_size[cpi->common.tx_mode]);
|
| }
|
|
|
| // Evaluate if the partition block is a skippable block in Y plane.
|
| @@ -791,7 +791,7 @@ static void encode_breakout_test(VP9_COMP *cpi, MACROBLOCK *x,
|
| const unsigned int max_thresh = 36000;
|
| // The encode_breakout input
|
| const unsigned int min_thresh =
|
| - MIN(((unsigned int)x->encode_breakout << 4), max_thresh);
|
| + VPXMIN(((unsigned int)x->encode_breakout << 4), max_thresh);
|
| #if CONFIG_VP9_HIGHBITDEPTH
|
| const int shift = (xd->bd << 1) - 16;
|
| #endif
|
| @@ -911,7 +911,7 @@ static void estimate_block_intra(int plane, int block, BLOCK_SIZE plane_bsize,
|
|
|
| // TODO(jingning): This needs further refactoring.
|
| block_yrd(cpi, x, &rate, &dist, &is_skippable, &this_sse, 0,
|
| - bsize_tx, MIN(tx_size, TX_16X16));
|
| + bsize_tx, VPXMIN(tx_size, TX_16X16));
|
| x->skip_txfm[0] = is_skippable;
|
| rate += vp9_cost_bit(vp9_get_skip_prob(&cpi->common, xd), is_skippable);
|
|
|
| @@ -961,8 +961,8 @@ static INLINE void update_thresh_freq_fact(VP9_COMP *cpi,
|
| 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);
|
| + *freq_fact = VPXMIN(*freq_fact + RD_THRESH_INC,
|
| + cpi->sf.adaptive_rd_thresh * RD_THRESH_MAX_FACT);
|
| }
|
|
|
| void vp9_pick_intra_mode(VP9_COMP *cpi, MACROBLOCK *x, RD_COST *rd_cost,
|
| @@ -973,8 +973,8 @@ void vp9_pick_intra_mode(VP9_COMP *cpi, MACROBLOCK *x, RD_COST *rd_cost,
|
| PREDICTION_MODE this_mode;
|
| 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]);
|
| + VPXMIN(max_txsize_lookup[bsize],
|
| + tx_mode_to_biggest_tx_size[cpi->common.tx_mode]);
|
| MODE_INFO *const mic = xd->mi[0];
|
| int *bmode_costs;
|
| const MODE_INFO *above_mi = xd->mi[-xd->mi_stride];
|
| @@ -1050,6 +1050,16 @@ static const REF_MODE ref_mode_set[RT_INTER_MODES] = {
|
| {GOLDEN_FRAME, NEARMV},
|
| {GOLDEN_FRAME, NEWMV}
|
| };
|
| +static const REF_MODE ref_mode_set_svc[RT_INTER_MODES] = {
|
| + {LAST_FRAME, ZEROMV},
|
| + {GOLDEN_FRAME, ZEROMV},
|
| + {LAST_FRAME, NEARESTMV},
|
| + {LAST_FRAME, NEARMV},
|
| + {GOLDEN_FRAME, NEARESTMV},
|
| + {GOLDEN_FRAME, NEARMV},
|
| + {LAST_FRAME, NEWMV},
|
| + {GOLDEN_FRAME, NEWMV}
|
| +};
|
|
|
| // TODO(jingning) placeholder for inter-frame non-RD mode decision.
|
| // this needs various further optimizations. to be continued..
|
| @@ -1150,19 +1160,18 @@ void vp9_pick_inter_mode(VP9_COMP *cpi, MACROBLOCK *x,
|
| mbmi->sb_type = bsize;
|
| mbmi->ref_frame[0] = NONE;
|
| mbmi->ref_frame[1] = NONE;
|
| - mbmi->tx_size = MIN(max_txsize_lookup[bsize],
|
| - tx_mode_to_biggest_tx_size[cm->tx_mode]);
|
| + mbmi->tx_size = VPXMIN(max_txsize_lookup[bsize],
|
| + tx_mode_to_biggest_tx_size[cm->tx_mode]);
|
|
|
| #if CONFIG_VP9_TEMPORAL_DENOISING
|
| vp9_denoiser_reset_frame_stats(ctx);
|
| #endif
|
|
|
| - if (cpi->rc.frames_since_golden == 0) {
|
| + if (cpi->rc.frames_since_golden == 0 && !cpi->use_svc) {
|
| usable_ref_frame = LAST_FRAME;
|
| } else {
|
| usable_ref_frame = GOLDEN_FRAME;
|
| }
|
| -
|
| for (ref_frame = LAST_FRAME; ref_frame <= usable_ref_frame; ++ref_frame) {
|
| const YV12_BUFFER_CONFIG *yv12 = get_ref_frame_buffer(cpi, ref_frame);
|
|
|
| @@ -1204,15 +1213,19 @@ void vp9_pick_inter_mode(VP9_COMP *cpi, MACROBLOCK *x,
|
| int mode_rd_thresh;
|
| int mode_index;
|
| int i;
|
| - PREDICTION_MODE this_mode = ref_mode_set[idx].pred_mode;
|
| int64_t this_sse;
|
| int is_skippable;
|
| int this_early_term = 0;
|
| + PREDICTION_MODE this_mode = ref_mode_set[idx].pred_mode;
|
| + if (cpi->use_svc)
|
| + this_mode = ref_mode_set_svc[idx].pred_mode;
|
|
|
| if (!(cpi->sf.inter_mode_mask[bsize] & (1 << this_mode)))
|
| continue;
|
|
|
| ref_frame = ref_mode_set[idx].ref_frame;
|
| + if (cpi->use_svc)
|
| + ref_frame = ref_mode_set_svc[idx].ref_frame;
|
| if (!(cpi->ref_frame_flags & flag_list[ref_frame]))
|
| continue;
|
| if (const_motion[ref_frame] && this_mode == NEARMV)
|
| @@ -1240,7 +1253,7 @@ void vp9_pick_inter_mode(VP9_COMP *cpi, MACROBLOCK *x,
|
| continue;
|
|
|
| if (this_mode == NEWMV) {
|
| - if (ref_frame > LAST_FRAME) {
|
| + if (ref_frame > LAST_FRAME && !cpi->use_svc) {
|
| int tmp_sad;
|
| int dis, cost_list[5];
|
|
|
| @@ -1289,6 +1302,21 @@ void vp9_pick_inter_mode(VP9_COMP *cpi, MACROBLOCK *x,
|
| x->pred_mv_sad[LAST_FRAME] = best_pred_sad;
|
| }
|
|
|
| + if (cpi->use_svc) {
|
| + if (this_mode == NEWMV && ref_frame == GOLDEN_FRAME &&
|
| + frame_mv[NEWMV][GOLDEN_FRAME].as_int != INVALID_MV) {
|
| + const int pre_stride = xd->plane[0].pre[0].stride;
|
| + const uint8_t * const pre_buf = xd->plane[0].pre[0].buf +
|
| + (frame_mv[NEWMV][GOLDEN_FRAME].as_mv.row >> 3) * pre_stride +
|
| + (frame_mv[NEWMV][GOLDEN_FRAME].as_mv.col >> 3);
|
| + best_pred_sad = cpi->fn_ptr[bsize].sdf(x->plane[0].src.buf,
|
| + x->plane[0].src.stride,
|
| + pre_buf, pre_stride);
|
| + x->pred_mv_sad[GOLDEN_FRAME] = best_pred_sad;
|
| + }
|
| + }
|
| +
|
| +
|
| if (this_mode != NEARESTMV &&
|
| frame_mv[this_mode][ref_frame].as_int ==
|
| frame_mv[NEARESTMV][ref_frame].as_int)
|
| @@ -1311,7 +1339,8 @@ void vp9_pick_inter_mode(VP9_COMP *cpi, MACROBLOCK *x,
|
| }
|
|
|
| if ((this_mode == NEWMV || filter_ref == SWITCHABLE) && pred_filter_search
|
| - && (ref_frame == LAST_FRAME)
|
| + && (ref_frame == LAST_FRAME ||
|
| + (ref_frame == GOLDEN_FRAME && cpi->use_svc))
|
| && (((mbmi->mv[0].as_mv.row | mbmi->mv[0].as_mv.col) & 0x07) != 0)) {
|
| int pf_rate[3];
|
| int64_t pf_dist[3];
|
| @@ -1385,7 +1414,7 @@ void vp9_pick_inter_mode(VP9_COMP *cpi, MACROBLOCK *x,
|
| if (!this_early_term) {
|
| this_sse = (int64_t)sse_y;
|
| block_yrd(cpi, x, &this_rdc.rate, &this_rdc.dist, &is_skippable,
|
| - &this_sse, 0, bsize, MIN(mbmi->tx_size, TX_16X16));
|
| + &this_sse, 0, bsize, VPXMIN(mbmi->tx_size, TX_16X16));
|
| x->skip_txfm[0] = is_skippable;
|
| if (is_skippable) {
|
| this_rdc.rate = vp9_cost_bit(vp9_get_skip_prob(cm, xd), 1);
|
| @@ -1494,8 +1523,8 @@ void vp9_pick_inter_mode(VP9_COMP *cpi, MACROBLOCK *x,
|
| 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]);
|
| + VPXMIN(max_txsize_lookup[bsize],
|
| + tx_mode_to_biggest_tx_size[cpi->common.tx_mode]);
|
| int i;
|
| TX_SIZE best_intra_tx_size = TX_SIZES;
|
|
|
|
|