| Index: source/libvpx/vp9/encoder/vp9_rdopt.c
|
| ===================================================================
|
| --- source/libvpx/vp9/encoder/vp9_rdopt.c (revision 240950)
|
| +++ source/libvpx/vp9/encoder/vp9_rdopt.c (working copy)
|
| @@ -17,8 +17,6 @@
|
| #include "vp9/encoder/vp9_tokenize.h"
|
| #include "vp9/encoder/vp9_treewriter.h"
|
| #include "vp9/encoder/vp9_onyx_int.h"
|
| -#include "vp9/encoder/vp9_modecosts.h"
|
| -#include "vp9/encoder/vp9_encodeintra.h"
|
| #include "vp9/common/vp9_entropymode.h"
|
| #include "vp9/common/vp9_reconinter.h"
|
| #include "vp9/common/vp9_reconintra.h"
|
| @@ -115,23 +113,60 @@
|
| #define MV_COST_WEIGHT 108
|
| #define MV_COST_WEIGHT_SUB 120
|
|
|
| +static int raster_block_offset(BLOCK_SIZE plane_bsize,
|
| + int raster_block, int stride) {
|
| + const int bw = b_width_log2(plane_bsize);
|
| + const int y = 4 * (raster_block >> bw);
|
| + const int x = 4 * (raster_block & ((1 << bw) - 1));
|
| + return y * stride + x;
|
| +}
|
| +static int16_t* raster_block_offset_int16(BLOCK_SIZE plane_bsize,
|
| + int raster_block, int16_t *base) {
|
| + const int stride = 4 * num_4x4_blocks_wide_lookup[plane_bsize];
|
| + return base + raster_block_offset(plane_bsize, raster_block, stride);
|
| +}
|
| +
|
| +static void fill_mode_costs(VP9_COMP *c) {
|
| + VP9_COMMON *const cm = &c->common;
|
| + int i, j;
|
| +
|
| + for (i = 0; i < INTRA_MODES; i++)
|
| + for (j = 0; j < INTRA_MODES; j++)
|
| + vp9_cost_tokens((int *)c->mb.y_mode_costs[i][j], vp9_kf_y_mode_prob[i][j],
|
| + vp9_intra_mode_tree);
|
| +
|
| + // TODO(rbultje) separate tables for superblock costing?
|
| + vp9_cost_tokens(c->mb.mbmode_cost, cm->fc.y_mode_prob[1],
|
| + vp9_intra_mode_tree);
|
| + vp9_cost_tokens(c->mb.intra_uv_mode_cost[1],
|
| + cm->fc.uv_mode_prob[INTRA_MODES - 1], vp9_intra_mode_tree);
|
| + vp9_cost_tokens(c->mb.intra_uv_mode_cost[0],
|
| + vp9_kf_uv_mode_prob[INTRA_MODES - 1],
|
| + vp9_intra_mode_tree);
|
| +
|
| + for (i = 0; i < SWITCHABLE_FILTER_CONTEXTS; ++i)
|
| + vp9_cost_tokens((int *)c->mb.switchable_interp_costs[i],
|
| + cm->fc.switchable_interp_prob[i],
|
| + vp9_switchable_interp_tree);
|
| +}
|
| +
|
| static void fill_token_costs(vp9_coeff_cost *c,
|
| - vp9_coeff_probs_model (*p)[BLOCK_TYPES]) {
|
| + vp9_coeff_probs_model (*p)[PLANE_TYPES]) {
|
| int i, j, k, l;
|
| TX_SIZE t;
|
| - for (t = TX_4X4; t <= TX_32X32; t++)
|
| - for (i = 0; i < BLOCK_TYPES; i++)
|
| - for (j = 0; j < REF_TYPES; j++)
|
| - for (k = 0; k < COEF_BANDS; k++)
|
| - for (l = 0; l < PREV_COEF_CONTEXTS; l++) {
|
| + for (t = TX_4X4; t <= TX_32X32; ++t)
|
| + for (i = 0; i < PLANE_TYPES; ++i)
|
| + for (j = 0; j < REF_TYPES; ++j)
|
| + for (k = 0; k < COEF_BANDS; ++k)
|
| + for (l = 0; l < BAND_COEFF_CONTEXTS(k); ++l) {
|
| vp9_prob probs[ENTROPY_NODES];
|
| vp9_model_to_full_probs(p[t][i][j][k][l], probs);
|
| vp9_cost_tokens((int *)c[t][i][j][k][0][l], probs,
|
| vp9_coef_tree);
|
| vp9_cost_tokens_skip((int *)c[t][i][j][k][1][l], probs,
|
| vp9_coef_tree);
|
| - assert(c[t][i][j][k][0][l][DCT_EOB_TOKEN] ==
|
| - c[t][i][j][k][1][l][DCT_EOB_TOKEN]);
|
| + assert(c[t][i][j][k][0][l][EOB_TOKEN] ==
|
| + c[t][i][j][k][1][l][EOB_TOKEN]);
|
| }
|
| }
|
|
|
| @@ -246,17 +281,20 @@
|
|
|
| vp9_set_speed_features(cpi);
|
|
|
| + cpi->mb.select_txfm_size = (cpi->sf.tx_size_search_method == USE_LARGESTALL &&
|
| + cm->frame_type != KEY_FRAME) ?
|
| + 0 : 1;
|
| +
|
| set_block_thresholds(cpi);
|
|
|
| fill_token_costs(cpi->mb.token_costs, cm->fc.coef_probs);
|
|
|
| for (i = 0; i < PARTITION_CONTEXTS; i++)
|
| - vp9_cost_tokens(cpi->mb.partition_cost[i],
|
| - cm->fc.partition_prob[cm->frame_type][i],
|
| + vp9_cost_tokens(cpi->mb.partition_cost[i], get_partition_probs(cm, i),
|
| vp9_partition_tree);
|
|
|
| /*rough estimate for costing*/
|
| - vp9_init_mode_costs(cpi);
|
| + fill_mode_costs(cpi);
|
|
|
| if (!frame_is_intra_only(cm)) {
|
| vp9_build_nmv_cost_table(
|
| @@ -265,15 +303,9 @@
|
| &cm->fc.nmvc,
|
| cm->allow_high_precision_mv, 1, 1);
|
|
|
| - for (i = 0; i < INTER_MODE_CONTEXTS; i++) {
|
| - MB_PREDICTION_MODE m;
|
| -
|
| - for (m = NEARESTMV; m < MB_MODE_COUNT; m++)
|
| - cpi->mb.inter_mode_cost[i][inter_mode_offset(m)] =
|
| - cost_token(vp9_inter_mode_tree,
|
| - cm->fc.inter_mode_probs[i],
|
| - &vp9_inter_mode_encodings[inter_mode_offset(m)]);
|
| - }
|
| + for (i = 0; i < INTER_MODE_CONTEXTS; ++i)
|
| + vp9_cost_tokens((int *)cpi->mb.inter_mode_cost[i],
|
| + cm->fc.inter_mode_probs[i], vp9_inter_mode_tree);
|
| }
|
| }
|
|
|
| @@ -489,13 +521,14 @@
|
| const int16_t *scan, const int16_t *nb) {
|
| 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];
|
| const PLANE_TYPE type = pd->plane_type;
|
| const int16_t *band_count = &band_counts[tx_size][1];
|
| - const int eob = pd->eobs[block];
|
| - const int16_t *const qcoeff_ptr = BLOCK_OFFSET(pd->qcoeff, block);
|
| + const int eob = p->eobs[block];
|
| + const int16_t *const qcoeff_ptr = BLOCK_OFFSET(p->qcoeff, block);
|
| const int ref = mbmi->ref_frame[0] != INTRA_FRAME;
|
| - unsigned int (*token_costs)[2][PREV_COEF_CONTEXTS][MAX_ENTROPY_TOKENS] =
|
| + unsigned int (*token_costs)[2][COEFF_CONTEXTS][ENTROPY_TOKENS] =
|
| x->token_costs[tx_size][type][ref];
|
| const ENTROPY_CONTEXT above_ec = !!*A, left_ec = !!*L;
|
| uint8_t *p_tok = x->token_cache;
|
| @@ -503,12 +536,12 @@
|
| int c, cost;
|
|
|
| // Check for consistency of tx_size with mode info
|
| - assert(type == PLANE_TYPE_Y_WITH_DC ? mbmi->tx_size == tx_size
|
| + assert(type == PLANE_TYPE_Y ? mbmi->tx_size == tx_size
|
| : get_uv_tx_size(mbmi) == tx_size);
|
|
|
| if (eob == 0) {
|
| // single eob token
|
| - cost = token_costs[0][0][pt][DCT_EOB_TOKEN];
|
| + cost = token_costs[0][0][pt][EOB_TOKEN];
|
| c = 0;
|
| } else {
|
| int band_left = *band_count++;
|
| @@ -540,7 +573,7 @@
|
| // eob token
|
| if (band_left) {
|
| pt = get_coef_context(nb, p_tok, c);
|
| - cost += (*token_costs)[0][pt][DCT_EOB_TOKEN];
|
| + cost += (*token_costs)[0][pt][EOB_TOKEN];
|
| }
|
| }
|
|
|
| @@ -565,8 +598,7 @@
|
| &this_sse) >> shift;
|
| args->sse = this_sse >> shift;
|
|
|
| - if (x->skip_encode &&
|
| - xd->mi_8x8[0]->mbmi.ref_frame[0] == INTRA_FRAME) {
|
| + if (x->skip_encode && !is_inter_block(&xd->mi_8x8[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);
|
| @@ -587,8 +619,8 @@
|
| args->scan, args->nb);
|
| }
|
|
|
| -static void block_yrd_txfm(int plane, int block, BLOCK_SIZE plane_bsize,
|
| - TX_SIZE tx_size, void *arg) {
|
| +static void block_rd_txfm(int plane, int block, BLOCK_SIZE plane_bsize,
|
| + TX_SIZE tx_size, void *arg) {
|
| struct rdcost_block_args *args = arg;
|
| MACROBLOCK *const x = args->x;
|
| MACROBLOCKD *const xd = &x->e_mbd;
|
| @@ -611,7 +643,8 @@
|
| // TODO(jingning): temporarily enabled only for luma component
|
| rd = MIN(rd1, rd2);
|
| if (plane == 0)
|
| - x->zcoeff_blk[tx_size][block] = rd1 > rd2 || !xd->plane[plane].eobs[block];
|
| + x->zcoeff_blk[tx_size][block] = !x->plane[plane].eobs[block] ||
|
| + (rd1 > rd2 && !xd->lossless);
|
|
|
| args->this_rate += args->rate;
|
| args->this_dist += args->dist;
|
| @@ -653,7 +686,7 @@
|
| t_left[i] = !!*(const uint64_t *)&left[i];
|
| break;
|
| default:
|
| - assert(!"Invalid transform size.");
|
| + assert(0 && "Invalid transform size.");
|
| }
|
| }
|
|
|
| @@ -680,6 +713,7 @@
|
| const BLOCK_SIZE bs = get_plane_block_size(bsize, pd);
|
| const int num_4x4_w = num_4x4_blocks_wide_lookup[bs];
|
| const int num_4x4_h = num_4x4_blocks_high_lookup[bs];
|
| + const scan_order *so;
|
|
|
| init_rdcost_stack(x, tx_size, num_4x4_w, num_4x4_h,
|
| ref_best_rd, rd_stack);
|
| @@ -690,10 +724,12 @@
|
| pd->above_context, pd->left_context,
|
| num_4x4_w, num_4x4_h);
|
|
|
| - get_scan(xd, tx_size, pd->plane_type, 0, &rd_stack->scan, &rd_stack->nb);
|
| + so = get_scan(xd, tx_size, pd->plane_type, 0);
|
| + rd_stack->scan = so->scan;
|
| + rd_stack->nb = so->neighbors;
|
|
|
| foreach_transformed_block_in_plane(xd, bsize, plane,
|
| - block_yrd_txfm, rd_stack);
|
| + block_rd_txfm, rd_stack);
|
| if (rd_stack->skip) {
|
| *rate = INT_MAX;
|
| *distortion = INT64_MAX;
|
| @@ -703,7 +739,7 @@
|
| *distortion = rd_stack->this_dist;
|
| *rate = rd_stack->this_rate;
|
| *sse = rd_stack->this_sse;
|
| - *skippable = vp9_is_skippable_in_plane(xd, bsize, plane);
|
| + *skippable = vp9_is_skippable_in_plane(x, bsize, plane);
|
| }
|
| }
|
|
|
| @@ -736,64 +772,47 @@
|
| VP9_COMMON *const cm = &cpi->common;
|
| MACROBLOCKD *const xd = &x->e_mbd;
|
| MB_MODE_INFO *const mbmi = &xd->mi_8x8[0]->mbmi;
|
| - vp9_prob skip_prob = vp9_get_pred_prob_mbskip(cm, xd);
|
| + vp9_prob skip_prob = vp9_get_skip_prob(cm, xd);
|
| int64_t rd[TX_SIZES][2];
|
| int n, m;
|
| int s0, s1;
|
| + const TX_SIZE max_mode_tx_size = tx_mode_to_biggest_tx_size[cm->tx_mode];
|
| + int64_t best_rd = INT64_MAX;
|
| + TX_SIZE best_tx = TX_4X4;
|
|
|
| - const vp9_prob *tx_probs = get_tx_probs2(xd, &cm->fc.tx_probs, xd->mi_8x8[0]);
|
| -
|
| - for (n = TX_4X4; n <= max_tx_size; n++) {
|
| - r[n][1] = r[n][0];
|
| - if (r[n][0] == INT_MAX)
|
| - continue;
|
| - for (m = 0; m <= n - (n == max_tx_size); m++) {
|
| - if (m == n)
|
| - r[n][1] += vp9_cost_zero(tx_probs[m]);
|
| - else
|
| - r[n][1] += vp9_cost_one(tx_probs[m]);
|
| - }
|
| - }
|
| -
|
| + const vp9_prob *tx_probs = get_tx_probs2(max_tx_size, xd, &cm->fc.tx_probs);
|
| assert(skip_prob > 0);
|
| s0 = vp9_cost_bit(skip_prob, 0);
|
| s1 = vp9_cost_bit(skip_prob, 1);
|
|
|
| for (n = TX_4X4; n <= max_tx_size; n++) {
|
| + r[n][1] = r[n][0];
|
| + if (r[n][0] < INT_MAX) {
|
| + for (m = 0; m <= n - (n == max_tx_size); m++) {
|
| + if (m == n)
|
| + r[n][1] += vp9_cost_zero(tx_probs[m]);
|
| + else
|
| + r[n][1] += vp9_cost_one(tx_probs[m]);
|
| + }
|
| + }
|
| if (d[n] == INT64_MAX) {
|
| rd[n][0] = rd[n][1] = INT64_MAX;
|
| - continue;
|
| - }
|
| - if (s[n]) {
|
| + } else if (s[n]) {
|
| rd[n][0] = rd[n][1] = RDCOST(x->rdmult, x->rddiv, s1, d[n]);
|
| } else {
|
| rd[n][0] = RDCOST(x->rdmult, x->rddiv, r[n][0] + s0, d[n]);
|
| rd[n][1] = RDCOST(x->rdmult, x->rddiv, r[n][1] + s0, d[n]);
|
| }
|
| - }
|
|
|
| - if (max_tx_size == TX_32X32 &&
|
| - (cm->tx_mode == ALLOW_32X32 ||
|
| - (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->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->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->tx_size = TX_8X8;
|
| - } else {
|
| - mbmi->tx_size = TX_4X4;
|
| + if (rd[n][1] < best_rd) {
|
| + best_tx = n;
|
| + best_rd = rd[n][1];
|
| + }
|
| }
|
| + mbmi->tx_size = cm->tx_mode == TX_MODE_SELECT ?
|
| + best_tx : MIN(max_tx_size, max_mode_tx_size);
|
|
|
| +
|
| *distortion = d[mbmi->tx_size];
|
| *rate = r[mbmi->tx_size][cm->tx_mode == TX_MODE_SELECT];
|
| *skip = s[mbmi->tx_size];
|
| @@ -802,29 +821,18 @@
|
| tx_cache[ALLOW_8X8] = rd[TX_8X8][0];
|
| tx_cache[ALLOW_16X16] = rd[MIN(max_tx_size, TX_16X16)][0];
|
| tx_cache[ALLOW_32X32] = rd[MIN(max_tx_size, TX_32X32)][0];
|
| - if (max_tx_size == TX_32X32 &&
|
| - rd[TX_32X32][1] < rd[TX_16X16][1] && rd[TX_32X32][1] < rd[TX_8X8][1] &&
|
| - rd[TX_32X32][1] < rd[TX_4X4][1])
|
| - tx_cache[TX_MODE_SELECT] = rd[TX_32X32][1];
|
| - else if (max_tx_size >= TX_16X16 &&
|
| - rd[TX_16X16][1] < rd[TX_8X8][1] && rd[TX_16X16][1] < rd[TX_4X4][1])
|
| - tx_cache[TX_MODE_SELECT] = rd[TX_16X16][1];
|
| - else
|
| - tx_cache[TX_MODE_SELECT] = rd[TX_4X4][1] < rd[TX_8X8][1] ?
|
| - rd[TX_4X4][1] : rd[TX_8X8][1];
|
|
|
| - if (max_tx_size == TX_32X32 &&
|
| - rd[TX_32X32][1] < rd[TX_16X16][1] &&
|
| - rd[TX_32X32][1] < rd[TX_8X8][1] &&
|
| - rd[TX_32X32][1] < rd[TX_4X4][1]) {
|
| + if (max_tx_size == TX_32X32 && best_tx == TX_32X32) {
|
| + tx_cache[TX_MODE_SELECT] = rd[TX_32X32][1];
|
| cpi->tx_stepdown_count[0]++;
|
| - } else if (max_tx_size >= TX_16X16 &&
|
| - rd[TX_16X16][1] < rd[TX_8X8][1] &&
|
| - rd[TX_16X16][1] < rd[TX_4X4][1]) {
|
| + } else if (max_tx_size >= TX_16X16 && best_tx == TX_16X16) {
|
| + tx_cache[TX_MODE_SELECT] = rd[TX_16X16][1];
|
| cpi->tx_stepdown_count[max_tx_size - TX_16X16]++;
|
| } else if (rd[TX_8X8][1] < rd[TX_4X4][1]) {
|
| + tx_cache[TX_MODE_SELECT] = rd[TX_8X8][1];
|
| cpi->tx_stepdown_count[max_tx_size - TX_8X8]++;
|
| } else {
|
| + tx_cache[TX_MODE_SELECT] = rd[TX_4X4][1];
|
| cpi->tx_stepdown_count[max_tx_size - TX_4X4]++;
|
| }
|
| }
|
| @@ -839,19 +847,22 @@
|
| VP9_COMMON *const cm = &cpi->common;
|
| MACROBLOCKD *const xd = &x->e_mbd;
|
| MB_MODE_INFO *const mbmi = &xd->mi_8x8[0]->mbmi;
|
| - vp9_prob skip_prob = vp9_get_pred_prob_mbskip(cm, xd);
|
| + vp9_prob skip_prob = vp9_get_skip_prob(cm, xd);
|
| int64_t rd[TX_SIZES][2];
|
| int n, m;
|
| int s0, s1;
|
| 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 TX_SIZE max_mode_tx_size = tx_mode_to_biggest_tx_size[cm->tx_mode];
|
| + int64_t best_rd = INT64_MAX;
|
| + TX_SIZE best_tx = TX_4X4;
|
|
|
| - const vp9_prob *tx_probs = get_tx_probs2(xd, &cm->fc.tx_probs, xd->mi_8x8[0]);
|
| + const vp9_prob *tx_probs = get_tx_probs2(max_tx_size, xd, &cm->fc.tx_probs);
|
| + assert(skip_prob > 0);
|
| + s0 = vp9_cost_bit(skip_prob, 0);
|
| + s1 = vp9_cost_bit(skip_prob, 1);
|
|
|
| - // for (n = TX_4X4; n <= max_txfm_size; n++)
|
| - // r[n][0] = (r[n][0] * scale_r[n]);
|
| -
|
| for (n = TX_4X4; n <= max_tx_size; n++) {
|
| + double scale = scale_rd[n];
|
| r[n][1] = r[n][0];
|
| for (m = 0; m <= n - (n == max_tx_size); m++) {
|
| if (m == n)
|
| @@ -859,62 +870,29 @@
|
| else
|
| r[n][1] += vp9_cost_one(tx_probs[m]);
|
| }
|
| - }
|
| -
|
| - assert(skip_prob > 0);
|
| - s0 = vp9_cost_bit(skip_prob, 0);
|
| - s1 = vp9_cost_bit(skip_prob, 1);
|
| -
|
| - for (n = TX_4X4; n <= max_tx_size; n++) {
|
| if (s[n]) {
|
| - rd[n][0] = rd[n][1] = RDCOST(x->rdmult, x->rddiv, s1, d[n]);
|
| + rd[n][0] = rd[n][1] = RDCOST(x->rdmult, x->rddiv, s1, d[n]) * scale;
|
| } else {
|
| - rd[n][0] = RDCOST(x->rdmult, x->rddiv, r[n][0] + s0, d[n]);
|
| - rd[n][1] = RDCOST(x->rdmult, x->rddiv, r[n][1] + s0, d[n]);
|
| + rd[n][0] = RDCOST(x->rdmult, x->rddiv, r[n][0] + s0, d[n]) * scale;
|
| + rd[n][1] = RDCOST(x->rdmult, x->rddiv, r[n][1] + s0, d[n]) * scale;
|
| }
|
| + if (rd[n][1] < best_rd) {
|
| + best_rd = rd[n][1];
|
| + best_tx = n;
|
| + }
|
| }
|
| - for (n = TX_4X4; n <= max_tx_size; n++) {
|
| - rd[n][0] = (int64_t)(scale_rd[n] * rd[n][0]);
|
| - rd[n][1] = (int64_t)(scale_rd[n] * rd[n][1]);
|
| - }
|
|
|
| - if (max_tx_size == TX_32X32 &&
|
| - (cm->tx_mode == ALLOW_32X32 ||
|
| - (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->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->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->tx_size = TX_8X8;
|
| - } else {
|
| - mbmi->tx_size = TX_4X4;
|
| - }
|
| + mbmi->tx_size = cm->tx_mode == TX_MODE_SELECT ?
|
| + best_tx : MIN(max_tx_size, max_mode_tx_size);
|
|
|
| // Actually encode using the chosen mode if a model was used, but do not
|
| // update the r, d costs
|
| txfm_rd_in_plane(x, &cpi->rdcost_stack, rate, distortion, skip,
|
| &sse[mbmi->tx_size], ref_best_rd, 0, bs, mbmi->tx_size);
|
|
|
| - if (max_tx_size == TX_32X32 &&
|
| - rd[TX_32X32][1] <= rd[TX_16X16][1] &&
|
| - rd[TX_32X32][1] <= rd[TX_8X8][1] &&
|
| - rd[TX_32X32][1] <= rd[TX_4X4][1]) {
|
| + if (max_tx_size == TX_32X32 && best_tx == TX_32X32) {
|
| cpi->tx_stepdown_count[0]++;
|
| - } else if (max_tx_size >= TX_16X16 &&
|
| - rd[TX_16X16][1] <= rd[TX_8X8][1] &&
|
| - rd[TX_16X16][1] <= rd[TX_4X4][1]) {
|
| + } else if (max_tx_size >= TX_16X16 && best_tx == TX_16X16) {
|
| cpi->tx_stepdown_count[max_tx_size - TX_16X16]++;
|
| } else if (rd[TX_8X8][1] <= rd[TX_4X4][1]) {
|
| cpi->tx_stepdown_count[max_tx_size - TX_8X8]++;
|
| @@ -934,7 +912,10 @@
|
| MB_MODE_INFO *const mbmi = &xd->mi_8x8[0]->mbmi;
|
| struct rdcost_block_args *rdcost_stack = &cpi->rdcost_stack;
|
| const int b_inter_mode = is_inter_block(mbmi);
|
| + const TX_SIZE max_tx_size = max_txsize_lookup[bs];
|
| + TX_SIZE tx_size;
|
|
|
| +
|
| assert(bs == mbmi->sb_type);
|
| if (b_inter_mode)
|
| vp9_subtract_sby(x, bs);
|
| @@ -952,34 +933,16 @@
|
|
|
| if (cpi->sf.tx_size_search_method == USE_LARGESTINTRA_MODELINTER &&
|
| b_inter_mode) {
|
| - if (bs >= BLOCK_32X32)
|
| - model_rd_for_sb_y_tx(cpi, bs, TX_32X32, x, xd,
|
| - &r[TX_32X32][0], &d[TX_32X32], &s[TX_32X32]);
|
| - if (bs >= BLOCK_16X16)
|
| - model_rd_for_sb_y_tx(cpi, bs, TX_16X16, x, xd,
|
| - &r[TX_16X16][0], &d[TX_16X16], &s[TX_16X16]);
|
| -
|
| - model_rd_for_sb_y_tx(cpi, bs, TX_8X8, x, xd,
|
| - &r[TX_8X8][0], &d[TX_8X8], &s[TX_8X8]);
|
| -
|
| - model_rd_for_sb_y_tx(cpi, bs, TX_4X4, x, xd,
|
| - &r[TX_4X4][0], &d[TX_4X4], &s[TX_4X4]);
|
| -
|
| + for (tx_size = TX_4X4; tx_size <= max_tx_size; ++tx_size)
|
| + model_rd_for_sb_y_tx(cpi, bs, tx_size, x, xd,
|
| + &r[tx_size][0], &d[tx_size], &s[tx_size]);
|
| choose_txfm_size_from_modelrd(cpi, x, r, rate, d, distortion, s,
|
| skip, sse, ref_best_rd, bs);
|
| } else {
|
| - if (bs >= BLOCK_32X32)
|
| - txfm_rd_in_plane(x, rdcost_stack, &r[TX_32X32][0], &d[TX_32X32],
|
| - &s[TX_32X32], &sse[TX_32X32],
|
| - ref_best_rd, 0, bs, TX_32X32);
|
| - if (bs >= BLOCK_16X16)
|
| - txfm_rd_in_plane(x, rdcost_stack, &r[TX_16X16][0], &d[TX_16X16],
|
| - &s[TX_16X16], &sse[TX_16X16],
|
| - ref_best_rd, 0, bs, TX_16X16);
|
| - txfm_rd_in_plane(x, rdcost_stack, &r[TX_8X8][0], &d[TX_8X8], &s[TX_8X8],
|
| - &sse[TX_8X8], ref_best_rd, 0, bs, TX_8X8);
|
| - txfm_rd_in_plane(x, rdcost_stack, &r[TX_4X4][0], &d[TX_4X4], &s[TX_4X4],
|
| - &sse[TX_4X4], ref_best_rd, 0, bs, TX_4X4);
|
| + for (tx_size = TX_4X4; tx_size <= max_tx_size; ++tx_size)
|
| + txfm_rd_in_plane(x, rdcost_stack, &r[tx_size][0], &d[tx_size],
|
| + &s[tx_size], &sse[tx_size],
|
| + ref_best_rd, 0, bs, tx_size);
|
| choose_txfm_size_from_rd(cpi, x, r, rate, d, distortion, s,
|
| skip, txfm_cache, bs);
|
| }
|
| @@ -1024,10 +987,10 @@
|
| struct macroblockd_plane *pd = &xd->plane[0];
|
| const int src_stride = p->src.stride;
|
| const int dst_stride = pd->dst.stride;
|
| - uint8_t *src_init = raster_block_offset_uint8(BLOCK_8X8, ib,
|
| - p->src.buf, src_stride);
|
| - uint8_t *dst_init = raster_block_offset_uint8(BLOCK_8X8, ib,
|
| - pd->dst.buf, dst_stride);
|
| + const uint8_t *src_init = &p->src.buf[raster_block_offset(BLOCK_8X8, ib,
|
| + src_stride)];
|
| + uint8_t *dst_init = &pd->dst.buf[raster_block_offset(BLOCK_8X8, ib,
|
| + dst_stride)];
|
| int16_t *src_diff, *coeff;
|
|
|
| ENTROPY_CONTEXT ta[2], tempa[2];
|
| @@ -1067,9 +1030,8 @@
|
| for (idy = 0; idy < num_4x4_blocks_high; ++idy) {
|
| for (idx = 0; idx < num_4x4_blocks_wide; ++idx) {
|
| int64_t ssz;
|
| - const int16_t *scan;
|
| - const int16_t *nb;
|
| - uint8_t *src = src_init + idx * 4 + idy * 4 * src_stride;
|
| + const scan_order *so;
|
| + const uint8_t *src = src_init + idx * 4 + idy * 4 * src_stride;
|
| uint8_t *dst = dst_init + idx * 4 + idy * 4 * dst_stride;
|
| const int block = ib + idy * 2 + idx;
|
| TX_TYPE tx_type;
|
| @@ -1085,18 +1047,18 @@
|
| src, src_stride,
|
| dst, dst_stride);
|
|
|
| - tx_type = get_tx_type_4x4(PLANE_TYPE_Y_WITH_DC, xd, block);
|
| - get_scan_nb_4x4(tx_type, &scan, &nb);
|
| + tx_type = get_tx_type_4x4(PLANE_TYPE_Y, xd, block);
|
| + so = &vp9_scan_orders[TX_4X4][tx_type];
|
|
|
| if (tx_type != DCT_DCT)
|
| vp9_short_fht4x4(src_diff, coeff, 8, tx_type);
|
| else
|
| x->fwd_txm4x4(src_diff, coeff, 8);
|
|
|
| - vp9_regular_quantize_b_4x4(x, 16, block, scan, get_iscan_4x4(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, scan, nb);
|
| + ratey += cost_coeffs(x, 0, block, tempa + idx, templ + idy, TX_4X4,
|
| + so->scan, so->neighbors);
|
| distortion += vp9_block_error(coeff, BLOCK_OFFSET(pd->dqcoeff, block),
|
| 16, &ssz) >> 2;
|
| if (RDCOST(x->rdmult, x->rddiv, ratey, distortion) >= best_rd)
|
| @@ -1327,22 +1289,18 @@
|
| }
|
|
|
| static int64_t rd_pick_intra_sbuv_mode(VP9_COMP *cpi, MACROBLOCK *x,
|
| + PICK_MODE_CONTEXT *ctx,
|
| int *rate, int *rate_tokenonly,
|
| int64_t *distortion, int *skippable,
|
| - BLOCK_SIZE bsize) {
|
| + BLOCK_SIZE bsize, TX_SIZE max_tx_size) {
|
| MB_PREDICTION_MODE mode;
|
| MB_PREDICTION_MODE mode_selected = DC_PRED;
|
| int64_t best_rd = INT64_MAX, this_rd;
|
| int this_rate_tokenonly, this_rate, s;
|
| int64_t this_distortion, this_sse;
|
|
|
| - // int mode_mask = (bsize <= BLOCK_8X8)
|
| - // ? ALL_INTRA_MODES : cpi->sf.intra_uv_mode_mask;
|
| -
|
| - for (mode = DC_PRED; mode <= TM_PRED; mode ++) {
|
| - // if (!(mode_mask & (1 << mode)))
|
| - if (!(cpi->sf.intra_uv_mode_mask[max_uv_txsize_lookup[bsize]]
|
| - & (1 << mode)))
|
| + for (mode = DC_PRED; mode <= TM_PRED; ++mode) {
|
| + if (!(cpi->sf.intra_uv_mode_mask[max_tx_size] & (1 << mode)))
|
| continue;
|
|
|
| x->e_mbd.mi_8x8[0]->mbmi.uv_mode = mode;
|
| @@ -1362,11 +1320,31 @@
|
| *rate_tokenonly = this_rate_tokenonly;
|
| *distortion = this_distortion;
|
| *skippable = s;
|
| + if (!x->select_txfm_size) {
|
| + int i;
|
| + struct macroblock_plane *const p = x->plane;
|
| + struct macroblockd_plane *const pd = x->e_mbd.plane;
|
| + for (i = 1; i < MAX_MB_PLANE; ++i) {
|
| + p[i].coeff = ctx->coeff_pbuf[i][2];
|
| + p[i].qcoeff = ctx->qcoeff_pbuf[i][2];
|
| + pd[i].dqcoeff = ctx->dqcoeff_pbuf[i][2];
|
| + p[i].eobs = ctx->eobs_pbuf[i][2];
|
| +
|
| + ctx->coeff_pbuf[i][2] = ctx->coeff_pbuf[i][0];
|
| + ctx->qcoeff_pbuf[i][2] = ctx->qcoeff_pbuf[i][0];
|
| + ctx->dqcoeff_pbuf[i][2] = ctx->dqcoeff_pbuf[i][0];
|
| + ctx->eobs_pbuf[i][2] = ctx->eobs_pbuf[i][0];
|
| +
|
| + ctx->coeff_pbuf[i][0] = p[i].coeff;
|
| + ctx->qcoeff_pbuf[i][0] = p[i].qcoeff;
|
| + ctx->dqcoeff_pbuf[i][0] = pd[i].dqcoeff;
|
| + ctx->eobs_pbuf[i][0] = p[i].eobs;
|
| + }
|
| + }
|
| }
|
| }
|
|
|
| x->e_mbd.mi_8x8[0]->mbmi.uv_mode = mode_selected;
|
| -
|
| return best_rd;
|
| }
|
|
|
| @@ -1387,7 +1365,8 @@
|
| return this_rd;
|
| }
|
|
|
| -static void choose_intra_uv_mode(VP9_COMP *cpi, BLOCK_SIZE bsize,
|
| +static void choose_intra_uv_mode(VP9_COMP *cpi, PICK_MODE_CONTEXT *ctx,
|
| + BLOCK_SIZE bsize, TX_SIZE max_tx_size,
|
| int *rate_uv, int *rate_uv_tokenonly,
|
| int64_t *dist_uv, int *skip_uv,
|
| MB_PREDICTION_MODE *mode_uv) {
|
| @@ -1401,9 +1380,9 @@
|
| // Else do a proper rd search for each possible transform size that may
|
| // be considered in the main rd loop.
|
| } else {
|
| - rd_pick_intra_sbuv_mode(cpi, x,
|
| + rd_pick_intra_sbuv_mode(cpi, x, ctx,
|
| rate_uv, rate_uv_tokenonly, dist_uv, skip_uv,
|
| - bsize < BLOCK_8X8 ? BLOCK_8X8 : bsize);
|
| + bsize < BLOCK_8X8 ? BLOCK_8X8 : bsize, max_tx_size);
|
| }
|
| *mode_uv = x->e_mbd.mi_8x8[0]->mbmi.uv_mode;
|
| }
|
| @@ -1417,7 +1396,7 @@
|
| // Don't account for mode here if segment skip is enabled.
|
| if (!vp9_segfeature_active(&cpi->common.seg, segment_id, SEG_LVL_SKIP)) {
|
| assert(is_inter_mode(mode));
|
| - return x->inter_mode_cost[mode_context][inter_mode_offset(mode)];
|
| + return x->inter_mode_cost[mode_context][INTER_OFFSET(mode)];
|
| } else {
|
| return 0;
|
| }
|
| @@ -1523,21 +1502,22 @@
|
| struct macroblockd_plane *const pd = &xd->plane[0];
|
| struct macroblock_plane *const p = &x->plane[0];
|
| MODE_INFO *const mi = xd->mi_8x8[0];
|
| - const BLOCK_SIZE bsize = mi->mbmi.sb_type;
|
| - const int width = plane_block_width(bsize, pd);
|
| - const int height = plane_block_height(bsize, pd);
|
| + 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];
|
| int idx, idy;
|
|
|
| - uint8_t *const src = raster_block_offset_uint8(BLOCK_8X8, i,
|
| - p->src.buf, p->src.stride);
|
| - uint8_t *const dst = raster_block_offset_uint8(BLOCK_8X8, i,
|
| - pd->dst.buf, pd->dst.stride);
|
| + const uint8_t *const src = &p->src.buf[raster_block_offset(BLOCK_8X8, i,
|
| + p->src.stride)];
|
| + uint8_t *const dst = &pd->dst.buf[raster_block_offset(BLOCK_8X8, i,
|
| + pd->dst.stride)];
|
| int64_t thisdistortion = 0, thissse = 0;
|
| int thisrate = 0, ref;
|
| + const scan_order *so = &vp9_default_scan_orders[TX_4X4];
|
| const int is_compound = has_second_ref(&mi->mbmi);
|
| for (ref = 0; ref < 1 + is_compound; ++ref) {
|
| - const uint8_t *pre = raster_block_offset_uint8(BLOCK_8X8, i,
|
| - pd->pre[ref].buf, pd->pre[ref].stride);
|
| + const uint8_t *pre = &pd->pre[ref].buf[raster_block_offset(BLOCK_8X8, i,
|
| + pd->pre[ref].stride)];
|
| vp9_build_inter_predictor(pre, pd->pre[ref].stride,
|
| dst, pd->dst.stride,
|
| &mi->bmi[i].as_mv[ref].as_mv,
|
| @@ -1560,16 +1540,12 @@
|
| coeff = BLOCK_OFFSET(p->coeff, k);
|
| x->fwd_txm4x4(raster_block_offset_int16(BLOCK_8X8, k, p->src_diff),
|
| coeff, 8);
|
| - vp9_regular_quantize_b_4x4(x, 16, k, get_scan_4x4(DCT_DCT),
|
| - get_iscan_4x4(DCT_DCT));
|
| + vp9_regular_quantize_b_4x4(x, 0, k, so->scan, so->iscan);
|
| thisdistortion += vp9_block_error(coeff, BLOCK_OFFSET(pd->dqcoeff, k),
|
| 16, &ssz);
|
| thissse += ssz;
|
| - thisrate += cost_coeffs(x, 0, k,
|
| - ta + (k & 1),
|
| - tl + (k >> 1), TX_4X4,
|
| - vp9_default_scan_4x4,
|
| - vp9_default_scan_4x4_neighbors);
|
| + thisrate += cost_coeffs(x, 0, k, ta + (k & 1), tl + (k >> 1), TX_4X4,
|
| + so->scan, so->neighbors);
|
| rd1 = RDCOST(x->rdmult, x->rddiv, thisrate, thisdistortion >> 2);
|
| rd2 = RDCOST(x->rdmult, x->rddiv, 0, thissse >> 2);
|
| rd = MIN(rd1, rd2);
|
| @@ -1625,14 +1601,13 @@
|
| struct macroblock_plane *const p = &x->plane[0];
|
| struct macroblockd_plane *const pd = &x->e_mbd.plane[0];
|
|
|
| - p->src.buf = raster_block_offset_uint8(BLOCK_8X8, i, p->src.buf,
|
| - p->src.stride);
|
| + p->src.buf = &p->src.buf[raster_block_offset(BLOCK_8X8, i, p->src.stride)];
|
| assert(((intptr_t)pd->pre[0].buf & 0x7) == 0);
|
| - pd->pre[0].buf = raster_block_offset_uint8(BLOCK_8X8, i, pd->pre[0].buf,
|
| - pd->pre[0].stride);
|
| + pd->pre[0].buf = &pd->pre[0].buf[raster_block_offset(BLOCK_8X8, i,
|
| + pd->pre[0].stride)];
|
| if (has_second_ref(mbmi))
|
| - pd->pre[1].buf = raster_block_offset_uint8(BLOCK_8X8, i, pd->pre[1].buf,
|
| - pd->pre[1].stride);
|
| + pd->pre[1].buf = &pd->pre[1].buf[raster_block_offset(BLOCK_8X8, i,
|
| + pd->pre[1].stride)];
|
| }
|
|
|
| static INLINE void mi_buf_restore(MACROBLOCK *x, struct buf_2d orig_src,
|
| @@ -1654,6 +1629,7 @@
|
| MB_PREDICTION_MODE this_mode;
|
| MODE_INFO *mi = x->e_mbd.mi_8x8[0];
|
| MB_MODE_INFO *const mbmi = &mi->mbmi;
|
| + struct macroblock_plane *const p = &x->plane[0];
|
| struct macroblockd_plane *const pd = &x->e_mbd.plane[0];
|
| const int label_count = 4;
|
| int64_t this_segment_rd = 0;
|
| @@ -1693,22 +1669,22 @@
|
|
|
| frame_mv[ZEROMV][mbmi->ref_frame[0]].as_int = 0;
|
| vp9_append_sub8x8_mvs_for_idx(&cpi->common, &x->e_mbd, tile,
|
| + i, 0, mi_row, mi_col,
|
| &frame_mv[NEARESTMV][mbmi->ref_frame[0]],
|
| - &frame_mv[NEARMV][mbmi->ref_frame[0]],
|
| - i, 0, mi_row, mi_col);
|
| + &frame_mv[NEARMV][mbmi->ref_frame[0]]);
|
| if (has_second_rf) {
|
| frame_mv[ZEROMV][mbmi->ref_frame[1]].as_int = 0;
|
| vp9_append_sub8x8_mvs_for_idx(&cpi->common, &x->e_mbd, tile,
|
| + i, 1, mi_row, mi_col,
|
| &frame_mv[NEARESTMV][mbmi->ref_frame[1]],
|
| - &frame_mv[NEARMV][mbmi->ref_frame[1]],
|
| - i, 1, mi_row, mi_col);
|
| + &frame_mv[NEARMV][mbmi->ref_frame[1]]);
|
| }
|
| // search for the best motion vector on this segment
|
| for (this_mode = NEARESTMV; this_mode <= NEWMV; ++this_mode) {
|
| const struct buf_2d orig_src = x->plane[0].src;
|
| struct buf_2d orig_pre[2];
|
|
|
| - mode_idx = inter_mode_offset(this_mode);
|
| + mode_idx = INTER_OFFSET(this_mode);
|
| bsi->rdstat[i][mode_idx].brdcost = INT64_MAX;
|
|
|
| // if we're near/nearest and mv == 0,0, compare to zeromv
|
| @@ -1804,6 +1780,9 @@
|
| further_steps = (MAX_MVSEARCH_STEPS - 1) - step_param;
|
| // adjust src pointer for this block
|
| mi_buf_shift(x, i);
|
| +
|
| + vp9_set_mv_search_range(x, &bsi->ref_mv->as_mv);
|
| +
|
| if (cpi->sf.search_method == HEX) {
|
| bestsme = vp9_hex_search(x, &mvp_full.as_mv,
|
| step_param,
|
| @@ -1834,10 +1813,10 @@
|
| clamp_mv(&mvp_full.as_mv, x->mv_col_min, x->mv_col_max,
|
| x->mv_row_min, x->mv_row_max);
|
|
|
| - thissme = cpi->full_search_sad(x, &mvp_full,
|
| + thissme = cpi->full_search_sad(x, &mvp_full.as_mv,
|
| sadpb, 16, v_fn_ptr,
|
| x->nmvjointcost, x->mvcost,
|
| - bsi->ref_mv, i);
|
| + &bsi->ref_mv->as_mv, i);
|
|
|
| if (thissme < bestsme) {
|
| bestsme = thissme;
|
| @@ -1872,12 +1851,14 @@
|
| mi_buf_restore(x, orig_src, orig_pre);
|
| }
|
|
|
| - if (has_second_rf && this_mode == NEWMV &&
|
| - mbmi->interp_filter == EIGHTTAP) {
|
| + if (has_second_rf) {
|
| if (seg_mvs[i][mbmi->ref_frame[1]].as_int == INVALID_MV ||
|
| seg_mvs[i][mbmi->ref_frame[0]].as_int == INVALID_MV)
|
| continue;
|
| + }
|
|
|
| + if (has_second_rf && this_mode == NEWMV &&
|
| + mbmi->interp_filter == EIGHTTAP) {
|
| // adjust src pointers
|
| mi_buf_shift(x, i);
|
| if (cpi->sf.comp_inter_joint_search_thresh <= bsize) {
|
| @@ -1900,6 +1881,7 @@
|
| bsi->ref_mv, bsi->second_ref_mv, x->nmvjointcost,
|
| x->mvcost, cpi);
|
|
|
| +
|
| 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 =
|
| @@ -1979,11 +1961,11 @@
|
| bsi->rdstat[i][mode_idx].brdcost += RDCOST(x->rdmult, x->rddiv,
|
| bsi->rdstat[i][mode_idx].brate, 0);
|
| bsi->rdstat[i][mode_idx].brate += bsi->rdstat[i][mode_idx].byrate;
|
| - bsi->rdstat[i][mode_idx].eobs = pd->eobs[i];
|
| + bsi->rdstat[i][mode_idx].eobs = p->eobs[i];
|
| if (num_4x4_blocks_wide > 1)
|
| - bsi->rdstat[i + 1][mode_idx].eobs = pd->eobs[i + 1];
|
| + bsi->rdstat[i + 1][mode_idx].eobs = p->eobs[i + 1];
|
| if (num_4x4_blocks_high > 1)
|
| - bsi->rdstat[i + 2][mode_idx].eobs = pd->eobs[i + 2];
|
| + bsi->rdstat[i + 2][mode_idx].eobs = p->eobs[i + 2];
|
| }
|
|
|
| if (bsi->rdstat[i][mode_idx].brdcost < best_rd) {
|
| @@ -2001,7 +1983,7 @@
|
| return;
|
| }
|
|
|
| - mode_idx = inter_mode_offset(mode_selected);
|
| + mode_idx = INTER_OFFSET(mode_selected);
|
| 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));
|
|
|
| @@ -2077,11 +2059,11 @@
|
| return INT64_MAX;
|
| /* set it to the best */
|
| for (i = 0; i < 4; i++) {
|
| - mode_idx = inter_mode_offset(bsi->modes[i]);
|
| + mode_idx = INTER_OFFSET(bsi->modes[i]);
|
| mi->bmi[i].as_mv[0].as_int = bsi->rdstat[i][mode_idx].mvs[0].as_int;
|
| if (has_second_ref(mbmi))
|
| mi->bmi[i].as_mv[1].as_int = bsi->rdstat[i][mode_idx].mvs[1].as_int;
|
| - xd->plane[0].eobs[i] = bsi->rdstat[i][mode_idx].eobs;
|
| + x->plane[0].eobs[i] = bsi->rdstat[i][mode_idx].eobs;
|
| mi->bmi[i].as_mode = bsi->modes[i];
|
| }
|
|
|
| @@ -2091,7 +2073,7 @@
|
| *returntotrate = bsi->r;
|
| *returndistortion = bsi->d;
|
| *returnyrate = bsi->segment_yrate;
|
| - *skippable = vp9_is_skippable_in_plane(&x->e_mbd, BLOCK_8X8, 0);
|
| + *skippable = vp9_is_skippable_in_plane(x, BLOCK_8X8, 0);
|
| *psse = bsi->sse;
|
| mbmi->mode = bsi->modes[3];
|
|
|
| @@ -2109,7 +2091,7 @@
|
| int best_index = 0;
|
| int best_sad = INT_MAX;
|
| int this_sad = INT_MAX;
|
| - unsigned int max_mv = 0;
|
| + int max_mv = 0;
|
|
|
| uint8_t *src_y_ptr = x->plane[0].src.buf;
|
| uint8_t *ref_y_ptr;
|
| @@ -2165,11 +2147,11 @@
|
| vpx_memset(ref_costs_comp, 0, MAX_REF_FRAMES * sizeof(*ref_costs_comp));
|
| *comp_mode_p = 128;
|
| } else {
|
| - vp9_prob intra_inter_p = vp9_get_pred_prob_intra_inter(cm, xd);
|
| + vp9_prob intra_inter_p = vp9_get_intra_inter_prob(cm, xd);
|
| vp9_prob comp_inter_p = 128;
|
|
|
| - if (cm->comp_pred_mode == HYBRID_PREDICTION) {
|
| - comp_inter_p = vp9_get_pred_prob_comp_inter_inter(cm, xd);
|
| + if (cm->reference_mode == REFERENCE_MODE_SELECT) {
|
| + comp_inter_p = vp9_get_reference_mode_prob(cm, xd);
|
| *comp_mode_p = comp_inter_p;
|
| } else {
|
| *comp_mode_p = 128;
|
| @@ -2177,12 +2159,12 @@
|
|
|
| ref_costs_single[INTRA_FRAME] = vp9_cost_bit(intra_inter_p, 0);
|
|
|
| - if (cm->comp_pred_mode != COMP_PREDICTION_ONLY) {
|
| + if (cm->reference_mode != COMPOUND_REFERENCE) {
|
| vp9_prob ref_single_p1 = vp9_get_pred_prob_single_ref_p1(cm, xd);
|
| vp9_prob ref_single_p2 = vp9_get_pred_prob_single_ref_p2(cm, xd);
|
| unsigned int base_cost = vp9_cost_bit(intra_inter_p, 1);
|
|
|
| - if (cm->comp_pred_mode == HYBRID_PREDICTION)
|
| + if (cm->reference_mode == REFERENCE_MODE_SELECT)
|
| base_cost += vp9_cost_bit(comp_inter_p, 0);
|
|
|
| ref_costs_single[LAST_FRAME] = ref_costs_single[GOLDEN_FRAME] =
|
| @@ -2197,11 +2179,11 @@
|
| ref_costs_single[GOLDEN_FRAME] = 512;
|
| ref_costs_single[ALTREF_FRAME] = 512;
|
| }
|
| - if (cm->comp_pred_mode != SINGLE_PREDICTION_ONLY) {
|
| + if (cm->reference_mode != SINGLE_REFERENCE) {
|
| vp9_prob ref_comp_p = vp9_get_pred_prob_comp_ref_p(cm, xd);
|
| unsigned int base_cost = vp9_cost_bit(intra_inter_p, 1);
|
|
|
| - if (cm->comp_pred_mode == HYBRID_PREDICTION)
|
| + if (cm->reference_mode == REFERENCE_MODE_SELECT)
|
| base_cost += vp9_cost_bit(comp_inter_p, 1);
|
|
|
| ref_costs_comp[LAST_FRAME] = base_cost + vp9_cost_bit(ref_comp_p, 0);
|
| @@ -2217,7 +2199,7 @@
|
| int mode_index,
|
| int_mv *ref_mv,
|
| int_mv *second_ref_mv,
|
| - int64_t comp_pred_diff[NB_PREDICTION_TYPES],
|
| + int64_t comp_pred_diff[REFERENCE_MODES],
|
| int64_t tx_size_diff[TX_MODES],
|
| int64_t best_filter_diff[SWITCHABLE_FILTER_CONTEXTS]) {
|
| MACROBLOCKD *const xd = &x->e_mbd;
|
| @@ -2231,9 +2213,9 @@
|
| ctx->best_ref_mv.as_int = ref_mv->as_int;
|
| ctx->second_best_ref_mv.as_int = second_ref_mv->as_int;
|
|
|
| - ctx->single_pred_diff = (int)comp_pred_diff[SINGLE_PREDICTION_ONLY];
|
| - ctx->comp_pred_diff = (int)comp_pred_diff[COMP_PREDICTION_ONLY];
|
| - ctx->hybrid_pred_diff = (int)comp_pred_diff[HYBRID_PREDICTION];
|
| + ctx->single_pred_diff = (int)comp_pred_diff[SINGLE_REFERENCE];
|
| + ctx->comp_pred_diff = (int)comp_pred_diff[COMPOUND_REFERENCE];
|
| + ctx->hybrid_pred_diff = (int)comp_pred_diff[REFERENCE_MODE_SELECT];
|
|
|
| vpx_memcpy(ctx->tx_rd_diff, tx_size_diff, sizeof(ctx->tx_rd_diff));
|
| vpx_memcpy(ctx->best_filter_diff, best_filter_diff,
|
| @@ -2343,7 +2325,6 @@
|
| int_mv mvp_full;
|
| int ref = mbmi->ref_frame[0];
|
| int_mv ref_mv = mbmi->ref_mvs[ref][0];
|
| - const BLOCK_SIZE block_size = get_plane_block_size(bsize, &xd->plane[0]);
|
|
|
| int tmp_col_min = x->mv_col_min;
|
| int tmp_col_max = x->mv_col_max;
|
| @@ -2363,7 +2344,7 @@
|
| setup_pre_planes(xd, 0, scaled_ref_frame, mi_row, mi_col, NULL);
|
| }
|
|
|
| - vp9_clamp_mv_min_max(x, &ref_mv.as_mv);
|
| + vp9_set_mv_search_range(x, &ref_mv.as_mv);
|
|
|
| // Adjust search parameters based on small partitions' result.
|
| if (x->fast_ms) {
|
| @@ -2417,24 +2398,24 @@
|
| bestsme = vp9_hex_search(x, &mvp_full.as_mv,
|
| step_param,
|
| sadpb, 1,
|
| - &cpi->fn_ptr[block_size], 1,
|
| + &cpi->fn_ptr[bsize], 1,
|
| &ref_mv.as_mv, &tmp_mv->as_mv);
|
| } else if (cpi->sf.search_method == SQUARE) {
|
| bestsme = vp9_square_search(x, &mvp_full.as_mv,
|
| step_param,
|
| sadpb, 1,
|
| - &cpi->fn_ptr[block_size], 1,
|
| + &cpi->fn_ptr[bsize], 1,
|
| &ref_mv.as_mv, &tmp_mv->as_mv);
|
| } else if (cpi->sf.search_method == BIGDIA) {
|
| bestsme = vp9_bigdia_search(x, &mvp_full.as_mv,
|
| step_param,
|
| sadpb, 1,
|
| - &cpi->fn_ptr[block_size], 1,
|
| + &cpi->fn_ptr[bsize], 1,
|
| &ref_mv.as_mv, &tmp_mv->as_mv);
|
| } else {
|
| bestsme = vp9_full_pixel_diamond(cpi, x, &mvp_full, step_param,
|
| sadpb, further_steps, 1,
|
| - &cpi->fn_ptr[block_size],
|
| + &cpi->fn_ptr[bsize],
|
| &ref_mv, tmp_mv);
|
| }
|
|
|
| @@ -2449,7 +2430,7 @@
|
| cpi->find_fractional_mv_step(x, &tmp_mv->as_mv, &ref_mv.as_mv,
|
| cm->allow_high_precision_mv,
|
| x->errorperbit,
|
| - &cpi->fn_ptr[block_size],
|
| + &cpi->fn_ptr[bsize],
|
| 0, cpi->sf.subpel_iters_per_step,
|
| x->nmvjointcost, x->mvcost,
|
| &dis, &sse);
|
| @@ -2473,57 +2454,44 @@
|
| int mi_row, int mi_col,
|
| int_mv single_newmv[MAX_REF_FRAMES],
|
| int *rate_mv) {
|
| - int pw = 4 << b_width_log2(bsize), ph = 4 << b_height_log2(bsize);
|
| + 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;
|
| - int refs[2] = { mbmi->ref_frame[0],
|
| - (mbmi->ref_frame[1] < 0 ? 0 : mbmi->ref_frame[1]) };
|
| + const int refs[2] = { mbmi->ref_frame[0],
|
| + mbmi->ref_frame[1] < 0 ? 0 : mbmi->ref_frame[1] };
|
| int_mv ref_mv[2];
|
| - const BLOCK_SIZE block_size = get_plane_block_size(bsize, &xd->plane[0]);
|
| - int ite;
|
| + int ite, ref;
|
| // Prediction buffer from second frame.
|
| uint8_t *second_pred = vpx_memalign(16, pw * ph * sizeof(uint8_t));
|
|
|
| // Do joint motion search in compound mode to get more accurate mv.
|
| - struct buf_2d backup_yv12[MAX_MB_PLANE] = {{0}};
|
| - struct buf_2d backup_second_yv12[MAX_MB_PLANE] = {{0}};
|
| - struct buf_2d scaled_first_yv12;
|
| + struct buf_2d backup_yv12[2][MAX_MB_PLANE];
|
| + struct buf_2d scaled_first_yv12 = xd->plane[0].pre[0];
|
| int last_besterr[2] = {INT_MAX, INT_MAX};
|
| - YV12_BUFFER_CONFIG *scaled_ref_frame[2] = {NULL, NULL};
|
| - scaled_ref_frame[0] = get_scaled_ref_frame(cpi, mbmi->ref_frame[0]);
|
| - scaled_ref_frame[1] = get_scaled_ref_frame(cpi, mbmi->ref_frame[1]);
|
| + YV12_BUFFER_CONFIG *const scaled_ref_frame[2] = {
|
| + get_scaled_ref_frame(cpi, mbmi->ref_frame[0]),
|
| + get_scaled_ref_frame(cpi, mbmi->ref_frame[1])
|
| + };
|
|
|
| - ref_mv[0] = mbmi->ref_mvs[refs[0]][0];
|
| - ref_mv[1] = mbmi->ref_mvs[refs[1]][0];
|
| + for (ref = 0; ref < 2; ++ref) {
|
| + ref_mv[ref] = mbmi->ref_mvs[refs[ref]][0];
|
|
|
| - if (scaled_ref_frame[0]) {
|
| - int i;
|
| - // Swap out the reference frame for a version that's been scaled to
|
| - // match the resolution of the current frame, allowing the existing
|
| - // motion search code to be used without additional modifications.
|
| - for (i = 0; i < MAX_MB_PLANE; i++)
|
| - backup_yv12[i] = xd->plane[i].pre[0];
|
| - setup_pre_planes(xd, 0, scaled_ref_frame[0], mi_row, mi_col, NULL);
|
| - }
|
| + if (scaled_ref_frame[ref]) {
|
| + int i;
|
| + // Swap out the reference frame for a version that's been scaled to
|
| + // match the resolution of the current frame, allowing the existing
|
| + // 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);
|
| + }
|
|
|
| - if (scaled_ref_frame[1]) {
|
| - int i;
|
| - for (i = 0; i < MAX_MB_PLANE; i++)
|
| - backup_second_yv12[i] = xd->plane[i].pre[1];
|
| -
|
| - setup_pre_planes(xd, 1, scaled_ref_frame[1], mi_row, mi_col, NULL);
|
| + xd->scale_factor[ref].sfc->set_scaled_offsets(&xd->scale_factor[ref],
|
| + mi_row, mi_col);
|
| + frame_mv[refs[ref]].as_int = single_newmv[refs[ref]].as_int;
|
| }
|
|
|
| - xd->scale_factor[0].sfc->set_scaled_offsets(&xd->scale_factor[0],
|
| - mi_row, mi_col);
|
| - xd->scale_factor[1].sfc->set_scaled_offsets(&xd->scale_factor[1],
|
| - mi_row, mi_col);
|
| - scaled_first_yv12 = xd->plane[0].pre[0];
|
| -
|
| - // Initialize mv using single prediction mode result.
|
| - frame_mv[refs[0]].as_int = single_newmv[refs[0]].as_int;
|
| - frame_mv[refs[1]].as_int = single_newmv[refs[1]].as_int;
|
| -
|
| // Allow joint search multiple times iteratively for each ref frame
|
| // and break out the search loop if it couldn't find better mv.
|
| for (ite = 0; ite < 4; ite++) {
|
| @@ -2555,7 +2523,7 @@
|
| // Compound motion search on first ref frame.
|
| if (id)
|
| xd->plane[0].pre[0] = ref_yv12[id];
|
| - vp9_clamp_mv_min_max(x, &ref_mv[id].as_mv);
|
| + vp9_set_mv_search_range(x, &ref_mv[id].as_mv);
|
|
|
| // Use mv result from single mode as mvp.
|
| tmp_mv.as_int = frame_mv[refs[id]].as_int;
|
| @@ -2566,7 +2534,7 @@
|
| // Small-range full-pixel motion search
|
| bestsme = vp9_refining_search_8p_c(x, &tmp_mv, sadpb,
|
| search_range,
|
| - &cpi->fn_ptr[block_size],
|
| + &cpi->fn_ptr[bsize],
|
| x->nmvjointcost, x->mvcost,
|
| &ref_mv[id], second_pred,
|
| pw, ph);
|
| @@ -2585,7 +2553,7 @@
|
| &ref_mv[id].as_mv,
|
| cpi->common.allow_high_precision_mv,
|
| x->errorperbit,
|
| - &cpi->fn_ptr[block_size],
|
| + &cpi->fn_ptr[bsize],
|
| 0, cpi->sf.subpel_iters_per_step,
|
| x->nmvjointcost, x->mvcost,
|
| &dis, &sse, second_pred,
|
| @@ -2603,28 +2571,34 @@
|
| }
|
| }
|
|
|
| - // restore the predictor
|
| - if (scaled_ref_frame[0]) {
|
| - int i;
|
| - for (i = 0; i < MAX_MB_PLANE; i++)
|
| - xd->plane[i].pre[0] = backup_yv12[i];
|
| - }
|
| + *rate_mv = 0;
|
|
|
| - if (scaled_ref_frame[1]) {
|
| - int i;
|
| - for (i = 0; i < MAX_MB_PLANE; i++)
|
| - xd->plane[i].pre[1] = backup_second_yv12[i];
|
| + for (ref = 0; ref < 2; ++ref) {
|
| + if (scaled_ref_frame[ref]) {
|
| + // restore the predictor
|
| + int i;
|
| + for (i = 0; i < MAX_MB_PLANE; i++)
|
| + xd->plane[i].pre[ref] = backup_yv12[ref][i];
|
| + }
|
| +
|
| + *rate_mv += vp9_mv_bit_cost(&frame_mv[refs[ref]].as_mv,
|
| + &mbmi->ref_mvs[refs[ref]][0].as_mv,
|
| + x->nmvjointcost, x->mvcost, MV_COST_WEIGHT);
|
| }
|
| - *rate_mv = vp9_mv_bit_cost(&frame_mv[refs[0]].as_mv,
|
| - &mbmi->ref_mvs[refs[0]][0].as_mv,
|
| - x->nmvjointcost, x->mvcost, MV_COST_WEIGHT);
|
| - *rate_mv += vp9_mv_bit_cost(&frame_mv[refs[1]].as_mv,
|
| - &mbmi->ref_mvs[refs[1]][0].as_mv,
|
| - x->nmvjointcost, x->mvcost, MV_COST_WEIGHT);
|
|
|
| vpx_free(second_pred);
|
| }
|
|
|
| +static INLINE void restore_dst_buf(MACROBLOCKD *xd,
|
| + uint8_t *orig_dst[MAX_MB_PLANE],
|
| + int orig_dst_stride[MAX_MB_PLANE]) {
|
| + int i;
|
| + for (i = 0; i < MAX_MB_PLANE; i++) {
|
| + xd->plane[i].dst.buf = orig_dst[i];
|
| + xd->plane[i].dst.stride = orig_dst_stride[i];
|
| + }
|
| +}
|
| +
|
| static int64_t handle_inter_mode(VP9_COMP *cpi, MACROBLOCK *x,
|
| const TileInfo *const tile,
|
| BLOCK_SIZE bsize,
|
| @@ -2661,6 +2635,12 @@
|
| int orig_dst_stride[MAX_MB_PLANE];
|
| int rs = 0;
|
|
|
| + if (is_comp_pred) {
|
| + if (frame_mv[refs[0]].as_int == INVALID_MV ||
|
| + frame_mv[refs[1]].as_int == INVALID_MV)
|
| + return INT64_MAX;
|
| + }
|
| +
|
| if (this_mode == NEWMV) {
|
| int rate_mv;
|
| if (is_comp_pred) {
|
| @@ -2679,9 +2659,6 @@
|
| &mbmi->ref_mvs[refs[1]][0].as_mv,
|
| x->nmvjointcost, x->mvcost, MV_COST_WEIGHT);
|
| }
|
| - if (frame_mv[refs[0]].as_int == INVALID_MV ||
|
| - frame_mv[refs[1]].as_int == INVALID_MV)
|
| - return INT64_MAX;
|
| *rate2 += rate_mv;
|
| } else {
|
| int_mv tmp_mv;
|
| @@ -2758,13 +2735,10 @@
|
| *rate2 += cost_mv_ref(cpi, this_mode,
|
| mbmi->mode_context[mbmi->ref_frame[0]]);
|
|
|
| - if (!(*mode_excluded)) {
|
| - if (is_comp_pred) {
|
| - *mode_excluded = (cpi->common.comp_pred_mode == SINGLE_PREDICTION_ONLY);
|
| - } else {
|
| - *mode_excluded = (cpi->common.comp_pred_mode == COMP_PREDICTION_ONLY);
|
| - }
|
| - }
|
| + if (!(*mode_excluded))
|
| + *mode_excluded = is_comp_pred
|
| + ? cpi->common.reference_mode == SINGLE_REFERENCE
|
| + : cpi->common.reference_mode == COMPOUND_REFERENCE;
|
|
|
| pred_exists = 0;
|
| // Are all MVs integer pel for Y and UV
|
| @@ -2773,6 +2747,7 @@
|
| if (is_comp_pred)
|
| intpel_mv &= (mbmi->mv[1].as_mv.row & 15) == 0 &&
|
| (mbmi->mv[1].as_mv.col & 15) == 0;
|
| +
|
| // Search for best switchable filter by checking the variance of
|
| // pred error irrespective of whether the filter will be used
|
| if (cm->mcomp_filter_type != BILINEAR) {
|
| @@ -2812,10 +2787,7 @@
|
| (cm->mcomp_filter_type != SWITCHABLE &&
|
| (cm->mcomp_filter_type == mbmi->interp_filter ||
|
| (i == 0 && intpel_mv)))) {
|
| - for (j = 0; j < MAX_MB_PLANE; j++) {
|
| - xd->plane[j].dst.buf = orig_dst[j];
|
| - xd->plane[j].dst.stride = orig_dst_stride[j];
|
| - }
|
| + restore_dst_buf(xd, orig_dst, orig_dst_stride);
|
| } else {
|
| for (j = 0; j < MAX_MB_PLANE; j++) {
|
| xd->plane[j].dst.buf = tmp_buf + j * 64 * 64;
|
| @@ -2839,10 +2811,7 @@
|
| }
|
| if (i == 0 && cpi->sf.use_rd_breakout && ref_best_rd < INT64_MAX) {
|
| if (rd / 2 > ref_best_rd) {
|
| - for (i = 0; i < MAX_MB_PLANE; i++) {
|
| - xd->plane[i].dst.buf = orig_dst[i];
|
| - xd->plane[i].dst.stride = orig_dst_stride[i];
|
| - }
|
| + restore_dst_buf(xd, orig_dst, orig_dst_stride);
|
| return INT64_MAX;
|
| }
|
| }
|
| @@ -2861,11 +2830,7 @@
|
| pred_exists = 1;
|
| }
|
| }
|
| -
|
| - for (i = 0; i < MAX_MB_PLANE; i++) {
|
| - xd->plane[i].dst.buf = orig_dst[i];
|
| - xd->plane[i].dst.stride = orig_dst_stride[i];
|
| - }
|
| + restore_dst_buf(xd, orig_dst, orig_dst_stride);
|
| }
|
| }
|
| // Set the appropriate filter
|
| @@ -2897,10 +2862,7 @@
|
| // if current pred_error modeled rd is substantially more than the best
|
| // so far, do not bother doing full rd
|
| if (rd / 2 > ref_best_rd) {
|
| - for (i = 0; i < MAX_MB_PLANE; i++) {
|
| - xd->plane[i].dst.buf = orig_dst[i];
|
| - xd->plane[i].dst.stride = orig_dst_stride[i];
|
| - }
|
| + restore_dst_buf(xd, orig_dst, orig_dst_stride);
|
| return INT64_MAX;
|
| }
|
| }
|
| @@ -2975,7 +2937,7 @@
|
| x->skip = 1;
|
|
|
| // The cost of skip bit needs to be added.
|
| - *rate2 += vp9_cost_bit(vp9_get_pred_prob_mbskip(cm, xd), 1);
|
| + *rate2 += vp9_cost_bit(vp9_get_skip_prob(cm, xd), 1);
|
|
|
| // Scaling factor for SSE from spatial domain to frequency domain
|
| // is 16. Adjust distortion accordingly.
|
| @@ -3003,10 +2965,7 @@
|
| if (*rate_y == INT_MAX) {
|
| *rate2 = INT_MAX;
|
| *distortion = INT64_MAX;
|
| - for (i = 0; i < MAX_MB_PLANE; i++) {
|
| - xd->plane[i].dst.buf = orig_dst[i];
|
| - xd->plane[i].dst.stride = orig_dst_stride[i];
|
| - }
|
| + restore_dst_buf(xd, orig_dst, orig_dst_stride);
|
| return INT64_MAX;
|
| }
|
|
|
| @@ -3021,10 +2980,7 @@
|
| if (*rate_uv == INT_MAX) {
|
| *rate2 = INT_MAX;
|
| *distortion = INT64_MAX;
|
| - for (i = 0; i < MAX_MB_PLANE; i++) {
|
| - xd->plane[i].dst.buf = orig_dst[i];
|
| - xd->plane[i].dst.stride = orig_dst_stride[i];
|
| - }
|
| + restore_dst_buf(xd, orig_dst, orig_dst_stride);
|
| return INT64_MAX;
|
| }
|
|
|
| @@ -3034,14 +2990,34 @@
|
| *skippable = skippable_y && skippable_uv;
|
| }
|
|
|
| - for (i = 0; i < MAX_MB_PLANE; i++) {
|
| - xd->plane[i].dst.buf = orig_dst[i];
|
| - xd->plane[i].dst.stride = orig_dst_stride[i];
|
| - }
|
| -
|
| + restore_dst_buf(xd, orig_dst, orig_dst_stride);
|
| return this_rd; // if 0, this will be re-calculated by caller
|
| }
|
|
|
| +static void swap_block_ptr(MACROBLOCK *x, PICK_MODE_CONTEXT *ctx,
|
| + int max_plane) {
|
| + struct macroblock_plane *const p = x->plane;
|
| + struct macroblockd_plane *const pd = x->e_mbd.plane;
|
| + int i;
|
| +
|
| + for (i = 0; i < max_plane; ++i) {
|
| + p[i].coeff = ctx->coeff_pbuf[i][1];
|
| + p[i].qcoeff = ctx->qcoeff_pbuf[i][1];
|
| + pd[i].dqcoeff = ctx->dqcoeff_pbuf[i][1];
|
| + p[i].eobs = ctx->eobs_pbuf[i][1];
|
| +
|
| + ctx->coeff_pbuf[i][1] = ctx->coeff_pbuf[i][0];
|
| + ctx->qcoeff_pbuf[i][1] = ctx->qcoeff_pbuf[i][0];
|
| + ctx->dqcoeff_pbuf[i][1] = ctx->dqcoeff_pbuf[i][0];
|
| + ctx->eobs_pbuf[i][1] = ctx->eobs_pbuf[i][0];
|
| +
|
| + ctx->coeff_pbuf[i][0] = p[i].coeff;
|
| + ctx->qcoeff_pbuf[i][0] = p[i].qcoeff;
|
| + ctx->dqcoeff_pbuf[i][0] = pd[i].dqcoeff;
|
| + ctx->eobs_pbuf[i][0] = p[i].eobs;
|
| + }
|
| +}
|
| +
|
| void vp9_rd_pick_intra_mode_sb(VP9_COMP *cpi, MACROBLOCK *x,
|
| int *returnrate, int64_t *returndist,
|
| BLOCK_SIZE bsize,
|
| @@ -3051,9 +3027,11 @@
|
| int rate_y = 0, rate_uv = 0, rate_y_tokenonly = 0, rate_uv_tokenonly = 0;
|
| int y_skip = 0, uv_skip = 0;
|
| int64_t dist_y = 0, dist_uv = 0, tx_cache[TX_MODES] = { 0 };
|
| + TX_SIZE max_uv_tx_size;
|
| x->skip_encode = 0;
|
| ctx->skip = 0;
|
| xd->mi_8x8[0]->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,
|
| @@ -3061,8 +3039,9 @@
|
| *returnrate = INT_MAX;
|
| return;
|
| }
|
| - rd_pick_intra_sbuv_mode(cpi, x, &rate_uv, &rate_uv_tokenonly,
|
| - &dist_uv, &uv_skip, bsize);
|
| + max_uv_tx_size = get_uv_tx_size_impl(xd->mi_8x8[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 {
|
| y_skip = 0;
|
| if (rd_pick_intra_sub_8x8_y_mode(cpi, x, &rate_y, &rate_y_tokenonly,
|
| @@ -3070,19 +3049,19 @@
|
| *returnrate = INT_MAX;
|
| return;
|
| }
|
| - rd_pick_intra_sbuv_mode(cpi, x, &rate_uv, &rate_uv_tokenonly,
|
| - &dist_uv, &uv_skip, BLOCK_8X8);
|
| + max_uv_tx_size = get_uv_tx_size_impl(xd->mi_8x8[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);
|
| }
|
|
|
| if (y_skip && uv_skip) {
|
| *returnrate = rate_y + rate_uv - rate_y_tokenonly - rate_uv_tokenonly +
|
| - vp9_cost_bit(vp9_get_pred_prob_mbskip(cm, xd), 1);
|
| + vp9_cost_bit(vp9_get_skip_prob(cm, xd), 1);
|
| *returndist = dist_y + dist_uv;
|
| vp9_zero(ctx->tx_rd_diff);
|
| } else {
|
| int i;
|
| - *returnrate = rate_y + rate_uv +
|
| - vp9_cost_bit(vp9_get_pred_prob_mbskip(cm, xd), 0);
|
| + *returnrate = rate_y + rate_uv + vp9_cost_bit(vp9_get_skip_prob(cm, xd), 0);
|
| *returndist = dist_y + dist_uv;
|
| if (cpi->sf.tx_size_search_method == USE_FULL_RD)
|
| for (i = 0; i < TX_MODES; i++) {
|
| @@ -3125,8 +3104,8 @@
|
| int64_t best_rd = best_rd_so_far;
|
| int64_t best_tx_rd[TX_MODES];
|
| int64_t best_tx_diff[TX_MODES];
|
| - int64_t best_pred_diff[NB_PREDICTION_TYPES];
|
| - int64_t best_pred_rd[NB_PREDICTION_TYPES];
|
| + int64_t best_pred_diff[REFERENCE_MODES];
|
| + int64_t best_pred_rd[REFERENCE_MODES];
|
| int64_t best_filter_rd[SWITCHABLE_FILTER_CONTEXTS];
|
| int64_t best_filter_diff[SWITCHABLE_FILTER_CONTEXTS];
|
| MB_MODE_INFO best_mbmode = { 0 };
|
| @@ -3153,7 +3132,7 @@
|
| 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 && x->q_index < QIDX_SKIP_THRESH;
|
|
|
| // Everywhere the flag is set the error is much higher than its neighbors.
|
| ctx->frames_with_high_error = 0;
|
| @@ -3162,7 +3141,7 @@
|
| estimate_ref_frame_costs(cpi, segment_id, ref_costs_single, ref_costs_comp,
|
| &comp_mode_p);
|
|
|
| - for (i = 0; i < NB_PREDICTION_TYPES; ++i)
|
| + for (i = 0; i < REFERENCE_MODES; ++i)
|
| best_pred_rd[i] = INT64_MAX;
|
| for (i = 0; i < TX_MODES; i++)
|
| best_tx_rd[i] = INT64_MAX;
|
| @@ -3192,8 +3171,8 @@
|
| case BLOCK_32X32:
|
| for (i = 0; i < 4; i++) {
|
| ref_frame_mask |=
|
| - x->mb_context[xd->sb_index][i].frames_with_high_error;
|
| - mode_mask |= x->mb_context[xd->sb_index][i].modes_with_high_error;
|
| + x->mb_context[x->sb_index][i].frames_with_high_error;
|
| + mode_mask |= x->mb_context[x->sb_index][i].modes_with_high_error;
|
| }
|
| break;
|
| default:
|
| @@ -3258,7 +3237,7 @@
|
| break;
|
| case NONE:
|
| case MAX_REF_FRAMES:
|
| - assert(!"Invalid Reference frame");
|
| + assert(0 && "Invalid Reference frame");
|
| }
|
| }
|
| if (cpi->mode_skip_mask & ((int64_t)1 << mode_index))
|
| @@ -3335,17 +3314,14 @@
|
| if (comp_pred) {
|
| if (!(cpi->ref_frame_flags & flag_list[second_ref_frame]))
|
| continue;
|
| - set_scale_factors(xd, ref_frame, second_ref_frame, scale_factor);
|
|
|
| - mode_excluded = mode_excluded
|
| - ? mode_excluded
|
| - : cm->comp_pred_mode == SINGLE_PREDICTION_ONLY;
|
| + set_scale_factors(xd, ref_frame, second_ref_frame, scale_factor);
|
| + 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->comp_pred_mode == COMP_PREDICTION_ONLY;
|
| - }
|
| + if (ref_frame != INTRA_FRAME && second_ref_frame != INTRA_FRAME)
|
| + mode_excluded = mode_excluded ?
|
| + mode_excluded : cm->reference_mode == COMPOUND_REFERENCE;
|
| }
|
|
|
| // Select prediction reference frames.
|
| @@ -3434,12 +3410,11 @@
|
| if (rate_y == INT_MAX)
|
| continue;
|
|
|
| - uv_tx = MIN(mbmi->tx_size, max_uv_txsize_lookup[bsize]);
|
| + uv_tx = get_uv_tx_size_impl(mbmi->tx_size, 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],
|
| - &dist_uv[uv_tx], &skip_uv[uv_tx],
|
| - &mode_uv[uv_tx]);
|
| + choose_intra_uv_mode(cpi, ctx, bsize, uv_tx,
|
| + &rate_uv_intra[uv_tx], &rate_uv_tokenonly[uv_tx],
|
| + &dist_uv[uv_tx], &skip_uv[uv_tx], &mode_uv[uv_tx]);
|
| }
|
|
|
| rate_uv = rate_uv_tokenonly[uv_tx];
|
| @@ -3467,9 +3442,8 @@
|
| continue;
|
| }
|
|
|
| - if (cm->comp_pred_mode == HYBRID_PREDICTION) {
|
| + if (cm->reference_mode == REFERENCE_MODE_SELECT)
|
| rate2 += compmode_cost;
|
| - }
|
|
|
| // Estimate the reference frame signaling cost and add it
|
| // to the rolling cost variable.
|
| @@ -3498,9 +3472,7 @@
|
| int prob_skip_cost;
|
|
|
| // Cost the skip mb case
|
| - vp9_prob skip_prob =
|
| - vp9_get_pred_prob_mbskip(cm, xd);
|
| -
|
| + vp9_prob skip_prob = vp9_get_skip_prob(cm, xd);
|
| if (skip_prob) {
|
| prob_skip_cost = vp9_cost_bit(skip_prob, 1);
|
| rate2 += prob_skip_cost;
|
| @@ -3510,14 +3482,10 @@
|
| if (RDCOST(x->rdmult, x->rddiv, rate_y + rate_uv, distortion2) <
|
| RDCOST(x->rdmult, x->rddiv, 0, total_sse)) {
|
| // Add in the cost of the no skip flag.
|
| - int prob_skip_cost = vp9_cost_bit(vp9_get_pred_prob_mbskip(cm, xd),
|
| - 0);
|
| - rate2 += prob_skip_cost;
|
| + rate2 += vp9_cost_bit(vp9_get_skip_prob(cm, xd), 0);
|
| } else {
|
| // FIXME(rbultje) make this work for splitmv also
|
| - int prob_skip_cost = vp9_cost_bit(vp9_get_pred_prob_mbskip(cm, xd),
|
| - 1);
|
| - rate2 += prob_skip_cost;
|
| + rate2 += vp9_cost_bit(vp9_get_skip_prob(cm, xd), 1);
|
| distortion2 = total_sse;
|
| assert(total_sse >= 0);
|
| rate2 -= (rate_y + rate_uv);
|
| @@ -3527,9 +3495,7 @@
|
| }
|
| } else if (mb_skip_allowed) {
|
| // Add in the cost of the no skip flag.
|
| - int prob_skip_cost = vp9_cost_bit(vp9_get_pred_prob_mbskip(cm, xd),
|
| - 0);
|
| - rate2 += prob_skip_cost;
|
| + rate2 += vp9_cost_bit(vp9_get_skip_prob(cm, xd), 0);
|
| }
|
|
|
| // Calculate the final RD estimate for this mode.
|
| @@ -3537,23 +3503,22 @@
|
| }
|
|
|
| // Keep record of best intra rd
|
| - if (xd->mi_8x8[0]->mbmi.ref_frame[0] == INTRA_FRAME &&
|
| - is_intra_mode(xd->mi_8x8[0]->mbmi.mode) &&
|
| + if (!is_inter_block(&xd->mi_8x8[0]->mbmi) &&
|
| this_rd < best_intra_rd) {
|
| best_intra_rd = this_rd;
|
| best_intra_mode = xd->mi_8x8[0]->mbmi.mode;
|
| }
|
| +
|
| // Keep record of best inter rd with single reference
|
| - if (xd->mi_8x8[0]->mbmi.ref_frame[0] > INTRA_FRAME &&
|
| - xd->mi_8x8[0]->mbmi.ref_frame[1] == NONE &&
|
| - !mode_excluded &&
|
| - this_rd < best_inter_rd) {
|
| + if (is_inter_block(&xd->mi_8x8[0]->mbmi) &&
|
| + !has_second_ref(&xd->mi_8x8[0]->mbmi) &&
|
| + !mode_excluded && this_rd < best_inter_rd) {
|
| best_inter_rd = this_rd;
|
| best_inter_ref_frame = ref_frame;
|
| }
|
|
|
| if (!disable_skip && ref_frame == INTRA_FRAME) {
|
| - for (i = 0; i < NB_PREDICTION_TYPES; ++i)
|
| + for (i = 0; i < REFERENCE_MODES; ++i)
|
| best_pred_rd[i] = MIN(best_pred_rd[i], this_rd);
|
| for (i = 0; i < SWITCHABLE_FILTER_CONTEXTS; i++)
|
| best_filter_rd[i] = MIN(best_filter_rd[i], this_rd);
|
| @@ -3571,6 +3536,7 @@
|
|
|
| // Did this mode help.. i.e. is it the new best mode
|
| if (this_rd < best_rd || x->skip) {
|
| + int max_plane = MAX_MB_PLANE;
|
| if (!mode_excluded) {
|
| // Note index of best mode so far
|
| best_mode_index = mode_index;
|
| @@ -3578,6 +3544,7 @@
|
| if (ref_frame == INTRA_FRAME) {
|
| /* required for left and above block mv */
|
| mbmi->mv[0].as_int = 0;
|
| + max_plane = 1;
|
| }
|
|
|
| *returnrate = rate2;
|
| @@ -3585,6 +3552,8 @@
|
| best_rd = this_rd;
|
| best_mbmode = *mbmi;
|
| 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],
|
| sizeof(uint8_t) * ctx->num_4x4_blk);
|
|
|
| @@ -3609,9 +3578,9 @@
|
|
|
| /* keep record of best compound/single-only prediction */
|
| if (!disable_skip && ref_frame != INTRA_FRAME) {
|
| - int single_rd, hybrid_rd, single_rate, hybrid_rate;
|
| + int64_t single_rd, hybrid_rd, single_rate, hybrid_rate;
|
|
|
| - if (cm->comp_pred_mode == HYBRID_PREDICTION) {
|
| + if (cm->reference_mode == REFERENCE_MODE_SELECT) {
|
| single_rate = rate2 - compmode_cost;
|
| hybrid_rate = rate2;
|
| } else {
|
| @@ -3623,14 +3592,14 @@
|
| hybrid_rd = RDCOST(x->rdmult, x->rddiv, hybrid_rate, distortion2);
|
|
|
| if (second_ref_frame <= INTRA_FRAME &&
|
| - single_rd < best_pred_rd[SINGLE_PREDICTION_ONLY]) {
|
| - best_pred_rd[SINGLE_PREDICTION_ONLY] = single_rd;
|
| + 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[COMP_PREDICTION_ONLY]) {
|
| - best_pred_rd[COMP_PREDICTION_ONLY] = single_rd;
|
| + single_rd < best_pred_rd[COMPOUND_REFERENCE]) {
|
| + best_pred_rd[COMPOUND_REFERENCE] = single_rd;
|
| }
|
| - if (hybrid_rd < best_pred_rd[HYBRID_PREDICTION])
|
| - best_pred_rd[HYBRID_PREDICTION] = hybrid_rd;
|
| + if (hybrid_rd < best_pred_rd[REFERENCE_MODE_SELECT])
|
| + best_pred_rd[REFERENCE_MODE_SELECT] = hybrid_rd;
|
| }
|
|
|
| /* keep record of best filter type */
|
| @@ -3690,12 +3659,15 @@
|
| if (cpi->sf.use_uv_intra_rd_estimate) {
|
| // Do Intra UV best rd mode selection if best mode choice above was intra.
|
| if (vp9_mode_order[best_mode_index].ref_frame == INTRA_FRAME) {
|
| - TX_SIZE uv_tx_size = get_uv_tx_size(mbmi);
|
| - rd_pick_intra_sbuv_mode(cpi, x, &rate_uv_intra[uv_tx_size],
|
| + TX_SIZE uv_tx_size;
|
| + *mbmi = best_mbmode;
|
| + uv_tx_size = get_uv_tx_size(mbmi);
|
| + rd_pick_intra_sbuv_mode(cpi, x, ctx, &rate_uv_intra[uv_tx_size],
|
| &rate_uv_tokenonly[uv_tx_size],
|
| &dist_uv[uv_tx_size],
|
| &skip_uv[uv_tx_size],
|
| - bsize < BLOCK_8X8 ? BLOCK_8X8 : bsize);
|
| + bsize < BLOCK_8X8 ? BLOCK_8X8 : bsize,
|
| + uv_tx_size);
|
| }
|
| }
|
|
|
| @@ -3725,7 +3697,7 @@
|
|
|
| assert((cm->mcomp_filter_type == SWITCHABLE) ||
|
| (cm->mcomp_filter_type == best_mbmode.interp_filter) ||
|
| - (best_mbmode.ref_frame[0] == INTRA_FRAME));
|
| + !is_inter_block(&best_mbmode));
|
|
|
| // Updating rd_thresh_freq_fact[] here means that the different
|
| // partition/block sizes are handled independently based on the best
|
| @@ -3752,7 +3724,7 @@
|
| *mbmi = best_mbmode;
|
| x->skip |= best_skip2;
|
|
|
| - for (i = 0; i < NB_PREDICTION_TYPES; ++i) {
|
| + for (i = 0; i < REFERENCE_MODES; ++i) {
|
| if (best_pred_rd[i] == INT64_MAX)
|
| best_pred_diff[i] = INT_MIN;
|
| else
|
| @@ -3823,8 +3795,8 @@
|
| int64_t best_yrd = best_rd_so_far; // FIXME(rbultje) more precise
|
| int64_t best_tx_rd[TX_MODES];
|
| int64_t best_tx_diff[TX_MODES];
|
| - int64_t best_pred_diff[NB_PREDICTION_TYPES];
|
| - int64_t best_pred_rd[NB_PREDICTION_TYPES];
|
| + int64_t best_pred_diff[REFERENCE_MODES];
|
| + int64_t best_pred_rd[REFERENCE_MODES];
|
| int64_t best_filter_rd[SWITCHABLE_FILTER_CONTEXTS];
|
| int64_t best_filter_diff[SWITCHABLE_FILTER_CONTEXTS];
|
| MB_MODE_INFO best_mbmode = { 0 };
|
| @@ -3839,15 +3811,13 @@
|
| int skip_uv[TX_SIZES];
|
| MB_PREDICTION_MODE mode_uv[TX_SIZES] = { 0 };
|
| struct scale_factors scale_factor[4];
|
| - unsigned int ref_frame_mask = 0;
|
| - unsigned int mode_mask = 0;
|
| int intra_cost_penalty = 20 * vp9_dc_quant(cpi->common.base_qindex,
|
| cpi->common.y_dc_delta_q);
|
| int_mv seg_mvs[4][MAX_REF_FRAMES];
|
| b_mode_info best_bmodes[4];
|
| 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 && x->q_index < QIDX_SKIP_THRESH;
|
| vpx_memset(x->zcoeff_blk[TX_4X4], 0, 4);
|
|
|
| for (i = 0; i < 4; i++) {
|
| @@ -3859,7 +3829,7 @@
|
| estimate_ref_frame_costs(cpi, segment_id, ref_costs_single, ref_costs_comp,
|
| &comp_mode_p);
|
|
|
| - for (i = 0; i < NB_PREDICTION_TYPES; ++i)
|
| + for (i = 0; i < REFERENCE_MODES; ++i)
|
| best_pred_rd[i] = INT64_MAX;
|
| for (i = 0; i < TX_MODES; i++)
|
| best_tx_rd[i] = INT64_MAX;
|
| @@ -3870,15 +3840,6 @@
|
|
|
| *returnrate = INT_MAX;
|
|
|
| - // Create a mask set to 1 for each reference frame used by a smaller
|
| - // resolution.
|
| - if (cpi->sf.use_avoid_tested_higherror) {
|
| - ref_frame_mask = 0;
|
| - mode_mask = 0;
|
| - ref_frame_mask = ~ref_frame_mask;
|
| - mode_mask = ~mode_mask;
|
| - }
|
| -
|
| for (ref_frame = LAST_FRAME; ref_frame <= ALTREF_FRAME; ref_frame++) {
|
| if (cpi->ref_frame_flags & flag_list[ref_frame]) {
|
| setup_buffer_inter(cpi, x, tile, idx_list[ref_frame], ref_frame,
|
| @@ -3930,7 +3891,7 @@
|
| break;
|
| case NONE:
|
| case MAX_REF_FRAMES:
|
| - assert(!"Invalid Reference frame");
|
| + assert(0 && "Invalid Reference frame");
|
| }
|
| }
|
| if (cpi->mode_skip_mask & ((int64_t)1 << mode_index))
|
| @@ -4001,14 +3962,12 @@
|
| continue;
|
| set_scale_factors(xd, ref_frame, second_ref_frame, scale_factor);
|
|
|
| - mode_excluded = mode_excluded
|
| - ? mode_excluded
|
| - : cm->comp_pred_mode == SINGLE_PREDICTION_ONLY;
|
| + 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->comp_pred_mode == COMP_PREDICTION_ONLY;
|
| + mode_excluded = mode_excluded ?
|
| + mode_excluded : cm->reference_mode == COMPOUND_REFERENCE;
|
| }
|
| }
|
|
|
| @@ -4060,7 +4019,8 @@
|
| distortion2 += distortion_y;
|
|
|
| if (rate_uv_intra[TX_4X4] == INT_MAX) {
|
| - choose_intra_uv_mode(cpi, bsize, &rate_uv_intra[TX_4X4],
|
| + choose_intra_uv_mode(cpi, ctx, bsize, TX_4X4,
|
| + &rate_uv_intra[TX_4X4],
|
| &rate_uv_tokenonly[TX_4X4],
|
| &dist_uv[TX_4X4], &skip_uv[TX_4X4],
|
| &mode_uv[TX_4X4]);
|
| @@ -4104,6 +4064,14 @@
|
| cpi->sf.disable_filter_search_var_thresh) {
|
| tmp_best_filter = EIGHTTAP;
|
| vp9_zero(cpi->rd_filter_cache);
|
| + } else if (cpi->sf.adaptive_pred_filter_type == 1 &&
|
| + ctx->pred_filter_type < SWITCHABLE) {
|
| + tmp_best_filter = ctx->pred_filter_type;
|
| + vp9_zero(cpi->rd_filter_cache);
|
| + } else if (cpi->sf.adaptive_pred_filter_type == 2) {
|
| + tmp_best_filter = ctx->pred_filter_type < SWITCHABLE ?
|
| + ctx->pred_filter_type : 0;
|
| + vp9_zero(cpi->rd_filter_cache);
|
| } else {
|
| for (switchable_filter_index = 0;
|
| switchable_filter_index < SWITCHABLE_FILTERS;
|
| @@ -4151,7 +4119,7 @@
|
| tmp_best_mbmode = *mbmi;
|
| for (i = 0; i < 4; i++) {
|
| tmp_best_bmodes[i] = xd->mi_8x8[0]->bmi[i];
|
| - x->zcoeff_blk[TX_4X4][i] = !xd->plane[0].eobs[i];
|
| + x->zcoeff_blk[TX_4X4][i] = !x->plane[0].eobs[i];
|
| }
|
| pred_exists = 1;
|
| if (switchable_filter_index == 0 &&
|
| @@ -4170,7 +4138,7 @@
|
| }
|
| }
|
|
|
| - if (tmp_best_rdu == INT64_MAX)
|
| + if (tmp_best_rdu == INT64_MAX && pred_exists)
|
| continue;
|
|
|
| mbmi->interp_filter = (cm->mcomp_filter_type == SWITCHABLE ?
|
| @@ -4212,12 +4180,11 @@
|
| if (cpi->common.mcomp_filter_type == SWITCHABLE)
|
| rate2 += get_switchable_rate(x);
|
|
|
| - if (!mode_excluded) {
|
| - if (comp_pred)
|
| - mode_excluded = cpi->common.comp_pred_mode == SINGLE_PREDICTION_ONLY;
|
| - else
|
| - mode_excluded = cpi->common.comp_pred_mode == COMP_PREDICTION_ONLY;
|
| - }
|
| + if (!mode_excluded)
|
| + mode_excluded = comp_pred
|
| + ? cpi->common.reference_mode == SINGLE_REFERENCE
|
| + : cpi->common.reference_mode == COMPOUND_REFERENCE;
|
| +
|
| compmode_cost = vp9_cost_bit(comp_mode_p, comp_pred);
|
|
|
| tmp_best_rdu = best_rd -
|
| @@ -4244,9 +4211,8 @@
|
| }
|
| }
|
|
|
| - if (cpi->common.comp_pred_mode == HYBRID_PREDICTION) {
|
| + if (cpi->common.reference_mode == REFERENCE_MODE_SELECT)
|
| rate2 += compmode_cost;
|
| - }
|
|
|
| // Estimate the reference frame signaling cost and add it
|
| // to the rolling cost variable.
|
| @@ -4269,14 +4235,10 @@
|
| if (RDCOST(x->rdmult, x->rddiv, rate_y + rate_uv, distortion2) <
|
| RDCOST(x->rdmult, x->rddiv, 0, total_sse)) {
|
| // Add in the cost of the no skip flag.
|
| - int prob_skip_cost = vp9_cost_bit(vp9_get_pred_prob_mbskip(cm, xd),
|
| - 0);
|
| - rate2 += prob_skip_cost;
|
| + rate2 += vp9_cost_bit(vp9_get_skip_prob(cm, xd), 0);
|
| } else {
|
| // FIXME(rbultje) make this work for splitmv also
|
| - int prob_skip_cost = vp9_cost_bit(vp9_get_pred_prob_mbskip(cm, xd),
|
| - 1);
|
| - rate2 += prob_skip_cost;
|
| + rate2 += vp9_cost_bit(vp9_get_skip_prob(cm, xd), 1);
|
| distortion2 = total_sse;
|
| assert(total_sse >= 0);
|
| rate2 -= (rate_y + rate_uv);
|
| @@ -4286,9 +4248,7 @@
|
| }
|
| } else if (mb_skip_allowed) {
|
| // Add in the cost of the no skip flag.
|
| - int prob_skip_cost = vp9_cost_bit(vp9_get_pred_prob_mbskip(cm, xd),
|
| - 0);
|
| - rate2 += prob_skip_cost;
|
| + rate2 += vp9_cost_bit(vp9_get_skip_prob(cm, xd), 0);
|
| }
|
|
|
| // Calculate the final RD estimate for this mode.
|
| @@ -4296,8 +4256,8 @@
|
| }
|
|
|
| // Keep record of best inter rd with single reference
|
| - if (xd->mi_8x8[0]->mbmi.ref_frame[0] > INTRA_FRAME &&
|
| - xd->mi_8x8[0]->mbmi.ref_frame[1] == NONE &&
|
| + if (is_inter_block(&xd->mi_8x8[0]->mbmi) &&
|
| + !has_second_ref(&xd->mi_8x8[0]->mbmi) &&
|
| !mode_excluded &&
|
| this_rd < best_inter_rd) {
|
| best_inter_rd = this_rd;
|
| @@ -4305,7 +4265,7 @@
|
| }
|
|
|
| if (!disable_skip && ref_frame == INTRA_FRAME) {
|
| - for (i = 0; i < NB_PREDICTION_TYPES; ++i)
|
| + for (i = 0; i < REFERENCE_MODES; ++i)
|
| best_pred_rd[i] = MIN(best_pred_rd[i], this_rd);
|
| for (i = 0; i < SWITCHABLE_FILTER_CONTEXTS; i++)
|
| best_filter_rd[i] = MIN(best_filter_rd[i], this_rd);
|
| @@ -4314,12 +4274,14 @@
|
| // Did this mode help.. i.e. is it the new best mode
|
| if (this_rd < best_rd || x->skip) {
|
| if (!mode_excluded) {
|
| + int max_plane = MAX_MB_PLANE;
|
| // Note index of best mode so far
|
| best_mode_index = mode_index;
|
|
|
| if (ref_frame == INTRA_FRAME) {
|
| /* required for left and above block mv */
|
| mbmi->mv[0].as_int = 0;
|
| + max_plane = 1;
|
| }
|
|
|
| *returnrate = rate2;
|
| @@ -4329,6 +4291,8 @@
|
| RDCOST(x->rdmult, x->rddiv, rate_uv, distortion_uv);
|
| best_mbmode = *mbmi;
|
| 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],
|
| sizeof(uint8_t) * ctx->num_4x4_blk);
|
|
|
| @@ -4356,9 +4320,9 @@
|
|
|
| /* keep record of best compound/single-only prediction */
|
| if (!disable_skip && ref_frame != INTRA_FRAME) {
|
| - int single_rd, hybrid_rd, single_rate, hybrid_rate;
|
| + int64_t single_rd, hybrid_rd, single_rate, hybrid_rate;
|
|
|
| - if (cpi->common.comp_pred_mode == HYBRID_PREDICTION) {
|
| + if (cpi->common.reference_mode == REFERENCE_MODE_SELECT) {
|
| single_rate = rate2 - compmode_cost;
|
| hybrid_rate = rate2;
|
| } else {
|
| @@ -4370,14 +4334,14 @@
|
| hybrid_rd = RDCOST(x->rdmult, x->rddiv, hybrid_rate, distortion2);
|
|
|
| if (second_ref_frame <= INTRA_FRAME &&
|
| - single_rd < best_pred_rd[SINGLE_PREDICTION_ONLY]) {
|
| - best_pred_rd[SINGLE_PREDICTION_ONLY] = single_rd;
|
| + 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[COMP_PREDICTION_ONLY]) {
|
| - best_pred_rd[COMP_PREDICTION_ONLY] = single_rd;
|
| + single_rd < best_pred_rd[COMPOUND_REFERENCE]) {
|
| + best_pred_rd[COMPOUND_REFERENCE] = single_rd;
|
| }
|
| - if (hybrid_rd < best_pred_rd[HYBRID_PREDICTION])
|
| - best_pred_rd[HYBRID_PREDICTION] = hybrid_rd;
|
| + if (hybrid_rd < best_pred_rd[REFERENCE_MODE_SELECT])
|
| + best_pred_rd[REFERENCE_MODE_SELECT] = hybrid_rd;
|
| }
|
|
|
| /* keep record of best filter type */
|
| @@ -4434,12 +4398,14 @@
|
| if (cpi->sf.use_uv_intra_rd_estimate) {
|
| // Do Intra UV best rd mode selection if best mode choice above was intra.
|
| if (vp9_ref_order[best_mode_index].ref_frame == INTRA_FRAME) {
|
| - TX_SIZE uv_tx_size = get_uv_tx_size(mbmi);
|
| - rd_pick_intra_sbuv_mode(cpi, x, &rate_uv_intra[uv_tx_size],
|
| + TX_SIZE uv_tx_size;
|
| + *mbmi = best_mbmode;
|
| + uv_tx_size = get_uv_tx_size(mbmi);
|
| + rd_pick_intra_sbuv_mode(cpi, x, ctx, &rate_uv_intra[uv_tx_size],
|
| &rate_uv_tokenonly[uv_tx_size],
|
| &dist_uv[uv_tx_size],
|
| &skip_uv[uv_tx_size],
|
| - BLOCK_8X8);
|
| + BLOCK_8X8, uv_tx_size);
|
| }
|
| }
|
|
|
| @@ -4456,7 +4422,7 @@
|
|
|
| assert((cm->mcomp_filter_type == SWITCHABLE) ||
|
| (cm->mcomp_filter_type == best_mbmode.interp_filter) ||
|
| - (best_mbmode.ref_frame[0] == INTRA_FRAME));
|
| + !is_inter_block(&best_mbmode));
|
|
|
| // Updating rd_thresh_freq_fact[] here means that the different
|
| // partition/block sizes are handled independently based on the best
|
| @@ -4482,7 +4448,7 @@
|
| // macroblock modes
|
| *mbmi = best_mbmode;
|
| x->skip |= best_skip2;
|
| - if (best_mbmode.ref_frame[0] == INTRA_FRAME) {
|
| + 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;
|
| } else {
|
| @@ -4493,7 +4459,7 @@
|
| mbmi->mv[1].as_int = xd->mi_8x8[0]->bmi[3].as_mv[1].as_int;
|
| }
|
|
|
| - for (i = 0; i < NB_PREDICTION_TYPES; ++i) {
|
| + for (i = 0; i < REFERENCE_MODES; ++i) {
|
| if (best_pred_rd[i] == INT64_MAX)
|
| best_pred_diff[i] = INT_MIN;
|
| else
|
|
|