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 <limits.h>
11*fb1b10abSAndroid Build Coastguard Worker
12*fb1b10abSAndroid Build Coastguard Worker #include "gtest/gtest.h"
13*fb1b10abSAndroid Build Coastguard Worker #include "test/codec_factory.h"
14*fb1b10abSAndroid Build Coastguard Worker #include "test/encode_test_driver.h"
15*fb1b10abSAndroid Build Coastguard Worker #include "test/util.h"
16*fb1b10abSAndroid Build Coastguard Worker #include "test/video_source.h"
17*fb1b10abSAndroid Build Coastguard Worker #include "vpx_config.h"
18*fb1b10abSAndroid Build Coastguard Worker
19*fb1b10abSAndroid Build Coastguard Worker namespace {
20*fb1b10abSAndroid Build Coastguard Worker
21*fb1b10abSAndroid Build Coastguard Worker const int kVideoSourceWidth = 320;
22*fb1b10abSAndroid Build Coastguard Worker const int kVideoSourceHeight = 240;
23*fb1b10abSAndroid Build Coastguard Worker const int kFramesToEncode = 2;
24*fb1b10abSAndroid Build Coastguard Worker
25*fb1b10abSAndroid Build Coastguard Worker class RealtimeTest
26*fb1b10abSAndroid Build Coastguard Worker : public ::libvpx_test::EncoderTest,
27*fb1b10abSAndroid Build Coastguard Worker public ::libvpx_test::CodecTestWithParam<libvpx_test::TestMode> {
28*fb1b10abSAndroid Build Coastguard Worker protected:
RealtimeTest()29*fb1b10abSAndroid Build Coastguard Worker RealtimeTest() : EncoderTest(GET_PARAM(0)), frame_packets_(0) {}
30*fb1b10abSAndroid Build Coastguard Worker ~RealtimeTest() override = default;
31*fb1b10abSAndroid Build Coastguard Worker
SetUp()32*fb1b10abSAndroid Build Coastguard Worker void SetUp() override {
33*fb1b10abSAndroid Build Coastguard Worker InitializeConfig();
34*fb1b10abSAndroid Build Coastguard Worker cfg_.g_lag_in_frames = 0;
35*fb1b10abSAndroid Build Coastguard Worker SetMode(::libvpx_test::kRealTime);
36*fb1b10abSAndroid Build Coastguard Worker }
37*fb1b10abSAndroid Build Coastguard Worker
BeginPassHook(unsigned int)38*fb1b10abSAndroid Build Coastguard Worker void BeginPassHook(unsigned int /*pass*/) override {
39*fb1b10abSAndroid Build Coastguard Worker #if !CONFIG_REALTIME_ONLY
40*fb1b10abSAndroid Build Coastguard Worker // TODO(tomfinegan): We're changing the pass value here to make sure
41*fb1b10abSAndroid Build Coastguard Worker // we get frames when real time mode is combined with |g_pass| set to
42*fb1b10abSAndroid Build Coastguard Worker // VPX_RC_FIRST_PASS. This is necessary because EncoderTest::RunLoop() sets
43*fb1b10abSAndroid Build Coastguard Worker // the pass value based on the mode passed into EncoderTest::SetMode(),
44*fb1b10abSAndroid Build Coastguard Worker // which overrides the one specified in SetUp() above.
45*fb1b10abSAndroid Build Coastguard Worker cfg_.g_pass = VPX_RC_FIRST_PASS;
46*fb1b10abSAndroid Build Coastguard Worker #endif
47*fb1b10abSAndroid Build Coastguard Worker }
48*fb1b10abSAndroid Build Coastguard Worker
PreEncodeFrameHook(::libvpx_test::VideoSource * video,::libvpx_test::Encoder * encoder)49*fb1b10abSAndroid Build Coastguard Worker void PreEncodeFrameHook(::libvpx_test::VideoSource *video,
50*fb1b10abSAndroid Build Coastguard Worker ::libvpx_test::Encoder *encoder) override {
51*fb1b10abSAndroid Build Coastguard Worker if (video->frame() == 0 && set_cpu_used_) {
52*fb1b10abSAndroid Build Coastguard Worker encoder->Control(VP8E_SET_CPUUSED, 8);
53*fb1b10abSAndroid Build Coastguard Worker }
54*fb1b10abSAndroid Build Coastguard Worker }
55*fb1b10abSAndroid Build Coastguard Worker
FramePktHook(const vpx_codec_cx_pkt_t *)56*fb1b10abSAndroid Build Coastguard Worker void FramePktHook(const vpx_codec_cx_pkt_t * /*pkt*/) override {
57*fb1b10abSAndroid Build Coastguard Worker frame_packets_++;
58*fb1b10abSAndroid Build Coastguard Worker }
59*fb1b10abSAndroid Build Coastguard Worker
IsVP9() const60*fb1b10abSAndroid Build Coastguard Worker bool IsVP9() const {
61*fb1b10abSAndroid Build Coastguard Worker #if CONFIG_VP9_ENCODER
62*fb1b10abSAndroid Build Coastguard Worker return codec_ == &libvpx_test::kVP9;
63*fb1b10abSAndroid Build Coastguard Worker #else
64*fb1b10abSAndroid Build Coastguard Worker return false;
65*fb1b10abSAndroid Build Coastguard Worker #endif
66*fb1b10abSAndroid Build Coastguard Worker }
67*fb1b10abSAndroid Build Coastguard Worker
TestIntegerOverflow(unsigned int width,unsigned int height)68*fb1b10abSAndroid Build Coastguard Worker void TestIntegerOverflow(unsigned int width, unsigned int height) {
69*fb1b10abSAndroid Build Coastguard Worker ::libvpx_test::RandomVideoSource video;
70*fb1b10abSAndroid Build Coastguard Worker video.SetSize(width, height);
71*fb1b10abSAndroid Build Coastguard Worker video.set_limit(20);
72*fb1b10abSAndroid Build Coastguard Worker cfg_.rc_target_bitrate = UINT_MAX;
73*fb1b10abSAndroid Build Coastguard Worker ASSERT_NO_FATAL_FAILURE(RunLoop(&video));
74*fb1b10abSAndroid Build Coastguard Worker }
75*fb1b10abSAndroid Build Coastguard Worker
TestEncode()76*fb1b10abSAndroid Build Coastguard Worker void TestEncode() {
77*fb1b10abSAndroid Build Coastguard Worker ::libvpx_test::RandomVideoSource video;
78*fb1b10abSAndroid Build Coastguard Worker video.SetSize(kVideoSourceWidth, kVideoSourceHeight);
79*fb1b10abSAndroid Build Coastguard Worker video.set_limit(kFramesToEncode);
80*fb1b10abSAndroid Build Coastguard Worker ASSERT_NO_FATAL_FAILURE(RunLoop(&video));
81*fb1b10abSAndroid Build Coastguard Worker EXPECT_EQ(kFramesToEncode, frame_packets_);
82*fb1b10abSAndroid Build Coastguard Worker }
83*fb1b10abSAndroid Build Coastguard Worker
84*fb1b10abSAndroid Build Coastguard Worker int frame_packets_;
85*fb1b10abSAndroid Build Coastguard Worker bool set_cpu_used_ = true;
86*fb1b10abSAndroid Build Coastguard Worker };
87*fb1b10abSAndroid Build Coastguard Worker
TEST_P(RealtimeTest,RealtimeFirstPassProducesFrames)88*fb1b10abSAndroid Build Coastguard Worker TEST_P(RealtimeTest, RealtimeFirstPassProducesFrames) { TestEncode(); }
89*fb1b10abSAndroid Build Coastguard Worker
TEST_P(RealtimeTest,RealtimeDefaultCpuUsed)90*fb1b10abSAndroid Build Coastguard Worker TEST_P(RealtimeTest, RealtimeDefaultCpuUsed) {
91*fb1b10abSAndroid Build Coastguard Worker set_cpu_used_ = false;
92*fb1b10abSAndroid Build Coastguard Worker TestEncode();
93*fb1b10abSAndroid Build Coastguard Worker }
94*fb1b10abSAndroid Build Coastguard Worker
TEST_P(RealtimeTest,IntegerOverflow)95*fb1b10abSAndroid Build Coastguard Worker TEST_P(RealtimeTest, IntegerOverflow) { TestIntegerOverflow(2048, 2048); }
96*fb1b10abSAndroid Build Coastguard Worker
TEST_P(RealtimeTest,IntegerOverflowLarge)97*fb1b10abSAndroid Build Coastguard Worker TEST_P(RealtimeTest, IntegerOverflowLarge) {
98*fb1b10abSAndroid Build Coastguard Worker #ifdef CHROMIUM
99*fb1b10abSAndroid Build Coastguard Worker GTEST_SKIP() << "16K framebuffers are not supported by Chromium's allocator.";
100*fb1b10abSAndroid Build Coastguard Worker #else
101*fb1b10abSAndroid Build Coastguard Worker if (IsVP9()) {
102*fb1b10abSAndroid Build Coastguard Worker #if VPX_ARCH_AARCH64 || VPX_ARCH_X86_64
103*fb1b10abSAndroid Build Coastguard Worker TestIntegerOverflow(16384, 16384);
104*fb1b10abSAndroid Build Coastguard Worker #else
105*fb1b10abSAndroid Build Coastguard Worker TestIntegerOverflow(4096, 4096);
106*fb1b10abSAndroid Build Coastguard Worker #endif
107*fb1b10abSAndroid Build Coastguard Worker } else {
108*fb1b10abSAndroid Build Coastguard Worker GTEST_SKIP()
109*fb1b10abSAndroid Build Coastguard Worker << "TODO(https://crbug.com/webm/1748,https://crbug.com/webm/1751):"
110*fb1b10abSAndroid Build Coastguard Worker << " Enable this test after bitstream errors & undefined sanitizer "
111*fb1b10abSAndroid Build Coastguard Worker "warnings are fixed.";
112*fb1b10abSAndroid Build Coastguard Worker // TestIntegerOverflow(16383, 16383);
113*fb1b10abSAndroid Build Coastguard Worker }
114*fb1b10abSAndroid Build Coastguard Worker #endif // defined(CHROMIUM)
115*fb1b10abSAndroid Build Coastguard Worker }
116*fb1b10abSAndroid Build Coastguard Worker
117*fb1b10abSAndroid Build Coastguard Worker VP8_INSTANTIATE_TEST_SUITE(RealtimeTest,
118*fb1b10abSAndroid Build Coastguard Worker ::testing::Values(::libvpx_test::kRealTime));
119*fb1b10abSAndroid Build Coastguard Worker VP9_INSTANTIATE_TEST_SUITE(RealtimeTest,
120*fb1b10abSAndroid Build Coastguard Worker ::testing::Values(::libvpx_test::kRealTime));
121*fb1b10abSAndroid Build Coastguard Worker
122*fb1b10abSAndroid Build Coastguard Worker } // namespace
123