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

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

Issue 1124333011: libvpx: Pull from upstream (Closed) Base URL: https://chromium.googlesource.com/chromium/deps/libvpx.git@master
Patch Set: only update to last nights LKGR Created 5 years, 7 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
« no previous file with comments | « source/libvpx/vp9/encoder/vp9_ratectrl.h ('k') | source/libvpx/vp9/encoder/vp9_rd.c » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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 1591 matching lines...) Expand 10 before | Expand all | Expand 10 after
1602 for (i = rc->best_quality; i < rc->worst_quality; ++i) { 1602 for (i = rc->best_quality; i < rc->worst_quality; ++i) {
1603 if (vp9_rc_bits_per_mb(frame_type, i, 1.0, bit_depth) <= 1603 if (vp9_rc_bits_per_mb(frame_type, i, 1.0, bit_depth) <=
1604 target_bits_per_mb) { 1604 target_bits_per_mb) {
1605 target_index = i; 1605 target_index = i;
1606 break; 1606 break;
1607 } 1607 }
1608 } 1608 }
1609 return target_index - qindex; 1609 return target_index - qindex;
1610 } 1610 }
1611 1611
1612 void vp9_rc_set_gf_max_interval(const VP9_COMP *const cpi, 1612 #define MIN_GF_INTERVAL 4
1613 RATE_CONTROL *const rc) { 1613 #define MAX_GF_INTERVAL 16
1614 void vp9_rc_set_gf_interval_range(const VP9_COMP *const cpi,
1615 RATE_CONTROL *const rc) {
1614 const VP9EncoderConfig *const oxcf = &cpi->oxcf; 1616 const VP9EncoderConfig *const oxcf = &cpi->oxcf;
1615 // Set Maximum gf/arf interval 1617
1616 rc->max_gf_interval = 16; 1618 // Set a minimum interval.
1619 rc->min_gf_interval =
1620 MIN(MAX_GF_INTERVAL, MAX(MIN_GF_INTERVAL, (int)(cpi->framerate * 0.125)));
1621
1622 // Set Maximum gf/arf interval.
1623 rc->max_gf_interval =
1624 MIN(MAX_GF_INTERVAL, (int)(cpi->framerate * 0.75));
1625 // Round up to next even number if odd.
1626 rc->max_gf_interval += (rc->max_gf_interval & 0x01);
1617 1627
1618 // Extended interval for genuinely static scenes 1628 // Extended interval for genuinely static scenes
1619 rc->static_scene_max_gf_interval = MAX_LAG_BUFFERS * 2; 1629 rc->static_scene_max_gf_interval = MAX_LAG_BUFFERS * 2;
1620 1630
1621 if (is_altref_enabled(cpi)) { 1631 if (is_altref_enabled(cpi)) {
1622 if (rc->static_scene_max_gf_interval > oxcf->lag_in_frames - 1) 1632 if (rc->static_scene_max_gf_interval > oxcf->lag_in_frames - 1)
1623 rc->static_scene_max_gf_interval = oxcf->lag_in_frames - 1; 1633 rc->static_scene_max_gf_interval = oxcf->lag_in_frames - 1;
1624 } 1634 }
1625 1635
1626 if (rc->max_gf_interval > rc->static_scene_max_gf_interval) 1636 if (rc->max_gf_interval > rc->static_scene_max_gf_interval)
1627 rc->max_gf_interval = rc->static_scene_max_gf_interval; 1637 rc->max_gf_interval = rc->static_scene_max_gf_interval;
1638
1639 // Clamp min to max
1640 rc->min_gf_interval = MIN(rc->min_gf_interval, rc->max_gf_interval);
1628 } 1641 }
1629 1642
1630 void vp9_rc_update_framerate(VP9_COMP *cpi) { 1643 void vp9_rc_update_framerate(VP9_COMP *cpi) {
1631 const VP9_COMMON *const cm = &cpi->common; 1644 const VP9_COMMON *const cm = &cpi->common;
1632 const VP9EncoderConfig *const oxcf = &cpi->oxcf; 1645 const VP9EncoderConfig *const oxcf = &cpi->oxcf;
1633 RATE_CONTROL *const rc = &cpi->rc; 1646 RATE_CONTROL *const rc = &cpi->rc;
1634 int vbr_max_bits; 1647 int vbr_max_bits;
1635 1648
1636 rc->avg_frame_bandwidth = (int)(oxcf->target_bandwidth / cpi->framerate); 1649 rc->avg_frame_bandwidth = (int)(oxcf->target_bandwidth / cpi->framerate);
1637 rc->min_frame_bandwidth = (int)(rc->avg_frame_bandwidth * 1650 rc->min_frame_bandwidth = (int)(rc->avg_frame_bandwidth *
1638 oxcf->two_pass_vbrmin_section / 100); 1651 oxcf->two_pass_vbrmin_section / 100);
1639 1652
1640 rc->min_frame_bandwidth = MAX(rc->min_frame_bandwidth, FRAME_OVERHEAD_BITS); 1653 rc->min_frame_bandwidth = MAX(rc->min_frame_bandwidth, FRAME_OVERHEAD_BITS);
1641 1654
1642 // A maximum bitrate for a frame is defined. 1655 // A maximum bitrate for a frame is defined.
1643 // The baseline for this aligns with HW implementations that 1656 // The baseline for this aligns with HW implementations that
1644 // can support decode of 1080P content up to a bitrate of MAX_MB_RATE bits 1657 // can support decode of 1080P content up to a bitrate of MAX_MB_RATE bits
1645 // per 16x16 MB (averaged over a frame). However this limit is extended if 1658 // per 16x16 MB (averaged over a frame). However this limit is extended if
1646 // a very high rate is given on the command line or the the rate cannnot 1659 // a very high rate is given on the command line or the the rate cannnot
1647 // be acheived because of a user specificed max q (e.g. when the user 1660 // be acheived because of a user specificed max q (e.g. when the user
1648 // specifies lossless encode. 1661 // specifies lossless encode.
1649 vbr_max_bits = (int)(((int64_t)rc->avg_frame_bandwidth * 1662 vbr_max_bits = (int)(((int64_t)rc->avg_frame_bandwidth *
1650 oxcf->two_pass_vbrmax_section) / 100); 1663 oxcf->two_pass_vbrmax_section) / 100);
1651 rc->max_frame_bandwidth = MAX(MAX((cm->MBs * MAX_MB_RATE), MAXRATE_1080P), 1664 rc->max_frame_bandwidth = MAX(MAX((cm->MBs * MAX_MB_RATE), MAXRATE_1080P),
1652 vbr_max_bits); 1665 vbr_max_bits);
1653 1666
1654 vp9_rc_set_gf_max_interval(cpi, rc); 1667 vp9_rc_set_gf_interval_range(cpi, rc);
1655 } 1668 }
1656 1669
1657 #define VBR_PCT_ADJUSTMENT_LIMIT 50 1670 #define VBR_PCT_ADJUSTMENT_LIMIT 50
1658 // For VBR...adjustment to the frame target based on error from previous frames 1671 // For VBR...adjustment to the frame target based on error from previous frames
1659 static void vbr_rate_correction(VP9_COMP *cpi, 1672 static void vbr_rate_correction(VP9_COMP *cpi,
1660 int *this_frame_target, 1673 int *this_frame_target,
1661 int64_t vbr_bits_off_target) { 1674 int64_t vbr_bits_off_target) {
1662 int max_delta; 1675 int max_delta;
1663 double position_factor = 1.0; 1676 double position_factor = 1.0;
1664 1677
(...skipping 21 matching lines...) Expand all
1686 1699
1687 void vp9_set_target_rate(VP9_COMP *cpi) { 1700 void vp9_set_target_rate(VP9_COMP *cpi) {
1688 RATE_CONTROL *const rc = &cpi->rc; 1701 RATE_CONTROL *const rc = &cpi->rc;
1689 int target_rate = rc->base_frame_target; 1702 int target_rate = rc->base_frame_target;
1690 1703
1691 // Correction to rate target based on prior over or under shoot. 1704 // Correction to rate target based on prior over or under shoot.
1692 if (cpi->oxcf.rc_mode == VPX_VBR || cpi->oxcf.rc_mode == VPX_CQ) 1705 if (cpi->oxcf.rc_mode == VPX_VBR || cpi->oxcf.rc_mode == VPX_CQ)
1693 vbr_rate_correction(cpi, &target_rate, rc->vbr_bits_off_target); 1706 vbr_rate_correction(cpi, &target_rate, rc->vbr_bits_off_target);
1694 vp9_rc_set_frame_target(cpi, target_rate); 1707 vp9_rc_set_frame_target(cpi, target_rate);
1695 } 1708 }
OLDNEW
« no previous file with comments | « source/libvpx/vp9/encoder/vp9_ratectrl.h ('k') | source/libvpx/vp9/encoder/vp9_rd.c » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698