| 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 178 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 189 double correction_factor, | 189 double correction_factor, |
| 190 vpx_bit_depth_t bit_depth) { | 190 vpx_bit_depth_t bit_depth) { |
| 191 const int bpm = (int)(vp9_rc_bits_per_mb(frame_type, q, correction_factor, | 191 const int bpm = (int)(vp9_rc_bits_per_mb(frame_type, q, correction_factor, |
| 192 bit_depth)); | 192 bit_depth)); |
| 193 return MAX(FRAME_OVERHEAD_BITS, | 193 return MAX(FRAME_OVERHEAD_BITS, |
| 194 (int)((uint64_t)bpm * mbs) >> BPER_MB_NORMBITS); | 194 (int)((uint64_t)bpm * mbs) >> BPER_MB_NORMBITS); |
| 195 } | 195 } |
| 196 | 196 |
| 197 int vp9_rc_clamp_pframe_target_size(const VP9_COMP *const cpi, int target) { | 197 int vp9_rc_clamp_pframe_target_size(const VP9_COMP *const cpi, int target) { |
| 198 const RATE_CONTROL *rc = &cpi->rc; | 198 const RATE_CONTROL *rc = &cpi->rc; |
| 199 const VP9EncoderConfig *oxcf = &cpi->oxcf; |
| 199 const int min_frame_target = MAX(rc->min_frame_bandwidth, | 200 const int min_frame_target = MAX(rc->min_frame_bandwidth, |
| 200 rc->avg_frame_bandwidth >> 5); | 201 rc->avg_frame_bandwidth >> 5); |
| 201 if (target < min_frame_target) | 202 if (target < min_frame_target) |
| 202 target = min_frame_target; | 203 target = min_frame_target; |
| 203 if (cpi->refresh_golden_frame && rc->is_src_frame_alt_ref) { | 204 if (cpi->refresh_golden_frame && rc->is_src_frame_alt_ref) { |
| 204 // If there is an active ARF at this location use the minimum | 205 // If there is an active ARF at this location use the minimum |
| 205 // bits on this frame even if it is a constructed arf. | 206 // bits on this frame even if it is a constructed arf. |
| 206 // The active maximum quantizer insures that an appropriate | 207 // The active maximum quantizer insures that an appropriate |
| 207 // number of bits will be spent if needed for constructed ARFs. | 208 // number of bits will be spent if needed for constructed ARFs. |
| 208 target = min_frame_target; | 209 target = min_frame_target; |
| 209 } | 210 } |
| 210 // Clip the frame target to the maximum allowed value. | 211 // Clip the frame target to the maximum allowed value. |
| 211 if (target > rc->max_frame_bandwidth) | 212 if (target > rc->max_frame_bandwidth) |
| 212 target = rc->max_frame_bandwidth; | 213 target = rc->max_frame_bandwidth; |
| 214 if (oxcf->rc_max_inter_bitrate_pct) { |
| 215 const int max_rate = rc->avg_frame_bandwidth * |
| 216 oxcf->rc_max_inter_bitrate_pct / 100; |
| 217 target = MIN(target, max_rate); |
| 218 } |
| 213 return target; | 219 return target; |
| 214 } | 220 } |
| 215 | 221 |
| 216 int vp9_rc_clamp_iframe_target_size(const VP9_COMP *const cpi, int target) { | 222 int vp9_rc_clamp_iframe_target_size(const VP9_COMP *const cpi, int target) { |
| 217 const RATE_CONTROL *rc = &cpi->rc; | 223 const RATE_CONTROL *rc = &cpi->rc; |
| 218 const VP9EncoderConfig *oxcf = &cpi->oxcf; | 224 const VP9EncoderConfig *oxcf = &cpi->oxcf; |
| 219 if (oxcf->rc_max_intra_bitrate_pct) { | 225 if (oxcf->rc_max_intra_bitrate_pct) { |
| 220 const int max_rate = rc->avg_frame_bandwidth * | 226 const int max_rate = rc->avg_frame_bandwidth * |
| 221 oxcf->rc_max_intra_bitrate_pct / 100; | 227 oxcf->rc_max_intra_bitrate_pct / 100; |
| 222 target = MIN(target, max_rate); | 228 target = MIN(target, max_rate); |
| (...skipping 133 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 356 const RATE_CONTROL *const rc = &cpi->rc; | 362 const RATE_CONTROL *const rc = &cpi->rc; |
| 357 | 363 |
| 358 if (cpi->common.frame_type == KEY_FRAME) { | 364 if (cpi->common.frame_type == KEY_FRAME) { |
| 359 return rc->rate_correction_factors[KF_STD]; | 365 return rc->rate_correction_factors[KF_STD]; |
| 360 } else if (cpi->oxcf.pass == 2) { | 366 } else if (cpi->oxcf.pass == 2) { |
| 361 RATE_FACTOR_LEVEL rf_lvl = | 367 RATE_FACTOR_LEVEL rf_lvl = |
| 362 cpi->twopass.gf_group.rf_level[cpi->twopass.gf_group.index]; | 368 cpi->twopass.gf_group.rf_level[cpi->twopass.gf_group.index]; |
| 363 return rc->rate_correction_factors[rf_lvl]; | 369 return rc->rate_correction_factors[rf_lvl]; |
| 364 } else { | 370 } else { |
| 365 if ((cpi->refresh_alt_ref_frame || cpi->refresh_golden_frame) && | 371 if ((cpi->refresh_alt_ref_frame || cpi->refresh_golden_frame) && |
| 366 !rc->is_src_frame_alt_ref && | 372 !rc->is_src_frame_alt_ref && !cpi->use_svc && |
| 367 !(cpi->use_svc && cpi->oxcf.rc_mode == VPX_CBR)) | 373 cpi->oxcf.rc_mode != VPX_CBR) |
| 368 return rc->rate_correction_factors[GF_ARF_STD]; | 374 return rc->rate_correction_factors[GF_ARF_STD]; |
| 369 else | 375 else |
| 370 return rc->rate_correction_factors[INTER_NORMAL]; | 376 return rc->rate_correction_factors[INTER_NORMAL]; |
| 371 } | 377 } |
| 372 } | 378 } |
| 373 | 379 |
| 374 static void set_rate_correction_factor(VP9_COMP *cpi, double factor) { | 380 static void set_rate_correction_factor(VP9_COMP *cpi, double factor) { |
| 375 RATE_CONTROL *const rc = &cpi->rc; | 381 RATE_CONTROL *const rc = &cpi->rc; |
| 376 | 382 |
| 377 if (cpi->common.frame_type == KEY_FRAME) { | 383 if (cpi->common.frame_type == KEY_FRAME) { |
| 378 rc->rate_correction_factors[KF_STD] = factor; | 384 rc->rate_correction_factors[KF_STD] = factor; |
| 379 } else if (cpi->oxcf.pass == 2) { | 385 } else if (cpi->oxcf.pass == 2) { |
| 380 RATE_FACTOR_LEVEL rf_lvl = | 386 RATE_FACTOR_LEVEL rf_lvl = |
| 381 cpi->twopass.gf_group.rf_level[cpi->twopass.gf_group.index]; | 387 cpi->twopass.gf_group.rf_level[cpi->twopass.gf_group.index]; |
| 382 rc->rate_correction_factors[rf_lvl] = factor; | 388 rc->rate_correction_factors[rf_lvl] = factor; |
| 383 } else { | 389 } else { |
| 384 if ((cpi->refresh_alt_ref_frame || cpi->refresh_golden_frame) && | 390 if ((cpi->refresh_alt_ref_frame || cpi->refresh_golden_frame) && |
| 385 !rc->is_src_frame_alt_ref && | 391 !rc->is_src_frame_alt_ref && !cpi->use_svc && |
| 386 !(cpi->use_svc && cpi->oxcf.rc_mode == VPX_CBR)) | 392 cpi->oxcf.rc_mode != VPX_CBR) |
| 387 rc->rate_correction_factors[GF_ARF_STD] = factor; | 393 rc->rate_correction_factors[GF_ARF_STD] = factor; |
| 388 else | 394 else |
| 389 rc->rate_correction_factors[INTER_NORMAL] = factor; | 395 rc->rate_correction_factors[INTER_NORMAL] = factor; |
| 390 } | 396 } |
| 391 } | 397 } |
| 392 | 398 |
| 393 void vp9_rc_update_rate_correction_factors(VP9_COMP *cpi, int damp_var) { | 399 void vp9_rc_update_rate_correction_factors(VP9_COMP *cpi, int damp_var) { |
| 394 const VP9_COMMON *const cm = &cpi->common; | 400 const VP9_COMMON *const cm = &cpi->common; |
| 395 int correction_factor = 100; | 401 int correction_factor = 100; |
| 396 double rate_correction_factor = get_rate_correction_factor(cpi); | 402 double rate_correction_factor = get_rate_correction_factor(cpi); |
| (...skipping 20 matching lines...) Expand all Loading... |
| 417 correction_factor = (100 * cpi->rc.projected_frame_size) / | 423 correction_factor = (100 * cpi->rc.projected_frame_size) / |
| 418 projected_size_based_on_q; | 424 projected_size_based_on_q; |
| 419 | 425 |
| 420 // More heavily damped adjustment used if we have been oscillating either side | 426 // More heavily damped adjustment used if we have been oscillating either side |
| 421 // of target. | 427 // of target. |
| 422 switch (damp_var) { | 428 switch (damp_var) { |
| 423 case 0: | 429 case 0: |
| 424 adjustment_limit = 0.75; | 430 adjustment_limit = 0.75; |
| 425 break; | 431 break; |
| 426 case 1: | 432 case 1: |
| 427 adjustment_limit = 0.375; | 433 adjustment_limit = 0.25 + |
| 434 0.5 * MIN(1, fabs(log10(0.01 * correction_factor))); |
| 428 break; | 435 break; |
| 429 case 2: | 436 case 2: |
| 430 default: | 437 default: |
| 431 adjustment_limit = 0.25; | 438 adjustment_limit = 0.25; |
| 432 break; | 439 break; |
| 433 } | 440 } |
| 434 | 441 |
| 442 cpi->rc.q_2_frame = cpi->rc.q_1_frame; |
| 443 cpi->rc.q_1_frame = cm->base_qindex; |
| 444 cpi->rc.rc_2_frame = cpi->rc.rc_1_frame; |
| 445 if (correction_factor > 110) |
| 446 cpi->rc.rc_1_frame = -1; |
| 447 else if (correction_factor < 90) |
| 448 cpi->rc.rc_1_frame = 1; |
| 449 else |
| 450 cpi->rc.rc_1_frame = 0; |
| 451 |
| 435 if (correction_factor > 102) { | 452 if (correction_factor > 102) { |
| 436 // We are not already at the worst allowable quality | 453 // We are not already at the worst allowable quality |
| 437 correction_factor = (int)(100 + ((correction_factor - 100) * | 454 correction_factor = (int)(100 + ((correction_factor - 100) * |
| 438 adjustment_limit)); | 455 adjustment_limit)); |
| 439 rate_correction_factor = (rate_correction_factor * correction_factor) / 100; | 456 rate_correction_factor = (rate_correction_factor * correction_factor) / 100; |
| 440 | |
| 441 // Keep rate_correction_factor within limits | 457 // Keep rate_correction_factor within limits |
| 442 if (rate_correction_factor > MAX_BPB_FACTOR) | 458 if (rate_correction_factor > MAX_BPB_FACTOR) |
| 443 rate_correction_factor = MAX_BPB_FACTOR; | 459 rate_correction_factor = MAX_BPB_FACTOR; |
| 444 } else if (correction_factor < 99) { | 460 } else if (correction_factor < 99) { |
| 445 // We are not already at the best allowable quality | 461 // We are not already at the best allowable quality |
| 446 correction_factor = (int)(100 - ((100 - correction_factor) * | 462 correction_factor = (int)(100 - ((100 - correction_factor) * |
| 447 adjustment_limit)); | 463 adjustment_limit)); |
| 448 rate_correction_factor = (rate_correction_factor * correction_factor) / 100; | 464 rate_correction_factor = (rate_correction_factor * correction_factor) / 100; |
| 449 | 465 |
| 450 // Keep rate_correction_factor within limits | 466 // Keep rate_correction_factor within limits |
| (...skipping 30 matching lines...) Expand all Loading... |
| 481 q = i; | 497 q = i; |
| 482 else | 498 else |
| 483 q = i - 1; | 499 q = i - 1; |
| 484 | 500 |
| 485 break; | 501 break; |
| 486 } else { | 502 } else { |
| 487 last_error = bits_per_mb_at_this_q - target_bits_per_mb; | 503 last_error = bits_per_mb_at_this_q - target_bits_per_mb; |
| 488 } | 504 } |
| 489 } while (++i <= active_worst_quality); | 505 } while (++i <= active_worst_quality); |
| 490 | 506 |
| 507 // In CBR mode, this makes sure q is between oscillating Qs to prevent |
| 508 // resonance. |
| 509 if (cpi->oxcf.rc_mode == VPX_CBR && |
| 510 (cpi->rc.rc_1_frame * cpi->rc.rc_2_frame == -1) && |
| 511 cpi->rc.q_1_frame != cpi->rc.q_2_frame) { |
| 512 q = clamp(q, MIN(cpi->rc.q_1_frame, cpi->rc.q_2_frame), |
| 513 MAX(cpi->rc.q_1_frame, cpi->rc.q_2_frame)); |
| 514 } |
| 491 return q; | 515 return q; |
| 492 } | 516 } |
| 493 | 517 |
| 494 static int get_active_quality(int q, int gfu_boost, int low, int high, | 518 static int get_active_quality(int q, int gfu_boost, int low, int high, |
| 495 int *low_motion_minq, int *high_motion_minq) { | 519 int *low_motion_minq, int *high_motion_minq) { |
| 496 if (gfu_boost > high) { | 520 if (gfu_boost > high) { |
| 497 return low_motion_minq[q]; | 521 return low_motion_minq[q]; |
| 498 } else if (gfu_boost < low) { | 522 } else if (gfu_boost < low) { |
| 499 return high_motion_minq[q]; | 523 return high_motion_minq[q]; |
| 500 } else { | 524 } else { |
| (...skipping 49 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 550 // Adjust active_worst_quality level based on buffer level. | 574 // Adjust active_worst_quality level based on buffer level. |
| 551 static int calc_active_worst_quality_one_pass_cbr(const VP9_COMP *cpi) { | 575 static int calc_active_worst_quality_one_pass_cbr(const VP9_COMP *cpi) { |
| 552 // Adjust active_worst_quality: If buffer is above the optimal/target level, | 576 // Adjust active_worst_quality: If buffer is above the optimal/target level, |
| 553 // bring active_worst_quality down depending on fullness of buffer. | 577 // bring active_worst_quality down depending on fullness of buffer. |
| 554 // If buffer is below the optimal level, let the active_worst_quality go from | 578 // If buffer is below the optimal level, let the active_worst_quality go from |
| 555 // ambient Q (at buffer = optimal level) to worst_quality level | 579 // ambient Q (at buffer = optimal level) to worst_quality level |
| 556 // (at buffer = critical level). | 580 // (at buffer = critical level). |
| 557 const VP9_COMMON *const cm = &cpi->common; | 581 const VP9_COMMON *const cm = &cpi->common; |
| 558 const RATE_CONTROL *rc = &cpi->rc; | 582 const RATE_CONTROL *rc = &cpi->rc; |
| 559 // Buffer level below which we push active_worst to worst_quality. | 583 // Buffer level below which we push active_worst to worst_quality. |
| 560 int64_t critical_level = rc->optimal_buffer_level >> 2; | 584 int64_t critical_level = rc->optimal_buffer_level >> 3; |
| 561 int64_t buff_lvl_step = 0; | 585 int64_t buff_lvl_step = 0; |
| 562 int adjustment = 0; | 586 int adjustment = 0; |
| 563 int active_worst_quality; | 587 int active_worst_quality; |
| 588 int ambient_qp; |
| 564 if (cm->frame_type == KEY_FRAME) | 589 if (cm->frame_type == KEY_FRAME) |
| 565 return rc->worst_quality * 4 / 5; | 590 return rc->worst_quality; |
| 566 if (cm->current_video_frame > 1) | 591 // For ambient_qp we use minimum of avg_frame_qindex[KEY_FRAME/INTER_FRAME] |
| 567 active_worst_quality = MIN(rc->worst_quality, | 592 // for the first few frames following key frame. These are both initialized |
| 568 rc->avg_frame_qindex[INTER_FRAME] * 5 / 4); | 593 // to worst_quality and updated with (3/4, 1/4) average in postencode_update. |
| 569 else | 594 // So for first few frames following key, the qp of that key frame is weighted |
| 570 active_worst_quality = MIN(rc->worst_quality, | 595 // into the active_worst_quality setting. |
| 571 rc->avg_frame_qindex[KEY_FRAME] * 3 / 2); | 596 ambient_qp = (cm->current_video_frame < 5) ? |
| 597 MIN(rc->avg_frame_qindex[INTER_FRAME], rc->avg_frame_qindex[KEY_FRAME]) : |
| 598 rc->avg_frame_qindex[INTER_FRAME]; |
| 599 active_worst_quality = MIN(rc->worst_quality, |
| 600 ambient_qp * 5 / 4); |
| 572 if (rc->buffer_level > rc->optimal_buffer_level) { | 601 if (rc->buffer_level > rc->optimal_buffer_level) { |
| 573 // Adjust down. | 602 // Adjust down. |
| 574 // Maximum limit for down adjustment, ~30%. | 603 // Maximum limit for down adjustment, ~30%. |
| 575 int max_adjustment_down = active_worst_quality / 3; | 604 int max_adjustment_down = active_worst_quality / 3; |
| 576 if (max_adjustment_down) { | 605 if (max_adjustment_down) { |
| 577 buff_lvl_step = ((rc->maximum_buffer_size - | 606 buff_lvl_step = ((rc->maximum_buffer_size - |
| 578 rc->optimal_buffer_level) / max_adjustment_down); | 607 rc->optimal_buffer_level) / max_adjustment_down); |
| 579 if (buff_lvl_step) | 608 if (buff_lvl_step) |
| 580 adjustment = (int)((rc->buffer_level - rc->optimal_buffer_level) / | 609 adjustment = (int)((rc->buffer_level - rc->optimal_buffer_level) / |
| 581 buff_lvl_step); | 610 buff_lvl_step); |
| 582 active_worst_quality -= adjustment; | 611 active_worst_quality -= adjustment; |
| 583 } | 612 } |
| 584 } else if (rc->buffer_level > critical_level) { | 613 } else if (rc->buffer_level > critical_level) { |
| 585 // Adjust up from ambient Q. | 614 // Adjust up from ambient Q. |
| 586 if (critical_level) { | 615 if (critical_level) { |
| 587 buff_lvl_step = (rc->optimal_buffer_level - critical_level); | 616 buff_lvl_step = (rc->optimal_buffer_level - critical_level); |
| 588 if (buff_lvl_step) { | 617 if (buff_lvl_step) { |
| 589 adjustment = | 618 adjustment = (int)((rc->worst_quality - ambient_qp) * |
| 590 (int)((rc->worst_quality - rc->avg_frame_qindex[INTER_FRAME]) * | 619 (rc->optimal_buffer_level - rc->buffer_level) / |
| 591 (rc->optimal_buffer_level - rc->buffer_level) / | 620 buff_lvl_step); |
| 592 buff_lvl_step); | |
| 593 } | 621 } |
| 594 active_worst_quality = rc->avg_frame_qindex[INTER_FRAME] + adjustment; | 622 active_worst_quality = ambient_qp + adjustment; |
| 595 } | 623 } |
| 596 } else { | 624 } else { |
| 597 // Set to worst_quality if buffer is below critical level. | 625 // Set to worst_quality if buffer is below critical level. |
| 598 active_worst_quality = rc->worst_quality; | 626 active_worst_quality = rc->worst_quality; |
| 599 } | 627 } |
| 600 return active_worst_quality; | 628 return active_worst_quality; |
| 601 } | 629 } |
| 602 | 630 |
| 603 static int rc_pick_q_and_bounds_one_pass_cbr(const VP9_COMP *cpi, | 631 static int rc_pick_q_and_bounds_one_pass_cbr(const VP9_COMP *cpi, |
| 604 int *bottom_index, | 632 int *bottom_index, |
| (...skipping 359 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 964 | 992 |
| 965 active_best_quality = get_gf_active_quality(rc, q, cm->bit_depth); | 993 active_best_quality = get_gf_active_quality(rc, q, cm->bit_depth); |
| 966 | 994 |
| 967 // Constrained quality use slightly lower active best. | 995 // Constrained quality use slightly lower active best. |
| 968 active_best_quality = active_best_quality * 15 / 16; | 996 active_best_quality = active_best_quality * 15 / 16; |
| 969 | 997 |
| 970 } else if (oxcf->rc_mode == VPX_Q) { | 998 } else if (oxcf->rc_mode == VPX_Q) { |
| 971 if (!cpi->refresh_alt_ref_frame) { | 999 if (!cpi->refresh_alt_ref_frame) { |
| 972 active_best_quality = cq_level; | 1000 active_best_quality = cq_level; |
| 973 } else { | 1001 } else { |
| 974 active_best_quality = get_gf_active_quality(rc, q, cm->bit_depth); | 1002 const GF_GROUP *const gf_group = &cpi->twopass.gf_group; |
| 1003 active_best_quality = get_gf_active_quality(rc, q, cm->bit_depth); |
| 1004 |
| 1005 // Modify best quality for second level arfs. For mode VPX_Q this |
| 1006 // becomes the baseline frame q. |
| 1007 if (gf_group->rf_level[gf_group->index] == GF_ARF_LOW) |
| 1008 active_best_quality = (active_best_quality + cq_level + 1) / 2; |
| 975 } | 1009 } |
| 976 } else { | 1010 } else { |
| 977 active_best_quality = get_gf_active_quality(rc, q, cm->bit_depth); | 1011 active_best_quality = get_gf_active_quality(rc, q, cm->bit_depth); |
| 978 } | 1012 } |
| 979 } else { | 1013 } else { |
| 980 if (oxcf->rc_mode == VPX_Q) { | 1014 if (oxcf->rc_mode == VPX_Q) { |
| 981 active_best_quality = cq_level; | 1015 active_best_quality = cq_level; |
| 982 } else { | 1016 } else { |
| 983 active_best_quality = inter_minq[active_worst_quality]; | 1017 active_best_quality = inter_minq[active_worst_quality]; |
| 984 | 1018 |
| (...skipping 182 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1167 const VP9_COMMON *const cm = &cpi->common; | 1201 const VP9_COMMON *const cm = &cpi->common; |
| 1168 const VP9EncoderConfig *const oxcf = &cpi->oxcf; | 1202 const VP9EncoderConfig *const oxcf = &cpi->oxcf; |
| 1169 RATE_CONTROL *const rc = &cpi->rc; | 1203 RATE_CONTROL *const rc = &cpi->rc; |
| 1170 const int qindex = cm->base_qindex; | 1204 const int qindex = cm->base_qindex; |
| 1171 | 1205 |
| 1172 // Update rate control heuristics | 1206 // Update rate control heuristics |
| 1173 rc->projected_frame_size = (int)(bytes_used << 3); | 1207 rc->projected_frame_size = (int)(bytes_used << 3); |
| 1174 | 1208 |
| 1175 // Post encode loop adjustment of Q prediction. | 1209 // Post encode loop adjustment of Q prediction. |
| 1176 vp9_rc_update_rate_correction_factors( | 1210 vp9_rc_update_rate_correction_factors( |
| 1177 cpi, (cpi->sf.recode_loop >= ALLOW_RECODE_KFARFGF || | 1211 cpi, (cpi->sf.recode_loop >= ALLOW_RECODE_KFARFGF) ? 2 : |
| 1178 oxcf->rc_mode == VPX_CBR) ? 2 : 0); | 1212 ((oxcf->rc_mode == VPX_CBR) ? 1 : 0)); |
| 1179 | 1213 |
| 1180 // Keep a record of last Q and ambient average Q. | 1214 // Keep a record of last Q and ambient average Q. |
| 1181 if (cm->frame_type == KEY_FRAME) { | 1215 if (cm->frame_type == KEY_FRAME) { |
| 1182 rc->last_q[KEY_FRAME] = qindex; | 1216 rc->last_q[KEY_FRAME] = qindex; |
| 1183 rc->avg_frame_qindex[KEY_FRAME] = | 1217 rc->avg_frame_qindex[KEY_FRAME] = |
| 1184 ROUND_POWER_OF_TWO(3 * rc->avg_frame_qindex[KEY_FRAME] + qindex, 2); | 1218 ROUND_POWER_OF_TWO(3 * rc->avg_frame_qindex[KEY_FRAME] + qindex, 2); |
| 1185 } else { | 1219 } else { |
| 1186 if (rc->is_src_frame_alt_ref || | 1220 if (rc->is_src_frame_alt_ref || |
| 1187 !(cpi->refresh_golden_frame || cpi->refresh_alt_ref_frame) || | 1221 !(cpi->refresh_golden_frame || cpi->refresh_alt_ref_frame) || |
| 1188 (cpi->use_svc && oxcf->rc_mode == VPX_CBR)) { | 1222 (cpi->use_svc && oxcf->rc_mode == VPX_CBR)) { |
| (...skipping 59 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1248 rc->frames_to_key--; | 1282 rc->frames_to_key--; |
| 1249 } | 1283 } |
| 1250 } | 1284 } |
| 1251 | 1285 |
| 1252 void vp9_rc_postencode_update_drop_frame(VP9_COMP *cpi) { | 1286 void vp9_rc_postencode_update_drop_frame(VP9_COMP *cpi) { |
| 1253 // Update buffer level with zero size, update frame counters, and return. | 1287 // Update buffer level with zero size, update frame counters, and return. |
| 1254 update_buffer_level(cpi, 0); | 1288 update_buffer_level(cpi, 0); |
| 1255 cpi->common.last_frame_type = cpi->common.frame_type; | 1289 cpi->common.last_frame_type = cpi->common.frame_type; |
| 1256 cpi->rc.frames_since_key++; | 1290 cpi->rc.frames_since_key++; |
| 1257 cpi->rc.frames_to_key--; | 1291 cpi->rc.frames_to_key--; |
| 1292 cpi->rc.rc_2_frame = 0; |
| 1293 cpi->rc.rc_1_frame = 0; |
| 1258 } | 1294 } |
| 1259 | 1295 |
| 1260 // Use this macro to turn on/off use of alt-refs in one-pass mode. | 1296 // Use this macro to turn on/off use of alt-refs in one-pass mode. |
| 1261 #define USE_ALTREF_FOR_ONE_PASS 1 | 1297 #define USE_ALTREF_FOR_ONE_PASS 1 |
| 1262 | 1298 |
| 1263 static int calc_pframe_target_size_one_pass_vbr(const VP9_COMP *const cpi) { | 1299 static int calc_pframe_target_size_one_pass_vbr(const VP9_COMP *const cpi) { |
| 1264 static const int af_ratio = 10; | 1300 static const int af_ratio = 10; |
| 1265 const RATE_CONTROL *const rc = &cpi->rc; | 1301 const RATE_CONTROL *const rc = &cpi->rc; |
| 1266 int target; | 1302 int target; |
| 1267 #if USE_ALTREF_FOR_ONE_PASS | 1303 #if USE_ALTREF_FOR_ONE_PASS |
| (...skipping 52 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1320 vp9_rc_set_frame_target(cpi, target); | 1356 vp9_rc_set_frame_target(cpi, target); |
| 1321 } | 1357 } |
| 1322 | 1358 |
| 1323 static int calc_pframe_target_size_one_pass_cbr(const VP9_COMP *cpi) { | 1359 static int calc_pframe_target_size_one_pass_cbr(const VP9_COMP *cpi) { |
| 1324 const VP9EncoderConfig *oxcf = &cpi->oxcf; | 1360 const VP9EncoderConfig *oxcf = &cpi->oxcf; |
| 1325 const RATE_CONTROL *rc = &cpi->rc; | 1361 const RATE_CONTROL *rc = &cpi->rc; |
| 1326 const SVC *const svc = &cpi->svc; | 1362 const SVC *const svc = &cpi->svc; |
| 1327 const int64_t diff = rc->optimal_buffer_level - rc->buffer_level; | 1363 const int64_t diff = rc->optimal_buffer_level - rc->buffer_level; |
| 1328 const int64_t one_pct_bits = 1 + rc->optimal_buffer_level / 100; | 1364 const int64_t one_pct_bits = 1 + rc->optimal_buffer_level / 100; |
| 1329 int min_frame_target = MAX(rc->avg_frame_bandwidth >> 4, FRAME_OVERHEAD_BITS); | 1365 int min_frame_target = MAX(rc->avg_frame_bandwidth >> 4, FRAME_OVERHEAD_BITS); |
| 1330 int target = rc->avg_frame_bandwidth; | 1366 int target; |
| 1367 |
| 1368 if (oxcf->gf_cbr_boost_pct) { |
| 1369 const int af_ratio_pct = oxcf->gf_cbr_boost_pct + 100; |
| 1370 target = cpi->refresh_golden_frame ? |
| 1371 (rc->avg_frame_bandwidth * rc->baseline_gf_interval * af_ratio_pct) / |
| 1372 (rc->baseline_gf_interval * 100 + af_ratio_pct - 100) : |
| 1373 (rc->avg_frame_bandwidth * rc->baseline_gf_interval * 100) / |
| 1374 (rc->baseline_gf_interval * 100 + af_ratio_pct - 100); |
| 1375 } else { |
| 1376 target = rc->avg_frame_bandwidth; |
| 1377 } |
| 1331 if (svc->number_temporal_layers > 1 && | 1378 if (svc->number_temporal_layers > 1 && |
| 1332 oxcf->rc_mode == VPX_CBR) { | 1379 oxcf->rc_mode == VPX_CBR) { |
| 1333 // Note that for layers, avg_frame_bandwidth is the cumulative | 1380 // Note that for layers, avg_frame_bandwidth is the cumulative |
| 1334 // per-frame-bandwidth. For the target size of this frame, use the | 1381 // per-frame-bandwidth. For the target size of this frame, use the |
| 1335 // layer average frame size (i.e., non-cumulative per-frame-bw). | 1382 // layer average frame size (i.e., non-cumulative per-frame-bw). |
| 1336 int current_temporal_layer = svc->temporal_layer_id; | 1383 int current_temporal_layer = svc->temporal_layer_id; |
| 1337 const LAYER_CONTEXT *lc = &svc->layer_context[current_temporal_layer]; | 1384 const LAYER_CONTEXT *lc = &svc->layer_context[current_temporal_layer]; |
| 1338 target = lc->avg_frame_size; | 1385 target = lc->avg_frame_size; |
| 1339 min_frame_target = MAX(lc->avg_frame_size >> 4, FRAME_OVERHEAD_BITS); | 1386 min_frame_target = MAX(lc->avg_frame_size >> 4, FRAME_OVERHEAD_BITS); |
| 1340 } | 1387 } |
| 1341 if (diff > 0) { | 1388 if (diff > 0) { |
| 1342 // Lower the target bandwidth for this frame. | 1389 // Lower the target bandwidth for this frame. |
| 1343 const int pct_low = (int)MIN(diff / one_pct_bits, oxcf->under_shoot_pct); | 1390 const int pct_low = (int)MIN(diff / one_pct_bits, oxcf->under_shoot_pct); |
| 1344 target -= (target * pct_low) / 200; | 1391 target -= (target * pct_low) / 200; |
| 1345 } else if (diff < 0) { | 1392 } else if (diff < 0) { |
| 1346 // Increase the target bandwidth for this frame. | 1393 // Increase the target bandwidth for this frame. |
| 1347 const int pct_high = (int)MIN(-diff / one_pct_bits, oxcf->over_shoot_pct); | 1394 const int pct_high = (int)MIN(-diff / one_pct_bits, oxcf->over_shoot_pct); |
| 1348 target += (target * pct_high) / 200; | 1395 target += (target * pct_high) / 200; |
| 1349 } | 1396 } |
| 1397 if (oxcf->rc_max_inter_bitrate_pct) { |
| 1398 const int max_rate = rc->avg_frame_bandwidth * |
| 1399 oxcf->rc_max_inter_bitrate_pct / 100; |
| 1400 target = MIN(target, max_rate); |
| 1401 } |
| 1350 return MAX(min_frame_target, target); | 1402 return MAX(min_frame_target, target); |
| 1351 } | 1403 } |
| 1352 | 1404 |
| 1353 static int calc_iframe_target_size_one_pass_cbr(const VP9_COMP *cpi) { | 1405 static int calc_iframe_target_size_one_pass_cbr(const VP9_COMP *cpi) { |
| 1354 const RATE_CONTROL *rc = &cpi->rc; | 1406 const RATE_CONTROL *rc = &cpi->rc; |
| 1355 const VP9EncoderConfig *oxcf = &cpi->oxcf; | 1407 const VP9EncoderConfig *oxcf = &cpi->oxcf; |
| 1356 const SVC *const svc = &cpi->svc; | 1408 const SVC *const svc = &cpi->svc; |
| 1357 int target; | 1409 int target; |
| 1358 if (cpi->common.current_video_frame == 0) { | 1410 if (cpi->common.current_video_frame == 0) { |
| 1359 target = ((rc->starting_buffer_level / 2) > INT_MAX) | 1411 target = ((rc->starting_buffer_level / 2) > INT_MAX) |
| (...skipping 69 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1429 if ((cm->current_video_frame == 0 || | 1481 if ((cm->current_video_frame == 0 || |
| 1430 (cpi->frame_flags & FRAMEFLAGS_KEY) || | 1482 (cpi->frame_flags & FRAMEFLAGS_KEY) || |
| 1431 rc->frames_to_key == 0 || | 1483 rc->frames_to_key == 0 || |
| 1432 (cpi->oxcf.auto_key && 0))) { | 1484 (cpi->oxcf.auto_key && 0))) { |
| 1433 cm->frame_type = KEY_FRAME; | 1485 cm->frame_type = KEY_FRAME; |
| 1434 rc->this_key_frame_forced = cm->current_video_frame != 0 && | 1486 rc->this_key_frame_forced = cm->current_video_frame != 0 && |
| 1435 rc->frames_to_key == 0; | 1487 rc->frames_to_key == 0; |
| 1436 rc->frames_to_key = cpi->oxcf.key_freq; | 1488 rc->frames_to_key = cpi->oxcf.key_freq; |
| 1437 rc->kf_boost = DEFAULT_KF_BOOST; | 1489 rc->kf_boost = DEFAULT_KF_BOOST; |
| 1438 rc->source_alt_ref_active = 0; | 1490 rc->source_alt_ref_active = 0; |
| 1439 target = calc_iframe_target_size_one_pass_cbr(cpi); | |
| 1440 } else { | 1491 } else { |
| 1441 cm->frame_type = INTER_FRAME; | 1492 cm->frame_type = INTER_FRAME; |
| 1493 } |
| 1494 if (rc->frames_till_gf_update_due == 0) { |
| 1495 rc->baseline_gf_interval = DEFAULT_GF_INTERVAL; |
| 1496 rc->frames_till_gf_update_due = rc->baseline_gf_interval; |
| 1497 // NOTE: frames_till_gf_update_due must be <= frames_to_key. |
| 1498 if (rc->frames_till_gf_update_due > rc->frames_to_key) |
| 1499 rc->frames_till_gf_update_due = rc->frames_to_key; |
| 1500 cpi->refresh_golden_frame = 1; |
| 1501 rc->gfu_boost = DEFAULT_GF_BOOST; |
| 1502 } |
| 1503 |
| 1504 if (cm->frame_type == KEY_FRAME) |
| 1505 target = calc_iframe_target_size_one_pass_cbr(cpi); |
| 1506 else |
| 1442 target = calc_pframe_target_size_one_pass_cbr(cpi); | 1507 target = calc_pframe_target_size_one_pass_cbr(cpi); |
| 1443 } | 1508 |
| 1444 vp9_rc_set_frame_target(cpi, target); | 1509 vp9_rc_set_frame_target(cpi, target); |
| 1445 // Don't use gf_update by default in CBR mode. | |
| 1446 rc->frames_till_gf_update_due = INT_MAX; | |
| 1447 rc->baseline_gf_interval = INT_MAX; | |
| 1448 } | 1510 } |
| 1449 | 1511 |
| 1450 int vp9_compute_qdelta(const RATE_CONTROL *rc, double qstart, double qtarget, | 1512 int vp9_compute_qdelta(const RATE_CONTROL *rc, double qstart, double qtarget, |
| 1451 vpx_bit_depth_t bit_depth) { | 1513 vpx_bit_depth_t bit_depth) { |
| 1452 int start_index = rc->worst_quality; | 1514 int start_index = rc->worst_quality; |
| 1453 int target_index = rc->worst_quality; | 1515 int target_index = rc->worst_quality; |
| 1454 int i; | 1516 int i; |
| 1455 | 1517 |
| 1456 // Convert the average q value to an index. | 1518 // Convert the average q value to an index. |
| 1457 for (i = rc->best_quality; i < rc->worst_quality; ++i) { | 1519 for (i = rc->best_quality; i < rc->worst_quality; ++i) { |
| (...skipping 72 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1530 // a very high rate is given on the command line or the the rate cannnot | 1592 // a very high rate is given on the command line or the the rate cannnot |
| 1531 // be acheived because of a user specificed max q (e.g. when the user | 1593 // be acheived because of a user specificed max q (e.g. when the user |
| 1532 // specifies lossless encode. | 1594 // specifies lossless encode. |
| 1533 vbr_max_bits = (int)(((int64_t)rc->avg_frame_bandwidth * | 1595 vbr_max_bits = (int)(((int64_t)rc->avg_frame_bandwidth * |
| 1534 oxcf->two_pass_vbrmax_section) / 100); | 1596 oxcf->two_pass_vbrmax_section) / 100); |
| 1535 rc->max_frame_bandwidth = MAX(MAX((cm->MBs * MAX_MB_RATE), MAXRATE_1080P), | 1597 rc->max_frame_bandwidth = MAX(MAX((cm->MBs * MAX_MB_RATE), MAXRATE_1080P), |
| 1536 vbr_max_bits); | 1598 vbr_max_bits); |
| 1537 | 1599 |
| 1538 vp9_rc_set_gf_max_interval(cpi, rc); | 1600 vp9_rc_set_gf_max_interval(cpi, rc); |
| 1539 } | 1601 } |
| 1602 |
| 1603 #define VBR_PCT_ADJUSTMENT_LIMIT 50 |
| 1604 // For VBR...adjustment to the frame target based on error from previous frames |
| 1605 static void vbr_rate_correction(VP9_COMP *cpi, |
| 1606 int *this_frame_target, |
| 1607 int64_t vbr_bits_off_target) { |
| 1608 int max_delta; |
| 1609 double position_factor = 1.0; |
| 1610 |
| 1611 // How far through the clip are we. |
| 1612 // This number is used to damp the per frame rate correction. |
| 1613 // Range 0 - 1.0 |
| 1614 if (cpi->twopass.total_stats.count) { |
| 1615 position_factor = sqrt((double)cpi->common.current_video_frame / |
| 1616 cpi->twopass.total_stats.count); |
| 1617 } |
| 1618 max_delta = (int)(position_factor * |
| 1619 ((*this_frame_target * VBR_PCT_ADJUSTMENT_LIMIT) / 100)); |
| 1620 |
| 1621 // vbr_bits_off_target > 0 means we have extra bits to spend |
| 1622 if (vbr_bits_off_target > 0) { |
| 1623 *this_frame_target += |
| 1624 (vbr_bits_off_target > max_delta) ? max_delta |
| 1625 : (int)vbr_bits_off_target; |
| 1626 } else { |
| 1627 *this_frame_target -= |
| 1628 (vbr_bits_off_target < -max_delta) ? max_delta |
| 1629 : (int)-vbr_bits_off_target; |
| 1630 } |
| 1631 } |
| 1632 |
| 1633 void vp9_set_target_rate(VP9_COMP *cpi) { |
| 1634 RATE_CONTROL *const rc = &cpi->rc; |
| 1635 int target_rate = rc->base_frame_target; |
| 1636 |
| 1637 // Correction to rate target based on prior over or under shoot. |
| 1638 if (cpi->oxcf.rc_mode == VPX_VBR) |
| 1639 vbr_rate_correction(cpi, &target_rate, rc->vbr_bits_off_target); |
| 1640 vp9_rc_set_frame_target(cpi, target_rate); |
| 1641 } |
| OLD | NEW |