History

Cap target bitrate to raw rate internally

BUG=webm:1685

Jerome Jiang committed 6 years ago

Commit 3e833dd1 parent a97e3326 files · +22 −13Browse files

Unified · Split

6 files
  1. test/realtime_test.cc +1 −6
  2. vp8/encoder/bitstream.c +1 −1
  3. vp8/encoder/onyx_if.c +6 −1
  4. vp9/encoder/vp9_pickmode.c +1 −1
  5. vp9/encoder/vp9_ratectrl.c +4 −2
  6. vp9/vp9_cx_iface.c +9 −2
test/realtime_test.cc+1−6
@@ -63,15 +63,10 @@ TEST_P(RealtimeTest, RealtimeFirstPassProducesFrames) { · 62 unmodified lines
63 EXPECT_EQ(kFramesToEncode, frame_packets_);63 EXPECT_EQ(kFramesToEncode, frame_packets_);
64}64}
65 65
66// TODO(https://crbug.com/webm/1685): the following passes -fsanitize=undefined66TEST_P(RealtimeTest, IntegerOverflow) {
67// with bitrate set to 140000000 for vp8 and 128000 for vp9. There are
68// additional failures with lower bitrates using -fsanitize=integer.
69TEST_P(RealtimeTest, DISABLED_IntegerOverflow) {
70 ::libvpx_test::RandomVideoSource video;67 ::libvpx_test::RandomVideoSource video;
71 video.SetSize(800, 480);68 video.SetSize(800, 480);
72 video.set_limit(20);69 video.set_limit(20);
73 // TODO(https://crbug.com/webm/1685): this should be silently capped
74 // internally to the raw yuv rate or below.
75 cfg_.rc_target_bitrate = 140000000;70 cfg_.rc_target_bitrate = 140000000;
76 ASSERT_NO_FATAL_FAILURE(RunLoop(&video));71 ASSERT_NO_FATAL_FAILURE(RunLoop(&video));
77}72}
vp8/encoder/bitstream.c+1−1
@@ -222,7 +222,7 @@ void vp8_pack_tokens(vp8_writer *w, const TOKENEXTRA *p, int xcount) { · 221 unmodified lines
222 222
223 validate_buffer(w->buffer + w->pos, 1, w->buffer_end, w->error);223 validate_buffer(w->buffer + w->pos, 1, w->buffer_end, w->error);
224 224
225 w->buffer[w->pos++] = (lowvalue >> (24 - offset));225 w->buffer[w->pos++] = (lowvalue >> (24 - offset)) & 0xff;
226 lowvalue <<= offset;226 lowvalue <<= offset;
227 shift = count;227 shift = count;
228 lowvalue &= 0xffffff;228 lowvalue &= 0xffffff;
vp8/encoder/onyx_if.c+6−1
@@ -1430,6 +1430,7 @@ void vp8_change_config(VP8_COMP *cpi, VP8_CONFIG *oxcf) { · 1429 unmodified lines
1430 VP8_COMMON *cm = &cpi->common;1430 VP8_COMMON *cm = &cpi->common;
1431 int last_w, last_h;1431 int last_w, last_h;
1432 unsigned int prev_number_of_layers;1432 unsigned int prev_number_of_layers;
1433 unsigned int raw_target_rate;
1433 1434
1434 if (!cpi) return;1435 if (!cpi) return;
1435 1436
@@ -1570,6 +1571,10 @@ void vp8_change_config(VP8_COMP *cpi, VP8_CONFIG *oxcf) { · 134 unmodified lines
1570 cpi->oxcf.maximum_buffer_size_in_ms = 240000;1571 cpi->oxcf.maximum_buffer_size_in_ms = 240000;
1571 }1572 }
1572 1573
1574 raw_target_rate = (unsigned int)((int64_t)cpi->oxcf.Width * cpi->oxcf.Height *
1575 8 * 3 * cpi->framerate / 1000);
1576 if (cpi->oxcf.target_bandwidth > raw_target_rate)
1577 cpi->oxcf.target_bandwidth = raw_target_rate;
1573 /* Convert target bandwidth from Kbit/s to Bit/s */1578 /* Convert target bandwidth from Kbit/s to Bit/s */
1574 cpi->oxcf.target_bandwidth *= 1000;1579 cpi->oxcf.target_bandwidth *= 1000;
1575 1580
@@ -3615,7 +3620,7 @@ static void encode_frame_to_data_rate(VP8_COMP *cpi, size_t *size, · 2039 unmodified lines
3615 if (cpi->this_key_frame_forced) {3620 if (cpi->this_key_frame_forced) {
3616 if (cpi->active_best_quality > cpi->avg_frame_qindex * 7 / 8) {3621 if (cpi->active_best_quality > cpi->avg_frame_qindex * 7 / 8) {
3617 cpi->active_best_quality = cpi->avg_frame_qindex * 7 / 8;3622 cpi->active_best_quality = cpi->avg_frame_qindex * 7 / 8;
3618 } else if (cpi->active_best_quality<cpi->avg_frame_qindex>> 2) {3623 } else if (cpi->active_best_quality < (cpi->avg_frame_qindex >> 2)) {
3619 cpi->active_best_quality = cpi->avg_frame_qindex >> 2;3624 cpi->active_best_quality = cpi->avg_frame_qindex >> 2;
3620 }3625 }
3621 }3626 }
vp9/encoder/vp9_pickmode.c+1−1
@@ -1127,7 +1127,7 @@ static INLINE void update_thresh_freq_fact_row_mt( · 1126 unmodified lines
1127}1127}
1128 1128
1129static INLINE void update_thresh_freq_fact(1129static INLINE void update_thresh_freq_fact(
1130 VP9_COMP *cpi, TileDataEnc *tile_data, int source_variance,1130 VP9_COMP *cpi, TileDataEnc *tile_data, unsigned int source_variance,
1131 BLOCK_SIZE bsize, MV_REFERENCE_FRAME ref_frame, THR_MODES best_mode_idx,1131 BLOCK_SIZE bsize, MV_REFERENCE_FRAME ref_frame, THR_MODES best_mode_idx,
1132 PREDICTION_MODE mode) {1132 PREDICTION_MODE mode) {
1133 THR_MODES thr_mode_idx = mode_idx[ref_frame][mode_offset(mode)];1133 THR_MODES thr_mode_idx = mode_idx[ref_frame][mode_offset(mode)];
vp9/encoder/vp9_ratectrl.c+4−2
@@ -1695,8 +1695,10 @@ void vp9_rc_compute_frame_size_bounds(const VP9_COMP *cpi, int frame_target, · 1694 unmodified lines
1695 } else {1695 } else {
1696 // For very small rate targets where the fractional adjustment1696 // For very small rate targets where the fractional adjustment
1697 // may be tiny make sure there is at least a minimum range.1697 // may be tiny make sure there is at least a minimum range.
1698 const int tol_low = (cpi->sf.recode_tolerance_low * frame_target) / 100;1698 const int tol_low =
1699 const int tol_high = (cpi->sf.recode_tolerance_high * frame_target) / 100;1699 (int)(((int64_t)cpi->sf.recode_tolerance_low * frame_target) / 100);
1700 const int tol_high =
1701 (int)(((int64_t)cpi->sf.recode_tolerance_high * frame_target) / 100);
1700 *frame_under_shoot_limit = VPXMAX(frame_target - tol_low - 100, 0);1702 *frame_under_shoot_limit = VPXMAX(frame_target - tol_low - 100, 0);
1701 *frame_over_shoot_limit =1703 *frame_over_shoot_limit =
1702 VPXMIN(frame_target + tol_high + 100, cpi->rc.max_frame_bandwidth);1704 VPXMIN(frame_target + tol_high + 100, cpi->rc.max_frame_bandwidth);
vp9/vp9_cx_iface.c+9−2
@@ -470,10 +470,11 @@ static vpx_rational64_t get_g_timebase_in_ts(vpx_rational_t g_timebase) { · 469 unmodified lines
470}470}
471 471
472static vpx_codec_err_t set_encoder_config(472static vpx_codec_err_t set_encoder_config(
473 VP9EncoderConfig *oxcf, const vpx_codec_enc_cfg_t *cfg,473 VP9EncoderConfig *oxcf, vpx_codec_enc_cfg_t *cfg,
474 const struct vp9_extracfg *extra_cfg) {474 const struct vp9_extracfg *extra_cfg) {
475 const int is_vbr = cfg->rc_end_usage == VPX_VBR;475 const int is_vbr = cfg->rc_end_usage == VPX_VBR;
476 int sl, tl;476 int sl, tl;
477 unsigned int raw_target_rate;
477 oxcf->profile = cfg->g_profile;478 oxcf->profile = cfg->g_profile;
478 oxcf->max_threads = (int)cfg->g_threads;479 oxcf->max_threads = (int)cfg->g_threads;
479 oxcf->width = cfg->g_w;480 oxcf->width = cfg->g_w;
@@ -500,8 +501,14 @@ static vpx_codec_err_t set_encoder_config( · 20 unmodified lines
500 cfg->g_pass == VPX_RC_FIRST_PASS ? 0 : cfg->g_lag_in_frames;501 cfg->g_pass == VPX_RC_FIRST_PASS ? 0 : cfg->g_lag_in_frames;
501 oxcf->rc_mode = cfg->rc_end_usage;502 oxcf->rc_mode = cfg->rc_end_usage;
502 503
504 raw_target_rate =
505 (unsigned int)((int64_t)oxcf->width * oxcf->height * oxcf->bit_depth * 3 *
506 oxcf->init_framerate / 1000);
507 // Cap target bitrate to raw rate
508 cfg->rc_target_bitrate = VPXMIN(raw_target_rate, cfg->rc_target_bitrate);
509
503 // Convert target bandwidth from Kbit/s to Bit/s510 // Convert target bandwidth from Kbit/s to Bit/s
504 oxcf->target_bandwidth = 1000 * cfg->rc_target_bitrate;511 oxcf->target_bandwidth = 1000 * (int64_t)cfg->rc_target_bitrate;
505 oxcf->rc_max_intra_bitrate_pct = extra_cfg->rc_max_intra_bitrate_pct;512 oxcf->rc_max_intra_bitrate_pct = extra_cfg->rc_max_intra_bitrate_pct;
506 oxcf->rc_max_inter_bitrate_pct = extra_cfg->rc_max_inter_bitrate_pct;513 oxcf->rc_max_inter_bitrate_pct = extra_cfg->rc_max_inter_bitrate_pct;
507 oxcf->gf_cbr_boost_pct = extra_cfg->gf_cbr_boost_pct;514 oxcf->gf_cbr_boost_pct = extra_cfg->gf_cbr_boost_pct;

Keyboard shortcuts

General

Show keyboard shortcuts
?
Focus the current search
/

Issues and pull requests

Open filters
f

Issues, pull requests and Inbox

Select next item
j↓
Select previous item
k↑
Open selected item
Enter
Dismiss filters or clear selection
Esc

Repository code

Go to file
t