Index: source/libvpx/vp9/encoder/vp9_rdopt.c |
=================================================================== |
--- source/libvpx/vp9/encoder/vp9_rdopt.c (revision 223100) |
+++ source/libvpx/vp9/encoder/vp9_rdopt.c (working copy) |
@@ -48,53 +48,55 @@ |
DECLARE_ALIGNED(16, extern const uint8_t, |
vp9_pt_energy_class[MAX_ENTROPY_TOKENS]); |
-#define I4X4_PRED 0x8000 |
-#define SPLITMV 0x10000 |
+#define LAST_FRAME_MODE_MASK 0xFFDADCD60 |
+#define GOLDEN_FRAME_MODE_MASK 0xFFB5A3BB0 |
+#define ALT_REF_MODE_MASK 0xFF8C648D0 |
const MODE_DEFINITION vp9_mode_order[MAX_MODES] = { |
- {NEARESTMV, LAST_FRAME, NONE}, |
- {DC_PRED, INTRA_FRAME, NONE}, |
+ {RD_NEARESTMV, LAST_FRAME, NONE}, |
+ {RD_NEARESTMV, ALTREF_FRAME, NONE}, |
+ {RD_NEARESTMV, GOLDEN_FRAME, NONE}, |
- {NEARESTMV, ALTREF_FRAME, NONE}, |
- {NEARESTMV, GOLDEN_FRAME, NONE}, |
- {NEWMV, LAST_FRAME, NONE}, |
- {NEARESTMV, LAST_FRAME, ALTREF_FRAME}, |
- {NEARMV, LAST_FRAME, NONE}, |
- {NEARESTMV, GOLDEN_FRAME, ALTREF_FRAME}, |
+ {RD_DC_PRED, INTRA_FRAME, NONE}, |
- {NEWMV, GOLDEN_FRAME, NONE}, |
- {NEWMV, ALTREF_FRAME, NONE}, |
- {NEARMV, ALTREF_FRAME, NONE}, |
+ {RD_NEWMV, LAST_FRAME, NONE}, |
+ {RD_NEWMV, ALTREF_FRAME, NONE}, |
+ {RD_NEWMV, GOLDEN_FRAME, NONE}, |
- {TM_PRED, INTRA_FRAME, NONE}, |
+ {RD_NEARMV, LAST_FRAME, NONE}, |
+ {RD_NEARMV, ALTREF_FRAME, NONE}, |
+ {RD_NEARESTMV, LAST_FRAME, ALTREF_FRAME}, |
+ {RD_NEARESTMV, GOLDEN_FRAME, ALTREF_FRAME}, |
- {NEARMV, LAST_FRAME, ALTREF_FRAME}, |
- {NEWMV, LAST_FRAME, ALTREF_FRAME}, |
- {NEARMV, GOLDEN_FRAME, NONE}, |
- {NEARMV, GOLDEN_FRAME, ALTREF_FRAME}, |
- {NEWMV, GOLDEN_FRAME, ALTREF_FRAME}, |
+ {RD_TM_PRED, INTRA_FRAME, NONE}, |
- {SPLITMV, LAST_FRAME, NONE}, |
- {SPLITMV, GOLDEN_FRAME, NONE}, |
- {SPLITMV, ALTREF_FRAME, NONE}, |
- {SPLITMV, LAST_FRAME, ALTREF_FRAME}, |
- {SPLITMV, GOLDEN_FRAME, ALTREF_FRAME}, |
+ {RD_NEARMV, LAST_FRAME, ALTREF_FRAME}, |
+ {RD_NEWMV, LAST_FRAME, ALTREF_FRAME}, |
+ {RD_NEARMV, GOLDEN_FRAME, NONE}, |
+ {RD_NEARMV, GOLDEN_FRAME, ALTREF_FRAME}, |
+ {RD_NEWMV, GOLDEN_FRAME, ALTREF_FRAME}, |
- {ZEROMV, LAST_FRAME, NONE}, |
- {ZEROMV, GOLDEN_FRAME, NONE}, |
- {ZEROMV, ALTREF_FRAME, NONE}, |
- {ZEROMV, LAST_FRAME, ALTREF_FRAME}, |
- {ZEROMV, GOLDEN_FRAME, ALTREF_FRAME}, |
+ {RD_SPLITMV, LAST_FRAME, NONE}, |
+ {RD_SPLITMV, GOLDEN_FRAME, NONE}, |
+ {RD_SPLITMV, ALTREF_FRAME, NONE}, |
+ {RD_SPLITMV, LAST_FRAME, ALTREF_FRAME}, |
+ {RD_SPLITMV, GOLDEN_FRAME, ALTREF_FRAME}, |
- {I4X4_PRED, INTRA_FRAME, NONE}, |
- {H_PRED, INTRA_FRAME, NONE}, |
- {V_PRED, INTRA_FRAME, NONE}, |
- {D135_PRED, INTRA_FRAME, NONE}, |
- {D207_PRED, INTRA_FRAME, NONE}, |
- {D153_PRED, INTRA_FRAME, NONE}, |
- {D63_PRED, INTRA_FRAME, NONE}, |
- {D117_PRED, INTRA_FRAME, NONE}, |
- {D45_PRED, INTRA_FRAME, NONE}, |
+ {RD_ZEROMV, LAST_FRAME, NONE}, |
+ {RD_ZEROMV, GOLDEN_FRAME, NONE}, |
+ {RD_ZEROMV, ALTREF_FRAME, NONE}, |
+ {RD_ZEROMV, LAST_FRAME, ALTREF_FRAME}, |
+ {RD_ZEROMV, GOLDEN_FRAME, ALTREF_FRAME}, |
+ |
+ {RD_I4X4_PRED, INTRA_FRAME, NONE}, |
+ {RD_H_PRED, INTRA_FRAME, NONE}, |
+ {RD_V_PRED, INTRA_FRAME, NONE}, |
+ {RD_D135_PRED, INTRA_FRAME, NONE}, |
+ {RD_D207_PRED, INTRA_FRAME, NONE}, |
+ {RD_D153_PRED, INTRA_FRAME, NONE}, |
+ {RD_D63_PRED, INTRA_FRAME, NONE}, |
+ {RD_D117_PRED, INTRA_FRAME, NONE}, |
+ {RD_D45_PRED, INTRA_FRAME, NONE}, |
}; |
// The baseline rd thresholds for breaking out of the rd loop for |
@@ -158,6 +160,15 @@ |
return (11 * q * q) >> 2; |
} |
+static MB_PREDICTION_MODE rd_mode_to_mode(RD_PREDICTION_MODE rd_mode) { |
+ if (rd_mode == RD_SPLITMV || rd_mode == RD_I4X4_PRED) { |
+ assert(!"Invalid rd_mode"); |
+ return MB_MODE_COUNT; |
+ } |
+ assert((int)rd_mode < (int)MB_MODE_COUNT); |
+ return (MB_PREDICTION_MODE)rd_mode; |
+} |
+ |
void vp9_initialize_me_consts(VP9_COMP *cpi, int qindex) { |
cpi->mb.sadperbit16 = sad_per_bit16lut[qindex]; |
cpi->mb.sadperbit4 = sad_per_bit4lut[qindex]; |
@@ -474,7 +485,7 @@ |
TX_SIZE tx_size, |
const int16_t *scan, const int16_t *nb) { |
MACROBLOCKD *const xd = &mb->e_mbd; |
- MB_MODE_INFO *mbmi = &xd->mode_info_context->mbmi; |
+ MB_MODE_INFO *mbmi = &xd->this_mi->mbmi; |
struct macroblockd_plane *pd = &xd->plane[plane]; |
const PLANE_TYPE type = pd->plane_type; |
const int16_t *band_count = &band_counts[tx_size][1]; |
@@ -489,7 +500,7 @@ |
int c, cost; |
// Check for consistency of tx_size with mode info |
- assert(type == PLANE_TYPE_Y_WITH_DC ? mbmi->txfm_size == tx_size |
+ assert(type == PLANE_TYPE_Y_WITH_DC ? mbmi->tx_size == tx_size |
: get_uv_tx_size(mbmi) == tx_size); |
if (eob == 0) { |
@@ -567,7 +578,7 @@ |
args->sse += this_sse >> shift; |
if (x->skip_encode && |
- xd->mode_info_context->mbmi.ref_frame[0] == INTRA_FRAME) { |
+ xd->this_mi->mbmi.ref_frame[0] == INTRA_FRAME) { |
// TODO(jingning): tune the model to better capture the distortion. |
int64_t p = (pd->dequant[1] * pd->dequant[1] * |
(1 << ss_txfrm_size)) >> shift; |
@@ -610,7 +621,7 @@ |
return; |
} |
- if (!is_inter_block(&xd->mode_info_context->mbmi)) |
+ if (!is_inter_block(&xd->this_mi->mbmi)) |
vp9_encode_block_intra(plane, block, plane_bsize, tx_size, &encode_args); |
else |
vp9_xform_quant(plane, block, plane_bsize, tx_size, &encode_args); |
@@ -634,7 +645,7 @@ |
num_4x4_blocks_wide, num_4x4_blocks_high, |
0, 0, 0, ref_best_rd, 0 }; |
if (plane == 0) |
- xd->mode_info_context->mbmi.txfm_size = tx_size; |
+ xd->this_mi->mbmi.tx_size = tx_size; |
switch (tx_size) { |
case TX_4X4: |
@@ -688,24 +699,24 @@ |
const TX_SIZE max_txfm_size = max_txsize_lookup[bs]; |
VP9_COMMON *const cm = &cpi->common; |
MACROBLOCKD *const xd = &x->e_mbd; |
- MB_MODE_INFO *const mbmi = &xd->mode_info_context->mbmi; |
+ MB_MODE_INFO *const mbmi = &xd->this_mi->mbmi; |
if (max_txfm_size == TX_32X32 && |
(cm->tx_mode == ALLOW_32X32 || |
cm->tx_mode == TX_MODE_SELECT)) { |
- mbmi->txfm_size = TX_32X32; |
+ mbmi->tx_size = TX_32X32; |
} else if (max_txfm_size >= TX_16X16 && |
(cm->tx_mode == ALLOW_16X16 || |
cm->tx_mode == ALLOW_32X32 || |
cm->tx_mode == TX_MODE_SELECT)) { |
- mbmi->txfm_size = TX_16X16; |
+ mbmi->tx_size = TX_16X16; |
} else if (cm->tx_mode != ONLY_4X4) { |
- mbmi->txfm_size = TX_8X8; |
+ mbmi->tx_size = TX_8X8; |
} else { |
- mbmi->txfm_size = TX_4X4; |
+ mbmi->tx_size = TX_4X4; |
} |
txfm_rd_in_plane(x, rate, distortion, skip, |
- &sse[mbmi->txfm_size], ref_best_rd, 0, bs, |
- mbmi->txfm_size); |
+ &sse[mbmi->tx_size], ref_best_rd, 0, bs, |
+ mbmi->tx_size); |
cpi->txfm_stepdown_count[0]++; |
} |
@@ -718,13 +729,13 @@ |
const TX_SIZE max_tx_size = max_txsize_lookup[bs]; |
VP9_COMMON *const cm = &cpi->common; |
MACROBLOCKD *const xd = &x->e_mbd; |
- MB_MODE_INFO *const mbmi = &xd->mode_info_context->mbmi; |
+ MB_MODE_INFO *const mbmi = &xd->this_mi->mbmi; |
vp9_prob skip_prob = vp9_get_pred_prob_mbskip(cm, xd); |
int64_t rd[TX_SIZES][2]; |
int n, m; |
int s0, s1; |
- const vp9_prob *tx_probs = get_tx_probs2(xd, &cm->fc.tx_probs); |
+ const vp9_prob *tx_probs = get_tx_probs2(xd, &cm->fc.tx_probs, xd->this_mi); |
for (n = TX_4X4; n <= max_tx_size; n++) { |
r[n][1] = r[n][0]; |
@@ -760,26 +771,26 @@ |
(cm->tx_mode == TX_MODE_SELECT && |
rd[TX_32X32][1] < rd[TX_16X16][1] && rd[TX_32X32][1] < rd[TX_8X8][1] && |
rd[TX_32X32][1] < rd[TX_4X4][1]))) { |
- mbmi->txfm_size = TX_32X32; |
+ mbmi->tx_size = TX_32X32; |
} else if (max_tx_size >= TX_16X16 && |
(cm->tx_mode == ALLOW_16X16 || |
cm->tx_mode == ALLOW_32X32 || |
(cm->tx_mode == TX_MODE_SELECT && |
rd[TX_16X16][1] < rd[TX_8X8][1] && |
rd[TX_16X16][1] < rd[TX_4X4][1]))) { |
- mbmi->txfm_size = TX_16X16; |
+ mbmi->tx_size = TX_16X16; |
} else if (cm->tx_mode == ALLOW_8X8 || |
cm->tx_mode == ALLOW_16X16 || |
cm->tx_mode == ALLOW_32X32 || |
(cm->tx_mode == TX_MODE_SELECT && rd[TX_8X8][1] < rd[TX_4X4][1])) { |
- mbmi->txfm_size = TX_8X8; |
+ mbmi->tx_size = TX_8X8; |
} else { |
- mbmi->txfm_size = TX_4X4; |
+ mbmi->tx_size = TX_4X4; |
} |
- *distortion = d[mbmi->txfm_size]; |
- *rate = r[mbmi->txfm_size][cm->tx_mode == TX_MODE_SELECT]; |
- *skip = s[mbmi->txfm_size]; |
+ *distortion = d[mbmi->tx_size]; |
+ *rate = r[mbmi->tx_size][cm->tx_mode == TX_MODE_SELECT]; |
+ *skip = s[mbmi->tx_size]; |
tx_cache[ONLY_4X4] = rd[TX_4X4][0]; |
tx_cache[ALLOW_8X8] = rd[TX_8X8][0]; |
@@ -821,7 +832,7 @@ |
const TX_SIZE max_txfm_size = max_txsize_lookup[bs]; |
VP9_COMMON *const cm = &cpi->common; |
MACROBLOCKD *const xd = &x->e_mbd; |
- MB_MODE_INFO *const mbmi = &xd->mode_info_context->mbmi; |
+ MB_MODE_INFO *const mbmi = &xd->this_mi->mbmi; |
vp9_prob skip_prob = vp9_get_pred_prob_mbskip(cm, xd); |
int64_t rd[TX_SIZES][2]; |
int n, m; |
@@ -829,7 +840,7 @@ |
double scale_rd[TX_SIZES] = {1.73, 1.44, 1.20, 1.00}; |
// double scale_r[TX_SIZES] = {2.82, 2.00, 1.41, 1.00}; |
- const vp9_prob *tx_probs = get_tx_probs2(xd, &cm->fc.tx_probs); |
+ const vp9_prob *tx_probs = get_tx_probs2(xd, &cm->fc.tx_probs, xd->this_mi); |
// for (n = TX_4X4; n <= max_txfm_size; n++) |
// r[n][0] = (r[n][0] * scale_r[n]); |
@@ -867,28 +878,28 @@ |
rd[TX_32X32][1] <= rd[TX_16X16][1] && |
rd[TX_32X32][1] <= rd[TX_8X8][1] && |
rd[TX_32X32][1] <= rd[TX_4X4][1]))) { |
- mbmi->txfm_size = TX_32X32; |
+ mbmi->tx_size = TX_32X32; |
} else if (max_txfm_size >= TX_16X16 && |
(cm->tx_mode == ALLOW_16X16 || |
cm->tx_mode == ALLOW_32X32 || |
(cm->tx_mode == TX_MODE_SELECT && |
rd[TX_16X16][1] <= rd[TX_8X8][1] && |
rd[TX_16X16][1] <= rd[TX_4X4][1]))) { |
- mbmi->txfm_size = TX_16X16; |
+ mbmi->tx_size = TX_16X16; |
} else if (cm->tx_mode == ALLOW_8X8 || |
cm->tx_mode == ALLOW_16X16 || |
cm->tx_mode == ALLOW_32X32 || |
(cm->tx_mode == TX_MODE_SELECT && |
rd[TX_8X8][1] <= rd[TX_4X4][1])) { |
- mbmi->txfm_size = TX_8X8; |
+ mbmi->tx_size = TX_8X8; |
} else { |
- mbmi->txfm_size = TX_4X4; |
+ mbmi->tx_size = TX_4X4; |
} |
// Actually encode using the chosen mode if a model was used, but do not |
// update the r, d costs |
- txfm_rd_in_plane(x, rate, distortion, skip, &sse[mbmi->txfm_size], |
- ref_best_rd, 0, bs, mbmi->txfm_size); |
+ txfm_rd_in_plane(x, rate, distortion, skip, &sse[mbmi->tx_size], |
+ ref_best_rd, 0, bs, mbmi->tx_size); |
if (max_txfm_size == TX_32X32 && |
rd[TX_32X32][1] <= rd[TX_16X16][1] && |
@@ -914,7 +925,7 @@ |
int r[TX_SIZES][2], s[TX_SIZES]; |
int64_t d[TX_SIZES], sse[TX_SIZES]; |
MACROBLOCKD *xd = &x->e_mbd; |
- MB_MODE_INFO *const mbmi = &xd->mode_info_context->mbmi; |
+ MB_MODE_INFO *const mbmi = &xd->this_mi->mbmi; |
assert(bs == mbmi->sb_type); |
if (mbmi->ref_frame[0] > INTRA_FRAME) |
@@ -927,7 +938,7 @@ |
choose_largest_txfm_size(cpi, x, rate, distortion, skip, sse, |
ref_best_rd, bs); |
if (psse) |
- *psse = sse[mbmi->txfm_size]; |
+ *psse = sse[mbmi->tx_size]; |
return; |
} |
@@ -963,7 +974,7 @@ |
skip, txfm_cache, bs); |
} |
if (psse) |
- *psse = sse[mbmi->txfm_size]; |
+ *psse = sse[mbmi->tx_size]; |
} |
static int conditional_skipintra(MB_PREDICTION_MODE mode, |
@@ -1021,7 +1032,7 @@ |
vpx_memcpy(ta, a, sizeof(ta)); |
vpx_memcpy(tl, l, sizeof(tl)); |
- xd->mode_info_context->mbmi.txfm_size = TX_4X4; |
+ xd->this_mi->mbmi.tx_size = TX_4X4; |
for (mode = DC_PRED; mode <= TM_PRED; ++mode) { |
int64_t this_rd; |
@@ -1051,7 +1062,7 @@ |
uint8_t *dst = dst_init + idx * 4 + idy * 4 * dst_stride; |
block = ib + idy * 2 + idx; |
- xd->mode_info_context->bmi[block].as_mode = mode; |
+ xd->this_mi->bmi[block].as_mode = mode; |
src_diff = raster_block_offset_int16(BLOCK_8X8, block, p->src_diff); |
coeff = BLOCK_OFFSET(x->plane[0].coeff, block); |
vp9_predict_intra_block(xd, block, 1, |
@@ -1127,7 +1138,10 @@ |
int64_t best_rd) { |
int i, j; |
MACROBLOCKD *const xd = &mb->e_mbd; |
- const BLOCK_SIZE bsize = xd->mode_info_context->mbmi.sb_type; |
+ MODE_INFO *const mic = xd->this_mi; |
+ const MODE_INFO *above_mi = xd->mi_8x8[-xd->mode_info_stride]; |
+ const MODE_INFO *left_mi = xd->mi_8x8[-1]; |
+ const BLOCK_SIZE bsize = xd->this_mi->mbmi.sb_type; |
const int num_4x4_blocks_wide = num_4x4_blocks_wide_lookup[bsize]; |
const int num_4x4_blocks_high = num_4x4_blocks_high_lookup[bsize]; |
int idx, idy; |
@@ -1137,7 +1151,6 @@ |
int64_t total_rd = 0; |
ENTROPY_CONTEXT t_above[4], t_left[4]; |
int *bmode_costs; |
- MODE_INFO *const mic = xd->mode_info_context; |
vpx_memcpy(t_above, xd->plane[0].above_context, sizeof(t_above)); |
vpx_memcpy(t_left, xd->plane[0].left_context, sizeof(t_left)); |
@@ -1147,15 +1160,15 @@ |
// Pick modes for each sub-block (of size 4x4, 4x8, or 8x4) in an 8x8 block. |
for (idy = 0; idy < 2; idy += num_4x4_blocks_high) { |
for (idx = 0; idx < 2; idx += num_4x4_blocks_wide) { |
- const int mis = xd->mode_info_stride; |
MB_PREDICTION_MODE best_mode = DC_PRED; |
int r = INT_MAX, ry = INT_MAX; |
int64_t d = INT64_MAX, this_rd = INT64_MAX; |
i = idy * 2 + idx; |
if (cpi->common.frame_type == KEY_FRAME) { |
- const MB_PREDICTION_MODE A = above_block_mode(mic, i, mis); |
+ const MB_PREDICTION_MODE A = above_block_mode(mic, above_mi, i); |
const MB_PREDICTION_MODE L = (xd->left_available || idx) ? |
- left_block_mode(mic, i) : DC_PRED; |
+ left_block_mode(mic, left_mi, i) : |
+ DC_PRED; |
bmode_costs = mb->y_mode_costs[A][L]; |
} |
@@ -1185,7 +1198,7 @@ |
*rate = cost; |
*rate_y = tot_rate_y; |
*distortion = total_distortion; |
- xd->mode_info_context->mbmi.mode = mic->bmi[3].as_mode; |
+ mic->mbmi.mode = mic->bmi[3].as_mode; |
return RDCOST(mb->rdmult, mb->rddiv, cost, total_distortion); |
} |
@@ -1199,7 +1212,7 @@ |
MB_PREDICTION_MODE mode; |
MB_PREDICTION_MODE mode_selected = DC_PRED; |
MACROBLOCKD *const xd = &x->e_mbd; |
- MODE_INFO *const mic = xd->mode_info_context; |
+ MODE_INFO *const mic = xd->this_mi; |
int this_rate, this_rate_tokenonly, s; |
int64_t this_distortion, this_rd; |
TX_SIZE best_tx = TX_4X4; |
@@ -1213,15 +1226,16 @@ |
/* Y Search for intra prediction mode */ |
for (mode = DC_PRED; mode <= TM_PRED; mode++) { |
int64_t local_tx_cache[TX_MODES]; |
- const int mis = xd->mode_info_stride; |
+ MODE_INFO *above_mi = xd->mi_8x8[-xd->mode_info_stride]; |
+ MODE_INFO *left_mi = xd->mi_8x8[-1]; |
if (!(cpi->sf.intra_y_mode_mask & (1 << mode))) |
continue; |
if (cpi->common.frame_type == KEY_FRAME) { |
- const MB_PREDICTION_MODE A = above_block_mode(mic, 0, mis); |
+ const MB_PREDICTION_MODE A = above_block_mode(mic, above_mi, 0); |
const MB_PREDICTION_MODE L = xd->left_available ? |
- left_block_mode(mic, 0) : DC_PRED; |
+ left_block_mode(mic, left_mi, 0) : DC_PRED; |
bmode_costs = x->y_mode_costs[A][L]; |
} |
@@ -1239,7 +1253,7 @@ |
if (this_rd < best_rd) { |
mode_selected = mode; |
best_rd = this_rd; |
- best_tx = mic->mbmi.txfm_size; |
+ best_tx = mic->mbmi.tx_size; |
*rate = this_rate; |
*rate_tokenonly = this_rate_tokenonly; |
*distortion = this_distortion; |
@@ -1247,7 +1261,7 @@ |
} |
if (cpi->sf.tx_size_search_method == USE_FULL_RD && this_rd < INT64_MAX) { |
- for (i = 0; i < TX_MODES; i++) { |
+ for (i = 0; i < TX_MODES && local_tx_cache[i] < INT64_MAX; i++) { |
const int64_t adj_rd = this_rd + local_tx_cache[i] - |
local_tx_cache[cpi->common.tx_mode]; |
if (adj_rd < tx_cache[i]) { |
@@ -1258,7 +1272,7 @@ |
} |
mic->mbmi.mode = mode_selected; |
- mic->mbmi.txfm_size = best_tx; |
+ mic->mbmi.tx_size = best_tx; |
return best_rd; |
} |
@@ -1268,7 +1282,7 @@ |
int64_t *sse, BLOCK_SIZE bsize, |
int64_t ref_best_rd) { |
MACROBLOCKD *const xd = &x->e_mbd; |
- MB_MODE_INFO *const mbmi = &xd->mode_info_context->mbmi; |
+ MB_MODE_INFO *const mbmi = &xd->this_mi->mbmi; |
TX_SIZE uv_txfm_size = get_uv_tx_size(mbmi); |
int plane; |
int pnrate = 0, pnskip = 1; |
@@ -1323,7 +1337,8 @@ |
if (!(cpi->sf.intra_uv_mode_mask & (1 << mode))) |
continue; |
- x->e_mbd.mode_info_context->mbmi.uv_mode = mode; |
+ x->e_mbd.mi_8x8[0]->mbmi.uv_mode = mode; |
+ |
super_block_uvrd(&cpi->common, x, &this_rate_tokenonly, |
&this_distortion, &s, &this_sse, bsize, best_rd); |
if (this_rate_tokenonly == INT_MAX) |
@@ -1342,7 +1357,7 @@ |
} |
} |
- x->e_mbd.mode_info_context->mbmi.uv_mode = mode_selected; |
+ x->e_mbd.mi_8x8[0]->mbmi.uv_mode = mode_selected; |
return best_rd; |
} |
@@ -1354,7 +1369,7 @@ |
int64_t this_rd; |
int64_t this_sse; |
- x->e_mbd.mode_info_context->mbmi.uv_mode = DC_PRED; |
+ x->e_mbd.mi_8x8[0]->mbmi.uv_mode = DC_PRED; |
super_block_uvrd(&cpi->common, x, rate_tokenonly, |
distortion, skippable, &this_sse, bsize, INT64_MAX); |
*rate = *rate_tokenonly + |
@@ -1382,14 +1397,14 @@ |
rate_uv, rate_uv_tokenonly, dist_uv, skip_uv, |
bsize < BLOCK_8X8 ? BLOCK_8X8 : bsize); |
} |
- *mode_uv = x->e_mbd.mode_info_context->mbmi.uv_mode; |
+ *mode_uv = x->e_mbd.mi_8x8[0]->mbmi.uv_mode; |
} |
static int cost_mv_ref(VP9_COMP *cpi, MB_PREDICTION_MODE mode, |
int mode_context) { |
MACROBLOCK *const x = &cpi->mb; |
MACROBLOCKD *const xd = &x->e_mbd; |
- const int segment_id = xd->mode_info_context->mbmi.segment_id; |
+ const int segment_id = xd->this_mi->mbmi.segment_id; |
// Don't account for mode here if segment skip is enabled. |
if (!vp9_segfeature_active(&cpi->common.seg, segment_id, SEG_LVL_SKIP)) { |
@@ -1401,8 +1416,8 @@ |
} |
void vp9_set_mbmode_and_mvs(MACROBLOCK *x, MB_PREDICTION_MODE mb, int_mv *mv) { |
- x->e_mbd.mode_info_context->mbmi.mode = mb; |
- x->e_mbd.mode_info_context->mbmi.mv[0].as_int = mv->as_int; |
+ x->e_mbd.mi_8x8[0]->mbmi.mode = mb; |
+ x->e_mbd.mi_8x8[0]->mbmi.mv[0].as_int = mv->as_int; |
} |
static void joint_motion_search(VP9_COMP *cpi, MACROBLOCK *x, |
@@ -1425,7 +1440,7 @@ |
int_mv *second_best_ref_mv, |
int *mvjcost, int *mvcost[2], VP9_COMP *cpi) { |
MACROBLOCKD *const xd = &x->e_mbd; |
- MODE_INFO *const mic = xd->mode_info_context; |
+ MODE_INFO *const mic = xd->this_mi; |
MB_MODE_INFO *mbmi = &mic->mbmi; |
int cost = 0, thismvcost = 0; |
int idx, idy; |
@@ -1499,7 +1514,7 @@ |
int k; |
MACROBLOCKD *xd = &x->e_mbd; |
struct macroblockd_plane *const pd = &xd->plane[0]; |
- MODE_INFO *const mi = xd->mode_info_context; |
+ MODE_INFO *const mi = xd->this_mi; |
const BLOCK_SIZE bsize = mi->mbmi.sb_type; |
const int width = plane_block_width(bsize, pd); |
const int height = plane_block_height(bsize, pd); |
@@ -1511,28 +1526,20 @@ |
int16_t* src_diff = raster_block_offset_int16(BLOCK_8X8, i, |
x->plane[0].src_diff); |
int16_t* coeff = BLOCK_OFFSET(x->plane[0].coeff, i); |
- uint8_t* const pre = raster_block_offset_uint8(BLOCK_8X8, i, |
- pd->pre[0].buf, |
- pd->pre[0].stride); |
uint8_t* const dst = raster_block_offset_uint8(BLOCK_8X8, i, |
pd->dst.buf, pd->dst.stride); |
int64_t thisdistortion = 0, thissse = 0; |
int thisrate = 0; |
+ int ref, second_ref = has_second_ref(&mi->mbmi); |
- vp9_build_inter_predictor(pre, pd->pre[0].stride, |
- dst, pd->dst.stride, |
- &mi->bmi[i].as_mv[0].as_mv, |
- &xd->scale_factor[0], |
- width, height, 0, &xd->subpix, MV_PRECISION_Q3); |
- |
- if (mi->mbmi.ref_frame[1] > 0) { |
- uint8_t* const second_pre = |
- raster_block_offset_uint8(BLOCK_8X8, 0, pd->pre[1].buf, pd->pre[1].stride); |
- vp9_build_inter_predictor(second_pre, pd->pre[1].stride, |
+ for (ref = 0; ref < 1 + second_ref; ++ref) { |
+ const uint8_t *pre = raster_block_offset_uint8(BLOCK_8X8, i, |
+ pd->pre[ref].buf, pd->pre[ref].stride); |
+ vp9_build_inter_predictor(pre, pd->pre[ref].stride, |
dst, pd->dst.stride, |
- &mi->bmi[i].as_mv[1].as_mv, |
- &xd->scale_factor[1], |
- width, height, 1, &xd->subpix, MV_PRECISION_Q3); |
+ &mi->bmi[i].as_mv[ref].as_mv, |
+ &xd->scale_factor[ref], |
+ width, height, ref, &xd->subpix, MV_PRECISION_Q3); |
} |
vp9_subtract_block(height, width, src_diff, 8, src, src_stride, |
@@ -1607,7 +1614,7 @@ |
} |
static INLINE void mi_buf_shift(MACROBLOCK *x, int i) { |
- MB_MODE_INFO *const mbmi = &x->e_mbd.mode_info_context->mbmi; |
+ MB_MODE_INFO *const mbmi = &x->e_mbd.mi_8x8[0]->mbmi; |
struct macroblock_plane *const p = &x->plane[0]; |
struct macroblockd_plane *const pd = &x->e_mbd.plane[0]; |
@@ -1623,7 +1630,7 @@ |
static INLINE void mi_buf_restore(MACROBLOCK *x, struct buf_2d orig_src, |
struct buf_2d orig_pre[2]) { |
- MB_MODE_INFO *mbmi = &x->e_mbd.mode_info_context->mbmi; |
+ MB_MODE_INFO *mbmi = &x->e_mbd.mi_8x8[0]->mbmi; |
x->plane[0].src = orig_src; |
x->e_mbd.plane[0].pre[0] = orig_pre[0]; |
if (mbmi->ref_frame[1]) |
@@ -1637,7 +1644,7 @@ |
int i, j, br = 0, idx, idy; |
int64_t bd = 0, block_sse = 0; |
MB_PREDICTION_MODE this_mode; |
- MODE_INFO *mi = x->e_mbd.mode_info_context; |
+ MODE_INFO *mi = x->e_mbd.mi_8x8[0]; |
MB_MODE_INFO *const mbmi = &mi->mbmi; |
const int label_count = 4; |
int64_t this_segment_rd = 0; |
@@ -1755,11 +1762,9 @@ |
if (cpi->compressor_speed) { |
// use previous block's result as next block's MV predictor. |
if (i > 0) { |
- bsi->mvp.as_int = |
- x->e_mbd.mode_info_context->bmi[i - 1].as_mv[0].as_int; |
+ bsi->mvp.as_int = mi->bmi[i - 1].as_mv[0].as_int; |
if (i == 2) |
- bsi->mvp.as_int = |
- x->e_mbd.mode_info_context->bmi[i - 2].as_mv[0].as_int; |
+ bsi->mvp.as_int = mi->bmi[i - 2].as_mv[0].as_int; |
} |
} |
if (i == 0) |
@@ -1817,13 +1822,11 @@ |
if (thissme < bestsme) { |
bestsme = thissme; |
- mode_mv[NEWMV].as_int = |
- x->e_mbd.mode_info_context->bmi[i].as_mv[0].as_int; |
+ mode_mv[NEWMV].as_int = mi->bmi[i].as_mv[0].as_int; |
} else { |
/* The full search result is actually worse so re-instate the |
* previous best vector */ |
- x->e_mbd.mode_info_context->bmi[i].as_mv[0].as_int = |
- mode_mv[NEWMV].as_int; |
+ mi->bmi[i].as_mv[0].as_int = mode_mv[NEWMV].as_int; |
} |
} |
@@ -2024,7 +2027,7 @@ |
int i; |
BEST_SEG_INFO *bsi = bsi_buf + filter_idx; |
MACROBLOCKD *xd = &x->e_mbd; |
- MODE_INFO *mi = xd->mode_info_context; |
+ MODE_INFO *mi = xd->this_mi; |
MB_MODE_INFO *mbmi = &mi->mbmi; |
int mode_idx; |
@@ -2070,7 +2073,7 @@ |
uint8_t *ref_y_buffer, int ref_y_stride, |
int ref_frame, BLOCK_SIZE block_size ) { |
MACROBLOCKD *xd = &x->e_mbd; |
- MB_MODE_INFO *mbmi = &xd->mode_info_context->mbmi; |
+ MB_MODE_INFO *mbmi = &xd->this_mi->mbmi; |
int_mv this_mv; |
int i; |
int zero_seen = 0; |
@@ -2190,7 +2193,7 @@ |
// restored if we decide to encode this way |
ctx->skip = x->skip; |
ctx->best_mode_index = mode_index; |
- ctx->mic = *xd->mode_info_context; |
+ ctx->mic = *xd->this_mi; |
if (partition) |
ctx->partition_info = *partition; |
@@ -2246,7 +2249,7 @@ |
VP9_COMMON *cm = &cpi->common; |
YV12_BUFFER_CONFIG *yv12 = &cm->yv12_fb[cpi->common.ref_frame_map[idx]]; |
MACROBLOCKD *const xd = &x->e_mbd; |
- MB_MODE_INFO *const mbmi = &xd->mode_info_context->mbmi; |
+ MB_MODE_INFO *const mbmi = &xd->this_mi->mbmi; |
// set up scaling factors |
scale[frame_type] = cpi->common.active_ref_scale[frame_type - 1]; |
@@ -2264,8 +2267,8 @@ |
&scale[frame_type], &scale[frame_type]); |
// Gets an initial list of candidate vectors from neighbours and orders them |
- vp9_find_mv_refs(&cpi->common, xd, xd->mode_info_context, |
- xd->prev_mode_info_context, |
+ vp9_find_mv_refs(&cpi->common, xd, xd->this_mi, |
+ xd->last_mi, |
frame_type, |
mbmi->ref_mvs[frame_type], mi_row, mi_col); |
@@ -2286,14 +2289,15 @@ |
static YV12_BUFFER_CONFIG *get_scaled_ref_frame(VP9_COMP *cpi, int ref_frame) { |
YV12_BUFFER_CONFIG *scaled_ref_frame = NULL; |
int fb = get_ref_frame_idx(cpi, ref_frame); |
- if (cpi->scaled_ref_idx[fb] != cpi->common.ref_frame_map[fb]) |
- scaled_ref_frame = &cpi->common.yv12_fb[cpi->scaled_ref_idx[fb]]; |
+ int fb_scale = get_scale_ref_frame_idx(cpi, ref_frame); |
+ if (cpi->scaled_ref_idx[fb_scale] != cpi->common.ref_frame_map[fb]) |
+ scaled_ref_frame = &cpi->common.yv12_fb[cpi->scaled_ref_idx[fb_scale]]; |
return scaled_ref_frame; |
} |
static INLINE int get_switchable_rate(const MACROBLOCK *x) { |
const MACROBLOCKD *const xd = &x->e_mbd; |
- const MB_MODE_INFO *const mbmi = &xd->mode_info_context->mbmi; |
+ const MB_MODE_INFO *const mbmi = &xd->this_mi->mbmi; |
const int ctx = vp9_get_pred_context_switchable_interp(xd); |
return SWITCHABLE_INTERP_RATE_FACTOR * |
x->switchable_interp_costs[ctx][mbmi->interp_filter]; |
@@ -2305,7 +2309,7 @@ |
int_mv *tmp_mv, int *rate_mv) { |
MACROBLOCKD *xd = &x->e_mbd; |
VP9_COMMON *cm = &cpi->common; |
- MB_MODE_INFO *mbmi = &xd->mode_info_context->mbmi; |
+ MB_MODE_INFO *mbmi = &xd->this_mi->mbmi; |
struct buf_2d backup_yv12[MAX_MB_PLANE] = {{0}}; |
int bestsme = INT_MAX; |
int further_steps, step_param; |
@@ -2433,7 +2437,7 @@ |
int *rate_mv) { |
int pw = 4 << b_width_log2(bsize), ph = 4 << b_height_log2(bsize); |
MACROBLOCKD *xd = &x->e_mbd; |
- MB_MODE_INFO *mbmi = &xd->mode_info_context->mbmi; |
+ MB_MODE_INFO *mbmi = &xd->this_mi->mbmi; |
int refs[2] = { mbmi->ref_frame[0], |
(mbmi->ref_frame[1] < 0 ? 0 : mbmi->ref_frame[1]) }; |
int_mv ref_mv[2]; |
@@ -2598,7 +2602,7 @@ |
const int64_t ref_best_rd) { |
VP9_COMMON *cm = &cpi->common; |
MACROBLOCKD *xd = &x->e_mbd; |
- MB_MODE_INFO *mbmi = &xd->mode_info_context->mbmi; |
+ MB_MODE_INFO *mbmi = &xd->this_mi->mbmi; |
const int is_comp_pred = (mbmi->ref_frame[1] > 0); |
const int num_refs = is_comp_pred ? 2 : 1; |
const int this_mode = mbmi->mode; |
@@ -2644,7 +2648,7 @@ |
single_motion_search(cpi, x, bsize, mi_row, mi_col, &tmp_mv, &rate_mv); |
*rate2 += rate_mv; |
frame_mv[refs[0]].as_int = |
- xd->mode_info_context->bmi[0].as_mv[0].as_int = tmp_mv.as_int; |
+ xd->this_mi->bmi[0].as_mv[0].as_int = tmp_mv.as_int; |
single_newmv[refs[0]].as_int = tmp_mv.as_int; |
} |
} |
@@ -2863,7 +2867,7 @@ |
if (cpi->common.mcomp_filter_type == SWITCHABLE) |
*rate2 += get_switchable_rate(x); |
- if (!is_comp_pred) { |
+ if (!is_comp_pred && cpi->enable_encode_breakout) { |
if (cpi->active_map_enabled && x->active_ptr[0] == 0) |
x->skip = 1; |
else if (x->encode_breakout) { |
@@ -2874,18 +2878,23 @@ |
unsigned int thresh_ac; |
// The encode_breakout input |
unsigned int encode_breakout = x->encode_breakout << 4; |
+ int max_thresh = 36000; |
+ // Use extreme low threshold for static frames to limit skipping. |
+ if (cpi->enable_encode_breakout == 2) |
+ max_thresh = 128; |
+ |
// Calculate threshold according to dequant value. |
thresh_ac = (xd->plane[0].dequant[1] * xd->plane[0].dequant[1]) / 9; |
- // Set a maximum for threshold to avoid big PSNR loss in low bitrate case. |
- if (thresh_ac > 36000) |
- thresh_ac = 36000; |
- |
// Use encode_breakout input if it is bigger than internal threshold. |
if (thresh_ac < encode_breakout) |
thresh_ac = encode_breakout; |
+ // Set a maximum for threshold to avoid big PSNR loss in low bitrate case. |
+ if (thresh_ac > max_thresh) |
+ thresh_ac = max_thresh; |
+ |
var = cpi->fn_ptr[y_size].vf(x->plane[0].src.buf, x->plane[0].src.stride, |
xd->plane[0].dst.buf, |
xd->plane[0].dst.stride, &sse); |
@@ -2924,8 +2933,8 @@ |
(sse_v - var_v < thresh_dc || sse_v == var_v)) { |
x->skip = 1; |
- *rate2 = 500; |
- *rate_uv = 0; |
+ // The cost of skip bit needs to be added. |
+ *rate2 += vp9_cost_bit(vp9_get_pred_prob_mbskip(cm, xd), 1); |
// Scaling factor for SSE from spatial domain to frequency domain |
// is 16. Adjust distortion accordingly. |
@@ -2999,11 +3008,11 @@ |
VP9_COMMON *const cm = &cpi->common; |
MACROBLOCKD *const xd = &x->e_mbd; |
int rate_y = 0, rate_uv = 0, rate_y_tokenonly = 0, rate_uv_tokenonly = 0; |
- int y_skip = 0, uv_skip; |
+ int y_skip = 0, uv_skip = 0; |
int64_t dist_y = 0, dist_uv = 0, tx_cache[TX_MODES] = { 0 }; |
x->skip_encode = 0; |
ctx->skip = 0; |
- xd->mode_info_context->mbmi.ref_frame[0] = INTRA_FRAME; |
+ xd->this_mi->mbmi.ref_frame[0] = INTRA_FRAME; |
if (bsize >= BLOCK_8X8) { |
if (rd_pick_intra_sby_mode(cpi, x, &rate_y, &rate_y_tokenonly, |
&dist_y, &y_skip, bsize, tx_cache, |
@@ -3039,7 +3048,7 @@ |
ctx->tx_rd_diff[i] = tx_cache[i] - tx_cache[cm->tx_mode]; |
} |
- ctx->mic = *xd->mode_info_context; |
+ ctx->mic = *xd->this_mi; |
} |
int64_t vp9_rd_pick_inter_mode_sb(VP9_COMP *cpi, MACROBLOCK *x, |
@@ -3051,12 +3060,12 @@ |
int64_t best_rd_so_far) { |
VP9_COMMON *cm = &cpi->common; |
MACROBLOCKD *xd = &x->e_mbd; |
- MB_MODE_INFO *mbmi = &xd->mode_info_context->mbmi; |
+ MB_MODE_INFO *mbmi = &xd->this_mi->mbmi; |
const struct segmentation *seg = &cm->seg; |
const BLOCK_SIZE block_size = get_plane_block_size(bsize, &xd->plane[0]); |
- MB_PREDICTION_MODE this_mode; |
+ RD_PREDICTION_MODE this_mode; |
MV_REFERENCE_FRAME ref_frame, second_ref_frame; |
- unsigned char segment_id = xd->mode_info_context->mbmi.segment_id; |
+ unsigned char segment_id = mbmi->segment_id; |
int comp_pred, i; |
int_mv frame_mv[MB_MODE_COUNT][MAX_REF_FRAMES]; |
struct buf_2d yv12_mb[4][MAX_MB_PLANE]; |
@@ -3100,14 +3109,11 @@ |
int_mv seg_mvs[4][MAX_REF_FRAMES]; |
union b_mode_info best_bmodes[4]; |
PARTITION_INFO best_partition; |
- int bwsl = b_width_log2(bsize); |
- int bws = (1 << bwsl) / 4; // mode_info step for subsize |
- int bhsl = b_height_log2(bsize); |
- int bhs = (1 << bhsl) / 4; // mode_info step for subsize |
+ const int bws = num_8x8_blocks_wide_lookup[bsize] / 2; |
+ const int bhs = num_8x8_blocks_high_lookup[bsize] / 2; |
int best_skip2 = 0; |
- x->skip_encode = (cpi->sf.skip_encode_frame && |
- xd->q_index < QIDX_SKIP_THRESH); |
+ x->skip_encode = cpi->sf.skip_encode_frame && xd->q_index < QIDX_SKIP_THRESH; |
for (i = 0; i < 4; i++) { |
int j; |
@@ -3197,10 +3203,31 @@ |
ref_frame = vp9_mode_order[mode_index].ref_frame; |
second_ref_frame = vp9_mode_order[mode_index].second_ref_frame; |
- // Skip modes that have been masked off but always consider first mode. |
- if (mode_index && (bsize > cpi->sf.unused_mode_skip_lvl) && |
- (cpi->unused_mode_skip_mask & (1 << mode_index)) ) |
- continue; |
+ // Look at the reference frame of the best mode so far and set the |
+ // skip mask to look at a subset of the remaining modes. |
+ if (mode_index > cpi->sf.mode_skip_start) { |
+ if (mode_index == (cpi->sf.mode_skip_start + 1)) { |
+ switch (vp9_mode_order[best_mode_index].ref_frame) { |
+ case INTRA_FRAME: |
+ cpi->mode_skip_mask = 0; |
+ break; |
+ case LAST_FRAME: |
+ cpi->mode_skip_mask = LAST_FRAME_MODE_MASK; |
+ break; |
+ case GOLDEN_FRAME: |
+ cpi->mode_skip_mask = GOLDEN_FRAME_MODE_MASK; |
+ break; |
+ case ALTREF_FRAME: |
+ cpi->mode_skip_mask = ALT_REF_MODE_MASK; |
+ break; |
+ case NONE: |
+ case MAX_REF_FRAMES: |
+ assert(!"Invalid Reference frame"); |
+ } |
+ } |
+ if (cpi->mode_skip_mask & (1 << mode_index)) |
+ continue; |
+ } |
// Skip if the current reference frame has been masked off |
if (cpi->sf.reference_masking && !cpi->set_ref_frame_mask && |
@@ -3264,16 +3291,23 @@ |
// SPLITMV. |
if (ref_frame > 0 && |
vp9_is_scaled(&scale_factor[ref_frame]) && |
- this_mode == SPLITMV) |
+ this_mode == RD_SPLITMV) |
continue; |
if (second_ref_frame > 0 && |
vp9_is_scaled(&scale_factor[second_ref_frame]) && |
- this_mode == SPLITMV) |
+ this_mode == RD_SPLITMV) |
continue; |
+ if (bsize >= BLOCK_8X8 && |
+ (this_mode == RD_I4X4_PRED || this_mode == RD_SPLITMV)) |
+ continue; |
+ |
+ if (bsize < BLOCK_8X8 && |
+ !(this_mode == RD_I4X4_PRED || this_mode == RD_SPLITMV)) |
+ continue; |
+ |
set_scale_factors(xd, ref_frame, second_ref_frame, scale_factor); |
- mbmi->mode = this_mode; |
mbmi->uv_mode = DC_PRED; |
// Evaluate all sub-pel filters irrespective of whether we can use |
@@ -3281,13 +3315,6 @@ |
mbmi->interp_filter = cm->mcomp_filter_type; |
vp9_setup_interp_filters(xd, mbmi->interp_filter, &cpi->common); |
- if (bsize >= BLOCK_8X8 && |
- (this_mode == I4X4_PRED || this_mode == SPLITMV)) |
- continue; |
- if (bsize < BLOCK_8X8 && |
- !(this_mode == I4X4_PRED || this_mode == SPLITMV)) |
- continue; |
- |
if (comp_pred) { |
if (!(cpi->ref_frame_flags & flag_list[second_ref_frame])) |
continue; |
@@ -3320,7 +3347,7 @@ |
// If the segment skip feature is enabled.... |
// then do nothing if the current mode is not allowed.. |
} else if (vp9_segfeature_active(seg, segment_id, SEG_LVL_SKIP) && |
- (this_mode != ZEROMV && ref_frame != INTRA_FRAME)) { |
+ (this_mode != RD_ZEROMV && ref_frame != INTRA_FRAME)) { |
continue; |
// Disable this drop out case if the ref frame |
// segment level feature is enabled for this segment. This is to |
@@ -3332,11 +3359,11 @@ |
// an unfiltered alternative. We allow near/nearest as well |
// because they may result in zero-zero MVs but be cheaper. |
if (cpi->is_src_frame_alt_ref && (cpi->oxcf.arnr_max_frames == 0)) { |
- if ((this_mode != ZEROMV && |
- !(this_mode == NEARMV && |
- frame_mv[NEARMV][ALTREF_FRAME].as_int == 0) && |
- !(this_mode == NEARESTMV && |
- frame_mv[NEARESTMV][ALTREF_FRAME].as_int == 0)) || |
+ if ((this_mode != RD_ZEROMV && |
+ !(this_mode == RD_NEARMV && |
+ frame_mv[RD_NEARMV][ALTREF_FRAME].as_int == 0) && |
+ !(this_mode == RD_NEARESTMV && |
+ frame_mv[RD_NEARESTMV][ALTREF_FRAME].as_int == 0)) || |
ref_frame != ALTREF_FRAME) { |
continue; |
} |
@@ -3348,11 +3375,17 @@ |
// a representative block in the boundary ( first ) and then implement a |
// function that does sads when inside the border.. |
if (((mi_row + bhs) > cm->mi_rows || (mi_col + bws) > cm->mi_cols) && |
- this_mode == NEWMV) { |
+ this_mode == RD_NEWMV) { |
continue; |
} |
- if (this_mode == I4X4_PRED) { |
+#ifdef MODE_TEST_HIT_STATS |
+ // TEST/DEBUG CODE |
+ // Keep a rcord of the number of test hits at each size |
+ cpi->mode_test_hits[bsize]++; |
+#endif |
+ |
+ if (this_mode == RD_I4X4_PRED) { |
int rate; |
/* |
@@ -3361,8 +3394,8 @@ |
continue; |
*/ |
- // I4X4_PRED is only considered for block sizes less than 8x8. |
- mbmi->txfm_size = TX_4X4; |
+ // RD_I4X4_PRED is only considered for block sizes less than 8x8. |
+ mbmi->tx_size = TX_4X4; |
if (rd_pick_intra_sub_8x8_y_mode(cpi, x, &rate, &rate_y, |
&distortion_y, best_rd) >= best_rd) |
continue; |
@@ -3393,27 +3426,29 @@ |
64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, |
}; |
if ((cpi->sf.mode_search_skip_flags & FLAG_SKIP_INTRA_LOWVAR) && |
- this_mode != DC_PRED && |
+ this_mode != RD_DC_PRED && |
x->source_variance < skip_intra_var_thresh[mbmi->sb_type]) |
continue; |
// Only search the oblique modes if the best so far is |
// one of the neighboring directional modes |
if ((cpi->sf.mode_search_skip_flags & FLAG_SKIP_INTRA_BESTINTER) && |
- (this_mode >= D45_PRED && this_mode <= TM_PRED)) { |
+ (this_mode >= RD_D45_PRED && this_mode <= RD_TM_PRED)) { |
if (vp9_mode_order[best_mode_index].ref_frame > INTRA_FRAME) |
continue; |
} |
+ mbmi->mode = rd_mode_to_mode(this_mode); |
if (cpi->sf.mode_search_skip_flags & FLAG_SKIP_INTRA_DIRMISMATCH) { |
if (conditional_skipintra(mbmi->mode, best_intra_mode)) |
continue; |
} |
+ |
super_block_yrd(cpi, x, &rate_y, &distortion_y, &skippable, NULL, |
bsize, tx_cache, best_rd); |
if (rate_y == INT_MAX) |
continue; |
- uv_tx = MIN(mbmi->txfm_size, max_uv_txsize_lookup[bsize]); |
+ uv_tx = MIN(mbmi->tx_size, max_uv_txsize_lookup[bsize]); |
if (rate_uv_intra[uv_tx] == INT_MAX) { |
choose_intra_uv_mode(cpi, bsize, &rate_uv_intra[uv_tx], |
&rate_uv_tokenonly[uv_tx], |
@@ -3427,10 +3462,10 @@ |
mbmi->uv_mode = mode_uv[uv_tx]; |
rate2 = rate_y + x->mbmode_cost[mbmi->mode] + rate_uv_intra[uv_tx]; |
- if (mbmi->mode != DC_PRED && mbmi->mode != TM_PRED) |
+ if (this_mode != RD_DC_PRED && this_mode != RD_TM_PRED) |
rate2 += intra_cost_penalty; |
distortion2 = distortion_y + distortion_uv; |
- } else if (this_mode == SPLITMV) { |
+ } else if (this_mode == RD_SPLITMV) { |
const int is_comp_pred = second_ref_frame > 0; |
int rate; |
int64_t distortion; |
@@ -3463,7 +3498,7 @@ |
cpi->rd_threshes[bsize][THR_NEWA]; |
this_rd_thresh = (ref_frame == GOLDEN_FRAME) ? |
cpi->rd_threshes[bsize][THR_NEWG] : this_rd_thresh; |
- xd->mode_info_context->mbmi.txfm_size = TX_4X4; |
+ xd->this_mi->mbmi.tx_size = TX_4X4; |
cpi->rd_filter_cache[SWITCHABLE_FILTERS] = INT64_MAX; |
if (cm->mcomp_filter_type != BILINEAR) { |
@@ -3519,7 +3554,7 @@ |
tmp_best_mbmode = *mbmi; |
tmp_best_partition = *x->partition_info; |
for (i = 0; i < 4; i++) |
- tmp_best_bmodes[i] = xd->mode_info_context->bmi[i]; |
+ tmp_best_bmodes[i] = xd->this_mi->bmi[i]; |
pred_exists = 1; |
if (switchable_filter_index == 0 && |
cpi->sf.use_rd_breakout && |
@@ -3571,7 +3606,7 @@ |
*mbmi = tmp_best_mbmode; |
*x->partition_info = tmp_best_partition; |
for (i = 0; i < 4; i++) |
- xd->mode_info_context->bmi[i] = tmp_best_bmodes[i]; |
+ xd->this_mi->bmi[i] = tmp_best_bmodes[i]; |
} |
rate2 += rate; |
@@ -3611,6 +3646,7 @@ |
tx_cache[i] = tx_cache[ONLY_4X4]; |
} |
} else { |
+ mbmi->mode = rd_mode_to_mode(this_mode); |
compmode_cost = vp9_cost_bit(comp_mode_p, second_ref_frame > INTRA_FRAME); |
this_rd = handle_inter_mode(cpi, x, bsize, |
tx_cache, |
@@ -3695,20 +3731,20 @@ |
} |
// Keep record of best intra rd |
- if (xd->mode_info_context->mbmi.ref_frame[0] == INTRA_FRAME && |
- is_intra_mode(xd->mode_info_context->mbmi.mode) && |
+ if (xd->this_mi->mbmi.ref_frame[0] == INTRA_FRAME && |
+ is_intra_mode(xd->this_mi->mbmi.mode) && |
this_rd < best_intra_rd) { |
best_intra_rd = this_rd; |
- best_intra_mode = xd->mode_info_context->mbmi.mode; |
+ best_intra_mode = xd->this_mi->mbmi.mode; |
} |
// Keep record of best inter rd with single reference |
- if (xd->mode_info_context->mbmi.ref_frame[0] > INTRA_FRAME && |
- xd->mode_info_context->mbmi.ref_frame[1] == NONE && |
+ if (xd->this_mi->mbmi.ref_frame[0] > INTRA_FRAME && |
+ xd->this_mi->mbmi.ref_frame[1] == NONE && |
!mode_excluded && |
this_rd < best_inter_rd) { |
best_inter_rd = this_rd; |
best_inter_ref_frame = ref_frame; |
- // best_inter_mode = xd->mode_info_context->mbmi.mode; |
+ // best_inter_mode = xd->this_mi->mbmi.mode; |
} |
if (!disable_skip && ref_frame == INTRA_FRAME) { |
@@ -3718,7 +3754,7 @@ |
best_filter_rd[i] = MIN(best_filter_rd[i], this_rd); |
} |
- if (this_mode != I4X4_PRED && this_mode != SPLITMV) { |
+ if (this_mode != RD_I4X4_PRED && this_mode != RD_SPLITMV) { |
// Store the respective mode distortions for later use. |
if (mode_distortions[this_mode] == -1 |
|| distortion2 < mode_distortions[this_mode]) { |
@@ -3750,9 +3786,9 @@ |
best_skip2 = this_skip2; |
best_partition = *x->partition_info; |
- if (this_mode == I4X4_PRED || this_mode == SPLITMV) |
+ if (this_mode == RD_I4X4_PRED || this_mode == RD_SPLITMV) |
for (i = 0; i < 4; i++) |
- best_bmodes[i] = xd->mode_info_context->bmi[i]; |
+ best_bmodes[i] = xd->this_mi->bmi[i]; |
// TODO(debargha): enhance this test with a better distortion prediction |
// based on qp, activity mask and history |
@@ -3820,16 +3856,16 @@ |
/* keep record of best txfm size */ |
if (bsize < BLOCK_32X32) { |
if (bsize < BLOCK_16X16) { |
- if (this_mode == SPLITMV || this_mode == I4X4_PRED) |
+ if (this_mode == RD_SPLITMV || this_mode == RD_I4X4_PRED) |
tx_cache[ALLOW_8X8] = tx_cache[ONLY_4X4]; |
tx_cache[ALLOW_16X16] = tx_cache[ALLOW_8X8]; |
} |
tx_cache[ALLOW_32X32] = tx_cache[ALLOW_16X16]; |
} |
if (!mode_excluded && this_rd != INT64_MAX) { |
- for (i = 0; i < TX_MODES; i++) { |
+ for (i = 0; i < TX_MODES && tx_cache[i] < INT64_MAX; i++) { |
int64_t adj_rd = INT64_MAX; |
- if (this_mode != I4X4_PRED) { |
+ if (this_mode != RD_I4X4_PRED) { |
adj_rd = this_rd + tx_cache[i] - tx_cache[cm->tx_mode]; |
} else { |
adj_rd = this_rd; |
@@ -3863,13 +3899,6 @@ |
} |
} |
- // If indicated then mark the index of the chosen mode to be inspected at |
- // other block sizes. |
- if (bsize <= cpi->sf.unused_mode_skip_lvl) { |
- cpi->unused_mode_skip_mask = cpi->unused_mode_skip_mask & |
- (~((int64_t)1 << best_mode_index)); |
- } |
- |
// If we are using reference masking and the set mask flag is set then |
// create the reference frame mask. |
if (cpi->sf.reference_masking && cpi->set_ref_frame_mask) |
@@ -3931,24 +3960,24 @@ |
if (best_mbmode.ref_frame[0] == INTRA_FRAME && |
best_mbmode.sb_type < BLOCK_8X8) { |
for (i = 0; i < 4; i++) |
- xd->mode_info_context->bmi[i].as_mode = best_bmodes[i].as_mode; |
+ xd->this_mi->bmi[i].as_mode = best_bmodes[i].as_mode; |
} |
if (best_mbmode.ref_frame[0] != INTRA_FRAME && |
best_mbmode.sb_type < BLOCK_8X8) { |
for (i = 0; i < 4; i++) |
- xd->mode_info_context->bmi[i].as_mv[0].as_int = |
+ xd->this_mi->bmi[i].as_mv[0].as_int = |
best_bmodes[i].as_mv[0].as_int; |
if (mbmi->ref_frame[1] > 0) |
for (i = 0; i < 4; i++) |
- xd->mode_info_context->bmi[i].as_mv[1].as_int = |
+ xd->this_mi->bmi[i].as_mv[1].as_int = |
best_bmodes[i].as_mv[1].as_int; |
*x->partition_info = best_partition; |
- mbmi->mv[0].as_int = xd->mode_info_context->bmi[3].as_mv[0].as_int; |
- mbmi->mv[1].as_int = xd->mode_info_context->bmi[3].as_mv[1].as_int; |
+ mbmi->mv[0].as_int = xd->this_mi->bmi[3].as_mv[0].as_int; |
+ mbmi->mv[1].as_int = xd->this_mi->bmi[3].as_mv[1].as_int; |
} |
for (i = 0; i < NB_PREDICTION_TYPES; ++i) { |