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