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

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

Issue 478033002: libvpx: Pull from upstream (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/deps/third_party/libvpx/
Patch Set: Created 6 years, 4 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
« no previous file with comments | « source/libvpx/vp9/encoder/vp9_firstpass.h ('k') | source/libvpx/vp9/encoder/vp9_picklpf.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
11 #include <limits.h> 11 #include <limits.h>
12 #include <math.h> 12 #include <math.h>
13 #include <stdio.h> 13 #include <stdio.h>
14 14
15 #include "./vpx_scale_rtcd.h" 15 #include "./vpx_scale_rtcd.h"
16 16
17 #include "vpx_mem/vpx_mem.h" 17 #include "vpx_mem/vpx_mem.h"
18 #include "vpx_scale/vpx_scale.h" 18 #include "vpx_scale/vpx_scale.h"
19 #include "vpx_scale/yv12config.h" 19 #include "vpx_scale/yv12config.h"
20 20
21 #include "vp9/common/vp9_entropymv.h" 21 #include "vp9/common/vp9_entropymv.h"
22 #include "vp9/common/vp9_quant_common.h" 22 #include "vp9/common/vp9_quant_common.h"
23 #include "vp9/common/vp9_reconinter.h" // vp9_setup_dst_planes() 23 #include "vp9/common/vp9_reconinter.h" // vp9_setup_dst_planes()
24 #include "vp9/common/vp9_systemdependent.h" 24 #include "vp9/common/vp9_systemdependent.h"
25
26 #include "vp9/encoder/vp9_aq_variance.h" 25 #include "vp9/encoder/vp9_aq_variance.h"
27 #include "vp9/encoder/vp9_block.h" 26 #include "vp9/encoder/vp9_block.h"
28 #include "vp9/encoder/vp9_encodeframe.h" 27 #include "vp9/encoder/vp9_encodeframe.h"
29 #include "vp9/encoder/vp9_encodemb.h" 28 #include "vp9/encoder/vp9_encodemb.h"
30 #include "vp9/encoder/vp9_encodemv.h" 29 #include "vp9/encoder/vp9_encodemv.h"
31 #include "vp9/encoder/vp9_encoder.h" 30 #include "vp9/encoder/vp9_encoder.h"
32 #include "vp9/encoder/vp9_extend.h" 31 #include "vp9/encoder/vp9_extend.h"
33 #include "vp9/encoder/vp9_firstpass.h" 32 #include "vp9/encoder/vp9_firstpass.h"
34 #include "vp9/encoder/vp9_mcomp.h" 33 #include "vp9/encoder/vp9_mcomp.h"
35 #include "vp9/encoder/vp9_quantize.h" 34 #include "vp9/encoder/vp9_quantize.h"
(...skipping 13 matching lines...) Expand all
49 #define FACTOR_PT_LOW 0.5 48 #define FACTOR_PT_LOW 0.5
50 #define FACTOR_PT_HIGH 0.9 49 #define FACTOR_PT_HIGH 0.9
51 50
52 #define KF_MB_INTRA_MIN 150 51 #define KF_MB_INTRA_MIN 150
53 #define GF_MB_INTRA_MIN 100 52 #define GF_MB_INTRA_MIN 100
54 53
55 #define DOUBLE_DIVIDE_CHECK(x) ((x) < 0 ? (x) - 0.000001 : (x) + 0.000001) 54 #define DOUBLE_DIVIDE_CHECK(x) ((x) < 0 ? (x) - 0.000001 : (x) + 0.000001)
56 55
57 #define MIN_KF_BOOST 300 56 #define MIN_KF_BOOST 300
58 #define MIN_GF_INTERVAL 4 57 #define MIN_GF_INTERVAL 4
59 #define LONG_TERM_VBR_CORRECTION
60 58
61 static void swap_yv12(YV12_BUFFER_CONFIG *a, YV12_BUFFER_CONFIG *b) { 59 static void swap_yv12(YV12_BUFFER_CONFIG *a, YV12_BUFFER_CONFIG *b) {
62 YV12_BUFFER_CONFIG temp = *a; 60 YV12_BUFFER_CONFIG temp = *a;
63 *a = *b; 61 *a = *b;
64 *b = temp; 62 *b = temp;
65 } 63 }
66 64
67 static int gfboost_qadjust(int qindex) { 65 static int gfboost_qadjust(int qindex) {
68 const double q = vp9_convert_qindex_to_q(qindex); 66 const double q = vp9_convert_qindex_to_q(qindex);
69 return (int)((0.00000828 * q * q * q) + 67 return (int)((0.00000828 * q * q * q) +
(...skipping 148 matching lines...) Expand 10 before | Expand all | Expand 10 after
218 section->MVc -= frame->MVc; 216 section->MVc -= frame->MVc;
219 section->mvc_abs -= frame->mvc_abs; 217 section->mvc_abs -= frame->mvc_abs;
220 section->MVrv -= frame->MVrv; 218 section->MVrv -= frame->MVrv;
221 section->MVcv -= frame->MVcv; 219 section->MVcv -= frame->MVcv;
222 section->mv_in_out_count -= frame->mv_in_out_count; 220 section->mv_in_out_count -= frame->mv_in_out_count;
223 section->new_mv_count -= frame->new_mv_count; 221 section->new_mv_count -= frame->new_mv_count;
224 section->count -= frame->count; 222 section->count -= frame->count;
225 section->duration -= frame->duration; 223 section->duration -= frame->duration;
226 } 224 }
227 225
228 static void avg_stats(FIRSTPASS_STATS *section) {
229 if (section->count < 1.0)
230 return;
231
232 section->intra_error /= section->count;
233 section->coded_error /= section->count;
234 section->sr_coded_error /= section->count;
235 section->pcnt_inter /= section->count;
236 section->pcnt_second_ref /= section->count;
237 section->pcnt_neutral /= section->count;
238 section->pcnt_motion /= section->count;
239 section->MVr /= section->count;
240 section->mvr_abs /= section->count;
241 section->MVc /= section->count;
242 section->mvc_abs /= section->count;
243 section->MVrv /= section->count;
244 section->MVcv /= section->count;
245 section->mv_in_out_count /= section->count;
246 section->duration /= section->count;
247 }
248 226
249 // Calculate a modified Error used in distributing bits between easier and 227 // Calculate a modified Error used in distributing bits between easier and
250 // harder frames. 228 // harder frames.
251 static double calculate_modified_err(const TWO_PASS *twopass, 229 static double calculate_modified_err(const TWO_PASS *twopass,
252 const VP9EncoderConfig *oxcf, 230 const VP9EncoderConfig *oxcf,
253 const FIRSTPASS_STATS *this_frame) { 231 const FIRSTPASS_STATS *this_frame) {
254 const FIRSTPASS_STATS *const stats = &twopass->total_stats; 232 const FIRSTPASS_STATS *const stats = &twopass->total_stats;
255 const double av_err = stats->coded_error / stats->count; 233 const double av_err = stats->coded_error / stats->count;
256 const double modified_error = av_err * 234 const double modified_error = av_err *
257 pow(this_frame->coded_error / DOUBLE_DIVIDE_CHECK(av_err), 235 pow(this_frame->coded_error / DOUBLE_DIVIDE_CHECK(av_err),
(...skipping 13 matching lines...) Expand all
271 max_bits = rc->max_frame_bandwidth; 249 max_bits = rc->max_frame_bandwidth;
272 250
273 return (int)max_bits; 251 return (int)max_bits;
274 } 252 }
275 253
276 void vp9_init_first_pass(VP9_COMP *cpi) { 254 void vp9_init_first_pass(VP9_COMP *cpi) {
277 zero_stats(&cpi->twopass.total_stats); 255 zero_stats(&cpi->twopass.total_stats);
278 } 256 }
279 257
280 void vp9_end_first_pass(VP9_COMP *cpi) { 258 void vp9_end_first_pass(VP9_COMP *cpi) {
281 if (cpi->use_svc && cpi->svc.number_temporal_layers == 1) { 259 if (is_spatial_svc(cpi)) {
282 int i; 260 int i;
283 for (i = 0; i < cpi->svc.number_spatial_layers; ++i) { 261 for (i = 0; i < cpi->svc.number_spatial_layers; ++i) {
284 output_stats(&cpi->svc.layer_context[i].twopass.total_stats, 262 output_stats(&cpi->svc.layer_context[i].twopass.total_stats,
285 cpi->output_pkt_list); 263 cpi->output_pkt_list);
286 } 264 }
287 } else { 265 } else {
288 output_stats(&cpi->twopass.total_stats, cpi->output_pkt_list); 266 output_stats(&cpi->twopass.total_stats, cpi->output_pkt_list);
289 } 267 }
290 } 268 }
291 269
(...skipping 167 matching lines...) Expand 10 before | Expand all | Expand 10 after
459 if (cpi->use_fp_mb_stats) { 437 if (cpi->use_fp_mb_stats) {
460 vp9_zero_array(cpi->twopass.frame_mb_stats_buf, cm->MBs); 438 vp9_zero_array(cpi->twopass.frame_mb_stats_buf, cm->MBs);
461 } 439 }
462 #endif 440 #endif
463 441
464 vp9_clear_system_state(); 442 vp9_clear_system_state();
465 443
466 set_first_pass_params(cpi); 444 set_first_pass_params(cpi);
467 vp9_set_quantizer(cm, find_fp_qindex()); 445 vp9_set_quantizer(cm, find_fp_qindex());
468 446
469 if (cpi->use_svc && cpi->svc.number_temporal_layers == 1) { 447 if (is_spatial_svc(cpi)) {
470 MV_REFERENCE_FRAME ref_frame = LAST_FRAME; 448 MV_REFERENCE_FRAME ref_frame = LAST_FRAME;
471 const YV12_BUFFER_CONFIG *scaled_ref_buf = NULL; 449 const YV12_BUFFER_CONFIG *scaled_ref_buf = NULL;
472 twopass = &cpi->svc.layer_context[cpi->svc.spatial_layer_id].twopass; 450 twopass = &cpi->svc.layer_context[cpi->svc.spatial_layer_id].twopass;
473 451
474 if (cpi->common.current_video_frame == 0) { 452 if (cpi->common.current_video_frame == 0) {
475 cpi->ref_frame_flags = 0; 453 cpi->ref_frame_flags = 0;
476 } else { 454 } else {
477 LAYER_CONTEXT *lc = &cpi->svc.layer_context[cpi->svc.spatial_layer_id]; 455 LAYER_CONTEXT *lc = &cpi->svc.layer_context[cpi->svc.spatial_layer_id];
478 if (lc->current_video_frame_in_layer == 0) 456 if (lc->current_video_frame_in_layer == 0)
479 cpi->ref_frame_flags = VP9_GOLD_FLAG; 457 cpi->ref_frame_flags = VP9_GOLD_FLAG;
(...skipping 66 matching lines...) Expand 10 before | Expand all | Expand 10 after
546 // outside the UMV borders. 524 // outside the UMV borders.
547 x->mv_row_min = -((mb_row * 16) + BORDER_MV_PIXELS_B16); 525 x->mv_row_min = -((mb_row * 16) + BORDER_MV_PIXELS_B16);
548 x->mv_row_max = ((cm->mb_rows - 1 - mb_row) * 16) 526 x->mv_row_max = ((cm->mb_rows - 1 - mb_row) * 16)
549 + BORDER_MV_PIXELS_B16; 527 + BORDER_MV_PIXELS_B16;
550 528
551 for (mb_col = 0; mb_col < cm->mb_cols; ++mb_col) { 529 for (mb_col = 0; mb_col < cm->mb_cols; ++mb_col) {
552 int this_error; 530 int this_error;
553 const int use_dc_pred = (mb_col || mb_row) && (!mb_col || !mb_row); 531 const int use_dc_pred = (mb_col || mb_row) && (!mb_col || !mb_row);
554 double error_weight = 1.0; 532 double error_weight = 1.0;
555 const BLOCK_SIZE bsize = get_bsize(cm, mb_row, mb_col); 533 const BLOCK_SIZE bsize = get_bsize(cm, mb_row, mb_col);
534 #if CONFIG_FP_MB_STATS
535 const int mb_index = mb_row * cm->mb_cols + mb_col;
536 #endif
556 537
557 vp9_clear_system_state(); 538 vp9_clear_system_state();
558 539
559 xd->plane[0].dst.buf = new_yv12->y_buffer + recon_yoffset; 540 xd->plane[0].dst.buf = new_yv12->y_buffer + recon_yoffset;
560 xd->plane[1].dst.buf = new_yv12->u_buffer + recon_uvoffset; 541 xd->plane[1].dst.buf = new_yv12->u_buffer + recon_uvoffset;
561 xd->plane[2].dst.buf = new_yv12->v_buffer + recon_uvoffset; 542 xd->plane[2].dst.buf = new_yv12->v_buffer + recon_uvoffset;
562 xd->left_available = (mb_col != 0); 543 xd->left_available = (mb_col != 0);
563 xd->mi[0]->mbmi.sb_type = bsize; 544 xd->mi[0]->mbmi.sb_type = bsize;
564 xd->mi[0]->mbmi.ref_frame[0] = INTRA_FRAME; 545 xd->mi[0]->mbmi.ref_frame[0] = INTRA_FRAME;
565 set_mi_row_col(xd, &tile, 546 set_mi_row_col(xd, &tile,
(...skipping 26 matching lines...) Expand all
592 // When the error score is very low this causes us to pick all or lots of 573 // When the error score is very low this causes us to pick all or lots of
593 // INTRA modes and throw lots of key frames. 574 // INTRA modes and throw lots of key frames.
594 // This penalty adds a cost matching that of a 0,0 mv to the intra case. 575 // This penalty adds a cost matching that of a 0,0 mv to the intra case.
595 this_error += intrapenalty; 576 this_error += intrapenalty;
596 577
597 // Accumulate the intra error. 578 // Accumulate the intra error.
598 intra_error += (int64_t)this_error; 579 intra_error += (int64_t)this_error;
599 580
600 #if CONFIG_FP_MB_STATS 581 #if CONFIG_FP_MB_STATS
601 if (cpi->use_fp_mb_stats) { 582 if (cpi->use_fp_mb_stats) {
602 // TODO(pengchong): store some related block statistics here 583 // initialization
584 cpi->twopass.frame_mb_stats_buf[mb_index] = 0;
603 } 585 }
604 #endif 586 #endif
605 587
606 // Set up limit values for motion vectors to prevent them extending 588 // Set up limit values for motion vectors to prevent them extending
607 // outside the UMV borders. 589 // outside the UMV borders.
608 x->mv_col_min = -((mb_col * 16) + BORDER_MV_PIXELS_B16); 590 x->mv_col_min = -((mb_col * 16) + BORDER_MV_PIXELS_B16);
609 x->mv_col_max = ((cm->mb_cols - 1 - mb_col) * 16) + BORDER_MV_PIXELS_B16; 591 x->mv_col_max = ((cm->mb_cols - 1 - mb_col) * 16) + BORDER_MV_PIXELS_B16;
610 592
611 // Other than for the first frame do a motion search. 593 // Other than for the first frame do a motion search.
612 if (cm->current_video_frame > 0) { 594 if (cm->current_video_frame > 0) {
(...skipping 11 matching lines...) Expand all
624 // frame as the reference. Skip the further motion search on 606 // frame as the reference. Skip the further motion search on
625 // reconstructed frame if this error is small. 607 // reconstructed frame if this error is small.
626 unscaled_last_source_buf_2d.buf = 608 unscaled_last_source_buf_2d.buf =
627 cpi->unscaled_last_source->y_buffer + recon_yoffset; 609 cpi->unscaled_last_source->y_buffer + recon_yoffset;
628 unscaled_last_source_buf_2d.stride = 610 unscaled_last_source_buf_2d.stride =
629 cpi->unscaled_last_source->y_stride; 611 cpi->unscaled_last_source->y_stride;
630 raw_motion_error = get_prediction_error(bsize, &x->plane[0].src, 612 raw_motion_error = get_prediction_error(bsize, &x->plane[0].src,
631 &unscaled_last_source_buf_2d); 613 &unscaled_last_source_buf_2d);
632 614
633 // TODO(pengchong): Replace the hard-coded threshold 615 // TODO(pengchong): Replace the hard-coded threshold
634 if (raw_motion_error > 25 || 616 if (raw_motion_error > 25 || is_spatial_svc(cpi)) {
635 (cpi->use_svc && cpi->svc.number_temporal_layers == 1)) {
636 // Test last reference frame using the previous best mv as the 617 // Test last reference frame using the previous best mv as the
637 // starting point (best reference) for the search. 618 // starting point (best reference) for the search.
638 first_pass_motion_search(cpi, x, &best_ref_mv.as_mv, &mv.as_mv, 619 first_pass_motion_search(cpi, x, &best_ref_mv.as_mv, &mv.as_mv,
639 &motion_error); 620 &motion_error);
640 if (cpi->oxcf.aq_mode == VARIANCE_AQ) { 621 if (cpi->oxcf.aq_mode == VARIANCE_AQ) {
641 vp9_clear_system_state(); 622 vp9_clear_system_state();
642 motion_error = (int)(motion_error * error_weight); 623 motion_error = (int)(motion_error * error_weight);
643 } 624 }
644 625
645 // If the current best reference mv is not centered on 0,0 then do a 626 // If the current best reference mv is not centered on 0,0 then do a
(...skipping 47 matching lines...) Expand 10 before | Expand all | Expand 10 after
693 } else { 674 } else {
694 sr_coded_error += motion_error; 675 sr_coded_error += motion_error;
695 } 676 }
696 } else { 677 } else {
697 sr_coded_error += motion_error; 678 sr_coded_error += motion_error;
698 } 679 }
699 680
700 // Start by assuming that intra mode is best. 681 // Start by assuming that intra mode is best.
701 best_ref_mv.as_int = 0; 682 best_ref_mv.as_int = 0;
702 683
684 #if CONFIG_FP_MB_STATS
685 if (cpi->use_fp_mb_stats) {
686 // intra predication statistics
687 cpi->twopass.frame_mb_stats_buf[mb_index] = 0;
688 cpi->twopass.frame_mb_stats_buf[mb_index] |= FPMB_DCINTRA_MASK;
689 cpi->twopass.frame_mb_stats_buf[mb_index] |= FPMB_MOTION_ZERO_MASK;
690 if (this_error > FPMB_ERROR_LARGE_TH) {
691 cpi->twopass.frame_mb_stats_buf[mb_index] |= FPMB_ERROR_LARGE_MASK;
692 } else if (this_error < FPMB_ERROR_SMALL_TH) {
693 cpi->twopass.frame_mb_stats_buf[mb_index] |= FPMB_ERROR_SMALL_MASK;
694 }
695 }
696 #endif
697
703 if (motion_error <= this_error) { 698 if (motion_error <= this_error) {
704 // Keep a count of cases where the inter and intra were very close 699 // Keep a count of cases where the inter and intra were very close
705 // and very low. This helps with scene cut detection for example in 700 // and very low. This helps with scene cut detection for example in
706 // cropped clips with black bars at the sides or top and bottom. 701 // cropped clips with black bars at the sides or top and bottom.
707 if (((this_error - intrapenalty) * 9 <= motion_error * 10) && 702 if (((this_error - intrapenalty) * 9 <= motion_error * 10) &&
708 this_error < 2 * intrapenalty) 703 this_error < 2 * intrapenalty)
709 ++neutral_count; 704 ++neutral_count;
710 705
711 mv.as_mv.row *= 8; 706 mv.as_mv.row *= 8;
712 mv.as_mv.col *= 8; 707 mv.as_mv.col *= 8;
(...skipping 10 matching lines...) Expand all
723 sum_mvc += mv.as_mv.col; 718 sum_mvc += mv.as_mv.col;
724 sum_mvc_abs += abs(mv.as_mv.col); 719 sum_mvc_abs += abs(mv.as_mv.col);
725 sum_mvrs += mv.as_mv.row * mv.as_mv.row; 720 sum_mvrs += mv.as_mv.row * mv.as_mv.row;
726 sum_mvcs += mv.as_mv.col * mv.as_mv.col; 721 sum_mvcs += mv.as_mv.col * mv.as_mv.col;
727 ++intercount; 722 ++intercount;
728 723
729 best_ref_mv.as_int = mv.as_int; 724 best_ref_mv.as_int = mv.as_int;
730 725
731 #if CONFIG_FP_MB_STATS 726 #if CONFIG_FP_MB_STATS
732 if (cpi->use_fp_mb_stats) { 727 if (cpi->use_fp_mb_stats) {
733 // TODO(pengchong): save some related block statistics here 728 // inter predication statistics
729 cpi->twopass.frame_mb_stats_buf[mb_index] = 0;
730 cpi->twopass.frame_mb_stats_buf[mb_index] &= ~FPMB_DCINTRA_MASK;
731 cpi->twopass.frame_mb_stats_buf[mb_index] |= FPMB_MOTION_ZERO_MASK;
732 if (this_error > FPMB_ERROR_LARGE_TH) {
733 cpi->twopass.frame_mb_stats_buf[mb_index] |=
734 FPMB_ERROR_LARGE_MASK;
735 } else if (this_error < FPMB_ERROR_SMALL_TH) {
736 cpi->twopass.frame_mb_stats_buf[mb_index] |=
737 FPMB_ERROR_SMALL_MASK;
738 }
734 } 739 }
735 #endif 740 #endif
736 741
737 if (mv.as_int) { 742 if (mv.as_int) {
738 ++mvcount; 743 ++mvcount;
739 744
745 #if CONFIG_FP_MB_STATS
746 if (cpi->use_fp_mb_stats) {
747 cpi->twopass.frame_mb_stats_buf[mb_index] &=
748 ~FPMB_MOTION_ZERO_MASK;
749 // check estimated motion direction
750 if (mv.as_mv.col > 0 && mv.as_mv.col >= abs(mv.as_mv.row)) {
751 // right direction
752 cpi->twopass.frame_mb_stats_buf[mb_index] |=
753 FPMB_MOTION_RIGHT_MASK;
754 } else if (mv.as_mv.row < 0 &&
755 abs(mv.as_mv.row) >= abs(mv.as_mv.col)) {
756 // up direction
757 cpi->twopass.frame_mb_stats_buf[mb_index] |=
758 FPMB_MOTION_UP_MASK;
759 } else if (mv.as_mv.col < 0 &&
760 abs(mv.as_mv.col) >= abs(mv.as_mv.row)) {
761 // left direction
762 cpi->twopass.frame_mb_stats_buf[mb_index] |=
763 FPMB_MOTION_LEFT_MASK;
764 } else {
765 // down direction
766 cpi->twopass.frame_mb_stats_buf[mb_index] |=
767 FPMB_MOTION_DOWN_MASK;
768 }
769 }
770 #endif
771
740 // Non-zero vector, was it different from the last non zero vector? 772 // Non-zero vector, was it different from the last non zero vector?
741 if (mv.as_int != lastmv_as_int) 773 if (mv.as_int != lastmv_as_int)
742 ++new_mv_count; 774 ++new_mv_count;
743 lastmv_as_int = mv.as_int; 775 lastmv_as_int = mv.as_int;
744 776
745 // Does the row vector point inwards or outwards? 777 // Does the row vector point inwards or outwards?
746 if (mb_row < cm->mb_rows / 2) { 778 if (mb_row < cm->mb_rows / 2) {
747 if (mv.as_mv.row > 0) 779 if (mv.as_mv.row > 0)
748 --sum_in_vectors; 780 --sum_in_vectors;
749 else if (mv.as_mv.row < 0) 781 else if (mv.as_mv.row < 0)
(...skipping 106 matching lines...) Expand 10 before | Expand all | Expand 10 after
856 if (gld_yv12 != NULL) { 888 if (gld_yv12 != NULL) {
857 vp8_yv12_copy_frame(lst_yv12, gld_yv12); 889 vp8_yv12_copy_frame(lst_yv12, gld_yv12);
858 } 890 }
859 twopass->sr_update_lag = 1; 891 twopass->sr_update_lag = 1;
860 } else { 892 } else {
861 ++twopass->sr_update_lag; 893 ++twopass->sr_update_lag;
862 } 894 }
863 895
864 vp9_extend_frame_borders(new_yv12); 896 vp9_extend_frame_borders(new_yv12);
865 897
866 if (cpi->use_svc && cpi->svc.number_temporal_layers == 1) { 898 if (is_spatial_svc(cpi)) {
867 vp9_update_reference_frames(cpi); 899 vp9_update_reference_frames(cpi);
868 } else { 900 } else {
869 // Swap frame pointers so last frame refers to the frame we just compressed. 901 // Swap frame pointers so last frame refers to the frame we just compressed.
870 swap_yv12(lst_yv12, new_yv12); 902 swap_yv12(lst_yv12, new_yv12);
871 } 903 }
872 904
873 // Special case for the first frame. Copy into the GF buffer as a second 905 // Special case for the first frame. Copy into the GF buffer as a second
874 // reference. 906 // reference.
875 if (cm->current_video_frame == 0 && gld_yv12 != NULL) { 907 if (cm->current_video_frame == 0 && gld_yv12 != NULL) {
876 vp8_yv12_copy_frame(lst_yv12, gld_yv12); 908 vp8_yv12_copy_frame(lst_yv12, gld_yv12);
(...skipping 45 matching lines...) Expand 10 before | Expand all | Expand 10 after
922 const VP9EncoderConfig *const oxcf = &cpi->oxcf; 954 const VP9EncoderConfig *const oxcf = &cpi->oxcf;
923 955
924 if (section_target_bandwidth <= 0) { 956 if (section_target_bandwidth <= 0) {
925 return rc->worst_quality; // Highest value allowed 957 return rc->worst_quality; // Highest value allowed
926 } else { 958 } else {
927 const int num_mbs = cpi->common.MBs; 959 const int num_mbs = cpi->common.MBs;
928 const double section_err = stats->coded_error / stats->count; 960 const double section_err = stats->coded_error / stats->count;
929 const double err_per_mb = section_err / num_mbs; 961 const double err_per_mb = section_err / num_mbs;
930 const double speed_term = 1.0 + 0.04 * oxcf->speed; 962 const double speed_term = 1.0 + 0.04 * oxcf->speed;
931 const int target_norm_bits_per_mb = ((uint64_t)section_target_bandwidth << 963 const int target_norm_bits_per_mb = ((uint64_t)section_target_bandwidth <<
932 BPER_MB_NORMBITS) / num_mbs; 964 BPER_MB_NORMBITS) / num_mbs;
933 int q; 965 int q;
934 int is_svc_upper_layer = 0; 966 int is_svc_upper_layer = 0;
935 if (cpi->use_svc && cpi->svc.number_temporal_layers == 1 && 967 if (is_spatial_svc(cpi) && cpi->svc.spatial_layer_id > 0)
936 cpi->svc.spatial_layer_id > 0) {
937 is_svc_upper_layer = 1; 968 is_svc_upper_layer = 1;
938 }
939 969
940 // Try and pick a max Q that will be high enough to encode the 970 // Try and pick a max Q that will be high enough to encode the
941 // content at the given rate. 971 // content at the given rate.
942 for (q = rc->best_quality; q < rc->worst_quality; ++q) { 972 for (q = rc->best_quality; q < rc->worst_quality; ++q) {
943 const double factor = 973 const double factor =
944 calc_correction_factor(err_per_mb, ERR_DIVISOR, 974 calc_correction_factor(err_per_mb, ERR_DIVISOR,
945 is_svc_upper_layer ? SVC_FACTOR_PT_LOW : 975 is_svc_upper_layer ? SVC_FACTOR_PT_LOW :
946 FACTOR_PT_LOW, FACTOR_PT_HIGH, q); 976 FACTOR_PT_LOW, FACTOR_PT_HIGH, q);
947 const int bits_per_mb = vp9_rc_bits_per_mb(INTER_FRAME, q, 977 const int bits_per_mb = vp9_rc_bits_per_mb(INTER_FRAME, q,
948 factor * speed_term); 978 factor * speed_term);
(...skipping 93 matching lines...) Expand 10 before | Expand all | Expand 10 after
1042 // and the GF buffer (which contains an older frame). 1072 // and the GF buffer (which contains an older frame).
1043 const double mb_sr_err_diff = (next_frame->sr_coded_error - 1073 const double mb_sr_err_diff = (next_frame->sr_coded_error -
1044 next_frame->coded_error) / cm->MBs; 1074 next_frame->coded_error) / cm->MBs;
1045 const double second_ref_decay = mb_sr_err_diff <= 512.0 1075 const double second_ref_decay = mb_sr_err_diff <= 512.0
1046 ? fclamp(pow(1.0 - (mb_sr_err_diff / 512.0), 0.5), 0.85, 1.0) 1076 ? fclamp(pow(1.0 - (mb_sr_err_diff / 512.0), 0.5), 0.85, 1.0)
1047 : 0.85; 1077 : 0.85;
1048 1078
1049 return MIN(second_ref_decay, next_frame->pcnt_inter); 1079 return MIN(second_ref_decay, next_frame->pcnt_inter);
1050 } 1080 }
1051 1081
1082 // This function gives an estimate of how badly we believe the prediction
1083 // quality is decaying from frame to frame.
1084 static double get_zero_motion_factor(const VP9_COMMON *cm,
1085 const FIRSTPASS_STATS *frame) {
1086 const double sr_ratio = frame->coded_error /
1087 DOUBLE_DIVIDE_CHECK(frame->sr_coded_error);
1088 const double zero_motion_pct = frame->pcnt_inter -
1089 frame->pcnt_motion;
1090
1091 return MIN(sr_ratio, zero_motion_pct);
1092 }
1093
1094
1052 // Function to test for a condition where a complex transition is followed 1095 // Function to test for a condition where a complex transition is followed
1053 // by a static section. For example in slide shows where there is a fade 1096 // by a static section. For example in slide shows where there is a fade
1054 // between slides. This is to help with more optimal kf and gf positioning. 1097 // between slides. This is to help with more optimal kf and gf positioning.
1055 static int detect_transition_to_still(TWO_PASS *twopass, 1098 static int detect_transition_to_still(TWO_PASS *twopass,
1056 int frame_interval, int still_interval, 1099 int frame_interval, int still_interval,
1057 double loop_decay_rate, 1100 double loop_decay_rate,
1058 double last_decay_rate) { 1101 double last_decay_rate) {
1059 int trans_to_still = 0; 1102 int trans_to_still = 0;
1060 1103
1061 // Break clause to detect very still sections after motion 1104 // Break clause to detect very still sections after motion
(...skipping 503 matching lines...) Expand 10 before | Expand all | Expand 10 after
1565 &abs_mv_in_out_accumulator, 1608 &abs_mv_in_out_accumulator,
1566 &mv_ratio_accumulator); 1609 &mv_ratio_accumulator);
1567 1610
1568 // Accumulate the effect of prediction quality decay. 1611 // Accumulate the effect of prediction quality decay.
1569 if (!flash_detected) { 1612 if (!flash_detected) {
1570 last_loop_decay_rate = loop_decay_rate; 1613 last_loop_decay_rate = loop_decay_rate;
1571 loop_decay_rate = get_prediction_decay_rate(&cpi->common, &next_frame); 1614 loop_decay_rate = get_prediction_decay_rate(&cpi->common, &next_frame);
1572 decay_accumulator = decay_accumulator * loop_decay_rate; 1615 decay_accumulator = decay_accumulator * loop_decay_rate;
1573 1616
1574 // Monitor for static sections. 1617 // Monitor for static sections.
1575 if ((next_frame.pcnt_inter - next_frame.pcnt_motion) < 1618 zero_motion_accumulator =
1576 zero_motion_accumulator) { 1619 MIN(zero_motion_accumulator,
1577 zero_motion_accumulator = next_frame.pcnt_inter - 1620 get_zero_motion_factor(&cpi->common, &next_frame));
1578 next_frame.pcnt_motion;
1579 }
1580 1621
1581 // Break clause to detect very still sections after motion. For example, 1622 // Break clause to detect very still sections after motion. For example,
1582 // a static image after a fade or other transition. 1623 // a static image after a fade or other transition.
1583 if (detect_transition_to_still(twopass, i, 5, loop_decay_rate, 1624 if (detect_transition_to_still(twopass, i, 5, loop_decay_rate,
1584 last_loop_decay_rate)) { 1625 last_loop_decay_rate)) {
1585 allow_alt_ref = 0; 1626 allow_alt_ref = 0;
1586 break; 1627 break;
1587 } 1628 }
1588 } 1629 }
1589 1630
(...skipping 349 matching lines...) Expand 10 before | Expand all | Expand 10 after
1939 1980
1940 // Scan through the kf group collating various stats used to deteermine 1981 // Scan through the kf group collating various stats used to deteermine
1941 // how many bits to spend on it. 1982 // how many bits to spend on it.
1942 decay_accumulator = 1.0; 1983 decay_accumulator = 1.0;
1943 boost_score = 0.0; 1984 boost_score = 0.0;
1944 for (i = 0; i < rc->frames_to_key; ++i) { 1985 for (i = 0; i < rc->frames_to_key; ++i) {
1945 if (EOF == input_stats(twopass, &next_frame)) 1986 if (EOF == input_stats(twopass, &next_frame))
1946 break; 1987 break;
1947 1988
1948 // Monitor for static sections. 1989 // Monitor for static sections.
1949 if ((next_frame.pcnt_inter - next_frame.pcnt_motion) < 1990 zero_motion_accumulator =
1950 zero_motion_accumulator) { 1991 MIN(zero_motion_accumulator,
1951 zero_motion_accumulator = (next_frame.pcnt_inter - 1992 get_zero_motion_factor(&cpi->common, &next_frame));
1952 next_frame.pcnt_motion);
1953 }
1954 1993
1955 // For the first few frames collect data to decide kf boost. 1994 // For the first few frames collect data to decide kf boost.
1956 if (i <= (rc->max_gf_interval * 2)) { 1995 if (i <= (rc->max_gf_interval * 2)) {
1957 double r; 1996 double r;
1958 if (next_frame.intra_error > twopass->kf_intra_err_min) 1997 if (next_frame.intra_error > twopass->kf_intra_err_min)
1959 r = (IIKFACTOR2 * next_frame.intra_error / 1998 r = (IIKFACTOR2 * next_frame.intra_error /
1960 DOUBLE_DIVIDE_CHECK(next_frame.coded_error)); 1999 DOUBLE_DIVIDE_CHECK(next_frame.coded_error));
1961 else 2000 else
1962 r = (IIKFACTOR2 * twopass->kf_intra_err_min / 2001 r = (IIKFACTOR2 * twopass->kf_intra_err_min /
1963 DOUBLE_DIVIDE_CHECK(next_frame.coded_error)); 2002 DOUBLE_DIVIDE_CHECK(next_frame.coded_error));
(...skipping 94 matching lines...) Expand 10 before | Expand all | Expand 10 after
2058 cpi->refresh_alt_ref_frame = 0; 2097 cpi->refresh_alt_ref_frame = 0;
2059 cpi->rc.is_src_frame_alt_ref = 1; 2098 cpi->rc.is_src_frame_alt_ref = 1;
2060 break; 2099 break;
2061 case ARF_UPDATE: 2100 case ARF_UPDATE:
2062 cpi->refresh_last_frame = 0; 2101 cpi->refresh_last_frame = 0;
2063 cpi->refresh_golden_frame = 0; 2102 cpi->refresh_golden_frame = 0;
2064 cpi->refresh_alt_ref_frame = 1; 2103 cpi->refresh_alt_ref_frame = 1;
2065 break; 2104 break;
2066 default: 2105 default:
2067 assert(0); 2106 assert(0);
2107 break;
2068 } 2108 }
2069 if (cpi->use_svc && cpi->svc.number_temporal_layers == 1) { 2109 if (is_spatial_svc(cpi)) {
2070 cpi->refresh_golden_frame = 0; 2110 if (cpi->svc.layer_context[cpi->svc.spatial_layer_id].gold_ref_idx < 0)
2111 cpi->refresh_golden_frame = 0;
2071 if (cpi->alt_ref_source == NULL) 2112 if (cpi->alt_ref_source == NULL)
2072 cpi->refresh_alt_ref_frame = 0; 2113 cpi->refresh_alt_ref_frame = 0;
2073 } 2114 }
2074 } 2115 }
2075 2116
2076 2117
2077 void vp9_rc_get_second_pass_params(VP9_COMP *cpi) { 2118 void vp9_rc_get_second_pass_params(VP9_COMP *cpi) {
2078 VP9_COMMON *const cm = &cpi->common; 2119 VP9_COMMON *const cm = &cpi->common;
2079 RATE_CONTROL *const rc = &cpi->rc; 2120 RATE_CONTROL *const rc = &cpi->rc;
2080 TWO_PASS *const twopass = &cpi->twopass; 2121 TWO_PASS *const twopass = &cpi->twopass;
2081 int frames_left; 2122 int frames_left;
2082 FIRSTPASS_STATS this_frame; 2123 FIRSTPASS_STATS this_frame;
2083 FIRSTPASS_STATS this_frame_copy; 2124 FIRSTPASS_STATS this_frame_copy;
2084 2125
2085 int target_rate; 2126 int target_rate;
2086 LAYER_CONTEXT *lc = NULL; 2127 LAYER_CONTEXT *lc = NULL;
2087 const int is_spatial_svc = (cpi->use_svc && 2128
2088 cpi->svc.number_temporal_layers == 1); 2129 if (is_spatial_svc(cpi)) {
2089 if (is_spatial_svc) {
2090 lc = &cpi->svc.layer_context[cpi->svc.spatial_layer_id]; 2130 lc = &cpi->svc.layer_context[cpi->svc.spatial_layer_id];
2091 frames_left = (int)(twopass->total_stats.count - 2131 frames_left = (int)(twopass->total_stats.count -
2092 lc->current_video_frame_in_layer); 2132 lc->current_video_frame_in_layer);
2093 } else { 2133 } else {
2094 frames_left = (int)(twopass->total_stats.count - 2134 frames_left = (int)(twopass->total_stats.count -
2095 cm->current_video_frame); 2135 cm->current_video_frame);
2096 } 2136 }
2097 2137
2098 if (!twopass->stats_in) 2138 if (!twopass->stats_in)
2099 return; 2139 return;
2100 2140
2101 // If this is an arf frame then we dont want to read the stats file or 2141 // If this is an arf frame then we dont want to read the stats file or
2102 // advance the input pointer as we already have what we need. 2142 // advance the input pointer as we already have what we need.
2103 if (twopass->gf_group.update_type[twopass->gf_group.index] == ARF_UPDATE) { 2143 if (twopass->gf_group.update_type[twopass->gf_group.index] == ARF_UPDATE) {
2104 int target_rate; 2144 int target_rate;
2105 configure_buffer_updates(cpi); 2145 configure_buffer_updates(cpi);
2106 target_rate = twopass->gf_group.bit_allocation[twopass->gf_group.index]; 2146 target_rate = twopass->gf_group.bit_allocation[twopass->gf_group.index];
2107 target_rate = vp9_rc_clamp_pframe_target_size(cpi, target_rate); 2147 target_rate = vp9_rc_clamp_pframe_target_size(cpi, target_rate);
2108 rc->base_frame_target = target_rate; 2148 rc->base_frame_target = target_rate;
2109 #ifdef LONG_TERM_VBR_CORRECTION 2149
2110 // Correction to rate target based on prior over or under shoot. 2150 // Correction to rate target based on prior over or under shoot.
2111 if (cpi->oxcf.rc_mode == VPX_VBR) 2151 if (cpi->oxcf.rc_mode == VPX_VBR)
2112 vbr_rate_correction(&target_rate, rc->vbr_bits_off_target); 2152 vbr_rate_correction(&target_rate, rc->vbr_bits_off_target);
2113 #endif 2153
2114 vp9_rc_set_frame_target(cpi, target_rate); 2154 vp9_rc_set_frame_target(cpi, target_rate);
2115 cm->frame_type = INTER_FRAME; 2155 cm->frame_type = INTER_FRAME;
2116 2156
2117 if (is_spatial_svc) { 2157 if (is_spatial_svc(cpi)) {
2118 if (cpi->svc.spatial_layer_id == 0) { 2158 if (cpi->svc.spatial_layer_id == 0) {
2119 lc->is_key_frame = 0; 2159 lc->is_key_frame = 0;
2120 } else { 2160 } else {
2121 lc->is_key_frame = cpi->svc.layer_context[0].is_key_frame; 2161 lc->is_key_frame = cpi->svc.layer_context[0].is_key_frame;
2122 2162
2123 if (lc->is_key_frame) 2163 if (lc->is_key_frame)
2124 cpi->ref_frame_flags &= (~VP9_LAST_FLAG); 2164 cpi->ref_frame_flags &= (~VP9_LAST_FLAG);
2125 } 2165 }
2126 } 2166 }
2127 2167
2128 return; 2168 return;
2129 } 2169 }
2130 2170
2131 vp9_clear_system_state(); 2171 vp9_clear_system_state();
2132 2172
2133 if (is_spatial_svc && twopass->kf_intra_err_min == 0) { 2173 if (is_spatial_svc(cpi) && twopass->kf_intra_err_min == 0) {
2134 twopass->kf_intra_err_min = KF_MB_INTRA_MIN * cpi->common.MBs; 2174 twopass->kf_intra_err_min = KF_MB_INTRA_MIN * cpi->common.MBs;
2135 twopass->gf_intra_err_min = GF_MB_INTRA_MIN * cpi->common.MBs; 2175 twopass->gf_intra_err_min = GF_MB_INTRA_MIN * cpi->common.MBs;
2136 } 2176 }
2137 2177
2138 if (cpi->oxcf.rc_mode == VPX_Q) { 2178 if (cpi->oxcf.rc_mode == VPX_Q) {
2139 twopass->active_worst_quality = cpi->oxcf.cq_level; 2179 twopass->active_worst_quality = cpi->oxcf.cq_level;
2140 } else if (cm->current_video_frame == 0 || 2180 } else if (cm->current_video_frame == 0 ||
2141 (is_spatial_svc && lc->current_video_frame_in_layer == 0)) { 2181 (is_spatial_svc(cpi) &&
2182 lc->current_video_frame_in_layer == 0)) {
2142 // Special case code for first frame. 2183 // Special case code for first frame.
2143 const int section_target_bandwidth = (int)(twopass->bits_left / 2184 const int section_target_bandwidth = (int)(twopass->bits_left /
2144 frames_left); 2185 frames_left);
2145 const int tmp_q = get_twopass_worst_quality(cpi, &twopass->total_left_stats, 2186 const int tmp_q = get_twopass_worst_quality(cpi, &twopass->total_left_stats,
2146 section_target_bandwidth); 2187 section_target_bandwidth);
2147 twopass->active_worst_quality = tmp_q; 2188 twopass->active_worst_quality = tmp_q;
2148 rc->ni_av_qi = tmp_q; 2189 rc->ni_av_qi = tmp_q;
2149 rc->avg_q = vp9_convert_qindex_to_q(tmp_q); 2190 rc->avg_q = vp9_convert_qindex_to_q(tmp_q);
2150 } 2191 }
2151 vp9_zero(this_frame); 2192 vp9_zero(this_frame);
2152 if (EOF == input_stats(twopass, &this_frame)) 2193 if (EOF == input_stats(twopass, &this_frame))
2153 return; 2194 return;
2154 2195
2155 // Local copy of the current frame's first pass stats. 2196 // Local copy of the current frame's first pass stats.
2156 this_frame_copy = this_frame; 2197 this_frame_copy = this_frame;
2157 2198
2158 // Keyframe and section processing. 2199 // Keyframe and section processing.
2159 if (rc->frames_to_key == 0 || 2200 if (rc->frames_to_key == 0 ||
2160 (cpi->frame_flags & FRAMEFLAGS_KEY)) { 2201 (cpi->frame_flags & FRAMEFLAGS_KEY)) {
2161 // Define next KF group and assign bits to it. 2202 // Define next KF group and assign bits to it.
2162 find_next_key_frame(cpi, &this_frame_copy); 2203 find_next_key_frame(cpi, &this_frame_copy);
2163 } else { 2204 } else {
2164 cm->frame_type = INTER_FRAME; 2205 cm->frame_type = INTER_FRAME;
2165 } 2206 }
2166 2207
2167 if (is_spatial_svc) { 2208 if (is_spatial_svc(cpi)) {
2168 if (cpi->svc.spatial_layer_id == 0) { 2209 if (cpi->svc.spatial_layer_id == 0) {
2169 lc->is_key_frame = (cm->frame_type == KEY_FRAME); 2210 lc->is_key_frame = (cm->frame_type == KEY_FRAME);
2211 if (lc->is_key_frame)
2212 cpi->ref_frame_flags &=
2213 (~VP9_LAST_FLAG & ~VP9_GOLD_FLAG & ~VP9_ALT_FLAG);
2170 } else { 2214 } else {
2171 cm->frame_type = INTER_FRAME; 2215 cm->frame_type = INTER_FRAME;
2172 lc->is_key_frame = cpi->svc.layer_context[0].is_key_frame; 2216 lc->is_key_frame = cpi->svc.layer_context[0].is_key_frame;
2173 2217
2174 if (lc->is_key_frame) { 2218 if (lc->is_key_frame) {
2175 cpi->ref_frame_flags &= (~VP9_LAST_FLAG); 2219 cpi->ref_frame_flags &= (~VP9_LAST_FLAG);
2176 } 2220 }
2177 } 2221 }
2178 } 2222 }
2179 2223
2180 // Define a new GF/ARF group. (Should always enter here for key frames). 2224 // Define a new GF/ARF group. (Should always enter here for key frames).
2181 if (rc->frames_till_gf_update_due == 0) { 2225 if (rc->frames_till_gf_update_due == 0) {
2182 define_gf_group(cpi, &this_frame_copy); 2226 define_gf_group(cpi, &this_frame_copy);
2183 2227
2184 if (twopass->gf_zeromotion_pct > 995) { 2228 if (twopass->gf_zeromotion_pct > 995) {
2185 // As long as max_thresh for encode breakout is small enough, it is ok 2229 // As long as max_thresh for encode breakout is small enough, it is ok
2186 // to enable it for show frame, i.e. set allow_encode_breakout to 2230 // to enable it for show frame, i.e. set allow_encode_breakout to
2187 // ENCODE_BREAKOUT_LIMITED. 2231 // ENCODE_BREAKOUT_LIMITED.
2188 if (!cm->show_frame) 2232 if (!cm->show_frame)
2189 cpi->allow_encode_breakout = ENCODE_BREAKOUT_DISABLED; 2233 cpi->allow_encode_breakout = ENCODE_BREAKOUT_DISABLED;
2190 else 2234 else
2191 cpi->allow_encode_breakout = ENCODE_BREAKOUT_LIMITED; 2235 cpi->allow_encode_breakout = ENCODE_BREAKOUT_LIMITED;
2192 } 2236 }
2193 2237
2194 rc->frames_till_gf_update_due = rc->baseline_gf_interval; 2238 rc->frames_till_gf_update_due = rc->baseline_gf_interval;
2195 if (!is_spatial_svc) 2239 if (!is_spatial_svc(cpi))
2196 cpi->refresh_golden_frame = 1; 2240 cpi->refresh_golden_frame = 1;
2197 } 2241 }
2198 2242
2199 configure_buffer_updates(cpi); 2243 configure_buffer_updates(cpi);
2200 2244
2201 target_rate = twopass->gf_group.bit_allocation[twopass->gf_group.index]; 2245 target_rate = twopass->gf_group.bit_allocation[twopass->gf_group.index];
2202 if (cpi->common.frame_type == KEY_FRAME) 2246 if (cpi->common.frame_type == KEY_FRAME)
2203 target_rate = vp9_rc_clamp_iframe_target_size(cpi, target_rate); 2247 target_rate = vp9_rc_clamp_iframe_target_size(cpi, target_rate);
2204 else 2248 else
2205 target_rate = vp9_rc_clamp_pframe_target_size(cpi, target_rate); 2249 target_rate = vp9_rc_clamp_pframe_target_size(cpi, target_rate);
2206 2250
2207 rc->base_frame_target = target_rate; 2251 rc->base_frame_target = target_rate;
2208 #ifdef LONG_TERM_VBR_CORRECTION 2252
2209 // Correction to rate target based on prior over or under shoot. 2253 // Correction to rate target based on prior over or under shoot.
2210 if (cpi->oxcf.rc_mode == VPX_VBR) 2254 if (cpi->oxcf.rc_mode == VPX_VBR)
2211 vbr_rate_correction(&target_rate, rc->vbr_bits_off_target); 2255 vbr_rate_correction(&target_rate, rc->vbr_bits_off_target);
2212 #endif 2256
2213 vp9_rc_set_frame_target(cpi, target_rate); 2257 vp9_rc_set_frame_target(cpi, target_rate);
2214 2258
2215 // Update the total stats remaining structure. 2259 // Update the total stats remaining structure.
2216 subtract_stats(&twopass->total_left_stats, &this_frame); 2260 subtract_stats(&twopass->total_left_stats, &this_frame);
2217 } 2261 }
2218 2262
2219 void vp9_twopass_postencode_update(VP9_COMP *cpi) { 2263 void vp9_twopass_postencode_update(VP9_COMP *cpi) {
2220 TWO_PASS *const twopass = &cpi->twopass; 2264 TWO_PASS *const twopass = &cpi->twopass;
2221 RATE_CONTROL *const rc = &cpi->rc; 2265 RATE_CONTROL *const rc = &cpi->rc;
2222 #ifdef LONG_TERM_VBR_CORRECTION 2266
2223 // In this experimental mode, the VBR correction is done exclusively through 2267 // VBR correction is done through rc->vbr_bits_off_target. Based on the
2224 // rc->vbr_bits_off_target. Based on the sign of this value, a limited % 2268 // sign of this value, a limited % adjustment is made to the target rate
2225 // adjustment is made to the target rate of subsequent frames, to try and 2269 // of subsequent frames, to try and push it back towards 0. This method
2226 // push it back towards 0. This mode is less likely to suffer from 2270 // is designed to prevent extreme behaviour at the end of a clip
2227 // extreme behaviour at the end of a clip or group of frames. 2271 // or group of frames.
2228 const int bits_used = rc->base_frame_target; 2272 const int bits_used = rc->base_frame_target;
2229 rc->vbr_bits_off_target += rc->base_frame_target - rc->projected_frame_size; 2273 rc->vbr_bits_off_target += rc->base_frame_target - rc->projected_frame_size;
2230 #else
2231 // In this mode, VBR correction is acheived by altering bits_left,
2232 // kf_group_bits & gf_group_bits to reflect any deviation from the target
2233 // rate in this frame. This alters the allocation of bits to the
2234 // remaning frames in the group / clip.
2235 //
2236 // This method can give rise to unstable behaviour near the end of a clip
2237 // or kf/gf group of frames where any accumulated error is corrected over an
2238 // ever decreasing number of frames. Hence we change the balance of target
2239 // vs. actual bitrate gradually as we progress towards the end of the
2240 // sequence in order to mitigate this effect.
2241 const double progress =
2242 (double)(twopass->stats_in - twopass->stats_in_start) /
2243 (twopass->stats_in_end - twopass->stats_in_start);
2244 const int bits_used = (int)(progress * rc->this_frame_target +
2245 (1.0 - progress) * rc->projected_frame_size);
2246 #endif
2247 2274
2248 twopass->bits_left = MAX(twopass->bits_left - bits_used, 0); 2275 twopass->bits_left = MAX(twopass->bits_left - bits_used, 0);
2249 2276
2250 #ifdef LONG_TERM_VBR_CORRECTION
2251 if (cpi->common.frame_type != KEY_FRAME && 2277 if (cpi->common.frame_type != KEY_FRAME &&
2252 !vp9_is_upper_layer_key_frame(cpi)) { 2278 !vp9_is_upper_layer_key_frame(cpi)) {
2253 #else
2254 if (cpi->common.frame_type == KEY_FRAME ||
2255 vp9_is_upper_layer_key_frame(cpi)) {
2256 // For key frames kf_group_bits already had the target bits subtracted out.
2257 // So now update to the correct value based on the actual bits used.
2258 twopass->kf_group_bits += rc->this_frame_target - bits_used;
2259 } else {
2260 #endif
2261 twopass->kf_group_bits -= bits_used; 2279 twopass->kf_group_bits -= bits_used;
2262 } 2280 }
2263 twopass->kf_group_bits = MAX(twopass->kf_group_bits, 0); 2281 twopass->kf_group_bits = MAX(twopass->kf_group_bits, 0);
2264 2282
2265 // Increment the gf group index ready for the next frame. 2283 // Increment the gf group index ready for the next frame.
2266 ++twopass->gf_group.index; 2284 ++twopass->gf_group.index;
2267 } 2285 }
OLDNEW
« no previous file with comments | « source/libvpx/vp9/encoder/vp9_firstpass.h ('k') | source/libvpx/vp9/encoder/vp9_picklpf.c » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698