| Index: source/libvpx/vp9/encoder/vp9_rdopt.c
|
| ===================================================================
|
| --- source/libvpx/vp9/encoder/vp9_rdopt.c (revision 263011)
|
| +++ source/libvpx/vp9/encoder/vp9_rdopt.c (working copy)
|
| @@ -30,6 +30,7 @@
|
| #include "vp9/common/vp9_seg_common.h"
|
| #include "vp9/common/vp9_systemdependent.h"
|
|
|
| +#include "vp9/encoder/vp9_cost.h"
|
| #include "vp9/encoder/vp9_encodemb.h"
|
| #include "vp9/encoder/vp9_encodemv.h"
|
| #include "vp9/encoder/vp9_mcomp.h"
|
| @@ -38,9 +39,13 @@
|
| #include "vp9/encoder/vp9_ratectrl.h"
|
| #include "vp9/encoder/vp9_rdopt.h"
|
| #include "vp9/encoder/vp9_tokenize.h"
|
| -#include "vp9/encoder/vp9_treewriter.h"
|
| #include "vp9/encoder/vp9_variance.h"
|
|
|
| +#define RD_THRESH_MAX_FACT 64
|
| +#define RD_THRESH_INC 1
|
| +#define RD_THRESH_POW 1.25
|
| +#define RD_MULT_EPB_RATIO 64
|
| +
|
| /* Factor to weigh the rate for switchable interp filters */
|
| #define SWITCHABLE_INTERP_RATE_FACTOR 1
|
|
|
| @@ -72,6 +77,7 @@
|
| int64_t this_rd;
|
| int64_t best_rd;
|
| int skip;
|
| + int use_fast_coef_costing;
|
| const scan_order *so;
|
| };
|
|
|
| @@ -145,9 +151,8 @@
|
| }
|
|
|
| static void fill_mode_costs(VP9_COMP *cpi) {
|
| - VP9_COMMON *const cm = &cpi->common;
|
| MACROBLOCK *const x = &cpi->mb;
|
| - FRAME_CONTEXT *const fc = &cm->fc;
|
| + const FRAME_CONTEXT *const fc = &cpi->common.fc;
|
| int i, j;
|
|
|
| for (i = 0; i < INTRA_MODES; i++)
|
| @@ -157,15 +162,14 @@
|
|
|
| // TODO(rbultje) separate tables for superblock costing?
|
| vp9_cost_tokens(x->mbmode_cost, fc->y_mode_prob[1], vp9_intra_mode_tree);
|
| - vp9_cost_tokens(x->intra_uv_mode_cost[1],
|
| - fc->uv_mode_prob[INTRA_MODES - 1], vp9_intra_mode_tree);
|
| - vp9_cost_tokens(x->intra_uv_mode_cost[0],
|
| - vp9_kf_uv_mode_prob[INTRA_MODES - 1], vp9_intra_mode_tree);
|
| + vp9_cost_tokens(x->intra_uv_mode_cost[KEY_FRAME],
|
| + vp9_kf_uv_mode_prob[TM_PRED], vp9_intra_mode_tree);
|
| + vp9_cost_tokens(x->intra_uv_mode_cost[INTER_FRAME],
|
| + fc->uv_mode_prob[TM_PRED], vp9_intra_mode_tree);
|
|
|
| for (i = 0; i < SWITCHABLE_FILTER_CONTEXTS; ++i)
|
| vp9_cost_tokens((int *)x->switchable_interp_costs[i],
|
| - fc->switchable_interp_prob[i],
|
| - vp9_switchable_interp_tree);
|
| + fc->switchable_interp_prob[i], vp9_switchable_interp_tree);
|
| }
|
|
|
| static void fill_token_costs(vp9_coeff_cost *c,
|
| @@ -214,7 +218,7 @@
|
| }
|
| }
|
|
|
| -int vp9_compute_rd_mult(VP9_COMP *cpi, int qindex) {
|
| +int vp9_compute_rd_mult(const VP9_COMP *cpi, int qindex) {
|
| const int q = vp9_dc_quant(qindex, 0);
|
| // TODO(debargha): Adjust the function below
|
| int rdmult = 88 * q * q / 25;
|
| @@ -228,12 +232,9 @@
|
| }
|
|
|
| static int compute_rd_thresh_factor(int qindex) {
|
| - int q;
|
| // TODO(debargha): Adjust the function below
|
| - q = (int)(pow(vp9_dc_quant(qindex, 0) / 4.0, RD_THRESH_POW) * 5.12);
|
| - if (q < 8)
|
| - q = 8;
|
| - return q;
|
| + const int q = (int)(pow(vp9_dc_quant(qindex, 0) / 4.0, RD_THRESH_POW) * 5.12);
|
| + return MAX(q, 8);
|
| }
|
|
|
| void vp9_initialize_me_consts(VP9_COMP *cpi, int qindex) {
|
| @@ -242,9 +243,8 @@
|
| }
|
|
|
| static void set_block_thresholds(VP9_COMP *cpi) {
|
| + const VP9_COMMON *const cm = &cpi->common;
|
| int i, bsize, segment_id;
|
| - VP9_COMMON *cm = &cpi->common;
|
| - SPEED_FEATURES *sf = &cpi->sf;
|
|
|
| for (segment_id = 0; segment_id < MAX_SEGMENTS; ++segment_id) {
|
| const int qindex = clamp(vp9_get_qindex(&cm->seg, segment_id,
|
| @@ -260,13 +260,13 @@
|
|
|
| for (i = 0; i < MAX_MODES; ++i)
|
| cpi->rd_threshes[segment_id][bsize][i] =
|
| - sf->thresh_mult[i] < thresh_max ? sf->thresh_mult[i] * t / 4
|
| + cpi->rd_thresh_mult[i] < thresh_max ? cpi->rd_thresh_mult[i] * t / 4
|
| : INT_MAX;
|
|
|
| for (i = 0; i < MAX_REFS; ++i) {
|
| cpi->rd_thresh_sub8x8[segment_id][bsize][i] =
|
| - sf->thresh_mult_sub8x8[i] < thresh_max
|
| - ? sf->thresh_mult_sub8x8[i] * t / 4
|
| + cpi->rd_thresh_mult_sub8x8[i] < thresh_max
|
| + ? cpi->rd_thresh_mult_sub8x8[i] * t / 4
|
| : INT_MAX;
|
| }
|
| }
|
| @@ -274,8 +274,8 @@
|
| }
|
|
|
| void vp9_initialize_rd_consts(VP9_COMP *cpi) {
|
| - VP9_COMMON *cm = &cpi->common;
|
| - MACROBLOCK *x = &cpi->mb;
|
| + VP9_COMMON *const cm = &cpi->common;
|
| + MACROBLOCK *const x = &cpi->mb;
|
| int i;
|
|
|
| vp9_clear_system_state();
|
| @@ -286,14 +286,12 @@
|
| x->errorperbit = cpi->RDMULT / RD_MULT_EPB_RATIO;
|
| x->errorperbit += (x->errorperbit == 0);
|
|
|
| - vp9_set_speed_features(cpi);
|
| -
|
| x->select_txfm_size = (cpi->sf.tx_size_search_method == USE_LARGESTALL &&
|
| cm->frame_type != KEY_FRAME) ? 0 : 1;
|
|
|
| set_block_thresholds(cpi);
|
|
|
| - if (!cpi->sf.use_nonrd_pick_mode) {
|
| + if (!cpi->sf.use_nonrd_pick_mode || cm->frame_type == KEY_FRAME) {
|
| fill_token_costs(x->token_costs, cm->fc.coef_probs);
|
|
|
| for (i = 0; i < PARTITION_CONTEXTS; i++)
|
| @@ -301,7 +299,8 @@
|
| vp9_partition_tree);
|
| }
|
|
|
| - if (!cpi->sf.use_nonrd_pick_mode || (cm->current_video_frame & 0x07) == 1) {
|
| + if (!cpi->sf.use_nonrd_pick_mode || (cm->current_video_frame & 0x07) == 1 ||
|
| + cm->frame_type == KEY_FRAME) {
|
| fill_mode_costs(cpi);
|
|
|
| if (!frame_is_intra_only(cm)) {
|
| @@ -400,9 +399,9 @@
|
| *d_q10 = (dist_tab_q10[xq] * b_q10 + dist_tab_q10[xq + 1] * a_q10) >> 10;
|
| }
|
|
|
| -static void model_rd_from_var_lapndz(unsigned int var, unsigned int n,
|
| - unsigned int qstep, int *rate,
|
| - int64_t *dist) {
|
| +void vp9_model_rd_from_var_lapndz(unsigned int var, unsigned int n,
|
| + unsigned int qstep, int *rate,
|
| + int64_t *dist) {
|
| // This function models the rate and distortion for a Laplacian
|
| // source with given variance when quantized with a uniform quantizer
|
| // with given stepsize. The closed form expressions are in:
|
| @@ -433,7 +432,7 @@
|
| int i;
|
| int64_t rate_sum = 0;
|
| int64_t dist_sum = 0;
|
| - int ref = xd->mi_8x8[0]->mbmi.ref_frame[0];
|
| + const int ref = xd->mi[0]->mbmi.ref_frame[0];
|
| unsigned int sse;
|
|
|
| for (i = 0; i < MAX_MB_PLANE; ++i) {
|
| @@ -464,8 +463,8 @@
|
| } else {
|
| int rate;
|
| int64_t dist;
|
| - model_rd_from_var_lapndz(sse, 1 << num_pels_log2_lookup[bs],
|
| - pd->dequant[1] >> 3, &rate, &dist);
|
| + vp9_model_rd_from_var_lapndz(sse, 1 << num_pels_log2_lookup[bs],
|
| + pd->dequant[1] >> 3, &rate, &dist);
|
| rate_sum += rate;
|
| dist_sum += dist;
|
| }
|
| @@ -482,8 +481,8 @@
|
| int *out_skip) {
|
| int j, k;
|
| BLOCK_SIZE bs;
|
| - struct macroblock_plane *const p = &x->plane[0];
|
| - struct macroblockd_plane *const pd = &xd->plane[0];
|
| + const struct macroblock_plane *const p = &x->plane[0];
|
| + const struct macroblockd_plane *const pd = &xd->plane[0];
|
| const int width = 4 * num_4x4_blocks_wide_lookup[bsize];
|
| const int height = 4 * num_4x4_blocks_high_lookup[bsize];
|
| int rate_sum = 0;
|
| @@ -512,7 +511,8 @@
|
| &pd->dst.buf[j * pd->dst.stride + k], pd->dst.stride,
|
| &sse);
|
| // sse works better than var, since there is no dc prediction used
|
| - model_rd_from_var_lapndz(sse, t * t, pd->dequant[1] >> 3, &rate, &dist);
|
| + vp9_model_rd_from_var_lapndz(sse, t * t, pd->dequant[1] >> 3,
|
| + &rate, &dist);
|
| rate_sum += rate;
|
| dist_sum += dist;
|
| *out_skip &= (rate < 1024);
|
| @@ -549,26 +549,25 @@
|
| { 1, 2, 3, 4, 11, 256 - 21, 0 },
|
| { 1, 2, 3, 4, 11, 1024 - 21, 0 },
|
| };
|
| -
|
| static INLINE int cost_coeffs(MACROBLOCK *x,
|
| int plane, int block,
|
| ENTROPY_CONTEXT *A, ENTROPY_CONTEXT *L,
|
| TX_SIZE tx_size,
|
| - const int16_t *scan, const int16_t *nb) {
|
| + const int16_t *scan, const int16_t *nb,
|
| + int use_fast_coef_costing) {
|
| MACROBLOCKD *const xd = &x->e_mbd;
|
| - MB_MODE_INFO *mbmi = &xd->mi_8x8[0]->mbmi;
|
| - struct macroblock_plane *p = &x->plane[plane];
|
| - struct macroblockd_plane *pd = &xd->plane[plane];
|
| + MB_MODE_INFO *mbmi = &xd->mi[0]->mbmi;
|
| + const struct macroblock_plane *p = &x->plane[plane];
|
| + const struct macroblockd_plane *pd = &xd->plane[plane];
|
| const PLANE_TYPE type = pd->plane_type;
|
| const int16_t *band_count = &band_counts[tx_size][1];
|
| const int eob = p->eobs[block];
|
| const int16_t *const qcoeff = BLOCK_OFFSET(p->qcoeff, block);
|
| unsigned int (*token_costs)[2][COEFF_CONTEXTS][ENTROPY_TOKENS] =
|
| x->token_costs[tx_size][type][is_inter_block(mbmi)];
|
| - uint8_t *p_tok = x->token_cache;
|
| + uint8_t token_cache[32 * 32];
|
| int pt = combine_entropy_contexts(*A, *L);
|
| int c, cost;
|
| -
|
| // Check for consistency of tx_size with mode info
|
| assert(type == PLANE_TYPE_Y ? mbmi->tx_size == tx_size
|
| : get_uv_tx_size(mbmi) == tx_size);
|
| @@ -584,7 +583,7 @@
|
| int v = qcoeff[0];
|
| int prev_t = vp9_dct_value_tokens_ptr[v].token;
|
| cost = (*token_costs)[0][pt][prev_t] + vp9_dct_value_cost_ptr[v];
|
| - p_tok[0] = vp9_pt_energy_class[prev_t];
|
| + token_cache[0] = vp9_pt_energy_class[prev_t];
|
| ++token_costs;
|
|
|
| // ac tokens
|
| @@ -594,9 +593,13 @@
|
|
|
| v = qcoeff[rc];
|
| t = vp9_dct_value_tokens_ptr[v].token;
|
| - pt = get_coef_context(nb, p_tok, c);
|
| - cost += (*token_costs)[!prev_t][pt][t] + vp9_dct_value_cost_ptr[v];
|
| - p_tok[rc] = vp9_pt_energy_class[t];
|
| + if (use_fast_coef_costing) {
|
| + cost += (*token_costs)[!prev_t][!prev_t][t] + vp9_dct_value_cost_ptr[v];
|
| + } else {
|
| + pt = get_coef_context(nb, token_cache, c);
|
| + cost += (*token_costs)[!prev_t][pt][t] + vp9_dct_value_cost_ptr[v];
|
| + token_cache[rc] = vp9_pt_energy_class[t];
|
| + }
|
| prev_t = t;
|
| if (!--band_left) {
|
| band_left = *band_count++;
|
| @@ -606,8 +609,12 @@
|
|
|
| // eob token
|
| if (band_left) {
|
| - pt = get_coef_context(nb, p_tok, c);
|
| - cost += (*token_costs)[0][pt][EOB_TOKEN];
|
| + if (use_fast_coef_costing) {
|
| + cost += (*token_costs)[0][!prev_t][EOB_TOKEN];
|
| + } else {
|
| + pt = get_coef_context(nb, token_cache, c);
|
| + cost += (*token_costs)[0][pt][EOB_TOKEN];
|
| + }
|
| }
|
| }
|
|
|
| @@ -616,14 +623,13 @@
|
|
|
| return cost;
|
| }
|
| -
|
| static void dist_block(int plane, int block, TX_SIZE tx_size,
|
| struct rdcost_block_args* args) {
|
| const int ss_txfrm_size = tx_size << 1;
|
| MACROBLOCK* const x = args->x;
|
| MACROBLOCKD* const xd = &x->e_mbd;
|
| - struct macroblock_plane *const p = &x->plane[plane];
|
| - struct macroblockd_plane *const pd = &xd->plane[plane];
|
| + const struct macroblock_plane *const p = &x->plane[plane];
|
| + const struct macroblockd_plane *const pd = &xd->plane[plane];
|
| int64_t this_sse;
|
| int shift = tx_size == TX_32X32 ? 0 : 2;
|
| int16_t *const coeff = BLOCK_OFFSET(p->coeff, block);
|
| @@ -632,7 +638,7 @@
|
| &this_sse) >> shift;
|
| args->sse = this_sse >> shift;
|
|
|
| - if (x->skip_encode && !is_inter_block(&xd->mi_8x8[0]->mbmi)) {
|
| + if (x->skip_encode && !is_inter_block(&xd->mi[0]->mbmi)) {
|
| // TODO(jingning): tune the model to better capture the distortion.
|
| int64_t p = (pd->dequant[1] * pd->dequant[1] *
|
| (1 << ss_txfrm_size)) >> (shift + 2);
|
| @@ -648,7 +654,8 @@
|
|
|
| args->rate = cost_coeffs(args->x, plane, block, args->t_above + x_idx,
|
| args->t_left + y_idx, tx_size,
|
| - args->so->scan, args->so->neighbors);
|
| + args->so->scan, args->so->neighbors,
|
| + args->use_fast_coef_costing);
|
| }
|
|
|
| static void block_rd_txfm(int plane, int block, BLOCK_SIZE plane_bsize,
|
| @@ -656,7 +663,7 @@
|
| struct rdcost_block_args *args = arg;
|
| MACROBLOCK *const x = args->x;
|
| MACROBLOCKD *const xd = &x->e_mbd;
|
| - MB_MODE_INFO *mbmi = &xd->mi_8x8[0]->mbmi;
|
| + MB_MODE_INFO *const mbmi = &xd->mi[0]->mbmi;
|
| int64_t rd1, rd2, rd;
|
|
|
| if (args->skip)
|
| @@ -732,15 +739,17 @@
|
| int *rate, int64_t *distortion,
|
| int *skippable, int64_t *sse,
|
| int64_t ref_best_rd, int plane,
|
| - BLOCK_SIZE bsize, TX_SIZE tx_size) {
|
| + BLOCK_SIZE bsize, TX_SIZE tx_size,
|
| + int use_fast_coef_casting) {
|
| MACROBLOCKD *const xd = &x->e_mbd;
|
| - struct macroblockd_plane *const pd = &xd->plane[plane];
|
| + const struct macroblockd_plane *const pd = &xd->plane[plane];
|
| struct rdcost_block_args args = { 0 };
|
| args.x = x;
|
| args.best_rd = ref_best_rd;
|
| + args.use_fast_coef_costing = use_fast_coef_casting;
|
|
|
| if (plane == 0)
|
| - xd->mi_8x8[0]->mbmi.tx_size = tx_size;
|
| + xd->mi[0]->mbmi.tx_size = tx_size;
|
|
|
| vp9_get_entropy_contexts(bsize, tx_size, pd, args.t_above, args.t_left);
|
|
|
| @@ -770,13 +779,13 @@
|
| VP9_COMMON *const cm = &cpi->common;
|
| const TX_SIZE largest_tx_size = tx_mode_to_biggest_tx_size[cm->tx_mode];
|
| MACROBLOCKD *const xd = &x->e_mbd;
|
| - MB_MODE_INFO *const mbmi = &xd->mi_8x8[0]->mbmi;
|
| + MB_MODE_INFO *const mbmi = &xd->mi[0]->mbmi;
|
|
|
| mbmi->tx_size = MIN(max_tx_size, largest_tx_size);
|
|
|
| txfm_rd_in_plane(x, rate, distortion, skip,
|
| &sse[mbmi->tx_size], ref_best_rd, 0, bs,
|
| - mbmi->tx_size);
|
| + mbmi->tx_size, cpi->sf.use_fast_coef_costing);
|
| cpi->tx_stepdown_count[0]++;
|
| }
|
|
|
| @@ -789,7 +798,7 @@
|
| 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->mi_8x8[0]->mbmi;
|
| + MB_MODE_INFO *const mbmi = &xd->mi[0]->mbmi;
|
| vp9_prob skip_prob = vp9_get_skip_prob(cm, xd);
|
| int64_t rd[TX_SIZES][2] = {{INT64_MAX, INT64_MAX},
|
| {INT64_MAX, INT64_MAX},
|
| @@ -872,7 +881,7 @@
|
| 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->mi_8x8[0]->mbmi;
|
| + MB_MODE_INFO *const mbmi = &xd->mi[0]->mbmi;
|
| vp9_prob skip_prob = vp9_get_skip_prob(cm, xd);
|
| int64_t rd[TX_SIZES][2] = {{INT64_MAX, INT64_MAX},
|
| {INT64_MAX, INT64_MAX},
|
| @@ -920,7 +929,8 @@
|
| // 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->tx_size], ref_best_rd, 0, bs, mbmi->tx_size);
|
| + &sse[mbmi->tx_size], ref_best_rd, 0, bs, mbmi->tx_size,
|
| + cpi->sf.use_fast_coef_costing);
|
|
|
| if (max_tx_size == TX_32X32 && best_tx == TX_32X32) {
|
| cpi->tx_stepdown_count[0]++;
|
| @@ -941,7 +951,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->mi_8x8[0]->mbmi;
|
| + MB_MODE_INFO *const mbmi = &xd->mi[0]->mbmi;
|
| const TX_SIZE max_tx_size = max_txsize_lookup[bs];
|
| TX_SIZE tx_size;
|
|
|
| @@ -968,7 +978,8 @@
|
| for (tx_size = TX_4X4; tx_size <= max_tx_size; ++tx_size)
|
| txfm_rd_in_plane(x, &r[tx_size][0], &d[tx_size],
|
| &s[tx_size], &sse[tx_size],
|
| - ref_best_rd, 0, bs, tx_size);
|
| + ref_best_rd, 0, bs, tx_size,
|
| + cpi->sf.use_fast_coef_costing);
|
| choose_txfm_size_from_rd(cpi, x, r, rate, d, distortion, s,
|
| skip, txfm_cache, bs);
|
| }
|
| @@ -983,7 +994,7 @@
|
| int64_t ref_best_rd) {
|
| int64_t sse[TX_SIZES];
|
| MACROBLOCKD *xd = &x->e_mbd;
|
| - MB_MODE_INFO *const mbmi = &xd->mi_8x8[0]->mbmi;
|
| + MB_MODE_INFO *const mbmi = &xd->mi[0]->mbmi;
|
|
|
| assert(bs == mbmi->sb_type);
|
| if (cpi->sf.tx_size_search_method != USE_FULL_RD) {
|
| @@ -997,7 +1008,8 @@
|
| for (tx_size = TX_4X4; tx_size <= max_txsize_lookup[bs]; ++tx_size)
|
| txfm_rd_in_plane(x, &r[tx_size][0], &d[tx_size],
|
| &s[tx_size], &sse[tx_size],
|
| - ref_best_rd, 0, bs, tx_size);
|
| + ref_best_rd, 0, bs, tx_size,
|
| + cpi->sf.use_fast_coef_costing);
|
| choose_txfm_size_from_rd(cpi, x, r, rate, d, distortion, s,
|
| skip, txfm_cache, bs);
|
| }
|
| @@ -1029,7 +1041,7 @@
|
|
|
| static int64_t rd_pick_intra4x4block(VP9_COMP *cpi, MACROBLOCK *x, int ib,
|
| MB_PREDICTION_MODE *best_mode,
|
| - int *bmode_costs,
|
| + const int *bmode_costs,
|
| ENTROPY_CONTEXT *a, ENTROPY_CONTEXT *l,
|
| int *bestrate, int *bestratey,
|
| int64_t *bestdistortion,
|
| @@ -1058,7 +1070,7 @@
|
|
|
| vpx_memcpy(ta, a, sizeof(ta));
|
| vpx_memcpy(tl, l, sizeof(tl));
|
| - xd->mi_8x8[0]->mbmi.tx_size = TX_4X4;
|
| + xd->mi[0]->mbmi.tx_size = TX_4X4;
|
|
|
| for (mode = DC_PRED; mode <= TM_PRED; ++mode) {
|
| int64_t this_rd;
|
| @@ -1087,7 +1099,7 @@
|
| int16_t *const src_diff = raster_block_offset_int16(BLOCK_8X8, block,
|
| p->src_diff);
|
| int16_t *const coeff = BLOCK_OFFSET(x->plane[0].coeff, block);
|
| - xd->mi_8x8[0]->bmi[block].as_mode = mode;
|
| + xd->mi[0]->bmi[block].as_mode = mode;
|
| vp9_predict_intra_block(xd, block, 1,
|
| TX_4X4, mode,
|
| x->skip_encode ? src : dst,
|
| @@ -1100,7 +1112,8 @@
|
| vp9_fwht4x4(src_diff, coeff, 8);
|
| vp9_regular_quantize_b_4x4(x, 0, block, so->scan, so->iscan);
|
| ratey += cost_coeffs(x, 0, block, tempa + idx, templ + idy, TX_4X4,
|
| - so->scan, so->neighbors);
|
| + so->scan, so->neighbors,
|
| + cpi->sf.use_fast_coef_costing);
|
| if (RDCOST(x->rdmult, x->rddiv, ratey, distortion) >= best_rd)
|
| goto next;
|
| vp9_iwht4x4_add(BLOCK_OFFSET(pd->dqcoeff, block), dst, dst_stride,
|
| @@ -1112,7 +1125,8 @@
|
| vp9_fht4x4(src_diff, coeff, 8, tx_type);
|
| vp9_regular_quantize_b_4x4(x, 0, block, so->scan, so->iscan);
|
| ratey += cost_coeffs(x, 0, block, tempa + idx, templ + idy, TX_4X4,
|
| - so->scan, so->neighbors);
|
| + so->scan, so->neighbors,
|
| + cpi->sf.use_fast_coef_costing);
|
| distortion += vp9_block_error(coeff, BLOCK_OFFSET(pd->dqcoeff, block),
|
| 16, &unused) >> 2;
|
| if (RDCOST(x->rdmult, x->rddiv, ratey, distortion) >= best_rd)
|
| @@ -1152,18 +1166,16 @@
|
| return best_rd;
|
| }
|
|
|
| -static int64_t rd_pick_intra_sub_8x8_y_mode(VP9_COMP * const cpi,
|
| - MACROBLOCK * const mb,
|
| - int * const rate,
|
| - int * const rate_y,
|
| - int64_t * const distortion,
|
| +static int64_t rd_pick_intra_sub_8x8_y_mode(VP9_COMP *cpi, MACROBLOCK *mb,
|
| + int *rate, int *rate_y,
|
| + int64_t *distortion,
|
| int64_t best_rd) {
|
| int i, j;
|
| - MACROBLOCKD *const xd = &mb->e_mbd;
|
| - MODE_INFO *const mic = xd->mi_8x8[0];
|
| - const MODE_INFO *above_mi = xd->mi_8x8[-xd->mode_info_stride];
|
| - const MODE_INFO *left_mi = xd->left_available ? xd->mi_8x8[-1] : NULL;
|
| - const BLOCK_SIZE bsize = xd->mi_8x8[0]->mbmi.sb_type;
|
| + const MACROBLOCKD *const xd = &mb->e_mbd;
|
| + MODE_INFO *const mic = xd->mi[0];
|
| + const MODE_INFO *above_mi = xd->mi[-xd->mi_stride];
|
| + const MODE_INFO *left_mi = xd->left_available ? xd->mi[-1] : NULL;
|
| + const BLOCK_SIZE bsize = xd->mi[0]->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;
|
| @@ -1172,13 +1184,11 @@
|
| int tot_rate_y = 0;
|
| int64_t total_rd = 0;
|
| ENTROPY_CONTEXT t_above[4], t_left[4];
|
| - int *bmode_costs;
|
| + const int *bmode_costs = mb->mbmode_cost;
|
|
|
| vpx_memcpy(t_above, xd->plane[0].above_context, sizeof(t_above));
|
| vpx_memcpy(t_left, xd->plane[0].left_context, sizeof(t_left));
|
|
|
| - bmode_costs = mb->mbmode_cost;
|
| -
|
| // 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) {
|
| @@ -1232,7 +1242,7 @@
|
| MB_PREDICTION_MODE mode;
|
| MB_PREDICTION_MODE mode_selected = DC_PRED;
|
| MACROBLOCKD *const xd = &x->e_mbd;
|
| - MODE_INFO *const mic = xd->mi_8x8[0];
|
| + MODE_INFO *const mic = xd->mi[0];
|
| int this_rate, this_rate_tokenonly, s;
|
| int64_t this_distortion, this_rd;
|
| TX_SIZE best_tx = TX_4X4;
|
| @@ -1246,8 +1256,8 @@
|
| /* Y Search for intra prediction mode */
|
| for (mode = DC_PRED; mode <= TM_PRED; mode++) {
|
| int64_t local_tx_cache[TX_MODES];
|
| - MODE_INFO *above_mi = xd->mi_8x8[-xd->mode_info_stride];
|
| - MODE_INFO *left_mi = xd->left_available ? xd->mi_8x8[-1] : NULL;
|
| + MODE_INFO *above_mi = xd->mi[-xd->mi_stride];
|
| + MODE_INFO *left_mi = xd->left_available ? xd->mi[-1] : NULL;
|
|
|
| if (!(cpi->sf.intra_y_mode_mask[max_txsize_lookup[bsize]] & (1 << mode)))
|
| continue;
|
| @@ -1296,12 +1306,12 @@
|
| return best_rd;
|
| }
|
|
|
| -static void super_block_uvrd(MACROBLOCK *x,
|
| +static void super_block_uvrd(const VP9_COMP *cpi, MACROBLOCK *x,
|
| int *rate, int64_t *distortion, int *skippable,
|
| int64_t *sse, BLOCK_SIZE bsize,
|
| int64_t ref_best_rd) {
|
| MACROBLOCKD *const xd = &x->e_mbd;
|
| - MB_MODE_INFO *const mbmi = &xd->mi_8x8[0]->mbmi;
|
| + MB_MODE_INFO *const mbmi = &xd->mi[0]->mbmi;
|
| TX_SIZE uv_txfm_size = get_uv_tx_size(mbmi);
|
| int plane;
|
| int pnrate = 0, pnskip = 1;
|
| @@ -1323,7 +1333,8 @@
|
|
|
| for (plane = 1; plane < MAX_MB_PLANE; ++plane) {
|
| txfm_rd_in_plane(x, &pnrate, &pndist, &pnskip, &pnsse,
|
| - ref_best_rd, plane, bsize, uv_txfm_size);
|
| + ref_best_rd, plane, bsize, uv_txfm_size,
|
| + cpi->sf.use_fast_coef_costing);
|
| if (pnrate == INT_MAX)
|
| goto term;
|
| *rate += pnrate;
|
| @@ -1357,9 +1368,9 @@
|
| if (!(cpi->sf.intra_uv_mode_mask[max_tx_size] & (1 << mode)))
|
| continue;
|
|
|
| - xd->mi_8x8[0]->mbmi.uv_mode = mode;
|
| + xd->mi[0]->mbmi.uv_mode = mode;
|
|
|
| - super_block_uvrd(x, &this_rate_tokenonly,
|
| + super_block_uvrd(cpi, x, &this_rate_tokenonly,
|
| &this_distortion, &s, &this_sse, bsize, best_rd);
|
| if (this_rate_tokenonly == INT_MAX)
|
| continue;
|
| @@ -1398,18 +1409,19 @@
|
| }
|
| }
|
|
|
| - xd->mi_8x8[0]->mbmi.uv_mode = mode_selected;
|
| + xd->mi[0]->mbmi.uv_mode = mode_selected;
|
| return best_rd;
|
| }
|
|
|
| -static int64_t rd_sbuv_dcpred(const VP9_COMMON *cm, MACROBLOCK *x,
|
| +static int64_t rd_sbuv_dcpred(const VP9_COMP *cpi, MACROBLOCK *x,
|
| int *rate, int *rate_tokenonly,
|
| int64_t *distortion, int *skippable,
|
| BLOCK_SIZE bsize) {
|
| + const VP9_COMMON *cm = &cpi->common;
|
| int64_t unused;
|
|
|
| - x->e_mbd.mi_8x8[0]->mbmi.uv_mode = DC_PRED;
|
| - super_block_uvrd(x, rate_tokenonly, distortion,
|
| + x->e_mbd.mi[0]->mbmi.uv_mode = DC_PRED;
|
| + super_block_uvrd(cpi, x, rate_tokenonly, distortion,
|
| skippable, &unused, bsize, INT64_MAX);
|
| *rate = *rate_tokenonly + x->intra_uv_mode_cost[cm->frame_type][DC_PRED];
|
| return RDCOST(x->rdmult, x->rddiv, *rate, *distortion);
|
| @@ -1425,7 +1437,7 @@
|
| // Use an estimated rd for uv_intra based on DC_PRED if the
|
| // appropriate speed flag is set.
|
| if (cpi->sf.use_uv_intra_rd_estimate) {
|
| - rd_sbuv_dcpred(&cpi->common, x, rate_uv, rate_uv_tokenonly, dist_uv,
|
| + rd_sbuv_dcpred(cpi, x, rate_uv, rate_uv_tokenonly, dist_uv,
|
| skip_uv, bsize < BLOCK_8X8 ? BLOCK_8X8 : bsize);
|
| // Else do a proper rd search for each possible transform size that may
|
| // be considered in the main rd loop.
|
| @@ -1434,13 +1446,13 @@
|
| rate_uv, rate_uv_tokenonly, dist_uv, skip_uv,
|
| bsize < BLOCK_8X8 ? BLOCK_8X8 : bsize, max_tx_size);
|
| }
|
| - *mode_uv = x->e_mbd.mi_8x8[0]->mbmi.uv_mode;
|
| + *mode_uv = x->e_mbd.mi[0]->mbmi.uv_mode;
|
| }
|
|
|
| -static int cost_mv_ref(VP9_COMP *cpi, MB_PREDICTION_MODE mode,
|
| +static int cost_mv_ref(const VP9_COMP *cpi, MB_PREDICTION_MODE mode,
|
| int mode_context) {
|
| - MACROBLOCK *const x = &cpi->mb;
|
| - const int segment_id = x->e_mbd.mi_8x8[0]->mbmi.segment_id;
|
| + const MACROBLOCK *const x = &cpi->mb;
|
| + const int segment_id = x->e_mbd.mi[0]->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)) {
|
| @@ -1451,12 +1463,6 @@
|
| }
|
| }
|
|
|
| -void vp9_set_mbmode_and_mvs(MACROBLOCKD *xd, MB_PREDICTION_MODE mode,
|
| - const MV *mv) {
|
| - xd->mi_8x8[0]->mbmi.mode = mode;
|
| - xd->mi_8x8[0]->mbmi.mv[0].as_mv = *mv;
|
| -}
|
| -
|
| static void joint_motion_search(VP9_COMP *cpi, MACROBLOCK *x,
|
| BLOCK_SIZE bsize,
|
| int_mv *frame_mv,
|
| @@ -1464,59 +1470,56 @@
|
| int_mv single_newmv[MAX_REF_FRAMES],
|
| int *rate_mv);
|
|
|
| -static int labels2mode(MACROBLOCK *x, int i,
|
| +static int labels2mode(VP9_COMP *cpi, MACROBLOCKD *xd, int i,
|
| MB_PREDICTION_MODE mode,
|
| - int_mv *this_mv, int_mv *this_second_mv,
|
| + int_mv this_mv[2],
|
| int_mv frame_mv[MB_MODE_COUNT][MAX_REF_FRAMES],
|
| int_mv seg_mvs[MAX_REF_FRAMES],
|
| - int_mv *best_ref_mv,
|
| - 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->mi_8x8[0];
|
| - MB_MODE_INFO *mbmi = &mic->mbmi;
|
| + int_mv *best_ref_mv[2],
|
| + const int *mvjcost, int *mvcost[2]) {
|
| + MODE_INFO *const mic = xd->mi[0];
|
| + const MB_MODE_INFO *const mbmi = &mic->mbmi;
|
| int thismvcost = 0;
|
| int idx, idy;
|
| const int num_4x4_blocks_wide = num_4x4_blocks_wide_lookup[mbmi->sb_type];
|
| const int num_4x4_blocks_high = num_4x4_blocks_high_lookup[mbmi->sb_type];
|
| - const int has_second_rf = has_second_ref(mbmi);
|
| + const int is_compound = has_second_ref(mbmi);
|
|
|
| // the only time we should do costing for new motion vector or mode
|
| // is when we are on a new label (jbb May 08, 2007)
|
| switch (mode) {
|
| case NEWMV:
|
| - this_mv->as_int = seg_mvs[mbmi->ref_frame[0]].as_int;
|
| - thismvcost += vp9_mv_bit_cost(&this_mv->as_mv, &best_ref_mv->as_mv,
|
| + this_mv[0].as_int = seg_mvs[mbmi->ref_frame[0]].as_int;
|
| + thismvcost += vp9_mv_bit_cost(&this_mv[0].as_mv, &best_ref_mv[0]->as_mv,
|
| mvjcost, mvcost, MV_COST_WEIGHT_SUB);
|
| - if (has_second_rf) {
|
| - this_second_mv->as_int = seg_mvs[mbmi->ref_frame[1]].as_int;
|
| - thismvcost += vp9_mv_bit_cost(&this_second_mv->as_mv,
|
| - &second_best_ref_mv->as_mv,
|
| + if (is_compound) {
|
| + this_mv[1].as_int = seg_mvs[mbmi->ref_frame[1]].as_int;
|
| + thismvcost += vp9_mv_bit_cost(&this_mv[1].as_mv, &best_ref_mv[1]->as_mv,
|
| mvjcost, mvcost, MV_COST_WEIGHT_SUB);
|
| }
|
| break;
|
| case NEARESTMV:
|
| - this_mv->as_int = frame_mv[NEARESTMV][mbmi->ref_frame[0]].as_int;
|
| - if (has_second_rf)
|
| - this_second_mv->as_int = frame_mv[NEARESTMV][mbmi->ref_frame[1]].as_int;
|
| + this_mv[0].as_int = frame_mv[NEARESTMV][mbmi->ref_frame[0]].as_int;
|
| + if (is_compound)
|
| + this_mv[1].as_int = frame_mv[NEARESTMV][mbmi->ref_frame[1]].as_int;
|
| break;
|
| case NEARMV:
|
| - this_mv->as_int = frame_mv[NEARMV][mbmi->ref_frame[0]].as_int;
|
| - if (has_second_rf)
|
| - this_second_mv->as_int = frame_mv[NEARMV][mbmi->ref_frame[1]].as_int;
|
| + this_mv[0].as_int = frame_mv[NEARMV][mbmi->ref_frame[0]].as_int;
|
| + if (is_compound)
|
| + this_mv[1].as_int = frame_mv[NEARMV][mbmi->ref_frame[1]].as_int;
|
| break;
|
| case ZEROMV:
|
| - this_mv->as_int = 0;
|
| - if (has_second_rf)
|
| - this_second_mv->as_int = 0;
|
| + this_mv[0].as_int = 0;
|
| + if (is_compound)
|
| + this_mv[1].as_int = 0;
|
| break;
|
| default:
|
| break;
|
| }
|
|
|
| - mic->bmi[i].as_mv[0].as_int = this_mv->as_int;
|
| - if (has_second_rf)
|
| - mic->bmi[i].as_mv[1].as_int = this_second_mv->as_int;
|
| + mic->bmi[i].as_mv[0].as_int = this_mv[0].as_int;
|
| + if (is_compound)
|
| + mic->bmi[i].as_mv[1].as_int = this_mv[1].as_int;
|
|
|
| mic->bmi[i].as_mode = mode;
|
|
|
| @@ -1542,7 +1545,7 @@
|
| MACROBLOCKD *xd = &x->e_mbd;
|
| struct macroblockd_plane *const pd = &xd->plane[0];
|
| struct macroblock_plane *const p = &x->plane[0];
|
| - MODE_INFO *const mi = xd->mi_8x8[0];
|
| + MODE_INFO *const mi = xd->mi[0];
|
| const BLOCK_SIZE plane_bsize = get_plane_block_size(mi->mbmi.sb_type, pd);
|
| const int width = 4 * num_4x4_blocks_wide_lookup[plane_bsize];
|
| const int height = 4 * num_4x4_blocks_high_lookup[plane_bsize];
|
| @@ -1556,6 +1559,8 @@
|
| int thisrate = 0, ref;
|
| const scan_order *so = &vp9_default_scan_orders[TX_4X4];
|
| const int is_compound = has_second_ref(&mi->mbmi);
|
| + const InterpKernel *kernel = vp9_get_interp_kernel(mi->mbmi.interp_filter);
|
| +
|
| for (ref = 0; ref < 1 + is_compound; ++ref) {
|
| const uint8_t *pre = &pd->pre[ref].buf[raster_block_offset(BLOCK_8X8, i,
|
| pd->pre[ref].stride)];
|
| @@ -1563,7 +1568,7 @@
|
| dst, pd->dst.stride,
|
| &mi->bmi[i].as_mv[ref].as_mv,
|
| &xd->block_refs[ref]->sf, width, height, ref,
|
| - xd->interp_kernel, MV_PRECISION_Q3,
|
| + kernel, MV_PRECISION_Q3,
|
| mi_col * MI_SIZE + 4 * (i % 2),
|
| mi_row * MI_SIZE + 4 * (i / 2));
|
| }
|
| @@ -1588,7 +1593,8 @@
|
| 16, &ssz);
|
| thissse += ssz;
|
| thisrate += cost_coeffs(x, 0, k, ta + (k & 1), tl + (k >> 1), TX_4X4,
|
| - so->scan, so->neighbors);
|
| + so->scan, so->neighbors,
|
| + cpi->sf.use_fast_coef_costing);
|
| rd1 = RDCOST(x->rdmult, x->rddiv, thisrate, thisdistortion >> 2);
|
| rd2 = RDCOST(x->rdmult, x->rddiv, 0, thissse >> 2);
|
| rd = MIN(rd1, rd2);
|
| @@ -1638,7 +1644,7 @@
|
| }
|
|
|
| static INLINE void mi_buf_shift(MACROBLOCK *x, int i) {
|
| - MB_MODE_INFO *const mbmi = &x->e_mbd.mi_8x8[0]->mbmi;
|
| + MB_MODE_INFO *const mbmi = &x->e_mbd.mi[0]->mbmi;
|
| struct macroblock_plane *const p = &x->plane[0];
|
| struct macroblockd_plane *const pd = &x->e_mbd.plane[0];
|
|
|
| @@ -1653,7 +1659,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.mi_8x8[0]->mbmi;
|
| + MB_MODE_INFO *mbmi = &x->e_mbd.mi[0]->mbmi;
|
| x->plane[0].src = orig_src;
|
| x->e_mbd.plane[0].pre[0] = orig_pre[0];
|
| if (has_second_ref(mbmi))
|
| @@ -1664,6 +1670,45 @@
|
| return (mv->row & 0x0F) || (mv->col & 0x0F);
|
| }
|
|
|
| +// Check if NEARESTMV/NEARMV/ZEROMV is the cheapest way encode zero motion.
|
| +// TODO(aconverse): Find out if this is still productive then clean up or remove
|
| +static int check_best_zero_mv(
|
| + const VP9_COMP *cpi, const uint8_t mode_context[MAX_REF_FRAMES],
|
| + int_mv frame_mv[MB_MODE_COUNT][MAX_REF_FRAMES],
|
| + int disable_inter_mode_mask, int this_mode, int ref_frame,
|
| + int second_ref_frame) {
|
| + if (!(disable_inter_mode_mask & (1 << INTER_OFFSET(ZEROMV))) &&
|
| + (this_mode == NEARMV || this_mode == NEARESTMV || this_mode == ZEROMV) &&
|
| + frame_mv[this_mode][ref_frame].as_int == 0 &&
|
| + (second_ref_frame == NONE ||
|
| + frame_mv[this_mode][second_ref_frame].as_int == 0)) {
|
| + int rfc = mode_context[ref_frame];
|
| + int c1 = cost_mv_ref(cpi, NEARMV, rfc);
|
| + int c2 = cost_mv_ref(cpi, NEARESTMV, rfc);
|
| + int c3 = cost_mv_ref(cpi, ZEROMV, rfc);
|
| +
|
| + if (this_mode == NEARMV) {
|
| + if (c1 > c3) return 0;
|
| + } else if (this_mode == NEARESTMV) {
|
| + if (c2 > c3) return 0;
|
| + } else {
|
| + assert(this_mode == ZEROMV);
|
| + if (second_ref_frame == NONE) {
|
| + if ((c3 >= c2 && frame_mv[NEARESTMV][ref_frame].as_int == 0) ||
|
| + (c3 >= c1 && frame_mv[NEARMV][ref_frame].as_int == 0))
|
| + return 0;
|
| + } else {
|
| + if ((c3 >= c2 && frame_mv[NEARESTMV][ref_frame].as_int == 0 &&
|
| + frame_mv[NEARESTMV][second_ref_frame].as_int == 0) ||
|
| + (c3 >= c1 && frame_mv[NEARMV][ref_frame].as_int == 0 &&
|
| + frame_mv[NEARMV][second_ref_frame].as_int == 0))
|
| + return 0;
|
| + }
|
| + }
|
| + }
|
| + return 1;
|
| +}
|
| +
|
| static void rd_check_segment_txsize(VP9_COMP *cpi, MACROBLOCK *x,
|
| const TileInfo *const tile,
|
| BEST_SEG_INFO *bsi_buf, int filter_idx,
|
| @@ -1674,7 +1719,7 @@
|
| MB_PREDICTION_MODE this_mode;
|
| MACROBLOCKD *xd = &x->e_mbd;
|
| VP9_COMMON *cm = &cpi->common;
|
| - MODE_INFO *mi = xd->mi_8x8[0];
|
| + MODE_INFO *mi = xd->mi[0];
|
| MB_MODE_INFO *const mbmi = &mi->mbmi;
|
| struct macroblock_plane *const p = &x->plane[0];
|
| struct macroblockd_plane *const pd = &xd->plane[0];
|
| @@ -1691,6 +1736,7 @@
|
| int mode_idx;
|
| int subpelmv = 1, have_ref = 0;
|
| const int has_second_rf = has_second_ref(mbmi);
|
| + const int disable_inter_mode_mask = cpi->sf.disable_inter_mode_mask[bsize];
|
|
|
| vpx_memcpy(t_above, pd->above_context, sizeof(t_above));
|
| vpx_memcpy(t_left, pd->left_context, sizeof(t_left));
|
| @@ -1706,7 +1752,7 @@
|
| for (idx = 0; idx < 2; idx += num_4x4_blocks_wide) {
|
| // TODO(jingning,rbultje): rewrite the rate-distortion optimization
|
| // loop for 4x4/4x8/8x4 block coding. to be replaced with new rd loop
|
| - int_mv mode_mv[MB_MODE_COUNT], second_mode_mv[MB_MODE_COUNT];
|
| + int_mv mode_mv[MB_MODE_COUNT][2];
|
| int_mv frame_mv[MB_MODE_COUNT][MAX_REF_FRAMES];
|
| MB_PREDICTION_MODE mode_selected = ZEROMV;
|
| int64_t best_rd = INT64_MAX;
|
| @@ -1728,46 +1774,15 @@
|
|
|
| mode_idx = INTER_OFFSET(this_mode);
|
| bsi->rdstat[i][mode_idx].brdcost = INT64_MAX;
|
| - if (cpi->sf.disable_inter_mode_mask[bsize] & (1 << mode_idx))
|
| + if (disable_inter_mode_mask & (1 << mode_idx))
|
| continue;
|
|
|
| - // if we're near/nearest and mv == 0,0, compare to zeromv
|
| - if ((this_mode == NEARMV || this_mode == NEARESTMV ||
|
| - this_mode == ZEROMV) &&
|
| - frame_mv[this_mode][mbmi->ref_frame[0]].as_int == 0 &&
|
| - (!has_second_rf ||
|
| - frame_mv[this_mode][mbmi->ref_frame[1]].as_int == 0)) {
|
| - int rfc = mbmi->mode_context[mbmi->ref_frame[0]];
|
| - int c1 = cost_mv_ref(cpi, NEARMV, rfc);
|
| - int c2 = cost_mv_ref(cpi, NEARESTMV, rfc);
|
| - int c3 = cost_mv_ref(cpi, ZEROMV, rfc);
|
| + if (!check_best_zero_mv(cpi, mbmi->mode_context, frame_mv,
|
| + disable_inter_mode_mask,
|
| + this_mode, mbmi->ref_frame[0],
|
| + mbmi->ref_frame[1]))
|
| + continue;
|
|
|
| - if (this_mode == NEARMV) {
|
| - if (c1 > c3)
|
| - continue;
|
| - } else if (this_mode == NEARESTMV) {
|
| - if (c2 > c3)
|
| - continue;
|
| - } else {
|
| - assert(this_mode == ZEROMV);
|
| - if (!has_second_rf) {
|
| - if ((c3 >= c2 &&
|
| - frame_mv[NEARESTMV][mbmi->ref_frame[0]].as_int == 0) ||
|
| - (c3 >= c1 &&
|
| - frame_mv[NEARMV][mbmi->ref_frame[0]].as_int == 0))
|
| - continue;
|
| - } else {
|
| - if ((c3 >= c2 &&
|
| - frame_mv[NEARESTMV][mbmi->ref_frame[0]].as_int == 0 &&
|
| - frame_mv[NEARESTMV][mbmi->ref_frame[1]].as_int == 0) ||
|
| - (c3 >= c1 &&
|
| - frame_mv[NEARMV][mbmi->ref_frame[0]].as_int == 0 &&
|
| - frame_mv[NEARMV][mbmi->ref_frame[1]].as_int == 0))
|
| - continue;
|
| - }
|
| - }
|
| - }
|
| -
|
| vpx_memcpy(orig_pre, pd->pre, sizeof(orig_pre));
|
| vpx_memcpy(bsi->rdstat[i][mode_idx].ta, t_above,
|
| sizeof(bsi->rdstat[i][mode_idx].ta));
|
| @@ -1777,7 +1792,7 @@
|
| // motion search for newmv (single predictor case only)
|
| if (!has_second_rf && this_mode == NEWMV &&
|
| seg_mvs[i][mbmi->ref_frame[0]].as_int == INVALID_MV) {
|
| - int_mv *const new_mv = &mode_mv[NEWMV];
|
| + int_mv *const new_mv = &mode_mv[NEWMV][0];
|
| int step_param = 0;
|
| int further_steps;
|
| int thissme, bestsme = INT_MAX;
|
| @@ -1835,18 +1850,30 @@
|
| sadpb, 1, v_fn_ptr, 1,
|
| &bsi->ref_mv[0]->as_mv,
|
| &new_mv->as_mv);
|
| + if (bestsme < INT_MAX)
|
| + bestsme = vp9_get_mvpred_var(x, &new_mv->as_mv,
|
| + &bsi->ref_mv[0]->as_mv,
|
| + v_fn_ptr, 1);
|
| } else if (cpi->sf.search_method == SQUARE) {
|
| bestsme = vp9_square_search(x, &mvp_full,
|
| step_param,
|
| sadpb, 1, v_fn_ptr, 1,
|
| &bsi->ref_mv[0]->as_mv,
|
| &new_mv->as_mv);
|
| + if (bestsme < INT_MAX)
|
| + bestsme = vp9_get_mvpred_var(x, &new_mv->as_mv,
|
| + &bsi->ref_mv[0]->as_mv,
|
| + v_fn_ptr, 1);
|
| } else if (cpi->sf.search_method == BIGDIA) {
|
| bestsme = vp9_bigdia_search(x, &mvp_full,
|
| step_param,
|
| sadpb, 1, v_fn_ptr, 1,
|
| &bsi->ref_mv[0]->as_mv,
|
| &new_mv->as_mv);
|
| + if (bestsme < INT_MAX)
|
| + bestsme = vp9_get_mvpred_var(x, &new_mv->as_mv,
|
| + &bsi->ref_mv[0]->as_mv,
|
| + v_fn_ptr, 1);
|
| } else {
|
| bestsme = vp9_full_pixel_diamond(cpi, x, &mvp_full, step_param,
|
| sadpb, further_steps, 0, v_fn_ptr,
|
| @@ -1925,55 +1952,43 @@
|
| }
|
|
|
| bsi->rdstat[i][mode_idx].brate =
|
| - labels2mode(x, i, this_mode, &mode_mv[this_mode],
|
| - &second_mode_mv[this_mode], frame_mv, seg_mvs[i],
|
| - bsi->ref_mv[0], bsi->ref_mv[1], x->nmvjointcost,
|
| - x->mvcost, cpi);
|
| + labels2mode(cpi, xd, i, this_mode, mode_mv[this_mode], frame_mv,
|
| + seg_mvs[i], bsi->ref_mv, x->nmvjointcost, x->mvcost);
|
|
|
| -
|
| - bsi->rdstat[i][mode_idx].mvs[0].as_int = mode_mv[this_mode].as_int;
|
| - if (num_4x4_blocks_wide > 1)
|
| - bsi->rdstat[i + 1][mode_idx].mvs[0].as_int =
|
| - mode_mv[this_mode].as_int;
|
| - if (num_4x4_blocks_high > 1)
|
| - bsi->rdstat[i + 2][mode_idx].mvs[0].as_int =
|
| - mode_mv[this_mode].as_int;
|
| - if (has_second_rf) {
|
| - bsi->rdstat[i][mode_idx].mvs[1].as_int =
|
| - second_mode_mv[this_mode].as_int;
|
| + for (ref = 0; ref < 1 + has_second_rf; ++ref) {
|
| + bsi->rdstat[i][mode_idx].mvs[ref].as_int =
|
| + mode_mv[this_mode][ref].as_int;
|
| if (num_4x4_blocks_wide > 1)
|
| - bsi->rdstat[i + 1][mode_idx].mvs[1].as_int =
|
| - second_mode_mv[this_mode].as_int;
|
| + bsi->rdstat[i + 1][mode_idx].mvs[ref].as_int =
|
| + mode_mv[this_mode][ref].as_int;
|
| if (num_4x4_blocks_high > 1)
|
| - bsi->rdstat[i + 2][mode_idx].mvs[1].as_int =
|
| - second_mode_mv[this_mode].as_int;
|
| + bsi->rdstat[i + 2][mode_idx].mvs[ref].as_int =
|
| + mode_mv[this_mode][ref].as_int;
|
| }
|
|
|
| // Trap vectors that reach beyond the UMV borders
|
| - if (mv_check_bounds(x, &mode_mv[this_mode].as_mv) ||
|
| + if (mv_check_bounds(x, &mode_mv[this_mode][0].as_mv) ||
|
| (has_second_rf &&
|
| - mv_check_bounds(x, &second_mode_mv[this_mode].as_mv)))
|
| + mv_check_bounds(x, &mode_mv[this_mode][1].as_mv)))
|
| continue;
|
|
|
| if (filter_idx > 0) {
|
| BEST_SEG_INFO *ref_bsi = bsi_buf;
|
| - subpelmv = mv_has_subpel(&mode_mv[this_mode].as_mv);
|
| - have_ref = mode_mv[this_mode].as_int ==
|
| - ref_bsi->rdstat[i][mode_idx].mvs[0].as_int;
|
| - if (has_second_rf) {
|
| - subpelmv |= mv_has_subpel(&second_mode_mv[this_mode].as_mv);
|
| - have_ref &= second_mode_mv[this_mode].as_int ==
|
| - ref_bsi->rdstat[i][mode_idx].mvs[1].as_int;
|
| + subpelmv = 0;
|
| + have_ref = 1;
|
| +
|
| + for (ref = 0; ref < 1 + has_second_rf; ++ref) {
|
| + subpelmv |= mv_has_subpel(&mode_mv[this_mode][ref].as_mv);
|
| + have_ref &= mode_mv[this_mode][ref].as_int ==
|
| + ref_bsi->rdstat[i][mode_idx].mvs[ref].as_int;
|
| }
|
|
|
| if (filter_idx > 1 && !subpelmv && !have_ref) {
|
| ref_bsi = bsi_buf + 1;
|
| - have_ref = mode_mv[this_mode].as_int ==
|
| - ref_bsi->rdstat[i][mode_idx].mvs[0].as_int;
|
| - if (has_second_rf) {
|
| - have_ref &= second_mode_mv[this_mode].as_int ==
|
| - ref_bsi->rdstat[i][mode_idx].mvs[1].as_int;
|
| - }
|
| + have_ref = 1;
|
| + for (ref = 0; ref < 1 + has_second_rf; ++ref)
|
| + have_ref &= mode_mv[this_mode][ref].as_int ==
|
| + ref_bsi->rdstat[i][mode_idx].mvs[ref].as_int;
|
| }
|
|
|
| if (!subpelmv && have_ref &&
|
| @@ -2034,10 +2049,9 @@
|
| vpx_memcpy(t_above, bsi->rdstat[i][mode_idx].ta, sizeof(t_above));
|
| vpx_memcpy(t_left, bsi->rdstat[i][mode_idx].tl, sizeof(t_left));
|
|
|
| - labels2mode(x, i, mode_selected, &mode_mv[mode_selected],
|
| - &second_mode_mv[mode_selected], frame_mv, seg_mvs[i],
|
| - bsi->ref_mv[0], bsi->ref_mv[1], x->nmvjointcost,
|
| - x->mvcost, cpi);
|
| + labels2mode(cpi, xd, i, mode_selected, mode_mv[mode_selected],
|
| + frame_mv, seg_mvs[i], bsi->ref_mv, x->nmvjointcost,
|
| + x->mvcost);
|
|
|
| br += bsi->rdstat[i][mode_idx].brate;
|
| bd += bsi->rdstat[i][mode_idx].bdist;
|
| @@ -2084,7 +2098,7 @@
|
| int i;
|
| BEST_SEG_INFO *bsi = bsi_buf + filter_idx;
|
| MACROBLOCKD *xd = &x->e_mbd;
|
| - MODE_INFO *mi = xd->mi_8x8[0];
|
| + MODE_INFO *mi = xd->mi[0];
|
| MB_MODE_INFO *mbmi = &mi->mbmi;
|
| int mode_idx;
|
|
|
| @@ -2131,7 +2145,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->mi_8x8[0]->mbmi;
|
| + MB_MODE_INFO *mbmi = &xd->mi[0]->mbmi;
|
| int_mv this_mv;
|
| int i;
|
| int zero_seen = 0;
|
| @@ -2160,10 +2174,9 @@
|
| max_mv = MAX(max_mv,
|
| MAX(abs(this_mv.as_mv.row), abs(this_mv.as_mv.col)) >> 3);
|
| // only need to check zero mv once
|
| - if (!this_mv.as_int && zero_seen) {
|
| - x->mode_sad[ref_frame][i] = x->mode_sad[ref_frame][INTER_OFFSET(ZEROMV)];
|
| + if (!this_mv.as_int && zero_seen)
|
| continue;
|
| - }
|
| +
|
| zero_seen = zero_seen || !this_mv.as_int;
|
|
|
| row_offset = this_mv.as_mv.row >> 3;
|
| @@ -2174,9 +2187,6 @@
|
| this_sad = cpi->fn_ptr[block_size].sdf(src_y_ptr, x->plane[0].src.stride,
|
| ref_y_ptr, ref_y_stride,
|
| 0x7fffffff);
|
| - x->mode_sad[ref_frame][i] = this_sad;
|
| - if (this_mv.as_int == 0)
|
| - x->mode_sad[ref_frame][INTER_OFFSET(ZEROMV)] = this_sad;
|
|
|
| // Note if it is the best so far.
|
| if (this_sad < best_sad) {
|
| @@ -2185,12 +2195,6 @@
|
| }
|
| }
|
|
|
| - if (!zero_seen)
|
| - x->mode_sad[ref_frame][INTER_OFFSET(ZEROMV)] =
|
| - cpi->fn_ptr[block_size].sdf(src_y_ptr, x->plane[0].src.stride,
|
| - ref_y_buffer, ref_y_stride,
|
| - 0x7fffffff);
|
| -
|
| // Note the index of the mv that worked best in the reference list.
|
| x->mv_best_ref_index[ref_frame] = best_index;
|
| x->max_mv_context[ref_frame] = max_mv;
|
| @@ -2271,7 +2275,7 @@
|
| // restored if we decide to encode this way
|
| ctx->skip = x->skip;
|
| ctx->best_mode_index = mode_index;
|
| - ctx->mic = *xd->mi_8x8[0];
|
| + ctx->mic = *xd->mi[0];
|
|
|
| ctx->best_ref_mv[0].as_int = ref_mv->as_int;
|
| ctx->best_ref_mv[1].as_int = second_ref_mv->as_int;
|
| @@ -2322,7 +2326,7 @@
|
| const VP9_COMMON *cm = &cpi->common;
|
| const YV12_BUFFER_CONFIG *yv12 = get_ref_frame_buffer(cpi, ref_frame);
|
| MACROBLOCKD *const xd = &x->e_mbd;
|
| - MODE_INFO *const mi = xd->mi_8x8[0];
|
| + MODE_INFO *const mi = xd->mi[0];
|
| int_mv *const candidates = mi->mbmi.ref_mvs[ref_frame];
|
| const struct scale_factors *const sf = &cm->frame_refs[ref_frame - 1].sf;
|
|
|
| @@ -2331,8 +2335,7 @@
|
| setup_pred_block(xd, yv12_mb[ref_frame], yv12, mi_row, mi_col, sf, sf);
|
|
|
| // Gets an initial list of candidate vectors from neighbours and orders them
|
| - vp9_find_mv_refs(cm, xd, tile, mi, xd->last_mi, ref_frame, candidates,
|
| - mi_row, mi_col);
|
| + vp9_find_mv_refs(cm, xd, tile, mi, ref_frame, candidates, mi_row, mi_col);
|
|
|
| // Candidate refinement carried out at encoder and decoder
|
| vp9_find_best_ref_mvs(xd, cm->allow_high_precision_mv, candidates,
|
| @@ -2355,22 +2358,21 @@
|
| return (scaled_idx != ref_idx) ? &cm->frame_bufs[scaled_idx].buf : NULL;
|
| }
|
|
|
| -static INLINE int get_switchable_rate(const MACROBLOCK *x) {
|
| +int vp9_get_switchable_rate(const MACROBLOCK *x) {
|
| const MACROBLOCKD *const xd = &x->e_mbd;
|
| - const MB_MODE_INFO *const mbmi = &xd->mi_8x8[0]->mbmi;
|
| + const MB_MODE_INFO *const mbmi = &xd->mi[0]->mbmi;
|
| const int ctx = vp9_get_pred_context_switchable_interp(xd);
|
| return SWITCHABLE_INTERP_RATE_FACTOR *
|
| x->switchable_interp_costs[ctx][mbmi->interp_filter];
|
| }
|
|
|
| static void single_motion_search(VP9_COMP *cpi, MACROBLOCK *x,
|
| - const TileInfo *const tile,
|
| BLOCK_SIZE bsize,
|
| int mi_row, int mi_col,
|
| int_mv *tmp_mv, int *rate_mv) {
|
| MACROBLOCKD *xd = &x->e_mbd;
|
| VP9_COMMON *cm = &cpi->common;
|
| - MB_MODE_INFO *mbmi = &xd->mi_8x8[0]->mbmi;
|
| + MB_MODE_INFO *mbmi = &xd->mi[0]->mbmi;
|
| struct buf_2d backup_yv12[MAX_MB_PLANE] = {{0}};
|
| int bestsme = INT_MAX;
|
| int further_steps, step_param;
|
| @@ -2400,7 +2402,7 @@
|
| for (i = 0; i < MAX_MB_PLANE; i++)
|
| backup_yv12[i] = xd->plane[i].pre[0];
|
|
|
| - setup_pre_planes(xd, 0, scaled_ref_frame, mi_row, mi_col, NULL);
|
| + vp9_setup_pre_planes(xd, 0, scaled_ref_frame, mi_row, mi_col, NULL);
|
| }
|
|
|
| vp9_set_mv_search_range(x, &ref_mv);
|
| @@ -2456,22 +2458,41 @@
|
| // Further step/diamond searches as necessary
|
| further_steps = (cpi->sf.max_step_search_steps - 1) - step_param;
|
|
|
| - if (cpi->sf.search_method == FAST_HEX) {
|
| - bestsme = vp9_fast_hex_search(x, &mvp_full, step_param, sadpb,
|
| + if (cpi->sf.search_method == FAST_DIAMOND) {
|
| + bestsme = vp9_fast_dia_search(x, &mvp_full, step_param, sadpb, 0,
|
| &cpi->fn_ptr[bsize], 1,
|
| &ref_mv, &tmp_mv->as_mv);
|
| + if (bestsme < INT_MAX)
|
| + bestsme = vp9_get_mvpred_var(x, &tmp_mv->as_mv, &ref_mv,
|
| + &cpi->fn_ptr[bsize], 1);
|
| + } else if (cpi->sf.search_method == FAST_HEX) {
|
| + bestsme = vp9_fast_hex_search(x, &mvp_full, step_param, sadpb, 0,
|
| + &cpi->fn_ptr[bsize], 1,
|
| + &ref_mv, &tmp_mv->as_mv);
|
| + if (bestsme < INT_MAX)
|
| + bestsme = vp9_get_mvpred_var(x, &tmp_mv->as_mv, &ref_mv,
|
| + &cpi->fn_ptr[bsize], 1);
|
| } else if (cpi->sf.search_method == HEX) {
|
| bestsme = vp9_hex_search(x, &mvp_full, step_param, sadpb, 1,
|
| &cpi->fn_ptr[bsize], 1,
|
| &ref_mv, &tmp_mv->as_mv);
|
| + if (bestsme < INT_MAX)
|
| + bestsme = vp9_get_mvpred_var(x, &tmp_mv->as_mv, &ref_mv,
|
| + &cpi->fn_ptr[bsize], 1);
|
| } else if (cpi->sf.search_method == SQUARE) {
|
| bestsme = vp9_square_search(x, &mvp_full, step_param, sadpb, 1,
|
| &cpi->fn_ptr[bsize], 1,
|
| &ref_mv, &tmp_mv->as_mv);
|
| + if (bestsme < INT_MAX)
|
| + bestsme = vp9_get_mvpred_var(x, &tmp_mv->as_mv, &ref_mv,
|
| + &cpi->fn_ptr[bsize], 1);
|
| } else if (cpi->sf.search_method == BIGDIA) {
|
| bestsme = vp9_bigdia_search(x, &mvp_full, step_param, sadpb, 1,
|
| &cpi->fn_ptr[bsize], 1,
|
| &ref_mv, &tmp_mv->as_mv);
|
| + if (bestsme < INT_MAX)
|
| + bestsme = vp9_get_mvpred_var(x, &tmp_mv->as_mv, &ref_mv,
|
| + &cpi->fn_ptr[bsize], 1);
|
| } else {
|
| bestsme = vp9_full_pixel_diamond(cpi, x, &mvp_full, step_param,
|
| sadpb, further_steps, 1,
|
| @@ -2517,13 +2538,14 @@
|
| const int pw = 4 * num_4x4_blocks_wide_lookup[bsize];
|
| const int ph = 4 * num_4x4_blocks_high_lookup[bsize];
|
| MACROBLOCKD *xd = &x->e_mbd;
|
| - MB_MODE_INFO *mbmi = &xd->mi_8x8[0]->mbmi;
|
| + MB_MODE_INFO *mbmi = &xd->mi[0]->mbmi;
|
| const int refs[2] = { mbmi->ref_frame[0],
|
| mbmi->ref_frame[1] < 0 ? 0 : mbmi->ref_frame[1] };
|
| int_mv ref_mv[2];
|
| int ite, ref;
|
| // Prediction buffer from second frame.
|
| uint8_t *second_pred = vpx_memalign(16, pw * ph * sizeof(uint8_t));
|
| + const InterpKernel *kernel = vp9_get_interp_kernel(mbmi->interp_filter);
|
|
|
| // Do joint motion search in compound mode to get more accurate mv.
|
| struct buf_2d backup_yv12[2][MAX_MB_PLANE];
|
| @@ -2544,7 +2566,8 @@
|
| // motion search code to be used without additional modifications.
|
| for (i = 0; i < MAX_MB_PLANE; i++)
|
| backup_yv12[ref][i] = xd->plane[i].pre[ref];
|
| - setup_pre_planes(xd, ref, scaled_ref_frame[ref], mi_row, mi_col, NULL);
|
| + vp9_setup_pre_planes(xd, ref, scaled_ref_frame[ref], mi_row, mi_col,
|
| + NULL);
|
| }
|
|
|
| frame_mv[refs[ref]].as_int = single_newmv[refs[ref]].as_int;
|
| @@ -2576,7 +2599,7 @@
|
| &frame_mv[refs[!id]].as_mv,
|
| &xd->block_refs[!id]->sf,
|
| pw, ph, 0,
|
| - xd->interp_kernel, MV_PRECISION_Q3,
|
| + kernel, MV_PRECISION_Q3,
|
| mi_col * MI_SIZE, mi_row * MI_SIZE);
|
|
|
| // Compound motion search on first ref frame.
|
| @@ -2597,6 +2620,9 @@
|
| x->nmvjointcost, x->mvcost,
|
| &ref_mv[id].as_mv, second_pred,
|
| pw, ph);
|
| + if (bestsme < INT_MAX)
|
| + bestsme = vp9_get_mvpred_av_var(x, &tmp_mv.as_mv, &ref_mv[id].as_mv,
|
| + second_pred, &cpi->fn_ptr[bsize], 1);
|
|
|
| x->mv_col_min = tmp_col_min;
|
| x->mv_col_max = tmp_col_max;
|
| @@ -2658,7 +2684,6 @@
|
| }
|
|
|
| static int64_t handle_inter_mode(VP9_COMP *cpi, MACROBLOCK *x,
|
| - const TileInfo *const tile,
|
| BLOCK_SIZE bsize,
|
| int64_t txfm_cache[],
|
| int *rate2, int64_t *distortion,
|
| @@ -2674,7 +2699,7 @@
|
| const int64_t ref_best_rd) {
|
| VP9_COMMON *cm = &cpi->common;
|
| MACROBLOCKD *xd = &x->e_mbd;
|
| - MB_MODE_INFO *mbmi = &xd->mi_8x8[0]->mbmi;
|
| + MB_MODE_INFO *mbmi = &xd->mi[0]->mbmi;
|
| const int is_comp_pred = has_second_ref(mbmi);
|
| const int num_refs = is_comp_pred ? 2 : 1;
|
| const int this_mode = mbmi->mode;
|
| @@ -2720,13 +2745,13 @@
|
| *rate2 += rate_mv;
|
| } else {
|
| int_mv tmp_mv;
|
| - single_motion_search(cpi, x, tile, bsize, mi_row, mi_col,
|
| + single_motion_search(cpi, x, bsize, mi_row, mi_col,
|
| &tmp_mv, &rate_mv);
|
| if (tmp_mv.as_int == INVALID_MV)
|
| return INT64_MAX;
|
| *rate2 += rate_mv;
|
| frame_mv[refs[0]].as_int =
|
| - xd->mi_8x8[0]->bmi[0].as_mv[0].as_int = tmp_mv.as_int;
|
| + xd->mi[0]->bmi[0].as_mv[0].as_int = tmp_mv.as_int;
|
| single_newmv[refs[0]].as_int = tmp_mv.as_int;
|
| }
|
| }
|
| @@ -2788,8 +2813,7 @@
|
| int j;
|
| int64_t rs_rd;
|
| mbmi->interp_filter = i;
|
| - xd->interp_kernel = vp9_get_interp_kernel(mbmi->interp_filter);
|
| - rs = get_switchable_rate(x);
|
| + rs = vp9_get_switchable_rate(x);
|
| rs_rd = RDCOST(x->rdmult, x->rddiv, rs, 0);
|
|
|
| if (i > 0 && intpel_mv) {
|
| @@ -2859,8 +2883,7 @@
|
| // Set the appropriate filter
|
| mbmi->interp_filter = cm->interp_filter != SWITCHABLE ?
|
| cm->interp_filter : *best_filter;
|
| - xd->interp_kernel = vp9_get_interp_kernel(mbmi->interp_filter);
|
| - rs = cm->interp_filter == SWITCHABLE ? get_switchable_rate(x) : 0;
|
| + rs = cm->interp_filter == SWITCHABLE ? vp9_get_switchable_rate(x) : 0;
|
|
|
| if (pred_exists) {
|
| if (best_needs_copy) {
|
| @@ -2890,12 +2913,15 @@
|
| }
|
|
|
| if (cm->interp_filter == SWITCHABLE)
|
| - *rate2 += get_switchable_rate(x);
|
| + *rate2 += vp9_get_switchable_rate(x);
|
|
|
| if (!is_comp_pred) {
|
| - if (cpi->active_map_enabled && x->active_ptr[0] == 0)
|
| + if (!x->in_active_map) {
|
| + if (psse)
|
| + *psse = 0;
|
| + *distortion = 0;
|
| x->skip = 1;
|
| - else if (cpi->allow_encode_breakout && x->encode_breakout) {
|
| + } else if (cpi->allow_encode_breakout && x->encode_breakout) {
|
| const BLOCK_SIZE y_size = get_plane_block_size(bsize, &xd->plane[0]);
|
| const BLOCK_SIZE uv_size = get_plane_block_size(bsize, &xd->plane[1]);
|
| unsigned int var, sse;
|
| @@ -2990,7 +3016,7 @@
|
| rdcosty = RDCOST(x->rdmult, x->rddiv, *rate2, *distortion);
|
| rdcosty = MIN(rdcosty, RDCOST(x->rdmult, x->rddiv, 0, *psse));
|
|
|
| - super_block_uvrd(x, rate_uv, distortion_uv, &skippable_uv, &sseuv,
|
| + super_block_uvrd(cpi, x, rate_uv, distortion_uv, &skippable_uv, &sseuv,
|
| bsize, ref_best_rd - rdcosty);
|
| if (*rate_uv == INT_MAX) {
|
| *rate2 = INT_MAX;
|
| @@ -3045,7 +3071,7 @@
|
| TX_SIZE max_uv_tx_size;
|
| x->skip_encode = 0;
|
| ctx->skip = 0;
|
| - xd->mi_8x8[0]->mbmi.ref_frame[0] = INTRA_FRAME;
|
| + xd->mi[0]->mbmi.ref_frame[0] = INTRA_FRAME;
|
|
|
| if (bsize >= BLOCK_8X8) {
|
| if (rd_pick_intra_sby_mode(cpi, x, &rate_y, &rate_y_tokenonly,
|
| @@ -3054,7 +3080,7 @@
|
| *returnrate = INT_MAX;
|
| return;
|
| }
|
| - max_uv_tx_size = get_uv_tx_size_impl(xd->mi_8x8[0]->mbmi.tx_size, bsize);
|
| + max_uv_tx_size = get_uv_tx_size_impl(xd->mi[0]->mbmi.tx_size, bsize);
|
| rd_pick_intra_sbuv_mode(cpi, x, ctx, &rate_uv, &rate_uv_tokenonly,
|
| &dist_uv, &uv_skip, bsize, max_uv_tx_size);
|
| } else {
|
| @@ -3064,7 +3090,7 @@
|
| *returnrate = INT_MAX;
|
| return;
|
| }
|
| - max_uv_tx_size = get_uv_tx_size_impl(xd->mi_8x8[0]->mbmi.tx_size, bsize);
|
| + max_uv_tx_size = get_uv_tx_size_impl(xd->mi[0]->mbmi.tx_size, bsize);
|
| rd_pick_intra_sbuv_mode(cpi, x, ctx, &rate_uv, &rate_uv_tokenonly,
|
| &dist_uv, &uv_skip, BLOCK_8X8, max_uv_tx_size);
|
| }
|
| @@ -3087,7 +3113,7 @@
|
| }
|
| }
|
|
|
| - ctx->mic = *xd->mi_8x8[0];
|
| + ctx->mic = *xd->mi[0];
|
| }
|
|
|
| int64_t vp9_rd_pick_inter_mode_sb(VP9_COMP *cpi, MACROBLOCK *x,
|
| @@ -3100,9 +3126,8 @@
|
| int64_t best_rd_so_far) {
|
| VP9_COMMON *const cm = &cpi->common;
|
| MACROBLOCKD *const xd = &x->e_mbd;
|
| - MB_MODE_INFO *const mbmi = &xd->mi_8x8[0]->mbmi;
|
| + MB_MODE_INFO *const mbmi = &xd->mi[0]->mbmi;
|
| const struct segmentation *const seg = &cm->seg;
|
| - const BLOCK_SIZE block_size = get_plane_block_size(bsize, &xd->plane[0]);
|
| MB_PREDICTION_MODE this_mode;
|
| MV_REFERENCE_FRAME ref_frame, second_ref_frame;
|
| unsigned char segment_id = mbmi->segment_id;
|
| @@ -3120,7 +3145,7 @@
|
| int64_t best_filter_rd[SWITCHABLE_FILTER_CONTEXTS];
|
| int64_t best_filter_diff[SWITCHABLE_FILTER_CONTEXTS];
|
| MB_MODE_INFO best_mbmode = { 0 };
|
| - int mode_index, best_mode_index = 0;
|
| + int mode_index, best_mode_index = -1;
|
| unsigned int ref_costs_single[MAX_REF_FRAMES], ref_costs_comp[MAX_REF_FRAMES];
|
| vp9_prob comp_mode_p;
|
| int64_t best_intra_rd = INT64_MAX;
|
| @@ -3138,12 +3163,13 @@
|
| const int bhs = num_8x8_blocks_high_lookup[bsize] / 2;
|
| int best_skip2 = 0;
|
| int mode_skip_mask = 0;
|
| - const int mode_skip_start = cpi->sf.mode_skip_start + 1;
|
| + int mode_skip_start = cpi->sf.mode_skip_start + 1;
|
| const int *const rd_threshes = cpi->rd_threshes[segment_id][bsize];
|
| const int *const rd_thresh_freq_fact = cpi->rd_thresh_freq_fact[bsize];
|
| const int mode_search_skip_flags = cpi->sf.mode_search_skip_flags;
|
| const int intra_y_mode_mask =
|
| cpi->sf.intra_y_mode_mask[max_txsize_lookup[bsize]];
|
| + int disable_inter_mode_mask = cpi->sf.disable_inter_mode_mask[bsize];
|
|
|
| x->skip_encode = cpi->sf.skip_encode_frame && x->q_index < QIDX_SKIP_THRESH;
|
|
|
| @@ -3167,7 +3193,7 @@
|
| x->pred_mv_sad[ref_frame] = INT_MAX;
|
| if (cpi->ref_frame_flags & flag_list[ref_frame]) {
|
| vp9_setup_buffer_inter(cpi, x, tile,
|
| - ref_frame, block_size, mi_row, mi_col,
|
| + ref_frame, bsize, mi_row, mi_col,
|
| frame_mv[NEARESTMV], frame_mv[NEARMV], yv12_mb);
|
| }
|
| frame_mv[NEWMV][ref_frame].as_int = INVALID_MV;
|
| @@ -3242,6 +3268,24 @@
|
| mode_skip_mask |= new_modes_mask;
|
| }
|
|
|
| + if (bsize > cpi->sf.max_intra_bsize) {
|
| + mode_skip_mask |= 0xFF30808;
|
| + }
|
| +
|
| + if (!x->in_active_map) {
|
| + int mode_index;
|
| + assert(cpi->ref_frame_flags & VP9_LAST_FLAG);
|
| + if (frame_mv[NEARESTMV][LAST_FRAME].as_int == 0)
|
| + mode_index = THR_NEARESTMV;
|
| + else if (frame_mv[NEARMV][LAST_FRAME].as_int == 0)
|
| + mode_index = THR_NEARMV;
|
| + else
|
| + mode_index = THR_ZEROMV;
|
| + mode_skip_mask = ~(1 << mode_index);
|
| + mode_skip_start = MAX_MODES;
|
| + disable_inter_mode_mask = 0;
|
| + }
|
| +
|
| for (mode_index = 0; mode_index < MAX_MODES; ++mode_index) {
|
| int mode_excluded = 0;
|
| int64_t this_rd = INT64_MAX;
|
| @@ -3258,7 +3302,7 @@
|
|
|
| // 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 == mode_skip_start) {
|
| + if (mode_index == mode_skip_start && best_mode_index >= 0) {
|
| switch (vp9_mode_order[best_mode_index].ref_frame[0]) {
|
| case INTRA_FRAME:
|
| break;
|
| @@ -3288,13 +3332,14 @@
|
| this_mode = vp9_mode_order[mode_index].mode;
|
| ref_frame = vp9_mode_order[mode_index].ref_frame[0];
|
| if (ref_frame != INTRA_FRAME &&
|
| - cpi->sf.disable_inter_mode_mask[bsize] & (1 << INTER_OFFSET(this_mode)))
|
| + disable_inter_mode_mask & (1 << INTER_OFFSET(this_mode)))
|
| continue;
|
| second_ref_frame = vp9_mode_order[mode_index].ref_frame[1];
|
|
|
| comp_pred = second_ref_frame > INTRA_FRAME;
|
| if (comp_pred) {
|
| if ((mode_search_skip_flags & FLAG_SKIP_COMP_BESTINTRA) &&
|
| + best_mode_index >=0 &&
|
| vp9_mode_order[best_mode_index].ref_frame[0] == INTRA_FRAME)
|
| continue;
|
| if ((mode_search_skip_flags & FLAG_SKIP_COMP_REFMISMATCH) &&
|
| @@ -3322,7 +3367,8 @@
|
| // one of the neighboring directional modes
|
| if ((mode_search_skip_flags & FLAG_SKIP_INTRA_BESTINTER) &&
|
| (this_mode >= D45_PRED && this_mode <= TM_PRED)) {
|
| - if (vp9_mode_order[best_mode_index].ref_frame[0] > INTRA_FRAME)
|
| + if (best_mode_index >= 0 &&
|
| + vp9_mode_order[best_mode_index].ref_frame[0] > INTRA_FRAME)
|
| continue;
|
| }
|
| if (mode_search_skip_flags & FLAG_SKIP_INTRA_DIRMISMATCH) {
|
| @@ -3331,46 +3377,16 @@
|
| }
|
| }
|
| } else {
|
| - // if we're near/nearest and mv == 0,0, compare to zeromv
|
| - if ((this_mode == NEARMV || this_mode == NEARESTMV ||
|
| - this_mode == ZEROMV) &&
|
| - frame_mv[this_mode][ref_frame].as_int == 0 &&
|
| - !vp9_segfeature_active(&cm->seg, mbmi->segment_id, SEG_LVL_SKIP) &&
|
| - (!comp_pred || frame_mv[this_mode][second_ref_frame].as_int == 0)) {
|
| - int rfc = mbmi->mode_context[ref_frame];
|
| - int c1 = cost_mv_ref(cpi, NEARMV, rfc);
|
| - int c2 = cost_mv_ref(cpi, NEARESTMV, rfc);
|
| - int c3 = cost_mv_ref(cpi, ZEROMV, rfc);
|
| -
|
| - if (this_mode == NEARMV) {
|
| - if (c1 > c3)
|
| - continue;
|
| - } else if (this_mode == NEARESTMV) {
|
| - if (c2 > c3)
|
| - continue;
|
| - } else {
|
| - assert(this_mode == ZEROMV);
|
| - if (!comp_pred) {
|
| - if ((c3 >= c2 &&
|
| - frame_mv[NEARESTMV][ref_frame].as_int == 0) ||
|
| - (c3 >= c1 &&
|
| - frame_mv[NEARMV][ref_frame].as_int == 0))
|
| - continue;
|
| - } else {
|
| - if ((c3 >= c2 &&
|
| - frame_mv[NEARESTMV][ref_frame].as_int == 0 &&
|
| - frame_mv[NEARESTMV][second_ref_frame].as_int == 0) ||
|
| - (c3 >= c1 &&
|
| - frame_mv[NEARMV][ref_frame].as_int == 0 &&
|
| - frame_mv[NEARMV][second_ref_frame].as_int == 0))
|
| - continue;
|
| - }
|
| - }
|
| - }
|
| + if (x->in_active_map &&
|
| + !vp9_segfeature_active(&cm->seg, mbmi->segment_id, SEG_LVL_SKIP))
|
| + if (!check_best_zero_mv(cpi, mbmi->mode_context, frame_mv,
|
| + disable_inter_mode_mask, this_mode, ref_frame,
|
| + second_ref_frame))
|
| + continue;
|
| }
|
|
|
| mbmi->mode = this_mode;
|
| - mbmi->uv_mode = DC_PRED;
|
| + mbmi->uv_mode = x->in_active_map ? DC_PRED : this_mode;
|
| mbmi->ref_frame[0] = ref_frame;
|
| mbmi->ref_frame[1] = second_ref_frame;
|
| // Evaluate all sub-pel filters irrespective of whether we can use
|
| @@ -3379,7 +3395,6 @@
|
| : cm->interp_filter;
|
| x->skip = 0;
|
| set_ref_ptrs(cm, xd, ref_frame, second_ref_frame);
|
| - xd->interp_kernel = vp9_get_interp_kernel(mbmi->interp_filter);
|
|
|
| // Select prediction reference frames.
|
| for (i = 0; i < MAX_MB_PLANE; i++) {
|
| @@ -3422,7 +3437,7 @@
|
| rate2 += intra_cost_penalty;
|
| distortion2 = distortion_y + distortion_uv;
|
| } else {
|
| - this_rd = handle_inter_mode(cpi, x, tile, bsize,
|
| + this_rd = handle_inter_mode(cpi, x, bsize,
|
| tx_cache,
|
| &rate2, &distortion2, &skippable,
|
| &rate_y, &distortion_y,
|
| @@ -3641,7 +3656,7 @@
|
| break;
|
| }
|
|
|
| - if (best_rd >= best_rd_so_far)
|
| + if (best_mode_index < 0 || best_rd >= best_rd_so_far)
|
| return INT64_MAX;
|
|
|
| // If we used an estimate for the uv intra rd in the loop above...
|
| @@ -3671,16 +3686,13 @@
|
| // combination that wins out.
|
| if (cpi->sf.adaptive_rd_thresh) {
|
| for (mode_index = 0; mode_index < MAX_MODES; ++mode_index) {
|
| + int *const fact = &cpi->rd_thresh_freq_fact[bsize][mode_index];
|
| +
|
| if (mode_index == best_mode_index) {
|
| - cpi->rd_thresh_freq_fact[bsize][mode_index] -=
|
| - (cpi->rd_thresh_freq_fact[bsize][mode_index] >> 3);
|
| + *fact -= (*fact >> 3);
|
| } else {
|
| - cpi->rd_thresh_freq_fact[bsize][mode_index] += RD_THRESH_INC;
|
| - if (cpi->rd_thresh_freq_fact[bsize][mode_index] >
|
| - (cpi->sf.adaptive_rd_thresh * RD_THRESH_MAX_FACT)) {
|
| - cpi->rd_thresh_freq_fact[bsize][mode_index] =
|
| - cpi->sf.adaptive_rd_thresh * RD_THRESH_MAX_FACT;
|
| - }
|
| + *fact = MIN(*fact + RD_THRESH_INC,
|
| + cpi->sf.adaptive_rd_thresh * RD_THRESH_MAX_FACT);
|
| }
|
| }
|
| }
|
| @@ -3716,6 +3728,16 @@
|
| vp9_zero(best_tx_diff);
|
| }
|
|
|
| + if (!x->in_active_map) {
|
| + assert(mbmi->ref_frame[0] == LAST_FRAME);
|
| + assert(mbmi->ref_frame[1] == NONE);
|
| + assert(mbmi->mode == NEARESTMV ||
|
| + mbmi->mode == NEARMV ||
|
| + mbmi->mode == ZEROMV);
|
| + assert(frame_mv[mbmi->mode][LAST_FRAME].as_int == 0);
|
| + assert(mbmi->mode == mbmi->uv_mode);
|
| + }
|
| +
|
| set_ref_ptrs(cm, xd, mbmi->ref_frame[0], mbmi->ref_frame[1]);
|
| store_coding_context(x, ctx, best_mode_index,
|
| &mbmi->ref_mvs[mbmi->ref_frame[0]][0],
|
| @@ -3735,11 +3757,10 @@
|
| BLOCK_SIZE bsize,
|
| PICK_MODE_CONTEXT *ctx,
|
| int64_t best_rd_so_far) {
|
| - VP9_COMMON *cm = &cpi->common;
|
| - MACROBLOCKD *xd = &x->e_mbd;
|
| - MB_MODE_INFO *mbmi = &xd->mi_8x8[0]->mbmi;
|
| - const struct segmentation *seg = &cm->seg;
|
| - const BLOCK_SIZE block_size = get_plane_block_size(bsize, &xd->plane[0]);
|
| + VP9_COMMON *const cm = &cpi->common;
|
| + MACROBLOCKD *const xd = &x->e_mbd;
|
| + MB_MODE_INFO *const mbmi = &xd->mi[0]->mbmi;
|
| + const struct segmentation *const seg = &cm->seg;
|
| MV_REFERENCE_FRAME ref_frame, second_ref_frame;
|
| unsigned char segment_id = mbmi->segment_id;
|
| int comp_pred, i;
|
| @@ -3799,7 +3820,7 @@
|
| for (ref_frame = LAST_FRAME; ref_frame <= ALTREF_FRAME; ref_frame++) {
|
| if (cpi->ref_frame_flags & flag_list[ref_frame]) {
|
| vp9_setup_buffer_inter(cpi, x, tile,
|
| - ref_frame, block_size, mi_row, mi_col,
|
| + ref_frame, bsize, mi_row, mi_col,
|
| frame_mv[NEARESTMV], frame_mv[NEARMV],
|
| yv12_mb);
|
| }
|
| @@ -3832,10 +3853,6 @@
|
| int64_t total_sse = INT_MAX;
|
| int early_term = 0;
|
|
|
| - for (i = 0; i < TX_MODES; ++i)
|
| - tx_cache[i] = INT64_MAX;
|
| -
|
| - x->skip = 0;
|
| ref_frame = vp9_ref_order[mode_index].ref_frame[0];
|
| second_ref_frame = vp9_ref_order[mode_index].ref_frame[1];
|
|
|
| @@ -3872,73 +3889,45 @@
|
| cpi->rd_thresh_sub8x8[segment_id][bsize][mode_index] == INT_MAX)
|
| continue;
|
|
|
| - // Do not allow compound prediction if the segment level reference
|
| - // frame feature is in use as in this case there can only be one reference.
|
| - if ((second_ref_frame > INTRA_FRAME) &&
|
| - vp9_segfeature_active(seg, segment_id, SEG_LVL_REF_FRAME))
|
| + if (ref_frame > INTRA_FRAME &&
|
| + !(cpi->ref_frame_flags & flag_list[ref_frame])) {
|
| continue;
|
| -
|
| - mbmi->ref_frame[0] = ref_frame;
|
| - mbmi->ref_frame[1] = second_ref_frame;
|
| -
|
| - if (!(ref_frame == INTRA_FRAME
|
| - || (cpi->ref_frame_flags & flag_list[ref_frame]))) {
|
| - continue;
|
| }
|
| - if (!(second_ref_frame == NONE
|
| - || (cpi->ref_frame_flags & flag_list[second_ref_frame]))) {
|
| - continue;
|
| - }
|
|
|
| comp_pred = second_ref_frame > INTRA_FRAME;
|
| if (comp_pred) {
|
| - if (cpi->sf.mode_search_skip_flags & FLAG_SKIP_COMP_BESTINTRA)
|
| - if (vp9_ref_order[best_mode_index].ref_frame[0] == INTRA_FRAME)
|
| - continue;
|
| - if (cpi->sf.mode_search_skip_flags & FLAG_SKIP_COMP_REFMISMATCH)
|
| - if (ref_frame != best_inter_ref_frame &&
|
| - second_ref_frame != best_inter_ref_frame)
|
| - continue;
|
| + if (!(cpi->ref_frame_flags & flag_list[second_ref_frame]))
|
| + continue;
|
| + // Do not allow compound prediction if the segment level reference frame
|
| + // feature is in use as in this case there can only be one reference.
|
| + if (vp9_segfeature_active(seg, segment_id, SEG_LVL_REF_FRAME))
|
| + continue;
|
| + if ((cpi->sf.mode_search_skip_flags & FLAG_SKIP_COMP_BESTINTRA) &&
|
| + vp9_ref_order[best_mode_index].ref_frame[0] == INTRA_FRAME)
|
| + continue;
|
| + if ((cpi->sf.mode_search_skip_flags & FLAG_SKIP_COMP_REFMISMATCH) &&
|
| + ref_frame != best_inter_ref_frame &&
|
| + second_ref_frame != best_inter_ref_frame)
|
| + continue;
|
| }
|
|
|
| // TODO(jingning, jkoleszar): scaling reference frame not supported for
|
| // sub8x8 blocks.
|
| - if (ref_frame > 0 && vp9_is_scaled(&cm->frame_refs[ref_frame - 1].sf))
|
| + if (ref_frame > NONE && vp9_is_scaled(&cm->frame_refs[ref_frame - 1].sf))
|
| continue;
|
|
|
| - if (second_ref_frame > 0 &&
|
| + if (second_ref_frame > NONE &&
|
| vp9_is_scaled(&cm->frame_refs[second_ref_frame - 1].sf))
|
| continue;
|
|
|
| - set_ref_ptrs(cm, xd, ref_frame, second_ref_frame);
|
| - mbmi->uv_mode = DC_PRED;
|
| -
|
| - // Evaluate all sub-pel filters irrespective of whether we can use
|
| - // them for this frame.
|
| - mbmi->interp_filter = cm->interp_filter == SWITCHABLE ? EIGHTTAP
|
| - : cm->interp_filter;
|
| - xd->interp_kernel = vp9_get_interp_kernel(mbmi->interp_filter);
|
| -
|
| if (comp_pred) {
|
| - if (!(cpi->ref_frame_flags & flag_list[second_ref_frame]))
|
| - continue;
|
| -
|
| mode_excluded = mode_excluded ? mode_excluded
|
| : cm->reference_mode == SINGLE_REFERENCE;
|
| - } else {
|
| - if (ref_frame != INTRA_FRAME && second_ref_frame != INTRA_FRAME) {
|
| - mode_excluded = mode_excluded ?
|
| - mode_excluded : cm->reference_mode == COMPOUND_REFERENCE;
|
| - }
|
| + } else if (ref_frame != INTRA_FRAME) {
|
| + mode_excluded = mode_excluded ? mode_excluded
|
| + : cm->reference_mode == COMPOUND_REFERENCE;
|
| }
|
|
|
| - // Select prediction reference frames.
|
| - for (i = 0; i < MAX_MB_PLANE; i++) {
|
| - xd->plane[i].pre[0] = yv12_mb[ref_frame][i];
|
| - if (comp_pred)
|
| - xd->plane[i].pre[1] = yv12_mb[second_ref_frame][i];
|
| - }
|
| -
|
| // If the segment reference frame feature is enabled....
|
| // then do nothing if the current ref frame is not allowed..
|
| if (vp9_segfeature_active(seg, segment_id, SEG_LVL_REF_FRAME) &&
|
| @@ -3963,6 +3952,27 @@
|
| continue;
|
| }
|
|
|
| + mbmi->tx_size = TX_4X4;
|
| + mbmi->uv_mode = DC_PRED;
|
| + mbmi->ref_frame[0] = ref_frame;
|
| + mbmi->ref_frame[1] = second_ref_frame;
|
| + // Evaluate all sub-pel filters irrespective of whether we can use
|
| + // them for this frame.
|
| + mbmi->interp_filter = cm->interp_filter == SWITCHABLE ? EIGHTTAP
|
| + : cm->interp_filter;
|
| + x->skip = 0;
|
| + set_ref_ptrs(cm, xd, ref_frame, second_ref_frame);
|
| +
|
| + // Select prediction reference frames.
|
| + for (i = 0; i < MAX_MB_PLANE; i++) {
|
| + xd->plane[i].pre[0] = yv12_mb[ref_frame][i];
|
| + if (comp_pred)
|
| + xd->plane[i].pre[1] = yv12_mb[second_ref_frame][i];
|
| + }
|
| +
|
| + for (i = 0; i < TX_MODES; ++i)
|
| + tx_cache[i] = INT64_MAX;
|
| +
|
| #ifdef MODE_TEST_HIT_STATS
|
| // TEST/DEBUG CODE
|
| // Keep a rcord of the number of test hits at each size
|
| @@ -3971,7 +3981,6 @@
|
|
|
| if (ref_frame == INTRA_FRAME) {
|
| int rate;
|
| - 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;
|
| @@ -4016,7 +4025,6 @@
|
| cpi->rd_thresh_sub8x8[segment_id][bsize][THR_ALTR];
|
| this_rd_thresh = (ref_frame == GOLDEN_FRAME) ?
|
| cpi->rd_thresh_sub8x8[segment_id][bsize][THR_GOLD] : this_rd_thresh;
|
| - xd->mi_8x8[0]->mbmi.tx_size = TX_4X4;
|
|
|
| cpi->mask_filter_rd = 0;
|
| for (i = 0; i < SWITCHABLE_FILTER_CONTEXTS; ++i)
|
| @@ -4024,8 +4032,7 @@
|
|
|
| if (cm->interp_filter != BILINEAR) {
|
| tmp_best_filter = EIGHTTAP;
|
| - if (x->source_variance <
|
| - cpi->sf.disable_filter_search_var_thresh) {
|
| + if (x->source_variance < cpi->sf.disable_filter_search_var_thresh) {
|
| tmp_best_filter = EIGHTTAP;
|
| } else if (cpi->sf.adaptive_pred_interp_filter == 1 &&
|
| ctx->pred_interp_filter < SWITCHABLE) {
|
| @@ -4040,7 +4047,6 @@
|
| int newbest, rs;
|
| int64_t rs_rd;
|
| mbmi->interp_filter = switchable_filter_index;
|
| - xd->interp_kernel = vp9_get_interp_kernel(mbmi->interp_filter);
|
| tmp_rd = rd_pick_best_mbsegmentation(cpi, x, tile,
|
| &mbmi->ref_mvs[ref_frame][0],
|
| second_ref,
|
| @@ -4053,7 +4059,7 @@
|
|
|
| if (tmp_rd == INT64_MAX)
|
| continue;
|
| - rs = get_switchable_rate(x);
|
| + rs = vp9_get_switchable_rate(x);
|
| rs_rd = RDCOST(x->rdmult, x->rddiv, rs, 0);
|
| cpi->rd_filter_cache[switchable_filter_index] = tmp_rd;
|
| cpi->rd_filter_cache[SWITCHABLE_FILTERS] =
|
| @@ -4080,7 +4086,7 @@
|
| tmp_best_skippable = skippable;
|
| tmp_best_mbmode = *mbmi;
|
| for (i = 0; i < 4; i++) {
|
| - tmp_best_bmodes[i] = xd->mi_8x8[0]->bmi[i];
|
| + tmp_best_bmodes[i] = xd->mi[0]->bmi[i];
|
| x->zcoeff_blk[TX_4X4][i] = !x->plane[0].eobs[i];
|
| }
|
| pred_exists = 1;
|
| @@ -4105,7 +4111,6 @@
|
|
|
| mbmi->interp_filter = (cm->interp_filter == SWITCHABLE ?
|
| tmp_best_filter : cm->interp_filter);
|
| - xd->interp_kernel = vp9_get_interp_kernel(mbmi->interp_filter);
|
| if (!pred_exists) {
|
| // Handles the special case when a filter that is not in the
|
| // switchable list (bilinear, 6-tap) is indicated at the frame level
|
| @@ -4128,14 +4133,14 @@
|
| skippable = tmp_best_skippable;
|
| *mbmi = tmp_best_mbmode;
|
| for (i = 0; i < 4; i++)
|
| - xd->mi_8x8[0]->bmi[i] = tmp_best_bmodes[i];
|
| + xd->mi[0]->bmi[i] = tmp_best_bmodes[i];
|
| }
|
|
|
| rate2 += rate;
|
| distortion2 += distortion;
|
|
|
| if (cm->interp_filter == SWITCHABLE)
|
| - rate2 += get_switchable_rate(x);
|
| + rate2 += vp9_get_switchable_rate(x);
|
|
|
| if (!mode_excluded)
|
| mode_excluded = comp_pred ? cm->reference_mode == SINGLE_REFERENCE
|
| @@ -4152,7 +4157,7 @@
|
| // then dont bother looking at UV
|
| vp9_build_inter_predictors_sbuv(&x->e_mbd, mi_row, mi_col,
|
| BLOCK_8X8);
|
| - super_block_uvrd(x, &rate_uv, &distortion_uv, &uv_skippable,
|
| + super_block_uvrd(cpi, x, &rate_uv, &distortion_uv, &uv_skippable,
|
| &uv_sse, BLOCK_8X8, tmp_best_rdu);
|
| if (rate_uv == INT_MAX)
|
| continue;
|
| @@ -4212,8 +4217,8 @@
|
| }
|
|
|
| // Keep record of best inter rd with single reference
|
| - if (is_inter_block(&xd->mi_8x8[0]->mbmi) &&
|
| - !has_second_ref(&xd->mi_8x8[0]->mbmi) &&
|
| + if (is_inter_block(mbmi) &&
|
| + !has_second_ref(mbmi) &&
|
| !mode_excluded &&
|
| this_rd < best_inter_rd) {
|
| best_inter_rd = this_rd;
|
| @@ -4249,11 +4254,11 @@
|
| best_skip2 = this_skip2;
|
| if (!x->select_txfm_size)
|
| swap_block_ptr(x, ctx, max_plane);
|
| - vpx_memcpy(ctx->zcoeff_blk, x->zcoeff_blk[mbmi->tx_size],
|
| + vpx_memcpy(ctx->zcoeff_blk, x->zcoeff_blk[TX_4X4],
|
| sizeof(uint8_t) * ctx->num_4x4_blk);
|
|
|
| for (i = 0; i < 4; i++)
|
| - best_bmodes[i] = xd->mi_8x8[0]->bmi[i];
|
| + best_bmodes[i] = xd->mi[0]->bmi[i];
|
|
|
| // TODO(debargha): enhance this test with a better distortion prediction
|
| // based on qp, activity mask and history
|
| @@ -4289,11 +4294,9 @@
|
| single_rd = RDCOST(x->rdmult, x->rddiv, single_rate, distortion2);
|
| hybrid_rd = RDCOST(x->rdmult, x->rddiv, hybrid_rate, distortion2);
|
|
|
| - if (second_ref_frame <= INTRA_FRAME &&
|
| - single_rd < best_pred_rd[SINGLE_REFERENCE]) {
|
| + if (!comp_pred && single_rd < best_pred_rd[SINGLE_REFERENCE]) {
|
| best_pred_rd[SINGLE_REFERENCE] = single_rd;
|
| - } else if (second_ref_frame > INTRA_FRAME &&
|
| - single_rd < best_pred_rd[COMPOUND_REFERENCE]) {
|
| + } else if (comp_pred && single_rd < best_pred_rd[COMPOUND_REFERENCE]) {
|
| best_pred_rd[COMPOUND_REFERENCE] = single_rd;
|
| }
|
| if (hybrid_rd < best_pred_rd[REFERENCE_MODE_SELECT])
|
| @@ -4324,13 +4327,9 @@
|
| }
|
|
|
| /* keep record of best txfm size */
|
| - if (bsize < BLOCK_32X32) {
|
| - if (bsize < BLOCK_16X16) {
|
| - tx_cache[ALLOW_8X8] = tx_cache[ONLY_4X4];
|
| - tx_cache[ALLOW_16X16] = tx_cache[ALLOW_8X8];
|
| - }
|
| - tx_cache[ALLOW_32X32] = tx_cache[ALLOW_16X16];
|
| - }
|
| + 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 && tx_cache[i] < INT64_MAX; i++) {
|
| int64_t adj_rd = INT64_MAX;
|
| @@ -4369,7 +4368,7 @@
|
| }
|
| }
|
|
|
| - if (best_rd == INT64_MAX && bsize < BLOCK_8X8) {
|
| + if (best_rd == INT64_MAX) {
|
| *returnrate = INT_MAX;
|
| *returndistortion = INT64_MAX;
|
| return best_rd;
|
| @@ -4386,16 +4385,13 @@
|
| // combination that wins out.
|
| if (cpi->sf.adaptive_rd_thresh) {
|
| for (mode_index = 0; mode_index < MAX_REFS; ++mode_index) {
|
| + int *const fact = &cpi->rd_thresh_freq_sub8x8[bsize][mode_index];
|
| +
|
| if (mode_index == best_mode_index) {
|
| - cpi->rd_thresh_freq_sub8x8[bsize][mode_index] -=
|
| - (cpi->rd_thresh_freq_sub8x8[bsize][mode_index] >> 3);
|
| + *fact -= (*fact >> 3);
|
| } else {
|
| - cpi->rd_thresh_freq_sub8x8[bsize][mode_index] += RD_THRESH_INC;
|
| - if (cpi->rd_thresh_freq_sub8x8[bsize][mode_index] >
|
| - (cpi->sf.adaptive_rd_thresh * RD_THRESH_MAX_FACT)) {
|
| - cpi->rd_thresh_freq_sub8x8[bsize][mode_index] =
|
| - cpi->sf.adaptive_rd_thresh * RD_THRESH_MAX_FACT;
|
| - }
|
| + *fact = MIN(*fact + RD_THRESH_INC,
|
| + cpi->sf.adaptive_rd_thresh * RD_THRESH_MAX_FACT);
|
| }
|
| }
|
| }
|
| @@ -4405,13 +4401,13 @@
|
| x->skip |= best_skip2;
|
| if (!is_inter_block(&best_mbmode)) {
|
| for (i = 0; i < 4; i++)
|
| - xd->mi_8x8[0]->bmi[i].as_mode = best_bmodes[i].as_mode;
|
| + xd->mi[0]->bmi[i].as_mode = best_bmodes[i].as_mode;
|
| } else {
|
| for (i = 0; i < 4; ++i)
|
| - vpx_memcpy(&xd->mi_8x8[0]->bmi[i], &best_bmodes[i], sizeof(b_mode_info));
|
| + vpx_memcpy(&xd->mi[0]->bmi[i], &best_bmodes[i], sizeof(b_mode_info));
|
|
|
| - mbmi->mv[0].as_int = xd->mi_8x8[0]->bmi[3].as_mv[0].as_int;
|
| - mbmi->mv[1].as_int = xd->mi_8x8[0]->bmi[3].as_mv[1].as_int;
|
| + mbmi->mv[0].as_int = xd->mi[0]->bmi[3].as_mv[0].as_int;
|
| + mbmi->mv[1].as_int = xd->mi[0]->bmi[3].as_mv[1].as_int;
|
| }
|
|
|
| for (i = 0; i < REFERENCE_MODES; ++i) {
|
| @@ -4430,11 +4426,6 @@
|
| }
|
| if (cm->interp_filter == SWITCHABLE)
|
| assert(best_filter_diff[SWITCHABLE_FILTERS] == 0);
|
| - } else {
|
| - vp9_zero(best_filter_diff);
|
| - }
|
| -
|
| - if (!x->skip) {
|
| for (i = 0; i < TX_MODES; i++) {
|
| if (best_tx_rd[i] == INT64_MAX)
|
| best_tx_diff[i] = 0;
|
| @@ -4442,6 +4433,7 @@
|
| best_tx_diff[i] = best_rd - best_tx_rd[i];
|
| }
|
| } else {
|
| + vp9_zero(best_filter_diff);
|
| vp9_zero(best_tx_diff);
|
| }
|
|
|
|
|