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

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

Issue 996503002: 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
« no previous file with comments | « source/libvpx/vp9/encoder/vp9_extend.c ('k') | source/libvpx/vp9/encoder/vp9_mbgraph.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 39 matching lines...) Expand 10 before | Expand all | Expand 10 after
50 #define INTRA_MODE_PENALTY 1024 50 #define INTRA_MODE_PENALTY 1024
51 #define KF_MAX_BOOST 128.0 51 #define KF_MAX_BOOST 128.0
52 #define MIN_ARF_GF_BOOST 240 52 #define MIN_ARF_GF_BOOST 240
53 #define MIN_DECAY_FACTOR 0.01 53 #define MIN_DECAY_FACTOR 0.01
54 #define MIN_GF_INTERVAL 4 54 #define MIN_GF_INTERVAL 4
55 #define MIN_KF_BOOST 300 55 #define MIN_KF_BOOST 300
56 #define NEW_MV_MODE_PENALTY 32 56 #define NEW_MV_MODE_PENALTY 32
57 #define SVC_FACTOR_PT_LOW 0.45 57 #define SVC_FACTOR_PT_LOW 0.45
58 #define DARK_THRESH 64 58 #define DARK_THRESH 64
59 #define DEFAULT_GRP_WEIGHT 1.0 59 #define DEFAULT_GRP_WEIGHT 1.0
60 #define RC_FACTOR_MIN 0.75
61 #define RC_FACTOR_MAX 1.75
60 62
61 #define DOUBLE_DIVIDE_CHECK(x) ((x) < 0 ? (x) - 0.000001 : (x) + 0.000001) 63 #define DOUBLE_DIVIDE_CHECK(x) ((x) < 0 ? (x) - 0.000001 : (x) + 0.000001)
62 64
63 #if ARF_STATS_OUTPUT 65 #if ARF_STATS_OUTPUT
64 unsigned int arf_count = 0; 66 unsigned int arf_count = 0;
65 #endif 67 #endif
66 68
67 static void swap_yv12(YV12_BUFFER_CONFIG *a, YV12_BUFFER_CONFIG *b) {
68 YV12_BUFFER_CONFIG temp = *a;
69 *a = *b;
70 *b = temp;
71 }
72
73 // Resets the first pass file to the given position using a relative seek from 69 // Resets the first pass file to the given position using a relative seek from
74 // the current position. 70 // the current position.
75 static void reset_fpf_position(TWO_PASS *p, 71 static void reset_fpf_position(TWO_PASS *p,
76 const FIRSTPASS_STATS *position) { 72 const FIRSTPASS_STATS *position) {
77 p->stats_in = position; 73 p->stats_in = position;
78 } 74 }
79 75
80 // Read frame stats at an offset from the current position. 76 // Read frame stats at an offset from the current position.
81 static const FIRSTPASS_STATS *read_frame_stats(const TWO_PASS *p, int offset) { 77 static const FIRSTPASS_STATS *read_frame_stats(const TWO_PASS *p, int offset) {
82 if ((offset >= 0 && p->stats_in + offset >= p->stats_in_end) || 78 if ((offset >= 0 && p->stats_in + offset >= p->stats_in_end) ||
(...skipping 373 matching lines...) Expand 10 before | Expand all | Expand 10 after
456 MACROBLOCK *const x = &cpi->td.mb; 452 MACROBLOCK *const x = &cpi->td.mb;
457 VP9_COMMON *const cm = &cpi->common; 453 VP9_COMMON *const cm = &cpi->common;
458 MACROBLOCKD *const xd = &x->e_mbd; 454 MACROBLOCKD *const xd = &x->e_mbd;
459 TileInfo tile; 455 TileInfo tile;
460 struct macroblock_plane *const p = x->plane; 456 struct macroblock_plane *const p = x->plane;
461 struct macroblockd_plane *const pd = xd->plane; 457 struct macroblockd_plane *const pd = xd->plane;
462 const PICK_MODE_CONTEXT *ctx = &cpi->td.pc_root->none; 458 const PICK_MODE_CONTEXT *ctx = &cpi->td.pc_root->none;
463 int i; 459 int i;
464 460
465 int recon_yoffset, recon_uvoffset; 461 int recon_yoffset, recon_uvoffset;
466 YV12_BUFFER_CONFIG *const lst_yv12 = get_ref_frame_buffer(cpi, LAST_FRAME);
467 YV12_BUFFER_CONFIG *gld_yv12 = get_ref_frame_buffer(cpi, GOLDEN_FRAME);
468 YV12_BUFFER_CONFIG *const new_yv12 = get_frame_new_buffer(cm);
469 int recon_y_stride = lst_yv12->y_stride;
470 int recon_uv_stride = lst_yv12->uv_stride;
471 int uv_mb_height = 16 >> (lst_yv12->y_height > lst_yv12->uv_height);
472 int64_t intra_error = 0; 462 int64_t intra_error = 0;
473 int64_t coded_error = 0; 463 int64_t coded_error = 0;
474 int64_t sr_coded_error = 0; 464 int64_t sr_coded_error = 0;
475 465
476 int sum_mvr = 0, sum_mvc = 0; 466 int sum_mvr = 0, sum_mvc = 0;
477 int sum_mvr_abs = 0, sum_mvc_abs = 0; 467 int sum_mvr_abs = 0, sum_mvc_abs = 0;
478 int64_t sum_mvrs = 0, sum_mvcs = 0; 468 int64_t sum_mvrs = 0, sum_mvcs = 0;
479 int mvcount = 0; 469 int mvcount = 0;
480 int intercount = 0; 470 int intercount = 0;
481 int second_ref_count = 0; 471 int second_ref_count = 0;
482 const int intrapenalty = INTRA_MODE_PENALTY; 472 const int intrapenalty = INTRA_MODE_PENALTY;
483 int neutral_count = 0; 473 int neutral_count = 0;
484 int new_mv_count = 0; 474 int new_mv_count = 0;
485 int sum_in_vectors = 0; 475 int sum_in_vectors = 0;
486 MV lastmv = {0, 0}; 476 MV lastmv = {0, 0};
487 TWO_PASS *twopass = &cpi->twopass; 477 TWO_PASS *twopass = &cpi->twopass;
488 const MV zero_mv = {0, 0}; 478 const MV zero_mv = {0, 0};
479 int recon_y_stride, recon_uv_stride, uv_mb_height;
480
481 YV12_BUFFER_CONFIG *const lst_yv12 = get_ref_frame_buffer(cpi, LAST_FRAME);
482 YV12_BUFFER_CONFIG *gld_yv12 = get_ref_frame_buffer(cpi, GOLDEN_FRAME);
483 YV12_BUFFER_CONFIG *const new_yv12 = get_frame_new_buffer(cm);
489 const YV12_BUFFER_CONFIG *first_ref_buf = lst_yv12; 484 const YV12_BUFFER_CONFIG *first_ref_buf = lst_yv12;
485
490 LAYER_CONTEXT *const lc = is_two_pass_svc(cpi) ? 486 LAYER_CONTEXT *const lc = is_two_pass_svc(cpi) ?
491 &cpi->svc.layer_context[cpi->svc.spatial_layer_id] : NULL; 487 &cpi->svc.layer_context[cpi->svc.spatial_layer_id] : NULL;
492 double intra_factor; 488 double intra_factor;
493 double brightness_factor; 489 double brightness_factor;
490 BufferPool *const pool = cm->buffer_pool;
491
492 // First pass code requires valid last and new frame buffers.
493 assert(new_yv12 != NULL);
494 assert((lc != NULL) || frame_is_intra_only(cm) || (lst_yv12 != NULL));
494 495
495 #if CONFIG_FP_MB_STATS 496 #if CONFIG_FP_MB_STATS
496 if (cpi->use_fp_mb_stats) { 497 if (cpi->use_fp_mb_stats) {
497 vp9_zero_array(cpi->twopass.frame_mb_stats_buf, cm->initial_mbs); 498 vp9_zero_array(cpi->twopass.frame_mb_stats_buf, cm->initial_mbs);
498 } 499 }
499 #endif 500 #endif
500 501
501 vp9_clear_system_state(); 502 vp9_clear_system_state();
502 503
503 intra_factor = 0.0; 504 intra_factor = 0.0;
(...skipping 24 matching lines...) Expand all
528 vp9_scale_references(cpi); 529 vp9_scale_references(cpi);
529 530
530 // Use either last frame or alt frame for motion search. 531 // Use either last frame or alt frame for motion search.
531 if (cpi->ref_frame_flags & VP9_LAST_FLAG) { 532 if (cpi->ref_frame_flags & VP9_LAST_FLAG) {
532 first_ref_buf = vp9_get_scaled_ref_frame(cpi, LAST_FRAME); 533 first_ref_buf = vp9_get_scaled_ref_frame(cpi, LAST_FRAME);
533 if (first_ref_buf == NULL) 534 if (first_ref_buf == NULL)
534 first_ref_buf = get_ref_frame_buffer(cpi, LAST_FRAME); 535 first_ref_buf = get_ref_frame_buffer(cpi, LAST_FRAME);
535 } 536 }
536 537
537 if (cpi->ref_frame_flags & VP9_GOLD_FLAG) { 538 if (cpi->ref_frame_flags & VP9_GOLD_FLAG) {
538 BufferPool *const pool = cm->buffer_pool; 539 gld_yv12 = vp9_get_scaled_ref_frame(cpi, GOLDEN_FRAME);
539 const int ref_idx = 540 if (gld_yv12 == NULL) {
540 cm->ref_frame_map[get_ref_frame_idx(cpi, GOLDEN_FRAME)]; 541 gld_yv12 = get_ref_frame_buffer(cpi, GOLDEN_FRAME);
541 const int scaled_idx = cpi->scaled_ref_idx[GOLDEN_FRAME - 1]; 542 }
542
543 gld_yv12 = (scaled_idx != ref_idx) ? &pool->frame_bufs[scaled_idx].buf :
544 get_ref_frame_buffer(cpi, GOLDEN_FRAME);
545 } else { 543 } else {
546 gld_yv12 = NULL; 544 gld_yv12 = NULL;
547 } 545 }
548 546
549 recon_y_stride = new_yv12->y_stride;
550 recon_uv_stride = new_yv12->uv_stride;
551 uv_mb_height = 16 >> (new_yv12->y_height > new_yv12->uv_height);
552
553 set_ref_ptrs(cm, xd, 547 set_ref_ptrs(cm, xd,
554 (cpi->ref_frame_flags & VP9_LAST_FLAG) ? LAST_FRAME: NONE, 548 (cpi->ref_frame_flags & VP9_LAST_FLAG) ? LAST_FRAME: NONE,
555 (cpi->ref_frame_flags & VP9_GOLD_FLAG) ? GOLDEN_FRAME : NONE); 549 (cpi->ref_frame_flags & VP9_GOLD_FLAG) ? GOLDEN_FRAME : NONE);
556 550
557 cpi->Source = vp9_scale_if_required(cm, cpi->un_scaled_source, 551 cpi->Source = vp9_scale_if_required(cm, cpi->un_scaled_source,
558 &cpi->scaled_source); 552 &cpi->scaled_source);
559 } 553 }
560 554
561 vp9_setup_block_planes(&x->e_mbd, cm->subsampling_x, cm->subsampling_y); 555 vp9_setup_block_planes(&x->e_mbd, cm->subsampling_x, cm->subsampling_y);
562 556
563 vp9_setup_src_planes(x, cpi->Source, 0, 0); 557 vp9_setup_src_planes(x, cpi->Source, 0, 0);
564 vp9_setup_pre_planes(xd, 0, first_ref_buf, 0, 0, NULL);
565 vp9_setup_dst_planes(xd->plane, new_yv12, 0, 0); 558 vp9_setup_dst_planes(xd->plane, new_yv12, 0, 0);
566 559
560 if (!frame_is_intra_only(cm)) {
561 vp9_setup_pre_planes(xd, 0, first_ref_buf, 0, 0, NULL);
562 }
563
567 xd->mi = cm->mi; 564 xd->mi = cm->mi;
568 xd->mi[0].src_mi = &xd->mi[0]; 565 xd->mi[0].src_mi = &xd->mi[0];
569 566
570 vp9_frame_init_quantizer(cpi); 567 vp9_frame_init_quantizer(cpi);
571 568
572 for (i = 0; i < MAX_MB_PLANE; ++i) { 569 for (i = 0; i < MAX_MB_PLANE; ++i) {
573 p[i].coeff = ctx->coeff_pbuf[i][1]; 570 p[i].coeff = ctx->coeff_pbuf[i][1];
574 p[i].qcoeff = ctx->qcoeff_pbuf[i][1]; 571 p[i].qcoeff = ctx->qcoeff_pbuf[i][1];
575 pd[i].dqcoeff = ctx->dqcoeff_pbuf[i][1]; 572 pd[i].dqcoeff = ctx->dqcoeff_pbuf[i][1];
576 p[i].eobs = ctx->eobs_pbuf[i][1]; 573 p[i].eobs = ctx->eobs_pbuf[i][1];
577 } 574 }
578 x->skip_recode = 0; 575 x->skip_recode = 0;
579 576
580 vp9_init_mv_probs(cm); 577 vp9_init_mv_probs(cm);
581 vp9_initialize_rd_consts(cpi); 578 vp9_initialize_rd_consts(cpi);
582 579
583 // Tiling is ignored in the first pass. 580 // Tiling is ignored in the first pass.
584 vp9_tile_init(&tile, cm, 0, 0); 581 vp9_tile_init(&tile, cm, 0, 0);
585 582
583 recon_y_stride = new_yv12->y_stride;
584 recon_uv_stride = new_yv12->uv_stride;
585 uv_mb_height = 16 >> (new_yv12->y_height > new_yv12->uv_height);
586
586 for (mb_row = 0; mb_row < cm->mb_rows; ++mb_row) { 587 for (mb_row = 0; mb_row < cm->mb_rows; ++mb_row) {
587 MV best_ref_mv = {0, 0}; 588 MV best_ref_mv = {0, 0};
588 589
589 // Reset above block coeffs. 590 // Reset above block coeffs.
590 xd->up_available = (mb_row != 0); 591 xd->up_available = (mb_row != 0);
591 recon_yoffset = (mb_row * recon_y_stride * 16); 592 recon_yoffset = (mb_row * recon_y_stride * 16);
592 recon_uvoffset = (mb_row * recon_uv_stride * uv_mb_height); 593 recon_uvoffset = (mb_row * recon_uv_stride * uv_mb_height);
593 594
594 // Set up limit values for motion vectors to prevent them extending 595 // Set up limit values for motion vectors to prevent them extending
595 // outside the UMV borders. 596 // outside the UMV borders.
(...skipping 415 matching lines...) Expand 10 before | Expand all | Expand 10 after
1011 } 1012 }
1012 1013
1013 // Copy the previous Last Frame back into gf and and arf buffers if 1014 // Copy the previous Last Frame back into gf and and arf buffers if
1014 // the prediction is good enough... but also don't allow it to lag too far. 1015 // the prediction is good enough... but also don't allow it to lag too far.
1015 if ((twopass->sr_update_lag > 3) || 1016 if ((twopass->sr_update_lag > 3) ||
1016 ((cm->current_video_frame > 0) && 1017 ((cm->current_video_frame > 0) &&
1017 (twopass->this_frame_stats.pcnt_inter > 0.20) && 1018 (twopass->this_frame_stats.pcnt_inter > 0.20) &&
1018 ((twopass->this_frame_stats.intra_error / 1019 ((twopass->this_frame_stats.intra_error /
1019 DOUBLE_DIVIDE_CHECK(twopass->this_frame_stats.coded_error)) > 2.0))) { 1020 DOUBLE_DIVIDE_CHECK(twopass->this_frame_stats.coded_error)) > 2.0))) {
1020 if (gld_yv12 != NULL) { 1021 if (gld_yv12 != NULL) {
1021 vp8_yv12_copy_frame(lst_yv12, gld_yv12); 1022 ref_cnt_fb(pool->frame_bufs, &cm->ref_frame_map[cpi->gld_fb_idx],
1023 cm->ref_frame_map[cpi->lst_fb_idx]);
1022 } 1024 }
1023 twopass->sr_update_lag = 1; 1025 twopass->sr_update_lag = 1;
1024 } else { 1026 } else {
1025 ++twopass->sr_update_lag; 1027 ++twopass->sr_update_lag;
1026 } 1028 }
1027 1029
1028 vp9_extend_frame_borders(new_yv12); 1030 vp9_extend_frame_borders(new_yv12);
1029 1031
1030 if (lc != NULL) { 1032 if (lc != NULL) {
1031 vp9_update_reference_frames(cpi); 1033 vp9_update_reference_frames(cpi);
1032 } else { 1034 } else {
1033 // Swap frame pointers so last frame refers to the frame we just compressed. 1035 // The frame we just compressed now becomes the last frame.
1034 swap_yv12(lst_yv12, new_yv12); 1036 ref_cnt_fb(pool->frame_bufs, &cm->ref_frame_map[cpi->lst_fb_idx],
1037 cm->new_fb_idx);
1035 } 1038 }
1036 1039
1037 // Special case for the first frame. Copy into the GF buffer as a second 1040 // Special case for the first frame. Copy into the GF buffer as a second
1038 // reference. 1041 // reference.
1039 if (cm->current_video_frame == 0 && gld_yv12 != NULL && lc == NULL) { 1042 if (cm->current_video_frame == 0 && cpi->gld_fb_idx != INVALID_IDX &&
1040 vp8_yv12_copy_frame(lst_yv12, gld_yv12); 1043 lc == NULL) {
1044 ref_cnt_fb(pool->frame_bufs, &cm->ref_frame_map[cpi->gld_fb_idx],
1045 cm->ref_frame_map[cpi->lst_fb_idx]);
1041 } 1046 }
1042 1047
1043 // Use this to see what the first pass reconstruction looks like. 1048 // Use this to see what the first pass reconstruction looks like.
1044 if (0) { 1049 if (0) {
1045 char filename[512]; 1050 char filename[512];
1046 FILE *recon_file; 1051 FILE *recon_file;
1047 snprintf(filename, sizeof(filename), "enc%04d.yuv", 1052 snprintf(filename, sizeof(filename), "enc%04d.yuv",
1048 (int)cm->current_video_frame); 1053 (int)cm->current_video_frame);
1049 1054
1050 if (cm->current_video_frame == 0) 1055 if (cm->current_video_frame == 0)
(...skipping 902 matching lines...) Expand 10 before | Expand all | Expand 10 after
1953 #if GROUP_ADAPTIVE_MAXQ 1958 #if GROUP_ADAPTIVE_MAXQ
1954 // Calculate an estimate of the maxq needed for the group. 1959 // Calculate an estimate of the maxq needed for the group.
1955 // We are more agressive about correcting for sections 1960 // We are more agressive about correcting for sections
1956 // where there could be significant overshoot than for easier 1961 // where there could be significant overshoot than for easier
1957 // sections where we do not wish to risk creating an overshoot 1962 // sections where we do not wish to risk creating an overshoot
1958 // of the allocated bit budget. 1963 // of the allocated bit budget.
1959 if ((cpi->oxcf.rc_mode != VPX_Q) && (rc->baseline_gf_interval > 1)) { 1964 if ((cpi->oxcf.rc_mode != VPX_Q) && (rc->baseline_gf_interval > 1)) {
1960 const int vbr_group_bits_per_frame = 1965 const int vbr_group_bits_per_frame =
1961 (int)(gf_group_bits / rc->baseline_gf_interval); 1966 (int)(gf_group_bits / rc->baseline_gf_interval);
1962 const double group_av_err = gf_group_raw_error / rc->baseline_gf_interval; 1967 const double group_av_err = gf_group_raw_error / rc->baseline_gf_interval;
1963 const int tmp_q = 1968 int tmp_q;
1969 // rc factor is a weight factor that corrects for local rate control drift.
1970 double rc_factor = 1.0;
1971 if (rc->rate_error_estimate > 0) {
1972 rc_factor = MAX(RC_FACTOR_MIN,
1973 (double)(100 - rc->rate_error_estimate) / 100.0);
1974 } else {
1975 rc_factor = MIN(RC_FACTOR_MAX,
1976 (double)(100 - rc->rate_error_estimate) / 100.0);
1977 }
1978 tmp_q =
1964 get_twopass_worst_quality(cpi, group_av_err, vbr_group_bits_per_frame, 1979 get_twopass_worst_quality(cpi, group_av_err, vbr_group_bits_per_frame,
1965 twopass->kfgroup_inter_fraction); 1980 twopass->kfgroup_inter_fraction * rc_factor);
1966 1981 twopass->active_worst_quality =
1967 if (tmp_q < twopass->baseline_active_worst_quality) { 1982 MAX(tmp_q, twopass->active_worst_quality >> 1);
1968 twopass->active_worst_quality =
1969 (tmp_q + twopass->baseline_active_worst_quality + 1) / 2;
1970 } else {
1971 twopass->active_worst_quality = tmp_q;
1972 }
1973 } 1983 }
1974 #endif 1984 #endif
1975 1985
1976 // Calculate the extra bits to be used for boosted frame(s) 1986 // Calculate the extra bits to be used for boosted frame(s)
1977 gf_arf_bits = calculate_boost_bits(rc->baseline_gf_interval, 1987 gf_arf_bits = calculate_boost_bits(rc->baseline_gf_interval,
1978 rc->gfu_boost, gf_group_bits); 1988 rc->gfu_boost, gf_group_bits);
1979 1989
1980 // Adjust KF group bits and error remaining. 1990 // Adjust KF group bits and error remaining.
1981 twopass->kf_group_error_left -= (int64_t)gf_group_err; 1991 twopass->kf_group_error_left -= (int64_t)gf_group_err;
1982 1992
(...skipping 587 matching lines...) Expand 10 before | Expand all | Expand 10 after
2570 // The multiplication by 256 reverses a scaling factor of (>> 8) 2580 // The multiplication by 256 reverses a scaling factor of (>> 8)
2571 // applied when combining MB error values for the frame. 2581 // applied when combining MB error values for the frame.
2572 twopass->mb_av_energy = 2582 twopass->mb_av_energy =
2573 log(((this_frame.intra_error * 256.0) / num_mbs) + 1.0); 2583 log(((this_frame.intra_error * 256.0) / num_mbs) + 1.0);
2574 } 2584 }
2575 2585
2576 // Update the total stats remaining structure. 2586 // Update the total stats remaining structure.
2577 subtract_stats(&twopass->total_left_stats, &this_frame); 2587 subtract_stats(&twopass->total_left_stats, &this_frame);
2578 } 2588 }
2579 2589
2580 #define MINQ_ADJ_LIMIT 32 2590 #define MINQ_ADJ_LIMIT 48
2581 void vp9_twopass_postencode_update(VP9_COMP *cpi) { 2591 void vp9_twopass_postencode_update(VP9_COMP *cpi) {
2582 TWO_PASS *const twopass = &cpi->twopass; 2592 TWO_PASS *const twopass = &cpi->twopass;
2583 RATE_CONTROL *const rc = &cpi->rc; 2593 RATE_CONTROL *const rc = &cpi->rc;
2584 const int bits_used = rc->base_frame_target; 2594 const int bits_used = rc->base_frame_target;
2585 2595
2586 // VBR correction is done through rc->vbr_bits_off_target. Based on the 2596 // VBR correction is done through rc->vbr_bits_off_target. Based on the
2587 // sign of this value, a limited % adjustment is made to the target rate 2597 // sign of this value, a limited % adjustment is made to the target rate
2588 // of subsequent frames, to try and push it back towards 0. This method 2598 // of subsequent frames, to try and push it back towards 0. This method
2589 // is designed to prevent extreme behaviour at the end of a clip 2599 // is designed to prevent extreme behaviour at the end of a clip
2590 // or group of frames. 2600 // or group of frames.
(...skipping 12 matching lines...) Expand all
2603 if (cpi->common.frame_type != KEY_FRAME && 2613 if (cpi->common.frame_type != KEY_FRAME &&
2604 !vp9_is_upper_layer_key_frame(cpi)) { 2614 !vp9_is_upper_layer_key_frame(cpi)) {
2605 twopass->kf_group_bits -= bits_used; 2615 twopass->kf_group_bits -= bits_used;
2606 twopass->last_kfgroup_zeromotion_pct = twopass->kf_zeromotion_pct; 2616 twopass->last_kfgroup_zeromotion_pct = twopass->kf_zeromotion_pct;
2607 } 2617 }
2608 twopass->kf_group_bits = MAX(twopass->kf_group_bits, 0); 2618 twopass->kf_group_bits = MAX(twopass->kf_group_bits, 0);
2609 2619
2610 // Increment the gf group index ready for the next frame. 2620 // Increment the gf group index ready for the next frame.
2611 ++twopass->gf_group.index; 2621 ++twopass->gf_group.index;
2612 2622
2613 // If the rate control is drifting consider adjustment ot min or maxq. 2623 // If the rate control is drifting consider adjustment to min or maxq.
2614 // Only make adjustments on gf/arf
2615 if ((cpi->oxcf.rc_mode == VPX_VBR) && 2624 if ((cpi->oxcf.rc_mode == VPX_VBR) &&
2616 (cpi->twopass.gf_zeromotion_pct < VLOW_MOTION_THRESHOLD) && 2625 (cpi->twopass.gf_zeromotion_pct < VLOW_MOTION_THRESHOLD) &&
2617 !cpi->rc.is_src_frame_alt_ref) { 2626 !cpi->rc.is_src_frame_alt_ref) {
2618 const int maxq_adj_limit = 2627 const int maxq_adj_limit =
2619 rc->worst_quality - twopass->active_worst_quality; 2628 rc->worst_quality - twopass->active_worst_quality;
2620 2629
2621 // Undershoot. 2630 // Undershoot.
2622 if (rc->rate_error_estimate > cpi->oxcf.under_shoot_pct) { 2631 if (rc->rate_error_estimate > cpi->oxcf.under_shoot_pct) {
2623 --twopass->extend_maxq; 2632 --twopass->extend_maxq;
2624 if (rc->rolling_target_bits >= rc->rolling_actual_bits) 2633 if (rc->rolling_target_bits >= rc->rolling_actual_bits)
2625 ++twopass->extend_minq; 2634 ++twopass->extend_minq;
2626 // Overshoot. 2635 // Overshoot.
2627 } else if (rc->rate_error_estimate < -cpi->oxcf.over_shoot_pct) { 2636 } else if (rc->rate_error_estimate < -cpi->oxcf.over_shoot_pct) {
2628 --twopass->extend_minq; 2637 --twopass->extend_minq;
2629 if (rc->rolling_target_bits < rc->rolling_actual_bits) 2638 if (rc->rolling_target_bits < rc->rolling_actual_bits)
2630 ++twopass->extend_maxq; 2639 ++twopass->extend_maxq;
2631 } else { 2640 } else {
2632 // Adjustment for extreme local overshoot. 2641 // Adjustment for extreme local overshoot.
2633 if (rc->projected_frame_size > (2 * rc->base_frame_target) && 2642 if (rc->projected_frame_size > (2 * rc->base_frame_target) &&
2634 rc->projected_frame_size > (2 * rc->avg_frame_bandwidth)) 2643 rc->projected_frame_size > (2 * rc->avg_frame_bandwidth))
2635 ++twopass->extend_maxq; 2644 ++twopass->extend_maxq;
2636 2645
2637 // Unwind undershoot or overshoot adjustment. 2646 // Unwind undershoot or overshoot adjustment.
2638 if (rc->rolling_target_bits < rc->rolling_actual_bits) 2647 if (rc->rolling_target_bits < rc->rolling_actual_bits)
2639 --twopass->extend_minq; 2648 --twopass->extend_minq;
2640 else if (rc->rolling_target_bits > rc->rolling_actual_bits) 2649 else if (rc->rolling_target_bits > rc->rolling_actual_bits)
2641 --twopass->extend_maxq; 2650 --twopass->extend_maxq;
2642 } 2651 }
2652
2643 twopass->extend_minq = clamp(twopass->extend_minq, 0, MINQ_ADJ_LIMIT); 2653 twopass->extend_minq = clamp(twopass->extend_minq, 0, MINQ_ADJ_LIMIT);
2644 twopass->extend_maxq = clamp(twopass->extend_maxq, 0, maxq_adj_limit); 2654 twopass->extend_maxq = clamp(twopass->extend_maxq, 0, maxq_adj_limit);
2645 } 2655 }
2646 } 2656 }
OLDNEW
« no previous file with comments | « source/libvpx/vp9/encoder/vp9_extend.c ('k') | source/libvpx/vp9/encoder/vp9_mbgraph.c » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698