1/* 2 * Copyright (c) 2016 The WebM project authors. All Rights Reserved. 3 * 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 6 * tree. An additional intellectual property rights grant can be found 7 * in the file PATENTS. All contributing project authors may 8 * be found in the AUTHORS file in the root of the source tree. 9 */ 10#include "third_party/googletest/src/include/gtest/gtest.h" 11#include "test/codec_factory.h" 12#include "test/encode_test_driver.h" 13#include "test/i420_video_source.h" 14#include "test/util.h" 15 16namespace { 17class LevelTest 18 : public ::libvpx_test::EncoderTest, 19 public ::libvpx_test::CodecTestWith2Params<libvpx_test::TestMode, int> { 20 protected: 21 LevelTest() 22 : EncoderTest(GET_PARAM(0)), encoding_mode_(GET_PARAM(1)), 23 cpu_used_(GET_PARAM(2)), min_gf_internal_(24), target_level_(0), 24 level_(0) {} 25 virtual ~LevelTest() {} 26 27 virtual void SetUp() { 28 InitializeConfig(); 29 SetMode(encoding_mode_); 30 if (encoding_mode_ != ::libvpx_test::kRealTime) { 31 cfg_.g_lag_in_frames = 25; 32 cfg_.rc_end_usage = VPX_VBR; 33 } else { 34 cfg_.g_lag_in_frames = 0; 35 cfg_.rc_end_usage = VPX_CBR; 36 } 37 cfg_.rc_2pass_vbr_minsection_pct = 5; 38 cfg_.rc_2pass_vbr_maxsection_pct = 2000; 39 cfg_.rc_target_bitrate = 400; 40 cfg_.rc_max_quantizer = 63; 41 cfg_.rc_min_quantizer = 0; 42 } 43 44 virtual void PreEncodeFrameHook(::libvpx_test::VideoSource *video, 45 ::libvpx_test::Encoder *encoder) { 46 if (video->frame() == 0) { 47 encoder->Control(VP8E_SET_CPUUSED, cpu_used_); 48 encoder->Control(VP9E_SET_TARGET_LEVEL, target_level_); 49 encoder->Control(VP9E_SET_MIN_GF_INTERVAL, min_gf_internal_); 50 if (encoding_mode_ != ::libvpx_test::kRealTime) { 51 encoder->Control(VP8E_SET_ENABLEAUTOALTREF, 1); 52 encoder->Control(VP8E_SET_ARNR_MAXFRAMES, 7); 53 encoder->Control(VP8E_SET_ARNR_STRENGTH, 5); 54 encoder->Control(VP8E_SET_ARNR_TYPE, 3); 55 } 56 } 57 encoder->Control(VP9E_GET_LEVEL, &level_); 58 ASSERT_LE(level_, 51); 59 ASSERT_GE(level_, 0); 60 } 61 62 ::libvpx_test::TestMode encoding_mode_; 63 int cpu_used_; 64 int min_gf_internal_; 65 int target_level_; 66 int level_; 67}; 68 69TEST_P(LevelTest, TestTargetLevel11Large) { 70 ASSERT_NE(encoding_mode_, ::libvpx_test::kRealTime); 71 ::libvpx_test::I420VideoSource video("hantro_odd.yuv", 208, 144, 30, 1, 0, 72 60); 73 target_level_ = 11; 74 cfg_.rc_target_bitrate = 150; 75 ASSERT_NO_FATAL_FAILURE(RunLoop(&video)); 76 ASSERT_GE(target_level_, level_); 77} 78 79TEST_P(LevelTest, TestTargetLevel20Large) { 80 ASSERT_NE(encoding_mode_, ::libvpx_test::kRealTime); 81 ::libvpx_test::I420VideoSource video("hantro_collage_w352h288.yuv", 352, 288, 82 30, 1, 0, 60); 83 target_level_ = 20; 84 cfg_.rc_target_bitrate = 1200; 85 ASSERT_NO_FATAL_FAILURE(RunLoop(&video)); 86 ASSERT_GE(target_level_, level_); 87} 88 89TEST_P(LevelTest, TestTargetLevel31Large) { 90 ASSERT_NE(encoding_mode_, ::libvpx_test::kRealTime); 91 ::libvpx_test::I420VideoSource video("niklas_1280_720_30.y4m", 1280, 720, 30, 92 1, 0, 60); 93 target_level_ = 31; 94 cfg_.rc_target_bitrate = 8000; 95 ASSERT_NO_FATAL_FAILURE(RunLoop(&video)); 96 ASSERT_GE(target_level_, level_); 97} 98 99// Test for keeping level stats only 100TEST_P(LevelTest, TestTargetLevel0) { 101 ::libvpx_test::I420VideoSource video("hantro_odd.yuv", 208, 144, 30, 1, 0, 102 40); 103 target_level_ = 0; 104 min_gf_internal_ = 4; 105 ASSERT_NO_FATAL_FAILURE(RunLoop(&video)); 106 ASSERT_GE(11, level_); 107 108 cfg_.rc_target_bitrate = 1600; 109 ASSERT_NO_FATAL_FAILURE(RunLoop(&video)); 110 ASSERT_GE(20, level_); 111} 112 113// Test for level control being turned off 114TEST_P(LevelTest, TestTargetLevel255) { 115 ::libvpx_test::I420VideoSource video("hantro_odd.yuv", 208, 144, 30, 1, 0, 116 30); 117 target_level_ = 255; 118 ASSERT_NO_FATAL_FAILURE(RunLoop(&video)); 119} 120 121TEST_P(LevelTest, TestTargetLevelApi) { 122 ::libvpx_test::I420VideoSource video("hantro_odd.yuv", 208, 144, 30, 1, 0, 1); 123 static const vpx_codec_iface_t *codec = &vpx_codec_vp9_cx_algo; 124 vpx_codec_ctx_t enc; 125 vpx_codec_enc_cfg_t cfg; 126 EXPECT_EQ(VPX_CODEC_OK, vpx_codec_enc_config_default(codec, &cfg, 0)); 127 cfg.rc_target_bitrate = 100; 128 EXPECT_EQ(VPX_CODEC_OK, vpx_codec_enc_init(&enc, codec, &cfg, 0)); 129 for (int level = 0; level <= 256; ++level) { 130 if (level == 10 || level == 11 || level == 20 || level == 21 || 131 level == 30 || level == 31 || level == 40 || level == 41 || 132 level == 50 || level == 51 || level == 52 || level == 60 || 133 level == 61 || level == 62 || level == 0 || level == 1 || level == 255) 134 EXPECT_EQ(VPX_CODEC_OK, 135 vpx_codec_control(&enc, VP9E_SET_TARGET_LEVEL, level)); 136 else 137 EXPECT_EQ(VPX_CODEC_INVALID_PARAM, 138 vpx_codec_control(&enc, VP9E_SET_TARGET_LEVEL, level)); 139 } 140 EXPECT_EQ(VPX_CODEC_OK, vpx_codec_destroy(&enc)); 141} 142 143VP9_INSTANTIATE_TEST_CASE(LevelTest, 144 ::testing::Values(::libvpx_test::kTwoPassGood, 145 ::libvpx_test::kOnePassGood), 146 ::testing::Range(0, 9)); 147} // namespace 148