Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(5)

Side by Side Diff: source/libvpx/vp9/encoder/vp9_ratectrl.c

Issue 1015483002: libvpx: Pull from upstream (Closed) Base URL: https://chromium.googlesource.com/chromium/deps/libvpx.git@master
Patch Set: Created 5 years, 9 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
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 359 matching lines...) Expand 10 before | Expand all | Expand 10 after
370 rcf = rc->rate_correction_factors[rf_lvl]; 370 rcf = rc->rate_correction_factors[rf_lvl];
371 } else { 371 } else {
372 if ((cpi->refresh_alt_ref_frame || cpi->refresh_golden_frame) && 372 if ((cpi->refresh_alt_ref_frame || cpi->refresh_golden_frame) &&
373 !rc->is_src_frame_alt_ref && !cpi->use_svc && 373 !rc->is_src_frame_alt_ref && !cpi->use_svc &&
374 (cpi->oxcf.rc_mode != VPX_CBR || cpi->oxcf.gf_cbr_boost_pct > 20)) 374 (cpi->oxcf.rc_mode != VPX_CBR || cpi->oxcf.gf_cbr_boost_pct > 20))
375 rcf = rc->rate_correction_factors[GF_ARF_STD]; 375 rcf = rc->rate_correction_factors[GF_ARF_STD];
376 else 376 else
377 rcf = rc->rate_correction_factors[INTER_NORMAL]; 377 rcf = rc->rate_correction_factors[INTER_NORMAL];
378 } 378 }
379 rcf *= rcf_mult[rc->frame_size_selector]; 379 rcf *= rcf_mult[rc->frame_size_selector];
380 return rcf > MAX_BPB_FACTOR ? MAX_BPB_FACTOR : rcf; 380 return fclamp(rcf, MIN_BPB_FACTOR, MAX_BPB_FACTOR);
381 } 381 }
382 382
383 static void set_rate_correction_factor(VP9_COMP *cpi, double factor) { 383 static void set_rate_correction_factor(VP9_COMP *cpi, double factor) {
384 RATE_CONTROL *const rc = &cpi->rc; 384 RATE_CONTROL *const rc = &cpi->rc;
385 385
386 // Normalize RCF to account for the size-dependent scaling factor. 386 // Normalize RCF to account for the size-dependent scaling factor.
387 factor /= rcf_mult[cpi->rc.frame_size_selector]; 387 factor /= rcf_mult[cpi->rc.frame_size_selector];
388 388
389 factor = fclamp(factor, MIN_BPB_FACTOR, MAX_BPB_FACTOR);
390
389 if (cpi->common.frame_type == KEY_FRAME) { 391 if (cpi->common.frame_type == KEY_FRAME) {
390 rc->rate_correction_factors[KF_STD] = factor; 392 rc->rate_correction_factors[KF_STD] = factor;
391 } else if (cpi->oxcf.pass == 2) { 393 } else if (cpi->oxcf.pass == 2) {
392 RATE_FACTOR_LEVEL rf_lvl = 394 RATE_FACTOR_LEVEL rf_lvl =
393 cpi->twopass.gf_group.rf_level[cpi->twopass.gf_group.index]; 395 cpi->twopass.gf_group.rf_level[cpi->twopass.gf_group.index];
394 rc->rate_correction_factors[rf_lvl] = factor; 396 rc->rate_correction_factors[rf_lvl] = factor;
395 } else { 397 } else {
396 if ((cpi->refresh_alt_ref_frame || cpi->refresh_golden_frame) && 398 if ((cpi->refresh_alt_ref_frame || cpi->refresh_golden_frame) &&
397 !rc->is_src_frame_alt_ref && !cpi->use_svc && 399 !rc->is_src_frame_alt_ref && !cpi->use_svc &&
398 (cpi->oxcf.rc_mode != VPX_CBR || cpi->oxcf.gf_cbr_boost_pct > 20)) 400 (cpi->oxcf.rc_mode != VPX_CBR || cpi->oxcf.gf_cbr_boost_pct > 20))
(...skipping 348 matching lines...) Expand 10 before | Expand all | Expand 10 after
747 assert(*top_index <= rc->worst_quality && 749 assert(*top_index <= rc->worst_quality &&
748 *top_index >= rc->best_quality); 750 *top_index >= rc->best_quality);
749 assert(*bottom_index <= rc->worst_quality && 751 assert(*bottom_index <= rc->worst_quality &&
750 *bottom_index >= rc->best_quality); 752 *bottom_index >= rc->best_quality);
751 assert(q <= rc->worst_quality && q >= rc->best_quality); 753 assert(q <= rc->worst_quality && q >= rc->best_quality);
752 return q; 754 return q;
753 } 755 }
754 756
755 static int get_active_cq_level(const RATE_CONTROL *rc, 757 static int get_active_cq_level(const RATE_CONTROL *rc,
756 const VP9EncoderConfig *const oxcf) { 758 const VP9EncoderConfig *const oxcf) {
757 static const double cq_adjust_threshold = 0.5; 759 static const double cq_adjust_threshold = 0.1;
758 int active_cq_level = oxcf->cq_level; 760 int active_cq_level = oxcf->cq_level;
759 if (oxcf->rc_mode == VPX_CQ && 761 if (oxcf->rc_mode == VPX_CQ &&
760 rc->total_target_bits > 0) { 762 rc->total_target_bits > 0) {
761 const double x = (double)rc->total_actual_bits / rc->total_target_bits; 763 const double x = (double)rc->total_actual_bits / rc->total_target_bits;
762 if (x < cq_adjust_threshold) { 764 if (x < cq_adjust_threshold) {
763 active_cq_level = (int)(active_cq_level * x / cq_adjust_threshold); 765 active_cq_level = (int)(active_cq_level * x / cq_adjust_threshold);
764 } 766 }
765 } 767 }
766 return active_cq_level; 768 return active_cq_level;
767 } 769 }
(...skipping 275 matching lines...) Expand 10 before | Expand all | Expand 10 after
1043 // q to fall below the cq level. 1045 // q to fall below the cq level.
1044 if ((oxcf->rc_mode == VPX_CQ) && 1046 if ((oxcf->rc_mode == VPX_CQ) &&
1045 (active_best_quality < cq_level)) { 1047 (active_best_quality < cq_level)) {
1046 active_best_quality = cq_level; 1048 active_best_quality = cq_level;
1047 } 1049 }
1048 } 1050 }
1049 } 1051 }
1050 1052
1051 // Extension to max or min Q if undershoot or overshoot is outside 1053 // Extension to max or min Q if undershoot or overshoot is outside
1052 // the permitted range. 1054 // the permitted range.
1053 if ((cpi->oxcf.rc_mode == VPX_VBR) && 1055 if ((cpi->oxcf.rc_mode != VPX_Q) &&
1054 (cpi->twopass.gf_zeromotion_pct < VLOW_MOTION_THRESHOLD)) { 1056 (cpi->twopass.gf_zeromotion_pct < VLOW_MOTION_THRESHOLD)) {
1055 if (frame_is_intra_only(cm) || 1057 if (frame_is_intra_only(cm) ||
1056 (!rc->is_src_frame_alt_ref && 1058 (!rc->is_src_frame_alt_ref &&
1057 (cpi->refresh_golden_frame || cpi->refresh_alt_ref_frame))) { 1059 (cpi->refresh_golden_frame || cpi->refresh_alt_ref_frame))) {
1058 active_best_quality -= cpi->twopass.extend_minq; 1060 active_best_quality -= cpi->twopass.extend_minq;
1059 active_worst_quality += (cpi->twopass.extend_maxq / 2); 1061 active_worst_quality += (cpi->twopass.extend_maxq / 2);
1060 } else { 1062 } else {
1061 active_best_quality -= cpi->twopass.extend_minq / 2; 1063 active_best_quality -= cpi->twopass.extend_minq / 2;
1062 active_worst_quality += cpi->twopass.extend_maxq; 1064 active_worst_quality += cpi->twopass.extend_maxq;
1063 } 1065 }
(...skipping 158 matching lines...) Expand 10 before | Expand all | Expand 10 after
1222 } 1224 }
1223 } 1225 }
1224 1226
1225 void vp9_rc_postencode_update(VP9_COMP *cpi, uint64_t bytes_used) { 1227 void vp9_rc_postencode_update(VP9_COMP *cpi, uint64_t bytes_used) {
1226 const VP9_COMMON *const cm = &cpi->common; 1228 const VP9_COMMON *const cm = &cpi->common;
1227 const VP9EncoderConfig *const oxcf = &cpi->oxcf; 1229 const VP9EncoderConfig *const oxcf = &cpi->oxcf;
1228 RATE_CONTROL *const rc = &cpi->rc; 1230 RATE_CONTROL *const rc = &cpi->rc;
1229 const int qindex = cm->base_qindex; 1231 const int qindex = cm->base_qindex;
1230 1232
1231 if (cpi->oxcf.aq_mode == CYCLIC_REFRESH_AQ && cm->seg.enabled) { 1233 if (cpi->oxcf.aq_mode == CYCLIC_REFRESH_AQ && cm->seg.enabled) {
1232 vp9_cyclic_refresh_update_actual_count(cpi); 1234 vp9_cyclic_refresh_postencode(cpi);
1233 } 1235 }
1234 1236
1235 // Update rate control heuristics 1237 // Update rate control heuristics
1236 rc->projected_frame_size = (int)(bytes_used << 3); 1238 rc->projected_frame_size = (int)(bytes_used << 3);
1237 1239
1238 // Post encode loop adjustment of Q prediction. 1240 // Post encode loop adjustment of Q prediction.
1239 vp9_rc_update_rate_correction_factors(cpi); 1241 vp9_rc_update_rate_correction_factors(cpi);
1240 1242
1241 // Keep a record of last Q and ambient average Q. 1243 // Keep a record of last Q and ambient average Q.
1242 if (cm->frame_type == KEY_FRAME) { 1244 if (cm->frame_type == KEY_FRAME) {
(...skipping 285 matching lines...) Expand 10 before | Expand all | Expand 10 after
1528 cm->frame_type = KEY_FRAME; 1530 cm->frame_type = KEY_FRAME;
1529 rc->this_key_frame_forced = cm->current_video_frame != 0 && 1531 rc->this_key_frame_forced = cm->current_video_frame != 0 &&
1530 rc->frames_to_key == 0; 1532 rc->frames_to_key == 0;
1531 rc->frames_to_key = cpi->oxcf.key_freq; 1533 rc->frames_to_key = cpi->oxcf.key_freq;
1532 rc->kf_boost = DEFAULT_KF_BOOST; 1534 rc->kf_boost = DEFAULT_KF_BOOST;
1533 rc->source_alt_ref_active = 0; 1535 rc->source_alt_ref_active = 0;
1534 } else { 1536 } else {
1535 cm->frame_type = INTER_FRAME; 1537 cm->frame_type = INTER_FRAME;
1536 } 1538 }
1537 if (rc->frames_till_gf_update_due == 0) { 1539 if (rc->frames_till_gf_update_due == 0) {
1538 rc->baseline_gf_interval = DEFAULT_GF_INTERVAL; 1540 if (cpi->oxcf.aq_mode == CYCLIC_REFRESH_AQ)
1541 vp9_cyclic_refresh_set_golden_update(cpi);
1542 else
1543 rc->baseline_gf_interval = DEFAULT_GF_INTERVAL;
1539 rc->frames_till_gf_update_due = rc->baseline_gf_interval; 1544 rc->frames_till_gf_update_due = rc->baseline_gf_interval;
1540 // NOTE: frames_till_gf_update_due must be <= frames_to_key. 1545 // NOTE: frames_till_gf_update_due must be <= frames_to_key.
1541 if (rc->frames_till_gf_update_due > rc->frames_to_key) 1546 if (rc->frames_till_gf_update_due > rc->frames_to_key)
1542 rc->frames_till_gf_update_due = rc->frames_to_key; 1547 rc->frames_till_gf_update_due = rc->frames_to_key;
1543 cpi->refresh_golden_frame = 1; 1548 cpi->refresh_golden_frame = 1;
1544 rc->gfu_boost = DEFAULT_GF_BOOST; 1549 rc->gfu_boost = DEFAULT_GF_BOOST;
1545 } 1550 }
1546 1551
1547 // Any update/change of global cyclic refresh parameters (amount/delta-qp) 1552 // Any update/change of global cyclic refresh parameters (amount/delta-qp)
1548 // should be done here, before the frame qp is selected. 1553 // should be done here, before the frame qp is selected.
(...skipping 39 matching lines...) Expand 10 before | Expand all | Expand 10 after
1588 1593
1589 // Look up the current projected bits per block for the base index 1594 // Look up the current projected bits per block for the base index
1590 const int base_bits_per_mb = vp9_rc_bits_per_mb(frame_type, qindex, 1.0, 1595 const int base_bits_per_mb = vp9_rc_bits_per_mb(frame_type, qindex, 1.0,
1591 bit_depth); 1596 bit_depth);
1592 1597
1593 // Find the target bits per mb based on the base value and given ratio. 1598 // Find the target bits per mb based on the base value and given ratio.
1594 const int target_bits_per_mb = (int)(rate_target_ratio * base_bits_per_mb); 1599 const int target_bits_per_mb = (int)(rate_target_ratio * base_bits_per_mb);
1595 1600
1596 // Convert the q target to an index 1601 // Convert the q target to an index
1597 for (i = rc->best_quality; i < rc->worst_quality; ++i) { 1602 for (i = rc->best_quality; i < rc->worst_quality; ++i) {
1598 target_index = i; 1603 if (vp9_rc_bits_per_mb(frame_type, i, 1.0, bit_depth) <=
1599 if (vp9_rc_bits_per_mb(frame_type, i, 1.0, bit_depth) <= target_bits_per_mb) 1604 target_bits_per_mb) {
1605 target_index = i;
1600 break; 1606 break;
1607 }
1601 } 1608 }
1602
1603 return target_index - qindex; 1609 return target_index - qindex;
1604 } 1610 }
1605 1611
1606 void vp9_rc_set_gf_max_interval(const VP9_COMP *const cpi, 1612 void vp9_rc_set_gf_max_interval(const VP9_COMP *const cpi,
1607 RATE_CONTROL *const rc) { 1613 RATE_CONTROL *const rc) {
1608 const VP9EncoderConfig *const oxcf = &cpi->oxcf; 1614 const VP9EncoderConfig *const oxcf = &cpi->oxcf;
1609 // Set Maximum gf/arf interval 1615 // Set Maximum gf/arf interval
1610 rc->max_gf_interval = 16; 1616 rc->max_gf_interval = 16;
1611 1617
1612 // Extended interval for genuinely static scenes 1618 // Extended interval for genuinely static scenes
(...skipping 63 matching lines...) Expand 10 before | Expand all | Expand 10 after
1676 (vbr_bits_off_target < -max_delta) ? max_delta 1682 (vbr_bits_off_target < -max_delta) ? max_delta
1677 : (int)-vbr_bits_off_target; 1683 : (int)-vbr_bits_off_target;
1678 } 1684 }
1679 } 1685 }
1680 1686
1681 void vp9_set_target_rate(VP9_COMP *cpi) { 1687 void vp9_set_target_rate(VP9_COMP *cpi) {
1682 RATE_CONTROL *const rc = &cpi->rc; 1688 RATE_CONTROL *const rc = &cpi->rc;
1683 int target_rate = rc->base_frame_target; 1689 int target_rate = rc->base_frame_target;
1684 1690
1685 // Correction to rate target based on prior over or under shoot. 1691 // Correction to rate target based on prior over or under shoot.
1686 if (cpi->oxcf.rc_mode == VPX_VBR) 1692 if (cpi->oxcf.rc_mode == VPX_VBR || cpi->oxcf.rc_mode == VPX_CQ)
1687 vbr_rate_correction(cpi, &target_rate, rc->vbr_bits_off_target); 1693 vbr_rate_correction(cpi, &target_rate, rc->vbr_bits_off_target);
1688 vp9_rc_set_frame_target(cpi, target_rate); 1694 vp9_rc_set_frame_target(cpi, target_rate);
1689 } 1695 }
OLDNEW
« no previous file with comments | « source/libvpx/vp9/encoder/vp9_pickmode.c ('k') | source/libvpx/vp9/encoder/x86/vp9_avg_intrin_sse2.c » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698