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

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

Issue 290653003: libvpx: Pull from upstream (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/deps/third_party/libvpx/
Patch Set: Created 6 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 | Annotate | Revision Log
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 43 matching lines...) Expand 10 before | Expand all | Expand 10 after
54 54
55 #define MIN_KF_BOOST 300 55 #define MIN_KF_BOOST 300
56 56
57 #if CONFIG_MULTIPLE_ARF 57 #if CONFIG_MULTIPLE_ARF
58 // Set MIN_GF_INTERVAL to 1 for the full decomposition. 58 // Set MIN_GF_INTERVAL to 1 for the full decomposition.
59 #define MIN_GF_INTERVAL 2 59 #define MIN_GF_INTERVAL 2
60 #else 60 #else
61 #define MIN_GF_INTERVAL 4 61 #define MIN_GF_INTERVAL 4
62 #endif 62 #endif
63 63
64
64 // #define LONG_TERM_VBR_CORRECTION 65 // #define LONG_TERM_VBR_CORRECTION
65 66
66 static void swap_yv12(YV12_BUFFER_CONFIG *a, YV12_BUFFER_CONFIG *b) { 67 static void swap_yv12(YV12_BUFFER_CONFIG *a, YV12_BUFFER_CONFIG *b) {
67 YV12_BUFFER_CONFIG temp = *a; 68 YV12_BUFFER_CONFIG temp = *a;
68 *a = *b; 69 *a = *b;
69 *b = temp; 70 *b = temp;
70 } 71 }
71 72
72 static int gfboost_qadjust(int qindex) { 73 static int gfboost_qadjust(int qindex) {
73 const double q = vp9_convert_qindex_to_q(qindex); 74 const double q = vp9_convert_qindex_to_q(qindex);
(...skipping 1336 matching lines...) Expand 10 before | Expand all | Expand 10 after
1410 printf("\n"); 1411 printf("\n");
1411 printf("Weight: "); 1412 printf("Weight: ");
1412 for (i = 0; i < cpi->new_frame_coding_order_period; ++i) { 1413 for (i = 0; i < cpi->new_frame_coding_order_period; ++i) {
1413 printf("%4d ", cpi->arf_weight[i]); 1414 printf("%4d ", cpi->arf_weight[i]);
1414 } 1415 }
1415 printf("\n"); 1416 printf("\n");
1416 #endif 1417 #endif
1417 } 1418 }
1418 #endif 1419 #endif
1419 1420
1421 // Calculate a section intra ratio used in setting max loop filter.
1422 static void calculate_section_intra_ratio(struct twopass_rc *twopass,
1423 const FIRSTPASS_STATS *start_pos,
1424 int section_length) {
1425 FIRSTPASS_STATS next_frame;
1426 FIRSTPASS_STATS sectionstats;
1427 int i;
1428
1429 vp9_zero(next_frame);
1430 vp9_zero(sectionstats);
1431
1432 reset_fpf_position(twopass, start_pos);
1433
1434 for (i = 0; i < section_length; ++i) {
1435 input_stats(twopass, &next_frame);
1436 accumulate_stats(&sectionstats, &next_frame);
1437 }
1438
1439 avg_stats(&sectionstats);
1440
1441 twopass->section_intra_rating =
1442 (int)(sectionstats.intra_error /
1443 DOUBLE_DIVIDE_CHECK(sectionstats.coded_error));
1444
1445 reset_fpf_position(twopass, start_pos);
1446 }
1447
1448 // Calculate the total bits to allocate in this GF/ARF group.
1449 static int64_t calculate_total_gf_group_bits(VP9_COMP *cpi,
1450 double gf_group_err) {
1451 const RATE_CONTROL *const rc = &cpi->rc;
1452 const struct twopass_rc *const twopass = &cpi->twopass;
1453 const int max_bits = frame_max_bits(rc, &cpi->oxcf);
1454 int64_t total_group_bits;
1455
1456 // Calculate the bits to be allocated to the group as a whole.
1457 if ((twopass->kf_group_bits > 0) && (twopass->kf_group_error_left > 0)) {
1458 total_group_bits = (int64_t)(twopass->kf_group_bits *
1459 (gf_group_err / twopass->kf_group_error_left));
1460 } else {
1461 total_group_bits = 0;
1462 }
1463
1464 // Clamp odd edge cases.
1465 total_group_bits = (total_group_bits < 0) ?
1466 0 : (total_group_bits > twopass->kf_group_bits) ?
1467 twopass->kf_group_bits : total_group_bits;
1468
1469 // Clip based on user supplied data rate variability limit.
1470 if (total_group_bits > (int64_t)max_bits * rc->baseline_gf_interval)
1471 total_group_bits = (int64_t)max_bits * rc->baseline_gf_interval;
1472
1473 return total_group_bits;
1474 }
1475
1476 // Calculate the number bits extra to assign to boosted frames in a group.
1477 static int calculate_boost_bits(int frame_count,
1478 int boost, int64_t total_group_bits) {
1479 int allocation_chunks;
1480
1481 // return 0 for invalid inputs (could arise e.g. through rounding errors)
1482 if (!boost || (total_group_bits <= 0) || (frame_count <= 0) )
1483 return 0;
1484
1485 allocation_chunks = (frame_count * 100) + boost;
1486
1487 // Prevent overflow.
1488 if (boost > 1023) {
1489 int divisor = boost >> 10;
1490 boost /= divisor;
1491 allocation_chunks /= divisor;
1492 }
1493
1494 // Calculate the number of extra bits for use in the boosted frame or frames.
1495 return MAX((int)(((int64_t)boost * total_group_bits) / allocation_chunks), 0);
1496 }
1497
1498
1420 // Analyse and define a gf/arf group. 1499 // Analyse and define a gf/arf group.
1421 static void define_gf_group(VP9_COMP *cpi, FIRSTPASS_STATS *this_frame) { 1500 static void define_gf_group(VP9_COMP *cpi, FIRSTPASS_STATS *this_frame) {
1422 RATE_CONTROL *const rc = &cpi->rc; 1501 RATE_CONTROL *const rc = &cpi->rc;
1423 const VP9EncoderConfig *const oxcf = &cpi->oxcf; 1502 const VP9EncoderConfig *const oxcf = &cpi->oxcf;
1424 struct twopass_rc *const twopass = &cpi->twopass; 1503 struct twopass_rc *const twopass = &cpi->twopass;
1425 FIRSTPASS_STATS next_frame = { 0 }; 1504 FIRSTPASS_STATS next_frame;
1426 const FIRSTPASS_STATS *start_pos; 1505 const FIRSTPASS_STATS *start_pos;
1427 int i; 1506 int i;
1428 double boost_score = 0.0; 1507 double boost_score = 0.0;
1429 double old_boost_score = 0.0; 1508 double old_boost_score = 0.0;
1430 double gf_group_err = 0.0; 1509 double gf_group_err = 0.0;
1431 double gf_first_frame_err = 0.0; 1510 double gf_first_frame_err = 0.0;
1432 double mod_frame_err = 0.0; 1511 double mod_frame_err = 0.0;
1433 1512
1434 double mv_ratio_accumulator = 0.0; 1513 double mv_ratio_accumulator = 0.0;
1435 double decay_accumulator = 1.0; 1514 double decay_accumulator = 1.0;
1436 double zero_motion_accumulator = 1.0; 1515 double zero_motion_accumulator = 1.0;
1437 1516
1438 double loop_decay_rate = 1.00; 1517 double loop_decay_rate = 1.00;
1439 double last_loop_decay_rate = 1.00; 1518 double last_loop_decay_rate = 1.00;
1440 1519
1441 double this_frame_mv_in_out = 0.0; 1520 double this_frame_mv_in_out = 0.0;
1442 double mv_in_out_accumulator = 0.0; 1521 double mv_in_out_accumulator = 0.0;
1443 double abs_mv_in_out_accumulator = 0.0; 1522 double abs_mv_in_out_accumulator = 0.0;
1444 double mv_ratio_accumulator_thresh; 1523 double mv_ratio_accumulator_thresh;
1445 // Max bits for a single frame.
1446 const int max_bits = frame_max_bits(rc, oxcf);
1447 unsigned int allow_alt_ref = oxcf->play_alternate && oxcf->lag_in_frames; 1524 unsigned int allow_alt_ref = oxcf->play_alternate && oxcf->lag_in_frames;
1448 1525
1449 int f_boost = 0; 1526 int f_boost = 0;
1450 int b_boost = 0; 1527 int b_boost = 0;
1451 int flash_detected; 1528 int flash_detected;
1452 int active_max_gf_interval; 1529 int active_max_gf_interval;
1453 1530
1531 vp9_clear_system_state();
1532 vp9_zero(next_frame);
1533
1454 twopass->gf_group_bits = 0; 1534 twopass->gf_group_bits = 0;
1455
1456 vp9_clear_system_state();
1457
1458 start_pos = twopass->stats_in; 1535 start_pos = twopass->stats_in;
1459 1536
1460 // Load stats for the current frame. 1537 // Load stats for the current frame.
1461 mod_frame_err = calculate_modified_err(cpi, this_frame); 1538 mod_frame_err = calculate_modified_err(cpi, this_frame);
1462 1539
1463 // Note the error of the frame at the start of the group. This will be 1540 // Note the error of the frame at the start of the group. This will be
1464 // the GF frame error if we code a normal gf. 1541 // the GF frame error if we code a normal gf.
1465 gf_first_frame_err = mod_frame_err; 1542 gf_first_frame_err = mod_frame_err;
1466 1543
1467 // If this is a key frame or the overlay from a previous arf then 1544 // If this is a key frame or the overlay from a previous arf then
(...skipping 182 matching lines...) Expand 10 before | Expand all | Expand 10 after
1650 } 1727 }
1651 printf("\n"); 1728 printf("\n");
1652 printf("Weight: "); 1729 printf("Weight: ");
1653 for (i = 0; i < cpi->new_frame_coding_order_period; ++i) { 1730 for (i = 0; i < cpi->new_frame_coding_order_period; ++i) {
1654 printf("%4d ", cpi->arf_weight[i]); 1731 printf("%4d ", cpi->arf_weight[i]);
1655 } 1732 }
1656 printf("\n"); 1733 printf("\n");
1657 } 1734 }
1658 #endif 1735 #endif
1659 #endif 1736 #endif
1660
1661 // Calculate the bits to be allocated to the group as a whole.
1662 if (twopass->kf_group_bits > 0 && twopass->kf_group_error_left > 0) {
1663 twopass->gf_group_bits = (int64_t)(twopass->kf_group_bits *
1664 (gf_group_err / twopass->kf_group_error_left));
1665 } else {
1666 twopass->gf_group_bits = 0;
1667 }
1668 twopass->gf_group_bits = (twopass->gf_group_bits < 0) ?
1669 0 : (twopass->gf_group_bits > twopass->kf_group_bits) ?
1670 twopass->kf_group_bits : twopass->gf_group_bits;
1671
1672 // Clip cpi->twopass.gf_group_bits based on user supplied data rate
1673 // variability limit, cpi->oxcf.two_pass_vbrmax_section.
1674 if (twopass->gf_group_bits > (int64_t)max_bits * rc->baseline_gf_interval)
1675 twopass->gf_group_bits = (int64_t)max_bits * rc->baseline_gf_interval;
1676
1677 // Reset the file position. 1737 // Reset the file position.
1678 reset_fpf_position(twopass, start_pos); 1738 reset_fpf_position(twopass, start_pos);
1679 1739
1680 // Assign bits to the arf or gf. 1740 // Calculate the bits to be allocated to the gf/arf group as a whole
1681 for (i = 0; i <= (rc->source_alt_ref_pending && 1741 twopass->gf_group_bits = calculate_total_gf_group_bits(cpi, gf_group_err);
1682 cpi->common.frame_type != KEY_FRAME); ++i) { 1742
1683 int allocation_chunks; 1743 // Calculate the extra bits to be used for boosted frame(s)
1744 {
1684 int q = rc->last_q[INTER_FRAME]; 1745 int q = rc->last_q[INTER_FRAME];
1685 int gf_bits;
1686
1687 int boost = (rc->gfu_boost * gfboost_qadjust(q)) / 100; 1746 int boost = (rc->gfu_boost * gfboost_qadjust(q)) / 100;
1688 1747
1689 // Set max and minimum boost and hence minimum allocation. 1748 // Set max and minimum boost and hence minimum allocation.
1690 boost = clamp(boost, 125, (rc->baseline_gf_interval + 1) * 200); 1749 boost = clamp(boost, 125, (rc->baseline_gf_interval + 1) * 200);
1691 1750
1692 if (rc->source_alt_ref_pending && i == 0) 1751 // Calculate the extra bits to be used for boosted frame(s)
1693 allocation_chunks = ((rc->baseline_gf_interval + 1) * 100) + boost; 1752 twopass->gf_bits = calculate_boost_bits(rc->baseline_gf_interval,
1694 else 1753 boost, twopass->gf_group_bits);
1695 allocation_chunks = (rc->baseline_gf_interval * 100) + (boost - 100);
1696 1754
1697 // Prevent overflow.
1698 if (boost > 1023) {
1699 int divisor = boost >> 10;
1700 boost /= divisor;
1701 allocation_chunks /= divisor;
1702 }
1703 1755
1704 // Calculate the number of bits to be spent on the gf or arf based on 1756 // For key frames the frame target rate is set already.
1705 // the boost number. 1757 // NOTE: We dont bother to check for the special case of ARF overlay
1706 gf_bits = (int)((double)boost * (twopass->gf_group_bits / 1758 // frames here, as there is clamping code for this in the function
1707 (double)allocation_chunks)); 1759 // vp9_rc_clamp_pframe_target_size(), which applies to one and two pass
1708 1760 // encodes.
1709 // If the frame that is to be boosted is simpler than the average for 1761 if (cpi->common.frame_type != KEY_FRAME &&
1710 // the gf/arf group then use an alternative calculation 1762 !vp9_is_upper_layer_key_frame(cpi)) {
1711 // based on the error score of the frame itself. 1763 vp9_rc_set_frame_target(cpi, twopass->gf_bits);
1712 if (rc->baseline_gf_interval < 1 ||
1713 mod_frame_err < gf_group_err / (double)rc->baseline_gf_interval) {
1714 double alt_gf_grp_bits = (double)twopass->kf_group_bits *
1715 (mod_frame_err * (double)rc->baseline_gf_interval) /
1716 DOUBLE_DIVIDE_CHECK(twopass->kf_group_error_left);
1717
1718 int alt_gf_bits = (int)((double)boost * (alt_gf_grp_bits /
1719 (double)allocation_chunks));
1720
1721 if (gf_bits > alt_gf_bits)
1722 gf_bits = alt_gf_bits;
1723 } else {
1724 // If it is harder than other frames in the group make sure it at
1725 // least receives an allocation in keeping with its relative error
1726 // score, otherwise it may be worse off than an "un-boosted" frame.
1727 int alt_gf_bits = (int)((double)twopass->kf_group_bits *
1728 mod_frame_err /
1729 DOUBLE_DIVIDE_CHECK(twopass->kf_group_error_left));
1730
1731 if (alt_gf_bits > gf_bits)
1732 gf_bits = alt_gf_bits;
1733 }
1734
1735 // Don't allow a negative value for gf_bits.
1736 if (gf_bits < 0)
1737 gf_bits = 0;
1738
1739 if (i == 0) {
1740 twopass->gf_bits = gf_bits;
1741 }
1742 if (i == 1 ||
1743 (!rc->source_alt_ref_pending && cpi->common.frame_type != KEY_FRAME &&
1744 !vp9_is_upper_layer_key_frame(cpi))) {
1745 // Calculate the per frame bit target for this frame.
1746 vp9_rc_set_frame_target(cpi, gf_bits);
1747 } 1764 }
1748 } 1765 }
1749 1766
1750 { 1767 // Adjust KF group bits and error remaining.
1751 // Adjust KF group bits and error remaining. 1768 twopass->kf_group_error_left -= (int64_t)gf_group_err;
1752 twopass->kf_group_error_left -= (int64_t)gf_group_err;
1753 1769
1754 // If this is an arf update we want to remove the score for the overlay 1770 // If this is an arf update we want to remove the score for the overlay
1755 // frame at the end which will usually be very cheap to code. 1771 // frame at the end which will usually be very cheap to code.
1756 // The overlay frame has already, in effect, been coded so we want to spread 1772 // The overlay frame has already, in effect, been coded so we want to spread
1757 // the remaining bits among the other frames. 1773 // the remaining bits among the other frames.
1758 // For normal GFs remove the score for the GF itself unless this is 1774 // For normal GFs remove the score for the GF itself unless this is
1759 // also a key frame in which case it has already been accounted for. 1775 // also a key frame in which case it has already been accounted for.
1760 if (rc->source_alt_ref_pending) { 1776 if (rc->source_alt_ref_pending) {
1761 twopass->gf_group_error_left = (int64_t)(gf_group_err - mod_frame_err); 1777 twopass->gf_group_error_left = (int64_t)(gf_group_err - mod_frame_err);
1762 } else if (cpi->common.frame_type != KEY_FRAME) { 1778 } else if (cpi->common.frame_type != KEY_FRAME) {
1763 twopass->gf_group_error_left = (int64_t)(gf_group_err 1779 twopass->gf_group_error_left = (int64_t)(gf_group_err
1764 - gf_first_frame_err); 1780 - gf_first_frame_err);
1765 } else { 1781 } else {
1766 twopass->gf_group_error_left = (int64_t)gf_group_err; 1782 twopass->gf_group_error_left = (int64_t)gf_group_err;
1767 }
1768
1769 // This condition could fail if there are two kfs very close together
1770 // despite MIN_GF_INTERVAL and would cause a divide by 0 in the
1771 // calculation of alt_extra_bits.
1772 if (rc->baseline_gf_interval >= 3) {
1773 const int boost = rc->source_alt_ref_pending ? b_boost : rc->gfu_boost;
1774
1775 if (boost >= 150) {
1776 const int pct_extra = MIN(20, (boost - 100) / 50);
1777 const int alt_extra_bits = (int)((
1778 MAX(twopass->gf_group_bits - twopass->gf_bits, 0) *
1779 pct_extra) / 100);
1780 twopass->gf_group_bits -= alt_extra_bits;
1781 }
1782 }
1783 } 1783 }
1784 1784
1785 // Calculate a section intra ratio used in setting max loop filter.
1785 if (cpi->common.frame_type != KEY_FRAME) { 1786 if (cpi->common.frame_type != KEY_FRAME) {
1786 FIRSTPASS_STATS sectionstats; 1787 calculate_section_intra_ratio(twopass, start_pos, rc->baseline_gf_interval);
1787
1788 zero_stats(&sectionstats);
1789 reset_fpf_position(twopass, start_pos);
1790
1791 for (i = 0; i < rc->baseline_gf_interval; ++i) {
1792 input_stats(twopass, &next_frame);
1793 accumulate_stats(&sectionstats, &next_frame);
1794 }
1795
1796 avg_stats(&sectionstats);
1797
1798 twopass->section_intra_rating = (int)
1799 (sectionstats.intra_error /
1800 DOUBLE_DIVIDE_CHECK(sectionstats.coded_error));
1801
1802 reset_fpf_position(twopass, start_pos);
1803 } 1788 }
1804 } 1789 }
1805 1790
1806 // Allocate bits to a normal frame that is neither a gf an arf or a key frame. 1791 // Allocate bits to a normal frame that is neither a gf an arf or a key frame.
1807 static void assign_std_frame_bits(VP9_COMP *cpi, FIRSTPASS_STATS *this_frame) { 1792 static void assign_std_frame_bits(VP9_COMP *cpi, FIRSTPASS_STATS *this_frame) {
1808 struct twopass_rc *twopass = &cpi->twopass; 1793 struct twopass_rc *twopass = &cpi->twopass;
1809 // For a single frame. 1794 // For a single frame.
1810 const int max_bits = frame_max_bits(&cpi->rc, &cpi->oxcf); 1795 const int max_bits = frame_max_bits(&cpi->rc, &cpi->oxcf);
1811 // Calculate modified prediction error used in bit allocation. 1796 // Calculate modified prediction error used in bit allocation.
1812 const double modified_err = calculate_modified_err(cpi, this_frame); 1797 const double modified_err = calculate_modified_err(cpi, this_frame);
(...skipping 230 matching lines...) Expand 10 before | Expand all | Expand 10 after
2043 twopass->kf_group_bits = (int64_t)(twopass->bits_left * 2028 twopass->kf_group_bits = (int64_t)(twopass->bits_left *
2044 (kf_group_err / twopass->modified_error_left)); 2029 (kf_group_err / twopass->modified_error_left));
2045 2030
2046 // Clip based on maximum per frame rate defined by the user. 2031 // Clip based on maximum per frame rate defined by the user.
2047 max_grp_bits = (int64_t)max_bits * (int64_t)rc->frames_to_key; 2032 max_grp_bits = (int64_t)max_bits * (int64_t)rc->frames_to_key;
2048 if (twopass->kf_group_bits > max_grp_bits) 2033 if (twopass->kf_group_bits > max_grp_bits)
2049 twopass->kf_group_bits = max_grp_bits; 2034 twopass->kf_group_bits = max_grp_bits;
2050 } else { 2035 } else {
2051 twopass->kf_group_bits = 0; 2036 twopass->kf_group_bits = 0;
2052 } 2037 }
2038 twopass->kf_group_bits = MAX(0, twopass->kf_group_bits);
2039
2053 // Reset the first pass file position. 2040 // Reset the first pass file position.
2054 reset_fpf_position(twopass, start_position); 2041 reset_fpf_position(twopass, start_position);
2055 2042
2056 // Determine how big to make this keyframe based on how well the subsequent 2043 // Scan through the kf group collating various stats used to deteermine
2057 // frames use inter blocks. 2044 // how many bits to spend on it.
2058 decay_accumulator = 1.0; 2045 decay_accumulator = 1.0;
2059 boost_score = 0.0; 2046 boost_score = 0.0;
2060
2061 // Scan through the kf group collating various stats.
2062 for (i = 0; i < rc->frames_to_key; ++i) { 2047 for (i = 0; i < rc->frames_to_key; ++i) {
2063 if (EOF == input_stats(twopass, &next_frame)) 2048 if (EOF == input_stats(twopass, &next_frame))
2064 break; 2049 break;
2065 2050
2066 // Monitor for static sections. 2051 // Monitor for static sections.
2067 if ((next_frame.pcnt_inter - next_frame.pcnt_motion) < 2052 if ((next_frame.pcnt_inter - next_frame.pcnt_motion) <
2068 zero_motion_accumulator) { 2053 zero_motion_accumulator) {
2069 zero_motion_accumulator = (next_frame.pcnt_inter - 2054 zero_motion_accumulator = (next_frame.pcnt_inter -
2070 next_frame.pcnt_motion); 2055 next_frame.pcnt_motion);
2071 } 2056 }
(...skipping 16 matching lines...) Expand all
2088 const double loop_decay_rate = get_prediction_decay_rate(&cpi->common, 2073 const double loop_decay_rate = get_prediction_decay_rate(&cpi->common,
2089 &next_frame); 2074 &next_frame);
2090 decay_accumulator *= loop_decay_rate; 2075 decay_accumulator *= loop_decay_rate;
2091 decay_accumulator = MAX(decay_accumulator, MIN_DECAY_FACTOR); 2076 decay_accumulator = MAX(decay_accumulator, MIN_DECAY_FACTOR);
2092 } 2077 }
2093 2078
2094 boost_score += (decay_accumulator * r); 2079 boost_score += (decay_accumulator * r);
2095 } 2080 }
2096 } 2081 }
2097 2082
2098 { 2083 // Store the zero motion percentage
2099 FIRSTPASS_STATS sectionstats; 2084 twopass->kf_zeromotion_pct = (int)(zero_motion_accumulator * 100.0);
2100 2085
2101 zero_stats(&sectionstats); 2086 // Calculate a section intra ratio used in setting max loop filter.
2102 reset_fpf_position(twopass, start_position); 2087 calculate_section_intra_ratio(twopass, start_position, rc->frames_to_key);
2103
2104 for (i = 0; i < rc->frames_to_key; ++i) {
2105 input_stats(twopass, &next_frame);
2106 accumulate_stats(&sectionstats, &next_frame);
2107 }
2108
2109 avg_stats(&sectionstats);
2110
2111 twopass->section_intra_rating = (int) (sectionstats.intra_error /
2112 DOUBLE_DIVIDE_CHECK(sectionstats.coded_error));
2113 }
2114
2115 // Reset the first pass file position.
2116 reset_fpf_position(twopass, start_position);
2117 2088
2118 // Work out how many bits to allocate for the key frame itself. 2089 // Work out how many bits to allocate for the key frame itself.
2119 if (1) { 2090 rc->kf_boost = (int)boost_score;
2120 int kf_boost = (int)boost_score;
2121 int allocation_chunks;
2122 2091
2123 if (kf_boost < (rc->frames_to_key * 3)) 2092 if (rc->kf_boost < (rc->frames_to_key * 3))
2124 kf_boost = (rc->frames_to_key * 3); 2093 rc->kf_boost = (rc->frames_to_key * 3);
2094 if (rc->kf_boost < MIN_KF_BOOST)
2095 rc->kf_boost = MIN_KF_BOOST;
2125 2096
2126 if (kf_boost < MIN_KF_BOOST) 2097 twopass->kf_bits = calculate_boost_bits((rc->frames_to_key - 1),
2127 kf_boost = MIN_KF_BOOST; 2098 rc->kf_boost, twopass->kf_group_bits);
2128 2099
2129 // Make a note of baseline boost and the zero motion 2100 twopass->kf_group_bits -= twopass->kf_bits;
2130 // accumulator value for use elsewhere.
2131 rc->kf_boost = kf_boost;
2132 twopass->kf_zeromotion_pct = (int)(zero_motion_accumulator * 100.0);
2133 2101
2134 // Key frame size depends on: 2102 // Per frame bit target for this frame.
2135 // (1) the error score for the whole key frame group, 2103 vp9_rc_set_frame_target(cpi, twopass->kf_bits);
2136 // (2) the key frames' own error if this is smaller than the
2137 // average for the group (optional),
2138 // (3) insuring that the frame receives at least the allocation it would
2139 // have received based on its own error score vs the error score
2140 // remaining.
2141 // Special case:
2142 // If the sequence appears almost totally static we want to spend almost
2143 // all of the bits on the key frame.
2144 //
2145 // We use (cpi->rc.frames_to_key - 1) below because the key frame itself is
2146 // taken care of by kf_boost.
2147 if (zero_motion_accumulator >= 0.99) {
2148 allocation_chunks = ((rc->frames_to_key - 1) * 10) + kf_boost;
2149 } else {
2150 allocation_chunks = ((rc->frames_to_key - 1) * 100) + kf_boost;
2151 }
2152
2153 // Prevent overflow.
2154 if (kf_boost > 1028) {
2155 const int divisor = kf_boost >> 10;
2156 kf_boost /= divisor;
2157 allocation_chunks /= divisor;
2158 }
2159
2160 twopass->kf_group_bits = MAX(0, twopass->kf_group_bits);
2161 // Calculate the number of bits to be spent on the key frame.
2162 twopass->kf_bits = (int)((double)kf_boost *
2163 ((double)twopass->kf_group_bits / allocation_chunks));
2164
2165 // If the key frame is actually easier than the average for the
2166 // kf group (which does sometimes happen, e.g. a blank intro frame)
2167 // then use an alternate calculation based on the kf error score
2168 // which should give a smaller key frame.
2169 if (kf_mod_err < kf_group_err / rc->frames_to_key) {
2170 double alt_kf_grp_bits = ((double)twopass->bits_left *
2171 (kf_mod_err * (double)rc->frames_to_key) /
2172 DOUBLE_DIVIDE_CHECK(twopass->modified_error_left));
2173
2174 const int alt_kf_bits = (int)((double)kf_boost *
2175 (alt_kf_grp_bits / (double)allocation_chunks));
2176
2177 if (twopass->kf_bits > alt_kf_bits)
2178 twopass->kf_bits = alt_kf_bits;
2179 } else {
2180 // Else if it is much harder than other frames in the group make sure
2181 // it at least receives an allocation in keeping with its relative
2182 // error score.
2183 const int alt_kf_bits = (int)((double)twopass->bits_left * (kf_mod_err /
2184 DOUBLE_DIVIDE_CHECK(twopass->modified_error_left)));
2185
2186 if (alt_kf_bits > twopass->kf_bits)
2187 twopass->kf_bits = alt_kf_bits;
2188 }
2189 twopass->kf_group_bits -= twopass->kf_bits;
2190 // Per frame bit target for this frame.
2191 vp9_rc_set_frame_target(cpi, twopass->kf_bits);
2192 }
2193 2104
2194 // Note the total error score of the kf group minus the key frame itself. 2105 // Note the total error score of the kf group minus the key frame itself.
2195 twopass->kf_group_error_left = (int)(kf_group_err - kf_mod_err); 2106 twopass->kf_group_error_left = (int)(kf_group_err - kf_mod_err);
2196 2107
2197 // Adjust the count of total modified error left. 2108 // Adjust the count of total modified error left.
2198 // The count of bits left is adjusted elsewhere based on real coded frame 2109 // The count of bits left is adjusted elsewhere based on real coded frame
2199 // sizes. 2110 // sizes.
2200 twopass->modified_error_left -= kf_group_err; 2111 twopass->modified_error_left -= kf_group_err;
2201 } 2112 }
2202 2113
(...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after
2235 RATE_CONTROL *const rc = &cpi->rc; 2146 RATE_CONTROL *const rc = &cpi->rc;
2236 struct twopass_rc *const twopass = &cpi->twopass; 2147 struct twopass_rc *const twopass = &cpi->twopass;
2237 int frames_left; 2148 int frames_left;
2238 FIRSTPASS_STATS this_frame; 2149 FIRSTPASS_STATS this_frame;
2239 FIRSTPASS_STATS this_frame_copy; 2150 FIRSTPASS_STATS this_frame_copy;
2240 2151
2241 double this_frame_intra_error; 2152 double this_frame_intra_error;
2242 double this_frame_coded_error; 2153 double this_frame_coded_error;
2243 int target; 2154 int target;
2244 LAYER_CONTEXT *lc = NULL; 2155 LAYER_CONTEXT *lc = NULL;
2245 int is_spatial_svc = (cpi->use_svc && cpi->svc.number_temporal_layers == 1); 2156 const int is_spatial_svc = (cpi->use_svc &&
2246 2157 cpi->svc.number_temporal_layers == 1);
2247 if (is_spatial_svc) { 2158 if (is_spatial_svc) {
2248 lc = &cpi->svc.layer_context[cpi->svc.spatial_layer_id]; 2159 lc = &cpi->svc.layer_context[cpi->svc.spatial_layer_id];
2249 frames_left = (int)(twopass->total_stats.count - 2160 frames_left = (int)(twopass->total_stats.count -
2250 lc->current_video_frame_in_layer); 2161 lc->current_video_frame_in_layer);
2251 } else { 2162 } else {
2252 frames_left = (int)(twopass->total_stats.count - 2163 frames_left = (int)(twopass->total_stats.count -
2253 cm->current_video_frame); 2164 cm->current_video_frame);
2254 } 2165 }
2255 2166
2256 if (!twopass->stats_in) 2167 if (!twopass->stats_in)
(...skipping 39 matching lines...) Expand 10 before | Expand all | Expand 10 after
2296 this_frame_intra_error = this_frame.intra_error; 2207 this_frame_intra_error = this_frame.intra_error;
2297 this_frame_coded_error = this_frame.coded_error; 2208 this_frame_coded_error = this_frame.coded_error;
2298 2209
2299 // Keyframe and section processing. 2210 // Keyframe and section processing.
2300 if (rc->frames_to_key == 0 || 2211 if (rc->frames_to_key == 0 ||
2301 (cpi->frame_flags & FRAMEFLAGS_KEY)) { 2212 (cpi->frame_flags & FRAMEFLAGS_KEY)) {
2302 // Define next KF group and assign bits to it. 2213 // Define next KF group and assign bits to it.
2303 this_frame_copy = this_frame; 2214 this_frame_copy = this_frame;
2304 find_next_key_frame(cpi, &this_frame_copy); 2215 find_next_key_frame(cpi, &this_frame_copy);
2305 // Don't place key frame in any enhancement layers in spatial svc 2216 // Don't place key frame in any enhancement layers in spatial svc
2306 if (cpi->use_svc && cpi->svc.number_temporal_layers == 1) { 2217 if (is_spatial_svc) {
2307 lc->is_key_frame = 1; 2218 lc->is_key_frame = 1;
2308 if (cpi->svc.spatial_layer_id > 0) { 2219 if (cpi->svc.spatial_layer_id > 0) {
2309 cm->frame_type = INTER_FRAME; 2220 cm->frame_type = INTER_FRAME;
2310 } 2221 }
2311 } 2222 }
2312 } else { 2223 } else {
2313 if (cpi->use_svc && cpi->svc.number_temporal_layers == 1) { 2224 if (is_spatial_svc) {
2314 lc->is_key_frame = 0; 2225 lc->is_key_frame = 0;
2315 } 2226 }
2316 cm->frame_type = INTER_FRAME; 2227 cm->frame_type = INTER_FRAME;
2317 } 2228 }
2318 2229
2319 // Is this frame a GF / ARF? (Note: a key frame is always also a GF). 2230 // Is this frame a GF / ARF? (Note: a key frame is always also a GF).
2320 if (rc->frames_till_gf_update_due == 0) { 2231 if (rc->frames_till_gf_update_due == 0) {
2321 // Define next gf group and assign bits to it. 2232 // Define next gf group and assign bits to it.
2322 this_frame_copy = this_frame; 2233 this_frame_copy = this_frame;
2323 2234
(...skipping 95 matching lines...) Expand 10 before | Expand all | Expand 10 after
2419 // So now update to the correct value based on the actual bits used. 2330 // So now update to the correct value based on the actual bits used.
2420 cpi->twopass.kf_group_bits += cpi->rc.this_frame_target - bits_used; 2331 cpi->twopass.kf_group_bits += cpi->rc.this_frame_target - bits_used;
2421 } else { 2332 } else {
2422 #endif 2333 #endif
2423 cpi->twopass.kf_group_bits -= bits_used; 2334 cpi->twopass.kf_group_bits -= bits_used;
2424 cpi->twopass.gf_group_bits -= bits_used; 2335 cpi->twopass.gf_group_bits -= bits_used;
2425 cpi->twopass.gf_group_bits = MAX(cpi->twopass.gf_group_bits, 0); 2336 cpi->twopass.gf_group_bits = MAX(cpi->twopass.gf_group_bits, 0);
2426 } 2337 }
2427 cpi->twopass.kf_group_bits = MAX(cpi->twopass.kf_group_bits, 0); 2338 cpi->twopass.kf_group_bits = MAX(cpi->twopass.kf_group_bits, 0);
2428 } 2339 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698