| 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 |
| (...skipping 205 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 216 16, 16, 16, 16, 17, 17, 17, 18, | 216 16, 16, 16, 16, 17, 17, 17, 18, |
| 217 18, 18, 19, 19, 19, 20, 20, 20, | 217 18, 18, 19, 19, 19, 20, 20, 20, |
| 218 }; | 218 }; |
| 219 | 219 |
| 220 void vp8cx_initialize_me_consts(VP8_COMP *cpi, int QIndex) | 220 void vp8cx_initialize_me_consts(VP8_COMP *cpi, int QIndex) |
| 221 { | 221 { |
| 222 cpi->mb.sadperbit16 = sad_per_bit16lut[QIndex]; | 222 cpi->mb.sadperbit16 = sad_per_bit16lut[QIndex]; |
| 223 cpi->mb.sadperbit4 = sad_per_bit4lut[QIndex]; | 223 cpi->mb.sadperbit4 = sad_per_bit4lut[QIndex]; |
| 224 } | 224 } |
| 225 | 225 |
| 226 void vp8_initialize_rd_consts(VP8_COMP *cpi, int Qvalue) | 226 void vp8_initialize_rd_consts(VP8_COMP *cpi, MACROBLOCK *x, int Qvalue) |
| 227 { | 227 { |
| 228 int q; | 228 int q; |
| 229 int i; | 229 int i; |
| 230 double capped_q = (Qvalue < 160) ? (double)Qvalue : 160.0; | 230 double capped_q = (Qvalue < 160) ? (double)Qvalue : 160.0; |
| 231 double rdconst = 2.80; | 231 double rdconst = 2.80; |
| 232 | 232 |
| 233 vp8_clear_system_state(); | 233 vp8_clear_system_state(); |
| 234 | 234 |
| 235 /* Further tests required to see if optimum is different | 235 /* Further tests required to see if optimum is different |
| 236 * for key frames, golden frames and arf frames. | 236 * for key frames, golden frames and arf frames. |
| 237 */ | 237 */ |
| 238 cpi->RDMULT = (int)(rdconst * (capped_q * capped_q)); | 238 cpi->RDMULT = (int)(rdconst * (capped_q * capped_q)); |
| 239 | 239 |
| 240 /* Extend rate multiplier along side quantizer zbin increases */ | 240 /* Extend rate multiplier along side quantizer zbin increases */ |
| 241 if (cpi->zbin_over_quant > 0) | 241 if (cpi->mb.zbin_over_quant > 0) |
| 242 { | 242 { |
| 243 double oq_factor; | 243 double oq_factor; |
| 244 double modq; | 244 double modq; |
| 245 | 245 |
| 246 /* Experimental code using the same basic equation as used for Q above | 246 /* Experimental code using the same basic equation as used for Q above |
| 247 * The units of cpi->zbin_over_quant are 1/128 of Q bin size | 247 * The units of cpi->mb.zbin_over_quant are 1/128 of Q bin size |
| 248 */ | 248 */ |
| 249 oq_factor = 1.0 + ((double)0.0015625 * cpi->zbin_over_quant); | 249 oq_factor = 1.0 + ((double)0.0015625 * cpi->mb.zbin_over_quant); |
| 250 modq = (int)((double)capped_q * oq_factor); | 250 modq = (int)((double)capped_q * oq_factor); |
| 251 cpi->RDMULT = (int)(rdconst * (modq * modq)); | 251 cpi->RDMULT = (int)(rdconst * (modq * modq)); |
| 252 } | 252 } |
| 253 | 253 |
| 254 if (cpi->pass == 2 && (cpi->common.frame_type != KEY_FRAME)) | 254 if (cpi->pass == 2 && (cpi->common.frame_type != KEY_FRAME)) |
| 255 { | 255 { |
| 256 if (cpi->twopass.next_iiratio > 31) | 256 if (cpi->twopass.next_iiratio > 31) |
| 257 cpi->RDMULT += (cpi->RDMULT * rd_iifactor[31]) >> 4; | 257 cpi->RDMULT += (cpi->RDMULT * rd_iifactor[31]) >> 4; |
| 258 else | 258 else |
| 259 cpi->RDMULT += | 259 cpi->RDMULT += |
| 260 (cpi->RDMULT * rd_iifactor[cpi->twopass.next_iiratio]) >> 4; | 260 (cpi->RDMULT * rd_iifactor[cpi->twopass.next_iiratio]) >> 4; |
| 261 } | 261 } |
| 262 | 262 |
| 263 cpi->mb.errorperbit = (cpi->RDMULT / 110); | 263 cpi->mb.errorperbit = (cpi->RDMULT / 110); |
| 264 cpi->mb.errorperbit += (cpi->mb.errorperbit==0); | 264 cpi->mb.errorperbit += (cpi->mb.errorperbit==0); |
| 265 | 265 |
| 266 vp8_set_speed_features(cpi); | 266 vp8_set_speed_features(cpi); |
| 267 | 267 |
| 268 for (i = 0; i < MAX_MODES; i++) |
| 269 { |
| 270 x->mode_test_hit_counts[i] = 0; |
| 271 } |
| 272 |
| 268 q = (int)pow(Qvalue, 1.25); | 273 q = (int)pow(Qvalue, 1.25); |
| 269 | 274 |
| 270 if (q < 8) | 275 if (q < 8) |
| 271 q = 8; | 276 q = 8; |
| 272 | 277 |
| 273 if (cpi->RDMULT > 1000) | 278 if (cpi->RDMULT > 1000) |
| 274 { | 279 { |
| 275 cpi->RDDIV = 1; | 280 cpi->RDDIV = 1; |
| 276 cpi->RDMULT /= 100; | 281 cpi->RDMULT /= 100; |
| 277 | 282 |
| 278 for (i = 0; i < MAX_MODES; i++) | 283 for (i = 0; i < MAX_MODES; i++) |
| 279 { | 284 { |
| 280 if (cpi->sf.thresh_mult[i] < INT_MAX) | 285 if (cpi->sf.thresh_mult[i] < INT_MAX) |
| 281 { | 286 { |
| 282 cpi->rd_threshes[i] = cpi->sf.thresh_mult[i] * q / 100; | 287 x->rd_threshes[i] = cpi->sf.thresh_mult[i] * q / 100; |
| 283 } | 288 } |
| 284 else | 289 else |
| 285 { | 290 { |
| 286 cpi->rd_threshes[i] = INT_MAX; | 291 x->rd_threshes[i] = INT_MAX; |
| 287 } | 292 } |
| 288 | 293 |
| 289 cpi->rd_baseline_thresh[i] = cpi->rd_threshes[i]; | 294 cpi->rd_baseline_thresh[i] = x->rd_threshes[i]; |
| 290 } | 295 } |
| 291 } | 296 } |
| 292 else | 297 else |
| 293 { | 298 { |
| 294 cpi->RDDIV = 100; | 299 cpi->RDDIV = 100; |
| 295 | 300 |
| 296 for (i = 0; i < MAX_MODES; i++) | 301 for (i = 0; i < MAX_MODES; i++) |
| 297 { | 302 { |
| 298 if (cpi->sf.thresh_mult[i] < (INT_MAX / q)) | 303 if (cpi->sf.thresh_mult[i] < (INT_MAX / q)) |
| 299 { | 304 { |
| 300 cpi->rd_threshes[i] = cpi->sf.thresh_mult[i] * q; | 305 x->rd_threshes[i] = cpi->sf.thresh_mult[i] * q; |
| 301 } | 306 } |
| 302 else | 307 else |
| 303 { | 308 { |
| 304 cpi->rd_threshes[i] = INT_MAX; | 309 x->rd_threshes[i] = INT_MAX; |
| 305 } | 310 } |
| 306 | 311 |
| 307 cpi->rd_baseline_thresh[i] = cpi->rd_threshes[i]; | 312 cpi->rd_baseline_thresh[i] = x->rd_threshes[i]; |
| 308 } | 313 } |
| 309 } | 314 } |
| 310 | 315 |
| 311 { | 316 { |
| 312 /* build token cost array for the type of frame we have now */ | 317 /* build token cost array for the type of frame we have now */ |
| 313 FRAME_CONTEXT *l = &cpi->lfc_n; | 318 FRAME_CONTEXT *l = &cpi->lfc_n; |
| 314 | 319 |
| 315 if(cpi->common.refresh_alt_ref_frame) | 320 if(cpi->common.refresh_alt_ref_frame) |
| 316 l = &cpi->lfc_a; | 321 l = &cpi->lfc_a; |
| 317 else if(cpi->common.refresh_golden_frame) | 322 else if(cpi->common.refresh_golden_frame) |
| (...skipping 300 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 618 static void copy_predictor(unsigned char *dst, const unsigned char *predictor) | 623 static void copy_predictor(unsigned char *dst, const unsigned char *predictor) |
| 619 { | 624 { |
| 620 const unsigned int *p = (const unsigned int *)predictor; | 625 const unsigned int *p = (const unsigned int *)predictor; |
| 621 unsigned int *d = (unsigned int *)dst; | 626 unsigned int *d = (unsigned int *)dst; |
| 622 d[0] = p[0]; | 627 d[0] = p[0]; |
| 623 d[4] = p[4]; | 628 d[4] = p[4]; |
| 624 d[8] = p[8]; | 629 d[8] = p[8]; |
| 625 d[12] = p[12]; | 630 d[12] = p[12]; |
| 626 } | 631 } |
| 627 static int rd_pick_intra4x4block( | 632 static int rd_pick_intra4x4block( |
| 628 VP8_COMP *cpi, | |
| 629 MACROBLOCK *x, | 633 MACROBLOCK *x, |
| 630 BLOCK *be, | 634 BLOCK *be, |
| 631 BLOCKD *b, | 635 BLOCKD *b, |
| 632 B_PREDICTION_MODE *best_mode, | 636 B_PREDICTION_MODE *best_mode, |
| 633 const int *bmode_costs, | 637 const int *bmode_costs, |
| 634 ENTROPY_CONTEXT *a, | 638 ENTROPY_CONTEXT *a, |
| 635 ENTROPY_CONTEXT *l, | 639 ENTROPY_CONTEXT *l, |
| 636 | 640 |
| 637 int *bestrate, | 641 int *bestrate, |
| 638 int *bestratey, | 642 int *bestratey, |
| (...skipping 55 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 694 vpx_memcpy(best_dqcoeff, b->dqcoeff, 32); | 698 vpx_memcpy(best_dqcoeff, b->dqcoeff, 32); |
| 695 } | 699 } |
| 696 } | 700 } |
| 697 b->bmi.as_mode = *best_mode; | 701 b->bmi.as_mode = *best_mode; |
| 698 | 702 |
| 699 vp8_short_idct4x4llm(best_dqcoeff, best_predictor, 16, dst, dst_stride); | 703 vp8_short_idct4x4llm(best_dqcoeff, best_predictor, 16, dst, dst_stride); |
| 700 | 704 |
| 701 return best_rd; | 705 return best_rd; |
| 702 } | 706 } |
| 703 | 707 |
| 704 static int rd_pick_intra4x4mby_modes(VP8_COMP *cpi, MACROBLOCK *mb, int *Rate, | 708 static int rd_pick_intra4x4mby_modes(MACROBLOCK *mb, int *Rate, |
| 705 int *rate_y, int *Distortion, int best_rd) | 709 int *rate_y, int *Distortion, int best_rd) |
| 706 { | 710 { |
| 707 MACROBLOCKD *const xd = &mb->e_mbd; | 711 MACROBLOCKD *const xd = &mb->e_mbd; |
| 708 int i; | 712 int i; |
| 709 int cost = mb->mbmode_cost [xd->frame_type] [B_PRED]; | 713 int cost = mb->mbmode_cost [xd->frame_type] [B_PRED]; |
| 710 int distortion = 0; | 714 int distortion = 0; |
| 711 int tot_rate_y = 0; | 715 int tot_rate_y = 0; |
| 712 int64_t total_rd = 0; | 716 int64_t total_rd = 0; |
| 713 ENTROPY_CONTEXT_PLANES t_above, t_left; | 717 ENTROPY_CONTEXT_PLANES t_above, t_left; |
| 714 ENTROPY_CONTEXT *ta; | 718 ENTROPY_CONTEXT *ta; |
| (...skipping 19 matching lines...) Expand all Loading... |
| 734 | 738 |
| 735 if (mb->e_mbd.frame_type == KEY_FRAME) | 739 if (mb->e_mbd.frame_type == KEY_FRAME) |
| 736 { | 740 { |
| 737 const B_PREDICTION_MODE A = above_block_mode(mic, i, mis); | 741 const B_PREDICTION_MODE A = above_block_mode(mic, i, mis); |
| 738 const B_PREDICTION_MODE L = left_block_mode(mic, i); | 742 const B_PREDICTION_MODE L = left_block_mode(mic, i); |
| 739 | 743 |
| 740 bmode_costs = mb->bmode_costs[A][L]; | 744 bmode_costs = mb->bmode_costs[A][L]; |
| 741 } | 745 } |
| 742 | 746 |
| 743 total_rd += rd_pick_intra4x4block( | 747 total_rd += rd_pick_intra4x4block( |
| 744 cpi, mb, mb->block + i, xd->block + i, &best_mode, bmode_costs, | 748 mb, mb->block + i, xd->block + i, &best_mode, bmode_costs, |
| 745 ta + vp8_block2above[i], | 749 ta + vp8_block2above[i], |
| 746 tl + vp8_block2left[i], &r, &ry, &d); | 750 tl + vp8_block2left[i], &r, &ry, &d); |
| 747 | 751 |
| 748 cost += r; | 752 cost += r; |
| 749 distortion += d; | 753 distortion += d; |
| 750 tot_rate_y += ry; | 754 tot_rate_y += ry; |
| 751 | 755 |
| 752 mic->bmi[i].as_mode = best_mode; | 756 mic->bmi[i].as_mode = best_mode; |
| 753 | 757 |
| 754 if(total_rd >= (int64_t)best_rd) | 758 if(total_rd >= (int64_t)best_rd) |
| 755 break; | 759 break; |
| 756 } | 760 } |
| 757 | 761 |
| 758 if(total_rd >= (int64_t)best_rd) | 762 if(total_rd >= (int64_t)best_rd) |
| 759 return INT_MAX; | 763 return INT_MAX; |
| 760 | 764 |
| 761 *Rate = cost; | 765 *Rate = cost; |
| 762 *rate_y = tot_rate_y; | 766 *rate_y = tot_rate_y; |
| 763 *Distortion = distortion; | 767 *Distortion = distortion; |
| 764 | 768 |
| 765 return RDCOST(mb->rdmult, mb->rddiv, cost, distortion); | 769 return RDCOST(mb->rdmult, mb->rddiv, cost, distortion); |
| 766 } | 770 } |
| 767 | 771 |
| 768 | 772 |
| 769 static int rd_pick_intra16x16mby_mode(VP8_COMP *cpi, | 773 static int rd_pick_intra16x16mby_mode(MACROBLOCK *x, |
| 770 MACROBLOCK *x, | |
| 771 int *Rate, | 774 int *Rate, |
| 772 int *rate_y, | 775 int *rate_y, |
| 773 int *Distortion) | 776 int *Distortion) |
| 774 { | 777 { |
| 775 MB_PREDICTION_MODE mode; | 778 MB_PREDICTION_MODE mode; |
| 776 MB_PREDICTION_MODE UNINITIALIZED_IS_SAFE(mode_selected); | 779 MB_PREDICTION_MODE UNINITIALIZED_IS_SAFE(mode_selected); |
| 777 int rate, ratey; | 780 int rate, ratey; |
| 778 int distortion; | 781 int distortion; |
| 779 int best_rd = INT_MAX; | 782 int best_rd = INT_MAX; |
| 780 int this_rd; | 783 int this_rd; |
| (...skipping 81 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 862 | 865 |
| 863 vp8_transform_mbuv(x); | 866 vp8_transform_mbuv(x); |
| 864 vp8_quantize_mbuv(x); | 867 vp8_quantize_mbuv(x); |
| 865 | 868 |
| 866 *rate = rd_cost_mbuv(x); | 869 *rate = rd_cost_mbuv(x); |
| 867 *distortion = vp8_mbuverror(x) / 4; | 870 *distortion = vp8_mbuverror(x) / 4; |
| 868 | 871 |
| 869 return RDCOST(x->rdmult, x->rddiv, *rate, *distortion); | 872 return RDCOST(x->rdmult, x->rddiv, *rate, *distortion); |
| 870 } | 873 } |
| 871 | 874 |
| 872 static void rd_pick_intra_mbuv_mode(VP8_COMP *cpi, MACROBLOCK *x, int *rate, int
*rate_tokenonly, int *distortion) | 875 static void rd_pick_intra_mbuv_mode(MACROBLOCK *x, int *rate, |
| 876 int *rate_tokenonly, int *distortion) |
| 873 { | 877 { |
| 874 MB_PREDICTION_MODE mode; | 878 MB_PREDICTION_MODE mode; |
| 875 MB_PREDICTION_MODE UNINITIALIZED_IS_SAFE(mode_selected); | 879 MB_PREDICTION_MODE UNINITIALIZED_IS_SAFE(mode_selected); |
| 876 int best_rd = INT_MAX; | 880 int best_rd = INT_MAX; |
| 877 int UNINITIALIZED_IS_SAFE(d), UNINITIALIZED_IS_SAFE(r); | 881 int UNINITIALIZED_IS_SAFE(d), UNINITIALIZED_IS_SAFE(r); |
| 878 int rate_to; | 882 int rate_to; |
| 879 MACROBLOCKD *xd = &x->e_mbd; | 883 MACROBLOCKD *xd = &x->e_mbd; |
| 880 | 884 |
| 881 for (mode = DC_PRED; mode <= TM_PRED; mode++) | 885 for (mode = DC_PRED; mode <= TM_PRED; mode++) |
| 882 { | 886 { |
| (...skipping 839 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1722 | 1726 |
| 1723 if(cpi->common.last_frame_type != KEY_FRAME) | 1727 if(cpi->common.last_frame_type != KEY_FRAME) |
| 1724 { | 1728 { |
| 1725 insertsortsad(near_sad, near_sadidx, 8); | 1729 insertsortsad(near_sad, near_sadidx, 8); |
| 1726 }else | 1730 }else |
| 1727 { | 1731 { |
| 1728 insertsortsad(near_sad, near_sadidx, 3); | 1732 insertsortsad(near_sad, near_sadidx, 3); |
| 1729 } | 1733 } |
| 1730 } | 1734 } |
| 1731 | 1735 |
| 1732 static void rd_update_mvcount(VP8_COMP *cpi, MACROBLOCK *x, int_mv *best_ref_mv) | 1736 static void rd_update_mvcount(MACROBLOCK *x, int_mv *best_ref_mv) |
| 1733 { | 1737 { |
| 1734 if (x->e_mbd.mode_info_context->mbmi.mode == SPLITMV) | 1738 if (x->e_mbd.mode_info_context->mbmi.mode == SPLITMV) |
| 1735 { | 1739 { |
| 1736 int i; | 1740 int i; |
| 1737 | 1741 |
| 1738 for (i = 0; i < x->partition_info->count; i++) | 1742 for (i = 0; i < x->partition_info->count; i++) |
| 1739 { | 1743 { |
| 1740 if (x->partition_info->bmi[i].mode == NEW4X4) | 1744 if (x->partition_info->bmi[i].mode == NEW4X4) |
| 1741 { | 1745 { |
| 1742 cpi->MVcount[0][mv_max+((x->partition_info->bmi[i].mv.as_mv.row | 1746 x->MVcount[0][mv_max+((x->partition_info->bmi[i].mv.as_mv.row |
| 1743 - best_ref_mv->as_mv.row) >> 1)]++; | 1747 - best_ref_mv->as_mv.row) >> 1)]++; |
| 1744 cpi->MVcount[1][mv_max+((x->partition_info->bmi[i].mv.as_mv.col | 1748 x->MVcount[1][mv_max+((x->partition_info->bmi[i].mv.as_mv.col |
| 1745 - best_ref_mv->as_mv.col) >> 1)]++; | 1749 - best_ref_mv->as_mv.col) >> 1)]++; |
| 1746 } | 1750 } |
| 1747 } | 1751 } |
| 1748 } | 1752 } |
| 1749 else if (x->e_mbd.mode_info_context->mbmi.mode == NEWMV) | 1753 else if (x->e_mbd.mode_info_context->mbmi.mode == NEWMV) |
| 1750 { | 1754 { |
| 1751 cpi->MVcount[0][mv_max+((x->e_mbd.mode_info_context->mbmi.mv.as_mv.row | 1755 x->MVcount[0][mv_max+((x->e_mbd.mode_info_context->mbmi.mv.as_mv.row |
| 1752 - best_ref_mv->as_mv.row) >> 1)]++; | 1756 - best_ref_mv->as_mv.row) >> 1)]++; |
| 1753 cpi->MVcount[1][mv_max+((x->e_mbd.mode_info_context->mbmi.mv.as_mv.col | 1757 x->MVcount[1][mv_max+((x->e_mbd.mode_info_context->mbmi.mv.as_mv.col |
| 1754 - best_ref_mv->as_mv.col) >> 1)]++; | 1758 - best_ref_mv->as_mv.col) >> 1)]++; |
| 1755 } | 1759 } |
| 1756 } | 1760 } |
| 1757 | 1761 |
| 1758 static int evaluate_inter_mode_rd(int mdcounts[4], | 1762 static int evaluate_inter_mode_rd(int mdcounts[4], |
| 1759 RATE_DISTORTION* rd, | 1763 RATE_DISTORTION* rd, |
| 1760 int* disable_skip, | 1764 int* disable_skip, |
| 1761 VP8_COMP *cpi, MACROBLOCK *x) | 1765 VP8_COMP *cpi, MACROBLOCK *x) |
| 1762 { | 1766 { |
| 1763 MB_PREDICTION_MODE this_mode = x->e_mbd.mode_info_context->mbmi.mode; | 1767 MB_PREDICTION_MODE this_mode = x->e_mbd.mode_info_context->mbmi.mode; |
| (...skipping 240 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2004 cpi->common.ref_frame_sign_bias); | 2008 cpi->common.ref_frame_sign_bias); |
| 2005 | 2009 |
| 2006 mode_mv = mode_mv_sb[sign_bias]; | 2010 mode_mv = mode_mv_sb[sign_bias]; |
| 2007 best_ref_mv.as_int = best_ref_mv_sb[sign_bias].as_int; | 2011 best_ref_mv.as_int = best_ref_mv_sb[sign_bias].as_int; |
| 2008 } | 2012 } |
| 2009 | 2013 |
| 2010 get_predictor_pointers(cpi, plane, recon_yoffset, recon_uvoffset); | 2014 get_predictor_pointers(cpi, plane, recon_yoffset, recon_uvoffset); |
| 2011 | 2015 |
| 2012 *returnintra = INT_MAX; | 2016 *returnintra = INT_MAX; |
| 2013 /* Count of the number of MBs tested so far this frame */ | 2017 /* Count of the number of MBs tested so far this frame */ |
| 2014 cpi->mbs_tested_so_far++; | 2018 x->mbs_tested_so_far++; |
| 2015 | 2019 |
| 2016 x->skip = 0; | 2020 x->skip = 0; |
| 2017 | 2021 |
| 2018 for (mode_index = 0; mode_index < MAX_MODES; mode_index++) | 2022 for (mode_index = 0; mode_index < MAX_MODES; mode_index++) |
| 2019 { | 2023 { |
| 2020 int this_rd = INT_MAX; | 2024 int this_rd = INT_MAX; |
| 2021 int disable_skip = 0; | 2025 int disable_skip = 0; |
| 2022 int other_cost = 0; | 2026 int other_cost = 0; |
| 2023 int this_ref_frame = ref_frame_map[vp8_ref_frame_order[mode_index]]; | 2027 int this_ref_frame = ref_frame_map[vp8_ref_frame_order[mode_index]]; |
| 2024 | 2028 |
| 2025 /* Test best rd so far against threshold for trying this mode. */ | 2029 /* Test best rd so far against threshold for trying this mode. */ |
| 2026 if (best_mode.rd <= cpi->rd_threshes[mode_index]) | 2030 if (best_mode.rd <= x->rd_threshes[mode_index]) |
| 2027 continue; | 2031 continue; |
| 2028 | 2032 |
| 2029 if (this_ref_frame < 0) | 2033 if (this_ref_frame < 0) |
| 2030 continue; | 2034 continue; |
| 2031 | 2035 |
| 2032 /* These variables hold are rolling total cost and distortion for | 2036 /* These variables hold are rolling total cost and distortion for |
| 2033 * this mode | 2037 * this mode |
| 2034 */ | 2038 */ |
| 2035 rd.rate2 = 0; | 2039 rd.rate2 = 0; |
| 2036 rd.distortion2 = 0; | 2040 rd.distortion2 = 0; |
| (...skipping 25 matching lines...) Expand all Loading... |
| 2062 sign_bias = cpi->common.ref_frame_sign_bias[this_ref_frame]; | 2066 sign_bias = cpi->common.ref_frame_sign_bias[this_ref_frame]; |
| 2063 mode_mv = mode_mv_sb[sign_bias]; | 2067 mode_mv = mode_mv_sb[sign_bias]; |
| 2064 best_ref_mv.as_int = best_ref_mv_sb[sign_bias].as_int; | 2068 best_ref_mv.as_int = best_ref_mv_sb[sign_bias].as_int; |
| 2065 } | 2069 } |
| 2066 } | 2070 } |
| 2067 | 2071 |
| 2068 /* Check to see if the testing frequency for this mode is at its | 2072 /* Check to see if the testing frequency for this mode is at its |
| 2069 * max If so then prevent it from being tested and increase the | 2073 * max If so then prevent it from being tested and increase the |
| 2070 * threshold for its testing | 2074 * threshold for its testing |
| 2071 */ | 2075 */ |
| 2072 if (cpi->mode_test_hit_counts[mode_index] && (cpi->mode_check_freq[mode_
index] > 1)) | 2076 if (x->mode_test_hit_counts[mode_index] && (cpi->mode_check_freq[mode_in
dex] > 1)) |
| 2073 { | 2077 { |
| 2074 if (cpi->mbs_tested_so_far <= cpi->mode_check_freq[mode_index] * cp
i->mode_test_hit_counts[mode_index]) | 2078 if (x->mbs_tested_so_far <= cpi->mode_check_freq[mode_index] * x->m
ode_test_hit_counts[mode_index]) |
| 2075 { | 2079 { |
| 2076 /* Increase the threshold for coding this mode to make it | 2080 /* Increase the threshold for coding this mode to make it |
| 2077 * less likely to be chosen | 2081 * less likely to be chosen |
| 2078 */ | 2082 */ |
| 2079 cpi->rd_thresh_mult[mode_index] += 4; | 2083 x->rd_thresh_mult[mode_index] += 4; |
| 2080 | 2084 |
| 2081 if (cpi->rd_thresh_mult[mode_index] > MAX_THRESHMULT) | 2085 if (x->rd_thresh_mult[mode_index] > MAX_THRESHMULT) |
| 2082 cpi->rd_thresh_mult[mode_index] = MAX_THRESHMULT; | 2086 x->rd_thresh_mult[mode_index] = MAX_THRESHMULT; |
| 2083 | 2087 |
| 2084 cpi->rd_threshes[mode_index] = (cpi->rd_baseline_thresh[mode_ind
ex] >> 7) * cpi->rd_thresh_mult[mode_index]; | 2088 x->rd_threshes[mode_index] = |
| 2089 (cpi->rd_baseline_thresh[mode_index] >> 7) * |
| 2090 x->rd_thresh_mult[mode_index]; |
| 2085 | 2091 |
| 2086 continue; | 2092 continue; |
| 2087 } | 2093 } |
| 2088 } | 2094 } |
| 2089 | 2095 |
| 2090 /* We have now reached the point where we are going to test the | 2096 /* We have now reached the point where we are going to test the |
| 2091 * current mode so increment the counter for the number of times | 2097 * current mode so increment the counter for the number of times |
| 2092 * it has been tested | 2098 * it has been tested |
| 2093 */ | 2099 */ |
| 2094 cpi->mode_test_hit_counts[mode_index] ++; | 2100 x->mode_test_hit_counts[mode_index] ++; |
| 2095 | 2101 |
| 2096 /* Experimental code. Special case for gf and arf zeromv modes. | 2102 /* Experimental code. Special case for gf and arf zeromv modes. |
| 2097 * Increase zbin size to supress noise | 2103 * Increase zbin size to supress noise |
| 2098 */ | 2104 */ |
| 2099 if (cpi->zbin_mode_boost_enabled) | 2105 if (x->zbin_mode_boost_enabled) |
| 2100 { | 2106 { |
| 2101 if ( this_ref_frame == INTRA_FRAME ) | 2107 if ( this_ref_frame == INTRA_FRAME ) |
| 2102 cpi->zbin_mode_boost = 0; | 2108 x->zbin_mode_boost = 0; |
| 2103 else | 2109 else |
| 2104 { | 2110 { |
| 2105 if (vp8_mode_order[mode_index] == ZEROMV) | 2111 if (vp8_mode_order[mode_index] == ZEROMV) |
| 2106 { | 2112 { |
| 2107 if (this_ref_frame != LAST_FRAME) | 2113 if (this_ref_frame != LAST_FRAME) |
| 2108 cpi->zbin_mode_boost = GF_ZEROMV_ZBIN_BOOST; | 2114 x->zbin_mode_boost = GF_ZEROMV_ZBIN_BOOST; |
| 2109 else | 2115 else |
| 2110 cpi->zbin_mode_boost = LF_ZEROMV_ZBIN_BOOST; | 2116 x->zbin_mode_boost = LF_ZEROMV_ZBIN_BOOST; |
| 2111 } | 2117 } |
| 2112 else if (vp8_mode_order[mode_index] == SPLITMV) | 2118 else if (vp8_mode_order[mode_index] == SPLITMV) |
| 2113 cpi->zbin_mode_boost = 0; | 2119 x->zbin_mode_boost = 0; |
| 2114 else | 2120 else |
| 2115 cpi->zbin_mode_boost = MV_ZBIN_BOOST; | 2121 x->zbin_mode_boost = MV_ZBIN_BOOST; |
| 2116 } | 2122 } |
| 2117 | 2123 |
| 2118 vp8_update_zbin_extra(cpi, x); | 2124 vp8_update_zbin_extra(cpi, x); |
| 2119 } | 2125 } |
| 2120 | 2126 |
| 2121 if(!uv_intra_done && this_ref_frame == INTRA_FRAME) | 2127 if(!uv_intra_done && this_ref_frame == INTRA_FRAME) |
| 2122 { | 2128 { |
| 2123 rd_pick_intra_mbuv_mode(cpi, x, &uv_intra_rate, | 2129 rd_pick_intra_mbuv_mode(x, &uv_intra_rate, |
| 2124 &uv_intra_rate_tokenonly, | 2130 &uv_intra_rate_tokenonly, |
| 2125 &uv_intra_distortion); | 2131 &uv_intra_distortion); |
| 2126 uv_intra_mode = x->e_mbd.mode_info_context->mbmi.uv_mode; | 2132 uv_intra_mode = x->e_mbd.mode_info_context->mbmi.uv_mode; |
| 2127 | 2133 |
| 2128 /* | 2134 /* |
| 2129 * Total of the eobs is used later to further adjust rate2. Since uv | 2135 * Total of the eobs is used later to further adjust rate2. Since uv |
| 2130 * block's intra eobs will be overwritten when we check inter modes, | 2136 * block's intra eobs will be overwritten when we check inter modes, |
| 2131 * we need to save uv_intra_tteob here. | 2137 * we need to save uv_intra_tteob here. |
| 2132 */ | 2138 */ |
| 2133 for (i = 16; i < 24; i++) | 2139 for (i = 16; i < 24; i++) |
| 2134 uv_intra_tteob += x->e_mbd.eobs[i]; | 2140 uv_intra_tteob += x->e_mbd.eobs[i]; |
| 2135 | 2141 |
| 2136 uv_intra_done = 1; | 2142 uv_intra_done = 1; |
| 2137 } | 2143 } |
| 2138 | 2144 |
| 2139 switch (this_mode) | 2145 switch (this_mode) |
| 2140 { | 2146 { |
| 2141 case B_PRED: | 2147 case B_PRED: |
| 2142 { | 2148 { |
| 2143 int tmp_rd; | 2149 int tmp_rd; |
| 2144 | 2150 |
| 2145 /* Note the rate value returned here includes the cost of | 2151 /* Note the rate value returned here includes the cost of |
| 2146 * coding the BPRED mode: x->mbmode_cost[x->e_mbd.frame_type][BPRED] | 2152 * coding the BPRED mode: x->mbmode_cost[x->e_mbd.frame_type][BPRED] |
| 2147 */ | 2153 */ |
| 2148 int distortion; | 2154 int distortion; |
| 2149 tmp_rd = rd_pick_intra4x4mby_modes(cpi, x, &rate, &rd.rate_y, &disto
rtion, best_mode.yrd); | 2155 tmp_rd = rd_pick_intra4x4mby_modes(x, &rate, &rd.rate_y, &distortion
, best_mode.yrd); |
| 2150 rd.rate2 += rate; | 2156 rd.rate2 += rate; |
| 2151 rd.distortion2 += distortion; | 2157 rd.distortion2 += distortion; |
| 2152 | 2158 |
| 2153 if(tmp_rd < best_mode.yrd) | 2159 if(tmp_rd < best_mode.yrd) |
| 2154 { | 2160 { |
| 2155 rd.rate2 += uv_intra_rate; | 2161 rd.rate2 += uv_intra_rate; |
| 2156 rd.rate_uv = uv_intra_rate_tokenonly; | 2162 rd.rate_uv = uv_intra_rate_tokenonly; |
| 2157 rd.distortion2 += uv_intra_distortion; | 2163 rd.distortion2 += uv_intra_distortion; |
| 2158 rd.distortion_uv = uv_intra_distortion; | 2164 rd.distortion_uv = uv_intra_distortion; |
| 2159 } | 2165 } |
| 2160 else | 2166 else |
| 2161 { | 2167 { |
| 2162 this_rd = INT_MAX; | 2168 this_rd = INT_MAX; |
| 2163 disable_skip = 1; | 2169 disable_skip = 1; |
| 2164 } | 2170 } |
| 2165 } | 2171 } |
| 2166 break; | 2172 break; |
| 2167 | 2173 |
| 2168 case SPLITMV: | 2174 case SPLITMV: |
| 2169 { | 2175 { |
| 2170 int tmp_rd; | 2176 int tmp_rd; |
| 2171 int this_rd_thresh; | 2177 int this_rd_thresh; |
| 2172 int distortion; | 2178 int distortion; |
| 2173 | 2179 |
| 2174 this_rd_thresh = (vp8_ref_frame_order[mode_index] == 1) ? cpi->rd_th
reshes[THR_NEW1] : cpi->rd_threshes[THR_NEW3]; | 2180 this_rd_thresh = (vp8_ref_frame_order[mode_index] == 1) ? |
| 2175 this_rd_thresh = (vp8_ref_frame_order[mode_index] == 2) ? cpi->rd_th
reshes[THR_NEW2] : this_rd_thresh; | 2181 x->rd_threshes[THR_NEW1] : x->rd_threshes[THR_NEW3]; |
| 2182 this_rd_thresh = (vp8_ref_frame_order[mode_index] == 2) ? |
| 2183 x->rd_threshes[THR_NEW2] : this_rd_thresh; |
| 2176 | 2184 |
| 2177 tmp_rd = vp8_rd_pick_best_mbsegmentation(cpi, x, &best_ref_mv, | 2185 tmp_rd = vp8_rd_pick_best_mbsegmentation(cpi, x, &best_ref_mv, |
| 2178 best_mode.yrd, mdcounts, | 2186 best_mode.yrd, mdcounts, |
| 2179 &rate, &rd.rate_y, &distort
ion, this_rd_thresh) ; | 2187 &rate, &rd.rate_y, &distort
ion, this_rd_thresh) ; |
| 2180 | 2188 |
| 2181 rd.rate2 += rate; | 2189 rd.rate2 += rate; |
| 2182 rd.distortion2 += distortion; | 2190 rd.distortion2 += distortion; |
| 2183 | 2191 |
| 2184 /* If even the 'Y' rd value of split is higher than best so far | 2192 /* If even the 'Y' rd value of split is higher than best so far |
| 2185 * then dont bother looking at UV | 2193 * then dont bother looking at UV |
| (...skipping 272 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2458 x->e_mbd.mode_info_context->mbmi.uv_mode = uv_intra_mode; | 2466 x->e_mbd.mode_info_context->mbmi.uv_mode = uv_intra_mode; |
| 2459 /* required for left and above block mv */ | 2467 /* required for left and above block mv */ |
| 2460 x->e_mbd.mode_info_context->mbmi.mv.as_int = 0; | 2468 x->e_mbd.mode_info_context->mbmi.mv.as_int = 0; |
| 2461 } | 2469 } |
| 2462 update_best_mode(&best_mode, this_rd, &rd, other_cost, x); | 2470 update_best_mode(&best_mode, this_rd, &rd, other_cost, x); |
| 2463 | 2471 |
| 2464 | 2472 |
| 2465 /* Testing this mode gave rise to an improvement in best error | 2473 /* Testing this mode gave rise to an improvement in best error |
| 2466 * score. Lower threshold a bit for next time | 2474 * score. Lower threshold a bit for next time |
| 2467 */ | 2475 */ |
| 2468 cpi->rd_thresh_mult[mode_index] = (cpi->rd_thresh_mult[mode_index] >
= (MIN_THRESHMULT + 2)) ? cpi->rd_thresh_mult[mode_index] - 2 : MIN_THRESHMULT; | 2476 x->rd_thresh_mult[mode_index] = |
| 2469 cpi->rd_threshes[mode_index] = (cpi->rd_baseline_thresh[mode_index]
>> 7) * cpi->rd_thresh_mult[mode_index]; | 2477 (x->rd_thresh_mult[mode_index] >= (MIN_THRESHMULT + 2)) ? |
| 2478 x->rd_thresh_mult[mode_index] - 2 : MIN_THRESHMULT; |
| 2470 } | 2479 } |
| 2471 | 2480 |
| 2472 /* If the mode did not help improve the best error case then raise | 2481 /* If the mode did not help improve the best error case then raise |
| 2473 * the threshold for testing that mode next time around. | 2482 * the threshold for testing that mode next time around. |
| 2474 */ | 2483 */ |
| 2475 else | 2484 else |
| 2476 { | 2485 { |
| 2477 cpi->rd_thresh_mult[mode_index] += 4; | 2486 x->rd_thresh_mult[mode_index] += 4; |
| 2478 | 2487 |
| 2479 if (cpi->rd_thresh_mult[mode_index] > MAX_THRESHMULT) | 2488 if (x->rd_thresh_mult[mode_index] > MAX_THRESHMULT) |
| 2480 cpi->rd_thresh_mult[mode_index] = MAX_THRESHMULT; | 2489 x->rd_thresh_mult[mode_index] = MAX_THRESHMULT; |
| 2481 | |
| 2482 cpi->rd_threshes[mode_index] = (cpi->rd_baseline_thresh[mode_index]
>> 7) * cpi->rd_thresh_mult[mode_index]; | |
| 2483 } | 2490 } |
| 2491 x->rd_threshes[mode_index] = |
| 2492 (cpi->rd_baseline_thresh[mode_index] >> 7) * |
| 2493 x->rd_thresh_mult[mode_index]; |
| 2484 | 2494 |
| 2485 if (x->skip) | 2495 if (x->skip) |
| 2486 break; | 2496 break; |
| 2487 | 2497 |
| 2488 } | 2498 } |
| 2489 | 2499 |
| 2490 /* Reduce the activation RD thresholds for the best choice mode */ | 2500 /* Reduce the activation RD thresholds for the best choice mode */ |
| 2491 if ((cpi->rd_baseline_thresh[best_mode_index] > 0) && (cpi->rd_baseline_thre
sh[best_mode_index] < (INT_MAX >> 2))) | 2501 if ((cpi->rd_baseline_thresh[best_mode_index] > 0) && (cpi->rd_baseline_thre
sh[best_mode_index] < (INT_MAX >> 2))) |
| 2492 { | 2502 { |
| 2493 int best_adjustment = (cpi->rd_thresh_mult[best_mode_index] >> 2); | 2503 int best_adjustment = (x->rd_thresh_mult[best_mode_index] >> 2); |
| 2494 | 2504 |
| 2495 cpi->rd_thresh_mult[best_mode_index] = (cpi->rd_thresh_mult[best_mode_in
dex] >= (MIN_THRESHMULT + best_adjustment)) ? cpi->rd_thresh_mult[best_mode_inde
x] - best_adjustment : MIN_THRESHMULT; | 2505 x->rd_thresh_mult[best_mode_index] = |
| 2496 cpi->rd_threshes[best_mode_index] = (cpi->rd_baseline_thresh[best_mode_i
ndex] >> 7) * cpi->rd_thresh_mult[best_mode_index]; | 2506 (x->rd_thresh_mult[best_mode_index] >= |
| 2507 (MIN_THRESHMULT + best_adjustment)) ? |
| 2508 x->rd_thresh_mult[best_mode_index] - best_adjustment : |
| 2509 MIN_THRESHMULT; |
| 2510 x->rd_threshes[best_mode_index] = |
| 2511 (cpi->rd_baseline_thresh[best_mode_index] >> 7) * |
| 2512 x->rd_thresh_mult[best_mode_index]; |
| 2497 } | 2513 } |
| 2498 | 2514 |
| 2499 /* Note how often each mode chosen as best */ | 2515 /* Note how often each mode chosen as best */ |
| 2500 cpi->mode_chosen_counts[best_mode_index] ++; | 2516 cpi->mode_chosen_counts[best_mode_index] ++; |
| 2501 | 2517 |
| 2502 #if CONFIG_TEMPORAL_DENOISING | 2518 #if CONFIG_TEMPORAL_DENOISING |
| 2503 if (cpi->oxcf.noise_sensitivity) | 2519 if (cpi->oxcf.noise_sensitivity) |
| 2504 { | 2520 { |
| 2505 if (x->best_sse_inter_mode == DC_PRED) | 2521 if (x->best_sse_inter_mode == DC_PRED) |
| 2506 { | 2522 { |
| (...skipping 78 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2585 vpx_memcpy(x->partition_info, &best_mode.partition, sizeof(PARTITION_INF
O)); | 2601 vpx_memcpy(x->partition_info, &best_mode.partition, sizeof(PARTITION_INF
O)); |
| 2586 | 2602 |
| 2587 x->e_mbd.mode_info_context->mbmi.mv.as_int = | 2603 x->e_mbd.mode_info_context->mbmi.mv.as_int = |
| 2588 x->partition_info->bmi[15].mv.as_int; | 2604 x->partition_info->bmi[15].mv.as_int; |
| 2589 } | 2605 } |
| 2590 | 2606 |
| 2591 if (sign_bias | 2607 if (sign_bias |
| 2592 != cpi->common.ref_frame_sign_bias[xd->mode_info_context->mbmi.ref_frame
]) | 2608 != cpi->common.ref_frame_sign_bias[xd->mode_info_context->mbmi.ref_frame
]) |
| 2593 best_ref_mv.as_int = best_ref_mv_sb[!sign_bias].as_int; | 2609 best_ref_mv.as_int = best_ref_mv_sb[!sign_bias].as_int; |
| 2594 | 2610 |
| 2595 rd_update_mvcount(cpi, x, &best_ref_mv); | 2611 rd_update_mvcount(x, &best_ref_mv); |
| 2596 } | 2612 } |
| 2597 | 2613 |
| 2598 void vp8_rd_pick_intra_mode(VP8_COMP *cpi, MACROBLOCK *x, int *rate_) | 2614 void vp8_rd_pick_intra_mode(MACROBLOCK *x, int *rate_) |
| 2599 { | 2615 { |
| 2600 int error4x4, error16x16; | 2616 int error4x4, error16x16; |
| 2601 int rate4x4, rate16x16 = 0, rateuv; | 2617 int rate4x4, rate16x16 = 0, rateuv; |
| 2602 int dist4x4, dist16x16, distuv; | 2618 int dist4x4, dist16x16, distuv; |
| 2603 int rate; | 2619 int rate; |
| 2604 int rate4x4_tokenonly = 0; | 2620 int rate4x4_tokenonly = 0; |
| 2605 int rate16x16_tokenonly = 0; | 2621 int rate16x16_tokenonly = 0; |
| 2606 int rateuv_tokenonly = 0; | 2622 int rateuv_tokenonly = 0; |
| 2607 | 2623 |
| 2608 x->e_mbd.mode_info_context->mbmi.ref_frame = INTRA_FRAME; | 2624 x->e_mbd.mode_info_context->mbmi.ref_frame = INTRA_FRAME; |
| 2609 | 2625 |
| 2610 rd_pick_intra_mbuv_mode(cpi, x, &rateuv, &rateuv_tokenonly, &distuv); | 2626 rd_pick_intra_mbuv_mode(x, &rateuv, &rateuv_tokenonly, &distuv); |
| 2611 rate = rateuv; | 2627 rate = rateuv; |
| 2612 | 2628 |
| 2613 error16x16 = rd_pick_intra16x16mby_mode(cpi, x, | 2629 error16x16 = rd_pick_intra16x16mby_mode(x, &rate16x16, &rate16x16_tokenonly, |
| 2614 &rate16x16, &rate16x16_tokenonly, | |
| 2615 &dist16x16); | 2630 &dist16x16); |
| 2616 | 2631 |
| 2617 error4x4 = rd_pick_intra4x4mby_modes(cpi, x, | 2632 error4x4 = rd_pick_intra4x4mby_modes(x, &rate4x4, &rate4x4_tokenonly, |
| 2618 &rate4x4, &rate4x4_tokenonly, | |
| 2619 &dist4x4, error16x16); | 2633 &dist4x4, error16x16); |
| 2620 | 2634 |
| 2621 if (error4x4 < error16x16) | 2635 if (error4x4 < error16x16) |
| 2622 { | 2636 { |
| 2623 x->e_mbd.mode_info_context->mbmi.mode = B_PRED; | 2637 x->e_mbd.mode_info_context->mbmi.mode = B_PRED; |
| 2624 rate += rate4x4; | 2638 rate += rate4x4; |
| 2625 } | 2639 } |
| 2626 else | 2640 else |
| 2627 { | 2641 { |
| 2628 rate += rate16x16; | 2642 rate += rate16x16; |
| 2629 } | 2643 } |
| 2630 | 2644 |
| 2631 *rate_ = rate; | 2645 *rate_ = rate; |
| 2632 } | 2646 } |
| OLD | NEW |