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; |