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 2f9cccb99c712b0375b91b42eb56025fe771bb6c..dedec5f54d30f207ebebd75c7c9dd90433bf2506 100644 |
--- a/source/libvpx/vp9/encoder/vp9_pickmode.c |
+++ b/source/libvpx/vp9/encoder/vp9_pickmode.c |
@@ -224,15 +224,6 @@ static void model_rd_for_sb_y(VP9_COMP *cpi, BLOCK_SIZE bsize, |
*var_y = var; |
*sse_y = sse; |
- x->skip_txfm[0] = 0; |
- // Check if all ac coefficients can be quantized to zero. |
- if (var < ac_thr || var == 0) { |
- x->skip_txfm[0] = 2; |
- // Check if dc coefficient can be quantized to zero. |
- if (sse - var < dc_thr || sse == var) |
- x->skip_txfm[0] = 1; |
- } |
- |
if (cpi->common.tx_mode == TX_MODE_SELECT) { |
if (sse > (var << 2)) |
xd->mi[0].src_mi->mbmi.tx_size = |
@@ -254,6 +245,32 @@ static void model_rd_for_sb_y(VP9_COMP *cpi, BLOCK_SIZE bsize, |
tx_mode_to_biggest_tx_size[cpi->common.tx_mode]); |
} |
+ // Evaluate if the partition block is a skippable block in Y plane. |
+ { |
+ const BLOCK_SIZE unit_size = |
+ txsize_to_bsize[xd->mi[0].src_mi->mbmi.tx_size]; |
+ const unsigned int num_blk_log2 = |
+ (b_width_log2_lookup[bsize] - b_width_log2_lookup[unit_size]) + |
+ (b_height_log2_lookup[bsize] - b_height_log2_lookup[unit_size]); |
+ const unsigned int sse_tx = sse >> num_blk_log2; |
+ const unsigned int var_tx = var >> num_blk_log2; |
+ |
+ x->skip_txfm[0] = 0; |
+ // Check if all ac coefficients can be quantized to zero. |
+ if (var_tx < ac_thr || var == 0) { |
+ x->skip_txfm[0] = 2; |
+ // Check if dc coefficient can be quantized to zero. |
+ if (sse_tx - var_tx < dc_thr || sse == var) |
+ x->skip_txfm[0] = 1; |
+ } |
+ } |
+ |
+ if (x->skip_txfm[0] == 1) { |
+ *out_rate_sum = 0; |
+ *out_dist_sum = sse << 4; |
+ return; |
+ } |
+ |
#if CONFIG_VP9_HIGHBITDEPTH |
if (xd->cur_buf->flags & YV12_FLAG_HIGHBITDEPTH) { |
vp9_model_rd_from_var_lapndz(sse - var, num_pels_log2_lookup[bsize], |
@@ -285,9 +302,6 @@ static void model_rd_for_sb_y(VP9_COMP *cpi, BLOCK_SIZE bsize, |
*out_rate_sum += rate; |
*out_dist_sum += dist << 4; |
- |
- if (*out_rate_sum == 0) |
- x->skip_txfm[0] = 1; |
} |
static void model_rd_for_sb_uv(VP9_COMP *cpi, BLOCK_SIZE bsize, |
@@ -723,6 +737,9 @@ void vp9_pick_inter_mode(VP9_COMP *cpi, MACROBLOCK *x, |
} |
} |
+ if (cpi->rc.frames_since_golden == 0) |
+ ref_frame_skip_mask |= (1 << GOLDEN_FRAME); |
+ |
for (ref_frame = LAST_FRAME; ref_frame <= GOLDEN_FRAME; ++ref_frame) { |
PREDICTION_MODE this_mode; |
int i = (ref_frame == LAST_FRAME) ? GOLDEN_FRAME : LAST_FRAME; |