| OLD | NEW |
| 1 /* | 1 /* |
| 2 * Copyright (c) 2010 The WebM project authors. All Rights Reserved. | 2 * Copyright (c) 2010 The WebM project authors. All Rights Reserved. |
| 3 * | 3 * |
| 4 * Use of this source code is governed by a BSD-style license | 4 * Use of this source code is governed by a BSD-style license |
| 5 * that can be found in the LICENSE file in the root of the source | 5 * that can be found in the LICENSE file in the root of the source |
| 6 * tree. An additional intellectual property rights grant can be found | 6 * tree. An additional intellectual property rights grant can be found |
| 7 * in the file PATENTS. All contributing project authors may | 7 * in the file PATENTS. All contributing project authors may |
| 8 * be found in the AUTHORS file in the root of the source tree. | 8 * be found in the AUTHORS file in the root of the source tree. |
| 9 */ | 9 */ |
| 10 | 10 |
| 11 #include <stdio.h> | 11 #include <stdio.h> |
| 12 #include <math.h> | 12 #include <math.h> |
| 13 #include <limits.h> | 13 #include <limits.h> |
| 14 #include <assert.h> | 14 #include <assert.h> |
| 15 | 15 |
| 16 #include "vp9/common/vp9_pragmas.h" | 16 #include "vp9/common/vp9_pragmas.h" |
| 17 #include "vp9/encoder/vp9_tokenize.h" | 17 #include "vp9/encoder/vp9_tokenize.h" |
| 18 #include "vp9/encoder/vp9_treewriter.h" | 18 #include "vp9/encoder/vp9_treewriter.h" |
| 19 #include "vp9/encoder/vp9_onyx_int.h" | 19 #include "vp9/encoder/vp9_onyx_int.h" |
| 20 #include "vp9/encoder/vp9_modecosts.h" | |
| 21 #include "vp9/encoder/vp9_encodeintra.h" | |
| 22 #include "vp9/common/vp9_entropymode.h" | 20 #include "vp9/common/vp9_entropymode.h" |
| 23 #include "vp9/common/vp9_reconinter.h" | 21 #include "vp9/common/vp9_reconinter.h" |
| 24 #include "vp9/common/vp9_reconintra.h" | 22 #include "vp9/common/vp9_reconintra.h" |
| 25 #include "vp9/common/vp9_findnearmv.h" | 23 #include "vp9/common/vp9_findnearmv.h" |
| 26 #include "vp9/common/vp9_quant_common.h" | 24 #include "vp9/common/vp9_quant_common.h" |
| 27 #include "vp9/encoder/vp9_encodemb.h" | 25 #include "vp9/encoder/vp9_encodemb.h" |
| 28 #include "vp9/encoder/vp9_quantize.h" | 26 #include "vp9/encoder/vp9_quantize.h" |
| 29 #include "vp9/encoder/vp9_variance.h" | 27 #include "vp9/encoder/vp9_variance.h" |
| 30 #include "vp9/encoder/vp9_mcomp.h" | 28 #include "vp9/encoder/vp9_mcomp.h" |
| 31 #include "vp9/encoder/vp9_rdopt.h" | 29 #include "vp9/encoder/vp9_rdopt.h" |
| (...skipping 76 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 108 {2, 3, 3, 4, 6, 6, 8, 12, 12, 16, 24, 24, 32}; | 106 {2, 3, 3, 4, 6, 6, 8, 12, 12, 16, 24, 24, 32}; |
| 109 | 107 |
| 110 #define RD_THRESH_MAX_FACT 64 | 108 #define RD_THRESH_MAX_FACT 64 |
| 111 #define RD_THRESH_INC 1 | 109 #define RD_THRESH_INC 1 |
| 112 #define RD_THRESH_POW 1.25 | 110 #define RD_THRESH_POW 1.25 |
| 113 #define RD_MULT_EPB_RATIO 64 | 111 #define RD_MULT_EPB_RATIO 64 |
| 114 | 112 |
| 115 #define MV_COST_WEIGHT 108 | 113 #define MV_COST_WEIGHT 108 |
| 116 #define MV_COST_WEIGHT_SUB 120 | 114 #define MV_COST_WEIGHT_SUB 120 |
| 117 | 115 |
| 116 static int raster_block_offset(BLOCK_SIZE plane_bsize, |
| 117 int raster_block, int stride) { |
| 118 const int bw = b_width_log2(plane_bsize); |
| 119 const int y = 4 * (raster_block >> bw); |
| 120 const int x = 4 * (raster_block & ((1 << bw) - 1)); |
| 121 return y * stride + x; |
| 122 } |
| 123 static int16_t* raster_block_offset_int16(BLOCK_SIZE plane_bsize, |
| 124 int raster_block, int16_t *base) { |
| 125 const int stride = 4 * num_4x4_blocks_wide_lookup[plane_bsize]; |
| 126 return base + raster_block_offset(plane_bsize, raster_block, stride); |
| 127 } |
| 128 |
| 129 static void fill_mode_costs(VP9_COMP *c) { |
| 130 VP9_COMMON *const cm = &c->common; |
| 131 int i, j; |
| 132 |
| 133 for (i = 0; i < INTRA_MODES; i++) |
| 134 for (j = 0; j < INTRA_MODES; j++) |
| 135 vp9_cost_tokens((int *)c->mb.y_mode_costs[i][j], vp9_kf_y_mode_prob[i][j], |
| 136 vp9_intra_mode_tree); |
| 137 |
| 138 // TODO(rbultje) separate tables for superblock costing? |
| 139 vp9_cost_tokens(c->mb.mbmode_cost, cm->fc.y_mode_prob[1], |
| 140 vp9_intra_mode_tree); |
| 141 vp9_cost_tokens(c->mb.intra_uv_mode_cost[1], |
| 142 cm->fc.uv_mode_prob[INTRA_MODES - 1], vp9_intra_mode_tree); |
| 143 vp9_cost_tokens(c->mb.intra_uv_mode_cost[0], |
| 144 vp9_kf_uv_mode_prob[INTRA_MODES - 1], |
| 145 vp9_intra_mode_tree); |
| 146 |
| 147 for (i = 0; i < SWITCHABLE_FILTER_CONTEXTS; ++i) |
| 148 vp9_cost_tokens((int *)c->mb.switchable_interp_costs[i], |
| 149 cm->fc.switchable_interp_prob[i], |
| 150 vp9_switchable_interp_tree); |
| 151 } |
| 152 |
| 118 static void fill_token_costs(vp9_coeff_cost *c, | 153 static void fill_token_costs(vp9_coeff_cost *c, |
| 119 vp9_coeff_probs_model (*p)[BLOCK_TYPES]) { | 154 vp9_coeff_probs_model (*p)[PLANE_TYPES]) { |
| 120 int i, j, k, l; | 155 int i, j, k, l; |
| 121 TX_SIZE t; | 156 TX_SIZE t; |
| 122 for (t = TX_4X4; t <= TX_32X32; t++) | 157 for (t = TX_4X4; t <= TX_32X32; ++t) |
| 123 for (i = 0; i < BLOCK_TYPES; i++) | 158 for (i = 0; i < PLANE_TYPES; ++i) |
| 124 for (j = 0; j < REF_TYPES; j++) | 159 for (j = 0; j < REF_TYPES; ++j) |
| 125 for (k = 0; k < COEF_BANDS; k++) | 160 for (k = 0; k < COEF_BANDS; ++k) |
| 126 for (l = 0; l < PREV_COEF_CONTEXTS; l++) { | 161 for (l = 0; l < BAND_COEFF_CONTEXTS(k); ++l) { |
| 127 vp9_prob probs[ENTROPY_NODES]; | 162 vp9_prob probs[ENTROPY_NODES]; |
| 128 vp9_model_to_full_probs(p[t][i][j][k][l], probs); | 163 vp9_model_to_full_probs(p[t][i][j][k][l], probs); |
| 129 vp9_cost_tokens((int *)c[t][i][j][k][0][l], probs, | 164 vp9_cost_tokens((int *)c[t][i][j][k][0][l], probs, |
| 130 vp9_coef_tree); | 165 vp9_coef_tree); |
| 131 vp9_cost_tokens_skip((int *)c[t][i][j][k][1][l], probs, | 166 vp9_cost_tokens_skip((int *)c[t][i][j][k][1][l], probs, |
| 132 vp9_coef_tree); | 167 vp9_coef_tree); |
| 133 assert(c[t][i][j][k][0][l][DCT_EOB_TOKEN] == | 168 assert(c[t][i][j][k][0][l][EOB_TOKEN] == |
| 134 c[t][i][j][k][1][l][DCT_EOB_TOKEN]); | 169 c[t][i][j][k][1][l][EOB_TOKEN]); |
| 135 } | 170 } |
| 136 } | 171 } |
| 137 | 172 |
| 138 static const int rd_iifactor[32] = { | 173 static const int rd_iifactor[32] = { |
| 139 4, 4, 3, 2, 1, 0, 0, 0, | 174 4, 4, 3, 2, 1, 0, 0, 0, |
| 140 0, 0, 0, 0, 0, 0, 0, 0, | 175 0, 0, 0, 0, 0, 0, 0, 0, |
| 141 0, 0, 0, 0, 0, 0, 0, 0, | 176 0, 0, 0, 0, 0, 0, 0, 0, |
| 142 0, 0, 0, 0, 0, 0, 0, 0, | 177 0, 0, 0, 0, 0, 0, 0, 0, |
| 143 }; | 178 }; |
| 144 | 179 |
| (...skipping 94 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 239 qindex = clamp(cm->base_qindex + cm->y_dc_delta_q, 0, MAXQ); | 274 qindex = clamp(cm->base_qindex + cm->y_dc_delta_q, 0, MAXQ); |
| 240 | 275 |
| 241 cpi->RDDIV = RDDIV_BITS; // in bits (to multiply D by 128) | 276 cpi->RDDIV = RDDIV_BITS; // in bits (to multiply D by 128) |
| 242 cpi->RDMULT = vp9_compute_rd_mult(cpi, qindex); | 277 cpi->RDMULT = vp9_compute_rd_mult(cpi, qindex); |
| 243 | 278 |
| 244 cpi->mb.errorperbit = cpi->RDMULT / RD_MULT_EPB_RATIO; | 279 cpi->mb.errorperbit = cpi->RDMULT / RD_MULT_EPB_RATIO; |
| 245 cpi->mb.errorperbit += (cpi->mb.errorperbit == 0); | 280 cpi->mb.errorperbit += (cpi->mb.errorperbit == 0); |
| 246 | 281 |
| 247 vp9_set_speed_features(cpi); | 282 vp9_set_speed_features(cpi); |
| 248 | 283 |
| 284 cpi->mb.select_txfm_size = (cpi->sf.tx_size_search_method == USE_LARGESTALL && |
| 285 cm->frame_type != KEY_FRAME) ? |
| 286 0 : 1; |
| 287 |
| 249 set_block_thresholds(cpi); | 288 set_block_thresholds(cpi); |
| 250 | 289 |
| 251 fill_token_costs(cpi->mb.token_costs, cm->fc.coef_probs); | 290 fill_token_costs(cpi->mb.token_costs, cm->fc.coef_probs); |
| 252 | 291 |
| 253 for (i = 0; i < PARTITION_CONTEXTS; i++) | 292 for (i = 0; i < PARTITION_CONTEXTS; i++) |
| 254 vp9_cost_tokens(cpi->mb.partition_cost[i], | 293 vp9_cost_tokens(cpi->mb.partition_cost[i], get_partition_probs(cm, i), |
| 255 cm->fc.partition_prob[cm->frame_type][i], | |
| 256 vp9_partition_tree); | 294 vp9_partition_tree); |
| 257 | 295 |
| 258 /*rough estimate for costing*/ | 296 /*rough estimate for costing*/ |
| 259 vp9_init_mode_costs(cpi); | 297 fill_mode_costs(cpi); |
| 260 | 298 |
| 261 if (!frame_is_intra_only(cm)) { | 299 if (!frame_is_intra_only(cm)) { |
| 262 vp9_build_nmv_cost_table( | 300 vp9_build_nmv_cost_table( |
| 263 cpi->mb.nmvjointcost, | 301 cpi->mb.nmvjointcost, |
| 264 cm->allow_high_precision_mv ? cpi->mb.nmvcost_hp : cpi->mb.nmvcost, | 302 cm->allow_high_precision_mv ? cpi->mb.nmvcost_hp : cpi->mb.nmvcost, |
| 265 &cm->fc.nmvc, | 303 &cm->fc.nmvc, |
| 266 cm->allow_high_precision_mv, 1, 1); | 304 cm->allow_high_precision_mv, 1, 1); |
| 267 | 305 |
| 268 for (i = 0; i < INTER_MODE_CONTEXTS; i++) { | 306 for (i = 0; i < INTER_MODE_CONTEXTS; ++i) |
| 269 MB_PREDICTION_MODE m; | 307 vp9_cost_tokens((int *)cpi->mb.inter_mode_cost[i], |
| 270 | 308 cm->fc.inter_mode_probs[i], vp9_inter_mode_tree); |
| 271 for (m = NEARESTMV; m < MB_MODE_COUNT; m++) | |
| 272 cpi->mb.inter_mode_cost[i][inter_mode_offset(m)] = | |
| 273 cost_token(vp9_inter_mode_tree, | |
| 274 cm->fc.inter_mode_probs[i], | |
| 275 &vp9_inter_mode_encodings[inter_mode_offset(m)]); | |
| 276 } | |
| 277 } | 309 } |
| 278 } | 310 } |
| 279 | 311 |
| 280 static INLINE void linear_interpolate2(double x, int ntab, int inv_step, | 312 static INLINE void linear_interpolate2(double x, int ntab, int inv_step, |
| 281 const double *tab1, const double *tab2, | 313 const double *tab1, const double *tab2, |
| 282 double *v1, double *v2) { | 314 double *v1, double *v2) { |
| 283 double y = x * inv_step; | 315 double y = x * inv_step; |
| 284 int d = (int) y; | 316 int d = (int) y; |
| 285 if (d >= ntab - 1) { | 317 if (d >= ntab - 1) { |
| 286 *v1 = tab1[ntab - 1]; | 318 *v1 = tab1[ntab - 1]; |
| (...skipping 195 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 482 { 1, 2, 3, 4, 11, 1024 - 21, 0 }, | 514 { 1, 2, 3, 4, 11, 1024 - 21, 0 }, |
| 483 }; | 515 }; |
| 484 | 516 |
| 485 static INLINE int cost_coeffs(MACROBLOCK *x, | 517 static INLINE int cost_coeffs(MACROBLOCK *x, |
| 486 int plane, int block, | 518 int plane, int block, |
| 487 ENTROPY_CONTEXT *A, ENTROPY_CONTEXT *L, | 519 ENTROPY_CONTEXT *A, ENTROPY_CONTEXT *L, |
| 488 TX_SIZE tx_size, | 520 TX_SIZE tx_size, |
| 489 const int16_t *scan, const int16_t *nb) { | 521 const int16_t *scan, const int16_t *nb) { |
| 490 MACROBLOCKD *const xd = &x->e_mbd; | 522 MACROBLOCKD *const xd = &x->e_mbd; |
| 491 MB_MODE_INFO *mbmi = &xd->mi_8x8[0]->mbmi; | 523 MB_MODE_INFO *mbmi = &xd->mi_8x8[0]->mbmi; |
| 524 struct macroblock_plane *p = &x->plane[plane]; |
| 492 struct macroblockd_plane *pd = &xd->plane[plane]; | 525 struct macroblockd_plane *pd = &xd->plane[plane]; |
| 493 const PLANE_TYPE type = pd->plane_type; | 526 const PLANE_TYPE type = pd->plane_type; |
| 494 const int16_t *band_count = &band_counts[tx_size][1]; | 527 const int16_t *band_count = &band_counts[tx_size][1]; |
| 495 const int eob = pd->eobs[block]; | 528 const int eob = p->eobs[block]; |
| 496 const int16_t *const qcoeff_ptr = BLOCK_OFFSET(pd->qcoeff, block); | 529 const int16_t *const qcoeff_ptr = BLOCK_OFFSET(p->qcoeff, block); |
| 497 const int ref = mbmi->ref_frame[0] != INTRA_FRAME; | 530 const int ref = mbmi->ref_frame[0] != INTRA_FRAME; |
| 498 unsigned int (*token_costs)[2][PREV_COEF_CONTEXTS][MAX_ENTROPY_TOKENS] = | 531 unsigned int (*token_costs)[2][COEFF_CONTEXTS][ENTROPY_TOKENS] = |
| 499 x->token_costs[tx_size][type][ref]; | 532 x->token_costs[tx_size][type][ref]; |
| 500 const ENTROPY_CONTEXT above_ec = !!*A, left_ec = !!*L; | 533 const ENTROPY_CONTEXT above_ec = !!*A, left_ec = !!*L; |
| 501 uint8_t *p_tok = x->token_cache; | 534 uint8_t *p_tok = x->token_cache; |
| 502 int pt = combine_entropy_contexts(above_ec, left_ec); | 535 int pt = combine_entropy_contexts(above_ec, left_ec); |
| 503 int c, cost; | 536 int c, cost; |
| 504 | 537 |
| 505 // Check for consistency of tx_size with mode info | 538 // Check for consistency of tx_size with mode info |
| 506 assert(type == PLANE_TYPE_Y_WITH_DC ? mbmi->tx_size == tx_size | 539 assert(type == PLANE_TYPE_Y ? mbmi->tx_size == tx_size |
| 507 : get_uv_tx_size(mbmi) == tx_size); | 540 : get_uv_tx_size(mbmi) == tx_size); |
| 508 | 541 |
| 509 if (eob == 0) { | 542 if (eob == 0) { |
| 510 // single eob token | 543 // single eob token |
| 511 cost = token_costs[0][0][pt][DCT_EOB_TOKEN]; | 544 cost = token_costs[0][0][pt][EOB_TOKEN]; |
| 512 c = 0; | 545 c = 0; |
| 513 } else { | 546 } else { |
| 514 int band_left = *band_count++; | 547 int band_left = *band_count++; |
| 515 | 548 |
| 516 // dc token | 549 // dc token |
| 517 int v = qcoeff_ptr[0]; | 550 int v = qcoeff_ptr[0]; |
| 518 int prev_t = vp9_dct_value_tokens_ptr[v].token; | 551 int prev_t = vp9_dct_value_tokens_ptr[v].token; |
| 519 cost = (*token_costs)[0][pt][prev_t] + vp9_dct_value_cost_ptr[v]; | 552 cost = (*token_costs)[0][pt][prev_t] + vp9_dct_value_cost_ptr[v]; |
| 520 p_tok[0] = vp9_pt_energy_class[prev_t]; | 553 p_tok[0] = vp9_pt_energy_class[prev_t]; |
| 521 ++token_costs; | 554 ++token_costs; |
| (...skipping 11 matching lines...) Expand all Loading... |
| 533 prev_t = t; | 566 prev_t = t; |
| 534 if (!--band_left) { | 567 if (!--band_left) { |
| 535 band_left = *band_count++; | 568 band_left = *band_count++; |
| 536 ++token_costs; | 569 ++token_costs; |
| 537 } | 570 } |
| 538 } | 571 } |
| 539 | 572 |
| 540 // eob token | 573 // eob token |
| 541 if (band_left) { | 574 if (band_left) { |
| 542 pt = get_coef_context(nb, p_tok, c); | 575 pt = get_coef_context(nb, p_tok, c); |
| 543 cost += (*token_costs)[0][pt][DCT_EOB_TOKEN]; | 576 cost += (*token_costs)[0][pt][EOB_TOKEN]; |
| 544 } | 577 } |
| 545 } | 578 } |
| 546 | 579 |
| 547 // is eob first coefficient; | 580 // is eob first coefficient; |
| 548 *A = *L = (c > 0); | 581 *A = *L = (c > 0); |
| 549 | 582 |
| 550 return cost; | 583 return cost; |
| 551 } | 584 } |
| 552 | 585 |
| 553 static void dist_block(int plane, int block, TX_SIZE tx_size, void *arg) { | 586 static void dist_block(int plane, int block, TX_SIZE tx_size, void *arg) { |
| 554 const int ss_txfrm_size = tx_size << 1; | 587 const int ss_txfrm_size = tx_size << 1; |
| 555 struct rdcost_block_args* args = arg; | 588 struct rdcost_block_args* args = arg; |
| 556 MACROBLOCK* const x = args->x; | 589 MACROBLOCK* const x = args->x; |
| 557 MACROBLOCKD* const xd = &x->e_mbd; | 590 MACROBLOCKD* const xd = &x->e_mbd; |
| 558 struct macroblock_plane *const p = &x->plane[plane]; | 591 struct macroblock_plane *const p = &x->plane[plane]; |
| 559 struct macroblockd_plane *const pd = &xd->plane[plane]; | 592 struct macroblockd_plane *const pd = &xd->plane[plane]; |
| 560 int64_t this_sse; | 593 int64_t this_sse; |
| 561 int shift = args->tx_size == TX_32X32 ? 0 : 2; | 594 int shift = args->tx_size == TX_32X32 ? 0 : 2; |
| 562 int16_t *const coeff = BLOCK_OFFSET(p->coeff, block); | 595 int16_t *const coeff = BLOCK_OFFSET(p->coeff, block); |
| 563 int16_t *const dqcoeff = BLOCK_OFFSET(pd->dqcoeff, block); | 596 int16_t *const dqcoeff = BLOCK_OFFSET(pd->dqcoeff, block); |
| 564 args->dist = vp9_block_error(coeff, dqcoeff, 16 << ss_txfrm_size, | 597 args->dist = vp9_block_error(coeff, dqcoeff, 16 << ss_txfrm_size, |
| 565 &this_sse) >> shift; | 598 &this_sse) >> shift; |
| 566 args->sse = this_sse >> shift; | 599 args->sse = this_sse >> shift; |
| 567 | 600 |
| 568 if (x->skip_encode && | 601 if (x->skip_encode && !is_inter_block(&xd->mi_8x8[0]->mbmi)) { |
| 569 xd->mi_8x8[0]->mbmi.ref_frame[0] == INTRA_FRAME) { | |
| 570 // TODO(jingning): tune the model to better capture the distortion. | 602 // TODO(jingning): tune the model to better capture the distortion. |
| 571 int64_t p = (pd->dequant[1] * pd->dequant[1] * | 603 int64_t p = (pd->dequant[1] * pd->dequant[1] * |
| 572 (1 << ss_txfrm_size)) >> (shift + 2); | 604 (1 << ss_txfrm_size)) >> (shift + 2); |
| 573 args->dist += (p >> 4); | 605 args->dist += (p >> 4); |
| 574 args->sse += p; | 606 args->sse += p; |
| 575 } | 607 } |
| 576 } | 608 } |
| 577 | 609 |
| 578 static void rate_block(int plane, int block, BLOCK_SIZE plane_bsize, | 610 static void rate_block(int plane, int block, BLOCK_SIZE plane_bsize, |
| 579 TX_SIZE tx_size, void *arg) { | 611 TX_SIZE tx_size, void *arg) { |
| 580 struct rdcost_block_args* args = arg; | 612 struct rdcost_block_args* args = arg; |
| 581 | 613 |
| 582 int x_idx, y_idx; | 614 int x_idx, y_idx; |
| 583 txfrm_block_to_raster_xy(plane_bsize, args->tx_size, block, &x_idx, &y_idx); | 615 txfrm_block_to_raster_xy(plane_bsize, args->tx_size, block, &x_idx, &y_idx); |
| 584 | 616 |
| 585 args->rate = cost_coeffs(args->x, plane, block, args->t_above + x_idx, | 617 args->rate = cost_coeffs(args->x, plane, block, args->t_above + x_idx, |
| 586 args->t_left + y_idx, args->tx_size, | 618 args->t_left + y_idx, args->tx_size, |
| 587 args->scan, args->nb); | 619 args->scan, args->nb); |
| 588 } | 620 } |
| 589 | 621 |
| 590 static void block_yrd_txfm(int plane, int block, BLOCK_SIZE plane_bsize, | 622 static void block_rd_txfm(int plane, int block, BLOCK_SIZE plane_bsize, |
| 591 TX_SIZE tx_size, void *arg) { | 623 TX_SIZE tx_size, void *arg) { |
| 592 struct rdcost_block_args *args = arg; | 624 struct rdcost_block_args *args = arg; |
| 593 MACROBLOCK *const x = args->x; | 625 MACROBLOCK *const x = args->x; |
| 594 MACROBLOCKD *const xd = &x->e_mbd; | 626 MACROBLOCKD *const xd = &x->e_mbd; |
| 595 struct encode_b_args encode_args = {x, NULL}; | 627 struct encode_b_args encode_args = {x, NULL}; |
| 596 int64_t rd1, rd2, rd; | 628 int64_t rd1, rd2, rd; |
| 597 | 629 |
| 598 if (args->skip) | 630 if (args->skip) |
| 599 return; | 631 return; |
| 600 | 632 |
| 601 if (!is_inter_block(&xd->mi_8x8[0]->mbmi)) | 633 if (!is_inter_block(&xd->mi_8x8[0]->mbmi)) |
| 602 vp9_encode_block_intra(plane, block, plane_bsize, tx_size, &encode_args); | 634 vp9_encode_block_intra(plane, block, plane_bsize, tx_size, &encode_args); |
| 603 else | 635 else |
| 604 vp9_xform_quant(plane, block, plane_bsize, tx_size, &encode_args); | 636 vp9_xform_quant(plane, block, plane_bsize, tx_size, &encode_args); |
| 605 | 637 |
| 606 dist_block(plane, block, tx_size, args); | 638 dist_block(plane, block, tx_size, args); |
| 607 rate_block(plane, block, plane_bsize, tx_size, args); | 639 rate_block(plane, block, plane_bsize, tx_size, args); |
| 608 rd1 = RDCOST(x->rdmult, x->rddiv, args->rate, args->dist); | 640 rd1 = RDCOST(x->rdmult, x->rddiv, args->rate, args->dist); |
| 609 rd2 = RDCOST(x->rdmult, x->rddiv, 0, args->sse); | 641 rd2 = RDCOST(x->rdmult, x->rddiv, 0, args->sse); |
| 610 | 642 |
| 611 // TODO(jingning): temporarily enabled only for luma component | 643 // TODO(jingning): temporarily enabled only for luma component |
| 612 rd = MIN(rd1, rd2); | 644 rd = MIN(rd1, rd2); |
| 613 if (plane == 0) | 645 if (plane == 0) |
| 614 x->zcoeff_blk[tx_size][block] = rd1 > rd2 || !xd->plane[plane].eobs[block]; | 646 x->zcoeff_blk[tx_size][block] = !x->plane[plane].eobs[block] || |
| 647 (rd1 > rd2 && !xd->lossless); |
| 615 | 648 |
| 616 args->this_rate += args->rate; | 649 args->this_rate += args->rate; |
| 617 args->this_dist += args->dist; | 650 args->this_dist += args->dist; |
| 618 args->this_sse += args->sse; | 651 args->this_sse += args->sse; |
| 619 args->this_rd += rd; | 652 args->this_rd += rd; |
| 620 | 653 |
| 621 if (args->this_rd > args->best_rd) { | 654 if (args->this_rd > args->best_rd) { |
| 622 args->skip = 1; | 655 args->skip = 1; |
| 623 return; | 656 return; |
| 624 } | 657 } |
| (...skipping 21 matching lines...) Expand all Loading... |
| 646 for (i = 0; i < num_4x4_h; i += 4) | 679 for (i = 0; i < num_4x4_h; i += 4) |
| 647 t_left[i] = !!*(const uint32_t *)&left[i]; | 680 t_left[i] = !!*(const uint32_t *)&left[i]; |
| 648 break; | 681 break; |
| 649 case TX_32X32: | 682 case TX_32X32: |
| 650 for (i = 0; i < num_4x4_w; i += 8) | 683 for (i = 0; i < num_4x4_w; i += 8) |
| 651 t_above[i] = !!*(const uint64_t *)&above[i]; | 684 t_above[i] = !!*(const uint64_t *)&above[i]; |
| 652 for (i = 0; i < num_4x4_h; i += 8) | 685 for (i = 0; i < num_4x4_h; i += 8) |
| 653 t_left[i] = !!*(const uint64_t *)&left[i]; | 686 t_left[i] = !!*(const uint64_t *)&left[i]; |
| 654 break; | 687 break; |
| 655 default: | 688 default: |
| 656 assert(!"Invalid transform size."); | 689 assert(0 && "Invalid transform size."); |
| 657 } | 690 } |
| 658 } | 691 } |
| 659 | 692 |
| 660 static void init_rdcost_stack(MACROBLOCK *x, TX_SIZE tx_size, | 693 static void init_rdcost_stack(MACROBLOCK *x, TX_SIZE tx_size, |
| 661 const int num_4x4_w, const int num_4x4_h, | 694 const int num_4x4_w, const int num_4x4_h, |
| 662 const int64_t ref_rdcost, | 695 const int64_t ref_rdcost, |
| 663 struct rdcost_block_args *arg) { | 696 struct rdcost_block_args *arg) { |
| 664 vpx_memset(arg, 0, sizeof(struct rdcost_block_args)); | 697 vpx_memset(arg, 0, sizeof(struct rdcost_block_args)); |
| 665 arg->x = x; | 698 arg->x = x; |
| 666 arg->tx_size = tx_size; | 699 arg->tx_size = tx_size; |
| 667 arg->bw = num_4x4_w; | 700 arg->bw = num_4x4_w; |
| 668 arg->bh = num_4x4_h; | 701 arg->bh = num_4x4_h; |
| 669 arg->best_rd = ref_rdcost; | 702 arg->best_rd = ref_rdcost; |
| 670 } | 703 } |
| 671 | 704 |
| 672 static void txfm_rd_in_plane(MACROBLOCK *x, | 705 static void txfm_rd_in_plane(MACROBLOCK *x, |
| 673 struct rdcost_block_args *rd_stack, | 706 struct rdcost_block_args *rd_stack, |
| 674 int *rate, int64_t *distortion, | 707 int *rate, int64_t *distortion, |
| 675 int *skippable, int64_t *sse, | 708 int *skippable, int64_t *sse, |
| 676 int64_t ref_best_rd, int plane, | 709 int64_t ref_best_rd, int plane, |
| 677 BLOCK_SIZE bsize, TX_SIZE tx_size) { | 710 BLOCK_SIZE bsize, TX_SIZE tx_size) { |
| 678 MACROBLOCKD *const xd = &x->e_mbd; | 711 MACROBLOCKD *const xd = &x->e_mbd; |
| 679 struct macroblockd_plane *const pd = &xd->plane[plane]; | 712 struct macroblockd_plane *const pd = &xd->plane[plane]; |
| 680 const BLOCK_SIZE bs = get_plane_block_size(bsize, pd); | 713 const BLOCK_SIZE bs = get_plane_block_size(bsize, pd); |
| 681 const int num_4x4_w = num_4x4_blocks_wide_lookup[bs]; | 714 const int num_4x4_w = num_4x4_blocks_wide_lookup[bs]; |
| 682 const int num_4x4_h = num_4x4_blocks_high_lookup[bs]; | 715 const int num_4x4_h = num_4x4_blocks_high_lookup[bs]; |
| 716 const scan_order *so; |
| 683 | 717 |
| 684 init_rdcost_stack(x, tx_size, num_4x4_w, num_4x4_h, | 718 init_rdcost_stack(x, tx_size, num_4x4_w, num_4x4_h, |
| 685 ref_best_rd, rd_stack); | 719 ref_best_rd, rd_stack); |
| 686 if (plane == 0) | 720 if (plane == 0) |
| 687 xd->mi_8x8[0]->mbmi.tx_size = tx_size; | 721 xd->mi_8x8[0]->mbmi.tx_size = tx_size; |
| 688 | 722 |
| 689 vp9_get_entropy_contexts(tx_size, rd_stack->t_above, rd_stack->t_left, | 723 vp9_get_entropy_contexts(tx_size, rd_stack->t_above, rd_stack->t_left, |
| 690 pd->above_context, pd->left_context, | 724 pd->above_context, pd->left_context, |
| 691 num_4x4_w, num_4x4_h); | 725 num_4x4_w, num_4x4_h); |
| 692 | 726 |
| 693 get_scan(xd, tx_size, pd->plane_type, 0, &rd_stack->scan, &rd_stack->nb); | 727 so = get_scan(xd, tx_size, pd->plane_type, 0); |
| 728 rd_stack->scan = so->scan; |
| 729 rd_stack->nb = so->neighbors; |
| 694 | 730 |
| 695 foreach_transformed_block_in_plane(xd, bsize, plane, | 731 foreach_transformed_block_in_plane(xd, bsize, plane, |
| 696 block_yrd_txfm, rd_stack); | 732 block_rd_txfm, rd_stack); |
| 697 if (rd_stack->skip) { | 733 if (rd_stack->skip) { |
| 698 *rate = INT_MAX; | 734 *rate = INT_MAX; |
| 699 *distortion = INT64_MAX; | 735 *distortion = INT64_MAX; |
| 700 *sse = INT64_MAX; | 736 *sse = INT64_MAX; |
| 701 *skippable = 0; | 737 *skippable = 0; |
| 702 } else { | 738 } else { |
| 703 *distortion = rd_stack->this_dist; | 739 *distortion = rd_stack->this_dist; |
| 704 *rate = rd_stack->this_rate; | 740 *rate = rd_stack->this_rate; |
| 705 *sse = rd_stack->this_sse; | 741 *sse = rd_stack->this_sse; |
| 706 *skippable = vp9_is_skippable_in_plane(xd, bsize, plane); | 742 *skippable = vp9_is_skippable_in_plane(x, bsize, plane); |
| 707 } | 743 } |
| 708 } | 744 } |
| 709 | 745 |
| 710 static void choose_largest_txfm_size(VP9_COMP *cpi, MACROBLOCK *x, | 746 static void choose_largest_txfm_size(VP9_COMP *cpi, MACROBLOCK *x, |
| 711 int *rate, int64_t *distortion, | 747 int *rate, int64_t *distortion, |
| 712 int *skip, int64_t *sse, | 748 int *skip, int64_t *sse, |
| 713 int64_t ref_best_rd, | 749 int64_t ref_best_rd, |
| 714 BLOCK_SIZE bs) { | 750 BLOCK_SIZE bs) { |
| 715 const TX_SIZE max_tx_size = max_txsize_lookup[bs]; | 751 const TX_SIZE max_tx_size = max_txsize_lookup[bs]; |
| 716 VP9_COMMON *const cm = &cpi->common; | 752 VP9_COMMON *const cm = &cpi->common; |
| (...skipping 12 matching lines...) Expand all Loading... |
| 729 static void choose_txfm_size_from_rd(VP9_COMP *cpi, MACROBLOCK *x, | 765 static void choose_txfm_size_from_rd(VP9_COMP *cpi, MACROBLOCK *x, |
| 730 int (*r)[2], int *rate, | 766 int (*r)[2], int *rate, |
| 731 int64_t *d, int64_t *distortion, | 767 int64_t *d, int64_t *distortion, |
| 732 int *s, int *skip, | 768 int *s, int *skip, |
| 733 int64_t tx_cache[TX_MODES], | 769 int64_t tx_cache[TX_MODES], |
| 734 BLOCK_SIZE bs) { | 770 BLOCK_SIZE bs) { |
| 735 const TX_SIZE max_tx_size = max_txsize_lookup[bs]; | 771 const TX_SIZE max_tx_size = max_txsize_lookup[bs]; |
| 736 VP9_COMMON *const cm = &cpi->common; | 772 VP9_COMMON *const cm = &cpi->common; |
| 737 MACROBLOCKD *const xd = &x->e_mbd; | 773 MACROBLOCKD *const xd = &x->e_mbd; |
| 738 MB_MODE_INFO *const mbmi = &xd->mi_8x8[0]->mbmi; | 774 MB_MODE_INFO *const mbmi = &xd->mi_8x8[0]->mbmi; |
| 739 vp9_prob skip_prob = vp9_get_pred_prob_mbskip(cm, xd); | 775 vp9_prob skip_prob = vp9_get_skip_prob(cm, xd); |
| 740 int64_t rd[TX_SIZES][2]; | 776 int64_t rd[TX_SIZES][2]; |
| 741 int n, m; | 777 int n, m; |
| 742 int s0, s1; | 778 int s0, s1; |
| 779 const TX_SIZE max_mode_tx_size = tx_mode_to_biggest_tx_size[cm->tx_mode]; |
| 780 int64_t best_rd = INT64_MAX; |
| 781 TX_SIZE best_tx = TX_4X4; |
| 743 | 782 |
| 744 const vp9_prob *tx_probs = get_tx_probs2(xd, &cm->fc.tx_probs, xd->mi_8x8[0]); | 783 const vp9_prob *tx_probs = get_tx_probs2(max_tx_size, xd, &cm->fc.tx_probs); |
| 745 | |
| 746 for (n = TX_4X4; n <= max_tx_size; n++) { | |
| 747 r[n][1] = r[n][0]; | |
| 748 if (r[n][0] == INT_MAX) | |
| 749 continue; | |
| 750 for (m = 0; m <= n - (n == max_tx_size); m++) { | |
| 751 if (m == n) | |
| 752 r[n][1] += vp9_cost_zero(tx_probs[m]); | |
| 753 else | |
| 754 r[n][1] += vp9_cost_one(tx_probs[m]); | |
| 755 } | |
| 756 } | |
| 757 | |
| 758 assert(skip_prob > 0); | 784 assert(skip_prob > 0); |
| 759 s0 = vp9_cost_bit(skip_prob, 0); | 785 s0 = vp9_cost_bit(skip_prob, 0); |
| 760 s1 = vp9_cost_bit(skip_prob, 1); | 786 s1 = vp9_cost_bit(skip_prob, 1); |
| 761 | 787 |
| 762 for (n = TX_4X4; n <= max_tx_size; n++) { | 788 for (n = TX_4X4; n <= max_tx_size; n++) { |
| 789 r[n][1] = r[n][0]; |
| 790 if (r[n][0] < INT_MAX) { |
| 791 for (m = 0; m <= n - (n == max_tx_size); m++) { |
| 792 if (m == n) |
| 793 r[n][1] += vp9_cost_zero(tx_probs[m]); |
| 794 else |
| 795 r[n][1] += vp9_cost_one(tx_probs[m]); |
| 796 } |
| 797 } |
| 763 if (d[n] == INT64_MAX) { | 798 if (d[n] == INT64_MAX) { |
| 764 rd[n][0] = rd[n][1] = INT64_MAX; | 799 rd[n][0] = rd[n][1] = INT64_MAX; |
| 765 continue; | 800 } else if (s[n]) { |
| 766 } | |
| 767 if (s[n]) { | |
| 768 rd[n][0] = rd[n][1] = RDCOST(x->rdmult, x->rddiv, s1, d[n]); | 801 rd[n][0] = rd[n][1] = RDCOST(x->rdmult, x->rddiv, s1, d[n]); |
| 769 } else { | 802 } else { |
| 770 rd[n][0] = RDCOST(x->rdmult, x->rddiv, r[n][0] + s0, d[n]); | 803 rd[n][0] = RDCOST(x->rdmult, x->rddiv, r[n][0] + s0, d[n]); |
| 771 rd[n][1] = RDCOST(x->rdmult, x->rddiv, r[n][1] + s0, d[n]); | 804 rd[n][1] = RDCOST(x->rdmult, x->rddiv, r[n][1] + s0, d[n]); |
| 772 } | 805 } |
| 806 |
| 807 if (rd[n][1] < best_rd) { |
| 808 best_tx = n; |
| 809 best_rd = rd[n][1]; |
| 810 } |
| 773 } | 811 } |
| 812 mbmi->tx_size = cm->tx_mode == TX_MODE_SELECT ? |
| 813 best_tx : MIN(max_tx_size, max_mode_tx_size); |
| 774 | 814 |
| 775 if (max_tx_size == TX_32X32 && | |
| 776 (cm->tx_mode == ALLOW_32X32 || | |
| 777 (cm->tx_mode == TX_MODE_SELECT && | |
| 778 rd[TX_32X32][1] < rd[TX_16X16][1] && rd[TX_32X32][1] < rd[TX_8X8][1] && | |
| 779 rd[TX_32X32][1] < rd[TX_4X4][1]))) { | |
| 780 mbmi->tx_size = TX_32X32; | |
| 781 } else if (max_tx_size >= TX_16X16 && | |
| 782 (cm->tx_mode == ALLOW_16X16 || | |
| 783 cm->tx_mode == ALLOW_32X32 || | |
| 784 (cm->tx_mode == TX_MODE_SELECT && | |
| 785 rd[TX_16X16][1] < rd[TX_8X8][1] && | |
| 786 rd[TX_16X16][1] < rd[TX_4X4][1]))) { | |
| 787 mbmi->tx_size = TX_16X16; | |
| 788 } else if (cm->tx_mode == ALLOW_8X8 || | |
| 789 cm->tx_mode == ALLOW_16X16 || | |
| 790 cm->tx_mode == ALLOW_32X32 || | |
| 791 (cm->tx_mode == TX_MODE_SELECT && rd[TX_8X8][1] < rd[TX_4X4][1])) { | |
| 792 mbmi->tx_size = TX_8X8; | |
| 793 } else { | |
| 794 mbmi->tx_size = TX_4X4; | |
| 795 } | |
| 796 | 815 |
| 797 *distortion = d[mbmi->tx_size]; | 816 *distortion = d[mbmi->tx_size]; |
| 798 *rate = r[mbmi->tx_size][cm->tx_mode == TX_MODE_SELECT]; | 817 *rate = r[mbmi->tx_size][cm->tx_mode == TX_MODE_SELECT]; |
| 799 *skip = s[mbmi->tx_size]; | 818 *skip = s[mbmi->tx_size]; |
| 800 | 819 |
| 801 tx_cache[ONLY_4X4] = rd[TX_4X4][0]; | 820 tx_cache[ONLY_4X4] = rd[TX_4X4][0]; |
| 802 tx_cache[ALLOW_8X8] = rd[TX_8X8][0]; | 821 tx_cache[ALLOW_8X8] = rd[TX_8X8][0]; |
| 803 tx_cache[ALLOW_16X16] = rd[MIN(max_tx_size, TX_16X16)][0]; | 822 tx_cache[ALLOW_16X16] = rd[MIN(max_tx_size, TX_16X16)][0]; |
| 804 tx_cache[ALLOW_32X32] = rd[MIN(max_tx_size, TX_32X32)][0]; | 823 tx_cache[ALLOW_32X32] = rd[MIN(max_tx_size, TX_32X32)][0]; |
| 805 if (max_tx_size == TX_32X32 && | 824 |
| 806 rd[TX_32X32][1] < rd[TX_16X16][1] && rd[TX_32X32][1] < rd[TX_8X8][1] && | 825 if (max_tx_size == TX_32X32 && best_tx == TX_32X32) { |
| 807 rd[TX_32X32][1] < rd[TX_4X4][1]) | |
| 808 tx_cache[TX_MODE_SELECT] = rd[TX_32X32][1]; | 826 tx_cache[TX_MODE_SELECT] = rd[TX_32X32][1]; |
| 809 else if (max_tx_size >= TX_16X16 && | 827 cpi->tx_stepdown_count[0]++; |
| 810 rd[TX_16X16][1] < rd[TX_8X8][1] && rd[TX_16X16][1] < rd[TX_4X4][1]) | 828 } else if (max_tx_size >= TX_16X16 && best_tx == TX_16X16) { |
| 811 tx_cache[TX_MODE_SELECT] = rd[TX_16X16][1]; | 829 tx_cache[TX_MODE_SELECT] = rd[TX_16X16][1]; |
| 812 else | |
| 813 tx_cache[TX_MODE_SELECT] = rd[TX_4X4][1] < rd[TX_8X8][1] ? | |
| 814 rd[TX_4X4][1] : rd[TX_8X8][1]; | |
| 815 | |
| 816 if (max_tx_size == TX_32X32 && | |
| 817 rd[TX_32X32][1] < rd[TX_16X16][1] && | |
| 818 rd[TX_32X32][1] < rd[TX_8X8][1] && | |
| 819 rd[TX_32X32][1] < rd[TX_4X4][1]) { | |
| 820 cpi->tx_stepdown_count[0]++; | |
| 821 } else if (max_tx_size >= TX_16X16 && | |
| 822 rd[TX_16X16][1] < rd[TX_8X8][1] && | |
| 823 rd[TX_16X16][1] < rd[TX_4X4][1]) { | |
| 824 cpi->tx_stepdown_count[max_tx_size - TX_16X16]++; | 830 cpi->tx_stepdown_count[max_tx_size - TX_16X16]++; |
| 825 } else if (rd[TX_8X8][1] < rd[TX_4X4][1]) { | 831 } else if (rd[TX_8X8][1] < rd[TX_4X4][1]) { |
| 832 tx_cache[TX_MODE_SELECT] = rd[TX_8X8][1]; |
| 826 cpi->tx_stepdown_count[max_tx_size - TX_8X8]++; | 833 cpi->tx_stepdown_count[max_tx_size - TX_8X8]++; |
| 827 } else { | 834 } else { |
| 835 tx_cache[TX_MODE_SELECT] = rd[TX_4X4][1]; |
| 828 cpi->tx_stepdown_count[max_tx_size - TX_4X4]++; | 836 cpi->tx_stepdown_count[max_tx_size - TX_4X4]++; |
| 829 } | 837 } |
| 830 } | 838 } |
| 831 | 839 |
| 832 static void choose_txfm_size_from_modelrd(VP9_COMP *cpi, MACROBLOCK *x, | 840 static void choose_txfm_size_from_modelrd(VP9_COMP *cpi, MACROBLOCK *x, |
| 833 int (*r)[2], int *rate, | 841 int (*r)[2], int *rate, |
| 834 int64_t *d, int64_t *distortion, | 842 int64_t *d, int64_t *distortion, |
| 835 int *s, int *skip, int64_t *sse, | 843 int *s, int *skip, int64_t *sse, |
| 836 int64_t ref_best_rd, | 844 int64_t ref_best_rd, |
| 837 BLOCK_SIZE bs) { | 845 BLOCK_SIZE bs) { |
| 838 const TX_SIZE max_tx_size = max_txsize_lookup[bs]; | 846 const TX_SIZE max_tx_size = max_txsize_lookup[bs]; |
| 839 VP9_COMMON *const cm = &cpi->common; | 847 VP9_COMMON *const cm = &cpi->common; |
| 840 MACROBLOCKD *const xd = &x->e_mbd; | 848 MACROBLOCKD *const xd = &x->e_mbd; |
| 841 MB_MODE_INFO *const mbmi = &xd->mi_8x8[0]->mbmi; | 849 MB_MODE_INFO *const mbmi = &xd->mi_8x8[0]->mbmi; |
| 842 vp9_prob skip_prob = vp9_get_pred_prob_mbskip(cm, xd); | 850 vp9_prob skip_prob = vp9_get_skip_prob(cm, xd); |
| 843 int64_t rd[TX_SIZES][2]; | 851 int64_t rd[TX_SIZES][2]; |
| 844 int n, m; | 852 int n, m; |
| 845 int s0, s1; | 853 int s0, s1; |
| 846 double scale_rd[TX_SIZES] = {1.73, 1.44, 1.20, 1.00}; | 854 double scale_rd[TX_SIZES] = {1.73, 1.44, 1.20, 1.00}; |
| 847 // double scale_r[TX_SIZES] = {2.82, 2.00, 1.41, 1.00}; | 855 const TX_SIZE max_mode_tx_size = tx_mode_to_biggest_tx_size[cm->tx_mode]; |
| 856 int64_t best_rd = INT64_MAX; |
| 857 TX_SIZE best_tx = TX_4X4; |
| 848 | 858 |
| 849 const vp9_prob *tx_probs = get_tx_probs2(xd, &cm->fc.tx_probs, xd->mi_8x8[0]); | 859 const vp9_prob *tx_probs = get_tx_probs2(max_tx_size, xd, &cm->fc.tx_probs); |
| 850 | 860 assert(skip_prob > 0); |
| 851 // for (n = TX_4X4; n <= max_txfm_size; n++) | 861 s0 = vp9_cost_bit(skip_prob, 0); |
| 852 // r[n][0] = (r[n][0] * scale_r[n]); | 862 s1 = vp9_cost_bit(skip_prob, 1); |
| 853 | 863 |
| 854 for (n = TX_4X4; n <= max_tx_size; n++) { | 864 for (n = TX_4X4; n <= max_tx_size; n++) { |
| 865 double scale = scale_rd[n]; |
| 855 r[n][1] = r[n][0]; | 866 r[n][1] = r[n][0]; |
| 856 for (m = 0; m <= n - (n == max_tx_size); m++) { | 867 for (m = 0; m <= n - (n == max_tx_size); m++) { |
| 857 if (m == n) | 868 if (m == n) |
| 858 r[n][1] += vp9_cost_zero(tx_probs[m]); | 869 r[n][1] += vp9_cost_zero(tx_probs[m]); |
| 859 else | 870 else |
| 860 r[n][1] += vp9_cost_one(tx_probs[m]); | 871 r[n][1] += vp9_cost_one(tx_probs[m]); |
| 861 } | 872 } |
| 873 if (s[n]) { |
| 874 rd[n][0] = rd[n][1] = RDCOST(x->rdmult, x->rddiv, s1, d[n]) * scale; |
| 875 } else { |
| 876 rd[n][0] = RDCOST(x->rdmult, x->rddiv, r[n][0] + s0, d[n]) * scale; |
| 877 rd[n][1] = RDCOST(x->rdmult, x->rddiv, r[n][1] + s0, d[n]) * scale; |
| 878 } |
| 879 if (rd[n][1] < best_rd) { |
| 880 best_rd = rd[n][1]; |
| 881 best_tx = n; |
| 882 } |
| 862 } | 883 } |
| 863 | 884 |
| 864 assert(skip_prob > 0); | 885 mbmi->tx_size = cm->tx_mode == TX_MODE_SELECT ? |
| 865 s0 = vp9_cost_bit(skip_prob, 0); | 886 best_tx : MIN(max_tx_size, max_mode_tx_size); |
| 866 s1 = vp9_cost_bit(skip_prob, 1); | |
| 867 | |
| 868 for (n = TX_4X4; n <= max_tx_size; n++) { | |
| 869 if (s[n]) { | |
| 870 rd[n][0] = rd[n][1] = RDCOST(x->rdmult, x->rddiv, s1, d[n]); | |
| 871 } else { | |
| 872 rd[n][0] = RDCOST(x->rdmult, x->rddiv, r[n][0] + s0, d[n]); | |
| 873 rd[n][1] = RDCOST(x->rdmult, x->rddiv, r[n][1] + s0, d[n]); | |
| 874 } | |
| 875 } | |
| 876 for (n = TX_4X4; n <= max_tx_size; n++) { | |
| 877 rd[n][0] = (int64_t)(scale_rd[n] * rd[n][0]); | |
| 878 rd[n][1] = (int64_t)(scale_rd[n] * rd[n][1]); | |
| 879 } | |
| 880 | |
| 881 if (max_tx_size == TX_32X32 && | |
| 882 (cm->tx_mode == ALLOW_32X32 || | |
| 883 (cm->tx_mode == TX_MODE_SELECT && | |
| 884 rd[TX_32X32][1] <= rd[TX_16X16][1] && | |
| 885 rd[TX_32X32][1] <= rd[TX_8X8][1] && | |
| 886 rd[TX_32X32][1] <= rd[TX_4X4][1]))) { | |
| 887 mbmi->tx_size = TX_32X32; | |
| 888 } else if (max_tx_size >= TX_16X16 && | |
| 889 (cm->tx_mode == ALLOW_16X16 || | |
| 890 cm->tx_mode == ALLOW_32X32 || | |
| 891 (cm->tx_mode == TX_MODE_SELECT && | |
| 892 rd[TX_16X16][1] <= rd[TX_8X8][1] && | |
| 893 rd[TX_16X16][1] <= rd[TX_4X4][1]))) { | |
| 894 mbmi->tx_size = TX_16X16; | |
| 895 } else if (cm->tx_mode == ALLOW_8X8 || | |
| 896 cm->tx_mode == ALLOW_16X16 || | |
| 897 cm->tx_mode == ALLOW_32X32 || | |
| 898 (cm->tx_mode == TX_MODE_SELECT && | |
| 899 rd[TX_8X8][1] <= rd[TX_4X4][1])) { | |
| 900 mbmi->tx_size = TX_8X8; | |
| 901 } else { | |
| 902 mbmi->tx_size = TX_4X4; | |
| 903 } | |
| 904 | 887 |
| 905 // Actually encode using the chosen mode if a model was used, but do not | 888 // Actually encode using the chosen mode if a model was used, but do not |
| 906 // update the r, d costs | 889 // update the r, d costs |
| 907 txfm_rd_in_plane(x, &cpi->rdcost_stack, rate, distortion, skip, | 890 txfm_rd_in_plane(x, &cpi->rdcost_stack, rate, distortion, skip, |
| 908 &sse[mbmi->tx_size], ref_best_rd, 0, bs, mbmi->tx_size); | 891 &sse[mbmi->tx_size], ref_best_rd, 0, bs, mbmi->tx_size); |
| 909 | 892 |
| 910 if (max_tx_size == TX_32X32 && | 893 if (max_tx_size == TX_32X32 && best_tx == TX_32X32) { |
| 911 rd[TX_32X32][1] <= rd[TX_16X16][1] && | |
| 912 rd[TX_32X32][1] <= rd[TX_8X8][1] && | |
| 913 rd[TX_32X32][1] <= rd[TX_4X4][1]) { | |
| 914 cpi->tx_stepdown_count[0]++; | 894 cpi->tx_stepdown_count[0]++; |
| 915 } else if (max_tx_size >= TX_16X16 && | 895 } else if (max_tx_size >= TX_16X16 && best_tx == TX_16X16) { |
| 916 rd[TX_16X16][1] <= rd[TX_8X8][1] && | |
| 917 rd[TX_16X16][1] <= rd[TX_4X4][1]) { | |
| 918 cpi->tx_stepdown_count[max_tx_size - TX_16X16]++; | 896 cpi->tx_stepdown_count[max_tx_size - TX_16X16]++; |
| 919 } else if (rd[TX_8X8][1] <= rd[TX_4X4][1]) { | 897 } else if (rd[TX_8X8][1] <= rd[TX_4X4][1]) { |
| 920 cpi->tx_stepdown_count[max_tx_size - TX_8X8]++; | 898 cpi->tx_stepdown_count[max_tx_size - TX_8X8]++; |
| 921 } else { | 899 } else { |
| 922 cpi->tx_stepdown_count[max_tx_size - TX_4X4]++; | 900 cpi->tx_stepdown_count[max_tx_size - TX_4X4]++; |
| 923 } | 901 } |
| 924 } | 902 } |
| 925 | 903 |
| 926 static void super_block_yrd(VP9_COMP *cpi, | 904 static void super_block_yrd(VP9_COMP *cpi, |
| 927 MACROBLOCK *x, int *rate, int64_t *distortion, | 905 MACROBLOCK *x, int *rate, int64_t *distortion, |
| 928 int *skip, int64_t *psse, BLOCK_SIZE bs, | 906 int *skip, int64_t *psse, BLOCK_SIZE bs, |
| 929 int64_t txfm_cache[TX_MODES], | 907 int64_t txfm_cache[TX_MODES], |
| 930 int64_t ref_best_rd) { | 908 int64_t ref_best_rd) { |
| 931 int r[TX_SIZES][2], s[TX_SIZES]; | 909 int r[TX_SIZES][2], s[TX_SIZES]; |
| 932 int64_t d[TX_SIZES], sse[TX_SIZES]; | 910 int64_t d[TX_SIZES], sse[TX_SIZES]; |
| 933 MACROBLOCKD *xd = &x->e_mbd; | 911 MACROBLOCKD *xd = &x->e_mbd; |
| 934 MB_MODE_INFO *const mbmi = &xd->mi_8x8[0]->mbmi; | 912 MB_MODE_INFO *const mbmi = &xd->mi_8x8[0]->mbmi; |
| 935 struct rdcost_block_args *rdcost_stack = &cpi->rdcost_stack; | 913 struct rdcost_block_args *rdcost_stack = &cpi->rdcost_stack; |
| 936 const int b_inter_mode = is_inter_block(mbmi); | 914 const int b_inter_mode = is_inter_block(mbmi); |
| 915 const TX_SIZE max_tx_size = max_txsize_lookup[bs]; |
| 916 TX_SIZE tx_size; |
| 917 |
| 937 | 918 |
| 938 assert(bs == mbmi->sb_type); | 919 assert(bs == mbmi->sb_type); |
| 939 if (b_inter_mode) | 920 if (b_inter_mode) |
| 940 vp9_subtract_sby(x, bs); | 921 vp9_subtract_sby(x, bs); |
| 941 | 922 |
| 942 if (cpi->sf.tx_size_search_method == USE_LARGESTALL || | 923 if (cpi->sf.tx_size_search_method == USE_LARGESTALL || |
| 943 (cpi->sf.tx_size_search_method != USE_FULL_RD && | 924 (cpi->sf.tx_size_search_method != USE_FULL_RD && |
| 944 !b_inter_mode)) { | 925 !b_inter_mode)) { |
| 945 vpx_memset(txfm_cache, 0, TX_MODES * sizeof(int64_t)); | 926 vpx_memset(txfm_cache, 0, TX_MODES * sizeof(int64_t)); |
| 946 choose_largest_txfm_size(cpi, x, rate, distortion, skip, sse, | 927 choose_largest_txfm_size(cpi, x, rate, distortion, skip, sse, |
| 947 ref_best_rd, bs); | 928 ref_best_rd, bs); |
| 948 if (psse) | 929 if (psse) |
| 949 *psse = sse[mbmi->tx_size]; | 930 *psse = sse[mbmi->tx_size]; |
| 950 return; | 931 return; |
| 951 } | 932 } |
| 952 | 933 |
| 953 if (cpi->sf.tx_size_search_method == USE_LARGESTINTRA_MODELINTER && | 934 if (cpi->sf.tx_size_search_method == USE_LARGESTINTRA_MODELINTER && |
| 954 b_inter_mode) { | 935 b_inter_mode) { |
| 955 if (bs >= BLOCK_32X32) | 936 for (tx_size = TX_4X4; tx_size <= max_tx_size; ++tx_size) |
| 956 model_rd_for_sb_y_tx(cpi, bs, TX_32X32, x, xd, | 937 model_rd_for_sb_y_tx(cpi, bs, tx_size, x, xd, |
| 957 &r[TX_32X32][0], &d[TX_32X32], &s[TX_32X32]); | 938 &r[tx_size][0], &d[tx_size], &s[tx_size]); |
| 958 if (bs >= BLOCK_16X16) | |
| 959 model_rd_for_sb_y_tx(cpi, bs, TX_16X16, x, xd, | |
| 960 &r[TX_16X16][0], &d[TX_16X16], &s[TX_16X16]); | |
| 961 | |
| 962 model_rd_for_sb_y_tx(cpi, bs, TX_8X8, x, xd, | |
| 963 &r[TX_8X8][0], &d[TX_8X8], &s[TX_8X8]); | |
| 964 | |
| 965 model_rd_for_sb_y_tx(cpi, bs, TX_4X4, x, xd, | |
| 966 &r[TX_4X4][0], &d[TX_4X4], &s[TX_4X4]); | |
| 967 | |
| 968 choose_txfm_size_from_modelrd(cpi, x, r, rate, d, distortion, s, | 939 choose_txfm_size_from_modelrd(cpi, x, r, rate, d, distortion, s, |
| 969 skip, sse, ref_best_rd, bs); | 940 skip, sse, ref_best_rd, bs); |
| 970 } else { | 941 } else { |
| 971 if (bs >= BLOCK_32X32) | 942 for (tx_size = TX_4X4; tx_size <= max_tx_size; ++tx_size) |
| 972 txfm_rd_in_plane(x, rdcost_stack, &r[TX_32X32][0], &d[TX_32X32], | 943 txfm_rd_in_plane(x, rdcost_stack, &r[tx_size][0], &d[tx_size], |
| 973 &s[TX_32X32], &sse[TX_32X32], | 944 &s[tx_size], &sse[tx_size], |
| 974 ref_best_rd, 0, bs, TX_32X32); | 945 ref_best_rd, 0, bs, tx_size); |
| 975 if (bs >= BLOCK_16X16) | |
| 976 txfm_rd_in_plane(x, rdcost_stack, &r[TX_16X16][0], &d[TX_16X16], | |
| 977 &s[TX_16X16], &sse[TX_16X16], | |
| 978 ref_best_rd, 0, bs, TX_16X16); | |
| 979 txfm_rd_in_plane(x, rdcost_stack, &r[TX_8X8][0], &d[TX_8X8], &s[TX_8X8], | |
| 980 &sse[TX_8X8], ref_best_rd, 0, bs, TX_8X8); | |
| 981 txfm_rd_in_plane(x, rdcost_stack, &r[TX_4X4][0], &d[TX_4X4], &s[TX_4X4], | |
| 982 &sse[TX_4X4], ref_best_rd, 0, bs, TX_4X4); | |
| 983 choose_txfm_size_from_rd(cpi, x, r, rate, d, distortion, s, | 946 choose_txfm_size_from_rd(cpi, x, r, rate, d, distortion, s, |
| 984 skip, txfm_cache, bs); | 947 skip, txfm_cache, bs); |
| 985 } | 948 } |
| 986 if (psse) | 949 if (psse) |
| 987 *psse = sse[mbmi->tx_size]; | 950 *psse = sse[mbmi->tx_size]; |
| 988 } | 951 } |
| 989 | 952 |
| 990 static int conditional_skipintra(MB_PREDICTION_MODE mode, | 953 static int conditional_skipintra(MB_PREDICTION_MODE mode, |
| 991 MB_PREDICTION_MODE best_intra_mode) { | 954 MB_PREDICTION_MODE best_intra_mode) { |
| 992 if (mode == D117_PRED && | 955 if (mode == D117_PRED && |
| (...skipping 24 matching lines...) Expand all Loading... |
| 1017 BLOCK_SIZE bsize, int64_t rd_thresh) { | 980 BLOCK_SIZE bsize, int64_t rd_thresh) { |
| 1018 MB_PREDICTION_MODE mode; | 981 MB_PREDICTION_MODE mode; |
| 1019 MACROBLOCKD *xd = &x->e_mbd; | 982 MACROBLOCKD *xd = &x->e_mbd; |
| 1020 int64_t best_rd = rd_thresh; | 983 int64_t best_rd = rd_thresh; |
| 1021 int rate = 0; | 984 int rate = 0; |
| 1022 int64_t distortion; | 985 int64_t distortion; |
| 1023 struct macroblock_plane *p = &x->plane[0]; | 986 struct macroblock_plane *p = &x->plane[0]; |
| 1024 struct macroblockd_plane *pd = &xd->plane[0]; | 987 struct macroblockd_plane *pd = &xd->plane[0]; |
| 1025 const int src_stride = p->src.stride; | 988 const int src_stride = p->src.stride; |
| 1026 const int dst_stride = pd->dst.stride; | 989 const int dst_stride = pd->dst.stride; |
| 1027 uint8_t *src_init = raster_block_offset_uint8(BLOCK_8X8, ib, | 990 const uint8_t *src_init = &p->src.buf[raster_block_offset(BLOCK_8X8, ib, |
| 1028 p->src.buf, src_stride); | 991 src_stride)]; |
| 1029 uint8_t *dst_init = raster_block_offset_uint8(BLOCK_8X8, ib, | 992 uint8_t *dst_init = &pd->dst.buf[raster_block_offset(BLOCK_8X8, ib, |
| 1030 pd->dst.buf, dst_stride); | 993 dst_stride)]; |
| 1031 int16_t *src_diff, *coeff; | 994 int16_t *src_diff, *coeff; |
| 1032 | 995 |
| 1033 ENTROPY_CONTEXT ta[2], tempa[2]; | 996 ENTROPY_CONTEXT ta[2], tempa[2]; |
| 1034 ENTROPY_CONTEXT tl[2], templ[2]; | 997 ENTROPY_CONTEXT tl[2], templ[2]; |
| 1035 | 998 |
| 1036 const int num_4x4_blocks_wide = num_4x4_blocks_wide_lookup[bsize]; | 999 const int num_4x4_blocks_wide = num_4x4_blocks_wide_lookup[bsize]; |
| 1037 const int num_4x4_blocks_high = num_4x4_blocks_high_lookup[bsize]; | 1000 const int num_4x4_blocks_high = num_4x4_blocks_high_lookup[bsize]; |
| 1038 int idx, idy; | 1001 int idx, idy; |
| 1039 uint8_t best_dst[8 * 8]; | 1002 uint8_t best_dst[8 * 8]; |
| 1040 | 1003 |
| (...skipping 19 matching lines...) Expand all Loading... |
| 1060 | 1023 |
| 1061 rate = bmode_costs[mode]; | 1024 rate = bmode_costs[mode]; |
| 1062 distortion = 0; | 1025 distortion = 0; |
| 1063 | 1026 |
| 1064 vpx_memcpy(tempa, ta, sizeof(ta)); | 1027 vpx_memcpy(tempa, ta, sizeof(ta)); |
| 1065 vpx_memcpy(templ, tl, sizeof(tl)); | 1028 vpx_memcpy(templ, tl, sizeof(tl)); |
| 1066 | 1029 |
| 1067 for (idy = 0; idy < num_4x4_blocks_high; ++idy) { | 1030 for (idy = 0; idy < num_4x4_blocks_high; ++idy) { |
| 1068 for (idx = 0; idx < num_4x4_blocks_wide; ++idx) { | 1031 for (idx = 0; idx < num_4x4_blocks_wide; ++idx) { |
| 1069 int64_t ssz; | 1032 int64_t ssz; |
| 1070 const int16_t *scan; | 1033 const scan_order *so; |
| 1071 const int16_t *nb; | 1034 const uint8_t *src = src_init + idx * 4 + idy * 4 * src_stride; |
| 1072 uint8_t *src = src_init + idx * 4 + idy * 4 * src_stride; | |
| 1073 uint8_t *dst = dst_init + idx * 4 + idy * 4 * dst_stride; | 1035 uint8_t *dst = dst_init + idx * 4 + idy * 4 * dst_stride; |
| 1074 const int block = ib + idy * 2 + idx; | 1036 const int block = ib + idy * 2 + idx; |
| 1075 TX_TYPE tx_type; | 1037 TX_TYPE tx_type; |
| 1076 xd->mi_8x8[0]->bmi[block].as_mode = mode; | 1038 xd->mi_8x8[0]->bmi[block].as_mode = mode; |
| 1077 src_diff = raster_block_offset_int16(BLOCK_8X8, block, p->src_diff); | 1039 src_diff = raster_block_offset_int16(BLOCK_8X8, block, p->src_diff); |
| 1078 coeff = BLOCK_OFFSET(x->plane[0].coeff, block); | 1040 coeff = BLOCK_OFFSET(x->plane[0].coeff, block); |
| 1079 vp9_predict_intra_block(xd, block, 1, | 1041 vp9_predict_intra_block(xd, block, 1, |
| 1080 TX_4X4, mode, | 1042 TX_4X4, mode, |
| 1081 x->skip_encode ? src : dst, | 1043 x->skip_encode ? src : dst, |
| 1082 x->skip_encode ? src_stride : dst_stride, | 1044 x->skip_encode ? src_stride : dst_stride, |
| 1083 dst, dst_stride); | 1045 dst, dst_stride); |
| 1084 vp9_subtract_block(4, 4, src_diff, 8, | 1046 vp9_subtract_block(4, 4, src_diff, 8, |
| 1085 src, src_stride, | 1047 src, src_stride, |
| 1086 dst, dst_stride); | 1048 dst, dst_stride); |
| 1087 | 1049 |
| 1088 tx_type = get_tx_type_4x4(PLANE_TYPE_Y_WITH_DC, xd, block); | 1050 tx_type = get_tx_type_4x4(PLANE_TYPE_Y, xd, block); |
| 1089 get_scan_nb_4x4(tx_type, &scan, &nb); | 1051 so = &vp9_scan_orders[TX_4X4][tx_type]; |
| 1090 | 1052 |
| 1091 if (tx_type != DCT_DCT) | 1053 if (tx_type != DCT_DCT) |
| 1092 vp9_short_fht4x4(src_diff, coeff, 8, tx_type); | 1054 vp9_short_fht4x4(src_diff, coeff, 8, tx_type); |
| 1093 else | 1055 else |
| 1094 x->fwd_txm4x4(src_diff, coeff, 8); | 1056 x->fwd_txm4x4(src_diff, coeff, 8); |
| 1095 | 1057 |
| 1096 vp9_regular_quantize_b_4x4(x, 16, block, scan, get_iscan_4x4(tx_type)); | 1058 vp9_regular_quantize_b_4x4(x, 0, block, so->scan, so->iscan); |
| 1097 | 1059 |
| 1098 ratey += cost_coeffs(x, 0, block, | 1060 ratey += cost_coeffs(x, 0, block, tempa + idx, templ + idy, TX_4X4, |
| 1099 tempa + idx, templ + idy, TX_4X4, scan, nb); | 1061 so->scan, so->neighbors); |
| 1100 distortion += vp9_block_error(coeff, BLOCK_OFFSET(pd->dqcoeff, block), | 1062 distortion += vp9_block_error(coeff, BLOCK_OFFSET(pd->dqcoeff, block), |
| 1101 16, &ssz) >> 2; | 1063 16, &ssz) >> 2; |
| 1102 if (RDCOST(x->rdmult, x->rddiv, ratey, distortion) >= best_rd) | 1064 if (RDCOST(x->rdmult, x->rddiv, ratey, distortion) >= best_rd) |
| 1103 goto next; | 1065 goto next; |
| 1104 | 1066 |
| 1105 if (tx_type != DCT_DCT) | 1067 if (tx_type != DCT_DCT) |
| 1106 vp9_iht4x4_16_add(BLOCK_OFFSET(pd->dqcoeff, block), | 1068 vp9_iht4x4_16_add(BLOCK_OFFSET(pd->dqcoeff, block), |
| 1107 dst, pd->dst.stride, tx_type); | 1069 dst, pd->dst.stride, tx_type); |
| 1108 else | 1070 else |
| 1109 xd->itxm_add(BLOCK_OFFSET(pd->dqcoeff, block), dst, pd->dst.stride, | 1071 xd->itxm_add(BLOCK_OFFSET(pd->dqcoeff, block), dst, pd->dst.stride, |
| (...skipping 210 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1320 | 1282 |
| 1321 term: | 1283 term: |
| 1322 *rate = INT_MAX; | 1284 *rate = INT_MAX; |
| 1323 *distortion = INT64_MAX; | 1285 *distortion = INT64_MAX; |
| 1324 *sse = INT64_MAX; | 1286 *sse = INT64_MAX; |
| 1325 *skippable = 0; | 1287 *skippable = 0; |
| 1326 return; | 1288 return; |
| 1327 } | 1289 } |
| 1328 | 1290 |
| 1329 static int64_t rd_pick_intra_sbuv_mode(VP9_COMP *cpi, MACROBLOCK *x, | 1291 static int64_t rd_pick_intra_sbuv_mode(VP9_COMP *cpi, MACROBLOCK *x, |
| 1292 PICK_MODE_CONTEXT *ctx, |
| 1330 int *rate, int *rate_tokenonly, | 1293 int *rate, int *rate_tokenonly, |
| 1331 int64_t *distortion, int *skippable, | 1294 int64_t *distortion, int *skippable, |
| 1332 BLOCK_SIZE bsize) { | 1295 BLOCK_SIZE bsize, TX_SIZE max_tx_size) { |
| 1333 MB_PREDICTION_MODE mode; | 1296 MB_PREDICTION_MODE mode; |
| 1334 MB_PREDICTION_MODE mode_selected = DC_PRED; | 1297 MB_PREDICTION_MODE mode_selected = DC_PRED; |
| 1335 int64_t best_rd = INT64_MAX, this_rd; | 1298 int64_t best_rd = INT64_MAX, this_rd; |
| 1336 int this_rate_tokenonly, this_rate, s; | 1299 int this_rate_tokenonly, this_rate, s; |
| 1337 int64_t this_distortion, this_sse; | 1300 int64_t this_distortion, this_sse; |
| 1338 | 1301 |
| 1339 // int mode_mask = (bsize <= BLOCK_8X8) | 1302 for (mode = DC_PRED; mode <= TM_PRED; ++mode) { |
| 1340 // ? ALL_INTRA_MODES : cpi->sf.intra_uv_mode_mask; | 1303 if (!(cpi->sf.intra_uv_mode_mask[max_tx_size] & (1 << mode))) |
| 1341 | |
| 1342 for (mode = DC_PRED; mode <= TM_PRED; mode ++) { | |
| 1343 // if (!(mode_mask & (1 << mode))) | |
| 1344 if (!(cpi->sf.intra_uv_mode_mask[max_uv_txsize_lookup[bsize]] | |
| 1345 & (1 << mode))) | |
| 1346 continue; | 1304 continue; |
| 1347 | 1305 |
| 1348 x->e_mbd.mi_8x8[0]->mbmi.uv_mode = mode; | 1306 x->e_mbd.mi_8x8[0]->mbmi.uv_mode = mode; |
| 1349 | 1307 |
| 1350 super_block_uvrd(cpi, x, &this_rate_tokenonly, | 1308 super_block_uvrd(cpi, x, &this_rate_tokenonly, |
| 1351 &this_distortion, &s, &this_sse, bsize, best_rd); | 1309 &this_distortion, &s, &this_sse, bsize, best_rd); |
| 1352 if (this_rate_tokenonly == INT_MAX) | 1310 if (this_rate_tokenonly == INT_MAX) |
| 1353 continue; | 1311 continue; |
| 1354 this_rate = this_rate_tokenonly + | 1312 this_rate = this_rate_tokenonly + |
| 1355 x->intra_uv_mode_cost[cpi->common.frame_type][mode]; | 1313 x->intra_uv_mode_cost[cpi->common.frame_type][mode]; |
| 1356 this_rd = RDCOST(x->rdmult, x->rddiv, this_rate, this_distortion); | 1314 this_rd = RDCOST(x->rdmult, x->rddiv, this_rate, this_distortion); |
| 1357 | 1315 |
| 1358 if (this_rd < best_rd) { | 1316 if (this_rd < best_rd) { |
| 1359 mode_selected = mode; | 1317 mode_selected = mode; |
| 1360 best_rd = this_rd; | 1318 best_rd = this_rd; |
| 1361 *rate = this_rate; | 1319 *rate = this_rate; |
| 1362 *rate_tokenonly = this_rate_tokenonly; | 1320 *rate_tokenonly = this_rate_tokenonly; |
| 1363 *distortion = this_distortion; | 1321 *distortion = this_distortion; |
| 1364 *skippable = s; | 1322 *skippable = s; |
| 1323 if (!x->select_txfm_size) { |
| 1324 int i; |
| 1325 struct macroblock_plane *const p = x->plane; |
| 1326 struct macroblockd_plane *const pd = x->e_mbd.plane; |
| 1327 for (i = 1; i < MAX_MB_PLANE; ++i) { |
| 1328 p[i].coeff = ctx->coeff_pbuf[i][2]; |
| 1329 p[i].qcoeff = ctx->qcoeff_pbuf[i][2]; |
| 1330 pd[i].dqcoeff = ctx->dqcoeff_pbuf[i][2]; |
| 1331 p[i].eobs = ctx->eobs_pbuf[i][2]; |
| 1332 |
| 1333 ctx->coeff_pbuf[i][2] = ctx->coeff_pbuf[i][0]; |
| 1334 ctx->qcoeff_pbuf[i][2] = ctx->qcoeff_pbuf[i][0]; |
| 1335 ctx->dqcoeff_pbuf[i][2] = ctx->dqcoeff_pbuf[i][0]; |
| 1336 ctx->eobs_pbuf[i][2] = ctx->eobs_pbuf[i][0]; |
| 1337 |
| 1338 ctx->coeff_pbuf[i][0] = p[i].coeff; |
| 1339 ctx->qcoeff_pbuf[i][0] = p[i].qcoeff; |
| 1340 ctx->dqcoeff_pbuf[i][0] = pd[i].dqcoeff; |
| 1341 ctx->eobs_pbuf[i][0] = p[i].eobs; |
| 1342 } |
| 1343 } |
| 1365 } | 1344 } |
| 1366 } | 1345 } |
| 1367 | 1346 |
| 1368 x->e_mbd.mi_8x8[0]->mbmi.uv_mode = mode_selected; | 1347 x->e_mbd.mi_8x8[0]->mbmi.uv_mode = mode_selected; |
| 1369 | |
| 1370 return best_rd; | 1348 return best_rd; |
| 1371 } | 1349 } |
| 1372 | 1350 |
| 1373 static int64_t rd_sbuv_dcpred(VP9_COMP *cpi, MACROBLOCK *x, | 1351 static int64_t rd_sbuv_dcpred(VP9_COMP *cpi, MACROBLOCK *x, |
| 1374 int *rate, int *rate_tokenonly, | 1352 int *rate, int *rate_tokenonly, |
| 1375 int64_t *distortion, int *skippable, | 1353 int64_t *distortion, int *skippable, |
| 1376 BLOCK_SIZE bsize) { | 1354 BLOCK_SIZE bsize) { |
| 1377 int64_t this_rd; | 1355 int64_t this_rd; |
| 1378 int64_t this_sse; | 1356 int64_t this_sse; |
| 1379 | 1357 |
| 1380 x->e_mbd.mi_8x8[0]->mbmi.uv_mode = DC_PRED; | 1358 x->e_mbd.mi_8x8[0]->mbmi.uv_mode = DC_PRED; |
| 1381 super_block_uvrd(cpi, x, rate_tokenonly, distortion, | 1359 super_block_uvrd(cpi, x, rate_tokenonly, distortion, |
| 1382 skippable, &this_sse, bsize, INT64_MAX); | 1360 skippable, &this_sse, bsize, INT64_MAX); |
| 1383 *rate = *rate_tokenonly + | 1361 *rate = *rate_tokenonly + |
| 1384 x->intra_uv_mode_cost[cpi->common.frame_type][DC_PRED]; | 1362 x->intra_uv_mode_cost[cpi->common.frame_type][DC_PRED]; |
| 1385 this_rd = RDCOST(x->rdmult, x->rddiv, *rate, *distortion); | 1363 this_rd = RDCOST(x->rdmult, x->rddiv, *rate, *distortion); |
| 1386 | 1364 |
| 1387 return this_rd; | 1365 return this_rd; |
| 1388 } | 1366 } |
| 1389 | 1367 |
| 1390 static void choose_intra_uv_mode(VP9_COMP *cpi, BLOCK_SIZE bsize, | 1368 static void choose_intra_uv_mode(VP9_COMP *cpi, PICK_MODE_CONTEXT *ctx, |
| 1369 BLOCK_SIZE bsize, TX_SIZE max_tx_size, |
| 1391 int *rate_uv, int *rate_uv_tokenonly, | 1370 int *rate_uv, int *rate_uv_tokenonly, |
| 1392 int64_t *dist_uv, int *skip_uv, | 1371 int64_t *dist_uv, int *skip_uv, |
| 1393 MB_PREDICTION_MODE *mode_uv) { | 1372 MB_PREDICTION_MODE *mode_uv) { |
| 1394 MACROBLOCK *const x = &cpi->mb; | 1373 MACROBLOCK *const x = &cpi->mb; |
| 1395 | 1374 |
| 1396 // Use an estimated rd for uv_intra based on DC_PRED if the | 1375 // Use an estimated rd for uv_intra based on DC_PRED if the |
| 1397 // appropriate speed flag is set. | 1376 // appropriate speed flag is set. |
| 1398 if (cpi->sf.use_uv_intra_rd_estimate) { | 1377 if (cpi->sf.use_uv_intra_rd_estimate) { |
| 1399 rd_sbuv_dcpred(cpi, x, rate_uv, rate_uv_tokenonly, dist_uv, skip_uv, | 1378 rd_sbuv_dcpred(cpi, x, rate_uv, rate_uv_tokenonly, dist_uv, skip_uv, |
| 1400 bsize < BLOCK_8X8 ? BLOCK_8X8 : bsize); | 1379 bsize < BLOCK_8X8 ? BLOCK_8X8 : bsize); |
| 1401 // Else do a proper rd search for each possible transform size that may | 1380 // Else do a proper rd search for each possible transform size that may |
| 1402 // be considered in the main rd loop. | 1381 // be considered in the main rd loop. |
| 1403 } else { | 1382 } else { |
| 1404 rd_pick_intra_sbuv_mode(cpi, x, | 1383 rd_pick_intra_sbuv_mode(cpi, x, ctx, |
| 1405 rate_uv, rate_uv_tokenonly, dist_uv, skip_uv, | 1384 rate_uv, rate_uv_tokenonly, dist_uv, skip_uv, |
| 1406 bsize < BLOCK_8X8 ? BLOCK_8X8 : bsize); | 1385 bsize < BLOCK_8X8 ? BLOCK_8X8 : bsize, max_tx_size); |
| 1407 } | 1386 } |
| 1408 *mode_uv = x->e_mbd.mi_8x8[0]->mbmi.uv_mode; | 1387 *mode_uv = x->e_mbd.mi_8x8[0]->mbmi.uv_mode; |
| 1409 } | 1388 } |
| 1410 | 1389 |
| 1411 static int cost_mv_ref(VP9_COMP *cpi, MB_PREDICTION_MODE mode, | 1390 static int cost_mv_ref(VP9_COMP *cpi, MB_PREDICTION_MODE mode, |
| 1412 int mode_context) { | 1391 int mode_context) { |
| 1413 MACROBLOCK *const x = &cpi->mb; | 1392 MACROBLOCK *const x = &cpi->mb; |
| 1414 MACROBLOCKD *const xd = &x->e_mbd; | 1393 MACROBLOCKD *const xd = &x->e_mbd; |
| 1415 const int segment_id = xd->mi_8x8[0]->mbmi.segment_id; | 1394 const int segment_id = xd->mi_8x8[0]->mbmi.segment_id; |
| 1416 | 1395 |
| 1417 // Don't account for mode here if segment skip is enabled. | 1396 // Don't account for mode here if segment skip is enabled. |
| 1418 if (!vp9_segfeature_active(&cpi->common.seg, segment_id, SEG_LVL_SKIP)) { | 1397 if (!vp9_segfeature_active(&cpi->common.seg, segment_id, SEG_LVL_SKIP)) { |
| 1419 assert(is_inter_mode(mode)); | 1398 assert(is_inter_mode(mode)); |
| 1420 return x->inter_mode_cost[mode_context][inter_mode_offset(mode)]; | 1399 return x->inter_mode_cost[mode_context][INTER_OFFSET(mode)]; |
| 1421 } else { | 1400 } else { |
| 1422 return 0; | 1401 return 0; |
| 1423 } | 1402 } |
| 1424 } | 1403 } |
| 1425 | 1404 |
| 1426 void vp9_set_mbmode_and_mvs(MACROBLOCK *x, MB_PREDICTION_MODE mb, int_mv *mv) { | 1405 void vp9_set_mbmode_and_mvs(MACROBLOCK *x, MB_PREDICTION_MODE mb, int_mv *mv) { |
| 1427 x->e_mbd.mi_8x8[0]->mbmi.mode = mb; | 1406 x->e_mbd.mi_8x8[0]->mbmi.mode = mb; |
| 1428 x->e_mbd.mi_8x8[0]->mbmi.mv[0].as_int = mv->as_int; | 1407 x->e_mbd.mi_8x8[0]->mbmi.mv[0].as_int = mv->as_int; |
| 1429 } | 1408 } |
| 1430 | 1409 |
| (...skipping 85 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1516 int i, | 1495 int i, |
| 1517 int *labelyrate, | 1496 int *labelyrate, |
| 1518 int64_t *distortion, int64_t *sse, | 1497 int64_t *distortion, int64_t *sse, |
| 1519 ENTROPY_CONTEXT *ta, | 1498 ENTROPY_CONTEXT *ta, |
| 1520 ENTROPY_CONTEXT *tl) { | 1499 ENTROPY_CONTEXT *tl) { |
| 1521 int k; | 1500 int k; |
| 1522 MACROBLOCKD *xd = &x->e_mbd; | 1501 MACROBLOCKD *xd = &x->e_mbd; |
| 1523 struct macroblockd_plane *const pd = &xd->plane[0]; | 1502 struct macroblockd_plane *const pd = &xd->plane[0]; |
| 1524 struct macroblock_plane *const p = &x->plane[0]; | 1503 struct macroblock_plane *const p = &x->plane[0]; |
| 1525 MODE_INFO *const mi = xd->mi_8x8[0]; | 1504 MODE_INFO *const mi = xd->mi_8x8[0]; |
| 1526 const BLOCK_SIZE bsize = mi->mbmi.sb_type; | 1505 const BLOCK_SIZE plane_bsize = get_plane_block_size(mi->mbmi.sb_type, pd); |
| 1527 const int width = plane_block_width(bsize, pd); | 1506 const int width = 4 * num_4x4_blocks_wide_lookup[plane_bsize]; |
| 1528 const int height = plane_block_height(bsize, pd); | 1507 const int height = 4 * num_4x4_blocks_high_lookup[plane_bsize]; |
| 1529 int idx, idy; | 1508 int idx, idy; |
| 1530 | 1509 |
| 1531 uint8_t *const src = raster_block_offset_uint8(BLOCK_8X8, i, | 1510 const uint8_t *const src = &p->src.buf[raster_block_offset(BLOCK_8X8, i, |
| 1532 p->src.buf, p->src.stride); | 1511 p->src.stride)]; |
| 1533 uint8_t *const dst = raster_block_offset_uint8(BLOCK_8X8, i, | 1512 uint8_t *const dst = &pd->dst.buf[raster_block_offset(BLOCK_8X8, i, |
| 1534 pd->dst.buf, pd->dst.stride); | 1513 pd->dst.stride)]; |
| 1535 int64_t thisdistortion = 0, thissse = 0; | 1514 int64_t thisdistortion = 0, thissse = 0; |
| 1536 int thisrate = 0, ref; | 1515 int thisrate = 0, ref; |
| 1516 const scan_order *so = &vp9_default_scan_orders[TX_4X4]; |
| 1537 const int is_compound = has_second_ref(&mi->mbmi); | 1517 const int is_compound = has_second_ref(&mi->mbmi); |
| 1538 for (ref = 0; ref < 1 + is_compound; ++ref) { | 1518 for (ref = 0; ref < 1 + is_compound; ++ref) { |
| 1539 const uint8_t *pre = raster_block_offset_uint8(BLOCK_8X8, i, | 1519 const uint8_t *pre = &pd->pre[ref].buf[raster_block_offset(BLOCK_8X8, i, |
| 1540 pd->pre[ref].buf, pd->pre[ref].stride); | 1520 pd->pre[ref].stride)]; |
| 1541 vp9_build_inter_predictor(pre, pd->pre[ref].stride, | 1521 vp9_build_inter_predictor(pre, pd->pre[ref].stride, |
| 1542 dst, pd->dst.stride, | 1522 dst, pd->dst.stride, |
| 1543 &mi->bmi[i].as_mv[ref].as_mv, | 1523 &mi->bmi[i].as_mv[ref].as_mv, |
| 1544 &xd->scale_factor[ref], | 1524 &xd->scale_factor[ref], |
| 1545 width, height, ref, &xd->subpix, MV_PRECISION_Q3); | 1525 width, height, ref, &xd->subpix, MV_PRECISION_Q3); |
| 1546 } | 1526 } |
| 1547 | 1527 |
| 1548 vp9_subtract_block(height, width, | 1528 vp9_subtract_block(height, width, |
| 1549 raster_block_offset_int16(BLOCK_8X8, i, p->src_diff), 8, | 1529 raster_block_offset_int16(BLOCK_8X8, i, p->src_diff), 8, |
| 1550 src, p->src.stride, | 1530 src, p->src.stride, |
| 1551 dst, pd->dst.stride); | 1531 dst, pd->dst.stride); |
| 1552 | 1532 |
| 1553 k = i; | 1533 k = i; |
| 1554 for (idy = 0; idy < height / 4; ++idy) { | 1534 for (idy = 0; idy < height / 4; ++idy) { |
| 1555 for (idx = 0; idx < width / 4; ++idx) { | 1535 for (idx = 0; idx < width / 4; ++idx) { |
| 1556 int64_t ssz, rd, rd1, rd2; | 1536 int64_t ssz, rd, rd1, rd2; |
| 1557 int16_t* coeff; | 1537 int16_t* coeff; |
| 1558 | 1538 |
| 1559 k += (idy * 2 + idx); | 1539 k += (idy * 2 + idx); |
| 1560 coeff = BLOCK_OFFSET(p->coeff, k); | 1540 coeff = BLOCK_OFFSET(p->coeff, k); |
| 1561 x->fwd_txm4x4(raster_block_offset_int16(BLOCK_8X8, k, p->src_diff), | 1541 x->fwd_txm4x4(raster_block_offset_int16(BLOCK_8X8, k, p->src_diff), |
| 1562 coeff, 8); | 1542 coeff, 8); |
| 1563 vp9_regular_quantize_b_4x4(x, 16, k, get_scan_4x4(DCT_DCT), | 1543 vp9_regular_quantize_b_4x4(x, 0, k, so->scan, so->iscan); |
| 1564 get_iscan_4x4(DCT_DCT)); | |
| 1565 thisdistortion += vp9_block_error(coeff, BLOCK_OFFSET(pd->dqcoeff, k), | 1544 thisdistortion += vp9_block_error(coeff, BLOCK_OFFSET(pd->dqcoeff, k), |
| 1566 16, &ssz); | 1545 16, &ssz); |
| 1567 thissse += ssz; | 1546 thissse += ssz; |
| 1568 thisrate += cost_coeffs(x, 0, k, | 1547 thisrate += cost_coeffs(x, 0, k, ta + (k & 1), tl + (k >> 1), TX_4X4, |
| 1569 ta + (k & 1), | 1548 so->scan, so->neighbors); |
| 1570 tl + (k >> 1), TX_4X4, | |
| 1571 vp9_default_scan_4x4, | |
| 1572 vp9_default_scan_4x4_neighbors); | |
| 1573 rd1 = RDCOST(x->rdmult, x->rddiv, thisrate, thisdistortion >> 2); | 1549 rd1 = RDCOST(x->rdmult, x->rddiv, thisrate, thisdistortion >> 2); |
| 1574 rd2 = RDCOST(x->rdmult, x->rddiv, 0, thissse >> 2); | 1550 rd2 = RDCOST(x->rdmult, x->rddiv, 0, thissse >> 2); |
| 1575 rd = MIN(rd1, rd2); | 1551 rd = MIN(rd1, rd2); |
| 1576 if (rd >= best_yrd) | 1552 if (rd >= best_yrd) |
| 1577 return INT64_MAX; | 1553 return INT64_MAX; |
| 1578 } | 1554 } |
| 1579 } | 1555 } |
| 1580 | 1556 |
| 1581 *distortion = thisdistortion >> 2; | 1557 *distortion = thisdistortion >> 2; |
| 1582 *labelyrate = thisrate; | 1558 *labelyrate = thisrate; |
| (...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1618 r |= (mv->as_mv.col >> 3) < x->mv_col_min; | 1594 r |= (mv->as_mv.col >> 3) < x->mv_col_min; |
| 1619 r |= (mv->as_mv.col >> 3) > x->mv_col_max; | 1595 r |= (mv->as_mv.col >> 3) > x->mv_col_max; |
| 1620 return r; | 1596 return r; |
| 1621 } | 1597 } |
| 1622 | 1598 |
| 1623 static INLINE void mi_buf_shift(MACROBLOCK *x, int i) { | 1599 static INLINE void mi_buf_shift(MACROBLOCK *x, int i) { |
| 1624 MB_MODE_INFO *const mbmi = &x->e_mbd.mi_8x8[0]->mbmi; | 1600 MB_MODE_INFO *const mbmi = &x->e_mbd.mi_8x8[0]->mbmi; |
| 1625 struct macroblock_plane *const p = &x->plane[0]; | 1601 struct macroblock_plane *const p = &x->plane[0]; |
| 1626 struct macroblockd_plane *const pd = &x->e_mbd.plane[0]; | 1602 struct macroblockd_plane *const pd = &x->e_mbd.plane[0]; |
| 1627 | 1603 |
| 1628 p->src.buf = raster_block_offset_uint8(BLOCK_8X8, i, p->src.buf, | 1604 p->src.buf = &p->src.buf[raster_block_offset(BLOCK_8X8, i, p->src.stride)]; |
| 1629 p->src.stride); | |
| 1630 assert(((intptr_t)pd->pre[0].buf & 0x7) == 0); | 1605 assert(((intptr_t)pd->pre[0].buf & 0x7) == 0); |
| 1631 pd->pre[0].buf = raster_block_offset_uint8(BLOCK_8X8, i, pd->pre[0].buf, | 1606 pd->pre[0].buf = &pd->pre[0].buf[raster_block_offset(BLOCK_8X8, i, |
| 1632 pd->pre[0].stride); | 1607 pd->pre[0].stride)]; |
| 1633 if (has_second_ref(mbmi)) | 1608 if (has_second_ref(mbmi)) |
| 1634 pd->pre[1].buf = raster_block_offset_uint8(BLOCK_8X8, i, pd->pre[1].buf, | 1609 pd->pre[1].buf = &pd->pre[1].buf[raster_block_offset(BLOCK_8X8, i, |
| 1635 pd->pre[1].stride); | 1610 pd->pre[1].stride)]; |
| 1636 } | 1611 } |
| 1637 | 1612 |
| 1638 static INLINE void mi_buf_restore(MACROBLOCK *x, struct buf_2d orig_src, | 1613 static INLINE void mi_buf_restore(MACROBLOCK *x, struct buf_2d orig_src, |
| 1639 struct buf_2d orig_pre[2]) { | 1614 struct buf_2d orig_pre[2]) { |
| 1640 MB_MODE_INFO *mbmi = &x->e_mbd.mi_8x8[0]->mbmi; | 1615 MB_MODE_INFO *mbmi = &x->e_mbd.mi_8x8[0]->mbmi; |
| 1641 x->plane[0].src = orig_src; | 1616 x->plane[0].src = orig_src; |
| 1642 x->e_mbd.plane[0].pre[0] = orig_pre[0]; | 1617 x->e_mbd.plane[0].pre[0] = orig_pre[0]; |
| 1643 if (has_second_ref(mbmi)) | 1618 if (has_second_ref(mbmi)) |
| 1644 x->e_mbd.plane[0].pre[1] = orig_pre[1]; | 1619 x->e_mbd.plane[0].pre[1] = orig_pre[1]; |
| 1645 } | 1620 } |
| 1646 | 1621 |
| 1647 static void rd_check_segment_txsize(VP9_COMP *cpi, MACROBLOCK *x, | 1622 static void rd_check_segment_txsize(VP9_COMP *cpi, MACROBLOCK *x, |
| 1648 const TileInfo *const tile, | 1623 const TileInfo *const tile, |
| 1649 BEST_SEG_INFO *bsi_buf, int filter_idx, | 1624 BEST_SEG_INFO *bsi_buf, int filter_idx, |
| 1650 int_mv seg_mvs[4][MAX_REF_FRAMES], | 1625 int_mv seg_mvs[4][MAX_REF_FRAMES], |
| 1651 int mi_row, int mi_col) { | 1626 int mi_row, int mi_col) { |
| 1652 int i, br = 0, idx, idy; | 1627 int i, br = 0, idx, idy; |
| 1653 int64_t bd = 0, block_sse = 0; | 1628 int64_t bd = 0, block_sse = 0; |
| 1654 MB_PREDICTION_MODE this_mode; | 1629 MB_PREDICTION_MODE this_mode; |
| 1655 MODE_INFO *mi = x->e_mbd.mi_8x8[0]; | 1630 MODE_INFO *mi = x->e_mbd.mi_8x8[0]; |
| 1656 MB_MODE_INFO *const mbmi = &mi->mbmi; | 1631 MB_MODE_INFO *const mbmi = &mi->mbmi; |
| 1632 struct macroblock_plane *const p = &x->plane[0]; |
| 1657 struct macroblockd_plane *const pd = &x->e_mbd.plane[0]; | 1633 struct macroblockd_plane *const pd = &x->e_mbd.plane[0]; |
| 1658 const int label_count = 4; | 1634 const int label_count = 4; |
| 1659 int64_t this_segment_rd = 0; | 1635 int64_t this_segment_rd = 0; |
| 1660 int label_mv_thresh; | 1636 int label_mv_thresh; |
| 1661 int segmentyrate = 0; | 1637 int segmentyrate = 0; |
| 1662 const BLOCK_SIZE bsize = mbmi->sb_type; | 1638 const BLOCK_SIZE bsize = mbmi->sb_type; |
| 1663 const int num_4x4_blocks_wide = num_4x4_blocks_wide_lookup[bsize]; | 1639 const int num_4x4_blocks_wide = num_4x4_blocks_wide_lookup[bsize]; |
| 1664 const int num_4x4_blocks_high = num_4x4_blocks_high_lookup[bsize]; | 1640 const int num_4x4_blocks_high = num_4x4_blocks_high_lookup[bsize]; |
| 1665 vp9_variance_fn_ptr_t *v_fn_ptr; | 1641 vp9_variance_fn_ptr_t *v_fn_ptr; |
| 1666 ENTROPY_CONTEXT t_above[2], t_left[2]; | 1642 ENTROPY_CONTEXT t_above[2], t_left[2]; |
| (...skipping 19 matching lines...) Expand all Loading... |
| 1686 // TODO(jingning,rbultje): rewrite the rate-distortion optimization | 1662 // TODO(jingning,rbultje): rewrite the rate-distortion optimization |
| 1687 // loop for 4x4/4x8/8x4 block coding. to be replaced with new rd loop | 1663 // loop for 4x4/4x8/8x4 block coding. to be replaced with new rd loop |
| 1688 int_mv mode_mv[MB_MODE_COUNT], second_mode_mv[MB_MODE_COUNT]; | 1664 int_mv mode_mv[MB_MODE_COUNT], second_mode_mv[MB_MODE_COUNT]; |
| 1689 int_mv frame_mv[MB_MODE_COUNT][MAX_REF_FRAMES]; | 1665 int_mv frame_mv[MB_MODE_COUNT][MAX_REF_FRAMES]; |
| 1690 MB_PREDICTION_MODE mode_selected = ZEROMV; | 1666 MB_PREDICTION_MODE mode_selected = ZEROMV; |
| 1691 int64_t best_rd = INT64_MAX; | 1667 int64_t best_rd = INT64_MAX; |
| 1692 i = idy * 2 + idx; | 1668 i = idy * 2 + idx; |
| 1693 | 1669 |
| 1694 frame_mv[ZEROMV][mbmi->ref_frame[0]].as_int = 0; | 1670 frame_mv[ZEROMV][mbmi->ref_frame[0]].as_int = 0; |
| 1695 vp9_append_sub8x8_mvs_for_idx(&cpi->common, &x->e_mbd, tile, | 1671 vp9_append_sub8x8_mvs_for_idx(&cpi->common, &x->e_mbd, tile, |
| 1672 i, 0, mi_row, mi_col, |
| 1696 &frame_mv[NEARESTMV][mbmi->ref_frame[0]], | 1673 &frame_mv[NEARESTMV][mbmi->ref_frame[0]], |
| 1697 &frame_mv[NEARMV][mbmi->ref_frame[0]], | 1674 &frame_mv[NEARMV][mbmi->ref_frame[0]]); |
| 1698 i, 0, mi_row, mi_col); | |
| 1699 if (has_second_rf) { | 1675 if (has_second_rf) { |
| 1700 frame_mv[ZEROMV][mbmi->ref_frame[1]].as_int = 0; | 1676 frame_mv[ZEROMV][mbmi->ref_frame[1]].as_int = 0; |
| 1701 vp9_append_sub8x8_mvs_for_idx(&cpi->common, &x->e_mbd, tile, | 1677 vp9_append_sub8x8_mvs_for_idx(&cpi->common, &x->e_mbd, tile, |
| 1678 i, 1, mi_row, mi_col, |
| 1702 &frame_mv[NEARESTMV][mbmi->ref_frame[1]], | 1679 &frame_mv[NEARESTMV][mbmi->ref_frame[1]], |
| 1703 &frame_mv[NEARMV][mbmi->ref_frame[1]], | 1680 &frame_mv[NEARMV][mbmi->ref_frame[1]]); |
| 1704 i, 1, mi_row, mi_col); | |
| 1705 } | 1681 } |
| 1706 // search for the best motion vector on this segment | 1682 // search for the best motion vector on this segment |
| 1707 for (this_mode = NEARESTMV; this_mode <= NEWMV; ++this_mode) { | 1683 for (this_mode = NEARESTMV; this_mode <= NEWMV; ++this_mode) { |
| 1708 const struct buf_2d orig_src = x->plane[0].src; | 1684 const struct buf_2d orig_src = x->plane[0].src; |
| 1709 struct buf_2d orig_pre[2]; | 1685 struct buf_2d orig_pre[2]; |
| 1710 | 1686 |
| 1711 mode_idx = inter_mode_offset(this_mode); | 1687 mode_idx = INTER_OFFSET(this_mode); |
| 1712 bsi->rdstat[i][mode_idx].brdcost = INT64_MAX; | 1688 bsi->rdstat[i][mode_idx].brdcost = INT64_MAX; |
| 1713 | 1689 |
| 1714 // if we're near/nearest and mv == 0,0, compare to zeromv | 1690 // if we're near/nearest and mv == 0,0, compare to zeromv |
| 1715 if ((this_mode == NEARMV || this_mode == NEARESTMV || | 1691 if ((this_mode == NEARMV || this_mode == NEARESTMV || |
| 1716 this_mode == ZEROMV) && | 1692 this_mode == ZEROMV) && |
| 1717 frame_mv[this_mode][mbmi->ref_frame[0]].as_int == 0 && | 1693 frame_mv[this_mode][mbmi->ref_frame[0]].as_int == 0 && |
| 1718 (!has_second_rf || | 1694 (!has_second_rf || |
| 1719 frame_mv[this_mode][mbmi->ref_frame[1]].as_int == 0)) { | 1695 frame_mv[this_mode][mbmi->ref_frame[1]].as_int == 0)) { |
| 1720 int rfc = mbmi->mode_context[mbmi->ref_frame[0]]; | 1696 int rfc = mbmi->mode_context[mbmi->ref_frame[0]]; |
| 1721 int c1 = cost_mv_ref(cpi, NEARMV, rfc); | 1697 int c1 = cost_mv_ref(cpi, NEARMV, rfc); |
| (...skipping 75 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1797 | 1773 |
| 1798 if (cpi->sf.adaptive_motion_search && cpi->common.show_frame) { | 1774 if (cpi->sf.adaptive_motion_search && cpi->common.show_frame) { |
| 1799 mvp_full.as_mv.row = x->pred_mv[mbmi->ref_frame[0]].as_mv.row >> 3; | 1775 mvp_full.as_mv.row = x->pred_mv[mbmi->ref_frame[0]].as_mv.row >> 3; |
| 1800 mvp_full.as_mv.col = x->pred_mv[mbmi->ref_frame[0]].as_mv.col >> 3; | 1776 mvp_full.as_mv.col = x->pred_mv[mbmi->ref_frame[0]].as_mv.col >> 3; |
| 1801 step_param = MAX(step_param, 8); | 1777 step_param = MAX(step_param, 8); |
| 1802 } | 1778 } |
| 1803 | 1779 |
| 1804 further_steps = (MAX_MVSEARCH_STEPS - 1) - step_param; | 1780 further_steps = (MAX_MVSEARCH_STEPS - 1) - step_param; |
| 1805 // adjust src pointer for this block | 1781 // adjust src pointer for this block |
| 1806 mi_buf_shift(x, i); | 1782 mi_buf_shift(x, i); |
| 1783 |
| 1784 vp9_set_mv_search_range(x, &bsi->ref_mv->as_mv); |
| 1785 |
| 1807 if (cpi->sf.search_method == HEX) { | 1786 if (cpi->sf.search_method == HEX) { |
| 1808 bestsme = vp9_hex_search(x, &mvp_full.as_mv, | 1787 bestsme = vp9_hex_search(x, &mvp_full.as_mv, |
| 1809 step_param, | 1788 step_param, |
| 1810 sadpb, 1, v_fn_ptr, 1, | 1789 sadpb, 1, v_fn_ptr, 1, |
| 1811 &bsi->ref_mv->as_mv, | 1790 &bsi->ref_mv->as_mv, |
| 1812 &mode_mv[NEWMV].as_mv); | 1791 &mode_mv[NEWMV].as_mv); |
| 1813 } else if (cpi->sf.search_method == SQUARE) { | 1792 } else if (cpi->sf.search_method == SQUARE) { |
| 1814 bestsme = vp9_square_search(x, &mvp_full.as_mv, | 1793 bestsme = vp9_square_search(x, &mvp_full.as_mv, |
| 1815 step_param, | 1794 step_param, |
| 1816 sadpb, 1, v_fn_ptr, 1, | 1795 sadpb, 1, v_fn_ptr, 1, |
| (...skipping 10 matching lines...) Expand all Loading... |
| 1827 sadpb, further_steps, 0, v_fn_ptr, | 1806 sadpb, further_steps, 0, v_fn_ptr, |
| 1828 bsi->ref_mv, &mode_mv[NEWMV]); | 1807 bsi->ref_mv, &mode_mv[NEWMV]); |
| 1829 } | 1808 } |
| 1830 | 1809 |
| 1831 // Should we do a full search (best quality only) | 1810 // Should we do a full search (best quality only) |
| 1832 if (cpi->compressor_speed == 0) { | 1811 if (cpi->compressor_speed == 0) { |
| 1833 /* Check if mvp_full is within the range. */ | 1812 /* Check if mvp_full is within the range. */ |
| 1834 clamp_mv(&mvp_full.as_mv, x->mv_col_min, x->mv_col_max, | 1813 clamp_mv(&mvp_full.as_mv, x->mv_col_min, x->mv_col_max, |
| 1835 x->mv_row_min, x->mv_row_max); | 1814 x->mv_row_min, x->mv_row_max); |
| 1836 | 1815 |
| 1837 thissme = cpi->full_search_sad(x, &mvp_full, | 1816 thissme = cpi->full_search_sad(x, &mvp_full.as_mv, |
| 1838 sadpb, 16, v_fn_ptr, | 1817 sadpb, 16, v_fn_ptr, |
| 1839 x->nmvjointcost, x->mvcost, | 1818 x->nmvjointcost, x->mvcost, |
| 1840 bsi->ref_mv, i); | 1819 &bsi->ref_mv->as_mv, i); |
| 1841 | 1820 |
| 1842 if (thissme < bestsme) { | 1821 if (thissme < bestsme) { |
| 1843 bestsme = thissme; | 1822 bestsme = thissme; |
| 1844 mode_mv[NEWMV].as_int = mi->bmi[i].as_mv[0].as_int; | 1823 mode_mv[NEWMV].as_int = mi->bmi[i].as_mv[0].as_int; |
| 1845 } else { | 1824 } else { |
| 1846 /* The full search result is actually worse so re-instate the | 1825 /* The full search result is actually worse so re-instate the |
| 1847 * previous best vector */ | 1826 * previous best vector */ |
| 1848 mi->bmi[i].as_mv[0].as_int = mode_mv[NEWMV].as_int; | 1827 mi->bmi[i].as_mv[0].as_int = mode_mv[NEWMV].as_int; |
| 1849 } | 1828 } |
| 1850 } | 1829 } |
| (...skipping 14 matching lines...) Expand all Loading... |
| 1865 seg_mvs[i][mbmi->ref_frame[0]].as_int = mode_mv[NEWMV].as_int; | 1844 seg_mvs[i][mbmi->ref_frame[0]].as_int = mode_mv[NEWMV].as_int; |
| 1866 } | 1845 } |
| 1867 | 1846 |
| 1868 if (cpi->sf.adaptive_motion_search) | 1847 if (cpi->sf.adaptive_motion_search) |
| 1869 x->pred_mv[mbmi->ref_frame[0]].as_int = mode_mv[NEWMV].as_int; | 1848 x->pred_mv[mbmi->ref_frame[0]].as_int = mode_mv[NEWMV].as_int; |
| 1870 | 1849 |
| 1871 // restore src pointers | 1850 // restore src pointers |
| 1872 mi_buf_restore(x, orig_src, orig_pre); | 1851 mi_buf_restore(x, orig_src, orig_pre); |
| 1873 } | 1852 } |
| 1874 | 1853 |
| 1854 if (has_second_rf) { |
| 1855 if (seg_mvs[i][mbmi->ref_frame[1]].as_int == INVALID_MV || |
| 1856 seg_mvs[i][mbmi->ref_frame[0]].as_int == INVALID_MV) |
| 1857 continue; |
| 1858 } |
| 1859 |
| 1875 if (has_second_rf && this_mode == NEWMV && | 1860 if (has_second_rf && this_mode == NEWMV && |
| 1876 mbmi->interp_filter == EIGHTTAP) { | 1861 mbmi->interp_filter == EIGHTTAP) { |
| 1877 if (seg_mvs[i][mbmi->ref_frame[1]].as_int == INVALID_MV || | |
| 1878 seg_mvs[i][mbmi->ref_frame[0]].as_int == INVALID_MV) | |
| 1879 continue; | |
| 1880 | |
| 1881 // adjust src pointers | 1862 // adjust src pointers |
| 1882 mi_buf_shift(x, i); | 1863 mi_buf_shift(x, i); |
| 1883 if (cpi->sf.comp_inter_joint_search_thresh <= bsize) { | 1864 if (cpi->sf.comp_inter_joint_search_thresh <= bsize) { |
| 1884 int rate_mv; | 1865 int rate_mv; |
| 1885 joint_motion_search(cpi, x, bsize, frame_mv[this_mode], | 1866 joint_motion_search(cpi, x, bsize, frame_mv[this_mode], |
| 1886 mi_row, mi_col, seg_mvs[i], | 1867 mi_row, mi_col, seg_mvs[i], |
| 1887 &rate_mv); | 1868 &rate_mv); |
| 1888 seg_mvs[i][mbmi->ref_frame[0]].as_int = | 1869 seg_mvs[i][mbmi->ref_frame[0]].as_int = |
| 1889 frame_mv[this_mode][mbmi->ref_frame[0]].as_int; | 1870 frame_mv[this_mode][mbmi->ref_frame[0]].as_int; |
| 1890 seg_mvs[i][mbmi->ref_frame[1]].as_int = | 1871 seg_mvs[i][mbmi->ref_frame[1]].as_int = |
| 1891 frame_mv[this_mode][mbmi->ref_frame[1]].as_int; | 1872 frame_mv[this_mode][mbmi->ref_frame[1]].as_int; |
| 1892 } | 1873 } |
| 1893 // restore src pointers | 1874 // restore src pointers |
| 1894 mi_buf_restore(x, orig_src, orig_pre); | 1875 mi_buf_restore(x, orig_src, orig_pre); |
| 1895 } | 1876 } |
| 1896 | 1877 |
| 1897 bsi->rdstat[i][mode_idx].brate = | 1878 bsi->rdstat[i][mode_idx].brate = |
| 1898 labels2mode(x, i, this_mode, &mode_mv[this_mode], | 1879 labels2mode(x, i, this_mode, &mode_mv[this_mode], |
| 1899 &second_mode_mv[this_mode], frame_mv, seg_mvs[i], | 1880 &second_mode_mv[this_mode], frame_mv, seg_mvs[i], |
| 1900 bsi->ref_mv, bsi->second_ref_mv, x->nmvjointcost, | 1881 bsi->ref_mv, bsi->second_ref_mv, x->nmvjointcost, |
| 1901 x->mvcost, cpi); | 1882 x->mvcost, cpi); |
| 1902 | 1883 |
| 1884 |
| 1903 bsi->rdstat[i][mode_idx].mvs[0].as_int = mode_mv[this_mode].as_int; | 1885 bsi->rdstat[i][mode_idx].mvs[0].as_int = mode_mv[this_mode].as_int; |
| 1904 if (num_4x4_blocks_wide > 1) | 1886 if (num_4x4_blocks_wide > 1) |
| 1905 bsi->rdstat[i + 1][mode_idx].mvs[0].as_int = | 1887 bsi->rdstat[i + 1][mode_idx].mvs[0].as_int = |
| 1906 mode_mv[this_mode].as_int; | 1888 mode_mv[this_mode].as_int; |
| 1907 if (num_4x4_blocks_high > 1) | 1889 if (num_4x4_blocks_high > 1) |
| 1908 bsi->rdstat[i + 2][mode_idx].mvs[0].as_int = | 1890 bsi->rdstat[i + 2][mode_idx].mvs[0].as_int = |
| 1909 mode_mv[this_mode].as_int; | 1891 mode_mv[this_mode].as_int; |
| 1910 if (has_second_rf) { | 1892 if (has_second_rf) { |
| 1911 bsi->rdstat[i][mode_idx].mvs[1].as_int = | 1893 bsi->rdstat[i][mode_idx].mvs[1].as_int = |
| 1912 second_mode_mv[this_mode].as_int; | 1894 second_mode_mv[this_mode].as_int; |
| (...skipping 59 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1972 bsi->segment_rd - this_segment_rd, i, | 1954 bsi->segment_rd - this_segment_rd, i, |
| 1973 &bsi->rdstat[i][mode_idx].byrate, | 1955 &bsi->rdstat[i][mode_idx].byrate, |
| 1974 &bsi->rdstat[i][mode_idx].bdist, | 1956 &bsi->rdstat[i][mode_idx].bdist, |
| 1975 &bsi->rdstat[i][mode_idx].bsse, | 1957 &bsi->rdstat[i][mode_idx].bsse, |
| 1976 bsi->rdstat[i][mode_idx].ta, | 1958 bsi->rdstat[i][mode_idx].ta, |
| 1977 bsi->rdstat[i][mode_idx].tl); | 1959 bsi->rdstat[i][mode_idx].tl); |
| 1978 if (bsi->rdstat[i][mode_idx].brdcost < INT64_MAX) { | 1960 if (bsi->rdstat[i][mode_idx].brdcost < INT64_MAX) { |
| 1979 bsi->rdstat[i][mode_idx].brdcost += RDCOST(x->rdmult, x->rddiv, | 1961 bsi->rdstat[i][mode_idx].brdcost += RDCOST(x->rdmult, x->rddiv, |
| 1980 bsi->rdstat[i][mode_idx].brate, 0); | 1962 bsi->rdstat[i][mode_idx].brate, 0); |
| 1981 bsi->rdstat[i][mode_idx].brate += bsi->rdstat[i][mode_idx].byrate; | 1963 bsi->rdstat[i][mode_idx].brate += bsi->rdstat[i][mode_idx].byrate; |
| 1982 bsi->rdstat[i][mode_idx].eobs = pd->eobs[i]; | 1964 bsi->rdstat[i][mode_idx].eobs = p->eobs[i]; |
| 1983 if (num_4x4_blocks_wide > 1) | 1965 if (num_4x4_blocks_wide > 1) |
| 1984 bsi->rdstat[i + 1][mode_idx].eobs = pd->eobs[i + 1]; | 1966 bsi->rdstat[i + 1][mode_idx].eobs = p->eobs[i + 1]; |
| 1985 if (num_4x4_blocks_high > 1) | 1967 if (num_4x4_blocks_high > 1) |
| 1986 bsi->rdstat[i + 2][mode_idx].eobs = pd->eobs[i + 2]; | 1968 bsi->rdstat[i + 2][mode_idx].eobs = p->eobs[i + 2]; |
| 1987 } | 1969 } |
| 1988 | 1970 |
| 1989 if (bsi->rdstat[i][mode_idx].brdcost < best_rd) { | 1971 if (bsi->rdstat[i][mode_idx].brdcost < best_rd) { |
| 1990 mode_selected = this_mode; | 1972 mode_selected = this_mode; |
| 1991 best_rd = bsi->rdstat[i][mode_idx].brdcost; | 1973 best_rd = bsi->rdstat[i][mode_idx].brdcost; |
| 1992 } | 1974 } |
| 1993 } /*for each 4x4 mode*/ | 1975 } /*for each 4x4 mode*/ |
| 1994 | 1976 |
| 1995 if (best_rd == INT64_MAX) { | 1977 if (best_rd == INT64_MAX) { |
| 1996 int iy, midx; | 1978 int iy, midx; |
| 1997 for (iy = i + 1; iy < 4; ++iy) | 1979 for (iy = i + 1; iy < 4; ++iy) |
| 1998 for (midx = 0; midx < INTER_MODES; ++midx) | 1980 for (midx = 0; midx < INTER_MODES; ++midx) |
| 1999 bsi->rdstat[iy][midx].brdcost = INT64_MAX; | 1981 bsi->rdstat[iy][midx].brdcost = INT64_MAX; |
| 2000 bsi->segment_rd = INT64_MAX; | 1982 bsi->segment_rd = INT64_MAX; |
| 2001 return; | 1983 return; |
| 2002 } | 1984 } |
| 2003 | 1985 |
| 2004 mode_idx = inter_mode_offset(mode_selected); | 1986 mode_idx = INTER_OFFSET(mode_selected); |
| 2005 vpx_memcpy(t_above, bsi->rdstat[i][mode_idx].ta, sizeof(t_above)); | 1987 vpx_memcpy(t_above, bsi->rdstat[i][mode_idx].ta, sizeof(t_above)); |
| 2006 vpx_memcpy(t_left, bsi->rdstat[i][mode_idx].tl, sizeof(t_left)); | 1988 vpx_memcpy(t_left, bsi->rdstat[i][mode_idx].tl, sizeof(t_left)); |
| 2007 | 1989 |
| 2008 labels2mode(x, i, mode_selected, &mode_mv[mode_selected], | 1990 labels2mode(x, i, mode_selected, &mode_mv[mode_selected], |
| 2009 &second_mode_mv[mode_selected], frame_mv, seg_mvs[i], | 1991 &second_mode_mv[mode_selected], frame_mv, seg_mvs[i], |
| 2010 bsi->ref_mv, bsi->second_ref_mv, x->nmvjointcost, | 1992 bsi->ref_mv, bsi->second_ref_mv, x->nmvjointcost, |
| 2011 x->mvcost, cpi); | 1993 x->mvcost, cpi); |
| 2012 | 1994 |
| 2013 br += bsi->rdstat[i][mode_idx].brate; | 1995 br += bsi->rdstat[i][mode_idx].brate; |
| 2014 bd += bsi->rdstat[i][mode_idx].bdist; | 1996 bd += bsi->rdstat[i][mode_idx].bdist; |
| (...skipping 55 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2070 for (i = 0; i < 4; i++) | 2052 for (i = 0; i < 4; i++) |
| 2071 bsi->modes[i] = ZEROMV; | 2053 bsi->modes[i] = ZEROMV; |
| 2072 | 2054 |
| 2073 rd_check_segment_txsize(cpi, x, tile, bsi_buf, filter_idx, seg_mvs, | 2055 rd_check_segment_txsize(cpi, x, tile, bsi_buf, filter_idx, seg_mvs, |
| 2074 mi_row, mi_col); | 2056 mi_row, mi_col); |
| 2075 | 2057 |
| 2076 if (bsi->segment_rd > best_rd) | 2058 if (bsi->segment_rd > best_rd) |
| 2077 return INT64_MAX; | 2059 return INT64_MAX; |
| 2078 /* set it to the best */ | 2060 /* set it to the best */ |
| 2079 for (i = 0; i < 4; i++) { | 2061 for (i = 0; i < 4; i++) { |
| 2080 mode_idx = inter_mode_offset(bsi->modes[i]); | 2062 mode_idx = INTER_OFFSET(bsi->modes[i]); |
| 2081 mi->bmi[i].as_mv[0].as_int = bsi->rdstat[i][mode_idx].mvs[0].as_int; | 2063 mi->bmi[i].as_mv[0].as_int = bsi->rdstat[i][mode_idx].mvs[0].as_int; |
| 2082 if (has_second_ref(mbmi)) | 2064 if (has_second_ref(mbmi)) |
| 2083 mi->bmi[i].as_mv[1].as_int = bsi->rdstat[i][mode_idx].mvs[1].as_int; | 2065 mi->bmi[i].as_mv[1].as_int = bsi->rdstat[i][mode_idx].mvs[1].as_int; |
| 2084 xd->plane[0].eobs[i] = bsi->rdstat[i][mode_idx].eobs; | 2066 x->plane[0].eobs[i] = bsi->rdstat[i][mode_idx].eobs; |
| 2085 mi->bmi[i].as_mode = bsi->modes[i]; | 2067 mi->bmi[i].as_mode = bsi->modes[i]; |
| 2086 } | 2068 } |
| 2087 | 2069 |
| 2088 /* | 2070 /* |
| 2089 * used to set mbmi->mv.as_int | 2071 * used to set mbmi->mv.as_int |
| 2090 */ | 2072 */ |
| 2091 *returntotrate = bsi->r; | 2073 *returntotrate = bsi->r; |
| 2092 *returndistortion = bsi->d; | 2074 *returndistortion = bsi->d; |
| 2093 *returnyrate = bsi->segment_yrate; | 2075 *returnyrate = bsi->segment_yrate; |
| 2094 *skippable = vp9_is_skippable_in_plane(&x->e_mbd, BLOCK_8X8, 0); | 2076 *skippable = vp9_is_skippable_in_plane(x, BLOCK_8X8, 0); |
| 2095 *psse = bsi->sse; | 2077 *psse = bsi->sse; |
| 2096 mbmi->mode = bsi->modes[3]; | 2078 mbmi->mode = bsi->modes[3]; |
| 2097 | 2079 |
| 2098 return bsi->segment_rd; | 2080 return bsi->segment_rd; |
| 2099 } | 2081 } |
| 2100 | 2082 |
| 2101 static void mv_pred(VP9_COMP *cpi, MACROBLOCK *x, | 2083 static void mv_pred(VP9_COMP *cpi, MACROBLOCK *x, |
| 2102 uint8_t *ref_y_buffer, int ref_y_stride, | 2084 uint8_t *ref_y_buffer, int ref_y_stride, |
| 2103 int ref_frame, BLOCK_SIZE block_size ) { | 2085 int ref_frame, BLOCK_SIZE block_size ) { |
| 2104 MACROBLOCKD *xd = &x->e_mbd; | 2086 MACROBLOCKD *xd = &x->e_mbd; |
| 2105 MB_MODE_INFO *mbmi = &xd->mi_8x8[0]->mbmi; | 2087 MB_MODE_INFO *mbmi = &xd->mi_8x8[0]->mbmi; |
| 2106 int_mv this_mv; | 2088 int_mv this_mv; |
| 2107 int i; | 2089 int i; |
| 2108 int zero_seen = 0; | 2090 int zero_seen = 0; |
| 2109 int best_index = 0; | 2091 int best_index = 0; |
| 2110 int best_sad = INT_MAX; | 2092 int best_sad = INT_MAX; |
| 2111 int this_sad = INT_MAX; | 2093 int this_sad = INT_MAX; |
| 2112 unsigned int max_mv = 0; | 2094 int max_mv = 0; |
| 2113 | 2095 |
| 2114 uint8_t *src_y_ptr = x->plane[0].src.buf; | 2096 uint8_t *src_y_ptr = x->plane[0].src.buf; |
| 2115 uint8_t *ref_y_ptr; | 2097 uint8_t *ref_y_ptr; |
| 2116 int row_offset, col_offset; | 2098 int row_offset, col_offset; |
| 2117 int num_mv_refs = MAX_MV_REF_CANDIDATES + | 2099 int num_mv_refs = MAX_MV_REF_CANDIDATES + |
| 2118 (cpi->sf.adaptive_motion_search && | 2100 (cpi->sf.adaptive_motion_search && |
| 2119 cpi->common.show_frame && | 2101 cpi->common.show_frame && |
| 2120 block_size < cpi->sf.max_partition_size); | 2102 block_size < cpi->sf.max_partition_size); |
| 2121 | 2103 |
| 2122 // Get the sad for each candidate reference mv | 2104 // Get the sad for each candidate reference mv |
| (...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2158 vp9_prob *comp_mode_p) { | 2140 vp9_prob *comp_mode_p) { |
| 2159 VP9_COMMON *const cm = &cpi->common; | 2141 VP9_COMMON *const cm = &cpi->common; |
| 2160 MACROBLOCKD *const xd = &cpi->mb.e_mbd; | 2142 MACROBLOCKD *const xd = &cpi->mb.e_mbd; |
| 2161 int seg_ref_active = vp9_segfeature_active(&cm->seg, segment_id, | 2143 int seg_ref_active = vp9_segfeature_active(&cm->seg, segment_id, |
| 2162 SEG_LVL_REF_FRAME); | 2144 SEG_LVL_REF_FRAME); |
| 2163 if (seg_ref_active) { | 2145 if (seg_ref_active) { |
| 2164 vpx_memset(ref_costs_single, 0, MAX_REF_FRAMES * sizeof(*ref_costs_single)); | 2146 vpx_memset(ref_costs_single, 0, MAX_REF_FRAMES * sizeof(*ref_costs_single)); |
| 2165 vpx_memset(ref_costs_comp, 0, MAX_REF_FRAMES * sizeof(*ref_costs_comp)); | 2147 vpx_memset(ref_costs_comp, 0, MAX_REF_FRAMES * sizeof(*ref_costs_comp)); |
| 2166 *comp_mode_p = 128; | 2148 *comp_mode_p = 128; |
| 2167 } else { | 2149 } else { |
| 2168 vp9_prob intra_inter_p = vp9_get_pred_prob_intra_inter(cm, xd); | 2150 vp9_prob intra_inter_p = vp9_get_intra_inter_prob(cm, xd); |
| 2169 vp9_prob comp_inter_p = 128; | 2151 vp9_prob comp_inter_p = 128; |
| 2170 | 2152 |
| 2171 if (cm->comp_pred_mode == HYBRID_PREDICTION) { | 2153 if (cm->reference_mode == REFERENCE_MODE_SELECT) { |
| 2172 comp_inter_p = vp9_get_pred_prob_comp_inter_inter(cm, xd); | 2154 comp_inter_p = vp9_get_reference_mode_prob(cm, xd); |
| 2173 *comp_mode_p = comp_inter_p; | 2155 *comp_mode_p = comp_inter_p; |
| 2174 } else { | 2156 } else { |
| 2175 *comp_mode_p = 128; | 2157 *comp_mode_p = 128; |
| 2176 } | 2158 } |
| 2177 | 2159 |
| 2178 ref_costs_single[INTRA_FRAME] = vp9_cost_bit(intra_inter_p, 0); | 2160 ref_costs_single[INTRA_FRAME] = vp9_cost_bit(intra_inter_p, 0); |
| 2179 | 2161 |
| 2180 if (cm->comp_pred_mode != COMP_PREDICTION_ONLY) { | 2162 if (cm->reference_mode != COMPOUND_REFERENCE) { |
| 2181 vp9_prob ref_single_p1 = vp9_get_pred_prob_single_ref_p1(cm, xd); | 2163 vp9_prob ref_single_p1 = vp9_get_pred_prob_single_ref_p1(cm, xd); |
| 2182 vp9_prob ref_single_p2 = vp9_get_pred_prob_single_ref_p2(cm, xd); | 2164 vp9_prob ref_single_p2 = vp9_get_pred_prob_single_ref_p2(cm, xd); |
| 2183 unsigned int base_cost = vp9_cost_bit(intra_inter_p, 1); | 2165 unsigned int base_cost = vp9_cost_bit(intra_inter_p, 1); |
| 2184 | 2166 |
| 2185 if (cm->comp_pred_mode == HYBRID_PREDICTION) | 2167 if (cm->reference_mode == REFERENCE_MODE_SELECT) |
| 2186 base_cost += vp9_cost_bit(comp_inter_p, 0); | 2168 base_cost += vp9_cost_bit(comp_inter_p, 0); |
| 2187 | 2169 |
| 2188 ref_costs_single[LAST_FRAME] = ref_costs_single[GOLDEN_FRAME] = | 2170 ref_costs_single[LAST_FRAME] = ref_costs_single[GOLDEN_FRAME] = |
| 2189 ref_costs_single[ALTREF_FRAME] = base_cost; | 2171 ref_costs_single[ALTREF_FRAME] = base_cost; |
| 2190 ref_costs_single[LAST_FRAME] += vp9_cost_bit(ref_single_p1, 0); | 2172 ref_costs_single[LAST_FRAME] += vp9_cost_bit(ref_single_p1, 0); |
| 2191 ref_costs_single[GOLDEN_FRAME] += vp9_cost_bit(ref_single_p1, 1); | 2173 ref_costs_single[GOLDEN_FRAME] += vp9_cost_bit(ref_single_p1, 1); |
| 2192 ref_costs_single[ALTREF_FRAME] += vp9_cost_bit(ref_single_p1, 1); | 2174 ref_costs_single[ALTREF_FRAME] += vp9_cost_bit(ref_single_p1, 1); |
| 2193 ref_costs_single[GOLDEN_FRAME] += vp9_cost_bit(ref_single_p2, 0); | 2175 ref_costs_single[GOLDEN_FRAME] += vp9_cost_bit(ref_single_p2, 0); |
| 2194 ref_costs_single[ALTREF_FRAME] += vp9_cost_bit(ref_single_p2, 1); | 2176 ref_costs_single[ALTREF_FRAME] += vp9_cost_bit(ref_single_p2, 1); |
| 2195 } else { | 2177 } else { |
| 2196 ref_costs_single[LAST_FRAME] = 512; | 2178 ref_costs_single[LAST_FRAME] = 512; |
| 2197 ref_costs_single[GOLDEN_FRAME] = 512; | 2179 ref_costs_single[GOLDEN_FRAME] = 512; |
| 2198 ref_costs_single[ALTREF_FRAME] = 512; | 2180 ref_costs_single[ALTREF_FRAME] = 512; |
| 2199 } | 2181 } |
| 2200 if (cm->comp_pred_mode != SINGLE_PREDICTION_ONLY) { | 2182 if (cm->reference_mode != SINGLE_REFERENCE) { |
| 2201 vp9_prob ref_comp_p = vp9_get_pred_prob_comp_ref_p(cm, xd); | 2183 vp9_prob ref_comp_p = vp9_get_pred_prob_comp_ref_p(cm, xd); |
| 2202 unsigned int base_cost = vp9_cost_bit(intra_inter_p, 1); | 2184 unsigned int base_cost = vp9_cost_bit(intra_inter_p, 1); |
| 2203 | 2185 |
| 2204 if (cm->comp_pred_mode == HYBRID_PREDICTION) | 2186 if (cm->reference_mode == REFERENCE_MODE_SELECT) |
| 2205 base_cost += vp9_cost_bit(comp_inter_p, 1); | 2187 base_cost += vp9_cost_bit(comp_inter_p, 1); |
| 2206 | 2188 |
| 2207 ref_costs_comp[LAST_FRAME] = base_cost + vp9_cost_bit(ref_comp_p, 0); | 2189 ref_costs_comp[LAST_FRAME] = base_cost + vp9_cost_bit(ref_comp_p, 0); |
| 2208 ref_costs_comp[GOLDEN_FRAME] = base_cost + vp9_cost_bit(ref_comp_p, 1); | 2190 ref_costs_comp[GOLDEN_FRAME] = base_cost + vp9_cost_bit(ref_comp_p, 1); |
| 2209 } else { | 2191 } else { |
| 2210 ref_costs_comp[LAST_FRAME] = 512; | 2192 ref_costs_comp[LAST_FRAME] = 512; |
| 2211 ref_costs_comp[GOLDEN_FRAME] = 512; | 2193 ref_costs_comp[GOLDEN_FRAME] = 512; |
| 2212 } | 2194 } |
| 2213 } | 2195 } |
| 2214 } | 2196 } |
| 2215 | 2197 |
| 2216 static void store_coding_context(MACROBLOCK *x, PICK_MODE_CONTEXT *ctx, | 2198 static void store_coding_context(MACROBLOCK *x, PICK_MODE_CONTEXT *ctx, |
| 2217 int mode_index, | 2199 int mode_index, |
| 2218 int_mv *ref_mv, | 2200 int_mv *ref_mv, |
| 2219 int_mv *second_ref_mv, | 2201 int_mv *second_ref_mv, |
| 2220 int64_t comp_pred_diff[NB_PREDICTION_TYPES], | 2202 int64_t comp_pred_diff[REFERENCE_MODES], |
| 2221 int64_t tx_size_diff[TX_MODES], | 2203 int64_t tx_size_diff[TX_MODES], |
| 2222 int64_t best_filter_diff[SWITCHABLE_FILTER_CONTEXTS]) { | 2204 int64_t best_filter_diff[SWITCHABLE_FILTER_CONTEXTS]) { |
| 2223 MACROBLOCKD *const xd = &x->e_mbd; | 2205 MACROBLOCKD *const xd = &x->e_mbd; |
| 2224 | 2206 |
| 2225 // Take a snapshot of the coding context so it can be | 2207 // Take a snapshot of the coding context so it can be |
| 2226 // restored if we decide to encode this way | 2208 // restored if we decide to encode this way |
| 2227 ctx->skip = x->skip; | 2209 ctx->skip = x->skip; |
| 2228 ctx->best_mode_index = mode_index; | 2210 ctx->best_mode_index = mode_index; |
| 2229 ctx->mic = *xd->mi_8x8[0]; | 2211 ctx->mic = *xd->mi_8x8[0]; |
| 2230 | 2212 |
| 2231 ctx->best_ref_mv.as_int = ref_mv->as_int; | 2213 ctx->best_ref_mv.as_int = ref_mv->as_int; |
| 2232 ctx->second_best_ref_mv.as_int = second_ref_mv->as_int; | 2214 ctx->second_best_ref_mv.as_int = second_ref_mv->as_int; |
| 2233 | 2215 |
| 2234 ctx->single_pred_diff = (int)comp_pred_diff[SINGLE_PREDICTION_ONLY]; | 2216 ctx->single_pred_diff = (int)comp_pred_diff[SINGLE_REFERENCE]; |
| 2235 ctx->comp_pred_diff = (int)comp_pred_diff[COMP_PREDICTION_ONLY]; | 2217 ctx->comp_pred_diff = (int)comp_pred_diff[COMPOUND_REFERENCE]; |
| 2236 ctx->hybrid_pred_diff = (int)comp_pred_diff[HYBRID_PREDICTION]; | 2218 ctx->hybrid_pred_diff = (int)comp_pred_diff[REFERENCE_MODE_SELECT]; |
| 2237 | 2219 |
| 2238 vpx_memcpy(ctx->tx_rd_diff, tx_size_diff, sizeof(ctx->tx_rd_diff)); | 2220 vpx_memcpy(ctx->tx_rd_diff, tx_size_diff, sizeof(ctx->tx_rd_diff)); |
| 2239 vpx_memcpy(ctx->best_filter_diff, best_filter_diff, | 2221 vpx_memcpy(ctx->best_filter_diff, best_filter_diff, |
| 2240 sizeof(*best_filter_diff) * SWITCHABLE_FILTER_CONTEXTS); | 2222 sizeof(*best_filter_diff) * SWITCHABLE_FILTER_CONTEXTS); |
| 2241 } | 2223 } |
| 2242 | 2224 |
| 2243 static void setup_pred_block(const MACROBLOCKD *xd, | 2225 static void setup_pred_block(const MACROBLOCKD *xd, |
| 2244 struct buf_2d dst[MAX_MB_PLANE], | 2226 struct buf_2d dst[MAX_MB_PLANE], |
| 2245 const YV12_BUFFER_CONFIG *src, | 2227 const YV12_BUFFER_CONFIG *src, |
| 2246 int mi_row, int mi_col, | 2228 int mi_row, int mi_col, |
| (...skipping 89 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2336 MACROBLOCKD *xd = &x->e_mbd; | 2318 MACROBLOCKD *xd = &x->e_mbd; |
| 2337 VP9_COMMON *cm = &cpi->common; | 2319 VP9_COMMON *cm = &cpi->common; |
| 2338 MB_MODE_INFO *mbmi = &xd->mi_8x8[0]->mbmi; | 2320 MB_MODE_INFO *mbmi = &xd->mi_8x8[0]->mbmi; |
| 2339 struct buf_2d backup_yv12[MAX_MB_PLANE] = {{0}}; | 2321 struct buf_2d backup_yv12[MAX_MB_PLANE] = {{0}}; |
| 2340 int bestsme = INT_MAX; | 2322 int bestsme = INT_MAX; |
| 2341 int further_steps, step_param; | 2323 int further_steps, step_param; |
| 2342 int sadpb = x->sadperbit16; | 2324 int sadpb = x->sadperbit16; |
| 2343 int_mv mvp_full; | 2325 int_mv mvp_full; |
| 2344 int ref = mbmi->ref_frame[0]; | 2326 int ref = mbmi->ref_frame[0]; |
| 2345 int_mv ref_mv = mbmi->ref_mvs[ref][0]; | 2327 int_mv ref_mv = mbmi->ref_mvs[ref][0]; |
| 2346 const BLOCK_SIZE block_size = get_plane_block_size(bsize, &xd->plane[0]); | |
| 2347 | 2328 |
| 2348 int tmp_col_min = x->mv_col_min; | 2329 int tmp_col_min = x->mv_col_min; |
| 2349 int tmp_col_max = x->mv_col_max; | 2330 int tmp_col_max = x->mv_col_max; |
| 2350 int tmp_row_min = x->mv_row_min; | 2331 int tmp_row_min = x->mv_row_min; |
| 2351 int tmp_row_max = x->mv_row_max; | 2332 int tmp_row_max = x->mv_row_max; |
| 2352 | 2333 |
| 2353 YV12_BUFFER_CONFIG *scaled_ref_frame = get_scaled_ref_frame(cpi, ref); | 2334 YV12_BUFFER_CONFIG *scaled_ref_frame = get_scaled_ref_frame(cpi, ref); |
| 2354 | 2335 |
| 2355 if (scaled_ref_frame) { | 2336 if (scaled_ref_frame) { |
| 2356 int i; | 2337 int i; |
| 2357 // Swap out the reference frame for a version that's been scaled to | 2338 // Swap out the reference frame for a version that's been scaled to |
| 2358 // match the resolution of the current frame, allowing the existing | 2339 // match the resolution of the current frame, allowing the existing |
| 2359 // motion search code to be used without additional modifications. | 2340 // motion search code to be used without additional modifications. |
| 2360 for (i = 0; i < MAX_MB_PLANE; i++) | 2341 for (i = 0; i < MAX_MB_PLANE; i++) |
| 2361 backup_yv12[i] = xd->plane[i].pre[0]; | 2342 backup_yv12[i] = xd->plane[i].pre[0]; |
| 2362 | 2343 |
| 2363 setup_pre_planes(xd, 0, scaled_ref_frame, mi_row, mi_col, NULL); | 2344 setup_pre_planes(xd, 0, scaled_ref_frame, mi_row, mi_col, NULL); |
| 2364 } | 2345 } |
| 2365 | 2346 |
| 2366 vp9_clamp_mv_min_max(x, &ref_mv.as_mv); | 2347 vp9_set_mv_search_range(x, &ref_mv.as_mv); |
| 2367 | 2348 |
| 2368 // Adjust search parameters based on small partitions' result. | 2349 // Adjust search parameters based on small partitions' result. |
| 2369 if (x->fast_ms) { | 2350 if (x->fast_ms) { |
| 2370 // && abs(mvp_full.as_mv.row - x->pred_mv.as_mv.row) < 24 && | 2351 // && abs(mvp_full.as_mv.row - x->pred_mv.as_mv.row) < 24 && |
| 2371 // abs(mvp_full.as_mv.col - x->pred_mv.as_mv.col) < 24) { | 2352 // abs(mvp_full.as_mv.col - x->pred_mv.as_mv.col) < 24) { |
| 2372 // adjust search range | 2353 // adjust search range |
| 2373 step_param = 6; | 2354 step_param = 6; |
| 2374 if (x->fast_ms > 1) | 2355 if (x->fast_ms > 1) |
| 2375 step_param = 8; | 2356 step_param = 8; |
| 2376 | 2357 |
| (...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2410 mvp_full.as_mv.col >>= 3; | 2391 mvp_full.as_mv.col >>= 3; |
| 2411 mvp_full.as_mv.row >>= 3; | 2392 mvp_full.as_mv.row >>= 3; |
| 2412 | 2393 |
| 2413 // Further step/diamond searches as necessary | 2394 // Further step/diamond searches as necessary |
| 2414 further_steps = (cpi->sf.max_step_search_steps - 1) - step_param; | 2395 further_steps = (cpi->sf.max_step_search_steps - 1) - step_param; |
| 2415 | 2396 |
| 2416 if (cpi->sf.search_method == HEX) { | 2397 if (cpi->sf.search_method == HEX) { |
| 2417 bestsme = vp9_hex_search(x, &mvp_full.as_mv, | 2398 bestsme = vp9_hex_search(x, &mvp_full.as_mv, |
| 2418 step_param, | 2399 step_param, |
| 2419 sadpb, 1, | 2400 sadpb, 1, |
| 2420 &cpi->fn_ptr[block_size], 1, | 2401 &cpi->fn_ptr[bsize], 1, |
| 2421 &ref_mv.as_mv, &tmp_mv->as_mv); | 2402 &ref_mv.as_mv, &tmp_mv->as_mv); |
| 2422 } else if (cpi->sf.search_method == SQUARE) { | 2403 } else if (cpi->sf.search_method == SQUARE) { |
| 2423 bestsme = vp9_square_search(x, &mvp_full.as_mv, | 2404 bestsme = vp9_square_search(x, &mvp_full.as_mv, |
| 2424 step_param, | 2405 step_param, |
| 2425 sadpb, 1, | 2406 sadpb, 1, |
| 2426 &cpi->fn_ptr[block_size], 1, | 2407 &cpi->fn_ptr[bsize], 1, |
| 2427 &ref_mv.as_mv, &tmp_mv->as_mv); | 2408 &ref_mv.as_mv, &tmp_mv->as_mv); |
| 2428 } else if (cpi->sf.search_method == BIGDIA) { | 2409 } else if (cpi->sf.search_method == BIGDIA) { |
| 2429 bestsme = vp9_bigdia_search(x, &mvp_full.as_mv, | 2410 bestsme = vp9_bigdia_search(x, &mvp_full.as_mv, |
| 2430 step_param, | 2411 step_param, |
| 2431 sadpb, 1, | 2412 sadpb, 1, |
| 2432 &cpi->fn_ptr[block_size], 1, | 2413 &cpi->fn_ptr[bsize], 1, |
| 2433 &ref_mv.as_mv, &tmp_mv->as_mv); | 2414 &ref_mv.as_mv, &tmp_mv->as_mv); |
| 2434 } else { | 2415 } else { |
| 2435 bestsme = vp9_full_pixel_diamond(cpi, x, &mvp_full, step_param, | 2416 bestsme = vp9_full_pixel_diamond(cpi, x, &mvp_full, step_param, |
| 2436 sadpb, further_steps, 1, | 2417 sadpb, further_steps, 1, |
| 2437 &cpi->fn_ptr[block_size], | 2418 &cpi->fn_ptr[bsize], |
| 2438 &ref_mv, tmp_mv); | 2419 &ref_mv, tmp_mv); |
| 2439 } | 2420 } |
| 2440 | 2421 |
| 2441 x->mv_col_min = tmp_col_min; | 2422 x->mv_col_min = tmp_col_min; |
| 2442 x->mv_col_max = tmp_col_max; | 2423 x->mv_col_max = tmp_col_max; |
| 2443 x->mv_row_min = tmp_row_min; | 2424 x->mv_row_min = tmp_row_min; |
| 2444 x->mv_row_max = tmp_row_max; | 2425 x->mv_row_max = tmp_row_max; |
| 2445 | 2426 |
| 2446 if (bestsme < INT_MAX) { | 2427 if (bestsme < INT_MAX) { |
| 2447 int dis; /* TODO: use dis in distortion calculation later. */ | 2428 int dis; /* TODO: use dis in distortion calculation later. */ |
| 2448 unsigned int sse; | 2429 unsigned int sse; |
| 2449 cpi->find_fractional_mv_step(x, &tmp_mv->as_mv, &ref_mv.as_mv, | 2430 cpi->find_fractional_mv_step(x, &tmp_mv->as_mv, &ref_mv.as_mv, |
| 2450 cm->allow_high_precision_mv, | 2431 cm->allow_high_precision_mv, |
| 2451 x->errorperbit, | 2432 x->errorperbit, |
| 2452 &cpi->fn_ptr[block_size], | 2433 &cpi->fn_ptr[bsize], |
| 2453 0, cpi->sf.subpel_iters_per_step, | 2434 0, cpi->sf.subpel_iters_per_step, |
| 2454 x->nmvjointcost, x->mvcost, | 2435 x->nmvjointcost, x->mvcost, |
| 2455 &dis, &sse); | 2436 &dis, &sse); |
| 2456 } | 2437 } |
| 2457 *rate_mv = vp9_mv_bit_cost(&tmp_mv->as_mv, &ref_mv.as_mv, | 2438 *rate_mv = vp9_mv_bit_cost(&tmp_mv->as_mv, &ref_mv.as_mv, |
| 2458 x->nmvjointcost, x->mvcost, MV_COST_WEIGHT); | 2439 x->nmvjointcost, x->mvcost, MV_COST_WEIGHT); |
| 2459 | 2440 |
| 2460 if (cpi->sf.adaptive_motion_search && cpi->common.show_frame) | 2441 if (cpi->sf.adaptive_motion_search && cpi->common.show_frame) |
| 2461 x->pred_mv[ref].as_int = tmp_mv->as_int; | 2442 x->pred_mv[ref].as_int = tmp_mv->as_int; |
| 2462 | 2443 |
| 2463 if (scaled_ref_frame) { | 2444 if (scaled_ref_frame) { |
| 2464 int i; | 2445 int i; |
| 2465 for (i = 0; i < MAX_MB_PLANE; i++) | 2446 for (i = 0; i < MAX_MB_PLANE; i++) |
| 2466 xd->plane[i].pre[0] = backup_yv12[i]; | 2447 xd->plane[i].pre[0] = backup_yv12[i]; |
| 2467 } | 2448 } |
| 2468 } | 2449 } |
| 2469 | 2450 |
| 2470 static void joint_motion_search(VP9_COMP *cpi, MACROBLOCK *x, | 2451 static void joint_motion_search(VP9_COMP *cpi, MACROBLOCK *x, |
| 2471 BLOCK_SIZE bsize, | 2452 BLOCK_SIZE bsize, |
| 2472 int_mv *frame_mv, | 2453 int_mv *frame_mv, |
| 2473 int mi_row, int mi_col, | 2454 int mi_row, int mi_col, |
| 2474 int_mv single_newmv[MAX_REF_FRAMES], | 2455 int_mv single_newmv[MAX_REF_FRAMES], |
| 2475 int *rate_mv) { | 2456 int *rate_mv) { |
| 2476 int pw = 4 << b_width_log2(bsize), ph = 4 << b_height_log2(bsize); | 2457 const int pw = 4 * num_4x4_blocks_wide_lookup[bsize]; |
| 2458 const int ph = 4 * num_4x4_blocks_high_lookup[bsize]; |
| 2477 MACROBLOCKD *xd = &x->e_mbd; | 2459 MACROBLOCKD *xd = &x->e_mbd; |
| 2478 MB_MODE_INFO *mbmi = &xd->mi_8x8[0]->mbmi; | 2460 MB_MODE_INFO *mbmi = &xd->mi_8x8[0]->mbmi; |
| 2479 int refs[2] = { mbmi->ref_frame[0], | 2461 const int refs[2] = { mbmi->ref_frame[0], |
| 2480 (mbmi->ref_frame[1] < 0 ? 0 : mbmi->ref_frame[1]) }; | 2462 mbmi->ref_frame[1] < 0 ? 0 : mbmi->ref_frame[1] }; |
| 2481 int_mv ref_mv[2]; | 2463 int_mv ref_mv[2]; |
| 2482 const BLOCK_SIZE block_size = get_plane_block_size(bsize, &xd->plane[0]); | 2464 int ite, ref; |
| 2483 int ite; | |
| 2484 // Prediction buffer from second frame. | 2465 // Prediction buffer from second frame. |
| 2485 uint8_t *second_pred = vpx_memalign(16, pw * ph * sizeof(uint8_t)); | 2466 uint8_t *second_pred = vpx_memalign(16, pw * ph * sizeof(uint8_t)); |
| 2486 | 2467 |
| 2487 // Do joint motion search in compound mode to get more accurate mv. | 2468 // Do joint motion search in compound mode to get more accurate mv. |
| 2488 struct buf_2d backup_yv12[MAX_MB_PLANE] = {{0}}; | 2469 struct buf_2d backup_yv12[2][MAX_MB_PLANE]; |
| 2489 struct buf_2d backup_second_yv12[MAX_MB_PLANE] = {{0}}; | 2470 struct buf_2d scaled_first_yv12 = xd->plane[0].pre[0]; |
| 2490 struct buf_2d scaled_first_yv12; | |
| 2491 int last_besterr[2] = {INT_MAX, INT_MAX}; | 2471 int last_besterr[2] = {INT_MAX, INT_MAX}; |
| 2492 YV12_BUFFER_CONFIG *scaled_ref_frame[2] = {NULL, NULL}; | 2472 YV12_BUFFER_CONFIG *const scaled_ref_frame[2] = { |
| 2493 scaled_ref_frame[0] = get_scaled_ref_frame(cpi, mbmi->ref_frame[0]); | 2473 get_scaled_ref_frame(cpi, mbmi->ref_frame[0]), |
| 2494 scaled_ref_frame[1] = get_scaled_ref_frame(cpi, mbmi->ref_frame[1]); | 2474 get_scaled_ref_frame(cpi, mbmi->ref_frame[1]) |
| 2475 }; |
| 2495 | 2476 |
| 2496 ref_mv[0] = mbmi->ref_mvs[refs[0]][0]; | 2477 for (ref = 0; ref < 2; ++ref) { |
| 2497 ref_mv[1] = mbmi->ref_mvs[refs[1]][0]; | 2478 ref_mv[ref] = mbmi->ref_mvs[refs[ref]][0]; |
| 2498 | 2479 |
| 2499 if (scaled_ref_frame[0]) { | 2480 if (scaled_ref_frame[ref]) { |
| 2500 int i; | 2481 int i; |
| 2501 // Swap out the reference frame for a version that's been scaled to | 2482 // Swap out the reference frame for a version that's been scaled to |
| 2502 // match the resolution of the current frame, allowing the existing | 2483 // match the resolution of the current frame, allowing the existing |
| 2503 // motion search code to be used without additional modifications. | 2484 // motion search code to be used without additional modifications. |
| 2504 for (i = 0; i < MAX_MB_PLANE; i++) | 2485 for (i = 0; i < MAX_MB_PLANE; i++) |
| 2505 backup_yv12[i] = xd->plane[i].pre[0]; | 2486 backup_yv12[ref][i] = xd->plane[i].pre[ref]; |
| 2506 setup_pre_planes(xd, 0, scaled_ref_frame[0], mi_row, mi_col, NULL); | 2487 setup_pre_planes(xd, ref, scaled_ref_frame[ref], mi_row, mi_col, NULL); |
| 2488 } |
| 2489 |
| 2490 xd->scale_factor[ref].sfc->set_scaled_offsets(&xd->scale_factor[ref], |
| 2491 mi_row, mi_col); |
| 2492 frame_mv[refs[ref]].as_int = single_newmv[refs[ref]].as_int; |
| 2507 } | 2493 } |
| 2508 | 2494 |
| 2509 if (scaled_ref_frame[1]) { | |
| 2510 int i; | |
| 2511 for (i = 0; i < MAX_MB_PLANE; i++) | |
| 2512 backup_second_yv12[i] = xd->plane[i].pre[1]; | |
| 2513 | |
| 2514 setup_pre_planes(xd, 1, scaled_ref_frame[1], mi_row, mi_col, NULL); | |
| 2515 } | |
| 2516 | |
| 2517 xd->scale_factor[0].sfc->set_scaled_offsets(&xd->scale_factor[0], | |
| 2518 mi_row, mi_col); | |
| 2519 xd->scale_factor[1].sfc->set_scaled_offsets(&xd->scale_factor[1], | |
| 2520 mi_row, mi_col); | |
| 2521 scaled_first_yv12 = xd->plane[0].pre[0]; | |
| 2522 | |
| 2523 // Initialize mv using single prediction mode result. | |
| 2524 frame_mv[refs[0]].as_int = single_newmv[refs[0]].as_int; | |
| 2525 frame_mv[refs[1]].as_int = single_newmv[refs[1]].as_int; | |
| 2526 | |
| 2527 // Allow joint search multiple times iteratively for each ref frame | 2495 // Allow joint search multiple times iteratively for each ref frame |
| 2528 // and break out the search loop if it couldn't find better mv. | 2496 // and break out the search loop if it couldn't find better mv. |
| 2529 for (ite = 0; ite < 4; ite++) { | 2497 for (ite = 0; ite < 4; ite++) { |
| 2530 struct buf_2d ref_yv12[2]; | 2498 struct buf_2d ref_yv12[2]; |
| 2531 int bestsme = INT_MAX; | 2499 int bestsme = INT_MAX; |
| 2532 int sadpb = x->sadperbit16; | 2500 int sadpb = x->sadperbit16; |
| 2533 int_mv tmp_mv; | 2501 int_mv tmp_mv; |
| 2534 int search_range = 3; | 2502 int search_range = 3; |
| 2535 | 2503 |
| 2536 int tmp_col_min = x->mv_col_min; | 2504 int tmp_col_min = x->mv_col_min; |
| (...skipping 11 matching lines...) Expand all Loading... |
| 2548 ref_yv12[!id].stride, | 2516 ref_yv12[!id].stride, |
| 2549 second_pred, pw, | 2517 second_pred, pw, |
| 2550 &frame_mv[refs[!id]].as_mv, | 2518 &frame_mv[refs[!id]].as_mv, |
| 2551 &xd->scale_factor[!id], | 2519 &xd->scale_factor[!id], |
| 2552 pw, ph, 0, | 2520 pw, ph, 0, |
| 2553 &xd->subpix, MV_PRECISION_Q3); | 2521 &xd->subpix, MV_PRECISION_Q3); |
| 2554 | 2522 |
| 2555 // Compound motion search on first ref frame. | 2523 // Compound motion search on first ref frame. |
| 2556 if (id) | 2524 if (id) |
| 2557 xd->plane[0].pre[0] = ref_yv12[id]; | 2525 xd->plane[0].pre[0] = ref_yv12[id]; |
| 2558 vp9_clamp_mv_min_max(x, &ref_mv[id].as_mv); | 2526 vp9_set_mv_search_range(x, &ref_mv[id].as_mv); |
| 2559 | 2527 |
| 2560 // Use mv result from single mode as mvp. | 2528 // Use mv result from single mode as mvp. |
| 2561 tmp_mv.as_int = frame_mv[refs[id]].as_int; | 2529 tmp_mv.as_int = frame_mv[refs[id]].as_int; |
| 2562 | 2530 |
| 2563 tmp_mv.as_mv.col >>= 3; | 2531 tmp_mv.as_mv.col >>= 3; |
| 2564 tmp_mv.as_mv.row >>= 3; | 2532 tmp_mv.as_mv.row >>= 3; |
| 2565 | 2533 |
| 2566 // Small-range full-pixel motion search | 2534 // Small-range full-pixel motion search |
| 2567 bestsme = vp9_refining_search_8p_c(x, &tmp_mv, sadpb, | 2535 bestsme = vp9_refining_search_8p_c(x, &tmp_mv, sadpb, |
| 2568 search_range, | 2536 search_range, |
| 2569 &cpi->fn_ptr[block_size], | 2537 &cpi->fn_ptr[bsize], |
| 2570 x->nmvjointcost, x->mvcost, | 2538 x->nmvjointcost, x->mvcost, |
| 2571 &ref_mv[id], second_pred, | 2539 &ref_mv[id], second_pred, |
| 2572 pw, ph); | 2540 pw, ph); |
| 2573 | 2541 |
| 2574 x->mv_col_min = tmp_col_min; | 2542 x->mv_col_min = tmp_col_min; |
| 2575 x->mv_col_max = tmp_col_max; | 2543 x->mv_col_max = tmp_col_max; |
| 2576 x->mv_row_min = tmp_row_min; | 2544 x->mv_row_min = tmp_row_min; |
| 2577 x->mv_row_max = tmp_row_max; | 2545 x->mv_row_max = tmp_row_max; |
| 2578 | 2546 |
| 2579 if (bestsme < INT_MAX) { | 2547 if (bestsme < INT_MAX) { |
| 2580 int dis; /* TODO: use dis in distortion calculation later. */ | 2548 int dis; /* TODO: use dis in distortion calculation later. */ |
| 2581 unsigned int sse; | 2549 unsigned int sse; |
| 2582 | 2550 |
| 2583 bestsme = cpi->find_fractional_mv_step_comp( | 2551 bestsme = cpi->find_fractional_mv_step_comp( |
| 2584 x, &tmp_mv.as_mv, | 2552 x, &tmp_mv.as_mv, |
| 2585 &ref_mv[id].as_mv, | 2553 &ref_mv[id].as_mv, |
| 2586 cpi->common.allow_high_precision_mv, | 2554 cpi->common.allow_high_precision_mv, |
| 2587 x->errorperbit, | 2555 x->errorperbit, |
| 2588 &cpi->fn_ptr[block_size], | 2556 &cpi->fn_ptr[bsize], |
| 2589 0, cpi->sf.subpel_iters_per_step, | 2557 0, cpi->sf.subpel_iters_per_step, |
| 2590 x->nmvjointcost, x->mvcost, | 2558 x->nmvjointcost, x->mvcost, |
| 2591 &dis, &sse, second_pred, | 2559 &dis, &sse, second_pred, |
| 2592 pw, ph); | 2560 pw, ph); |
| 2593 } | 2561 } |
| 2594 | 2562 |
| 2595 if (id) | 2563 if (id) |
| 2596 xd->plane[0].pre[0] = scaled_first_yv12; | 2564 xd->plane[0].pre[0] = scaled_first_yv12; |
| 2597 | 2565 |
| 2598 if (bestsme < last_besterr[id]) { | 2566 if (bestsme < last_besterr[id]) { |
| 2599 frame_mv[refs[id]].as_int = tmp_mv.as_int; | 2567 frame_mv[refs[id]].as_int = tmp_mv.as_int; |
| 2600 last_besterr[id] = bestsme; | 2568 last_besterr[id] = bestsme; |
| 2601 } else { | 2569 } else { |
| 2602 break; | 2570 break; |
| 2603 } | 2571 } |
| 2604 } | 2572 } |
| 2605 | 2573 |
| 2606 // restore the predictor | 2574 *rate_mv = 0; |
| 2607 if (scaled_ref_frame[0]) { | 2575 |
| 2608 int i; | 2576 for (ref = 0; ref < 2; ++ref) { |
| 2609 for (i = 0; i < MAX_MB_PLANE; i++) | 2577 if (scaled_ref_frame[ref]) { |
| 2610 xd->plane[i].pre[0] = backup_yv12[i]; | 2578 // restore the predictor |
| 2579 int i; |
| 2580 for (i = 0; i < MAX_MB_PLANE; i++) |
| 2581 xd->plane[i].pre[ref] = backup_yv12[ref][i]; |
| 2582 } |
| 2583 |
| 2584 *rate_mv += vp9_mv_bit_cost(&frame_mv[refs[ref]].as_mv, |
| 2585 &mbmi->ref_mvs[refs[ref]][0].as_mv, |
| 2586 x->nmvjointcost, x->mvcost, MV_COST_WEIGHT); |
| 2611 } | 2587 } |
| 2612 | 2588 |
| 2613 if (scaled_ref_frame[1]) { | 2589 vpx_free(second_pred); |
| 2614 int i; | 2590 } |
| 2615 for (i = 0; i < MAX_MB_PLANE; i++) | 2591 |
| 2616 xd->plane[i].pre[1] = backup_second_yv12[i]; | 2592 static INLINE void restore_dst_buf(MACROBLOCKD *xd, |
| 2593 uint8_t *orig_dst[MAX_MB_PLANE], |
| 2594 int orig_dst_stride[MAX_MB_PLANE]) { |
| 2595 int i; |
| 2596 for (i = 0; i < MAX_MB_PLANE; i++) { |
| 2597 xd->plane[i].dst.buf = orig_dst[i]; |
| 2598 xd->plane[i].dst.stride = orig_dst_stride[i]; |
| 2617 } | 2599 } |
| 2618 *rate_mv = vp9_mv_bit_cost(&frame_mv[refs[0]].as_mv, | |
| 2619 &mbmi->ref_mvs[refs[0]][0].as_mv, | |
| 2620 x->nmvjointcost, x->mvcost, MV_COST_WEIGHT); | |
| 2621 *rate_mv += vp9_mv_bit_cost(&frame_mv[refs[1]].as_mv, | |
| 2622 &mbmi->ref_mvs[refs[1]][0].as_mv, | |
| 2623 x->nmvjointcost, x->mvcost, MV_COST_WEIGHT); | |
| 2624 | |
| 2625 vpx_free(second_pred); | |
| 2626 } | 2600 } |
| 2627 | 2601 |
| 2628 static int64_t handle_inter_mode(VP9_COMP *cpi, MACROBLOCK *x, | 2602 static int64_t handle_inter_mode(VP9_COMP *cpi, MACROBLOCK *x, |
| 2629 const TileInfo *const tile, | 2603 const TileInfo *const tile, |
| 2630 BLOCK_SIZE bsize, | 2604 BLOCK_SIZE bsize, |
| 2631 int64_t txfm_cache[], | 2605 int64_t txfm_cache[], |
| 2632 int *rate2, int64_t *distortion, | 2606 int *rate2, int64_t *distortion, |
| 2633 int *skippable, | 2607 int *skippable, |
| 2634 int *rate_y, int64_t *distortion_y, | 2608 int *rate_y, int64_t *distortion_y, |
| 2635 int *rate_uv, int64_t *distortion_uv, | 2609 int *rate_uv, int64_t *distortion_uv, |
| (...skipping 18 matching lines...) Expand all Loading... |
| 2654 int64_t this_rd = 0; | 2628 int64_t this_rd = 0; |
| 2655 DECLARE_ALIGNED_ARRAY(16, uint8_t, tmp_buf, MAX_MB_PLANE * 64 * 64); | 2629 DECLARE_ALIGNED_ARRAY(16, uint8_t, tmp_buf, MAX_MB_PLANE * 64 * 64); |
| 2656 int pred_exists = 0; | 2630 int pred_exists = 0; |
| 2657 int intpel_mv; | 2631 int intpel_mv; |
| 2658 int64_t rd, best_rd = INT64_MAX; | 2632 int64_t rd, best_rd = INT64_MAX; |
| 2659 int best_needs_copy = 0; | 2633 int best_needs_copy = 0; |
| 2660 uint8_t *orig_dst[MAX_MB_PLANE]; | 2634 uint8_t *orig_dst[MAX_MB_PLANE]; |
| 2661 int orig_dst_stride[MAX_MB_PLANE]; | 2635 int orig_dst_stride[MAX_MB_PLANE]; |
| 2662 int rs = 0; | 2636 int rs = 0; |
| 2663 | 2637 |
| 2638 if (is_comp_pred) { |
| 2639 if (frame_mv[refs[0]].as_int == INVALID_MV || |
| 2640 frame_mv[refs[1]].as_int == INVALID_MV) |
| 2641 return INT64_MAX; |
| 2642 } |
| 2643 |
| 2664 if (this_mode == NEWMV) { | 2644 if (this_mode == NEWMV) { |
| 2665 int rate_mv; | 2645 int rate_mv; |
| 2666 if (is_comp_pred) { | 2646 if (is_comp_pred) { |
| 2667 // Initialize mv using single prediction mode result. | 2647 // Initialize mv using single prediction mode result. |
| 2668 frame_mv[refs[0]].as_int = single_newmv[refs[0]].as_int; | 2648 frame_mv[refs[0]].as_int = single_newmv[refs[0]].as_int; |
| 2669 frame_mv[refs[1]].as_int = single_newmv[refs[1]].as_int; | 2649 frame_mv[refs[1]].as_int = single_newmv[refs[1]].as_int; |
| 2670 | 2650 |
| 2671 if (cpi->sf.comp_inter_joint_search_thresh <= bsize) { | 2651 if (cpi->sf.comp_inter_joint_search_thresh <= bsize) { |
| 2672 joint_motion_search(cpi, x, bsize, frame_mv, | 2652 joint_motion_search(cpi, x, bsize, frame_mv, |
| 2673 mi_row, mi_col, single_newmv, &rate_mv); | 2653 mi_row, mi_col, single_newmv, &rate_mv); |
| 2674 } else { | 2654 } else { |
| 2675 rate_mv = vp9_mv_bit_cost(&frame_mv[refs[0]].as_mv, | 2655 rate_mv = vp9_mv_bit_cost(&frame_mv[refs[0]].as_mv, |
| 2676 &mbmi->ref_mvs[refs[0]][0].as_mv, | 2656 &mbmi->ref_mvs[refs[0]][0].as_mv, |
| 2677 x->nmvjointcost, x->mvcost, MV_COST_WEIGHT); | 2657 x->nmvjointcost, x->mvcost, MV_COST_WEIGHT); |
| 2678 rate_mv += vp9_mv_bit_cost(&frame_mv[refs[1]].as_mv, | 2658 rate_mv += vp9_mv_bit_cost(&frame_mv[refs[1]].as_mv, |
| 2679 &mbmi->ref_mvs[refs[1]][0].as_mv, | 2659 &mbmi->ref_mvs[refs[1]][0].as_mv, |
| 2680 x->nmvjointcost, x->mvcost, MV_COST_WEIGHT); | 2660 x->nmvjointcost, x->mvcost, MV_COST_WEIGHT); |
| 2681 } | 2661 } |
| 2682 if (frame_mv[refs[0]].as_int == INVALID_MV || | |
| 2683 frame_mv[refs[1]].as_int == INVALID_MV) | |
| 2684 return INT64_MAX; | |
| 2685 *rate2 += rate_mv; | 2662 *rate2 += rate_mv; |
| 2686 } else { | 2663 } else { |
| 2687 int_mv tmp_mv; | 2664 int_mv tmp_mv; |
| 2688 single_motion_search(cpi, x, tile, bsize, mi_row, mi_col, | 2665 single_motion_search(cpi, x, tile, bsize, mi_row, mi_col, |
| 2689 &tmp_mv, &rate_mv); | 2666 &tmp_mv, &rate_mv); |
| 2690 *rate2 += rate_mv; | 2667 *rate2 += rate_mv; |
| 2691 frame_mv[refs[0]].as_int = | 2668 frame_mv[refs[0]].as_int = |
| 2692 xd->mi_8x8[0]->bmi[0].as_mv[0].as_int = tmp_mv.as_int; | 2669 xd->mi_8x8[0]->bmi[0].as_mv[0].as_int = tmp_mv.as_int; |
| 2693 single_newmv[refs[0]].as_int = tmp_mv.as_int; | 2670 single_newmv[refs[0]].as_int = tmp_mv.as_int; |
| 2694 } | 2671 } |
| (...skipping 56 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2751 orig_dst_stride[i] = xd->plane[i].dst.stride; | 2728 orig_dst_stride[i] = xd->plane[i].dst.stride; |
| 2752 } | 2729 } |
| 2753 | 2730 |
| 2754 /* We don't include the cost of the second reference here, because there | 2731 /* We don't include the cost of the second reference here, because there |
| 2755 * are only three options: Last/Golden, ARF/Last or Golden/ARF, or in other | 2732 * are only three options: Last/Golden, ARF/Last or Golden/ARF, or in other |
| 2756 * words if you present them in that order, the second one is always known | 2733 * words if you present them in that order, the second one is always known |
| 2757 * if the first is known */ | 2734 * if the first is known */ |
| 2758 *rate2 += cost_mv_ref(cpi, this_mode, | 2735 *rate2 += cost_mv_ref(cpi, this_mode, |
| 2759 mbmi->mode_context[mbmi->ref_frame[0]]); | 2736 mbmi->mode_context[mbmi->ref_frame[0]]); |
| 2760 | 2737 |
| 2761 if (!(*mode_excluded)) { | 2738 if (!(*mode_excluded)) |
| 2762 if (is_comp_pred) { | 2739 *mode_excluded = is_comp_pred |
| 2763 *mode_excluded = (cpi->common.comp_pred_mode == SINGLE_PREDICTION_ONLY); | 2740 ? cpi->common.reference_mode == SINGLE_REFERENCE |
| 2764 } else { | 2741 : cpi->common.reference_mode == COMPOUND_REFERENCE; |
| 2765 *mode_excluded = (cpi->common.comp_pred_mode == COMP_PREDICTION_ONLY); | |
| 2766 } | |
| 2767 } | |
| 2768 | 2742 |
| 2769 pred_exists = 0; | 2743 pred_exists = 0; |
| 2770 // Are all MVs integer pel for Y and UV | 2744 // Are all MVs integer pel for Y and UV |
| 2771 intpel_mv = (mbmi->mv[0].as_mv.row & 15) == 0 && | 2745 intpel_mv = (mbmi->mv[0].as_mv.row & 15) == 0 && |
| 2772 (mbmi->mv[0].as_mv.col & 15) == 0; | 2746 (mbmi->mv[0].as_mv.col & 15) == 0; |
| 2773 if (is_comp_pred) | 2747 if (is_comp_pred) |
| 2774 intpel_mv &= (mbmi->mv[1].as_mv.row & 15) == 0 && | 2748 intpel_mv &= (mbmi->mv[1].as_mv.row & 15) == 0 && |
| 2775 (mbmi->mv[1].as_mv.col & 15) == 0; | 2749 (mbmi->mv[1].as_mv.col & 15) == 0; |
| 2750 |
| 2776 // Search for best switchable filter by checking the variance of | 2751 // Search for best switchable filter by checking the variance of |
| 2777 // pred error irrespective of whether the filter will be used | 2752 // pred error irrespective of whether the filter will be used |
| 2778 if (cm->mcomp_filter_type != BILINEAR) { | 2753 if (cm->mcomp_filter_type != BILINEAR) { |
| 2779 *best_filter = EIGHTTAP; | 2754 *best_filter = EIGHTTAP; |
| 2780 if (x->source_variance < | 2755 if (x->source_variance < |
| 2781 cpi->sf.disable_filter_search_var_thresh) { | 2756 cpi->sf.disable_filter_search_var_thresh) { |
| 2782 *best_filter = EIGHTTAP; | 2757 *best_filter = EIGHTTAP; |
| 2783 vp9_zero(cpi->rd_filter_cache); | 2758 vp9_zero(cpi->rd_filter_cache); |
| 2784 } else { | 2759 } else { |
| 2785 int i, newbest; | 2760 int i, newbest; |
| (...skipping 19 matching lines...) Expand all Loading... |
| 2805 if (cm->mcomp_filter_type == SWITCHABLE) | 2780 if (cm->mcomp_filter_type == SWITCHABLE) |
| 2806 rd += rs_rd; | 2781 rd += rs_rd; |
| 2807 } else { | 2782 } else { |
| 2808 int rate_sum = 0; | 2783 int rate_sum = 0; |
| 2809 int64_t dist_sum = 0; | 2784 int64_t dist_sum = 0; |
| 2810 if ((cm->mcomp_filter_type == SWITCHABLE && | 2785 if ((cm->mcomp_filter_type == SWITCHABLE && |
| 2811 (!i || best_needs_copy)) || | 2786 (!i || best_needs_copy)) || |
| 2812 (cm->mcomp_filter_type != SWITCHABLE && | 2787 (cm->mcomp_filter_type != SWITCHABLE && |
| 2813 (cm->mcomp_filter_type == mbmi->interp_filter || | 2788 (cm->mcomp_filter_type == mbmi->interp_filter || |
| 2814 (i == 0 && intpel_mv)))) { | 2789 (i == 0 && intpel_mv)))) { |
| 2815 for (j = 0; j < MAX_MB_PLANE; j++) { | 2790 restore_dst_buf(xd, orig_dst, orig_dst_stride); |
| 2816 xd->plane[j].dst.buf = orig_dst[j]; | |
| 2817 xd->plane[j].dst.stride = orig_dst_stride[j]; | |
| 2818 } | |
| 2819 } else { | 2791 } else { |
| 2820 for (j = 0; j < MAX_MB_PLANE; j++) { | 2792 for (j = 0; j < MAX_MB_PLANE; j++) { |
| 2821 xd->plane[j].dst.buf = tmp_buf + j * 64 * 64; | 2793 xd->plane[j].dst.buf = tmp_buf + j * 64 * 64; |
| 2822 xd->plane[j].dst.stride = 64; | 2794 xd->plane[j].dst.stride = 64; |
| 2823 } | 2795 } |
| 2824 } | 2796 } |
| 2825 vp9_build_inter_predictors_sb(xd, mi_row, mi_col, bsize); | 2797 vp9_build_inter_predictors_sb(xd, mi_row, mi_col, bsize); |
| 2826 model_rd_for_sb(cpi, bsize, x, xd, &rate_sum, &dist_sum); | 2798 model_rd_for_sb(cpi, bsize, x, xd, &rate_sum, &dist_sum); |
| 2827 cpi->rd_filter_cache[i] = RDCOST(x->rdmult, x->rddiv, | 2799 cpi->rd_filter_cache[i] = RDCOST(x->rdmult, x->rddiv, |
| 2828 rate_sum, dist_sum); | 2800 rate_sum, dist_sum); |
| 2829 cpi->rd_filter_cache[SWITCHABLE_FILTERS] = | 2801 cpi->rd_filter_cache[SWITCHABLE_FILTERS] = |
| 2830 MIN(cpi->rd_filter_cache[SWITCHABLE_FILTERS], | 2802 MIN(cpi->rd_filter_cache[SWITCHABLE_FILTERS], |
| 2831 cpi->rd_filter_cache[i] + rs_rd); | 2803 cpi->rd_filter_cache[i] + rs_rd); |
| 2832 rd = cpi->rd_filter_cache[i]; | 2804 rd = cpi->rd_filter_cache[i]; |
| 2833 if (cm->mcomp_filter_type == SWITCHABLE) | 2805 if (cm->mcomp_filter_type == SWITCHABLE) |
| 2834 rd += rs_rd; | 2806 rd += rs_rd; |
| 2835 if (i == 0 && intpel_mv) { | 2807 if (i == 0 && intpel_mv) { |
| 2836 tmp_rate_sum = rate_sum; | 2808 tmp_rate_sum = rate_sum; |
| 2837 tmp_dist_sum = dist_sum; | 2809 tmp_dist_sum = dist_sum; |
| 2838 } | 2810 } |
| 2839 } | 2811 } |
| 2840 if (i == 0 && cpi->sf.use_rd_breakout && ref_best_rd < INT64_MAX) { | 2812 if (i == 0 && cpi->sf.use_rd_breakout && ref_best_rd < INT64_MAX) { |
| 2841 if (rd / 2 > ref_best_rd) { | 2813 if (rd / 2 > ref_best_rd) { |
| 2842 for (i = 0; i < MAX_MB_PLANE; i++) { | 2814 restore_dst_buf(xd, orig_dst, orig_dst_stride); |
| 2843 xd->plane[i].dst.buf = orig_dst[i]; | |
| 2844 xd->plane[i].dst.stride = orig_dst_stride[i]; | |
| 2845 } | |
| 2846 return INT64_MAX; | 2815 return INT64_MAX; |
| 2847 } | 2816 } |
| 2848 } | 2817 } |
| 2849 newbest = i == 0 || rd < best_rd; | 2818 newbest = i == 0 || rd < best_rd; |
| 2850 | 2819 |
| 2851 if (newbest) { | 2820 if (newbest) { |
| 2852 best_rd = rd; | 2821 best_rd = rd; |
| 2853 *best_filter = mbmi->interp_filter; | 2822 *best_filter = mbmi->interp_filter; |
| 2854 if (cm->mcomp_filter_type == SWITCHABLE && i && !intpel_mv) | 2823 if (cm->mcomp_filter_type == SWITCHABLE && i && !intpel_mv) |
| 2855 best_needs_copy = !best_needs_copy; | 2824 best_needs_copy = !best_needs_copy; |
| 2856 } | 2825 } |
| 2857 | 2826 |
| 2858 if ((cm->mcomp_filter_type == SWITCHABLE && newbest) || | 2827 if ((cm->mcomp_filter_type == SWITCHABLE && newbest) || |
| 2859 (cm->mcomp_filter_type != SWITCHABLE && | 2828 (cm->mcomp_filter_type != SWITCHABLE && |
| 2860 cm->mcomp_filter_type == mbmi->interp_filter)) { | 2829 cm->mcomp_filter_type == mbmi->interp_filter)) { |
| 2861 pred_exists = 1; | 2830 pred_exists = 1; |
| 2862 } | 2831 } |
| 2863 } | 2832 } |
| 2864 | 2833 restore_dst_buf(xd, orig_dst, orig_dst_stride); |
| 2865 for (i = 0; i < MAX_MB_PLANE; i++) { | |
| 2866 xd->plane[i].dst.buf = orig_dst[i]; | |
| 2867 xd->plane[i].dst.stride = orig_dst_stride[i]; | |
| 2868 } | |
| 2869 } | 2834 } |
| 2870 } | 2835 } |
| 2871 // Set the appropriate filter | 2836 // Set the appropriate filter |
| 2872 mbmi->interp_filter = cm->mcomp_filter_type != SWITCHABLE ? | 2837 mbmi->interp_filter = cm->mcomp_filter_type != SWITCHABLE ? |
| 2873 cm->mcomp_filter_type : *best_filter; | 2838 cm->mcomp_filter_type : *best_filter; |
| 2874 vp9_setup_interp_filters(xd, mbmi->interp_filter, cm); | 2839 vp9_setup_interp_filters(xd, mbmi->interp_filter, cm); |
| 2875 rs = cm->mcomp_filter_type == SWITCHABLE ? get_switchable_rate(x) : 0; | 2840 rs = cm->mcomp_filter_type == SWITCHABLE ? get_switchable_rate(x) : 0; |
| 2876 | 2841 |
| 2877 if (pred_exists) { | 2842 if (pred_exists) { |
| 2878 if (best_needs_copy) { | 2843 if (best_needs_copy) { |
| (...skipping 11 matching lines...) Expand all Loading... |
| 2890 | 2855 |
| 2891 | 2856 |
| 2892 if (cpi->sf.use_rd_breakout && ref_best_rd < INT64_MAX) { | 2857 if (cpi->sf.use_rd_breakout && ref_best_rd < INT64_MAX) { |
| 2893 int tmp_rate; | 2858 int tmp_rate; |
| 2894 int64_t tmp_dist; | 2859 int64_t tmp_dist; |
| 2895 model_rd_for_sb(cpi, bsize, x, xd, &tmp_rate, &tmp_dist); | 2860 model_rd_for_sb(cpi, bsize, x, xd, &tmp_rate, &tmp_dist); |
| 2896 rd = RDCOST(x->rdmult, x->rddiv, rs + tmp_rate, tmp_dist); | 2861 rd = RDCOST(x->rdmult, x->rddiv, rs + tmp_rate, tmp_dist); |
| 2897 // if current pred_error modeled rd is substantially more than the best | 2862 // if current pred_error modeled rd is substantially more than the best |
| 2898 // so far, do not bother doing full rd | 2863 // so far, do not bother doing full rd |
| 2899 if (rd / 2 > ref_best_rd) { | 2864 if (rd / 2 > ref_best_rd) { |
| 2900 for (i = 0; i < MAX_MB_PLANE; i++) { | 2865 restore_dst_buf(xd, orig_dst, orig_dst_stride); |
| 2901 xd->plane[i].dst.buf = orig_dst[i]; | |
| 2902 xd->plane[i].dst.stride = orig_dst_stride[i]; | |
| 2903 } | |
| 2904 return INT64_MAX; | 2866 return INT64_MAX; |
| 2905 } | 2867 } |
| 2906 } | 2868 } |
| 2907 | 2869 |
| 2908 if (cpi->common.mcomp_filter_type == SWITCHABLE) | 2870 if (cpi->common.mcomp_filter_type == SWITCHABLE) |
| 2909 *rate2 += get_switchable_rate(x); | 2871 *rate2 += get_switchable_rate(x); |
| 2910 | 2872 |
| 2911 if (!is_comp_pred && cpi->enable_encode_breakout) { | 2873 if (!is_comp_pred && cpi->enable_encode_breakout) { |
| 2912 if (cpi->active_map_enabled && x->active_ptr[0] == 0) | 2874 if (cpi->active_map_enabled && x->active_ptr[0] == 0) |
| 2913 x->skip = 1; | 2875 x->skip = 1; |
| (...skipping 54 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2968 x->plane[2].src.stride, | 2930 x->plane[2].src.stride, |
| 2969 xd->plane[2].dst.buf, | 2931 xd->plane[2].dst.buf, |
| 2970 xd->plane[2].dst.stride, &sse_v); | 2932 xd->plane[2].dst.stride, &sse_v); |
| 2971 | 2933 |
| 2972 // V skipping condition checking | 2934 // V skipping condition checking |
| 2973 if ((sse_v * 4 < thresh_ac || sse_v == 0) && | 2935 if ((sse_v * 4 < thresh_ac || sse_v == 0) && |
| 2974 (sse_v - var_v < thresh_dc || sse_v == var_v)) { | 2936 (sse_v - var_v < thresh_dc || sse_v == var_v)) { |
| 2975 x->skip = 1; | 2937 x->skip = 1; |
| 2976 | 2938 |
| 2977 // The cost of skip bit needs to be added. | 2939 // The cost of skip bit needs to be added. |
| 2978 *rate2 += vp9_cost_bit(vp9_get_pred_prob_mbskip(cm, xd), 1); | 2940 *rate2 += vp9_cost_bit(vp9_get_skip_prob(cm, xd), 1); |
| 2979 | 2941 |
| 2980 // Scaling factor for SSE from spatial domain to frequency domain | 2942 // Scaling factor for SSE from spatial domain to frequency domain |
| 2981 // is 16. Adjust distortion accordingly. | 2943 // is 16. Adjust distortion accordingly. |
| 2982 *distortion_uv = (sse_u + sse_v) << 4; | 2944 *distortion_uv = (sse_u + sse_v) << 4; |
| 2983 *distortion = (sse << 4) + *distortion_uv; | 2945 *distortion = (sse << 4) + *distortion_uv; |
| 2984 | 2946 |
| 2985 *disable_skip = 1; | 2947 *disable_skip = 1; |
| 2986 this_rd = RDCOST(x->rdmult, x->rddiv, *rate2, *distortion); | 2948 this_rd = RDCOST(x->rdmult, x->rddiv, *rate2, *distortion); |
| 2987 } | 2949 } |
| 2988 } | 2950 } |
| 2989 } | 2951 } |
| 2990 } | 2952 } |
| 2991 } | 2953 } |
| 2992 } | 2954 } |
| 2993 | 2955 |
| 2994 if (!x->skip) { | 2956 if (!x->skip) { |
| 2995 int skippable_y, skippable_uv; | 2957 int skippable_y, skippable_uv; |
| 2996 int64_t sseuv = INT64_MAX; | 2958 int64_t sseuv = INT64_MAX; |
| 2997 int64_t rdcosty = INT64_MAX; | 2959 int64_t rdcosty = INT64_MAX; |
| 2998 | 2960 |
| 2999 // Y cost and distortion | 2961 // Y cost and distortion |
| 3000 super_block_yrd(cpi, x, rate_y, distortion_y, &skippable_y, psse, | 2962 super_block_yrd(cpi, x, rate_y, distortion_y, &skippable_y, psse, |
| 3001 bsize, txfm_cache, ref_best_rd); | 2963 bsize, txfm_cache, ref_best_rd); |
| 3002 | 2964 |
| 3003 if (*rate_y == INT_MAX) { | 2965 if (*rate_y == INT_MAX) { |
| 3004 *rate2 = INT_MAX; | 2966 *rate2 = INT_MAX; |
| 3005 *distortion = INT64_MAX; | 2967 *distortion = INT64_MAX; |
| 3006 for (i = 0; i < MAX_MB_PLANE; i++) { | 2968 restore_dst_buf(xd, orig_dst, orig_dst_stride); |
| 3007 xd->plane[i].dst.buf = orig_dst[i]; | |
| 3008 xd->plane[i].dst.stride = orig_dst_stride[i]; | |
| 3009 } | |
| 3010 return INT64_MAX; | 2969 return INT64_MAX; |
| 3011 } | 2970 } |
| 3012 | 2971 |
| 3013 *rate2 += *rate_y; | 2972 *rate2 += *rate_y; |
| 3014 *distortion += *distortion_y; | 2973 *distortion += *distortion_y; |
| 3015 | 2974 |
| 3016 rdcosty = RDCOST(x->rdmult, x->rddiv, *rate2, *distortion); | 2975 rdcosty = RDCOST(x->rdmult, x->rddiv, *rate2, *distortion); |
| 3017 rdcosty = MIN(rdcosty, RDCOST(x->rdmult, x->rddiv, 0, *psse)); | 2976 rdcosty = MIN(rdcosty, RDCOST(x->rdmult, x->rddiv, 0, *psse)); |
| 3018 | 2977 |
| 3019 super_block_uvrd(cpi, x, rate_uv, distortion_uv, &skippable_uv, &sseuv, | 2978 super_block_uvrd(cpi, x, rate_uv, distortion_uv, &skippable_uv, &sseuv, |
| 3020 bsize, ref_best_rd - rdcosty); | 2979 bsize, ref_best_rd - rdcosty); |
| 3021 if (*rate_uv == INT_MAX) { | 2980 if (*rate_uv == INT_MAX) { |
| 3022 *rate2 = INT_MAX; | 2981 *rate2 = INT_MAX; |
| 3023 *distortion = INT64_MAX; | 2982 *distortion = INT64_MAX; |
| 3024 for (i = 0; i < MAX_MB_PLANE; i++) { | 2983 restore_dst_buf(xd, orig_dst, orig_dst_stride); |
| 3025 xd->plane[i].dst.buf = orig_dst[i]; | |
| 3026 xd->plane[i].dst.stride = orig_dst_stride[i]; | |
| 3027 } | |
| 3028 return INT64_MAX; | 2984 return INT64_MAX; |
| 3029 } | 2985 } |
| 3030 | 2986 |
| 3031 *psse += sseuv; | 2987 *psse += sseuv; |
| 3032 *rate2 += *rate_uv; | 2988 *rate2 += *rate_uv; |
| 3033 *distortion += *distortion_uv; | 2989 *distortion += *distortion_uv; |
| 3034 *skippable = skippable_y && skippable_uv; | 2990 *skippable = skippable_y && skippable_uv; |
| 3035 } | 2991 } |
| 3036 | 2992 |
| 3037 for (i = 0; i < MAX_MB_PLANE; i++) { | 2993 restore_dst_buf(xd, orig_dst, orig_dst_stride); |
| 3038 xd->plane[i].dst.buf = orig_dst[i]; | 2994 return this_rd; // if 0, this will be re-calculated by caller |
| 3039 xd->plane[i].dst.stride = orig_dst_stride[i]; | 2995 } |
| 2996 |
| 2997 static void swap_block_ptr(MACROBLOCK *x, PICK_MODE_CONTEXT *ctx, |
| 2998 int max_plane) { |
| 2999 struct macroblock_plane *const p = x->plane; |
| 3000 struct macroblockd_plane *const pd = x->e_mbd.plane; |
| 3001 int i; |
| 3002 |
| 3003 for (i = 0; i < max_plane; ++i) { |
| 3004 p[i].coeff = ctx->coeff_pbuf[i][1]; |
| 3005 p[i].qcoeff = ctx->qcoeff_pbuf[i][1]; |
| 3006 pd[i].dqcoeff = ctx->dqcoeff_pbuf[i][1]; |
| 3007 p[i].eobs = ctx->eobs_pbuf[i][1]; |
| 3008 |
| 3009 ctx->coeff_pbuf[i][1] = ctx->coeff_pbuf[i][0]; |
| 3010 ctx->qcoeff_pbuf[i][1] = ctx->qcoeff_pbuf[i][0]; |
| 3011 ctx->dqcoeff_pbuf[i][1] = ctx->dqcoeff_pbuf[i][0]; |
| 3012 ctx->eobs_pbuf[i][1] = ctx->eobs_pbuf[i][0]; |
| 3013 |
| 3014 ctx->coeff_pbuf[i][0] = p[i].coeff; |
| 3015 ctx->qcoeff_pbuf[i][0] = p[i].qcoeff; |
| 3016 ctx->dqcoeff_pbuf[i][0] = pd[i].dqcoeff; |
| 3017 ctx->eobs_pbuf[i][0] = p[i].eobs; |
| 3040 } | 3018 } |
| 3041 | |
| 3042 return this_rd; // if 0, this will be re-calculated by caller | |
| 3043 } | 3019 } |
| 3044 | 3020 |
| 3045 void vp9_rd_pick_intra_mode_sb(VP9_COMP *cpi, MACROBLOCK *x, | 3021 void vp9_rd_pick_intra_mode_sb(VP9_COMP *cpi, MACROBLOCK *x, |
| 3046 int *returnrate, int64_t *returndist, | 3022 int *returnrate, int64_t *returndist, |
| 3047 BLOCK_SIZE bsize, | 3023 BLOCK_SIZE bsize, |
| 3048 PICK_MODE_CONTEXT *ctx, int64_t best_rd) { | 3024 PICK_MODE_CONTEXT *ctx, int64_t best_rd) { |
| 3049 VP9_COMMON *const cm = &cpi->common; | 3025 VP9_COMMON *const cm = &cpi->common; |
| 3050 MACROBLOCKD *const xd = &x->e_mbd; | 3026 MACROBLOCKD *const xd = &x->e_mbd; |
| 3051 int rate_y = 0, rate_uv = 0, rate_y_tokenonly = 0, rate_uv_tokenonly = 0; | 3027 int rate_y = 0, rate_uv = 0, rate_y_tokenonly = 0, rate_uv_tokenonly = 0; |
| 3052 int y_skip = 0, uv_skip = 0; | 3028 int y_skip = 0, uv_skip = 0; |
| 3053 int64_t dist_y = 0, dist_uv = 0, tx_cache[TX_MODES] = { 0 }; | 3029 int64_t dist_y = 0, dist_uv = 0, tx_cache[TX_MODES] = { 0 }; |
| 3030 TX_SIZE max_uv_tx_size; |
| 3054 x->skip_encode = 0; | 3031 x->skip_encode = 0; |
| 3055 ctx->skip = 0; | 3032 ctx->skip = 0; |
| 3056 xd->mi_8x8[0]->mbmi.ref_frame[0] = INTRA_FRAME; | 3033 xd->mi_8x8[0]->mbmi.ref_frame[0] = INTRA_FRAME; |
| 3034 |
| 3057 if (bsize >= BLOCK_8X8) { | 3035 if (bsize >= BLOCK_8X8) { |
| 3058 if (rd_pick_intra_sby_mode(cpi, x, &rate_y, &rate_y_tokenonly, | 3036 if (rd_pick_intra_sby_mode(cpi, x, &rate_y, &rate_y_tokenonly, |
| 3059 &dist_y, &y_skip, bsize, tx_cache, | 3037 &dist_y, &y_skip, bsize, tx_cache, |
| 3060 best_rd) >= best_rd) { | 3038 best_rd) >= best_rd) { |
| 3061 *returnrate = INT_MAX; | 3039 *returnrate = INT_MAX; |
| 3062 return; | 3040 return; |
| 3063 } | 3041 } |
| 3064 rd_pick_intra_sbuv_mode(cpi, x, &rate_uv, &rate_uv_tokenonly, | 3042 max_uv_tx_size = get_uv_tx_size_impl(xd->mi_8x8[0]->mbmi.tx_size, bsize); |
| 3065 &dist_uv, &uv_skip, bsize); | 3043 rd_pick_intra_sbuv_mode(cpi, x, ctx, &rate_uv, &rate_uv_tokenonly, |
| 3044 &dist_uv, &uv_skip, bsize, max_uv_tx_size); |
| 3066 } else { | 3045 } else { |
| 3067 y_skip = 0; | 3046 y_skip = 0; |
| 3068 if (rd_pick_intra_sub_8x8_y_mode(cpi, x, &rate_y, &rate_y_tokenonly, | 3047 if (rd_pick_intra_sub_8x8_y_mode(cpi, x, &rate_y, &rate_y_tokenonly, |
| 3069 &dist_y, best_rd) >= best_rd) { | 3048 &dist_y, best_rd) >= best_rd) { |
| 3070 *returnrate = INT_MAX; | 3049 *returnrate = INT_MAX; |
| 3071 return; | 3050 return; |
| 3072 } | 3051 } |
| 3073 rd_pick_intra_sbuv_mode(cpi, x, &rate_uv, &rate_uv_tokenonly, | 3052 max_uv_tx_size = get_uv_tx_size_impl(xd->mi_8x8[0]->mbmi.tx_size, bsize); |
| 3074 &dist_uv, &uv_skip, BLOCK_8X8); | 3053 rd_pick_intra_sbuv_mode(cpi, x, ctx, &rate_uv, &rate_uv_tokenonly, |
| 3054 &dist_uv, &uv_skip, BLOCK_8X8, max_uv_tx_size); |
| 3075 } | 3055 } |
| 3076 | 3056 |
| 3077 if (y_skip && uv_skip) { | 3057 if (y_skip && uv_skip) { |
| 3078 *returnrate = rate_y + rate_uv - rate_y_tokenonly - rate_uv_tokenonly + | 3058 *returnrate = rate_y + rate_uv - rate_y_tokenonly - rate_uv_tokenonly + |
| 3079 vp9_cost_bit(vp9_get_pred_prob_mbskip(cm, xd), 1); | 3059 vp9_cost_bit(vp9_get_skip_prob(cm, xd), 1); |
| 3080 *returndist = dist_y + dist_uv; | 3060 *returndist = dist_y + dist_uv; |
| 3081 vp9_zero(ctx->tx_rd_diff); | 3061 vp9_zero(ctx->tx_rd_diff); |
| 3082 } else { | 3062 } else { |
| 3083 int i; | 3063 int i; |
| 3084 *returnrate = rate_y + rate_uv + | 3064 *returnrate = rate_y + rate_uv + vp9_cost_bit(vp9_get_skip_prob(cm, xd), 0); |
| 3085 vp9_cost_bit(vp9_get_pred_prob_mbskip(cm, xd), 0); | |
| 3086 *returndist = dist_y + dist_uv; | 3065 *returndist = dist_y + dist_uv; |
| 3087 if (cpi->sf.tx_size_search_method == USE_FULL_RD) | 3066 if (cpi->sf.tx_size_search_method == USE_FULL_RD) |
| 3088 for (i = 0; i < TX_MODES; i++) { | 3067 for (i = 0; i < TX_MODES; i++) { |
| 3089 if (tx_cache[i] < INT64_MAX && tx_cache[cm->tx_mode] < INT64_MAX) | 3068 if (tx_cache[i] < INT64_MAX && tx_cache[cm->tx_mode] < INT64_MAX) |
| 3090 ctx->tx_rd_diff[i] = tx_cache[i] - tx_cache[cm->tx_mode]; | 3069 ctx->tx_rd_diff[i] = tx_cache[i] - tx_cache[cm->tx_mode]; |
| 3091 else | 3070 else |
| 3092 ctx->tx_rd_diff[i] = 0; | 3071 ctx->tx_rd_diff[i] = 0; |
| 3093 } | 3072 } |
| 3094 } | 3073 } |
| 3095 | 3074 |
| (...skipping 22 matching lines...) Expand all Loading... |
| 3118 int_mv single_newmv[MAX_REF_FRAMES] = { { 0 } }; | 3097 int_mv single_newmv[MAX_REF_FRAMES] = { { 0 } }; |
| 3119 static const int flag_list[4] = { 0, VP9_LAST_FLAG, VP9_GOLD_FLAG, | 3098 static const int flag_list[4] = { 0, VP9_LAST_FLAG, VP9_GOLD_FLAG, |
| 3120 VP9_ALT_FLAG }; | 3099 VP9_ALT_FLAG }; |
| 3121 int idx_list[4] = {0, | 3100 int idx_list[4] = {0, |
| 3122 cpi->lst_fb_idx, | 3101 cpi->lst_fb_idx, |
| 3123 cpi->gld_fb_idx, | 3102 cpi->gld_fb_idx, |
| 3124 cpi->alt_fb_idx}; | 3103 cpi->alt_fb_idx}; |
| 3125 int64_t best_rd = best_rd_so_far; | 3104 int64_t best_rd = best_rd_so_far; |
| 3126 int64_t best_tx_rd[TX_MODES]; | 3105 int64_t best_tx_rd[TX_MODES]; |
| 3127 int64_t best_tx_diff[TX_MODES]; | 3106 int64_t best_tx_diff[TX_MODES]; |
| 3128 int64_t best_pred_diff[NB_PREDICTION_TYPES]; | 3107 int64_t best_pred_diff[REFERENCE_MODES]; |
| 3129 int64_t best_pred_rd[NB_PREDICTION_TYPES]; | 3108 int64_t best_pred_rd[REFERENCE_MODES]; |
| 3130 int64_t best_filter_rd[SWITCHABLE_FILTER_CONTEXTS]; | 3109 int64_t best_filter_rd[SWITCHABLE_FILTER_CONTEXTS]; |
| 3131 int64_t best_filter_diff[SWITCHABLE_FILTER_CONTEXTS]; | 3110 int64_t best_filter_diff[SWITCHABLE_FILTER_CONTEXTS]; |
| 3132 MB_MODE_INFO best_mbmode = { 0 }; | 3111 MB_MODE_INFO best_mbmode = { 0 }; |
| 3133 int j; | 3112 int j; |
| 3134 int mode_index, best_mode_index = 0; | 3113 int mode_index, best_mode_index = 0; |
| 3135 unsigned int ref_costs_single[MAX_REF_FRAMES], ref_costs_comp[MAX_REF_FRAMES]; | 3114 unsigned int ref_costs_single[MAX_REF_FRAMES], ref_costs_comp[MAX_REF_FRAMES]; |
| 3136 vp9_prob comp_mode_p; | 3115 vp9_prob comp_mode_p; |
| 3137 int64_t best_intra_rd = INT64_MAX; | 3116 int64_t best_intra_rd = INT64_MAX; |
| 3138 int64_t best_inter_rd = INT64_MAX; | 3117 int64_t best_inter_rd = INT64_MAX; |
| 3139 MB_PREDICTION_MODE best_intra_mode = DC_PRED; | 3118 MB_PREDICTION_MODE best_intra_mode = DC_PRED; |
| 3140 MV_REFERENCE_FRAME best_inter_ref_frame = LAST_FRAME; | 3119 MV_REFERENCE_FRAME best_inter_ref_frame = LAST_FRAME; |
| 3141 INTERPOLATION_TYPE tmp_best_filter = SWITCHABLE; | 3120 INTERPOLATION_TYPE tmp_best_filter = SWITCHABLE; |
| 3142 int rate_uv_intra[TX_SIZES], rate_uv_tokenonly[TX_SIZES]; | 3121 int rate_uv_intra[TX_SIZES], rate_uv_tokenonly[TX_SIZES]; |
| 3143 int64_t dist_uv[TX_SIZES]; | 3122 int64_t dist_uv[TX_SIZES]; |
| 3144 int skip_uv[TX_SIZES]; | 3123 int skip_uv[TX_SIZES]; |
| 3145 MB_PREDICTION_MODE mode_uv[TX_SIZES]; | 3124 MB_PREDICTION_MODE mode_uv[TX_SIZES]; |
| 3146 struct scale_factors scale_factor[4]; | 3125 struct scale_factors scale_factor[4]; |
| 3147 unsigned int ref_frame_mask = 0; | 3126 unsigned int ref_frame_mask = 0; |
| 3148 unsigned int mode_mask = 0; | 3127 unsigned int mode_mask = 0; |
| 3149 int64_t mode_distortions[MB_MODE_COUNT] = {-1}; | 3128 int64_t mode_distortions[MB_MODE_COUNT] = {-1}; |
| 3150 int64_t frame_distortions[MAX_REF_FRAMES] = {-1}; | 3129 int64_t frame_distortions[MAX_REF_FRAMES] = {-1}; |
| 3151 int intra_cost_penalty = 20 * vp9_dc_quant(cm->base_qindex, cm->y_dc_delta_q); | 3130 int intra_cost_penalty = 20 * vp9_dc_quant(cm->base_qindex, cm->y_dc_delta_q); |
| 3152 const int bws = num_8x8_blocks_wide_lookup[bsize] / 2; | 3131 const int bws = num_8x8_blocks_wide_lookup[bsize] / 2; |
| 3153 const int bhs = num_8x8_blocks_high_lookup[bsize] / 2; | 3132 const int bhs = num_8x8_blocks_high_lookup[bsize] / 2; |
| 3154 int best_skip2 = 0; | 3133 int best_skip2 = 0; |
| 3155 | 3134 |
| 3156 x->skip_encode = cpi->sf.skip_encode_frame && xd->q_index < QIDX_SKIP_THRESH; | 3135 x->skip_encode = cpi->sf.skip_encode_frame && x->q_index < QIDX_SKIP_THRESH; |
| 3157 | 3136 |
| 3158 // Everywhere the flag is set the error is much higher than its neighbors. | 3137 // Everywhere the flag is set the error is much higher than its neighbors. |
| 3159 ctx->frames_with_high_error = 0; | 3138 ctx->frames_with_high_error = 0; |
| 3160 ctx->modes_with_high_error = 0; | 3139 ctx->modes_with_high_error = 0; |
| 3161 | 3140 |
| 3162 estimate_ref_frame_costs(cpi, segment_id, ref_costs_single, ref_costs_comp, | 3141 estimate_ref_frame_costs(cpi, segment_id, ref_costs_single, ref_costs_comp, |
| 3163 &comp_mode_p); | 3142 &comp_mode_p); |
| 3164 | 3143 |
| 3165 for (i = 0; i < NB_PREDICTION_TYPES; ++i) | 3144 for (i = 0; i < REFERENCE_MODES; ++i) |
| 3166 best_pred_rd[i] = INT64_MAX; | 3145 best_pred_rd[i] = INT64_MAX; |
| 3167 for (i = 0; i < TX_MODES; i++) | 3146 for (i = 0; i < TX_MODES; i++) |
| 3168 best_tx_rd[i] = INT64_MAX; | 3147 best_tx_rd[i] = INT64_MAX; |
| 3169 for (i = 0; i < SWITCHABLE_FILTER_CONTEXTS; i++) | 3148 for (i = 0; i < SWITCHABLE_FILTER_CONTEXTS; i++) |
| 3170 best_filter_rd[i] = INT64_MAX; | 3149 best_filter_rd[i] = INT64_MAX; |
| 3171 for (i = 0; i < TX_SIZES; i++) | 3150 for (i = 0; i < TX_SIZES; i++) |
| 3172 rate_uv_intra[i] = INT_MAX; | 3151 rate_uv_intra[i] = INT_MAX; |
| 3173 | 3152 |
| 3174 *returnrate = INT_MAX; | 3153 *returnrate = INT_MAX; |
| 3175 | 3154 |
| 3176 // Create a mask set to 1 for each reference frame used by a smaller | 3155 // Create a mask set to 1 for each reference frame used by a smaller |
| 3177 // resolution. | 3156 // resolution. |
| 3178 if (cpi->sf.use_avoid_tested_higherror) { | 3157 if (cpi->sf.use_avoid_tested_higherror) { |
| 3179 switch (block_size) { | 3158 switch (block_size) { |
| 3180 case BLOCK_64X64: | 3159 case BLOCK_64X64: |
| 3181 for (i = 0; i < 4; i++) { | 3160 for (i = 0; i < 4; i++) { |
| 3182 for (j = 0; j < 4; j++) { | 3161 for (j = 0; j < 4; j++) { |
| 3183 ref_frame_mask |= x->mb_context[i][j].frames_with_high_error; | 3162 ref_frame_mask |= x->mb_context[i][j].frames_with_high_error; |
| 3184 mode_mask |= x->mb_context[i][j].modes_with_high_error; | 3163 mode_mask |= x->mb_context[i][j].modes_with_high_error; |
| 3185 } | 3164 } |
| 3186 } | 3165 } |
| 3187 for (i = 0; i < 4; i++) { | 3166 for (i = 0; i < 4; i++) { |
| 3188 ref_frame_mask |= x->sb32_context[i].frames_with_high_error; | 3167 ref_frame_mask |= x->sb32_context[i].frames_with_high_error; |
| 3189 mode_mask |= x->sb32_context[i].modes_with_high_error; | 3168 mode_mask |= x->sb32_context[i].modes_with_high_error; |
| 3190 } | 3169 } |
| 3191 break; | 3170 break; |
| 3192 case BLOCK_32X32: | 3171 case BLOCK_32X32: |
| 3193 for (i = 0; i < 4; i++) { | 3172 for (i = 0; i < 4; i++) { |
| 3194 ref_frame_mask |= | 3173 ref_frame_mask |= |
| 3195 x->mb_context[xd->sb_index][i].frames_with_high_error; | 3174 x->mb_context[x->sb_index][i].frames_with_high_error; |
| 3196 mode_mask |= x->mb_context[xd->sb_index][i].modes_with_high_error; | 3175 mode_mask |= x->mb_context[x->sb_index][i].modes_with_high_error; |
| 3197 } | 3176 } |
| 3198 break; | 3177 break; |
| 3199 default: | 3178 default: |
| 3200 // Until we handle all block sizes set it to present; | 3179 // Until we handle all block sizes set it to present; |
| 3201 ref_frame_mask = 0; | 3180 ref_frame_mask = 0; |
| 3202 mode_mask = 0; | 3181 mode_mask = 0; |
| 3203 break; | 3182 break; |
| 3204 } | 3183 } |
| 3205 ref_frame_mask = ~ref_frame_mask; | 3184 ref_frame_mask = ~ref_frame_mask; |
| 3206 mode_mask = ~mode_mask; | 3185 mode_mask = ~mode_mask; |
| (...skipping 44 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3251 cpi->mode_skip_mask = LAST_FRAME_MODE_MASK; | 3230 cpi->mode_skip_mask = LAST_FRAME_MODE_MASK; |
| 3252 break; | 3231 break; |
| 3253 case GOLDEN_FRAME: | 3232 case GOLDEN_FRAME: |
| 3254 cpi->mode_skip_mask = GOLDEN_FRAME_MODE_MASK; | 3233 cpi->mode_skip_mask = GOLDEN_FRAME_MODE_MASK; |
| 3255 break; | 3234 break; |
| 3256 case ALTREF_FRAME: | 3235 case ALTREF_FRAME: |
| 3257 cpi->mode_skip_mask = ALT_REF_MODE_MASK; | 3236 cpi->mode_skip_mask = ALT_REF_MODE_MASK; |
| 3258 break; | 3237 break; |
| 3259 case NONE: | 3238 case NONE: |
| 3260 case MAX_REF_FRAMES: | 3239 case MAX_REF_FRAMES: |
| 3261 assert(!"Invalid Reference frame"); | 3240 assert(0 && "Invalid Reference frame"); |
| 3262 } | 3241 } |
| 3263 } | 3242 } |
| 3264 if (cpi->mode_skip_mask & ((int64_t)1 << mode_index)) | 3243 if (cpi->mode_skip_mask & ((int64_t)1 << mode_index)) |
| 3265 continue; | 3244 continue; |
| 3266 } | 3245 } |
| 3267 | 3246 |
| 3268 // Skip if the current reference frame has been masked off | 3247 // Skip if the current reference frame has been masked off |
| 3269 if (cpi->sf.reference_masking && !cpi->set_ref_frame_mask && | 3248 if (cpi->sf.reference_masking && !cpi->set_ref_frame_mask && |
| 3270 (cpi->ref_frame_mask & (1 << ref_frame))) | 3249 (cpi->ref_frame_mask & (1 << ref_frame))) |
| 3271 continue; | 3250 continue; |
| (...skipping 56 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3328 mbmi->uv_mode = DC_PRED; | 3307 mbmi->uv_mode = DC_PRED; |
| 3329 | 3308 |
| 3330 // Evaluate all sub-pel filters irrespective of whether we can use | 3309 // Evaluate all sub-pel filters irrespective of whether we can use |
| 3331 // them for this frame. | 3310 // them for this frame. |
| 3332 mbmi->interp_filter = cm->mcomp_filter_type; | 3311 mbmi->interp_filter = cm->mcomp_filter_type; |
| 3333 vp9_setup_interp_filters(xd, mbmi->interp_filter, cm); | 3312 vp9_setup_interp_filters(xd, mbmi->interp_filter, cm); |
| 3334 | 3313 |
| 3335 if (comp_pred) { | 3314 if (comp_pred) { |
| 3336 if (!(cpi->ref_frame_flags & flag_list[second_ref_frame])) | 3315 if (!(cpi->ref_frame_flags & flag_list[second_ref_frame])) |
| 3337 continue; | 3316 continue; |
| 3317 |
| 3338 set_scale_factors(xd, ref_frame, second_ref_frame, scale_factor); | 3318 set_scale_factors(xd, ref_frame, second_ref_frame, scale_factor); |
| 3339 | 3319 mode_excluded = mode_excluded ? mode_excluded |
| 3340 mode_excluded = mode_excluded | 3320 : cm->reference_mode == SINGLE_REFERENCE; |
| 3341 ? mode_excluded | |
| 3342 : cm->comp_pred_mode == SINGLE_PREDICTION_ONLY; | |
| 3343 } else { | 3321 } else { |
| 3344 if (ref_frame != INTRA_FRAME && second_ref_frame != INTRA_FRAME) { | 3322 if (ref_frame != INTRA_FRAME && second_ref_frame != INTRA_FRAME) |
| 3345 mode_excluded = | 3323 mode_excluded = mode_excluded ? |
| 3346 mode_excluded ? | 3324 mode_excluded : cm->reference_mode == COMPOUND_REFERENCE; |
| 3347 mode_excluded : cm->comp_pred_mode == COMP_PREDICTION_ONLY; | |
| 3348 } | |
| 3349 } | 3325 } |
| 3350 | 3326 |
| 3351 // Select prediction reference frames. | 3327 // Select prediction reference frames. |
| 3352 for (i = 0; i < MAX_MB_PLANE; i++) { | 3328 for (i = 0; i < MAX_MB_PLANE; i++) { |
| 3353 xd->plane[i].pre[0] = yv12_mb[ref_frame][i]; | 3329 xd->plane[i].pre[0] = yv12_mb[ref_frame][i]; |
| 3354 if (comp_pred) | 3330 if (comp_pred) |
| 3355 xd->plane[i].pre[1] = yv12_mb[second_ref_frame][i]; | 3331 xd->plane[i].pre[1] = yv12_mb[second_ref_frame][i]; |
| 3356 } | 3332 } |
| 3357 | 3333 |
| 3358 // If the segment reference frame feature is enabled.... | 3334 // If the segment reference frame feature is enabled.... |
| (...skipping 68 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3427 if (conditional_skipintra(mbmi->mode, best_intra_mode)) | 3403 if (conditional_skipintra(mbmi->mode, best_intra_mode)) |
| 3428 continue; | 3404 continue; |
| 3429 } | 3405 } |
| 3430 | 3406 |
| 3431 super_block_yrd(cpi, x, &rate_y, &distortion_y, &skippable, NULL, | 3407 super_block_yrd(cpi, x, &rate_y, &distortion_y, &skippable, NULL, |
| 3432 bsize, tx_cache, best_rd); | 3408 bsize, tx_cache, best_rd); |
| 3433 | 3409 |
| 3434 if (rate_y == INT_MAX) | 3410 if (rate_y == INT_MAX) |
| 3435 continue; | 3411 continue; |
| 3436 | 3412 |
| 3437 uv_tx = MIN(mbmi->tx_size, max_uv_txsize_lookup[bsize]); | 3413 uv_tx = get_uv_tx_size_impl(mbmi->tx_size, bsize); |
| 3438 if (rate_uv_intra[uv_tx] == INT_MAX) { | 3414 if (rate_uv_intra[uv_tx] == INT_MAX) { |
| 3439 choose_intra_uv_mode(cpi, bsize, &rate_uv_intra[uv_tx], | 3415 choose_intra_uv_mode(cpi, ctx, bsize, uv_tx, |
| 3440 &rate_uv_tokenonly[uv_tx], | 3416 &rate_uv_intra[uv_tx], &rate_uv_tokenonly[uv_tx], |
| 3441 &dist_uv[uv_tx], &skip_uv[uv_tx], | 3417 &dist_uv[uv_tx], &skip_uv[uv_tx], &mode_uv[uv_tx]); |
| 3442 &mode_uv[uv_tx]); | |
| 3443 } | 3418 } |
| 3444 | 3419 |
| 3445 rate_uv = rate_uv_tokenonly[uv_tx]; | 3420 rate_uv = rate_uv_tokenonly[uv_tx]; |
| 3446 distortion_uv = dist_uv[uv_tx]; | 3421 distortion_uv = dist_uv[uv_tx]; |
| 3447 skippable = skippable && skip_uv[uv_tx]; | 3422 skippable = skippable && skip_uv[uv_tx]; |
| 3448 mbmi->uv_mode = mode_uv[uv_tx]; | 3423 mbmi->uv_mode = mode_uv[uv_tx]; |
| 3449 | 3424 |
| 3450 rate2 = rate_y + x->mbmode_cost[mbmi->mode] + rate_uv_intra[uv_tx]; | 3425 rate2 = rate_y + x->mbmode_cost[mbmi->mode] + rate_uv_intra[uv_tx]; |
| 3451 if (this_mode != DC_PRED && this_mode != TM_PRED) | 3426 if (this_mode != DC_PRED && this_mode != TM_PRED) |
| 3452 rate2 += intra_cost_penalty; | 3427 rate2 += intra_cost_penalty; |
| 3453 distortion2 = distortion_y + distortion_uv; | 3428 distortion2 = distortion_y + distortion_uv; |
| 3454 } else { | 3429 } else { |
| 3455 mbmi->mode = this_mode; | 3430 mbmi->mode = this_mode; |
| 3456 compmode_cost = vp9_cost_bit(comp_mode_p, second_ref_frame > INTRA_FRAME); | 3431 compmode_cost = vp9_cost_bit(comp_mode_p, second_ref_frame > INTRA_FRAME); |
| 3457 this_rd = handle_inter_mode(cpi, x, tile, bsize, | 3432 this_rd = handle_inter_mode(cpi, x, tile, bsize, |
| 3458 tx_cache, | 3433 tx_cache, |
| 3459 &rate2, &distortion2, &skippable, | 3434 &rate2, &distortion2, &skippable, |
| 3460 &rate_y, &distortion_y, | 3435 &rate_y, &distortion_y, |
| 3461 &rate_uv, &distortion_uv, | 3436 &rate_uv, &distortion_uv, |
| 3462 &mode_excluded, &disable_skip, | 3437 &mode_excluded, &disable_skip, |
| 3463 &tmp_best_filter, frame_mv, | 3438 &tmp_best_filter, frame_mv, |
| 3464 mi_row, mi_col, | 3439 mi_row, mi_col, |
| 3465 single_newmv, &total_sse, best_rd); | 3440 single_newmv, &total_sse, best_rd); |
| 3466 if (this_rd == INT64_MAX) | 3441 if (this_rd == INT64_MAX) |
| 3467 continue; | 3442 continue; |
| 3468 } | 3443 } |
| 3469 | 3444 |
| 3470 if (cm->comp_pred_mode == HYBRID_PREDICTION) { | 3445 if (cm->reference_mode == REFERENCE_MODE_SELECT) |
| 3471 rate2 += compmode_cost; | 3446 rate2 += compmode_cost; |
| 3472 } | |
| 3473 | 3447 |
| 3474 // Estimate the reference frame signaling cost and add it | 3448 // Estimate the reference frame signaling cost and add it |
| 3475 // to the rolling cost variable. | 3449 // to the rolling cost variable. |
| 3476 if (second_ref_frame > INTRA_FRAME) { | 3450 if (second_ref_frame > INTRA_FRAME) { |
| 3477 rate2 += ref_costs_comp[ref_frame]; | 3451 rate2 += ref_costs_comp[ref_frame]; |
| 3478 } else { | 3452 } else { |
| 3479 rate2 += ref_costs_single[ref_frame]; | 3453 rate2 += ref_costs_single[ref_frame]; |
| 3480 } | 3454 } |
| 3481 | 3455 |
| 3482 if (!disable_skip) { | 3456 if (!disable_skip) { |
| 3483 // Test for the condition where skip block will be activated | 3457 // Test for the condition where skip block will be activated |
| 3484 // because there are no non zero coefficients and make any | 3458 // because there are no non zero coefficients and make any |
| 3485 // necessary adjustment for rate. Ignore if skip is coded at | 3459 // necessary adjustment for rate. Ignore if skip is coded at |
| 3486 // segment level as the cost wont have been added in. | 3460 // segment level as the cost wont have been added in. |
| 3487 // Is Mb level skip allowed (i.e. not coded at segment level). | 3461 // Is Mb level skip allowed (i.e. not coded at segment level). |
| 3488 const int mb_skip_allowed = !vp9_segfeature_active(seg, segment_id, | 3462 const int mb_skip_allowed = !vp9_segfeature_active(seg, segment_id, |
| 3489 SEG_LVL_SKIP); | 3463 SEG_LVL_SKIP); |
| 3490 | 3464 |
| 3491 if (skippable) { | 3465 if (skippable) { |
| 3492 // Back out the coefficient coding costs | 3466 // Back out the coefficient coding costs |
| 3493 rate2 -= (rate_y + rate_uv); | 3467 rate2 -= (rate_y + rate_uv); |
| 3494 // for best yrd calculation | 3468 // for best yrd calculation |
| 3495 rate_uv = 0; | 3469 rate_uv = 0; |
| 3496 | 3470 |
| 3497 if (mb_skip_allowed) { | 3471 if (mb_skip_allowed) { |
| 3498 int prob_skip_cost; | 3472 int prob_skip_cost; |
| 3499 | 3473 |
| 3500 // Cost the skip mb case | 3474 // Cost the skip mb case |
| 3501 vp9_prob skip_prob = | 3475 vp9_prob skip_prob = vp9_get_skip_prob(cm, xd); |
| 3502 vp9_get_pred_prob_mbskip(cm, xd); | |
| 3503 | |
| 3504 if (skip_prob) { | 3476 if (skip_prob) { |
| 3505 prob_skip_cost = vp9_cost_bit(skip_prob, 1); | 3477 prob_skip_cost = vp9_cost_bit(skip_prob, 1); |
| 3506 rate2 += prob_skip_cost; | 3478 rate2 += prob_skip_cost; |
| 3507 } | 3479 } |
| 3508 } | 3480 } |
| 3509 } else if (mb_skip_allowed && ref_frame != INTRA_FRAME && !xd->lossless) { | 3481 } else if (mb_skip_allowed && ref_frame != INTRA_FRAME && !xd->lossless) { |
| 3510 if (RDCOST(x->rdmult, x->rddiv, rate_y + rate_uv, distortion2) < | 3482 if (RDCOST(x->rdmult, x->rddiv, rate_y + rate_uv, distortion2) < |
| 3511 RDCOST(x->rdmult, x->rddiv, 0, total_sse)) { | 3483 RDCOST(x->rdmult, x->rddiv, 0, total_sse)) { |
| 3512 // Add in the cost of the no skip flag. | 3484 // Add in the cost of the no skip flag. |
| 3513 int prob_skip_cost = vp9_cost_bit(vp9_get_pred_prob_mbskip(cm, xd), | 3485 rate2 += vp9_cost_bit(vp9_get_skip_prob(cm, xd), 0); |
| 3514 0); | |
| 3515 rate2 += prob_skip_cost; | |
| 3516 } else { | 3486 } else { |
| 3517 // FIXME(rbultje) make this work for splitmv also | 3487 // FIXME(rbultje) make this work for splitmv also |
| 3518 int prob_skip_cost = vp9_cost_bit(vp9_get_pred_prob_mbskip(cm, xd), | 3488 rate2 += vp9_cost_bit(vp9_get_skip_prob(cm, xd), 1); |
| 3519 1); | |
| 3520 rate2 += prob_skip_cost; | |
| 3521 distortion2 = total_sse; | 3489 distortion2 = total_sse; |
| 3522 assert(total_sse >= 0); | 3490 assert(total_sse >= 0); |
| 3523 rate2 -= (rate_y + rate_uv); | 3491 rate2 -= (rate_y + rate_uv); |
| 3524 rate_y = 0; | 3492 rate_y = 0; |
| 3525 rate_uv = 0; | 3493 rate_uv = 0; |
| 3526 this_skip2 = 1; | 3494 this_skip2 = 1; |
| 3527 } | 3495 } |
| 3528 } else if (mb_skip_allowed) { | 3496 } else if (mb_skip_allowed) { |
| 3529 // Add in the cost of the no skip flag. | 3497 // Add in the cost of the no skip flag. |
| 3530 int prob_skip_cost = vp9_cost_bit(vp9_get_pred_prob_mbskip(cm, xd), | 3498 rate2 += vp9_cost_bit(vp9_get_skip_prob(cm, xd), 0); |
| 3531 0); | |
| 3532 rate2 += prob_skip_cost; | |
| 3533 } | 3499 } |
| 3534 | 3500 |
| 3535 // Calculate the final RD estimate for this mode. | 3501 // Calculate the final RD estimate for this mode. |
| 3536 this_rd = RDCOST(x->rdmult, x->rddiv, rate2, distortion2); | 3502 this_rd = RDCOST(x->rdmult, x->rddiv, rate2, distortion2); |
| 3537 } | 3503 } |
| 3538 | 3504 |
| 3539 // Keep record of best intra rd | 3505 // Keep record of best intra rd |
| 3540 if (xd->mi_8x8[0]->mbmi.ref_frame[0] == INTRA_FRAME && | 3506 if (!is_inter_block(&xd->mi_8x8[0]->mbmi) && |
| 3541 is_intra_mode(xd->mi_8x8[0]->mbmi.mode) && | |
| 3542 this_rd < best_intra_rd) { | 3507 this_rd < best_intra_rd) { |
| 3543 best_intra_rd = this_rd; | 3508 best_intra_rd = this_rd; |
| 3544 best_intra_mode = xd->mi_8x8[0]->mbmi.mode; | 3509 best_intra_mode = xd->mi_8x8[0]->mbmi.mode; |
| 3545 } | 3510 } |
| 3511 |
| 3546 // Keep record of best inter rd with single reference | 3512 // Keep record of best inter rd with single reference |
| 3547 if (xd->mi_8x8[0]->mbmi.ref_frame[0] > INTRA_FRAME && | 3513 if (is_inter_block(&xd->mi_8x8[0]->mbmi) && |
| 3548 xd->mi_8x8[0]->mbmi.ref_frame[1] == NONE && | 3514 !has_second_ref(&xd->mi_8x8[0]->mbmi) && |
| 3549 !mode_excluded && | 3515 !mode_excluded && this_rd < best_inter_rd) { |
| 3550 this_rd < best_inter_rd) { | |
| 3551 best_inter_rd = this_rd; | 3516 best_inter_rd = this_rd; |
| 3552 best_inter_ref_frame = ref_frame; | 3517 best_inter_ref_frame = ref_frame; |
| 3553 } | 3518 } |
| 3554 | 3519 |
| 3555 if (!disable_skip && ref_frame == INTRA_FRAME) { | 3520 if (!disable_skip && ref_frame == INTRA_FRAME) { |
| 3556 for (i = 0; i < NB_PREDICTION_TYPES; ++i) | 3521 for (i = 0; i < REFERENCE_MODES; ++i) |
| 3557 best_pred_rd[i] = MIN(best_pred_rd[i], this_rd); | 3522 best_pred_rd[i] = MIN(best_pred_rd[i], this_rd); |
| 3558 for (i = 0; i < SWITCHABLE_FILTER_CONTEXTS; i++) | 3523 for (i = 0; i < SWITCHABLE_FILTER_CONTEXTS; i++) |
| 3559 best_filter_rd[i] = MIN(best_filter_rd[i], this_rd); | 3524 best_filter_rd[i] = MIN(best_filter_rd[i], this_rd); |
| 3560 } | 3525 } |
| 3561 | 3526 |
| 3562 // Store the respective mode distortions for later use. | 3527 // Store the respective mode distortions for later use. |
| 3563 if (mode_distortions[this_mode] == -1 | 3528 if (mode_distortions[this_mode] == -1 |
| 3564 || distortion2 < mode_distortions[this_mode]) { | 3529 || distortion2 < mode_distortions[this_mode]) { |
| 3565 mode_distortions[this_mode] = distortion2; | 3530 mode_distortions[this_mode] = distortion2; |
| 3566 } | 3531 } |
| 3567 if (frame_distortions[ref_frame] == -1 | 3532 if (frame_distortions[ref_frame] == -1 |
| 3568 || distortion2 < frame_distortions[ref_frame]) { | 3533 || distortion2 < frame_distortions[ref_frame]) { |
| 3569 frame_distortions[ref_frame] = distortion2; | 3534 frame_distortions[ref_frame] = distortion2; |
| 3570 } | 3535 } |
| 3571 | 3536 |
| 3572 // Did this mode help.. i.e. is it the new best mode | 3537 // Did this mode help.. i.e. is it the new best mode |
| 3573 if (this_rd < best_rd || x->skip) { | 3538 if (this_rd < best_rd || x->skip) { |
| 3539 int max_plane = MAX_MB_PLANE; |
| 3574 if (!mode_excluded) { | 3540 if (!mode_excluded) { |
| 3575 // Note index of best mode so far | 3541 // Note index of best mode so far |
| 3576 best_mode_index = mode_index; | 3542 best_mode_index = mode_index; |
| 3577 | 3543 |
| 3578 if (ref_frame == INTRA_FRAME) { | 3544 if (ref_frame == INTRA_FRAME) { |
| 3579 /* required for left and above block mv */ | 3545 /* required for left and above block mv */ |
| 3580 mbmi->mv[0].as_int = 0; | 3546 mbmi->mv[0].as_int = 0; |
| 3547 max_plane = 1; |
| 3581 } | 3548 } |
| 3582 | 3549 |
| 3583 *returnrate = rate2; | 3550 *returnrate = rate2; |
| 3584 *returndistortion = distortion2; | 3551 *returndistortion = distortion2; |
| 3585 best_rd = this_rd; | 3552 best_rd = this_rd; |
| 3586 best_mbmode = *mbmi; | 3553 best_mbmode = *mbmi; |
| 3587 best_skip2 = this_skip2; | 3554 best_skip2 = this_skip2; |
| 3555 if (!x->select_txfm_size) |
| 3556 swap_block_ptr(x, ctx, max_plane); |
| 3588 vpx_memcpy(ctx->zcoeff_blk, x->zcoeff_blk[mbmi->tx_size], | 3557 vpx_memcpy(ctx->zcoeff_blk, x->zcoeff_blk[mbmi->tx_size], |
| 3589 sizeof(uint8_t) * ctx->num_4x4_blk); | 3558 sizeof(uint8_t) * ctx->num_4x4_blk); |
| 3590 | 3559 |
| 3591 // TODO(debargha): enhance this test with a better distortion prediction | 3560 // TODO(debargha): enhance this test with a better distortion prediction |
| 3592 // based on qp, activity mask and history | 3561 // based on qp, activity mask and history |
| 3593 if ((cpi->sf.mode_search_skip_flags & FLAG_EARLY_TERMINATE) && | 3562 if ((cpi->sf.mode_search_skip_flags & FLAG_EARLY_TERMINATE) && |
| 3594 (mode_index > MIN_EARLY_TERM_INDEX)) { | 3563 (mode_index > MIN_EARLY_TERM_INDEX)) { |
| 3595 const int qstep = xd->plane[0].dequant[1]; | 3564 const int qstep = xd->plane[0].dequant[1]; |
| 3596 // TODO(debargha): Enhance this by specializing for each mode_index | 3565 // TODO(debargha): Enhance this by specializing for each mode_index |
| 3597 int scale = 4; | 3566 int scale = 4; |
| 3598 if (x->source_variance < UINT_MAX) { | 3567 if (x->source_variance < UINT_MAX) { |
| 3599 const int var_adjust = (x->source_variance < 16); | 3568 const int var_adjust = (x->source_variance < 16); |
| 3600 scale -= var_adjust; | 3569 scale -= var_adjust; |
| 3601 } | 3570 } |
| 3602 if (ref_frame > INTRA_FRAME && | 3571 if (ref_frame > INTRA_FRAME && |
| 3603 distortion2 * scale < qstep * qstep) { | 3572 distortion2 * scale < qstep * qstep) { |
| 3604 early_term = 1; | 3573 early_term = 1; |
| 3605 } | 3574 } |
| 3606 } | 3575 } |
| 3607 } | 3576 } |
| 3608 } | 3577 } |
| 3609 | 3578 |
| 3610 /* keep record of best compound/single-only prediction */ | 3579 /* keep record of best compound/single-only prediction */ |
| 3611 if (!disable_skip && ref_frame != INTRA_FRAME) { | 3580 if (!disable_skip && ref_frame != INTRA_FRAME) { |
| 3612 int single_rd, hybrid_rd, single_rate, hybrid_rate; | 3581 int64_t single_rd, hybrid_rd, single_rate, hybrid_rate; |
| 3613 | 3582 |
| 3614 if (cm->comp_pred_mode == HYBRID_PREDICTION) { | 3583 if (cm->reference_mode == REFERENCE_MODE_SELECT) { |
| 3615 single_rate = rate2 - compmode_cost; | 3584 single_rate = rate2 - compmode_cost; |
| 3616 hybrid_rate = rate2; | 3585 hybrid_rate = rate2; |
| 3617 } else { | 3586 } else { |
| 3618 single_rate = rate2; | 3587 single_rate = rate2; |
| 3619 hybrid_rate = rate2 + compmode_cost; | 3588 hybrid_rate = rate2 + compmode_cost; |
| 3620 } | 3589 } |
| 3621 | 3590 |
| 3622 single_rd = RDCOST(x->rdmult, x->rddiv, single_rate, distortion2); | 3591 single_rd = RDCOST(x->rdmult, x->rddiv, single_rate, distortion2); |
| 3623 hybrid_rd = RDCOST(x->rdmult, x->rddiv, hybrid_rate, distortion2); | 3592 hybrid_rd = RDCOST(x->rdmult, x->rddiv, hybrid_rate, distortion2); |
| 3624 | 3593 |
| 3625 if (second_ref_frame <= INTRA_FRAME && | 3594 if (second_ref_frame <= INTRA_FRAME && |
| 3626 single_rd < best_pred_rd[SINGLE_PREDICTION_ONLY]) { | 3595 single_rd < best_pred_rd[SINGLE_REFERENCE]) { |
| 3627 best_pred_rd[SINGLE_PREDICTION_ONLY] = single_rd; | 3596 best_pred_rd[SINGLE_REFERENCE] = single_rd; |
| 3628 } else if (second_ref_frame > INTRA_FRAME && | 3597 } else if (second_ref_frame > INTRA_FRAME && |
| 3629 single_rd < best_pred_rd[COMP_PREDICTION_ONLY]) { | 3598 single_rd < best_pred_rd[COMPOUND_REFERENCE]) { |
| 3630 best_pred_rd[COMP_PREDICTION_ONLY] = single_rd; | 3599 best_pred_rd[COMPOUND_REFERENCE] = single_rd; |
| 3631 } | 3600 } |
| 3632 if (hybrid_rd < best_pred_rd[HYBRID_PREDICTION]) | 3601 if (hybrid_rd < best_pred_rd[REFERENCE_MODE_SELECT]) |
| 3633 best_pred_rd[HYBRID_PREDICTION] = hybrid_rd; | 3602 best_pred_rd[REFERENCE_MODE_SELECT] = hybrid_rd; |
| 3634 } | 3603 } |
| 3635 | 3604 |
| 3636 /* keep record of best filter type */ | 3605 /* keep record of best filter type */ |
| 3637 if (!mode_excluded && !disable_skip && ref_frame != INTRA_FRAME && | 3606 if (!mode_excluded && !disable_skip && ref_frame != INTRA_FRAME && |
| 3638 cm->mcomp_filter_type != BILINEAR) { | 3607 cm->mcomp_filter_type != BILINEAR) { |
| 3639 int64_t ref = cpi->rd_filter_cache[cm->mcomp_filter_type == SWITCHABLE ? | 3608 int64_t ref = cpi->rd_filter_cache[cm->mcomp_filter_type == SWITCHABLE ? |
| 3640 SWITCHABLE_FILTERS : cm->mcomp_filter_type]; | 3609 SWITCHABLE_FILTERS : cm->mcomp_filter_type]; |
| 3641 for (i = 0; i < SWITCHABLE_FILTER_CONTEXTS; i++) { | 3610 for (i = 0; i < SWITCHABLE_FILTER_CONTEXTS; i++) { |
| 3642 int64_t adj_rd; | 3611 int64_t adj_rd; |
| 3643 // In cases of poor prediction, filter_cache[] can contain really big | 3612 // In cases of poor prediction, filter_cache[] can contain really big |
| (...skipping 39 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3683 break; | 3652 break; |
| 3684 } | 3653 } |
| 3685 | 3654 |
| 3686 if (best_rd >= best_rd_so_far) | 3655 if (best_rd >= best_rd_so_far) |
| 3687 return INT64_MAX; | 3656 return INT64_MAX; |
| 3688 | 3657 |
| 3689 // If we used an estimate for the uv intra rd in the loop above... | 3658 // If we used an estimate for the uv intra rd in the loop above... |
| 3690 if (cpi->sf.use_uv_intra_rd_estimate) { | 3659 if (cpi->sf.use_uv_intra_rd_estimate) { |
| 3691 // Do Intra UV best rd mode selection if best mode choice above was intra. | 3660 // Do Intra UV best rd mode selection if best mode choice above was intra. |
| 3692 if (vp9_mode_order[best_mode_index].ref_frame == INTRA_FRAME) { | 3661 if (vp9_mode_order[best_mode_index].ref_frame == INTRA_FRAME) { |
| 3693 TX_SIZE uv_tx_size = get_uv_tx_size(mbmi); | 3662 TX_SIZE uv_tx_size; |
| 3694 rd_pick_intra_sbuv_mode(cpi, x, &rate_uv_intra[uv_tx_size], | 3663 *mbmi = best_mbmode; |
| 3664 uv_tx_size = get_uv_tx_size(mbmi); |
| 3665 rd_pick_intra_sbuv_mode(cpi, x, ctx, &rate_uv_intra[uv_tx_size], |
| 3695 &rate_uv_tokenonly[uv_tx_size], | 3666 &rate_uv_tokenonly[uv_tx_size], |
| 3696 &dist_uv[uv_tx_size], | 3667 &dist_uv[uv_tx_size], |
| 3697 &skip_uv[uv_tx_size], | 3668 &skip_uv[uv_tx_size], |
| 3698 bsize < BLOCK_8X8 ? BLOCK_8X8 : bsize); | 3669 bsize < BLOCK_8X8 ? BLOCK_8X8 : bsize, |
| 3670 uv_tx_size); |
| 3699 } | 3671 } |
| 3700 } | 3672 } |
| 3701 | 3673 |
| 3702 // If we are using reference masking and the set mask flag is set then | 3674 // If we are using reference masking and the set mask flag is set then |
| 3703 // create the reference frame mask. | 3675 // create the reference frame mask. |
| 3704 if (cpi->sf.reference_masking && cpi->set_ref_frame_mask) | 3676 if (cpi->sf.reference_masking && cpi->set_ref_frame_mask) |
| 3705 cpi->ref_frame_mask = ~(1 << vp9_mode_order[best_mode_index].ref_frame); | 3677 cpi->ref_frame_mask = ~(1 << vp9_mode_order[best_mode_index].ref_frame); |
| 3706 | 3678 |
| 3707 // Flag all modes that have a distortion thats > 2x the best we found at | 3679 // Flag all modes that have a distortion thats > 2x the best we found at |
| 3708 // this level. | 3680 // this level. |
| 3709 for (mode_index = 0; mode_index < MB_MODE_COUNT; ++mode_index) { | 3681 for (mode_index = 0; mode_index < MB_MODE_COUNT; ++mode_index) { |
| 3710 if (mode_index == NEARESTMV || mode_index == NEARMV || mode_index == NEWMV) | 3682 if (mode_index == NEARESTMV || mode_index == NEARMV || mode_index == NEWMV) |
| 3711 continue; | 3683 continue; |
| 3712 | 3684 |
| 3713 if (mode_distortions[mode_index] > 2 * *returndistortion) { | 3685 if (mode_distortions[mode_index] > 2 * *returndistortion) { |
| 3714 ctx->modes_with_high_error |= (1 << mode_index); | 3686 ctx->modes_with_high_error |= (1 << mode_index); |
| 3715 } | 3687 } |
| 3716 } | 3688 } |
| 3717 | 3689 |
| 3718 // Flag all ref frames that have a distortion thats > 2x the best we found at | 3690 // Flag all ref frames that have a distortion thats > 2x the best we found at |
| 3719 // this level. | 3691 // this level. |
| 3720 for (ref_frame = INTRA_FRAME; ref_frame <= ALTREF_FRAME; ref_frame++) { | 3692 for (ref_frame = INTRA_FRAME; ref_frame <= ALTREF_FRAME; ref_frame++) { |
| 3721 if (frame_distortions[ref_frame] > 2 * *returndistortion) { | 3693 if (frame_distortions[ref_frame] > 2 * *returndistortion) { |
| 3722 ctx->frames_with_high_error |= (1 << ref_frame); | 3694 ctx->frames_with_high_error |= (1 << ref_frame); |
| 3723 } | 3695 } |
| 3724 } | 3696 } |
| 3725 | 3697 |
| 3726 assert((cm->mcomp_filter_type == SWITCHABLE) || | 3698 assert((cm->mcomp_filter_type == SWITCHABLE) || |
| 3727 (cm->mcomp_filter_type == best_mbmode.interp_filter) || | 3699 (cm->mcomp_filter_type == best_mbmode.interp_filter) || |
| 3728 (best_mbmode.ref_frame[0] == INTRA_FRAME)); | 3700 !is_inter_block(&best_mbmode)); |
| 3729 | 3701 |
| 3730 // Updating rd_thresh_freq_fact[] here means that the different | 3702 // Updating rd_thresh_freq_fact[] here means that the different |
| 3731 // partition/block sizes are handled independently based on the best | 3703 // partition/block sizes are handled independently based on the best |
| 3732 // choice for the current partition. It may well be better to keep a scaled | 3704 // choice for the current partition. It may well be better to keep a scaled |
| 3733 // best rd so far value and update rd_thresh_freq_fact based on the mode/size | 3705 // best rd so far value and update rd_thresh_freq_fact based on the mode/size |
| 3734 // combination that wins out. | 3706 // combination that wins out. |
| 3735 if (cpi->sf.adaptive_rd_thresh) { | 3707 if (cpi->sf.adaptive_rd_thresh) { |
| 3736 for (mode_index = 0; mode_index < MAX_MODES; ++mode_index) { | 3708 for (mode_index = 0; mode_index < MAX_MODES; ++mode_index) { |
| 3737 if (mode_index == best_mode_index) { | 3709 if (mode_index == best_mode_index) { |
| 3738 cpi->rd_thresh_freq_fact[bsize][mode_index] -= | 3710 cpi->rd_thresh_freq_fact[bsize][mode_index] -= |
| 3739 (cpi->rd_thresh_freq_fact[bsize][mode_index] >> 3); | 3711 (cpi->rd_thresh_freq_fact[bsize][mode_index] >> 3); |
| 3740 } else { | 3712 } else { |
| 3741 cpi->rd_thresh_freq_fact[bsize][mode_index] += RD_THRESH_INC; | 3713 cpi->rd_thresh_freq_fact[bsize][mode_index] += RD_THRESH_INC; |
| 3742 if (cpi->rd_thresh_freq_fact[bsize][mode_index] > | 3714 if (cpi->rd_thresh_freq_fact[bsize][mode_index] > |
| 3743 (cpi->sf.adaptive_rd_thresh * RD_THRESH_MAX_FACT)) { | 3715 (cpi->sf.adaptive_rd_thresh * RD_THRESH_MAX_FACT)) { |
| 3744 cpi->rd_thresh_freq_fact[bsize][mode_index] = | 3716 cpi->rd_thresh_freq_fact[bsize][mode_index] = |
| 3745 cpi->sf.adaptive_rd_thresh * RD_THRESH_MAX_FACT; | 3717 cpi->sf.adaptive_rd_thresh * RD_THRESH_MAX_FACT; |
| 3746 } | 3718 } |
| 3747 } | 3719 } |
| 3748 } | 3720 } |
| 3749 } | 3721 } |
| 3750 | 3722 |
| 3751 // macroblock modes | 3723 // macroblock modes |
| 3752 *mbmi = best_mbmode; | 3724 *mbmi = best_mbmode; |
| 3753 x->skip |= best_skip2; | 3725 x->skip |= best_skip2; |
| 3754 | 3726 |
| 3755 for (i = 0; i < NB_PREDICTION_TYPES; ++i) { | 3727 for (i = 0; i < REFERENCE_MODES; ++i) { |
| 3756 if (best_pred_rd[i] == INT64_MAX) | 3728 if (best_pred_rd[i] == INT64_MAX) |
| 3757 best_pred_diff[i] = INT_MIN; | 3729 best_pred_diff[i] = INT_MIN; |
| 3758 else | 3730 else |
| 3759 best_pred_diff[i] = best_rd - best_pred_rd[i]; | 3731 best_pred_diff[i] = best_rd - best_pred_rd[i]; |
| 3760 } | 3732 } |
| 3761 | 3733 |
| 3762 if (!x->skip) { | 3734 if (!x->skip) { |
| 3763 for (i = 0; i < SWITCHABLE_FILTER_CONTEXTS; i++) { | 3735 for (i = 0; i < SWITCHABLE_FILTER_CONTEXTS; i++) { |
| 3764 if (best_filter_rd[i] == INT64_MAX) | 3736 if (best_filter_rd[i] == INT64_MAX) |
| 3765 best_filter_diff[i] = 0; | 3737 best_filter_diff[i] = 0; |
| (...skipping 50 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3816 static const int flag_list[4] = { 0, VP9_LAST_FLAG, VP9_GOLD_FLAG, | 3788 static const int flag_list[4] = { 0, VP9_LAST_FLAG, VP9_GOLD_FLAG, |
| 3817 VP9_ALT_FLAG }; | 3789 VP9_ALT_FLAG }; |
| 3818 int idx_list[4] = {0, | 3790 int idx_list[4] = {0, |
| 3819 cpi->lst_fb_idx, | 3791 cpi->lst_fb_idx, |
| 3820 cpi->gld_fb_idx, | 3792 cpi->gld_fb_idx, |
| 3821 cpi->alt_fb_idx}; | 3793 cpi->alt_fb_idx}; |
| 3822 int64_t best_rd = best_rd_so_far; | 3794 int64_t best_rd = best_rd_so_far; |
| 3823 int64_t best_yrd = best_rd_so_far; // FIXME(rbultje) more precise | 3795 int64_t best_yrd = best_rd_so_far; // FIXME(rbultje) more precise |
| 3824 int64_t best_tx_rd[TX_MODES]; | 3796 int64_t best_tx_rd[TX_MODES]; |
| 3825 int64_t best_tx_diff[TX_MODES]; | 3797 int64_t best_tx_diff[TX_MODES]; |
| 3826 int64_t best_pred_diff[NB_PREDICTION_TYPES]; | 3798 int64_t best_pred_diff[REFERENCE_MODES]; |
| 3827 int64_t best_pred_rd[NB_PREDICTION_TYPES]; | 3799 int64_t best_pred_rd[REFERENCE_MODES]; |
| 3828 int64_t best_filter_rd[SWITCHABLE_FILTER_CONTEXTS]; | 3800 int64_t best_filter_rd[SWITCHABLE_FILTER_CONTEXTS]; |
| 3829 int64_t best_filter_diff[SWITCHABLE_FILTER_CONTEXTS]; | 3801 int64_t best_filter_diff[SWITCHABLE_FILTER_CONTEXTS]; |
| 3830 MB_MODE_INFO best_mbmode = { 0 }; | 3802 MB_MODE_INFO best_mbmode = { 0 }; |
| 3831 int mode_index, best_mode_index = 0; | 3803 int mode_index, best_mode_index = 0; |
| 3832 unsigned int ref_costs_single[MAX_REF_FRAMES], ref_costs_comp[MAX_REF_FRAMES]; | 3804 unsigned int ref_costs_single[MAX_REF_FRAMES], ref_costs_comp[MAX_REF_FRAMES]; |
| 3833 vp9_prob comp_mode_p; | 3805 vp9_prob comp_mode_p; |
| 3834 int64_t best_inter_rd = INT64_MAX; | 3806 int64_t best_inter_rd = INT64_MAX; |
| 3835 MV_REFERENCE_FRAME best_inter_ref_frame = LAST_FRAME; | 3807 MV_REFERENCE_FRAME best_inter_ref_frame = LAST_FRAME; |
| 3836 INTERPOLATION_TYPE tmp_best_filter = SWITCHABLE; | 3808 INTERPOLATION_TYPE tmp_best_filter = SWITCHABLE; |
| 3837 int rate_uv_intra[TX_SIZES], rate_uv_tokenonly[TX_SIZES]; | 3809 int rate_uv_intra[TX_SIZES], rate_uv_tokenonly[TX_SIZES]; |
| 3838 int64_t dist_uv[TX_SIZES]; | 3810 int64_t dist_uv[TX_SIZES]; |
| 3839 int skip_uv[TX_SIZES]; | 3811 int skip_uv[TX_SIZES]; |
| 3840 MB_PREDICTION_MODE mode_uv[TX_SIZES] = { 0 }; | 3812 MB_PREDICTION_MODE mode_uv[TX_SIZES] = { 0 }; |
| 3841 struct scale_factors scale_factor[4]; | 3813 struct scale_factors scale_factor[4]; |
| 3842 unsigned int ref_frame_mask = 0; | |
| 3843 unsigned int mode_mask = 0; | |
| 3844 int intra_cost_penalty = 20 * vp9_dc_quant(cpi->common.base_qindex, | 3814 int intra_cost_penalty = 20 * vp9_dc_quant(cpi->common.base_qindex, |
| 3845 cpi->common.y_dc_delta_q); | 3815 cpi->common.y_dc_delta_q); |
| 3846 int_mv seg_mvs[4][MAX_REF_FRAMES]; | 3816 int_mv seg_mvs[4][MAX_REF_FRAMES]; |
| 3847 b_mode_info best_bmodes[4]; | 3817 b_mode_info best_bmodes[4]; |
| 3848 int best_skip2 = 0; | 3818 int best_skip2 = 0; |
| 3849 | 3819 |
| 3850 x->skip_encode = cpi->sf.skip_encode_frame && xd->q_index < QIDX_SKIP_THRESH; | 3820 x->skip_encode = cpi->sf.skip_encode_frame && x->q_index < QIDX_SKIP_THRESH; |
| 3851 vpx_memset(x->zcoeff_blk[TX_4X4], 0, 4); | 3821 vpx_memset(x->zcoeff_blk[TX_4X4], 0, 4); |
| 3852 | 3822 |
| 3853 for (i = 0; i < 4; i++) { | 3823 for (i = 0; i < 4; i++) { |
| 3854 int j; | 3824 int j; |
| 3855 for (j = 0; j < MAX_REF_FRAMES; j++) | 3825 for (j = 0; j < MAX_REF_FRAMES; j++) |
| 3856 seg_mvs[i][j].as_int = INVALID_MV; | 3826 seg_mvs[i][j].as_int = INVALID_MV; |
| 3857 } | 3827 } |
| 3858 | 3828 |
| 3859 estimate_ref_frame_costs(cpi, segment_id, ref_costs_single, ref_costs_comp, | 3829 estimate_ref_frame_costs(cpi, segment_id, ref_costs_single, ref_costs_comp, |
| 3860 &comp_mode_p); | 3830 &comp_mode_p); |
| 3861 | 3831 |
| 3862 for (i = 0; i < NB_PREDICTION_TYPES; ++i) | 3832 for (i = 0; i < REFERENCE_MODES; ++i) |
| 3863 best_pred_rd[i] = INT64_MAX; | 3833 best_pred_rd[i] = INT64_MAX; |
| 3864 for (i = 0; i < TX_MODES; i++) | 3834 for (i = 0; i < TX_MODES; i++) |
| 3865 best_tx_rd[i] = INT64_MAX; | 3835 best_tx_rd[i] = INT64_MAX; |
| 3866 for (i = 0; i < SWITCHABLE_FILTER_CONTEXTS; i++) | 3836 for (i = 0; i < SWITCHABLE_FILTER_CONTEXTS; i++) |
| 3867 best_filter_rd[i] = INT64_MAX; | 3837 best_filter_rd[i] = INT64_MAX; |
| 3868 for (i = 0; i < TX_SIZES; i++) | 3838 for (i = 0; i < TX_SIZES; i++) |
| 3869 rate_uv_intra[i] = INT_MAX; | 3839 rate_uv_intra[i] = INT_MAX; |
| 3870 | 3840 |
| 3871 *returnrate = INT_MAX; | 3841 *returnrate = INT_MAX; |
| 3872 | 3842 |
| 3873 // Create a mask set to 1 for each reference frame used by a smaller | |
| 3874 // resolution. | |
| 3875 if (cpi->sf.use_avoid_tested_higherror) { | |
| 3876 ref_frame_mask = 0; | |
| 3877 mode_mask = 0; | |
| 3878 ref_frame_mask = ~ref_frame_mask; | |
| 3879 mode_mask = ~mode_mask; | |
| 3880 } | |
| 3881 | |
| 3882 for (ref_frame = LAST_FRAME; ref_frame <= ALTREF_FRAME; ref_frame++) { | 3843 for (ref_frame = LAST_FRAME; ref_frame <= ALTREF_FRAME; ref_frame++) { |
| 3883 if (cpi->ref_frame_flags & flag_list[ref_frame]) { | 3844 if (cpi->ref_frame_flags & flag_list[ref_frame]) { |
| 3884 setup_buffer_inter(cpi, x, tile, idx_list[ref_frame], ref_frame, | 3845 setup_buffer_inter(cpi, x, tile, idx_list[ref_frame], ref_frame, |
| 3885 block_size, mi_row, mi_col, | 3846 block_size, mi_row, mi_col, |
| 3886 frame_mv[NEARESTMV], frame_mv[NEARMV], | 3847 frame_mv[NEARESTMV], frame_mv[NEARMV], |
| 3887 yv12_mb, scale_factor); | 3848 yv12_mb, scale_factor); |
| 3888 } | 3849 } |
| 3889 frame_mv[NEWMV][ref_frame].as_int = INVALID_MV; | 3850 frame_mv[NEWMV][ref_frame].as_int = INVALID_MV; |
| 3890 frame_mv[ZEROMV][ref_frame].as_int = 0; | 3851 frame_mv[ZEROMV][ref_frame].as_int = 0; |
| 3891 } | 3852 } |
| (...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3923 cpi->mode_skip_mask = 0x0010; | 3884 cpi->mode_skip_mask = 0x0010; |
| 3924 break; | 3885 break; |
| 3925 case GOLDEN_FRAME: | 3886 case GOLDEN_FRAME: |
| 3926 cpi->mode_skip_mask = 0x0008; | 3887 cpi->mode_skip_mask = 0x0008; |
| 3927 break; | 3888 break; |
| 3928 case ALTREF_FRAME: | 3889 case ALTREF_FRAME: |
| 3929 cpi->mode_skip_mask = 0x0000; | 3890 cpi->mode_skip_mask = 0x0000; |
| 3930 break; | 3891 break; |
| 3931 case NONE: | 3892 case NONE: |
| 3932 case MAX_REF_FRAMES: | 3893 case MAX_REF_FRAMES: |
| 3933 assert(!"Invalid Reference frame"); | 3894 assert(0 && "Invalid Reference frame"); |
| 3934 } | 3895 } |
| 3935 } | 3896 } |
| 3936 if (cpi->mode_skip_mask & ((int64_t)1 << mode_index)) | 3897 if (cpi->mode_skip_mask & ((int64_t)1 << mode_index)) |
| 3937 continue; | 3898 continue; |
| 3938 } | 3899 } |
| 3939 | 3900 |
| 3940 // Skip if the current reference frame has been masked off | 3901 // Skip if the current reference frame has been masked off |
| 3941 if (cpi->sf.reference_masking && !cpi->set_ref_frame_mask && | 3902 if (cpi->sf.reference_masking && !cpi->set_ref_frame_mask && |
| 3942 (cpi->ref_frame_mask & (1 << ref_frame))) | 3903 (cpi->ref_frame_mask & (1 << ref_frame))) |
| 3943 continue; | 3904 continue; |
| (...skipping 50 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3994 // Evaluate all sub-pel filters irrespective of whether we can use | 3955 // Evaluate all sub-pel filters irrespective of whether we can use |
| 3995 // them for this frame. | 3956 // them for this frame. |
| 3996 mbmi->interp_filter = cm->mcomp_filter_type; | 3957 mbmi->interp_filter = cm->mcomp_filter_type; |
| 3997 vp9_setup_interp_filters(xd, mbmi->interp_filter, &cpi->common); | 3958 vp9_setup_interp_filters(xd, mbmi->interp_filter, &cpi->common); |
| 3998 | 3959 |
| 3999 if (comp_pred) { | 3960 if (comp_pred) { |
| 4000 if (!(cpi->ref_frame_flags & flag_list[second_ref_frame])) | 3961 if (!(cpi->ref_frame_flags & flag_list[second_ref_frame])) |
| 4001 continue; | 3962 continue; |
| 4002 set_scale_factors(xd, ref_frame, second_ref_frame, scale_factor); | 3963 set_scale_factors(xd, ref_frame, second_ref_frame, scale_factor); |
| 4003 | 3964 |
| 4004 mode_excluded = mode_excluded | 3965 mode_excluded = mode_excluded ? mode_excluded |
| 4005 ? mode_excluded | 3966 : cm->reference_mode == SINGLE_REFERENCE; |
| 4006 : cm->comp_pred_mode == SINGLE_PREDICTION_ONLY; | |
| 4007 } else { | 3967 } else { |
| 4008 if (ref_frame != INTRA_FRAME && second_ref_frame != INTRA_FRAME) { | 3968 if (ref_frame != INTRA_FRAME && second_ref_frame != INTRA_FRAME) { |
| 4009 mode_excluded = | 3969 mode_excluded = mode_excluded ? |
| 4010 mode_excluded ? | 3970 mode_excluded : cm->reference_mode == COMPOUND_REFERENCE; |
| 4011 mode_excluded : cm->comp_pred_mode == COMP_PREDICTION_ONLY; | |
| 4012 } | 3971 } |
| 4013 } | 3972 } |
| 4014 | 3973 |
| 4015 // Select prediction reference frames. | 3974 // Select prediction reference frames. |
| 4016 for (i = 0; i < MAX_MB_PLANE; i++) { | 3975 for (i = 0; i < MAX_MB_PLANE; i++) { |
| 4017 xd->plane[i].pre[0] = yv12_mb[ref_frame][i]; | 3976 xd->plane[i].pre[0] = yv12_mb[ref_frame][i]; |
| 4018 if (comp_pred) | 3977 if (comp_pred) |
| 4019 xd->plane[i].pre[1] = yv12_mb[second_ref_frame][i]; | 3978 xd->plane[i].pre[1] = yv12_mb[second_ref_frame][i]; |
| 4020 } | 3979 } |
| 4021 | 3980 |
| (...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 4053 int rate; | 4012 int rate; |
| 4054 mbmi->tx_size = TX_4X4; | 4013 mbmi->tx_size = TX_4X4; |
| 4055 if (rd_pick_intra_sub_8x8_y_mode(cpi, x, &rate, &rate_y, | 4014 if (rd_pick_intra_sub_8x8_y_mode(cpi, x, &rate, &rate_y, |
| 4056 &distortion_y, best_rd) >= best_rd) | 4015 &distortion_y, best_rd) >= best_rd) |
| 4057 continue; | 4016 continue; |
| 4058 rate2 += rate; | 4017 rate2 += rate; |
| 4059 rate2 += intra_cost_penalty; | 4018 rate2 += intra_cost_penalty; |
| 4060 distortion2 += distortion_y; | 4019 distortion2 += distortion_y; |
| 4061 | 4020 |
| 4062 if (rate_uv_intra[TX_4X4] == INT_MAX) { | 4021 if (rate_uv_intra[TX_4X4] == INT_MAX) { |
| 4063 choose_intra_uv_mode(cpi, bsize, &rate_uv_intra[TX_4X4], | 4022 choose_intra_uv_mode(cpi, ctx, bsize, TX_4X4, |
| 4023 &rate_uv_intra[TX_4X4], |
| 4064 &rate_uv_tokenonly[TX_4X4], | 4024 &rate_uv_tokenonly[TX_4X4], |
| 4065 &dist_uv[TX_4X4], &skip_uv[TX_4X4], | 4025 &dist_uv[TX_4X4], &skip_uv[TX_4X4], |
| 4066 &mode_uv[TX_4X4]); | 4026 &mode_uv[TX_4X4]); |
| 4067 } | 4027 } |
| 4068 rate2 += rate_uv_intra[TX_4X4]; | 4028 rate2 += rate_uv_intra[TX_4X4]; |
| 4069 rate_uv = rate_uv_tokenonly[TX_4X4]; | 4029 rate_uv = rate_uv_tokenonly[TX_4X4]; |
| 4070 distortion2 += dist_uv[TX_4X4]; | 4030 distortion2 += dist_uv[TX_4X4]; |
| 4071 distortion_uv = dist_uv[TX_4X4]; | 4031 distortion_uv = dist_uv[TX_4X4]; |
| 4072 mbmi->uv_mode = mode_uv[TX_4X4]; | 4032 mbmi->uv_mode = mode_uv[TX_4X4]; |
| 4073 tx_cache[ONLY_4X4] = RDCOST(x->rdmult, x->rddiv, rate2, distortion2); | 4033 tx_cache[ONLY_4X4] = RDCOST(x->rdmult, x->rddiv, rate2, distortion2); |
| (...skipping 23 matching lines...) Expand all Loading... |
| 4097 cpi->rd_thresh_sub8x8[segment_id][bsize][THR_GOLD] : this_rd_thresh; | 4057 cpi->rd_thresh_sub8x8[segment_id][bsize][THR_GOLD] : this_rd_thresh; |
| 4098 xd->mi_8x8[0]->mbmi.tx_size = TX_4X4; | 4058 xd->mi_8x8[0]->mbmi.tx_size = TX_4X4; |
| 4099 | 4059 |
| 4100 cpi->rd_filter_cache[SWITCHABLE_FILTERS] = INT64_MAX; | 4060 cpi->rd_filter_cache[SWITCHABLE_FILTERS] = INT64_MAX; |
| 4101 if (cm->mcomp_filter_type != BILINEAR) { | 4061 if (cm->mcomp_filter_type != BILINEAR) { |
| 4102 tmp_best_filter = EIGHTTAP; | 4062 tmp_best_filter = EIGHTTAP; |
| 4103 if (x->source_variance < | 4063 if (x->source_variance < |
| 4104 cpi->sf.disable_filter_search_var_thresh) { | 4064 cpi->sf.disable_filter_search_var_thresh) { |
| 4105 tmp_best_filter = EIGHTTAP; | 4065 tmp_best_filter = EIGHTTAP; |
| 4106 vp9_zero(cpi->rd_filter_cache); | 4066 vp9_zero(cpi->rd_filter_cache); |
| 4067 } else if (cpi->sf.adaptive_pred_filter_type == 1 && |
| 4068 ctx->pred_filter_type < SWITCHABLE) { |
| 4069 tmp_best_filter = ctx->pred_filter_type; |
| 4070 vp9_zero(cpi->rd_filter_cache); |
| 4071 } else if (cpi->sf.adaptive_pred_filter_type == 2) { |
| 4072 tmp_best_filter = ctx->pred_filter_type < SWITCHABLE ? |
| 4073 ctx->pred_filter_type : 0; |
| 4074 vp9_zero(cpi->rd_filter_cache); |
| 4107 } else { | 4075 } else { |
| 4108 for (switchable_filter_index = 0; | 4076 for (switchable_filter_index = 0; |
| 4109 switchable_filter_index < SWITCHABLE_FILTERS; | 4077 switchable_filter_index < SWITCHABLE_FILTERS; |
| 4110 ++switchable_filter_index) { | 4078 ++switchable_filter_index) { |
| 4111 int newbest, rs; | 4079 int newbest, rs; |
| 4112 int64_t rs_rd; | 4080 int64_t rs_rd; |
| 4113 mbmi->interp_filter = switchable_filter_index; | 4081 mbmi->interp_filter = switchable_filter_index; |
| 4114 vp9_setup_interp_filters(xd, mbmi->interp_filter, &cpi->common); | 4082 vp9_setup_interp_filters(xd, mbmi->interp_filter, &cpi->common); |
| 4115 | 4083 |
| 4116 tmp_rd = rd_pick_best_mbsegmentation(cpi, x, tile, | 4084 tmp_rd = rd_pick_best_mbsegmentation(cpi, x, tile, |
| (...skipping 27 matching lines...) Expand all Loading... |
| 4144 cm->mcomp_filter_type != SWITCHABLE)) { | 4112 cm->mcomp_filter_type != SWITCHABLE)) { |
| 4145 tmp_best_rdu = tmp_rd; | 4113 tmp_best_rdu = tmp_rd; |
| 4146 tmp_best_rate = rate; | 4114 tmp_best_rate = rate; |
| 4147 tmp_best_ratey = rate_y; | 4115 tmp_best_ratey = rate_y; |
| 4148 tmp_best_distortion = distortion; | 4116 tmp_best_distortion = distortion; |
| 4149 tmp_best_sse = total_sse; | 4117 tmp_best_sse = total_sse; |
| 4150 tmp_best_skippable = skippable; | 4118 tmp_best_skippable = skippable; |
| 4151 tmp_best_mbmode = *mbmi; | 4119 tmp_best_mbmode = *mbmi; |
| 4152 for (i = 0; i < 4; i++) { | 4120 for (i = 0; i < 4; i++) { |
| 4153 tmp_best_bmodes[i] = xd->mi_8x8[0]->bmi[i]; | 4121 tmp_best_bmodes[i] = xd->mi_8x8[0]->bmi[i]; |
| 4154 x->zcoeff_blk[TX_4X4][i] = !xd->plane[0].eobs[i]; | 4122 x->zcoeff_blk[TX_4X4][i] = !x->plane[0].eobs[i]; |
| 4155 } | 4123 } |
| 4156 pred_exists = 1; | 4124 pred_exists = 1; |
| 4157 if (switchable_filter_index == 0 && | 4125 if (switchable_filter_index == 0 && |
| 4158 cpi->sf.use_rd_breakout && | 4126 cpi->sf.use_rd_breakout && |
| 4159 best_rd < INT64_MAX) { | 4127 best_rd < INT64_MAX) { |
| 4160 if (tmp_best_rdu / 2 > best_rd) { | 4128 if (tmp_best_rdu / 2 > best_rd) { |
| 4161 // skip searching the other filters if the first is | 4129 // skip searching the other filters if the first is |
| 4162 // already substantially larger than the best so far | 4130 // already substantially larger than the best so far |
| 4163 tmp_best_filter = mbmi->interp_filter; | 4131 tmp_best_filter = mbmi->interp_filter; |
| 4164 tmp_best_rdu = INT64_MAX; | 4132 tmp_best_rdu = INT64_MAX; |
| 4165 break; | 4133 break; |
| 4166 } | 4134 } |
| 4167 } | 4135 } |
| 4168 } | 4136 } |
| 4169 } // switchable_filter_index loop | 4137 } // switchable_filter_index loop |
| 4170 } | 4138 } |
| 4171 } | 4139 } |
| 4172 | 4140 |
| 4173 if (tmp_best_rdu == INT64_MAX) | 4141 if (tmp_best_rdu == INT64_MAX && pred_exists) |
| 4174 continue; | 4142 continue; |
| 4175 | 4143 |
| 4176 mbmi->interp_filter = (cm->mcomp_filter_type == SWITCHABLE ? | 4144 mbmi->interp_filter = (cm->mcomp_filter_type == SWITCHABLE ? |
| 4177 tmp_best_filter : cm->mcomp_filter_type); | 4145 tmp_best_filter : cm->mcomp_filter_type); |
| 4178 vp9_setup_interp_filters(xd, mbmi->interp_filter, &cpi->common); | 4146 vp9_setup_interp_filters(xd, mbmi->interp_filter, &cpi->common); |
| 4179 if (!pred_exists) { | 4147 if (!pred_exists) { |
| 4180 // Handles the special case when a filter that is not in the | 4148 // Handles the special case when a filter that is not in the |
| 4181 // switchable list (bilinear, 6-tap) is indicated at the frame level | 4149 // switchable list (bilinear, 6-tap) is indicated at the frame level |
| 4182 tmp_rd = rd_pick_best_mbsegmentation(cpi, x, tile, | 4150 tmp_rd = rd_pick_best_mbsegmentation(cpi, x, tile, |
| 4183 &mbmi->ref_mvs[ref_frame][0], | 4151 &mbmi->ref_mvs[ref_frame][0], |
| (...skipping 21 matching lines...) Expand all Loading... |
| 4205 for (i = 0; i < 4; i++) | 4173 for (i = 0; i < 4; i++) |
| 4206 xd->mi_8x8[0]->bmi[i] = tmp_best_bmodes[i]; | 4174 xd->mi_8x8[0]->bmi[i] = tmp_best_bmodes[i]; |
| 4207 } | 4175 } |
| 4208 | 4176 |
| 4209 rate2 += rate; | 4177 rate2 += rate; |
| 4210 distortion2 += distortion; | 4178 distortion2 += distortion; |
| 4211 | 4179 |
| 4212 if (cpi->common.mcomp_filter_type == SWITCHABLE) | 4180 if (cpi->common.mcomp_filter_type == SWITCHABLE) |
| 4213 rate2 += get_switchable_rate(x); | 4181 rate2 += get_switchable_rate(x); |
| 4214 | 4182 |
| 4215 if (!mode_excluded) { | 4183 if (!mode_excluded) |
| 4216 if (comp_pred) | 4184 mode_excluded = comp_pred |
| 4217 mode_excluded = cpi->common.comp_pred_mode == SINGLE_PREDICTION_ONLY; | 4185 ? cpi->common.reference_mode == SINGLE_REFERENCE |
| 4218 else | 4186 : cpi->common.reference_mode == COMPOUND_REFERENCE; |
| 4219 mode_excluded = cpi->common.comp_pred_mode == COMP_PREDICTION_ONLY; | 4187 |
| 4220 } | |
| 4221 compmode_cost = vp9_cost_bit(comp_mode_p, comp_pred); | 4188 compmode_cost = vp9_cost_bit(comp_mode_p, comp_pred); |
| 4222 | 4189 |
| 4223 tmp_best_rdu = best_rd - | 4190 tmp_best_rdu = best_rd - |
| 4224 MIN(RDCOST(x->rdmult, x->rddiv, rate2, distortion2), | 4191 MIN(RDCOST(x->rdmult, x->rddiv, rate2, distortion2), |
| 4225 RDCOST(x->rdmult, x->rddiv, 0, total_sse)); | 4192 RDCOST(x->rdmult, x->rddiv, 0, total_sse)); |
| 4226 | 4193 |
| 4227 if (tmp_best_rdu > 0) { | 4194 if (tmp_best_rdu > 0) { |
| 4228 // If even the 'Y' rd value of split is higher than best so far | 4195 // If even the 'Y' rd value of split is higher than best so far |
| 4229 // then dont bother looking at UV | 4196 // then dont bother looking at UV |
| 4230 vp9_build_inter_predictors_sbuv(&x->e_mbd, mi_row, mi_col, | 4197 vp9_build_inter_predictors_sbuv(&x->e_mbd, mi_row, mi_col, |
| 4231 BLOCK_8X8); | 4198 BLOCK_8X8); |
| 4232 super_block_uvrd(cpi, x, &rate_uv, &distortion_uv, &uv_skippable, | 4199 super_block_uvrd(cpi, x, &rate_uv, &distortion_uv, &uv_skippable, |
| 4233 &uv_sse, BLOCK_8X8, tmp_best_rdu); | 4200 &uv_sse, BLOCK_8X8, tmp_best_rdu); |
| 4234 if (rate_uv == INT_MAX) | 4201 if (rate_uv == INT_MAX) |
| 4235 continue; | 4202 continue; |
| 4236 rate2 += rate_uv; | 4203 rate2 += rate_uv; |
| 4237 distortion2 += distortion_uv; | 4204 distortion2 += distortion_uv; |
| 4238 skippable = skippable && uv_skippable; | 4205 skippable = skippable && uv_skippable; |
| 4239 total_sse += uv_sse; | 4206 total_sse += uv_sse; |
| 4240 | 4207 |
| 4241 tx_cache[ONLY_4X4] = RDCOST(x->rdmult, x->rddiv, rate2, distortion2); | 4208 tx_cache[ONLY_4X4] = RDCOST(x->rdmult, x->rddiv, rate2, distortion2); |
| 4242 for (i = 0; i < TX_MODES; ++i) | 4209 for (i = 0; i < TX_MODES; ++i) |
| 4243 tx_cache[i] = tx_cache[ONLY_4X4]; | 4210 tx_cache[i] = tx_cache[ONLY_4X4]; |
| 4244 } | 4211 } |
| 4245 } | 4212 } |
| 4246 | 4213 |
| 4247 if (cpi->common.comp_pred_mode == HYBRID_PREDICTION) { | 4214 if (cpi->common.reference_mode == REFERENCE_MODE_SELECT) |
| 4248 rate2 += compmode_cost; | 4215 rate2 += compmode_cost; |
| 4249 } | |
| 4250 | 4216 |
| 4251 // Estimate the reference frame signaling cost and add it | 4217 // Estimate the reference frame signaling cost and add it |
| 4252 // to the rolling cost variable. | 4218 // to the rolling cost variable. |
| 4253 if (second_ref_frame > INTRA_FRAME) { | 4219 if (second_ref_frame > INTRA_FRAME) { |
| 4254 rate2 += ref_costs_comp[ref_frame]; | 4220 rate2 += ref_costs_comp[ref_frame]; |
| 4255 } else { | 4221 } else { |
| 4256 rate2 += ref_costs_single[ref_frame]; | 4222 rate2 += ref_costs_single[ref_frame]; |
| 4257 } | 4223 } |
| 4258 | 4224 |
| 4259 if (!disable_skip) { | 4225 if (!disable_skip) { |
| 4260 // Test for the condition where skip block will be activated | 4226 // Test for the condition where skip block will be activated |
| 4261 // because there are no non zero coefficients and make any | 4227 // because there are no non zero coefficients and make any |
| 4262 // necessary adjustment for rate. Ignore if skip is coded at | 4228 // necessary adjustment for rate. Ignore if skip is coded at |
| 4263 // segment level as the cost wont have been added in. | 4229 // segment level as the cost wont have been added in. |
| 4264 // Is Mb level skip allowed (i.e. not coded at segment level). | 4230 // Is Mb level skip allowed (i.e. not coded at segment level). |
| 4265 const int mb_skip_allowed = !vp9_segfeature_active(seg, segment_id, | 4231 const int mb_skip_allowed = !vp9_segfeature_active(seg, segment_id, |
| 4266 SEG_LVL_SKIP); | 4232 SEG_LVL_SKIP); |
| 4267 | 4233 |
| 4268 if (mb_skip_allowed && ref_frame != INTRA_FRAME && !xd->lossless) { | 4234 if (mb_skip_allowed && ref_frame != INTRA_FRAME && !xd->lossless) { |
| 4269 if (RDCOST(x->rdmult, x->rddiv, rate_y + rate_uv, distortion2) < | 4235 if (RDCOST(x->rdmult, x->rddiv, rate_y + rate_uv, distortion2) < |
| 4270 RDCOST(x->rdmult, x->rddiv, 0, total_sse)) { | 4236 RDCOST(x->rdmult, x->rddiv, 0, total_sse)) { |
| 4271 // Add in the cost of the no skip flag. | 4237 // Add in the cost of the no skip flag. |
| 4272 int prob_skip_cost = vp9_cost_bit(vp9_get_pred_prob_mbskip(cm, xd), | 4238 rate2 += vp9_cost_bit(vp9_get_skip_prob(cm, xd), 0); |
| 4273 0); | |
| 4274 rate2 += prob_skip_cost; | |
| 4275 } else { | 4239 } else { |
| 4276 // FIXME(rbultje) make this work for splitmv also | 4240 // FIXME(rbultje) make this work for splitmv also |
| 4277 int prob_skip_cost = vp9_cost_bit(vp9_get_pred_prob_mbskip(cm, xd), | 4241 rate2 += vp9_cost_bit(vp9_get_skip_prob(cm, xd), 1); |
| 4278 1); | |
| 4279 rate2 += prob_skip_cost; | |
| 4280 distortion2 = total_sse; | 4242 distortion2 = total_sse; |
| 4281 assert(total_sse >= 0); | 4243 assert(total_sse >= 0); |
| 4282 rate2 -= (rate_y + rate_uv); | 4244 rate2 -= (rate_y + rate_uv); |
| 4283 rate_y = 0; | 4245 rate_y = 0; |
| 4284 rate_uv = 0; | 4246 rate_uv = 0; |
| 4285 this_skip2 = 1; | 4247 this_skip2 = 1; |
| 4286 } | 4248 } |
| 4287 } else if (mb_skip_allowed) { | 4249 } else if (mb_skip_allowed) { |
| 4288 // Add in the cost of the no skip flag. | 4250 // Add in the cost of the no skip flag. |
| 4289 int prob_skip_cost = vp9_cost_bit(vp9_get_pred_prob_mbskip(cm, xd), | 4251 rate2 += vp9_cost_bit(vp9_get_skip_prob(cm, xd), 0); |
| 4290 0); | |
| 4291 rate2 += prob_skip_cost; | |
| 4292 } | 4252 } |
| 4293 | 4253 |
| 4294 // Calculate the final RD estimate for this mode. | 4254 // Calculate the final RD estimate for this mode. |
| 4295 this_rd = RDCOST(x->rdmult, x->rddiv, rate2, distortion2); | 4255 this_rd = RDCOST(x->rdmult, x->rddiv, rate2, distortion2); |
| 4296 } | 4256 } |
| 4297 | 4257 |
| 4298 // Keep record of best inter rd with single reference | 4258 // Keep record of best inter rd with single reference |
| 4299 if (xd->mi_8x8[0]->mbmi.ref_frame[0] > INTRA_FRAME && | 4259 if (is_inter_block(&xd->mi_8x8[0]->mbmi) && |
| 4300 xd->mi_8x8[0]->mbmi.ref_frame[1] == NONE && | 4260 !has_second_ref(&xd->mi_8x8[0]->mbmi) && |
| 4301 !mode_excluded && | 4261 !mode_excluded && |
| 4302 this_rd < best_inter_rd) { | 4262 this_rd < best_inter_rd) { |
| 4303 best_inter_rd = this_rd; | 4263 best_inter_rd = this_rd; |
| 4304 best_inter_ref_frame = ref_frame; | 4264 best_inter_ref_frame = ref_frame; |
| 4305 } | 4265 } |
| 4306 | 4266 |
| 4307 if (!disable_skip && ref_frame == INTRA_FRAME) { | 4267 if (!disable_skip && ref_frame == INTRA_FRAME) { |
| 4308 for (i = 0; i < NB_PREDICTION_TYPES; ++i) | 4268 for (i = 0; i < REFERENCE_MODES; ++i) |
| 4309 best_pred_rd[i] = MIN(best_pred_rd[i], this_rd); | 4269 best_pred_rd[i] = MIN(best_pred_rd[i], this_rd); |
| 4310 for (i = 0; i < SWITCHABLE_FILTER_CONTEXTS; i++) | 4270 for (i = 0; i < SWITCHABLE_FILTER_CONTEXTS; i++) |
| 4311 best_filter_rd[i] = MIN(best_filter_rd[i], this_rd); | 4271 best_filter_rd[i] = MIN(best_filter_rd[i], this_rd); |
| 4312 } | 4272 } |
| 4313 | 4273 |
| 4314 // Did this mode help.. i.e. is it the new best mode | 4274 // Did this mode help.. i.e. is it the new best mode |
| 4315 if (this_rd < best_rd || x->skip) { | 4275 if (this_rd < best_rd || x->skip) { |
| 4316 if (!mode_excluded) { | 4276 if (!mode_excluded) { |
| 4277 int max_plane = MAX_MB_PLANE; |
| 4317 // Note index of best mode so far | 4278 // Note index of best mode so far |
| 4318 best_mode_index = mode_index; | 4279 best_mode_index = mode_index; |
| 4319 | 4280 |
| 4320 if (ref_frame == INTRA_FRAME) { | 4281 if (ref_frame == INTRA_FRAME) { |
| 4321 /* required for left and above block mv */ | 4282 /* required for left and above block mv */ |
| 4322 mbmi->mv[0].as_int = 0; | 4283 mbmi->mv[0].as_int = 0; |
| 4284 max_plane = 1; |
| 4323 } | 4285 } |
| 4324 | 4286 |
| 4325 *returnrate = rate2; | 4287 *returnrate = rate2; |
| 4326 *returndistortion = distortion2; | 4288 *returndistortion = distortion2; |
| 4327 best_rd = this_rd; | 4289 best_rd = this_rd; |
| 4328 best_yrd = best_rd - | 4290 best_yrd = best_rd - |
| 4329 RDCOST(x->rdmult, x->rddiv, rate_uv, distortion_uv); | 4291 RDCOST(x->rdmult, x->rddiv, rate_uv, distortion_uv); |
| 4330 best_mbmode = *mbmi; | 4292 best_mbmode = *mbmi; |
| 4331 best_skip2 = this_skip2; | 4293 best_skip2 = this_skip2; |
| 4294 if (!x->select_txfm_size) |
| 4295 swap_block_ptr(x, ctx, max_plane); |
| 4332 vpx_memcpy(ctx->zcoeff_blk, x->zcoeff_blk[mbmi->tx_size], | 4296 vpx_memcpy(ctx->zcoeff_blk, x->zcoeff_blk[mbmi->tx_size], |
| 4333 sizeof(uint8_t) * ctx->num_4x4_blk); | 4297 sizeof(uint8_t) * ctx->num_4x4_blk); |
| 4334 | 4298 |
| 4335 for (i = 0; i < 4; i++) | 4299 for (i = 0; i < 4; i++) |
| 4336 best_bmodes[i] = xd->mi_8x8[0]->bmi[i]; | 4300 best_bmodes[i] = xd->mi_8x8[0]->bmi[i]; |
| 4337 | 4301 |
| 4338 // TODO(debargha): enhance this test with a better distortion prediction | 4302 // TODO(debargha): enhance this test with a better distortion prediction |
| 4339 // based on qp, activity mask and history | 4303 // based on qp, activity mask and history |
| 4340 if ((cpi->sf.mode_search_skip_flags & FLAG_EARLY_TERMINATE) && | 4304 if ((cpi->sf.mode_search_skip_flags & FLAG_EARLY_TERMINATE) && |
| 4341 (mode_index > MIN_EARLY_TERM_INDEX)) { | 4305 (mode_index > MIN_EARLY_TERM_INDEX)) { |
| 4342 const int qstep = xd->plane[0].dequant[1]; | 4306 const int qstep = xd->plane[0].dequant[1]; |
| 4343 // TODO(debargha): Enhance this by specializing for each mode_index | 4307 // TODO(debargha): Enhance this by specializing for each mode_index |
| 4344 int scale = 4; | 4308 int scale = 4; |
| 4345 if (x->source_variance < UINT_MAX) { | 4309 if (x->source_variance < UINT_MAX) { |
| 4346 const int var_adjust = (x->source_variance < 16); | 4310 const int var_adjust = (x->source_variance < 16); |
| 4347 scale -= var_adjust; | 4311 scale -= var_adjust; |
| 4348 } | 4312 } |
| 4349 if (ref_frame > INTRA_FRAME && | 4313 if (ref_frame > INTRA_FRAME && |
| 4350 distortion2 * scale < qstep * qstep) { | 4314 distortion2 * scale < qstep * qstep) { |
| 4351 early_term = 1; | 4315 early_term = 1; |
| 4352 } | 4316 } |
| 4353 } | 4317 } |
| 4354 } | 4318 } |
| 4355 } | 4319 } |
| 4356 | 4320 |
| 4357 /* keep record of best compound/single-only prediction */ | 4321 /* keep record of best compound/single-only prediction */ |
| 4358 if (!disable_skip && ref_frame != INTRA_FRAME) { | 4322 if (!disable_skip && ref_frame != INTRA_FRAME) { |
| 4359 int single_rd, hybrid_rd, single_rate, hybrid_rate; | 4323 int64_t single_rd, hybrid_rd, single_rate, hybrid_rate; |
| 4360 | 4324 |
| 4361 if (cpi->common.comp_pred_mode == HYBRID_PREDICTION) { | 4325 if (cpi->common.reference_mode == REFERENCE_MODE_SELECT) { |
| 4362 single_rate = rate2 - compmode_cost; | 4326 single_rate = rate2 - compmode_cost; |
| 4363 hybrid_rate = rate2; | 4327 hybrid_rate = rate2; |
| 4364 } else { | 4328 } else { |
| 4365 single_rate = rate2; | 4329 single_rate = rate2; |
| 4366 hybrid_rate = rate2 + compmode_cost; | 4330 hybrid_rate = rate2 + compmode_cost; |
| 4367 } | 4331 } |
| 4368 | 4332 |
| 4369 single_rd = RDCOST(x->rdmult, x->rddiv, single_rate, distortion2); | 4333 single_rd = RDCOST(x->rdmult, x->rddiv, single_rate, distortion2); |
| 4370 hybrid_rd = RDCOST(x->rdmult, x->rddiv, hybrid_rate, distortion2); | 4334 hybrid_rd = RDCOST(x->rdmult, x->rddiv, hybrid_rate, distortion2); |
| 4371 | 4335 |
| 4372 if (second_ref_frame <= INTRA_FRAME && | 4336 if (second_ref_frame <= INTRA_FRAME && |
| 4373 single_rd < best_pred_rd[SINGLE_PREDICTION_ONLY]) { | 4337 single_rd < best_pred_rd[SINGLE_REFERENCE]) { |
| 4374 best_pred_rd[SINGLE_PREDICTION_ONLY] = single_rd; | 4338 best_pred_rd[SINGLE_REFERENCE] = single_rd; |
| 4375 } else if (second_ref_frame > INTRA_FRAME && | 4339 } else if (second_ref_frame > INTRA_FRAME && |
| 4376 single_rd < best_pred_rd[COMP_PREDICTION_ONLY]) { | 4340 single_rd < best_pred_rd[COMPOUND_REFERENCE]) { |
| 4377 best_pred_rd[COMP_PREDICTION_ONLY] = single_rd; | 4341 best_pred_rd[COMPOUND_REFERENCE] = single_rd; |
| 4378 } | 4342 } |
| 4379 if (hybrid_rd < best_pred_rd[HYBRID_PREDICTION]) | 4343 if (hybrid_rd < best_pred_rd[REFERENCE_MODE_SELECT]) |
| 4380 best_pred_rd[HYBRID_PREDICTION] = hybrid_rd; | 4344 best_pred_rd[REFERENCE_MODE_SELECT] = hybrid_rd; |
| 4381 } | 4345 } |
| 4382 | 4346 |
| 4383 /* keep record of best filter type */ | 4347 /* keep record of best filter type */ |
| 4384 if (!mode_excluded && !disable_skip && ref_frame != INTRA_FRAME && | 4348 if (!mode_excluded && !disable_skip && ref_frame != INTRA_FRAME && |
| 4385 cm->mcomp_filter_type != BILINEAR) { | 4349 cm->mcomp_filter_type != BILINEAR) { |
| 4386 int64_t ref = cpi->rd_filter_cache[cm->mcomp_filter_type == SWITCHABLE ? | 4350 int64_t ref = cpi->rd_filter_cache[cm->mcomp_filter_type == SWITCHABLE ? |
| 4387 SWITCHABLE_FILTERS : cm->mcomp_filter_type]; | 4351 SWITCHABLE_FILTERS : cm->mcomp_filter_type]; |
| 4388 for (i = 0; i < SWITCHABLE_FILTER_CONTEXTS; i++) { | 4352 for (i = 0; i < SWITCHABLE_FILTER_CONTEXTS; i++) { |
| 4389 int64_t adj_rd; | 4353 int64_t adj_rd; |
| 4390 // In cases of poor prediction, filter_cache[] can contain really big | 4354 // In cases of poor prediction, filter_cache[] can contain really big |
| (...skipping 36 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 4427 break; | 4391 break; |
| 4428 } | 4392 } |
| 4429 | 4393 |
| 4430 if (best_rd >= best_rd_so_far) | 4394 if (best_rd >= best_rd_so_far) |
| 4431 return INT64_MAX; | 4395 return INT64_MAX; |
| 4432 | 4396 |
| 4433 // If we used an estimate for the uv intra rd in the loop above... | 4397 // If we used an estimate for the uv intra rd in the loop above... |
| 4434 if (cpi->sf.use_uv_intra_rd_estimate) { | 4398 if (cpi->sf.use_uv_intra_rd_estimate) { |
| 4435 // Do Intra UV best rd mode selection if best mode choice above was intra. | 4399 // Do Intra UV best rd mode selection if best mode choice above was intra. |
| 4436 if (vp9_ref_order[best_mode_index].ref_frame == INTRA_FRAME) { | 4400 if (vp9_ref_order[best_mode_index].ref_frame == INTRA_FRAME) { |
| 4437 TX_SIZE uv_tx_size = get_uv_tx_size(mbmi); | 4401 TX_SIZE uv_tx_size; |
| 4438 rd_pick_intra_sbuv_mode(cpi, x, &rate_uv_intra[uv_tx_size], | 4402 *mbmi = best_mbmode; |
| 4403 uv_tx_size = get_uv_tx_size(mbmi); |
| 4404 rd_pick_intra_sbuv_mode(cpi, x, ctx, &rate_uv_intra[uv_tx_size], |
| 4439 &rate_uv_tokenonly[uv_tx_size], | 4405 &rate_uv_tokenonly[uv_tx_size], |
| 4440 &dist_uv[uv_tx_size], | 4406 &dist_uv[uv_tx_size], |
| 4441 &skip_uv[uv_tx_size], | 4407 &skip_uv[uv_tx_size], |
| 4442 BLOCK_8X8); | 4408 BLOCK_8X8, uv_tx_size); |
| 4443 } | 4409 } |
| 4444 } | 4410 } |
| 4445 | 4411 |
| 4446 // If we are using reference masking and the set mask flag is set then | 4412 // If we are using reference masking and the set mask flag is set then |
| 4447 // create the reference frame mask. | 4413 // create the reference frame mask. |
| 4448 if (cpi->sf.reference_masking && cpi->set_ref_frame_mask) | 4414 if (cpi->sf.reference_masking && cpi->set_ref_frame_mask) |
| 4449 cpi->ref_frame_mask = ~(1 << vp9_ref_order[best_mode_index].ref_frame); | 4415 cpi->ref_frame_mask = ~(1 << vp9_ref_order[best_mode_index].ref_frame); |
| 4450 | 4416 |
| 4451 if (best_rd == INT64_MAX && bsize < BLOCK_8X8) { | 4417 if (best_rd == INT64_MAX && bsize < BLOCK_8X8) { |
| 4452 *returnrate = INT_MAX; | 4418 *returnrate = INT_MAX; |
| 4453 *returndistortion = INT_MAX; | 4419 *returndistortion = INT_MAX; |
| 4454 return best_rd; | 4420 return best_rd; |
| 4455 } | 4421 } |
| 4456 | 4422 |
| 4457 assert((cm->mcomp_filter_type == SWITCHABLE) || | 4423 assert((cm->mcomp_filter_type == SWITCHABLE) || |
| 4458 (cm->mcomp_filter_type == best_mbmode.interp_filter) || | 4424 (cm->mcomp_filter_type == best_mbmode.interp_filter) || |
| 4459 (best_mbmode.ref_frame[0] == INTRA_FRAME)); | 4425 !is_inter_block(&best_mbmode)); |
| 4460 | 4426 |
| 4461 // Updating rd_thresh_freq_fact[] here means that the different | 4427 // Updating rd_thresh_freq_fact[] here means that the different |
| 4462 // partition/block sizes are handled independently based on the best | 4428 // partition/block sizes are handled independently based on the best |
| 4463 // choice for the current partition. It may well be better to keep a scaled | 4429 // choice for the current partition. It may well be better to keep a scaled |
| 4464 // best rd so far value and update rd_thresh_freq_fact based on the mode/size | 4430 // best rd so far value and update rd_thresh_freq_fact based on the mode/size |
| 4465 // combination that wins out. | 4431 // combination that wins out. |
| 4466 if (cpi->sf.adaptive_rd_thresh) { | 4432 if (cpi->sf.adaptive_rd_thresh) { |
| 4467 for (mode_index = 0; mode_index < MAX_REFS; ++mode_index) { | 4433 for (mode_index = 0; mode_index < MAX_REFS; ++mode_index) { |
| 4468 if (mode_index == best_mode_index) { | 4434 if (mode_index == best_mode_index) { |
| 4469 cpi->rd_thresh_freq_sub8x8[bsize][mode_index] -= | 4435 cpi->rd_thresh_freq_sub8x8[bsize][mode_index] -= |
| 4470 (cpi->rd_thresh_freq_sub8x8[bsize][mode_index] >> 3); | 4436 (cpi->rd_thresh_freq_sub8x8[bsize][mode_index] >> 3); |
| 4471 } else { | 4437 } else { |
| 4472 cpi->rd_thresh_freq_sub8x8[bsize][mode_index] += RD_THRESH_INC; | 4438 cpi->rd_thresh_freq_sub8x8[bsize][mode_index] += RD_THRESH_INC; |
| 4473 if (cpi->rd_thresh_freq_sub8x8[bsize][mode_index] > | 4439 if (cpi->rd_thresh_freq_sub8x8[bsize][mode_index] > |
| 4474 (cpi->sf.adaptive_rd_thresh * RD_THRESH_MAX_FACT)) { | 4440 (cpi->sf.adaptive_rd_thresh * RD_THRESH_MAX_FACT)) { |
| 4475 cpi->rd_thresh_freq_sub8x8[bsize][mode_index] = | 4441 cpi->rd_thresh_freq_sub8x8[bsize][mode_index] = |
| 4476 cpi->sf.adaptive_rd_thresh * RD_THRESH_MAX_FACT; | 4442 cpi->sf.adaptive_rd_thresh * RD_THRESH_MAX_FACT; |
| 4477 } | 4443 } |
| 4478 } | 4444 } |
| 4479 } | 4445 } |
| 4480 } | 4446 } |
| 4481 | 4447 |
| 4482 // macroblock modes | 4448 // macroblock modes |
| 4483 *mbmi = best_mbmode; | 4449 *mbmi = best_mbmode; |
| 4484 x->skip |= best_skip2; | 4450 x->skip |= best_skip2; |
| 4485 if (best_mbmode.ref_frame[0] == INTRA_FRAME) { | 4451 if (!is_inter_block(&best_mbmode)) { |
| 4486 for (i = 0; i < 4; i++) | 4452 for (i = 0; i < 4; i++) |
| 4487 xd->mi_8x8[0]->bmi[i].as_mode = best_bmodes[i].as_mode; | 4453 xd->mi_8x8[0]->bmi[i].as_mode = best_bmodes[i].as_mode; |
| 4488 } else { | 4454 } else { |
| 4489 for (i = 0; i < 4; ++i) | 4455 for (i = 0; i < 4; ++i) |
| 4490 vpx_memcpy(&xd->mi_8x8[0]->bmi[i], &best_bmodes[i], sizeof(b_mode_info)); | 4456 vpx_memcpy(&xd->mi_8x8[0]->bmi[i], &best_bmodes[i], sizeof(b_mode_info)); |
| 4491 | 4457 |
| 4492 mbmi->mv[0].as_int = xd->mi_8x8[0]->bmi[3].as_mv[0].as_int; | 4458 mbmi->mv[0].as_int = xd->mi_8x8[0]->bmi[3].as_mv[0].as_int; |
| 4493 mbmi->mv[1].as_int = xd->mi_8x8[0]->bmi[3].as_mv[1].as_int; | 4459 mbmi->mv[1].as_int = xd->mi_8x8[0]->bmi[3].as_mv[1].as_int; |
| 4494 } | 4460 } |
| 4495 | 4461 |
| 4496 for (i = 0; i < NB_PREDICTION_TYPES; ++i) { | 4462 for (i = 0; i < REFERENCE_MODES; ++i) { |
| 4497 if (best_pred_rd[i] == INT64_MAX) | 4463 if (best_pred_rd[i] == INT64_MAX) |
| 4498 best_pred_diff[i] = INT_MIN; | 4464 best_pred_diff[i] = INT_MIN; |
| 4499 else | 4465 else |
| 4500 best_pred_diff[i] = best_rd - best_pred_rd[i]; | 4466 best_pred_diff[i] = best_rd - best_pred_rd[i]; |
| 4501 } | 4467 } |
| 4502 | 4468 |
| 4503 if (!x->skip) { | 4469 if (!x->skip) { |
| 4504 for (i = 0; i < SWITCHABLE_FILTER_CONTEXTS; i++) { | 4470 for (i = 0; i < SWITCHABLE_FILTER_CONTEXTS; i++) { |
| 4505 if (best_filter_rd[i] == INT64_MAX) | 4471 if (best_filter_rd[i] == INT64_MAX) |
| 4506 best_filter_diff[i] = 0; | 4472 best_filter_diff[i] = 0; |
| (...skipping 20 matching lines...) Expand all Loading... |
| 4527 set_scale_factors(xd, mbmi->ref_frame[0], mbmi->ref_frame[1], | 4493 set_scale_factors(xd, mbmi->ref_frame[0], mbmi->ref_frame[1], |
| 4528 scale_factor); | 4494 scale_factor); |
| 4529 store_coding_context(x, ctx, best_mode_index, | 4495 store_coding_context(x, ctx, best_mode_index, |
| 4530 &mbmi->ref_mvs[mbmi->ref_frame[0]][0], | 4496 &mbmi->ref_mvs[mbmi->ref_frame[0]][0], |
| 4531 &mbmi->ref_mvs[mbmi->ref_frame[1] < 0 ? 0 : | 4497 &mbmi->ref_mvs[mbmi->ref_frame[1] < 0 ? 0 : |
| 4532 mbmi->ref_frame[1]][0], | 4498 mbmi->ref_frame[1]][0], |
| 4533 best_pred_diff, best_tx_diff, best_filter_diff); | 4499 best_pred_diff, best_tx_diff, best_filter_diff); |
| 4534 | 4500 |
| 4535 return best_rd; | 4501 return best_rd; |
| 4536 } | 4502 } |
| OLD | NEW |