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

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

Issue 897063002: Revert "libvpx: Pull from upstream" (Closed) Base URL: https://chromium.googlesource.com/chromium/deps/libvpx.git@master
Patch Set: Created 5 years, 10 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 378 matching lines...) Expand 10 before | Expand all | Expand 10 after
389 } else { 389 } else {
390 if ((cpi->refresh_alt_ref_frame || cpi->refresh_golden_frame) && 390 if ((cpi->refresh_alt_ref_frame || cpi->refresh_golden_frame) &&
391 !rc->is_src_frame_alt_ref && !cpi->use_svc && 391 !rc->is_src_frame_alt_ref && !cpi->use_svc &&
392 (cpi->oxcf.rc_mode != VPX_CBR || cpi->oxcf.gf_cbr_boost_pct > 20)) 392 (cpi->oxcf.rc_mode != VPX_CBR || cpi->oxcf.gf_cbr_boost_pct > 20))
393 rc->rate_correction_factors[GF_ARF_STD] = factor; 393 rc->rate_correction_factors[GF_ARF_STD] = factor;
394 else 394 else
395 rc->rate_correction_factors[INTER_NORMAL] = factor; 395 rc->rate_correction_factors[INTER_NORMAL] = factor;
396 } 396 }
397 } 397 }
398 398
399 void vp9_rc_update_rate_correction_factors(VP9_COMP *cpi) { 399 void vp9_rc_update_rate_correction_factors(VP9_COMP *cpi, int damp_var) {
400 const VP9_COMMON *const cm = &cpi->common; 400 const VP9_COMMON *const cm = &cpi->common;
401 int correction_factor = 100; 401 int correction_factor = 100;
402 double rate_correction_factor = get_rate_correction_factor(cpi); 402 double rate_correction_factor = get_rate_correction_factor(cpi);
403 double adjustment_limit; 403 double adjustment_limit;
404 404
405 int projected_size_based_on_q = 0; 405 int projected_size_based_on_q = 0;
406 406
407 // Do not update the rate factors for arf overlay frames. 407 // Do not update the rate factors for arf overlay frames.
408 if (cpi->rc.is_src_frame_alt_ref) 408 if (cpi->rc.is_src_frame_alt_ref)
409 return; 409 return;
(...skipping 14 matching lines...) Expand all
424 rate_correction_factor, 424 rate_correction_factor,
425 cm->bit_depth); 425 cm->bit_depth);
426 } 426 }
427 // Work out a size correction factor. 427 // Work out a size correction factor.
428 if (projected_size_based_on_q > FRAME_OVERHEAD_BITS) 428 if (projected_size_based_on_q > FRAME_OVERHEAD_BITS)
429 correction_factor = (int)((100 * (int64_t)cpi->rc.projected_frame_size) / 429 correction_factor = (int)((100 * (int64_t)cpi->rc.projected_frame_size) /
430 projected_size_based_on_q); 430 projected_size_based_on_q);
431 431
432 // More heavily damped adjustment used if we have been oscillating either side 432 // More heavily damped adjustment used if we have been oscillating either side
433 // of target. 433 // of target.
434 adjustment_limit = 0.25 + 434 switch (damp_var) {
435 0.5 * MIN(1, fabs(log10(0.01 * correction_factor))); 435 case 0:
436 adjustment_limit = 0.75;
437 break;
438 case 1:
439 adjustment_limit = 0.25 +
440 0.5 * MIN(1, fabs(log10(0.01 * correction_factor)));
441 break;
442 case 2:
443 default:
444 adjustment_limit = 0.25;
445 break;
446 }
436 447
437 cpi->rc.q_2_frame = cpi->rc.q_1_frame; 448 cpi->rc.q_2_frame = cpi->rc.q_1_frame;
438 cpi->rc.q_1_frame = cm->base_qindex; 449 cpi->rc.q_1_frame = cm->base_qindex;
439 cpi->rc.rc_2_frame = cpi->rc.rc_1_frame; 450 cpi->rc.rc_2_frame = cpi->rc.rc_1_frame;
440 if (correction_factor > 110) 451 if (correction_factor > 110)
441 cpi->rc.rc_1_frame = -1; 452 cpi->rc.rc_1_frame = -1;
442 else if (correction_factor < 90) 453 else if (correction_factor < 90)
443 cpi->rc.rc_1_frame = 1; 454 cpi->rc.rc_1_frame = 1;
444 else 455 else
445 cpi->rc.rc_1_frame = 0; 456 cpi->rc.rc_1_frame = 0;
(...skipping 758 matching lines...) Expand 10 before | Expand all | Expand 10 after
1204 const int qindex = cm->base_qindex; 1215 const int qindex = cm->base_qindex;
1205 1216
1206 if (cpi->oxcf.aq_mode == CYCLIC_REFRESH_AQ && cm->seg.enabled) { 1217 if (cpi->oxcf.aq_mode == CYCLIC_REFRESH_AQ && cm->seg.enabled) {
1207 vp9_cyclic_refresh_update_actual_count(cpi); 1218 vp9_cyclic_refresh_update_actual_count(cpi);
1208 } 1219 }
1209 1220
1210 // Update rate control heuristics 1221 // Update rate control heuristics
1211 rc->projected_frame_size = (int)(bytes_used << 3); 1222 rc->projected_frame_size = (int)(bytes_used << 3);
1212 1223
1213 // Post encode loop adjustment of Q prediction. 1224 // Post encode loop adjustment of Q prediction.
1214 vp9_rc_update_rate_correction_factors(cpi); 1225 vp9_rc_update_rate_correction_factors(
1226 cpi, (cpi->sf.recode_loop >= ALLOW_RECODE_KFARFGF) ? 2 :
1227 ((oxcf->rc_mode == VPX_CBR) ? 1 : 0));
1215 1228
1216 // Keep a record of last Q and ambient average Q. 1229 // Keep a record of last Q and ambient average Q.
1217 if (cm->frame_type == KEY_FRAME) { 1230 if (cm->frame_type == KEY_FRAME) {
1218 rc->last_q[KEY_FRAME] = qindex; 1231 rc->last_q[KEY_FRAME] = qindex;
1219 rc->avg_frame_qindex[KEY_FRAME] = 1232 rc->avg_frame_qindex[KEY_FRAME] =
1220 ROUND_POWER_OF_TWO(3 * rc->avg_frame_qindex[KEY_FRAME] + qindex, 2); 1233 ROUND_POWER_OF_TWO(3 * rc->avg_frame_qindex[KEY_FRAME] + qindex, 2);
1221 } else { 1234 } else {
1222 if (rc->is_src_frame_alt_ref || 1235 if (rc->is_src_frame_alt_ref ||
1223 !(cpi->refresh_golden_frame || cpi->refresh_alt_ref_frame) || 1236 !(cpi->refresh_golden_frame || cpi->refresh_alt_ref_frame) ||
1224 (cpi->use_svc && oxcf->rc_mode == VPX_CBR)) { 1237 (cpi->use_svc && oxcf->rc_mode == VPX_CBR)) {
1225 rc->last_q[INTER_FRAME] = qindex; 1238 rc->last_q[INTER_FRAME] = qindex;
1226 rc->avg_frame_qindex[INTER_FRAME] = 1239 rc->avg_frame_qindex[INTER_FRAME] =
1227 ROUND_POWER_OF_TWO(3 * rc->avg_frame_qindex[INTER_FRAME] + qindex, 2); 1240 ROUND_POWER_OF_TWO(3 * rc->avg_frame_qindex[INTER_FRAME] + qindex, 2);
1228 rc->ni_frames++; 1241 rc->ni_frames++;
1229 rc->tot_q += vp9_convert_qindex_to_q(qindex, cm->bit_depth); 1242 rc->tot_q += vp9_convert_qindex_to_q(qindex, cm->bit_depth);
1230 rc->avg_q = rc->tot_q / rc->ni_frames; 1243 rc->avg_q = rc->tot_q / rc->ni_frames;
1231 // Calculate the average Q for normal inter frames (not key or GFU 1244 // Calculate the average Q for normal inter frames (not key or GFU
1232 // frames). 1245 // frames).
1233 rc->ni_tot_qi += qindex; 1246 rc->ni_tot_qi += qindex;
1234 rc->ni_av_qi = rc->ni_tot_qi / rc->ni_frames; 1247 rc->ni_av_qi = rc->ni_tot_qi / rc->ni_frames;
1235 } 1248 }
1236 } 1249 }
1237 1250
1238 // Keep record of last boosted (KF/KF/ARF) Q value. 1251 // Keep record of last boosted (KF/KF/ARF) Q value.
1239 // If the current frame is coded at a lower Q then we also update it. 1252 // If the current frame is coded at a lower Q then we also update it.
1240 // If all mbs in this group are skipped only update if the Q value is 1253 // If all mbs in this group are skipped only update if the Q value is
1241 // better than that already stored. 1254 // better than that already stored.
1242 // This is used to help set quality in forced key frames to reduce popping 1255 // This is used to help set quality in forced key frames to reduce popping
1243 if ((qindex < rc->last_boosted_qindex) || 1256 if ((qindex < rc->last_boosted_qindex) ||
1244 (cm->frame_type == KEY_FRAME) || 1257 (((cm->frame_type == KEY_FRAME) || cpi->refresh_alt_ref_frame ||
1245 (!rc->constrained_gf_group &&
1246 (cpi->refresh_alt_ref_frame ||
1247 (cpi->refresh_golden_frame && !rc->is_src_frame_alt_ref)))) { 1258 (cpi->refresh_golden_frame && !rc->is_src_frame_alt_ref)))) {
1248 rc->last_boosted_qindex = qindex; 1259 rc->last_boosted_qindex = qindex;
1249 } 1260 }
1250 if (cm->frame_type == KEY_FRAME) 1261 if (cm->frame_type == KEY_FRAME)
1251 rc->last_kf_qindex = qindex; 1262 rc->last_kf_qindex = qindex;
1252 1263
1253 update_buffer_level(cpi, rc->projected_frame_size); 1264 update_buffer_level(cpi, rc->projected_frame_size);
1254 1265
1255 // Rolling monitors of whether we are over or underspending used to help 1266 // Rolling monitors of whether we are over or underspending used to help
1256 // regulate min and Max Q in two pass. 1267 // regulate min and Max Q in two pass.
(...skipping 83 matching lines...) Expand 10 before | Expand all | Expand 10 after
1340 rc->frames_to_key = cpi->oxcf.key_freq; 1351 rc->frames_to_key = cpi->oxcf.key_freq;
1341 rc->kf_boost = DEFAULT_KF_BOOST; 1352 rc->kf_boost = DEFAULT_KF_BOOST;
1342 rc->source_alt_ref_active = 0; 1353 rc->source_alt_ref_active = 0;
1343 } else { 1354 } else {
1344 cm->frame_type = INTER_FRAME; 1355 cm->frame_type = INTER_FRAME;
1345 } 1356 }
1346 if (rc->frames_till_gf_update_due == 0) { 1357 if (rc->frames_till_gf_update_due == 0) {
1347 rc->baseline_gf_interval = DEFAULT_GF_INTERVAL; 1358 rc->baseline_gf_interval = DEFAULT_GF_INTERVAL;
1348 rc->frames_till_gf_update_due = rc->baseline_gf_interval; 1359 rc->frames_till_gf_update_due = rc->baseline_gf_interval;
1349 // NOTE: frames_till_gf_update_due must be <= frames_to_key. 1360 // NOTE: frames_till_gf_update_due must be <= frames_to_key.
1350 if (rc->frames_till_gf_update_due > rc->frames_to_key) { 1361 if (rc->frames_till_gf_update_due > rc->frames_to_key)
1351 rc->frames_till_gf_update_due = rc->frames_to_key; 1362 rc->frames_till_gf_update_due = rc->frames_to_key;
1352 rc->constrained_gf_group = 1;
1353 } else {
1354 rc->constrained_gf_group = 0;
1355 }
1356 cpi->refresh_golden_frame = 1; 1363 cpi->refresh_golden_frame = 1;
1357 rc->source_alt_ref_pending = USE_ALTREF_FOR_ONE_PASS; 1364 rc->source_alt_ref_pending = USE_ALTREF_FOR_ONE_PASS;
1358 rc->gfu_boost = DEFAULT_GF_BOOST; 1365 rc->gfu_boost = DEFAULT_GF_BOOST;
1359 } 1366 }
1360 if (cm->frame_type == KEY_FRAME) 1367 if (cm->frame_type == KEY_FRAME)
1361 target = calc_iframe_target_size_one_pass_vbr(cpi); 1368 target = calc_iframe_target_size_one_pass_vbr(cpi);
1362 else 1369 else
1363 target = calc_pframe_target_size_one_pass_vbr(cpi); 1370 target = calc_pframe_target_size_one_pass_vbr(cpi);
1364 vp9_rc_set_frame_target(cpi, target); 1371 vp9_rc_set_frame_target(cpi, target);
1365 } 1372 }
(...skipping 285 matching lines...) Expand 10 before | Expand all | Expand 10 after
1651 1658
1652 void vp9_set_target_rate(VP9_COMP *cpi) { 1659 void vp9_set_target_rate(VP9_COMP *cpi) {
1653 RATE_CONTROL *const rc = &cpi->rc; 1660 RATE_CONTROL *const rc = &cpi->rc;
1654 int target_rate = rc->base_frame_target; 1661 int target_rate = rc->base_frame_target;
1655 1662
1656 // Correction to rate target based on prior over or under shoot. 1663 // Correction to rate target based on prior over or under shoot.
1657 if (cpi->oxcf.rc_mode == VPX_VBR) 1664 if (cpi->oxcf.rc_mode == VPX_VBR)
1658 vbr_rate_correction(cpi, &target_rate, rc->vbr_bits_off_target); 1665 vbr_rate_correction(cpi, &target_rate, rc->vbr_bits_off_target);
1659 vp9_rc_set_frame_target(cpi, target_rate); 1666 vp9_rc_set_frame_target(cpi, target_rate);
1660 } 1667 }
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