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

Side by Side Diff: source/libvpx/vp9/encoder/vp9_encoder.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_encoder.h ('k') | source/libvpx/vp9/encoder/vp9_firstpass.h » ('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 47 matching lines...) Expand 10 before | Expand all | Expand 10 after
58 #define HIGH_PRECISION_MV_QTHRESH 200 // Q threshold for high precision 58 #define HIGH_PRECISION_MV_QTHRESH 200 // Q threshold for high precision
59 // mv. Choose a very high value for 59 // mv. Choose a very high value for
60 // now so that HIGH_PRECISION is always 60 // now so that HIGH_PRECISION is always
61 // chosen. 61 // chosen.
62 62
63 // #define OUTPUT_YUV_REC 63 // #define OUTPUT_YUV_REC
64 64
65 #ifdef OUTPUT_YUV_DENOISED 65 #ifdef OUTPUT_YUV_DENOISED
66 FILE *yuv_denoised_file = NULL; 66 FILE *yuv_denoised_file = NULL;
67 #endif 67 #endif
68 #ifdef OUTPUT_YUV_SRC
69 FILE *yuv_file;
70 #endif
71 #ifdef OUTPUT_YUV_REC 68 #ifdef OUTPUT_YUV_REC
72 FILE *yuv_rec_file; 69 FILE *yuv_rec_file;
73 #endif 70 #endif
74 71
75 #if 0 72 #if 0
76 FILE *framepsnr; 73 FILE *framepsnr;
77 FILE *kf_list; 74 FILE *kf_list;
78 FILE *keyfile; 75 FILE *keyfile;
79 #endif 76 #endif
80 77
(...skipping 43 matching lines...) Expand 10 before | Expand all | Expand 10 after
124 // other inter-frames the encoder currently uses only two contexts; 121 // other inter-frames the encoder currently uses only two contexts;
125 // context 1 for ALTREF frames and context 0 for the others. 122 // context 1 for ALTREF frames and context 0 for the others.
126 if (frame_is_intra_only(cm) || cm->error_resilient_mode) { 123 if (frame_is_intra_only(cm) || cm->error_resilient_mode) {
127 vp9_setup_past_independence(cm); 124 vp9_setup_past_independence(cm);
128 } else { 125 } else {
129 if (!cpi->use_svc) 126 if (!cpi->use_svc)
130 cm->frame_context_idx = cpi->refresh_alt_ref_frame; 127 cm->frame_context_idx = cpi->refresh_alt_ref_frame;
131 } 128 }
132 129
133 if (cm->frame_type == KEY_FRAME) { 130 if (cm->frame_type == KEY_FRAME) {
134 cpi->refresh_golden_frame = 1; 131 if (!is_spatial_svc(cpi))
132 cpi->refresh_golden_frame = 1;
135 cpi->refresh_alt_ref_frame = 1; 133 cpi->refresh_alt_ref_frame = 1;
136 } else { 134 } else {
137 cm->fc = cm->frame_contexts[cm->frame_context_idx]; 135 cm->fc = cm->frame_contexts[cm->frame_context_idx];
138 } 136 }
139 } 137 }
140 138
141 void vp9_initialize_enc() { 139 void vp9_initialize_enc() {
142 static int init_done = 0; 140 static int init_done = 0;
143 141
144 if (!init_done) { 142 if (!init_done) {
(...skipping 324 matching lines...) Expand 10 before | Expand all | Expand 10 after
469 } 467 }
470 468
471 static void update_frame_size(VP9_COMP *cpi) { 469 static void update_frame_size(VP9_COMP *cpi) {
472 VP9_COMMON *const cm = &cpi->common; 470 VP9_COMMON *const cm = &cpi->common;
473 MACROBLOCKD *const xd = &cpi->mb.e_mbd; 471 MACROBLOCKD *const xd = &cpi->mb.e_mbd;
474 472
475 vp9_set_mb_mi(cm, cm->width, cm->height); 473 vp9_set_mb_mi(cm, cm->width, cm->height);
476 vp9_init_context_buffers(cm); 474 vp9_init_context_buffers(cm);
477 init_macroblockd(cm, xd); 475 init_macroblockd(cm, xd);
478 476
479 if (cpi->use_svc && cpi->svc.number_temporal_layers == 1) { 477 if (is_spatial_svc(cpi)) {
480 if (vp9_realloc_frame_buffer(&cpi->alt_ref_buffer, 478 if (vp9_realloc_frame_buffer(&cpi->alt_ref_buffer,
481 cm->width, cm->height, 479 cm->width, cm->height,
482 cm->subsampling_x, cm->subsampling_y, 480 cm->subsampling_x, cm->subsampling_y,
483 VP9_ENC_BORDER_IN_PIXELS, NULL, NULL, NULL)) 481 VP9_ENC_BORDER_IN_PIXELS, NULL, NULL, NULL))
484 vpx_internal_error(&cm->error, VPX_CODEC_MEM_ERROR, 482 vpx_internal_error(&cm->error, VPX_CODEC_MEM_ERROR,
485 "Failed to reallocate alt_ref_buffer"); 483 "Failed to reallocate alt_ref_buffer");
486 } 484 }
487 } 485 }
488 486
489 void vp9_new_framerate(VP9_COMP *cpi, double framerate) { 487 void vp9_new_framerate(VP9_COMP *cpi, double framerate) {
490 cpi->oxcf.framerate = framerate < 0.1 ? 30 : framerate; 488 cpi->framerate = framerate < 0.1 ? 30 : framerate;
491 vp9_rc_update_framerate(cpi); 489 vp9_rc_update_framerate(cpi);
492 } 490 }
493 491
494 int64_t vp9_rescale(int64_t val, int64_t num, int denom) { 492 int64_t vp9_rescale(int64_t val, int64_t num, int denom) {
495 int64_t llnum = num; 493 int64_t llnum = num;
496 int64_t llden = denom; 494 int64_t llden = denom;
497 int64_t llval = val; 495 int64_t llval = val;
498 496
499 return (llval * llnum / llden); 497 return (llval * llnum / llden);
500 } 498 }
(...skipping 12 matching lines...) Expand all
513 static void init_buffer_indices(VP9_COMP *cpi) { 511 static void init_buffer_indices(VP9_COMP *cpi) {
514 cpi->lst_fb_idx = 0; 512 cpi->lst_fb_idx = 0;
515 cpi->gld_fb_idx = 1; 513 cpi->gld_fb_idx = 1;
516 cpi->alt_fb_idx = 2; 514 cpi->alt_fb_idx = 2;
517 } 515 }
518 516
519 static void init_config(struct VP9_COMP *cpi, VP9EncoderConfig *oxcf) { 517 static void init_config(struct VP9_COMP *cpi, VP9EncoderConfig *oxcf) {
520 VP9_COMMON *const cm = &cpi->common; 518 VP9_COMMON *const cm = &cpi->common;
521 519
522 cpi->oxcf = *oxcf; 520 cpi->oxcf = *oxcf;
521 cpi->framerate = oxcf->init_framerate;
523 522
524 cm->profile = oxcf->profile; 523 cm->profile = oxcf->profile;
525 cm->bit_depth = oxcf->bit_depth; 524 cm->bit_depth = oxcf->bit_depth;
525 cm->color_space = UNKNOWN;
526 526
527 cm->width = oxcf->width; 527 cm->width = oxcf->width;
528 cm->height = oxcf->height; 528 cm->height = oxcf->height;
529 vp9_alloc_compressor_data(cpi); 529 vp9_alloc_compressor_data(cpi);
530 530
531 // Spatial scalability. 531 // Spatial scalability.
532 cpi->svc.number_spatial_layers = oxcf->ss_number_layers; 532 cpi->svc.number_spatial_layers = oxcf->ss_number_layers;
533 // Temporal scalability. 533 // Temporal scalability.
534 cpi->svc.number_temporal_layers = oxcf->ts_number_layers; 534 cpi->svc.number_temporal_layers = oxcf->ts_number_layers;
535 535
536 if ((cpi->svc.number_temporal_layers > 1 && 536 if ((cpi->svc.number_temporal_layers > 1 &&
537 cpi->oxcf.rc_mode == VPX_CBR) || 537 cpi->oxcf.rc_mode == VPX_CBR) ||
538 (cpi->svc.number_spatial_layers > 1 && 538 (cpi->svc.number_spatial_layers > 1 &&
539 cpi->oxcf.mode == TWO_PASS_SECOND_BEST)) { 539 cpi->oxcf.mode == TWO_PASS_SECOND_BEST)) {
540 vp9_init_layer_context(cpi); 540 vp9_init_layer_context(cpi);
541 } 541 }
542 542
543 // change includes all joint functionality 543 // change includes all joint functionality
544 vp9_change_config(cpi, oxcf); 544 vp9_change_config(cpi, oxcf);
545 545
546 cpi->static_mb_pct = 0; 546 cpi->static_mb_pct = 0;
547 cpi->ref_frame_flags = 0; 547 cpi->ref_frame_flags = 0;
548 548
549 init_buffer_indices(cpi); 549 init_buffer_indices(cpi);
550 550
551 set_tile_limits(cpi); 551 set_tile_limits(cpi);
552 } 552 }
553 553
554 static int get_pass(MODE mode) {
555 switch (mode) {
556 case REALTIME:
557 case ONE_PASS_GOOD:
558 case ONE_PASS_BEST:
559 return 0;
560
561 case TWO_PASS_FIRST:
562 return 1;
563
564 case TWO_PASS_SECOND_GOOD:
565 case TWO_PASS_SECOND_BEST:
566 return 2;
567 }
568 return -1;
569 }
570
571 void vp9_change_config(struct VP9_COMP *cpi, const VP9EncoderConfig *oxcf) { 554 void vp9_change_config(struct VP9_COMP *cpi, const VP9EncoderConfig *oxcf) {
572 VP9_COMMON *const cm = &cpi->common; 555 VP9_COMMON *const cm = &cpi->common;
573 RATE_CONTROL *const rc = &cpi->rc; 556 RATE_CONTROL *const rc = &cpi->rc;
574 557
575 if (cm->profile != oxcf->profile) 558 if (cm->profile != oxcf->profile)
576 cm->profile = oxcf->profile; 559 cm->profile = oxcf->profile;
577 cm->bit_depth = oxcf->bit_depth; 560 cm->bit_depth = oxcf->bit_depth;
578 561
579 if (cm->profile <= PROFILE_1) 562 if (cm->profile <= PROFILE_1)
580 assert(cm->bit_depth == BITS_8); 563 assert(cm->bit_depth == BITS_8);
581 else 564 else
582 assert(cm->bit_depth > BITS_8); 565 assert(cm->bit_depth > BITS_8);
583 566
584 cpi->oxcf = *oxcf; 567 cpi->oxcf = *oxcf;
585 cpi->pass = get_pass(cpi->oxcf.mode);
586 568
587 rc->baseline_gf_interval = DEFAULT_GF_INTERVAL; 569 rc->baseline_gf_interval = DEFAULT_GF_INTERVAL;
588 570
589 cpi->refresh_golden_frame = 0; 571 cpi->refresh_golden_frame = 0;
590 cpi->refresh_last_frame = 1; 572 cpi->refresh_last_frame = 1;
591 cm->refresh_frame_context = 1; 573 cm->refresh_frame_context = 1;
592 cm->reset_frame_context = 0; 574 cm->reset_frame_context = 0;
593 575
594 vp9_reset_segment_features(&cm->seg); 576 vp9_reset_segment_features(&cm->seg);
595 vp9_set_high_precision_mv(cpi, 0); 577 vp9_set_high_precision_mv(cpi, 0);
(...skipping 27 matching lines...) Expand all
623 rc->maximum_buffer_size = cpi->oxcf.target_bandwidth / 8; 605 rc->maximum_buffer_size = cpi->oxcf.target_bandwidth / 8;
624 else 606 else
625 rc->maximum_buffer_size = vp9_rescale(cpi->oxcf.maximum_buffer_size_ms, 607 rc->maximum_buffer_size = vp9_rescale(cpi->oxcf.maximum_buffer_size_ms,
626 cpi->oxcf.target_bandwidth, 1000); 608 cpi->oxcf.target_bandwidth, 1000);
627 // Under a configuration change, where maximum_buffer_size may change, 609 // Under a configuration change, where maximum_buffer_size may change,
628 // keep buffer level clipped to the maximum allowed buffer size. 610 // keep buffer level clipped to the maximum allowed buffer size.
629 rc->bits_off_target = MIN(rc->bits_off_target, rc->maximum_buffer_size); 611 rc->bits_off_target = MIN(rc->bits_off_target, rc->maximum_buffer_size);
630 rc->buffer_level = MIN(rc->buffer_level, rc->maximum_buffer_size); 612 rc->buffer_level = MIN(rc->buffer_level, rc->maximum_buffer_size);
631 613
632 // Set up frame rate and related parameters rate control values. 614 // Set up frame rate and related parameters rate control values.
633 vp9_new_framerate(cpi, cpi->oxcf.framerate); 615 vp9_new_framerate(cpi, cpi->framerate);
634 616
635 // Set absolute upper and lower quality limits 617 // Set absolute upper and lower quality limits
636 rc->worst_quality = cpi->oxcf.worst_allowed_q; 618 rc->worst_quality = cpi->oxcf.worst_allowed_q;
637 rc->best_quality = cpi->oxcf.best_allowed_q; 619 rc->best_quality = cpi->oxcf.best_allowed_q;
638 620
639 cm->interp_filter = cpi->sf.default_interp_filter; 621 cm->interp_filter = cpi->sf.default_interp_filter;
640 622
641 cm->display_width = cpi->oxcf.width; 623 cm->display_width = cpi->oxcf.width;
642 cm->display_height = cpi->oxcf.height; 624 cm->display_height = cpi->oxcf.height;
643 625
644 if (cpi->initial_width) { 626 if (cpi->initial_width) {
645 // Increasing the size of the frame beyond the first seen frame, or some 627 // Increasing the size of the frame beyond the first seen frame, or some
646 // otherwise signaled maximum size, is not supported. 628 // otherwise signaled maximum size, is not supported.
647 // TODO(jkoleszar): exit gracefully. 629 // TODO(jkoleszar): exit gracefully.
648 assert(cm->width <= cpi->initial_width); 630 assert(cm->width <= cpi->initial_width);
649 assert(cm->height <= cpi->initial_height); 631 assert(cm->height <= cpi->initial_height);
650 } 632 }
651 update_frame_size(cpi); 633 update_frame_size(cpi);
652 634
653 if ((cpi->svc.number_temporal_layers > 1 && 635 if ((cpi->svc.number_temporal_layers > 1 &&
654 cpi->oxcf.rc_mode == VPX_CBR) || 636 cpi->oxcf.rc_mode == VPX_CBR) ||
655 (cpi->svc.number_spatial_layers > 1 && cpi->pass == 2)) { 637 (cpi->svc.number_spatial_layers > 1 && cpi->oxcf.pass == 2)) {
656 vp9_update_layer_context_change_config(cpi, 638 vp9_update_layer_context_change_config(cpi,
657 (int)cpi->oxcf.target_bandwidth); 639 (int)cpi->oxcf.target_bandwidth);
658 } 640 }
659 641
660 cpi->alt_ref_source = NULL; 642 cpi->alt_ref_source = NULL;
661 rc->is_src_frame_alt_ref = 0; 643 rc->is_src_frame_alt_ref = 0;
662 644
663 #if 0 645 #if 0
664 // Experimental RD Code 646 // Experimental RD Code
665 cpi->frame_distortion = 0; 647 cpi->frame_distortion = 0;
666 cpi->last_frame_distortion = 0; 648 cpi->last_frame_distortion = 0;
667 #endif 649 #endif
668 650
669 set_tile_limits(cpi); 651 set_tile_limits(cpi);
670 652
671 cpi->ext_refresh_frame_flags_pending = 0; 653 cpi->ext_refresh_frame_flags_pending = 0;
672 cpi->ext_refresh_frame_context_pending = 0; 654 cpi->ext_refresh_frame_context_pending = 0;
673 655
674 #if CONFIG_DENOISING 656 #if CONFIG_VP9_TEMPORAL_DENOISING
675 if (cpi->oxcf.noise_sensitivity > 0) { 657 if (cpi->oxcf.noise_sensitivity > 0) {
676 vp9_denoiser_alloc(&(cpi->denoiser), cm->width, cm->height, 658 vp9_denoiser_alloc(&(cpi->denoiser), cm->width, cm->height,
677 cm->subsampling_x, cm->subsampling_y, 659 cm->subsampling_x, cm->subsampling_y,
678 VP9_ENC_BORDER_IN_PIXELS); 660 VP9_ENC_BORDER_IN_PIXELS);
679 } 661 }
680 #endif 662 #endif
681 } 663 }
682 664
683 #ifndef M_LOG2_E 665 #ifndef M_LOG2_E
684 #define M_LOG2_E 0.693147180559945309417 666 #define M_LOG2_E 0.693147180559945309417
(...skipping 54 matching lines...) Expand 10 before | Expand all | Expand 10 after
739 return 0; 721 return 0;
740 } 722 }
741 723
742 cm->error.setjmp = 1; 724 cm->error.setjmp = 1;
743 725
744 vp9_rtcd(); 726 vp9_rtcd();
745 727
746 cpi->use_svc = 0; 728 cpi->use_svc = 0;
747 729
748 init_config(cpi, oxcf); 730 init_config(cpi, oxcf);
749 vp9_rc_init(&cpi->oxcf, cpi->pass, &cpi->rc); 731 vp9_rc_init(&cpi->oxcf, oxcf->pass, &cpi->rc);
750 732
751 cm->current_video_frame = 0; 733 cm->current_video_frame = 0;
752 734
753 cpi->gold_is_last = 0; 735 cpi->gold_is_last = 0;
754 cpi->alt_is_last = 0; 736 cpi->alt_is_last = 0;
755 cpi->gold_is_alt = 0; 737 cpi->gold_is_alt = 0;
756 738
757 cpi->skippable_frame = 0; 739 cpi->skippable_frame = 0;
758 740
759 // Create the encoder segmentation map and set all entries to 0 741 // Create the encoder segmentation map and set all entries to 0
(...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after
791 } 773 }
792 #endif 774 #endif
793 775
794 cpi->refresh_alt_ref_frame = 0; 776 cpi->refresh_alt_ref_frame = 0;
795 777
796 // Note that at the moment multi_arf will not work with svc. 778 // Note that at the moment multi_arf will not work with svc.
797 // For the current check in all the execution paths are defaulted to 0 779 // For the current check in all the execution paths are defaulted to 0
798 // pending further tuning and testing. The code is left in place here 780 // pending further tuning and testing. The code is left in place here
799 // as a place holder in regard to the required paths. 781 // as a place holder in regard to the required paths.
800 cpi->multi_arf_last_grp_enabled = 0; 782 cpi->multi_arf_last_grp_enabled = 0;
801 if (cpi->pass == 2) { 783 if (oxcf->pass == 2) {
802 if (cpi->use_svc) { 784 if (cpi->use_svc) {
803 cpi->multi_arf_allowed = 0; 785 cpi->multi_arf_allowed = 0;
804 cpi->multi_arf_enabled = 0; 786 cpi->multi_arf_enabled = 0;
805 } else { 787 } else {
806 // Disable by default for now. 788 // Disable by default for now.
807 cpi->multi_arf_allowed = 0; 789 cpi->multi_arf_allowed = 0;
808 cpi->multi_arf_enabled = 0; 790 cpi->multi_arf_enabled = 0;
809 } 791 }
810 } else { 792 } else {
811 cpi->multi_arf_allowed = 0; 793 cpi->multi_arf_allowed = 0;
(...skipping 46 matching lines...) Expand 10 before | Expand all | Expand 10 after
858 cpi->mb.nmvsadcost[0] = &cpi->mb.nmvsadcosts[0][MV_MAX]; 840 cpi->mb.nmvsadcost[0] = &cpi->mb.nmvsadcosts[0][MV_MAX];
859 cpi->mb.nmvsadcost[1] = &cpi->mb.nmvsadcosts[1][MV_MAX]; 841 cpi->mb.nmvsadcost[1] = &cpi->mb.nmvsadcosts[1][MV_MAX];
860 cal_nmvsadcosts(cpi->mb.nmvsadcost); 842 cal_nmvsadcosts(cpi->mb.nmvsadcost);
861 843
862 cpi->mb.nmvcost_hp[0] = &cpi->mb.nmvcosts_hp[0][MV_MAX]; 844 cpi->mb.nmvcost_hp[0] = &cpi->mb.nmvcosts_hp[0][MV_MAX];
863 cpi->mb.nmvcost_hp[1] = &cpi->mb.nmvcosts_hp[1][MV_MAX]; 845 cpi->mb.nmvcost_hp[1] = &cpi->mb.nmvcosts_hp[1][MV_MAX];
864 cpi->mb.nmvsadcost_hp[0] = &cpi->mb.nmvsadcosts_hp[0][MV_MAX]; 846 cpi->mb.nmvsadcost_hp[0] = &cpi->mb.nmvsadcosts_hp[0][MV_MAX];
865 cpi->mb.nmvsadcost_hp[1] = &cpi->mb.nmvsadcosts_hp[1][MV_MAX]; 847 cpi->mb.nmvsadcost_hp[1] = &cpi->mb.nmvsadcosts_hp[1][MV_MAX];
866 cal_nmvsadcosts_hp(cpi->mb.nmvsadcost_hp); 848 cal_nmvsadcosts_hp(cpi->mb.nmvsadcost_hp);
867 849
868 #if CONFIG_DENOISING 850 #if CONFIG_VP9_TEMPORAL_DENOISING
869 #ifdef OUTPUT_YUV_DENOISED 851 #ifdef OUTPUT_YUV_DENOISED
870 yuv_denoised_file = fopen("denoised.yuv", "ab"); 852 yuv_denoised_file = fopen("denoised.yuv", "ab");
871 #endif 853 #endif
872 #endif 854 #endif
873 #ifdef OUTPUT_YUV_SRC
874 yuv_file = fopen("bd.yuv", "ab");
875 #endif
876 #ifdef OUTPUT_YUV_REC 855 #ifdef OUTPUT_YUV_REC
877 yuv_rec_file = fopen("rec.yuv", "wb"); 856 yuv_rec_file = fopen("rec.yuv", "wb");
878 #endif 857 #endif
879 858
880 #if 0 859 #if 0
881 framepsnr = fopen("framepsnr.stt", "a"); 860 framepsnr = fopen("framepsnr.stt", "a");
882 kf_list = fopen("kf_list.stt", "w"); 861 kf_list = fopen("kf_list.stt", "w");
883 #endif 862 #endif
884 863
885 cpi->output_pkt_list = oxcf->output_pkt_list; 864 cpi->output_pkt_list = oxcf->output_pkt_list;
886 865
887 cpi->allow_encode_breakout = ENCODE_BREAKOUT_ENABLED; 866 cpi->allow_encode_breakout = ENCODE_BREAKOUT_ENABLED;
888 867
889 if (cpi->pass == 1) { 868 if (oxcf->pass == 1) {
890 vp9_init_first_pass(cpi); 869 vp9_init_first_pass(cpi);
891 } else if (cpi->pass == 2) { 870 } else if (oxcf->pass == 2) {
892 const size_t packet_sz = sizeof(FIRSTPASS_STATS); 871 const size_t packet_sz = sizeof(FIRSTPASS_STATS);
893 const int packets = (int)(oxcf->two_pass_stats_in.sz / packet_sz); 872 const int packets = (int)(oxcf->two_pass_stats_in.sz / packet_sz);
894 873
895 if (cpi->svc.number_spatial_layers > 1 874 if (cpi->svc.number_spatial_layers > 1
896 && cpi->svc.number_temporal_layers == 1) { 875 && cpi->svc.number_temporal_layers == 1) {
897 FIRSTPASS_STATS *const stats = oxcf->two_pass_stats_in.buf; 876 FIRSTPASS_STATS *const stats = oxcf->two_pass_stats_in.buf;
898 FIRSTPASS_STATS *stats_copy[VPX_SS_MAX_LAYERS] = {0}; 877 FIRSTPASS_STATS *stats_copy[VPX_SS_MAX_LAYERS] = {0};
899 int i; 878 int i;
900 879
901 for (i = 0; i < oxcf->ss_number_layers; ++i) { 880 for (i = 0; i < oxcf->ss_number_layers; ++i) {
(...skipping 125 matching lines...) Expand 10 before | Expand all | Expand 10 after
1027 1006
1028 BFP(BLOCK_4X8, vp9_sad4x8, vp9_sad4x8_avg, 1007 BFP(BLOCK_4X8, vp9_sad4x8, vp9_sad4x8_avg,
1029 vp9_variance4x8, vp9_sub_pixel_variance4x8, 1008 vp9_variance4x8, vp9_sub_pixel_variance4x8,
1030 vp9_sub_pixel_avg_variance4x8, NULL, vp9_sad4x8x8, vp9_sad4x8x4d) 1009 vp9_sub_pixel_avg_variance4x8, NULL, vp9_sad4x8x8, vp9_sad4x8x4d)
1031 1010
1032 BFP(BLOCK_4X4, vp9_sad4x4, vp9_sad4x4_avg, 1011 BFP(BLOCK_4X4, vp9_sad4x4, vp9_sad4x4_avg,
1033 vp9_variance4x4, vp9_sub_pixel_variance4x4, 1012 vp9_variance4x4, vp9_sub_pixel_variance4x4,
1034 vp9_sub_pixel_avg_variance4x4, 1013 vp9_sub_pixel_avg_variance4x4,
1035 vp9_sad4x4x3, vp9_sad4x4x8, vp9_sad4x4x4d) 1014 vp9_sad4x4x3, vp9_sad4x4x8, vp9_sad4x4x4d)
1036 1015
1037 cpi->full_search_sad = vp9_full_search_sad;
1038 cpi->diamond_search_sad = vp9_diamond_search_sad;
1039 cpi->refining_search_sad = vp9_refining_search_sad;
1040
1041 /* vp9_init_quantizer() is first called here. Add check in 1016 /* vp9_init_quantizer() is first called here. Add check in
1042 * vp9_frame_init_quantizer() so that vp9_init_quantizer is only 1017 * vp9_frame_init_quantizer() so that vp9_init_quantizer is only
1043 * called later when needed. This will avoid unnecessary calls of 1018 * called later when needed. This will avoid unnecessary calls of
1044 * vp9_init_quantizer() for every frame. 1019 * vp9_init_quantizer() for every frame.
1045 */ 1020 */
1046 vp9_init_quantizer(cpi); 1021 vp9_init_quantizer(cpi);
1047 1022
1048 vp9_loop_filter_init(cm); 1023 vp9_loop_filter_init(cm);
1049 1024
1050 cm->error.setjmp = 0; 1025 cm->error.setjmp = 0;
1051 1026
1052 return cpi; 1027 return cpi;
1053 } 1028 }
1054 1029
1055 void vp9_remove_compressor(VP9_COMP *cpi) { 1030 void vp9_remove_compressor(VP9_COMP *cpi) {
1056 unsigned int i; 1031 unsigned int i;
1057 1032
1058 if (!cpi) 1033 if (!cpi)
1059 return; 1034 return;
1060 1035
1061 if (cpi && (cpi->common.current_video_frame > 0)) { 1036 if (cpi && (cpi->common.current_video_frame > 0)) {
1062 #if CONFIG_INTERNAL_STATS 1037 #if CONFIG_INTERNAL_STATS
1063 1038
1064 vp9_clear_system_state(); 1039 vp9_clear_system_state();
1065 1040
1066 // printf("\n8x8-4x4:%d-%d\n", cpi->t8x8_count, cpi->t4x4_count); 1041 // printf("\n8x8-4x4:%d-%d\n", cpi->t8x8_count, cpi->t4x4_count);
1067 if (cpi->pass != 1) { 1042 if (cpi->oxcf.pass != 1) {
1068 FILE *f = fopen("opsnr.stt", "a"); 1043 FILE *f = fopen("opsnr.stt", "a");
1069 double time_encoded = (cpi->last_end_time_stamp_seen 1044 double time_encoded = (cpi->last_end_time_stamp_seen
1070 - cpi->first_time_stamp_ever) / 10000000.000; 1045 - cpi->first_time_stamp_ever) / 10000000.000;
1071 double total_encode_time = (cpi->time_receive_data + 1046 double total_encode_time = (cpi->time_receive_data +
1072 cpi->time_compress_data) / 1000.000; 1047 cpi->time_compress_data) / 1000.000;
1073 double dr = (double)cpi->bytes * (double) 8 / (double)1000 1048 double dr = (double)cpi->bytes * (double) 8 / (double)1000
1074 / time_encoded; 1049 / time_encoded;
1075 1050
1076 if (cpi->b_calculate_psnr) { 1051 if (cpi->b_calculate_psnr) {
1077 const double total_psnr = 1052 const double total_psnr =
(...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after
1112 printf("\n_pick_loop_filter_level:%d\n", cpi->time_pick_lpf / 1000); 1087 printf("\n_pick_loop_filter_level:%d\n", cpi->time_pick_lpf / 1000);
1113 printf("\n_frames recive_data encod_mb_row compress_frame Total\n"); 1088 printf("\n_frames recive_data encod_mb_row compress_frame Total\n");
1114 printf("%6d %10ld %10ld %10ld %10ld\n", cpi->common.current_video_frame, 1089 printf("%6d %10ld %10ld %10ld %10ld\n", cpi->common.current_video_frame,
1115 cpi->time_receive_data / 1000, cpi->time_encode_sb_row / 1000, 1090 cpi->time_receive_data / 1000, cpi->time_encode_sb_row / 1000,
1116 cpi->time_compress_data / 1000, 1091 cpi->time_compress_data / 1000,
1117 (cpi->time_receive_data + cpi->time_compress_data) / 1000); 1092 (cpi->time_receive_data + cpi->time_compress_data) / 1000);
1118 } 1093 }
1119 #endif 1094 #endif
1120 } 1095 }
1121 1096
1122 #if CONFIG_DENOISING 1097 #if CONFIG_VP9_TEMPORAL_DENOISING
1123 if (cpi->oxcf.noise_sensitivity > 0) { 1098 if (cpi->oxcf.noise_sensitivity > 0) {
1124 vp9_denoiser_free(&(cpi->denoiser)); 1099 vp9_denoiser_free(&(cpi->denoiser));
1125 } 1100 }
1126 #endif 1101 #endif
1127 1102
1128 dealloc_compressor_data(cpi); 1103 dealloc_compressor_data(cpi);
1129 vpx_free(cpi->tok); 1104 vpx_free(cpi->tok);
1130 1105
1131 for (i = 0; i < sizeof(cpi->mbgraph_stats) / 1106 for (i = 0; i < sizeof(cpi->mbgraph_stats) /
1132 sizeof(cpi->mbgraph_stats[0]); ++i) { 1107 sizeof(cpi->mbgraph_stats[0]); ++i) {
1133 vpx_free(cpi->mbgraph_stats[i].mb_stats); 1108 vpx_free(cpi->mbgraph_stats[i].mb_stats);
1134 } 1109 }
1135 1110
1136 #if CONFIG_FP_MB_STATS 1111 #if CONFIG_FP_MB_STATS
1137 if (cpi->use_fp_mb_stats) { 1112 if (cpi->use_fp_mb_stats) {
1138 vpx_free(cpi->twopass.frame_mb_stats_buf); 1113 vpx_free(cpi->twopass.frame_mb_stats_buf);
1139 cpi->twopass.frame_mb_stats_buf = NULL; 1114 cpi->twopass.frame_mb_stats_buf = NULL;
1140 } 1115 }
1141 #endif 1116 #endif
1142 1117
1143 vp9_remove_common(&cpi->common); 1118 vp9_remove_common(&cpi->common);
1144 vpx_free(cpi); 1119 vpx_free(cpi);
1145 1120
1146 #if CONFIG_DENOISING 1121 #if CONFIG_VP9_TEMPORAL_DENOISING
1147 #ifdef OUTPUT_YUV_DENOISED 1122 #ifdef OUTPUT_YUV_DENOISED
1148 fclose(yuv_denoised_file); 1123 fclose(yuv_denoised_file);
1149 #endif 1124 #endif
1150 #endif 1125 #endif
1151 #ifdef OUTPUT_YUV_SRC
1152 fclose(yuv_file);
1153 #endif
1154 #ifdef OUTPUT_YUV_REC 1126 #ifdef OUTPUT_YUV_REC
1155 fclose(yuv_rec_file); 1127 fclose(yuv_rec_file);
1156 #endif 1128 #endif
1157 1129
1158 #if 0 1130 #if 0
1159 1131
1160 if (keyfile) 1132 if (keyfile)
1161 fclose(keyfile); 1133 fclose(keyfile);
1162 1134
1163 if (framepsnr) 1135 if (framepsnr)
(...skipping 130 matching lines...) Expand 10 before | Expand all | Expand 10 after
1294 YV12_BUFFER_CONFIG *sd) { 1266 YV12_BUFFER_CONFIG *sd) {
1295 YV12_BUFFER_CONFIG *cfg = get_vp9_ref_frame_buffer(cpi, ref_frame_flag); 1267 YV12_BUFFER_CONFIG *cfg = get_vp9_ref_frame_buffer(cpi, ref_frame_flag);
1296 if (cfg) { 1268 if (cfg) {
1297 vp8_yv12_copy_frame(cfg, sd); 1269 vp8_yv12_copy_frame(cfg, sd);
1298 return 0; 1270 return 0;
1299 } else { 1271 } else {
1300 return -1; 1272 return -1;
1301 } 1273 }
1302 } 1274 }
1303 1275
1304 int vp9_get_reference_enc(VP9_COMP *cpi, int index, YV12_BUFFER_CONFIG **fb) {
1305 VP9_COMMON *cm = &cpi->common;
1306
1307 if (index < 0 || index >= REF_FRAMES)
1308 return -1;
1309
1310 *fb = &cm->frame_bufs[cm->ref_frame_map[index]].buf;
1311 return 0;
1312 }
1313
1314 int vp9_set_reference_enc(VP9_COMP *cpi, VP9_REFFRAME ref_frame_flag, 1276 int vp9_set_reference_enc(VP9_COMP *cpi, VP9_REFFRAME ref_frame_flag,
1315 YV12_BUFFER_CONFIG *sd) { 1277 YV12_BUFFER_CONFIG *sd) {
1316 YV12_BUFFER_CONFIG *cfg = get_vp9_ref_frame_buffer(cpi, ref_frame_flag); 1278 YV12_BUFFER_CONFIG *cfg = get_vp9_ref_frame_buffer(cpi, ref_frame_flag);
1317 if (cfg) { 1279 if (cfg) {
1318 vp8_yv12_copy_frame(sd, cfg); 1280 vp8_yv12_copy_frame(sd, cfg);
1319 return 0; 1281 return 0;
1320 } else { 1282 } else {
1321 return -1; 1283 return -1;
1322 } 1284 }
1323 } 1285 }
1324 1286
1325 int vp9_update_entropy(VP9_COMP * cpi, int update) { 1287 int vp9_update_entropy(VP9_COMP * cpi, int update) {
1326 cpi->ext_refresh_frame_context = update; 1288 cpi->ext_refresh_frame_context = update;
1327 cpi->ext_refresh_frame_context_pending = 1; 1289 cpi->ext_refresh_frame_context_pending = 1;
1328 return 0; 1290 return 0;
1329 } 1291 }
1330 1292
1331 1293 #if CONFIG_VP9_TEMPORAL_DENOISING
1332 #if defined(OUTPUT_YUV_SRC)
1333 void vp9_write_yuv_frame(YV12_BUFFER_CONFIG *s, FILE *f) {
1334 uint8_t *src = s->y_buffer;
1335 int h = s->y_height;
1336
1337 do {
1338 fwrite(src, s->y_width, 1, f);
1339 src += s->y_stride;
1340 } while (--h);
1341
1342 src = s->u_buffer;
1343 h = s->uv_height;
1344
1345 do {
1346 fwrite(src, s->uv_width, 1, f);
1347 src += s->uv_stride;
1348 } while (--h);
1349
1350 src = s->v_buffer;
1351 h = s->uv_height;
1352
1353 do {
1354 fwrite(src, s->uv_width, 1, f);
1355 src += s->uv_stride;
1356 } while (--h);
1357 }
1358 #endif
1359
1360 #if CONFIG_DENOISING
1361 #if defined(OUTPUT_YUV_DENOISED) 1294 #if defined(OUTPUT_YUV_DENOISED)
1362 // The denoiser buffer is allocated as a YUV 440 buffer. This function writes it 1295 // The denoiser buffer is allocated as a YUV 440 buffer. This function writes it
1363 // as YUV 420. We simply use the top-left pixels of the UV buffers, since we do 1296 // as YUV 420. We simply use the top-left pixels of the UV buffers, since we do
1364 // not denoise the UV channels at this time. If ever we implement UV channel 1297 // not denoise the UV channels at this time. If ever we implement UV channel
1365 // denoising we will have to modify this. 1298 // denoising we will have to modify this.
1366 void vp9_write_yuv_frame_420(YV12_BUFFER_CONFIG *s, FILE *f) { 1299 void vp9_write_yuv_frame_420(YV12_BUFFER_CONFIG *s, FILE *f) {
1367 uint8_t *src = s->y_buffer; 1300 uint8_t *src = s->y_buffer;
1368 int h = s->y_height; 1301 int h = s->y_height;
1369 1302
1370 do { 1303 do {
(...skipping 185 matching lines...) Expand 10 before | Expand all | Expand 10 after
1556 void vp9_update_reference_frames(VP9_COMP *cpi) { 1489 void vp9_update_reference_frames(VP9_COMP *cpi) {
1557 VP9_COMMON * const cm = &cpi->common; 1490 VP9_COMMON * const cm = &cpi->common;
1558 1491
1559 // At this point the new frame has been encoded. 1492 // At this point the new frame has been encoded.
1560 // If any buffer copy / swapping is signaled it should be done here. 1493 // If any buffer copy / swapping is signaled it should be done here.
1561 if (cm->frame_type == KEY_FRAME) { 1494 if (cm->frame_type == KEY_FRAME) {
1562 ref_cnt_fb(cm->frame_bufs, 1495 ref_cnt_fb(cm->frame_bufs,
1563 &cm->ref_frame_map[cpi->gld_fb_idx], cm->new_fb_idx); 1496 &cm->ref_frame_map[cpi->gld_fb_idx], cm->new_fb_idx);
1564 ref_cnt_fb(cm->frame_bufs, 1497 ref_cnt_fb(cm->frame_bufs,
1565 &cm->ref_frame_map[cpi->alt_fb_idx], cm->new_fb_idx); 1498 &cm->ref_frame_map[cpi->alt_fb_idx], cm->new_fb_idx);
1566 } else if (!cpi->multi_arf_allowed && cpi->refresh_golden_frame && 1499 } else if (vp9_preserve_existing_gf(cpi)) {
1567 cpi->rc.is_src_frame_alt_ref && !cpi->use_svc) { 1500 // We have decided to preserve the previously existing golden frame as our
1568 /* Preserve the previously existing golden frame and update the frame in 1501 // new ARF frame. However, in the short term in function
1569 * the alt ref slot instead. This is highly specific to the current use of 1502 // vp9_bitstream.c::get_refresh_mask() we left it in the GF slot and, if
1570 * alt-ref as a forward reference, and this needs to be generalized as 1503 // we're updating the GF with the current decoded frame, we save it to the
1571 * other uses are implemented (like RTC/temporal scaling) 1504 // ARF slot instead.
1572 * 1505 // We now have to update the ARF with the current frame and swap gld_fb_idx
1573 * The update to the buffer in the alt ref slot was signaled in 1506 // and alt_fb_idx so that, overall, we've stored the old GF in the new ARF
1574 * vp9_pack_bitstream(), now swap the buffer pointers so that it's treated 1507 // slot and, if we're updating the GF, the current frame becomes the new GF.
1575 * as the golden frame next time.
1576 */
1577 int tmp; 1508 int tmp;
1578 1509
1579 ref_cnt_fb(cm->frame_bufs, 1510 ref_cnt_fb(cm->frame_bufs,
1580 &cm->ref_frame_map[cpi->alt_fb_idx], cm->new_fb_idx); 1511 &cm->ref_frame_map[cpi->alt_fb_idx], cm->new_fb_idx);
1581 1512
1582 tmp = cpi->alt_fb_idx; 1513 tmp = cpi->alt_fb_idx;
1583 cpi->alt_fb_idx = cpi->gld_fb_idx; 1514 cpi->alt_fb_idx = cpi->gld_fb_idx;
1584 cpi->gld_fb_idx = tmp; 1515 cpi->gld_fb_idx = tmp;
1516
1517 if (is_spatial_svc(cpi)) {
1518 cpi->svc.layer_context[0].gold_ref_idx = cpi->gld_fb_idx;
1519 cpi->svc.layer_context[0].alt_ref_idx = cpi->alt_fb_idx;
1520 }
1585 } else { /* For non key/golden frames */ 1521 } else { /* For non key/golden frames */
1586 if (cpi->refresh_alt_ref_frame) { 1522 if (cpi->refresh_alt_ref_frame) {
1587 int arf_idx = cpi->alt_fb_idx; 1523 int arf_idx = cpi->alt_fb_idx;
1588 if ((cpi->pass == 2) && cpi->multi_arf_allowed) { 1524 if ((cpi->oxcf.pass == 2) && cpi->multi_arf_allowed) {
1589 const GF_GROUP *const gf_group = &cpi->twopass.gf_group; 1525 const GF_GROUP *const gf_group = &cpi->twopass.gf_group;
1590 arf_idx = gf_group->arf_update_idx[gf_group->index]; 1526 arf_idx = gf_group->arf_update_idx[gf_group->index];
1591 } 1527 }
1592 1528
1593 ref_cnt_fb(cm->frame_bufs, 1529 ref_cnt_fb(cm->frame_bufs,
1594 &cm->ref_frame_map[arf_idx], cm->new_fb_idx); 1530 &cm->ref_frame_map[arf_idx], cm->new_fb_idx);
1595 } 1531 }
1596 1532
1597 if (cpi->refresh_golden_frame) { 1533 if (cpi->refresh_golden_frame) {
1598 ref_cnt_fb(cm->frame_bufs, 1534 ref_cnt_fb(cm->frame_bufs,
1599 &cm->ref_frame_map[cpi->gld_fb_idx], cm->new_fb_idx); 1535 &cm->ref_frame_map[cpi->gld_fb_idx], cm->new_fb_idx);
1600 } 1536 }
1601 } 1537 }
1602 1538
1603 if (cpi->refresh_last_frame) { 1539 if (cpi->refresh_last_frame) {
1604 ref_cnt_fb(cm->frame_bufs, 1540 ref_cnt_fb(cm->frame_bufs,
1605 &cm->ref_frame_map[cpi->lst_fb_idx], cm->new_fb_idx); 1541 &cm->ref_frame_map[cpi->lst_fb_idx], cm->new_fb_idx);
1606 } 1542 }
1607 #if CONFIG_DENOISING 1543 #if CONFIG_VP9_TEMPORAL_DENOISING
1608 if (cpi->oxcf.noise_sensitivity > 0) { 1544 if (cpi->oxcf.noise_sensitivity > 0) {
1609 vp9_denoiser_update_frame_info(&cpi->denoiser, 1545 vp9_denoiser_update_frame_info(&cpi->denoiser,
1610 *cpi->Source, 1546 *cpi->Source,
1611 cpi->common.frame_type, 1547 cpi->common.frame_type,
1612 cpi->refresh_alt_ref_frame, 1548 cpi->refresh_alt_ref_frame,
1613 cpi->refresh_golden_frame, 1549 cpi->refresh_golden_frame,
1614 cpi->refresh_last_frame); 1550 cpi->refresh_last_frame);
1615 } 1551 }
1616 #endif 1552 #endif
1617 } 1553 }
(...skipping 99 matching lines...) Expand 10 before | Expand all | Expand 10 after
1717 cpi->common.current_video_frame, cpi->rc.this_frame_target, 1653 cpi->common.current_video_frame, cpi->rc.this_frame_target,
1718 cpi->rc.projected_frame_size, 1654 cpi->rc.projected_frame_size,
1719 cpi->rc.projected_frame_size / cpi->common.MBs, 1655 cpi->rc.projected_frame_size / cpi->common.MBs,
1720 (cpi->rc.projected_frame_size - cpi->rc.this_frame_target), 1656 (cpi->rc.projected_frame_size - cpi->rc.this_frame_target),
1721 cpi->rc.vbr_bits_off_target, 1657 cpi->rc.vbr_bits_off_target,
1722 cpi->rc.total_target_vs_actual, 1658 cpi->rc.total_target_vs_actual,
1723 (cpi->rc.starting_buffer_level - cpi->rc.bits_off_target), 1659 (cpi->rc.starting_buffer_level - cpi->rc.bits_off_target),
1724 cpi->rc.total_actual_bits, cm->base_qindex, 1660 cpi->rc.total_actual_bits, cm->base_qindex,
1725 vp9_convert_qindex_to_q(cm->base_qindex), 1661 vp9_convert_qindex_to_q(cm->base_qindex),
1726 (double)vp9_dc_quant(cm->base_qindex, 0) / 4.0, 1662 (double)vp9_dc_quant(cm->base_qindex, 0) / 4.0,
1663 vp9_convert_qindex_to_q(cpi->twopass.active_worst_quality),
1727 cpi->rc.avg_q, 1664 cpi->rc.avg_q,
1728 vp9_convert_qindex_to_q(cpi->rc.ni_av_qi),
1729 vp9_convert_qindex_to_q(cpi->oxcf.cq_level), 1665 vp9_convert_qindex_to_q(cpi->oxcf.cq_level),
1730 cpi->refresh_last_frame, cpi->refresh_golden_frame, 1666 cpi->refresh_last_frame, cpi->refresh_golden_frame,
1731 cpi->refresh_alt_ref_frame, cm->frame_type, cpi->rc.gfu_boost, 1667 cpi->refresh_alt_ref_frame, cm->frame_type, cpi->rc.gfu_boost,
1732 cpi->twopass.bits_left, 1668 cpi->twopass.bits_left,
1733 cpi->twopass.total_left_stats.coded_error, 1669 cpi->twopass.total_left_stats.coded_error,
1734 cpi->twopass.bits_left / 1670 cpi->twopass.bits_left /
1735 (1 + cpi->twopass.total_left_stats.coded_error), 1671 (1 + cpi->twopass.total_left_stats.coded_error),
1736 cpi->tot_recode_hits, recon_err, cpi->rc.kf_boost, 1672 cpi->tot_recode_hits, recon_err, cpi->rc.kf_boost,
1737 cpi->twopass.kf_zeromotion_pct); 1673 cpi->twopass.kf_zeromotion_pct);
1738 1674
(...skipping 255 matching lines...) Expand 10 before | Expand all | Expand 10 after
1994 if (cpi->refresh_alt_ref_frame & cpi->refresh_golden_frame) 1930 if (cpi->refresh_alt_ref_frame & cpi->refresh_golden_frame)
1995 cpi->gold_is_alt = 1; 1931 cpi->gold_is_alt = 1;
1996 else if (cpi->refresh_alt_ref_frame ^ cpi->refresh_golden_frame) 1932 else if (cpi->refresh_alt_ref_frame ^ cpi->refresh_golden_frame)
1997 cpi->gold_is_alt = 0; 1933 cpi->gold_is_alt = 0;
1998 1934
1999 cpi->ref_frame_flags = VP9_ALT_FLAG | VP9_GOLD_FLAG | VP9_LAST_FLAG; 1935 cpi->ref_frame_flags = VP9_ALT_FLAG | VP9_GOLD_FLAG | VP9_LAST_FLAG;
2000 1936
2001 if (cpi->gold_is_last) 1937 if (cpi->gold_is_last)
2002 cpi->ref_frame_flags &= ~VP9_GOLD_FLAG; 1938 cpi->ref_frame_flags &= ~VP9_GOLD_FLAG;
2003 1939
2004 if (cpi->rc.frames_till_gf_update_due == INT_MAX) 1940 if (cpi->rc.frames_till_gf_update_due == INT_MAX &&
1941 !is_spatial_svc(cpi))
2005 cpi->ref_frame_flags &= ~VP9_GOLD_FLAG; 1942 cpi->ref_frame_flags &= ~VP9_GOLD_FLAG;
2006 1943
2007 if (cpi->alt_is_last) 1944 if (cpi->alt_is_last)
2008 cpi->ref_frame_flags &= ~VP9_ALT_FLAG; 1945 cpi->ref_frame_flags &= ~VP9_ALT_FLAG;
2009 1946
2010 if (cpi->gold_is_alt) 1947 if (cpi->gold_is_alt)
2011 cpi->ref_frame_flags &= ~VP9_ALT_FLAG; 1948 cpi->ref_frame_flags &= ~VP9_ALT_FLAG;
2012 } 1949 }
2013 1950
2014 static void set_ext_overrides(VP9_COMP *cpi) { 1951 static void set_ext_overrides(VP9_COMP *cpi) {
(...skipping 25 matching lines...) Expand all
2040 } 1977 }
2041 } 1978 }
2042 1979
2043 static void configure_skippable_frame(VP9_COMP *cpi) { 1980 static void configure_skippable_frame(VP9_COMP *cpi) {
2044 // If the current frame does not have non-zero motion vector detected in the 1981 // If the current frame does not have non-zero motion vector detected in the
2045 // first pass, and so do its previous and forward frames, then this frame 1982 // first pass, and so do its previous and forward frames, then this frame
2046 // can be skipped for partition check, and the partition size is assigned 1983 // can be skipped for partition check, and the partition size is assigned
2047 // according to the variance 1984 // according to the variance
2048 1985
2049 SVC *const svc = &cpi->svc; 1986 SVC *const svc = &cpi->svc;
2050 const int is_spatial_svc = (svc->number_spatial_layers > 1) && 1987 TWO_PASS *const twopass = is_spatial_svc(cpi) ?
2051 (svc->number_temporal_layers == 1);
2052 TWO_PASS *const twopass = is_spatial_svc ?
2053 &svc->layer_context[svc->spatial_layer_id].twopass 1988 &svc->layer_context[svc->spatial_layer_id].twopass
2054 : &cpi->twopass; 1989 : &cpi->twopass;
2055 1990
2056 cpi->skippable_frame = (!frame_is_intra_only(&cpi->common) && 1991 cpi->skippable_frame = (!frame_is_intra_only(&cpi->common) &&
2057 twopass->stats_in - 2 > twopass->stats_in_start && 1992 twopass->stats_in - 2 > twopass->stats_in_start &&
2058 twopass->stats_in < twopass->stats_in_end && 1993 twopass->stats_in < twopass->stats_in_end &&
2059 (twopass->stats_in - 1)->pcnt_inter - (twopass->stats_in - 1)->pcnt_motion 1994 (twopass->stats_in - 1)->pcnt_inter - (twopass->stats_in - 1)->pcnt_motion
2060 == 1 && 1995 == 1 &&
2061 (twopass->stats_in - 2)->pcnt_inter - (twopass->stats_in - 2)->pcnt_motion 1996 (twopass->stats_in - 2)->pcnt_inter - (twopass->stats_in - 2)->pcnt_motion
2062 == 1 && 1997 == 1 &&
2063 twopass->stats_in->pcnt_inter - twopass->stats_in->pcnt_motion == 1); 1998 twopass->stats_in->pcnt_inter - twopass->stats_in->pcnt_motion == 1);
2064 } 1999 }
2065 2000
2066 static void set_arf_sign_bias(VP9_COMP *cpi) { 2001 static void set_arf_sign_bias(VP9_COMP *cpi) {
2067 VP9_COMMON *const cm = &cpi->common; 2002 VP9_COMMON *const cm = &cpi->common;
2068 int arf_sign_bias; 2003 int arf_sign_bias;
2069 2004
2070 if ((cpi->pass == 2) && cpi->multi_arf_allowed) { 2005 if ((cpi->oxcf.pass == 2) && cpi->multi_arf_allowed) {
2071 const GF_GROUP *const gf_group = &cpi->twopass.gf_group; 2006 const GF_GROUP *const gf_group = &cpi->twopass.gf_group;
2072 arf_sign_bias = cpi->rc.source_alt_ref_active && 2007 arf_sign_bias = cpi->rc.source_alt_ref_active &&
2073 (!cpi->refresh_alt_ref_frame || 2008 (!cpi->refresh_alt_ref_frame ||
2074 (gf_group->rf_level[gf_group->index] == GF_ARF_LOW)); 2009 (gf_group->rf_level[gf_group->index] == GF_ARF_LOW));
2075 } else { 2010 } else {
2076 arf_sign_bias = 2011 arf_sign_bias =
2077 (cpi->rc.source_alt_ref_active && !cpi->refresh_alt_ref_frame); 2012 (cpi->rc.source_alt_ref_active && !cpi->refresh_alt_ref_frame);
2078 } 2013 }
2079 cm->ref_frame_sign_bias[ALTREF_FRAME] = arf_sign_bias; 2014 cm->ref_frame_sign_bias[ALTREF_FRAME] = arf_sign_bias;
2080 } 2015 }
(...skipping 67 matching lines...) Expand 10 before | Expand all | Expand 10 after
2148 } 2083 }
2149 2084
2150 // The alternate reference frame cannot be active for a key frame. 2085 // The alternate reference frame cannot be active for a key frame.
2151 cpi->rc.source_alt_ref_active = 0; 2086 cpi->rc.source_alt_ref_active = 0;
2152 2087
2153 cm->error_resilient_mode = (cpi->oxcf.error_resilient_mode != 0); 2088 cm->error_resilient_mode = (cpi->oxcf.error_resilient_mode != 0);
2154 cm->frame_parallel_decoding_mode = 2089 cm->frame_parallel_decoding_mode =
2155 (cpi->oxcf.frame_parallel_decoding_mode != 0); 2090 (cpi->oxcf.frame_parallel_decoding_mode != 0);
2156 2091
2157 // By default, encoder assumes decoder can use prev_mi. 2092 // By default, encoder assumes decoder can use prev_mi.
2158 cm->coding_use_prev_mi = 1;
2159 if (cm->error_resilient_mode) { 2093 if (cm->error_resilient_mode) {
2160 cm->coding_use_prev_mi = 0;
2161 cm->frame_parallel_decoding_mode = 1; 2094 cm->frame_parallel_decoding_mode = 1;
2162 cm->reset_frame_context = 0; 2095 cm->reset_frame_context = 0;
2163 cm->refresh_frame_context = 0; 2096 cm->refresh_frame_context = 0;
2164 } else if (cm->intra_only) { 2097 } else if (cm->intra_only) {
2165 // Only reset the current context. 2098 // Only reset the current context.
2166 cm->reset_frame_context = 2; 2099 cm->reset_frame_context = 2;
2167 } 2100 }
2168 } 2101 }
2169 2102
2170 // Configure experimental use of segmentation for enhanced coding of 2103 // Configure experimental use of segmentation for enhanced coding of
2171 // static regions if indicated. 2104 // static regions if indicated.
2172 // Only allowed in second pass of two pass (as requires lagged coding) 2105 // Only allowed in second pass of two pass (as requires lagged coding)
2173 // and if the relevant speed feature flag is set. 2106 // and if the relevant speed feature flag is set.
2174 if (cpi->pass == 2 && cpi->sf.static_segmentation) 2107 if (cpi->oxcf.pass == 2 && cpi->sf.static_segmentation)
2175 configure_static_seg_features(cpi); 2108 configure_static_seg_features(cpi);
2176 2109
2177 // Check if the current frame is skippable for the partition search in the 2110 // Check if the current frame is skippable for the partition search in the
2178 // second pass according to the first pass stats 2111 // second pass according to the first pass stats
2179 if (cpi->pass == 2 && 2112 if (cpi->oxcf.pass == 2 &&
2180 (!cpi->use_svc || cpi->svc.number_temporal_layers == 1)) { 2113 (!cpi->use_svc || is_spatial_svc(cpi))) {
2181 configure_skippable_frame(cpi); 2114 configure_skippable_frame(cpi);
2182 } 2115 }
2183 2116
2184 // For 1 pass CBR, check if we are dropping this frame. 2117 // For 1 pass CBR, check if we are dropping this frame.
2185 // Never drop on key frame. 2118 // Never drop on key frame.
2186 if (cpi->pass == 0 && 2119 if (cpi->oxcf.pass == 0 &&
2187 cpi->oxcf.rc_mode == VPX_CBR && 2120 cpi->oxcf.rc_mode == VPX_CBR &&
2188 cm->frame_type != KEY_FRAME) { 2121 cm->frame_type != KEY_FRAME) {
2189 if (vp9_rc_drop_frame(cpi)) { 2122 if (vp9_rc_drop_frame(cpi)) {
2190 vp9_rc_postencode_update_drop_frame(cpi); 2123 vp9_rc_postencode_update_drop_frame(cpi);
2191 ++cm->current_video_frame; 2124 ++cm->current_video_frame;
2192 return; 2125 return;
2193 } 2126 }
2194 } 2127 }
2195 2128
2196 vp9_clear_system_state(); 2129 vp9_clear_system_state();
(...skipping 16 matching lines...) Expand all
2213 l = 100; 2146 l = 100;
2214 break; 2147 break;
2215 case 6: 2148 case 6:
2216 l = 150; 2149 l = 150;
2217 break; 2150 break;
2218 } 2151 }
2219 vp9_denoise(cpi->Source, cpi->Source, l); 2152 vp9_denoise(cpi->Source, cpi->Source, l);
2220 } 2153 }
2221 #endif 2154 #endif
2222 2155
2223 #ifdef OUTPUT_YUV_SRC
2224 vp9_write_yuv_frame(cpi->Source, yuv_file);
2225 #endif
2226
2227 set_speed_features(cpi); 2156 set_speed_features(cpi);
2228 2157
2229 // Decide q and q bounds. 2158 // Decide q and q bounds.
2230 q = vp9_rc_pick_q_and_bounds(cpi, &bottom_index, &top_index); 2159 q = vp9_rc_pick_q_and_bounds(cpi, &bottom_index, &top_index);
2231 2160
2232 if (!frame_is_intra_only(cm)) { 2161 if (!frame_is_intra_only(cm)) {
2233 cm->interp_filter = cpi->sf.default_interp_filter; 2162 cm->interp_filter = cpi->sf.default_interp_filter;
2234 /* TODO: Decide this more intelligently */ 2163 /* TODO: Decide this more intelligently */
2235 vp9_set_high_precision_mv(cpi, q < HIGH_PRECISION_MV_QTHRESH); 2164 vp9_set_high_precision_mv(cpi, q < HIGH_PRECISION_MV_QTHRESH);
2236 } 2165 }
2237 2166
2238 if (cpi->sf.recode_loop == DISALLOW_RECODE) { 2167 if (cpi->sf.recode_loop == DISALLOW_RECODE) {
2239 encode_without_recode_loop(cpi, q); 2168 encode_without_recode_loop(cpi, q);
2240 } else { 2169 } else {
2241 encode_with_recode_loop(cpi, size, dest, q, bottom_index, top_index); 2170 encode_with_recode_loop(cpi, size, dest, q, bottom_index, top_index);
2242 } 2171 }
2243 2172
2244 #if CONFIG_DENOISING 2173 #if CONFIG_VP9_TEMPORAL_DENOISING
2245 #ifdef OUTPUT_YUV_DENOISED 2174 #ifdef OUTPUT_YUV_DENOISED
2246 if (cpi->oxcf.noise_sensitivity > 0) { 2175 if (cpi->oxcf.noise_sensitivity > 0) {
2247 vp9_write_yuv_frame_420(&cpi->denoiser.running_avg_y[INTRA_FRAME], 2176 vp9_write_yuv_frame_420(&cpi->denoiser.running_avg_y[INTRA_FRAME],
2248 yuv_denoised_file); 2177 yuv_denoised_file);
2249 } 2178 }
2250 #endif 2179 #endif
2251 #endif 2180 #endif
2252 2181
2253 2182
2254 // Special case code to reduce pulsing when key frames are forced at a 2183 // Special case code to reduce pulsing when key frames are forced at a
(...skipping 167 matching lines...) Expand 10 before | Expand all | Expand 10 after
2422 struct vpx_usec_timer timer; 2351 struct vpx_usec_timer timer;
2423 int res = 0; 2352 int res = 0;
2424 const int subsampling_x = sd->uv_width < sd->y_width; 2353 const int subsampling_x = sd->uv_width < sd->y_width;
2425 const int subsampling_y = sd->uv_height < sd->y_height; 2354 const int subsampling_y = sd->uv_height < sd->y_height;
2426 2355
2427 check_initial_width(cpi, subsampling_x, subsampling_y); 2356 check_initial_width(cpi, subsampling_x, subsampling_y);
2428 2357
2429 vpx_usec_timer_start(&timer); 2358 vpx_usec_timer_start(&timer);
2430 2359
2431 #if CONFIG_SPATIAL_SVC 2360 #if CONFIG_SPATIAL_SVC
2432 if (cpi->use_svc && cpi->svc.number_temporal_layers == 1) 2361 if (is_spatial_svc(cpi))
2433 res = vp9_svc_lookahead_push(cpi, cpi->lookahead, sd, time_stamp, end_time, 2362 res = vp9_svc_lookahead_push(cpi, cpi->lookahead, sd, time_stamp, end_time,
2434 frame_flags); 2363 frame_flags);
2435 else 2364 else
2436 #endif 2365 #endif
2437 res = vp9_lookahead_push(cpi->lookahead, 2366 res = vp9_lookahead_push(cpi->lookahead,
2438 sd, time_stamp, end_time, frame_flags); 2367 sd, time_stamp, end_time, frame_flags);
2439 if (res) 2368 if (res)
2440 res = -1; 2369 res = -1;
2441 vpx_usec_timer_mark(&timer); 2370 vpx_usec_timer_mark(&timer);
2442 cpi->time_receive_data += vpx_usec_timer_elapsed(&timer); 2371 cpi->time_receive_data += vpx_usec_timer_elapsed(&timer);
2443 2372
2444 if (cm->profile == PROFILE_0 && (subsampling_x != 1 || subsampling_y != 1)) { 2373 if ((cm->profile == PROFILE_0 || cm->profile == PROFILE_2) &&
2374 (subsampling_x != 1 || subsampling_y != 1)) {
2445 vpx_internal_error(&cm->error, VPX_CODEC_INVALID_PARAM, 2375 vpx_internal_error(&cm->error, VPX_CODEC_INVALID_PARAM,
2446 "Non-4:2:0 color space requires profile >= 1"); 2376 "Non-4:2:0 color space requires profile 1 or 3");
2377 res = -1;
2378 }
2379 if ((cm->profile == PROFILE_1 || cm->profile == PROFILE_3) &&
2380 (subsampling_x == 1 && subsampling_y == 1)) {
2381 vpx_internal_error(&cm->error, VPX_CODEC_INVALID_PARAM,
2382 "4:2:0 color space requires profile 0 or 2");
2447 res = -1; 2383 res = -1;
2448 } 2384 }
2449 2385
2450 return res; 2386 return res;
2451 } 2387 }
2452 2388
2453 2389
2454 static int frame_is_reference(const VP9_COMP *cpi) { 2390 static int frame_is_reference(const VP9_COMP *cpi) {
2455 const VP9_COMMON *cm = &cpi->common; 2391 const VP9_COMMON *cm = &cpi->common;
2456 2392
2457 return cm->frame_type == KEY_FRAME || 2393 return cm->frame_type == KEY_FRAME ||
2458 cpi->refresh_last_frame || 2394 cpi->refresh_last_frame ||
2459 cpi->refresh_golden_frame || 2395 cpi->refresh_golden_frame ||
2460 cpi->refresh_alt_ref_frame || 2396 cpi->refresh_alt_ref_frame ||
2461 cm->refresh_frame_context || 2397 cm->refresh_frame_context ||
2462 cm->lf.mode_ref_delta_update || 2398 cm->lf.mode_ref_delta_update ||
2463 cm->seg.update_map || 2399 cm->seg.update_map ||
2464 cm->seg.update_data; 2400 cm->seg.update_data;
2465 } 2401 }
2466 2402
2467 void adjust_frame_rate(VP9_COMP *cpi) { 2403 void adjust_frame_rate(VP9_COMP *cpi) {
2404 const struct lookahead_entry *const source = cpi->source;
2468 int64_t this_duration; 2405 int64_t this_duration;
2469 int step = 0; 2406 int step = 0;
2470 2407
2471 if (cpi->source->ts_start == cpi->first_time_stamp_ever) { 2408 if (source->ts_start == cpi->first_time_stamp_ever) {
2472 this_duration = cpi->source->ts_end - cpi->source->ts_start; 2409 this_duration = source->ts_end - source->ts_start;
2473 step = 1; 2410 step = 1;
2474 } else { 2411 } else {
2475 int64_t last_duration = cpi->last_end_time_stamp_seen 2412 int64_t last_duration = cpi->last_end_time_stamp_seen
2476 - cpi->last_time_stamp_seen; 2413 - cpi->last_time_stamp_seen;
2477 2414
2478 this_duration = cpi->source->ts_end - cpi->last_end_time_stamp_seen; 2415 this_duration = source->ts_end - cpi->last_end_time_stamp_seen;
2479 2416
2480 // do a step update if the duration changes by 10% 2417 // do a step update if the duration changes by 10%
2481 if (last_duration) 2418 if (last_duration)
2482 step = (int)((this_duration - last_duration) * 10 / last_duration); 2419 step = (int)((this_duration - last_duration) * 10 / last_duration);
2483 } 2420 }
2484 2421
2485 if (this_duration) { 2422 if (this_duration) {
2486 if (step) { 2423 if (step) {
2487 vp9_new_framerate(cpi, 10000000.0 / this_duration); 2424 vp9_new_framerate(cpi, 10000000.0 / this_duration);
2488 } else { 2425 } else {
2489 // Average this frame's rate into the last second's average 2426 // Average this frame's rate into the last second's average
2490 // frame rate. If we haven't seen 1 second yet, then average 2427 // frame rate. If we haven't seen 1 second yet, then average
2491 // over the whole interval seen. 2428 // over the whole interval seen.
2492 const double interval = MIN((double)(cpi->source->ts_end 2429 const double interval = MIN((double)(source->ts_end
2493 - cpi->first_time_stamp_ever), 10000000.0); 2430 - cpi->first_time_stamp_ever), 10000000.0);
2494 double avg_duration = 10000000.0 / cpi->oxcf.framerate; 2431 double avg_duration = 10000000.0 / cpi->framerate;
2495 avg_duration *= (interval - avg_duration + this_duration); 2432 avg_duration *= (interval - avg_duration + this_duration);
2496 avg_duration /= interval; 2433 avg_duration /= interval;
2497 2434
2498 vp9_new_framerate(cpi, 10000000.0 / avg_duration); 2435 vp9_new_framerate(cpi, 10000000.0 / avg_duration);
2499 } 2436 }
2500 } 2437 }
2501 cpi->last_time_stamp_seen = cpi->source->ts_start; 2438 cpi->last_time_stamp_seen = source->ts_start;
2502 cpi->last_end_time_stamp_seen = cpi->source->ts_end; 2439 cpi->last_end_time_stamp_seen = source->ts_end;
2503 } 2440 }
2504 2441
2505 // Returns 0 if this is not an alt ref else the offset of the source frame 2442 // Returns 0 if this is not an alt ref else the offset of the source frame
2506 // used as the arf midpoint. 2443 // used as the arf midpoint.
2507 static int get_arf_src_index(VP9_COMP *cpi) { 2444 static int get_arf_src_index(VP9_COMP *cpi) {
2508 RATE_CONTROL *const rc = &cpi->rc; 2445 RATE_CONTROL *const rc = &cpi->rc;
2509 int arf_src_index = 0; 2446 int arf_src_index = 0;
2510 if (is_altref_enabled(cpi)) { 2447 if (is_altref_enabled(cpi)) {
2511 if (cpi->pass == 2) { 2448 if (cpi->oxcf.pass == 2) {
2512 const GF_GROUP *const gf_group = &cpi->twopass.gf_group; 2449 const GF_GROUP *const gf_group = &cpi->twopass.gf_group;
2513 if (gf_group->update_type[gf_group->index] == ARF_UPDATE) { 2450 if (gf_group->update_type[gf_group->index] == ARF_UPDATE) {
2514 arf_src_index = gf_group->arf_src_offset[gf_group->index]; 2451 arf_src_index = gf_group->arf_src_offset[gf_group->index];
2515 } 2452 }
2516 } else if (rc->source_alt_ref_pending) { 2453 } else if (rc->source_alt_ref_pending) {
2517 arf_src_index = rc->frames_till_gf_update_due; 2454 arf_src_index = rc->frames_till_gf_update_due;
2518 } 2455 }
2519 } 2456 }
2520 return arf_src_index; 2457 return arf_src_index;
2521 } 2458 }
2522 2459
2523 static void check_src_altref(VP9_COMP *cpi) { 2460 static void check_src_altref(VP9_COMP *cpi) {
2524 RATE_CONTROL *const rc = &cpi->rc; 2461 RATE_CONTROL *const rc = &cpi->rc;
2525 2462
2526 if (cpi->pass == 2) { 2463 if (cpi->oxcf.pass == 2) {
2527 const GF_GROUP *const gf_group = &cpi->twopass.gf_group; 2464 const GF_GROUP *const gf_group = &cpi->twopass.gf_group;
2528 rc->is_src_frame_alt_ref = 2465 rc->is_src_frame_alt_ref =
2529 (gf_group->update_type[gf_group->index] == OVERLAY_UPDATE); 2466 (gf_group->update_type[gf_group->index] == OVERLAY_UPDATE);
2530 } else { 2467 } else {
2531 rc->is_src_frame_alt_ref = cpi->alt_ref_source && 2468 rc->is_src_frame_alt_ref = cpi->alt_ref_source &&
2532 (cpi->source == cpi->alt_ref_source); 2469 (cpi->source == cpi->alt_ref_source);
2533 } 2470 }
2534 2471
2535 if (rc->is_src_frame_alt_ref) { 2472 if (rc->is_src_frame_alt_ref) {
2536 // Current frame is an ARF overlay frame. 2473 // Current frame is an ARF overlay frame.
2537 cpi->alt_ref_source = NULL; 2474 cpi->alt_ref_source = NULL;
2538 2475
2539 // Don't refresh the last buffer for an ARF overlay frame. It will 2476 // Don't refresh the last buffer for an ARF overlay frame. It will
2540 // become the GF so preserve last as an alternative prediction option. 2477 // become the GF so preserve last as an alternative prediction option.
2541 cpi->refresh_last_frame = 0; 2478 cpi->refresh_last_frame = 0;
2542 } 2479 }
2543 } 2480 }
2544 2481
2545 int vp9_get_compressed_data(VP9_COMP *cpi, unsigned int *frame_flags, 2482 int vp9_get_compressed_data(VP9_COMP *cpi, unsigned int *frame_flags,
2546 size_t *size, uint8_t *dest, 2483 size_t *size, uint8_t *dest,
2547 int64_t *time_stamp, int64_t *time_end, int flush) { 2484 int64_t *time_stamp, int64_t *time_end, int flush) {
2485 const VP9EncoderConfig *const oxcf = &cpi->oxcf;
2548 VP9_COMMON *const cm = &cpi->common; 2486 VP9_COMMON *const cm = &cpi->common;
2549 MACROBLOCKD *const xd = &cpi->mb.e_mbd; 2487 MACROBLOCKD *const xd = &cpi->mb.e_mbd;
2550 RATE_CONTROL *const rc = &cpi->rc; 2488 RATE_CONTROL *const rc = &cpi->rc;
2551 struct vpx_usec_timer cmptimer; 2489 struct vpx_usec_timer cmptimer;
2552 YV12_BUFFER_CONFIG *force_src_buffer = NULL; 2490 YV12_BUFFER_CONFIG *force_src_buffer = NULL;
2553 MV_REFERENCE_FRAME ref_frame; 2491 MV_REFERENCE_FRAME ref_frame;
2554 int arf_src_index; 2492 int arf_src_index;
2555 const int is_spatial_svc = cpi->use_svc &&
2556 (cpi->svc.number_temporal_layers == 1) &&
2557 (cpi->svc.number_spatial_layers > 1);
2558 2493
2559 if (!cpi) 2494 if (is_spatial_svc(cpi) && oxcf->pass == 2) {
2560 return -1;
2561
2562 if (is_spatial_svc && cpi->pass == 2) {
2563 #if CONFIG_SPATIAL_SVC 2495 #if CONFIG_SPATIAL_SVC
2564 vp9_svc_lookahead_peek(cpi, cpi->lookahead, 0, 1); 2496 vp9_svc_lookahead_peek(cpi, cpi->lookahead, 0, 1);
2565 #endif 2497 #endif
2566 vp9_restore_layer_context(cpi); 2498 vp9_restore_layer_context(cpi);
2567 } 2499 }
2568 2500
2569 vpx_usec_timer_start(&cmptimer); 2501 vpx_usec_timer_start(&cmptimer);
2570 2502
2571 cpi->source = NULL; 2503 cpi->source = NULL;
2572 cpi->last_source = NULL; 2504 cpi->last_source = NULL;
2573 2505
2574 vp9_set_high_precision_mv(cpi, ALTREF_HIGH_PRECISION_MV); 2506 vp9_set_high_precision_mv(cpi, ALTREF_HIGH_PRECISION_MV);
2575 2507
2576 // Normal defaults 2508 // Normal defaults
2577 cm->reset_frame_context = 0; 2509 cm->reset_frame_context = 0;
2578 cm->refresh_frame_context = 1; 2510 cm->refresh_frame_context = 1;
2579 cpi->refresh_last_frame = 1; 2511 cpi->refresh_last_frame = 1;
2580 cpi->refresh_golden_frame = 0; 2512 cpi->refresh_golden_frame = 0;
2581 cpi->refresh_alt_ref_frame = 0; 2513 cpi->refresh_alt_ref_frame = 0;
2582 2514
2583 // Should we encode an arf frame. 2515 // Should we encode an arf frame.
2584 arf_src_index = get_arf_src_index(cpi); 2516 arf_src_index = get_arf_src_index(cpi);
2585 if (arf_src_index) { 2517 if (arf_src_index) {
2586 assert(arf_src_index <= rc->frames_to_key); 2518 assert(arf_src_index <= rc->frames_to_key);
2587 2519
2588 #if CONFIG_SPATIAL_SVC 2520 #if CONFIG_SPATIAL_SVC
2589 if (is_spatial_svc) 2521 if (is_spatial_svc(cpi))
2590 cpi->source = vp9_svc_lookahead_peek(cpi, cpi->lookahead, 2522 cpi->source = vp9_svc_lookahead_peek(cpi, cpi->lookahead,
2591 arf_src_index, 0); 2523 arf_src_index, 0);
2592 else 2524 else
2593 #endif 2525 #endif
2594 cpi->source = vp9_lookahead_peek(cpi->lookahead, arf_src_index); 2526 cpi->source = vp9_lookahead_peek(cpi->lookahead, arf_src_index);
2595 if (cpi->source != NULL) { 2527 if (cpi->source != NULL) {
2596 cpi->alt_ref_source = cpi->source; 2528 cpi->alt_ref_source = cpi->source;
2597 2529
2598 #if CONFIG_SPATIAL_SVC 2530 #if CONFIG_SPATIAL_SVC
2599 if (is_spatial_svc && cpi->svc.spatial_layer_id > 0) { 2531 if (is_spatial_svc(cpi) && cpi->svc.spatial_layer_id > 0) {
2600 int i; 2532 int i;
2601 // Reference a hidden frame from a lower layer 2533 // Reference a hidden frame from a lower layer
2602 for (i = cpi->svc.spatial_layer_id - 1; i >= 0; --i) { 2534 for (i = cpi->svc.spatial_layer_id - 1; i >= 0; --i) {
2603 if (cpi->oxcf.ss_play_alternate[i]) { 2535 if (oxcf->ss_play_alternate[i]) {
2604 cpi->gld_fb_idx = cpi->svc.layer_context[i].alt_ref_idx; 2536 cpi->gld_fb_idx = cpi->svc.layer_context[i].alt_ref_idx;
2605 break; 2537 break;
2606 } 2538 }
2607 } 2539 }
2608 } 2540 }
2609 cpi->svc.layer_context[cpi->svc.spatial_layer_id].has_alt_frame = 1; 2541 cpi->svc.layer_context[cpi->svc.spatial_layer_id].has_alt_frame = 1;
2610 #endif 2542 #endif
2611 2543
2612 if (cpi->oxcf.arnr_max_frames > 0) { 2544 if (oxcf->arnr_max_frames > 0) {
2613 // Produce the filtered ARF frame. 2545 // Produce the filtered ARF frame.
2614 vp9_temporal_filter(cpi, arf_src_index); 2546 vp9_temporal_filter(cpi, arf_src_index);
2615 vp9_extend_frame_borders(&cpi->alt_ref_buffer); 2547 vp9_extend_frame_borders(&cpi->alt_ref_buffer);
2616 force_src_buffer = &cpi->alt_ref_buffer; 2548 force_src_buffer = &cpi->alt_ref_buffer;
2617 } 2549 }
2618 2550
2619 cm->show_frame = 0; 2551 cm->show_frame = 0;
2620 cpi->refresh_alt_ref_frame = 1; 2552 cpi->refresh_alt_ref_frame = 1;
2621 cpi->refresh_golden_frame = 0; 2553 cpi->refresh_golden_frame = 0;
2622 cpi->refresh_last_frame = 0; 2554 cpi->refresh_last_frame = 0;
2623 rc->is_src_frame_alt_ref = 0; 2555 rc->is_src_frame_alt_ref = 0;
2624 rc->source_alt_ref_pending = 0; 2556 rc->source_alt_ref_pending = 0;
2625 } else { 2557 } else {
2626 rc->source_alt_ref_pending = 0; 2558 rc->source_alt_ref_pending = 0;
2627 } 2559 }
2628 } 2560 }
2629 2561
2630 if (!cpi->source) { 2562 if (!cpi->source) {
2631 // Get last frame source. 2563 // Get last frame source.
2632 if (cm->current_video_frame > 0) { 2564 if (cm->current_video_frame > 0) {
2633 #if CONFIG_SPATIAL_SVC 2565 #if CONFIG_SPATIAL_SVC
2634 if (is_spatial_svc) 2566 if (is_spatial_svc(cpi))
2635 cpi->last_source = vp9_svc_lookahead_peek(cpi, cpi->lookahead, -1, 0); 2567 cpi->last_source = vp9_svc_lookahead_peek(cpi, cpi->lookahead, -1, 0);
2636 else 2568 else
2637 #endif 2569 #endif
2638 cpi->last_source = vp9_lookahead_peek(cpi->lookahead, -1); 2570 cpi->last_source = vp9_lookahead_peek(cpi->lookahead, -1);
2639 if (cpi->last_source == NULL) 2571 if (cpi->last_source == NULL)
2640 return -1; 2572 return -1;
2641 } 2573 }
2642 2574
2643 // Read in the source frame. 2575 // Read in the source frame.
2644 #if CONFIG_SPATIAL_SVC 2576 #if CONFIG_SPATIAL_SVC
2645 if (is_spatial_svc) 2577 if (is_spatial_svc(cpi))
2646 cpi->source = vp9_svc_lookahead_pop(cpi, cpi->lookahead, flush); 2578 cpi->source = vp9_svc_lookahead_pop(cpi, cpi->lookahead, flush);
2647 else 2579 else
2648 #endif 2580 #endif
2649 cpi->source = vp9_lookahead_pop(cpi->lookahead, flush); 2581 cpi->source = vp9_lookahead_pop(cpi->lookahead, flush);
2650 if (cpi->source != NULL) { 2582 if (cpi->source != NULL) {
2651 cm->show_frame = 1; 2583 cm->show_frame = 1;
2652 cm->intra_only = 0; 2584 cm->intra_only = 0;
2653 2585
2654 // Check to see if the frame should be encoded as an arf overlay. 2586 // Check to see if the frame should be encoded as an arf overlay.
2655 check_src_altref(cpi); 2587 check_src_altref(cpi);
2656 } 2588 }
2657 } 2589 }
2658 2590
2659 if (cpi->source) { 2591 if (cpi->source) {
2660 cpi->un_scaled_source = cpi->Source = force_src_buffer ? force_src_buffer 2592 cpi->un_scaled_source = cpi->Source = force_src_buffer ? force_src_buffer
2661 : &cpi->source->img; 2593 : &cpi->source->img;
2662 2594
2663 if (cpi->last_source != NULL) { 2595 cpi->unscaled_last_source = cpi->last_source != NULL ?
2664 cpi->unscaled_last_source = &cpi->last_source->img; 2596 &cpi->last_source->img : NULL;
2665 } else {
2666 cpi->unscaled_last_source = NULL;
2667 }
2668 2597
2669 *time_stamp = cpi->source->ts_start; 2598 *time_stamp = cpi->source->ts_start;
2670 *time_end = cpi->source->ts_end; 2599 *time_end = cpi->source->ts_end;
2671 *frame_flags = 2600 *frame_flags =
2672 (cpi->source->flags & VPX_EFLAG_FORCE_KF) ? FRAMEFLAGS_KEY : 0; 2601 (cpi->source->flags & VPX_EFLAG_FORCE_KF) ? FRAMEFLAGS_KEY : 0;
2673 2602
2674 } else { 2603 } else {
2675 *size = 0; 2604 *size = 0;
2676 if (flush && cpi->pass == 1 && !cpi->twopass.first_pass_done) { 2605 if (flush && oxcf->pass == 1 && !cpi->twopass.first_pass_done) {
2677 vp9_end_first_pass(cpi); /* get last stats packet */ 2606 vp9_end_first_pass(cpi); /* get last stats packet */
2678 cpi->twopass.first_pass_done = 1; 2607 cpi->twopass.first_pass_done = 1;
2679 } 2608 }
2680 return -1; 2609 return -1;
2681 } 2610 }
2682 2611
2683 if (cpi->source->ts_start < cpi->first_time_stamp_ever) { 2612 if (cpi->source->ts_start < cpi->first_time_stamp_ever) {
2684 cpi->first_time_stamp_ever = cpi->source->ts_start; 2613 cpi->first_time_stamp_ever = cpi->source->ts_start;
2685 cpi->last_end_time_stamp_seen = cpi->source->ts_start; 2614 cpi->last_end_time_stamp_seen = cpi->source->ts_start;
2686 } 2615 }
2687 2616
2688 // Clear down mmx registers 2617 // Clear down mmx registers
2689 vp9_clear_system_state(); 2618 vp9_clear_system_state();
2690 2619
2691 // adjust frame rates based on timestamps given 2620 // adjust frame rates based on timestamps given
2692 if (cm->show_frame) { 2621 if (cm->show_frame) {
2693 adjust_frame_rate(cpi); 2622 adjust_frame_rate(cpi);
2694 } 2623 }
2695 2624
2696 if (cpi->svc.number_temporal_layers > 1 && 2625 if (cpi->svc.number_temporal_layers > 1 &&
2697 cpi->oxcf.rc_mode == VPX_CBR) { 2626 oxcf->rc_mode == VPX_CBR) {
2698 vp9_update_temporal_layer_framerate(cpi); 2627 vp9_update_temporal_layer_framerate(cpi);
2699 vp9_restore_layer_context(cpi); 2628 vp9_restore_layer_context(cpi);
2700 } 2629 }
2701 2630
2702 // start with a 0 size frame 2631 // start with a 0 size frame
2703 *size = 0; 2632 *size = 0;
2704 2633
2705 /* find a free buffer for the new frame, releasing the reference previously 2634 /* find a free buffer for the new frame, releasing the reference previously
2706 * held. 2635 * held.
2707 */ 2636 */
2708 cm->frame_bufs[cm->new_fb_idx].ref_count--; 2637 cm->frame_bufs[cm->new_fb_idx].ref_count--;
2709 cm->new_fb_idx = get_free_fb(cm); 2638 cm->new_fb_idx = get_free_fb(cm);
2710 2639
2711 if (!cpi->use_svc && cpi->multi_arf_allowed) { 2640 if (!cpi->use_svc && cpi->multi_arf_allowed) {
2712 if (cm->frame_type == KEY_FRAME) { 2641 if (cm->frame_type == KEY_FRAME) {
2713 init_buffer_indices(cpi); 2642 init_buffer_indices(cpi);
2714 } else if (cpi->pass == 2) { 2643 } else if (oxcf->pass == 2) {
2715 const GF_GROUP *const gf_group = &cpi->twopass.gf_group; 2644 const GF_GROUP *const gf_group = &cpi->twopass.gf_group;
2716 cpi->alt_fb_idx = gf_group->arf_ref_idx[gf_group->index]; 2645 cpi->alt_fb_idx = gf_group->arf_ref_idx[gf_group->index];
2717 } 2646 }
2718 } 2647 }
2719 2648
2720 cpi->frame_flags = *frame_flags; 2649 cpi->frame_flags = *frame_flags;
2721 2650
2722 if (cpi->pass == 2 && 2651 if (oxcf->pass == 2 &&
2723 cm->current_video_frame == 0 && 2652 cm->current_video_frame == 0 &&
2724 cpi->oxcf.allow_spatial_resampling && 2653 oxcf->allow_spatial_resampling &&
2725 cpi->oxcf.rc_mode == VPX_VBR) { 2654 oxcf->rc_mode == VPX_VBR) {
2726 // Internal scaling is triggered on the first frame. 2655 // Internal scaling is triggered on the first frame.
2727 vp9_set_size_literal(cpi, cpi->oxcf.scaled_frame_width, 2656 vp9_set_size_literal(cpi, oxcf->scaled_frame_width,
2728 cpi->oxcf.scaled_frame_height); 2657 oxcf->scaled_frame_height);
2729 } 2658 }
2730 2659
2731 // Reset the frame pointers to the current frame size 2660 // Reset the frame pointers to the current frame size
2732 vp9_realloc_frame_buffer(get_frame_new_buffer(cm), 2661 vp9_realloc_frame_buffer(get_frame_new_buffer(cm),
2733 cm->width, cm->height, 2662 cm->width, cm->height,
2734 cm->subsampling_x, cm->subsampling_y, 2663 cm->subsampling_x, cm->subsampling_y,
2735 VP9_ENC_BORDER_IN_PIXELS, NULL, NULL, NULL); 2664 VP9_ENC_BORDER_IN_PIXELS, NULL, NULL, NULL);
2736 2665
2737 alloc_util_frame_buffers(cpi); 2666 alloc_util_frame_buffers(cpi);
2738 init_motion_estimation(cpi); 2667 init_motion_estimation(cpi);
2739 2668
2740 for (ref_frame = LAST_FRAME; ref_frame <= ALTREF_FRAME; ++ref_frame) { 2669 for (ref_frame = LAST_FRAME; ref_frame <= ALTREF_FRAME; ++ref_frame) {
2741 const int idx = cm->ref_frame_map[get_ref_frame_idx(cpi, ref_frame)]; 2670 const int idx = cm->ref_frame_map[get_ref_frame_idx(cpi, ref_frame)];
2742 YV12_BUFFER_CONFIG *const buf = &cm->frame_bufs[idx].buf; 2671 YV12_BUFFER_CONFIG *const buf = &cm->frame_bufs[idx].buf;
2743 RefBuffer *const ref_buf = &cm->frame_refs[ref_frame - 1]; 2672 RefBuffer *const ref_buf = &cm->frame_refs[ref_frame - 1];
2744 ref_buf->buf = buf; 2673 ref_buf->buf = buf;
2745 ref_buf->idx = idx; 2674 ref_buf->idx = idx;
2746 vp9_setup_scale_factors_for_frame(&ref_buf->sf, 2675 vp9_setup_scale_factors_for_frame(&ref_buf->sf,
2747 buf->y_crop_width, buf->y_crop_height, 2676 buf->y_crop_width, buf->y_crop_height,
2748 cm->width, cm->height); 2677 cm->width, cm->height);
2749 2678
2750 if (vp9_is_scaled(&ref_buf->sf)) 2679 if (vp9_is_scaled(&ref_buf->sf))
2751 vp9_extend_frame_borders(buf); 2680 vp9_extend_frame_borders(buf);
2752 } 2681 }
2753 2682
2754 set_ref_ptrs(cm, xd, LAST_FRAME, LAST_FRAME); 2683 set_ref_ptrs(cm, xd, LAST_FRAME, LAST_FRAME);
2755 2684
2756 if (cpi->oxcf.aq_mode == VARIANCE_AQ) { 2685 if (oxcf->aq_mode == VARIANCE_AQ) {
2757 vp9_vaq_init(); 2686 vp9_vaq_init();
2758 } 2687 }
2759 2688
2760 if (cpi->pass == 1 && 2689 if (oxcf->pass == 1 &&
2761 (!cpi->use_svc || cpi->svc.number_temporal_layers == 1)) { 2690 (!cpi->use_svc || is_spatial_svc(cpi))) {
2762 const int lossless = is_lossless_requested(&cpi->oxcf); 2691 const int lossless = is_lossless_requested(oxcf);
2763 cpi->mb.fwd_txm4x4 = lossless ? vp9_fwht4x4 : vp9_fdct4x4; 2692 cpi->mb.fwd_txm4x4 = lossless ? vp9_fwht4x4 : vp9_fdct4x4;
2764 cpi->mb.itxm_add = lossless ? vp9_iwht4x4_add : vp9_idct4x4_add; 2693 cpi->mb.itxm_add = lossless ? vp9_iwht4x4_add : vp9_idct4x4_add;
2765 vp9_first_pass(cpi); 2694 vp9_first_pass(cpi);
2766 } else if (cpi->pass == 2 && 2695 } else if (oxcf->pass == 2 &&
2767 (!cpi->use_svc || cpi->svc.number_temporal_layers == 1)) { 2696 (!cpi->use_svc || is_spatial_svc(cpi))) {
2768 Pass2Encode(cpi, size, dest, frame_flags); 2697 Pass2Encode(cpi, size, dest, frame_flags);
2769 } else if (cpi->use_svc) { 2698 } else if (cpi->use_svc) {
2770 SvcEncode(cpi, size, dest, frame_flags); 2699 SvcEncode(cpi, size, dest, frame_flags);
2771 } else { 2700 } else {
2772 // One pass encode 2701 // One pass encode
2773 Pass0Encode(cpi, size, dest, frame_flags); 2702 Pass0Encode(cpi, size, dest, frame_flags);
2774 } 2703 }
2775 2704
2776 if (cm->refresh_frame_context) 2705 if (cm->refresh_frame_context)
2777 cm->frame_contexts[cm->frame_context_idx] = cm->fc; 2706 cm->frame_contexts[cm->frame_context_idx] = cm->fc;
2778 2707
2779 // Frame was dropped, release scaled references. 2708 // Frame was dropped, release scaled references.
2780 if (*size == 0) { 2709 if (*size == 0) {
2781 release_scaled_references(cpi); 2710 release_scaled_references(cpi);
2782 } 2711 }
2783 2712
2784 if (*size > 0) { 2713 if (*size > 0) {
2785 cpi->droppable = !frame_is_reference(cpi); 2714 cpi->droppable = !frame_is_reference(cpi);
2786 } 2715 }
2787 2716
2788 // Save layer specific state. 2717 // Save layer specific state.
2789 if ((cpi->svc.number_temporal_layers > 1 && 2718 if ((cpi->svc.number_temporal_layers > 1 &&
2790 cpi->oxcf.rc_mode == VPX_CBR) || 2719 oxcf->rc_mode == VPX_CBR) ||
2791 (cpi->svc.number_spatial_layers > 1 && cpi->pass == 2)) { 2720 (cpi->svc.number_spatial_layers > 1 && oxcf->pass == 2)) {
2792 vp9_save_layer_context(cpi); 2721 vp9_save_layer_context(cpi);
2793 } 2722 }
2794 2723
2795 vpx_usec_timer_mark(&cmptimer); 2724 vpx_usec_timer_mark(&cmptimer);
2796 cpi->time_compress_data += vpx_usec_timer_elapsed(&cmptimer); 2725 cpi->time_compress_data += vpx_usec_timer_elapsed(&cmptimer);
2797 2726
2798 if (cpi->b_calculate_psnr && cpi->pass != 1 && cm->show_frame) 2727 if (cpi->b_calculate_psnr && oxcf->pass != 1 && cm->show_frame)
2799 generate_psnr_packet(cpi); 2728 generate_psnr_packet(cpi);
2800 2729
2801 #if CONFIG_INTERNAL_STATS 2730 #if CONFIG_INTERNAL_STATS
2802 2731
2803 if (cpi->pass != 1) { 2732 if (oxcf->pass != 1) {
2804 cpi->bytes += (int)(*size); 2733 cpi->bytes += (int)(*size);
2805 2734
2806 if (cm->show_frame) { 2735 if (cm->show_frame) {
2807 cpi->count++; 2736 cpi->count++;
2808 2737
2809 if (cpi->b_calculate_psnr) { 2738 if (cpi->b_calculate_psnr) {
2810 YV12_BUFFER_CONFIG *orig = cpi->Source; 2739 YV12_BUFFER_CONFIG *orig = cpi->Source;
2811 YV12_BUFFER_CONFIG *recon = cpi->common.frame_to_show; 2740 YV12_BUFFER_CONFIG *recon = cpi->common.frame_to_show;
2812 YV12_BUFFER_CONFIG *pp = &cm->post_proc_buffer; 2741 YV12_BUFFER_CONFIG *pp = &cm->post_proc_buffer;
2813 PSNR_STATS psnr; 2742 PSNR_STATS psnr;
(...skipping 223 matching lines...) Expand 10 before | Expand all | Expand 10 after
3037 if (flags & VP8_EFLAG_NO_UPD_ARF) 2966 if (flags & VP8_EFLAG_NO_UPD_ARF)
3038 upd ^= VP9_ALT_FLAG; 2967 upd ^= VP9_ALT_FLAG;
3039 2968
3040 vp9_update_reference(cpi, upd); 2969 vp9_update_reference(cpi, upd);
3041 } 2970 }
3042 2971
3043 if (flags & VP8_EFLAG_NO_UPD_ENTROPY) { 2972 if (flags & VP8_EFLAG_NO_UPD_ENTROPY) {
3044 vp9_update_entropy(cpi, 0); 2973 vp9_update_entropy(cpi, 0);
3045 } 2974 }
3046 } 2975 }
OLDNEW
« no previous file with comments | « source/libvpx/vp9/encoder/vp9_encoder.h ('k') | source/libvpx/vp9/encoder/vp9_firstpass.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698