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

Side by Side Diff: source/libvpx/test/datarate_test.cc

Issue 1302353004: libvpx: Pull from upstream (Closed) Base URL: https://chromium.googlesource.com/chromium/deps/libvpx.git@master
Patch Set: Created 5 years, 3 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « source/libvpx/test/cpu_speed_test.cc ('k') | source/libvpx/test/dct16x16_test.cc » ('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) 2012 The WebM project authors. All Rights Reserved. 2 * Copyright (c) 2012 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 #include "./vpx_config.h" 10 #include "./vpx_config.h"
(...skipping 743 matching lines...) Expand 10 before | Expand all | Expand 10 after
754 speed_setting_ = GET_PARAM(2); 754 speed_setting_ = GET_PARAM(2);
755 ResetModel(); 755 ResetModel();
756 } 756 }
757 virtual void ResetModel() { 757 virtual void ResetModel() {
758 last_pts_ = 0; 758 last_pts_ = 0;
759 bits_in_buffer_model_ = cfg_.rc_target_bitrate * cfg_.rc_buf_initial_sz; 759 bits_in_buffer_model_ = cfg_.rc_target_bitrate * cfg_.rc_buf_initial_sz;
760 frame_number_ = 0; 760 frame_number_ = 0;
761 first_drop_ = 0; 761 first_drop_ = 0;
762 bits_total_ = 0; 762 bits_total_ = 0;
763 duration_ = 0.0; 763 duration_ = 0.0;
764 mismatch_psnr_ = 0.0;
765 mismatch_nframes_ = 0;
764 } 766 }
765 virtual void BeginPassHook(unsigned int /*pass*/) { 767 virtual void BeginPassHook(unsigned int /*pass*/) {
766 } 768 }
767 virtual void PreEncodeFrameHook(::libvpx_test::VideoSource *video, 769 virtual void PreEncodeFrameHook(::libvpx_test::VideoSource *video,
768 ::libvpx_test::Encoder *encoder) { 770 ::libvpx_test::Encoder *encoder) {
769 if (video->frame() == 0) { 771 if (video->frame() == 0) {
770 int i; 772 int i;
771 for (i = 0; i < 2; ++i) { 773 for (i = 0; i < 2; ++i) {
772 svc_params_.max_quantizers[i] = 63; 774 svc_params_.max_quantizers[i] = 63;
773 svc_params_.min_quantizers[i] = 0; 775 svc_params_.min_quantizers[i] = 0;
774 } 776 }
775 svc_params_.scaling_factor_num[0] = 144; 777 svc_params_.scaling_factor_num[0] = 144;
776 svc_params_.scaling_factor_den[0] = 288; 778 svc_params_.scaling_factor_den[0] = 288;
777 svc_params_.scaling_factor_num[1] = 288; 779 svc_params_.scaling_factor_num[1] = 288;
778 svc_params_.scaling_factor_den[1] = 288; 780 svc_params_.scaling_factor_den[1] = 288;
779 encoder->Control(VP9E_SET_SVC, 1); 781 encoder->Control(VP9E_SET_SVC, 1);
780 encoder->Control(VP9E_SET_SVC_PARAMETERS, &svc_params_); 782 encoder->Control(VP9E_SET_SVC_PARAMETERS, &svc_params_);
781 encoder->Control(VP8E_SET_CPUUSED, speed_setting_); 783 encoder->Control(VP8E_SET_CPUUSED, speed_setting_);
782 encoder->Control(VP9E_SET_TILE_COLUMNS, 0); 784 encoder->Control(VP9E_SET_TILE_COLUMNS, 0);
783 encoder->Control(VP8E_SET_MAX_INTRA_BITRATE_PCT, 300); 785 encoder->Control(VP8E_SET_MAX_INTRA_BITRATE_PCT, 300);
786 encoder->Control(VP9E_SET_TILE_COLUMNS, (cfg_.g_threads >> 1));
784 } 787 }
785 const vpx_rational_t tb = video->timebase(); 788 const vpx_rational_t tb = video->timebase();
786 timebase_ = static_cast<double>(tb.num) / tb.den; 789 timebase_ = static_cast<double>(tb.num) / tb.den;
787 duration_ = 0; 790 duration_ = 0;
788 } 791 }
789 virtual void FramePktHook(const vpx_codec_cx_pkt_t *pkt) { 792 virtual void FramePktHook(const vpx_codec_cx_pkt_t *pkt) {
790 vpx_codec_pts_t duration = pkt->data.frame.pts - last_pts_; 793 vpx_codec_pts_t duration = pkt->data.frame.pts - last_pts_;
791 if (last_pts_ == 0) 794 if (last_pts_ == 0)
792 duration = 1; 795 duration = 1;
793 bits_in_buffer_model_ += static_cast<int64_t>( 796 bits_in_buffer_model_ += static_cast<int64_t>(
(...skipping 15 matching lines...) Expand all
809 } 812 }
810 virtual void EndPassHook(void) { 813 virtual void EndPassHook(void) {
811 if (bits_total_) { 814 if (bits_total_) {
812 const double file_size_in_kb = bits_total_ / 1000.; // bits per kilobit 815 const double file_size_in_kb = bits_total_ / 1000.; // bits per kilobit
813 duration_ = (last_pts_ + 1) * timebase_; 816 duration_ = (last_pts_ + 1) * timebase_;
814 effective_datarate_ = (bits_total_ - bits_in_last_frame_) / 1000.0 817 effective_datarate_ = (bits_total_ - bits_in_last_frame_) / 1000.0
815 / (cfg_.rc_buf_initial_sz / 1000.0 + duration_); 818 / (cfg_.rc_buf_initial_sz / 1000.0 + duration_);
816 file_datarate_ = file_size_in_kb / duration_; 819 file_datarate_ = file_size_in_kb / duration_;
817 } 820 }
818 } 821 }
822
823 virtual void MismatchHook(const vpx_image_t *img1,
824 const vpx_image_t *img2) {
825 double mismatch_psnr = compute_psnr(img1, img2);
826 mismatch_psnr_ += mismatch_psnr;
827 ++mismatch_nframes_;
828 }
829
830 unsigned int GetMismatchFrames() {
831 return mismatch_nframes_;
832 }
833
819 vpx_codec_pts_t last_pts_; 834 vpx_codec_pts_t last_pts_;
820 int64_t bits_in_buffer_model_; 835 int64_t bits_in_buffer_model_;
821 double timebase_; 836 double timebase_;
822 int frame_number_; 837 int frame_number_;
823 vpx_codec_pts_t first_drop_; 838 vpx_codec_pts_t first_drop_;
824 int64_t bits_total_; 839 int64_t bits_total_;
825 double duration_; 840 double duration_;
826 double file_datarate_; 841 double file_datarate_;
827 double effective_datarate_; 842 double effective_datarate_;
828 size_t bits_in_last_frame_; 843 size_t bits_in_last_frame_;
829 vpx_svc_extra_cfg_t svc_params_; 844 vpx_svc_extra_cfg_t svc_params_;
830 int speed_setting_; 845 int speed_setting_;
846 double mismatch_psnr_;
847 int mismatch_nframes_;
831 }; 848 };
832 static void assign_layer_bitrates(vpx_codec_enc_cfg_t *const enc_cfg, 849 static void assign_layer_bitrates(vpx_codec_enc_cfg_t *const enc_cfg,
833 const vpx_svc_extra_cfg_t *svc_params, 850 const vpx_svc_extra_cfg_t *svc_params,
834 int spatial_layers, 851 int spatial_layers,
835 int temporal_layers, 852 int temporal_layers,
836 int temporal_layering_mode, 853 int temporal_layering_mode,
837 unsigned int total_rate) { 854 unsigned int total_rate) {
838 int sl, spatial_layer_target; 855 int sl, spatial_layer_target;
839 float total = 0; 856 float total = 0;
840 float alloc_ratio[VPX_MAX_LAYERS] = {0}; 857 float alloc_ratio[VPX_MAX_LAYERS] = {0};
(...skipping 19 matching lines...) Expand all
860 } else if (temporal_layering_mode == 2) { 877 } else if (temporal_layering_mode == 2) {
861 enc_cfg->layer_target_bitrate[index] = 878 enc_cfg->layer_target_bitrate[index] =
862 spatial_layer_target * 2 / 3; 879 spatial_layer_target * 2 / 3;
863 enc_cfg->layer_target_bitrate[index + 1] = 880 enc_cfg->layer_target_bitrate[index + 1] =
864 spatial_layer_target; 881 spatial_layer_target;
865 } 882 }
866 } 883 }
867 } 884 }
868 885
869 // Check basic rate targeting for 1 pass CBR SVC: 2 spatial layers and 886 // Check basic rate targeting for 1 pass CBR SVC: 2 spatial layers and
870 // 3 temporal layers. 887 // 3 temporal layers. Run CIF clip with 1 thread.
871 TEST_P(DatarateOnePassCbrSvc, OnePassCbrSvc) { 888 TEST_P(DatarateOnePassCbrSvc, OnePassCbrSvc) {
872 cfg_.rc_buf_initial_sz = 500; 889 cfg_.rc_buf_initial_sz = 500;
873 cfg_.rc_buf_optimal_sz = 500; 890 cfg_.rc_buf_optimal_sz = 500;
874 cfg_.rc_buf_sz = 1000; 891 cfg_.rc_buf_sz = 1000;
875 cfg_.rc_min_quantizer = 0; 892 cfg_.rc_min_quantizer = 0;
876 cfg_.rc_max_quantizer = 63; 893 cfg_.rc_max_quantizer = 63;
877 cfg_.rc_end_usage = VPX_CBR; 894 cfg_.rc_end_usage = VPX_CBR;
878 cfg_.g_lag_in_frames = 0; 895 cfg_.g_lag_in_frames = 0;
879 cfg_.ss_number_layers = 2; 896 cfg_.ss_number_layers = 2;
880 cfg_.ts_number_layers = 3; 897 cfg_.ts_number_layers = 3;
881 cfg_.ts_rate_decimator[0] = 4; 898 cfg_.ts_rate_decimator[0] = 4;
882 cfg_.ts_rate_decimator[1] = 2; 899 cfg_.ts_rate_decimator[1] = 2;
883 cfg_.ts_rate_decimator[2] = 1; 900 cfg_.ts_rate_decimator[2] = 1;
884 cfg_.g_error_resilient = 1; 901 cfg_.g_error_resilient = 1;
902 cfg_.g_threads = 1;
885 cfg_.temporal_layering_mode = 3; 903 cfg_.temporal_layering_mode = 3;
886 svc_params_.scaling_factor_num[0] = 144; 904 svc_params_.scaling_factor_num[0] = 144;
887 svc_params_.scaling_factor_den[0] = 288; 905 svc_params_.scaling_factor_den[0] = 288;
888 svc_params_.scaling_factor_num[1] = 288; 906 svc_params_.scaling_factor_num[1] = 288;
889 svc_params_.scaling_factor_den[1] = 288; 907 svc_params_.scaling_factor_den[1] = 288;
890 // TODO(wonkap/marpan): No frame drop for now, we need to implement correct 908 // TODO(wonkap/marpan): No frame drop for now, we need to implement correct
891 // frame dropping for SVC. 909 // frame dropping for SVC.
892 cfg_.rc_dropframe_thresh = 0; 910 cfg_.rc_dropframe_thresh = 0;
893 ::libvpx_test::I420VideoSource video("hantro_collage_w352h288.yuv", 352, 288, 911 ::libvpx_test::I420VideoSource video("hantro_collage_w352h288.yuv", 352, 288,
894 30, 1, 0, 200); 912 30, 1, 0, 200);
895 // TODO(wonkap/marpan): Check that effective_datarate for each layer hits the 913 // TODO(wonkap/marpan): Check that effective_datarate for each layer hits the
896 // layer target_bitrate. Also check if test can pass at lower bitrate (~200k). 914 // layer target_bitrate. Also check if test can pass at lower bitrate (~200k).
897 for (int i = 400; i <= 800; i += 200) { 915 for (int i = 400; i <= 800; i += 200) {
898 cfg_.rc_target_bitrate = i; 916 cfg_.rc_target_bitrate = i;
899 ResetModel(); 917 ResetModel();
900 assign_layer_bitrates(&cfg_, &svc_params_, cfg_.ss_number_layers, 918 assign_layer_bitrates(&cfg_, &svc_params_, cfg_.ss_number_layers,
901 cfg_.ts_number_layers, cfg_.temporal_layering_mode, 919 cfg_.ts_number_layers, cfg_.temporal_layering_mode,
902 cfg_.rc_target_bitrate); 920 cfg_.rc_target_bitrate);
903 ASSERT_NO_FATAL_FAILURE(RunLoop(&video)); 921 ASSERT_NO_FATAL_FAILURE(RunLoop(&video));
904 ASSERT_GE(cfg_.rc_target_bitrate, effective_datarate_ * 0.85) 922 ASSERT_GE(cfg_.rc_target_bitrate, effective_datarate_ * 0.85)
905 << " The datarate for the file exceeds the target by too much!"; 923 << " The datarate for the file exceeds the target by too much!";
906 ASSERT_LE(cfg_.rc_target_bitrate, file_datarate_ * 1.15) 924 ASSERT_LE(cfg_.rc_target_bitrate, file_datarate_ * 1.15)
907 << " The datarate for the file is lower than the target by too much!"; 925 << " The datarate for the file is lower than the target by too much!";
926 EXPECT_EQ(GetMismatchFrames(), (unsigned int) 0);
908 } 927 }
909 } 928 }
910 929
930 // Check basic rate targeting for 1 pass CBR SVC: 2 spatial layers and
931 // 3 temporal layers. Run HD clip with 4 threads.
932 TEST_P(DatarateOnePassCbrSvc, OnePassCbrSvc4threads) {
933 cfg_.rc_buf_initial_sz = 500;
934 cfg_.rc_buf_optimal_sz = 500;
935 cfg_.rc_buf_sz = 1000;
936 cfg_.rc_min_quantizer = 0;
937 cfg_.rc_max_quantizer = 63;
938 cfg_.rc_end_usage = VPX_CBR;
939 cfg_.g_lag_in_frames = 0;
940 cfg_.ss_number_layers = 2;
941 cfg_.ts_number_layers = 3;
942 cfg_.ts_rate_decimator[0] = 4;
943 cfg_.ts_rate_decimator[1] = 2;
944 cfg_.ts_rate_decimator[2] = 1;
945 cfg_.g_error_resilient = 1;
946 cfg_.g_threads = 4;
947 cfg_.temporal_layering_mode = 3;
948 svc_params_.scaling_factor_num[0] = 144;
949 svc_params_.scaling_factor_den[0] = 288;
950 svc_params_.scaling_factor_num[1] = 288;
951 svc_params_.scaling_factor_den[1] = 288;
952 // TODO(wonkap/marpan): No frame drop for now, we need to implement correct
953 // frame dropping for SVC.
954 cfg_.rc_dropframe_thresh = 0;
955 ::libvpx_test::I420VideoSource video("niklas_1280_720_30.y4m", 1280, 720,
956 30, 1, 0, 300);
957 cfg_.rc_target_bitrate = 800;
958 ResetModel();
959 assign_layer_bitrates(&cfg_, &svc_params_, cfg_.ss_number_layers,
960 cfg_.ts_number_layers, cfg_.temporal_layering_mode,
961 cfg_.rc_target_bitrate);
962 ASSERT_NO_FATAL_FAILURE(RunLoop(&video));
963 ASSERT_GE(cfg_.rc_target_bitrate, effective_datarate_ * 0.85)
964 << " The datarate for the file exceeds the target by too much!";
965 ASSERT_LE(cfg_.rc_target_bitrate, file_datarate_ * 1.15)
966 << " The datarate for the file is lower than the target by too much!";
967 EXPECT_EQ(GetMismatchFrames(), (unsigned int) 0);
968 }
969
911 VP8_INSTANTIATE_TEST_CASE(DatarateTestLarge, ALL_TEST_MODES); 970 VP8_INSTANTIATE_TEST_CASE(DatarateTestLarge, ALL_TEST_MODES);
912 VP9_INSTANTIATE_TEST_CASE(DatarateTestVP9Large, 971 VP9_INSTANTIATE_TEST_CASE(DatarateTestVP9Large,
913 ::testing::Values(::libvpx_test::kOnePassGood, 972 ::testing::Values(::libvpx_test::kOnePassGood,
914 ::libvpx_test::kRealTime), 973 ::libvpx_test::kRealTime),
915 ::testing::Range(2, 7)); 974 ::testing::Range(2, 7));
916 VP9_INSTANTIATE_TEST_CASE(DatarateOnePassCbrSvc, 975 VP9_INSTANTIATE_TEST_CASE(DatarateOnePassCbrSvc,
917 ::testing::Values(::libvpx_test::kRealTime), 976 ::testing::Values(::libvpx_test::kRealTime),
918 ::testing::Range(5, 8)); 977 ::testing::Range(5, 8));
919 } // namespace 978 } // namespace
OLDNEW
« no previous file with comments | « source/libvpx/test/cpu_speed_test.cc ('k') | source/libvpx/test/dct16x16_test.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698