1*fb1b10abSAndroid Build Coastguard Worker /*
2*fb1b10abSAndroid Build Coastguard Worker * Copyright (c) 2012 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 <climits>
11*fb1b10abSAndroid Build Coastguard Worker #include <cstring>
12*fb1b10abSAndroid Build Coastguard Worker #include <vector>
13*fb1b10abSAndroid Build Coastguard Worker #include "gtest/gtest.h"
14*fb1b10abSAndroid Build Coastguard Worker #include "test/codec_factory.h"
15*fb1b10abSAndroid Build Coastguard Worker #include "test/encode_test_driver.h"
16*fb1b10abSAndroid Build Coastguard Worker #include "test/i420_video_source.h"
17*fb1b10abSAndroid Build Coastguard Worker #include "test/util.h"
18*fb1b10abSAndroid Build Coastguard Worker #include "./vpx_config.h"
19*fb1b10abSAndroid Build Coastguard Worker #include "vpx/vp8cx.h"
20*fb1b10abSAndroid Build Coastguard Worker #include "vpx/vpx_codec.h"
21*fb1b10abSAndroid Build Coastguard Worker #include "vpx/vpx_encoder.h"
22*fb1b10abSAndroid Build Coastguard Worker #include "vpx/vpx_image.h"
23*fb1b10abSAndroid Build Coastguard Worker
24*fb1b10abSAndroid Build Coastguard Worker namespace {
25*fb1b10abSAndroid Build Coastguard Worker
26*fb1b10abSAndroid Build Coastguard Worker class KeyframeTest
27*fb1b10abSAndroid Build Coastguard Worker : public ::libvpx_test::EncoderTest,
28*fb1b10abSAndroid Build Coastguard Worker public ::libvpx_test::CodecTestWithParam<libvpx_test::TestMode> {
29*fb1b10abSAndroid Build Coastguard Worker protected:
KeyframeTest()30*fb1b10abSAndroid Build Coastguard Worker KeyframeTest() : EncoderTest(GET_PARAM(0)) {}
31*fb1b10abSAndroid Build Coastguard Worker ~KeyframeTest() override = default;
32*fb1b10abSAndroid Build Coastguard Worker
SetUp()33*fb1b10abSAndroid Build Coastguard Worker void SetUp() override {
34*fb1b10abSAndroid Build Coastguard Worker InitializeConfig();
35*fb1b10abSAndroid Build Coastguard Worker SetMode(GET_PARAM(1));
36*fb1b10abSAndroid Build Coastguard Worker kf_count_ = 0;
37*fb1b10abSAndroid Build Coastguard Worker kf_count_max_ = INT_MAX;
38*fb1b10abSAndroid Build Coastguard Worker kf_do_force_kf_ = false;
39*fb1b10abSAndroid Build Coastguard Worker set_cpu_used_ = 0;
40*fb1b10abSAndroid Build Coastguard Worker }
41*fb1b10abSAndroid Build Coastguard Worker
PreEncodeFrameHook(::libvpx_test::VideoSource * video,::libvpx_test::Encoder * encoder)42*fb1b10abSAndroid Build Coastguard Worker void PreEncodeFrameHook(::libvpx_test::VideoSource *video,
43*fb1b10abSAndroid Build Coastguard Worker ::libvpx_test::Encoder *encoder) override {
44*fb1b10abSAndroid Build Coastguard Worker if (kf_do_force_kf_) {
45*fb1b10abSAndroid Build Coastguard Worker frame_flags_ = (video->frame() % 3) ? 0 : VPX_EFLAG_FORCE_KF;
46*fb1b10abSAndroid Build Coastguard Worker }
47*fb1b10abSAndroid Build Coastguard Worker if (set_cpu_used_ && video->frame() == 0) {
48*fb1b10abSAndroid Build Coastguard Worker encoder->Control(VP8E_SET_CPUUSED, set_cpu_used_);
49*fb1b10abSAndroid Build Coastguard Worker }
50*fb1b10abSAndroid Build Coastguard Worker }
51*fb1b10abSAndroid Build Coastguard Worker
FramePktHook(const vpx_codec_cx_pkt_t * pkt)52*fb1b10abSAndroid Build Coastguard Worker void FramePktHook(const vpx_codec_cx_pkt_t *pkt) override {
53*fb1b10abSAndroid Build Coastguard Worker if (pkt->data.frame.flags & VPX_FRAME_IS_KEY) {
54*fb1b10abSAndroid Build Coastguard Worker kf_pts_list_.push_back(pkt->data.frame.pts);
55*fb1b10abSAndroid Build Coastguard Worker kf_count_++;
56*fb1b10abSAndroid Build Coastguard Worker abort_ |= kf_count_ > kf_count_max_;
57*fb1b10abSAndroid Build Coastguard Worker }
58*fb1b10abSAndroid Build Coastguard Worker }
59*fb1b10abSAndroid Build Coastguard Worker
60*fb1b10abSAndroid Build Coastguard Worker bool kf_do_force_kf_;
61*fb1b10abSAndroid Build Coastguard Worker int kf_count_;
62*fb1b10abSAndroid Build Coastguard Worker int kf_count_max_;
63*fb1b10abSAndroid Build Coastguard Worker std::vector<vpx_codec_pts_t> kf_pts_list_;
64*fb1b10abSAndroid Build Coastguard Worker int set_cpu_used_;
65*fb1b10abSAndroid Build Coastguard Worker };
66*fb1b10abSAndroid Build Coastguard Worker
TEST_P(KeyframeTest,TestRandomVideoSource)67*fb1b10abSAndroid Build Coastguard Worker TEST_P(KeyframeTest, TestRandomVideoSource) {
68*fb1b10abSAndroid Build Coastguard Worker // Validate that encoding the RandomVideoSource produces multiple keyframes.
69*fb1b10abSAndroid Build Coastguard Worker // This validates the results of the TestDisableKeyframes test.
70*fb1b10abSAndroid Build Coastguard Worker kf_count_max_ = 2; // early exit successful tests.
71*fb1b10abSAndroid Build Coastguard Worker
72*fb1b10abSAndroid Build Coastguard Worker ::libvpx_test::RandomVideoSource video;
73*fb1b10abSAndroid Build Coastguard Worker ASSERT_NO_FATAL_FAILURE(RunLoop(&video));
74*fb1b10abSAndroid Build Coastguard Worker
75*fb1b10abSAndroid Build Coastguard Worker // In realtime mode - auto placed keyframes are exceedingly rare, don't
76*fb1b10abSAndroid Build Coastguard Worker // bother with this check if(GetParam() > 0)
77*fb1b10abSAndroid Build Coastguard Worker if (GET_PARAM(1) > 0) {
78*fb1b10abSAndroid Build Coastguard Worker EXPECT_GT(kf_count_, 1);
79*fb1b10abSAndroid Build Coastguard Worker }
80*fb1b10abSAndroid Build Coastguard Worker }
81*fb1b10abSAndroid Build Coastguard Worker
TEST_P(KeyframeTest,TestDisableKeyframes)82*fb1b10abSAndroid Build Coastguard Worker TEST_P(KeyframeTest, TestDisableKeyframes) {
83*fb1b10abSAndroid Build Coastguard Worker cfg_.kf_mode = VPX_KF_DISABLED;
84*fb1b10abSAndroid Build Coastguard Worker kf_count_max_ = 1; // early exit failed tests.
85*fb1b10abSAndroid Build Coastguard Worker
86*fb1b10abSAndroid Build Coastguard Worker ::libvpx_test::RandomVideoSource video;
87*fb1b10abSAndroid Build Coastguard Worker ASSERT_NO_FATAL_FAILURE(RunLoop(&video));
88*fb1b10abSAndroid Build Coastguard Worker
89*fb1b10abSAndroid Build Coastguard Worker EXPECT_EQ(1, kf_count_);
90*fb1b10abSAndroid Build Coastguard Worker }
91*fb1b10abSAndroid Build Coastguard Worker
TEST_P(KeyframeTest,TestForceKeyframe)92*fb1b10abSAndroid Build Coastguard Worker TEST_P(KeyframeTest, TestForceKeyframe) {
93*fb1b10abSAndroid Build Coastguard Worker cfg_.kf_mode = VPX_KF_DISABLED;
94*fb1b10abSAndroid Build Coastguard Worker kf_do_force_kf_ = true;
95*fb1b10abSAndroid Build Coastguard Worker
96*fb1b10abSAndroid Build Coastguard Worker ::libvpx_test::DummyVideoSource video;
97*fb1b10abSAndroid Build Coastguard Worker ASSERT_NO_FATAL_FAILURE(RunLoop(&video));
98*fb1b10abSAndroid Build Coastguard Worker
99*fb1b10abSAndroid Build Coastguard Worker // verify that every third frame is a keyframe.
100*fb1b10abSAndroid Build Coastguard Worker for (std::vector<vpx_codec_pts_t>::const_iterator iter = kf_pts_list_.begin();
101*fb1b10abSAndroid Build Coastguard Worker iter != kf_pts_list_.end(); ++iter) {
102*fb1b10abSAndroid Build Coastguard Worker ASSERT_EQ(0, *iter % 3) << "Unexpected keyframe at frame " << *iter;
103*fb1b10abSAndroid Build Coastguard Worker }
104*fb1b10abSAndroid Build Coastguard Worker }
105*fb1b10abSAndroid Build Coastguard Worker
TEST_P(KeyframeTest,TestKeyframeMaxDistance)106*fb1b10abSAndroid Build Coastguard Worker TEST_P(KeyframeTest, TestKeyframeMaxDistance) {
107*fb1b10abSAndroid Build Coastguard Worker cfg_.kf_max_dist = 25;
108*fb1b10abSAndroid Build Coastguard Worker
109*fb1b10abSAndroid Build Coastguard Worker ::libvpx_test::DummyVideoSource video;
110*fb1b10abSAndroid Build Coastguard Worker ASSERT_NO_FATAL_FAILURE(RunLoop(&video));
111*fb1b10abSAndroid Build Coastguard Worker
112*fb1b10abSAndroid Build Coastguard Worker // verify that keyframe interval matches kf_max_dist
113*fb1b10abSAndroid Build Coastguard Worker for (std::vector<vpx_codec_pts_t>::const_iterator iter = kf_pts_list_.begin();
114*fb1b10abSAndroid Build Coastguard Worker iter != kf_pts_list_.end(); ++iter) {
115*fb1b10abSAndroid Build Coastguard Worker ASSERT_EQ(0, *iter % 25) << "Unexpected keyframe at frame " << *iter;
116*fb1b10abSAndroid Build Coastguard Worker }
117*fb1b10abSAndroid Build Coastguard Worker }
118*fb1b10abSAndroid Build Coastguard Worker
TEST_P(KeyframeTest,TestAutoKeyframe)119*fb1b10abSAndroid Build Coastguard Worker TEST_P(KeyframeTest, TestAutoKeyframe) {
120*fb1b10abSAndroid Build Coastguard Worker cfg_.kf_mode = VPX_KF_AUTO;
121*fb1b10abSAndroid Build Coastguard Worker kf_do_force_kf_ = false;
122*fb1b10abSAndroid Build Coastguard Worker
123*fb1b10abSAndroid Build Coastguard Worker // Force a deterministic speed step in Real Time mode, as the faster modes
124*fb1b10abSAndroid Build Coastguard Worker // may not produce a keyframe like we expect. This is necessary when running
125*fb1b10abSAndroid Build Coastguard Worker // on very slow environments (like Valgrind). The step -11 was determined
126*fb1b10abSAndroid Build Coastguard Worker // experimentally as the fastest mode that still throws the keyframe.
127*fb1b10abSAndroid Build Coastguard Worker if (deadline_ == VPX_DL_REALTIME) set_cpu_used_ = -11;
128*fb1b10abSAndroid Build Coastguard Worker
129*fb1b10abSAndroid Build Coastguard Worker // This clip has a cut scene every 30 frames -> Frame 0, 30, 60, 90, 120.
130*fb1b10abSAndroid Build Coastguard Worker // I check only the first 40 frames to make sure there's a keyframe at frame
131*fb1b10abSAndroid Build Coastguard Worker // 0 and 30.
132*fb1b10abSAndroid Build Coastguard Worker ::libvpx_test::I420VideoSource video("hantro_collage_w352h288.yuv", 352, 288,
133*fb1b10abSAndroid Build Coastguard Worker 30, 1, 0, 40);
134*fb1b10abSAndroid Build Coastguard Worker
135*fb1b10abSAndroid Build Coastguard Worker ASSERT_NO_FATAL_FAILURE(RunLoop(&video));
136*fb1b10abSAndroid Build Coastguard Worker
137*fb1b10abSAndroid Build Coastguard Worker // In realtime mode - auto placed keyframes are exceedingly rare, don't
138*fb1b10abSAndroid Build Coastguard Worker // bother with this check
139*fb1b10abSAndroid Build Coastguard Worker if (GET_PARAM(1) > 0) {
140*fb1b10abSAndroid Build Coastguard Worker EXPECT_EQ(2u, kf_pts_list_.size()) << " Not the right number of keyframes ";
141*fb1b10abSAndroid Build Coastguard Worker }
142*fb1b10abSAndroid Build Coastguard Worker
143*fb1b10abSAndroid Build Coastguard Worker // Verify that keyframes match the file keyframes in the file.
144*fb1b10abSAndroid Build Coastguard Worker for (std::vector<vpx_codec_pts_t>::const_iterator iter = kf_pts_list_.begin();
145*fb1b10abSAndroid Build Coastguard Worker iter != kf_pts_list_.end(); ++iter) {
146*fb1b10abSAndroid Build Coastguard Worker if (deadline_ == VPX_DL_REALTIME && *iter > 0)
147*fb1b10abSAndroid Build Coastguard Worker EXPECT_EQ(0, (*iter - 1) % 30)
148*fb1b10abSAndroid Build Coastguard Worker << "Unexpected keyframe at frame " << *iter;
149*fb1b10abSAndroid Build Coastguard Worker else
150*fb1b10abSAndroid Build Coastguard Worker EXPECT_EQ(0, *iter % 30) << "Unexpected keyframe at frame " << *iter;
151*fb1b10abSAndroid Build Coastguard Worker }
152*fb1b10abSAndroid Build Coastguard Worker }
153*fb1b10abSAndroid Build Coastguard Worker
154*fb1b10abSAndroid Build Coastguard Worker VP8_INSTANTIATE_TEST_SUITE(KeyframeTest, ALL_TEST_MODES);
155*fb1b10abSAndroid Build Coastguard Worker
IsVP9(vpx_codec_iface_t * iface)156*fb1b10abSAndroid Build Coastguard Worker bool IsVP9(vpx_codec_iface_t *iface) {
157*fb1b10abSAndroid Build Coastguard Worker static const char kVP9Name[] = "WebM Project VP9";
158*fb1b10abSAndroid Build Coastguard Worker return strncmp(kVP9Name, vpx_codec_iface_name(iface), sizeof(kVP9Name) - 1) ==
159*fb1b10abSAndroid Build Coastguard Worker 0;
160*fb1b10abSAndroid Build Coastguard Worker }
161*fb1b10abSAndroid Build Coastguard Worker
CreateGrayImage(vpx_img_fmt_t fmt,unsigned int w,unsigned int h)162*fb1b10abSAndroid Build Coastguard Worker vpx_image_t *CreateGrayImage(vpx_img_fmt_t fmt, unsigned int w,
163*fb1b10abSAndroid Build Coastguard Worker unsigned int h) {
164*fb1b10abSAndroid Build Coastguard Worker vpx_image_t *const image = vpx_img_alloc(nullptr, fmt, w, h, 1);
165*fb1b10abSAndroid Build Coastguard Worker if (!image) return image;
166*fb1b10abSAndroid Build Coastguard Worker
167*fb1b10abSAndroid Build Coastguard Worker for (unsigned int i = 0; i < image->d_h; ++i) {
168*fb1b10abSAndroid Build Coastguard Worker memset(image->planes[0] + i * image->stride[0], 128, image->d_w);
169*fb1b10abSAndroid Build Coastguard Worker }
170*fb1b10abSAndroid Build Coastguard Worker const unsigned int uv_h = (image->d_h + 1) / 2;
171*fb1b10abSAndroid Build Coastguard Worker const unsigned int uv_w = (image->d_w + 1) / 2;
172*fb1b10abSAndroid Build Coastguard Worker for (unsigned int i = 0; i < uv_h; ++i) {
173*fb1b10abSAndroid Build Coastguard Worker memset(image->planes[1] + i * image->stride[1], 128, uv_w);
174*fb1b10abSAndroid Build Coastguard Worker memset(image->planes[2] + i * image->stride[2], 128, uv_w);
175*fb1b10abSAndroid Build Coastguard Worker }
176*fb1b10abSAndroid Build Coastguard Worker return image;
177*fb1b10abSAndroid Build Coastguard Worker }
178*fb1b10abSAndroid Build Coastguard Worker
179*fb1b10abSAndroid Build Coastguard Worker // Tests kf_max_dist in one-pass encoding with zero lag.
TestKeyframeMaximumInterval(vpx_codec_iface_t * iface,vpx_enc_deadline_t deadline,unsigned int kf_max_dist)180*fb1b10abSAndroid Build Coastguard Worker void TestKeyframeMaximumInterval(vpx_codec_iface_t *iface,
181*fb1b10abSAndroid Build Coastguard Worker vpx_enc_deadline_t deadline,
182*fb1b10abSAndroid Build Coastguard Worker unsigned int kf_max_dist) {
183*fb1b10abSAndroid Build Coastguard Worker vpx_codec_enc_cfg_t cfg;
184*fb1b10abSAndroid Build Coastguard Worker ASSERT_EQ(vpx_codec_enc_config_default(iface, &cfg, /*usage=*/0),
185*fb1b10abSAndroid Build Coastguard Worker VPX_CODEC_OK);
186*fb1b10abSAndroid Build Coastguard Worker cfg.g_w = 320;
187*fb1b10abSAndroid Build Coastguard Worker cfg.g_h = 240;
188*fb1b10abSAndroid Build Coastguard Worker cfg.g_pass = VPX_RC_ONE_PASS;
189*fb1b10abSAndroid Build Coastguard Worker cfg.g_lag_in_frames = 0;
190*fb1b10abSAndroid Build Coastguard Worker cfg.kf_mode = VPX_KF_AUTO;
191*fb1b10abSAndroid Build Coastguard Worker cfg.kf_min_dist = 0;
192*fb1b10abSAndroid Build Coastguard Worker cfg.kf_max_dist = kf_max_dist;
193*fb1b10abSAndroid Build Coastguard Worker
194*fb1b10abSAndroid Build Coastguard Worker vpx_codec_ctx_t enc;
195*fb1b10abSAndroid Build Coastguard Worker ASSERT_EQ(vpx_codec_enc_init(&enc, iface, &cfg, 0), VPX_CODEC_OK);
196*fb1b10abSAndroid Build Coastguard Worker
197*fb1b10abSAndroid Build Coastguard Worker const int speed = IsVP9(iface) ? 9 : -12;
198*fb1b10abSAndroid Build Coastguard Worker ASSERT_EQ(vpx_codec_control(&enc, VP8E_SET_CPUUSED, speed), VPX_CODEC_OK);
199*fb1b10abSAndroid Build Coastguard Worker
200*fb1b10abSAndroid Build Coastguard Worker vpx_image_t *image = CreateGrayImage(VPX_IMG_FMT_I420, cfg.g_w, cfg.g_h);
201*fb1b10abSAndroid Build Coastguard Worker ASSERT_NE(image, nullptr);
202*fb1b10abSAndroid Build Coastguard Worker
203*fb1b10abSAndroid Build Coastguard Worker // Encode frames.
204*fb1b10abSAndroid Build Coastguard Worker const vpx_codec_cx_pkt_t *pkt;
205*fb1b10abSAndroid Build Coastguard Worker const unsigned int num_frames = kf_max_dist == 0 ? 4 : 3 * kf_max_dist + 1;
206*fb1b10abSAndroid Build Coastguard Worker for (unsigned int i = 0; i < num_frames; ++i) {
207*fb1b10abSAndroid Build Coastguard Worker ASSERT_EQ(vpx_codec_encode(&enc, image, i, 1, 0, deadline), VPX_CODEC_OK);
208*fb1b10abSAndroid Build Coastguard Worker vpx_codec_iter_t iter = nullptr;
209*fb1b10abSAndroid Build Coastguard Worker while ((pkt = vpx_codec_get_cx_data(&enc, &iter)) != nullptr) {
210*fb1b10abSAndroid Build Coastguard Worker ASSERT_EQ(pkt->kind, VPX_CODEC_CX_FRAME_PKT);
211*fb1b10abSAndroid Build Coastguard Worker if (kf_max_dist == 0 || i % kf_max_dist == 0) {
212*fb1b10abSAndroid Build Coastguard Worker ASSERT_EQ(pkt->data.frame.flags & VPX_FRAME_IS_KEY, VPX_FRAME_IS_KEY);
213*fb1b10abSAndroid Build Coastguard Worker } else {
214*fb1b10abSAndroid Build Coastguard Worker ASSERT_EQ(pkt->data.frame.flags & VPX_FRAME_IS_KEY, 0u);
215*fb1b10abSAndroid Build Coastguard Worker }
216*fb1b10abSAndroid Build Coastguard Worker }
217*fb1b10abSAndroid Build Coastguard Worker }
218*fb1b10abSAndroid Build Coastguard Worker
219*fb1b10abSAndroid Build Coastguard Worker // Flush the encoder.
220*fb1b10abSAndroid Build Coastguard Worker bool got_data;
221*fb1b10abSAndroid Build Coastguard Worker do {
222*fb1b10abSAndroid Build Coastguard Worker ASSERT_EQ(vpx_codec_encode(&enc, nullptr, 0, 1, 0, deadline), VPX_CODEC_OK);
223*fb1b10abSAndroid Build Coastguard Worker got_data = false;
224*fb1b10abSAndroid Build Coastguard Worker vpx_codec_iter_t iter = nullptr;
225*fb1b10abSAndroid Build Coastguard Worker while ((pkt = vpx_codec_get_cx_data(&enc, &iter)) != nullptr) {
226*fb1b10abSAndroid Build Coastguard Worker ASSERT_EQ(pkt->kind, VPX_CODEC_CX_FRAME_PKT);
227*fb1b10abSAndroid Build Coastguard Worker got_data = true;
228*fb1b10abSAndroid Build Coastguard Worker }
229*fb1b10abSAndroid Build Coastguard Worker } while (got_data);
230*fb1b10abSAndroid Build Coastguard Worker
231*fb1b10abSAndroid Build Coastguard Worker vpx_img_free(image);
232*fb1b10abSAndroid Build Coastguard Worker ASSERT_EQ(vpx_codec_destroy(&enc), VPX_CODEC_OK);
233*fb1b10abSAndroid Build Coastguard Worker }
234*fb1b10abSAndroid Build Coastguard Worker
TEST(KeyframeIntervalTest,KeyframeMaximumInterval)235*fb1b10abSAndroid Build Coastguard Worker TEST(KeyframeIntervalTest, KeyframeMaximumInterval) {
236*fb1b10abSAndroid Build Coastguard Worker std::vector<vpx_codec_iface_t *> ifaces;
237*fb1b10abSAndroid Build Coastguard Worker #if CONFIG_VP8_ENCODER
238*fb1b10abSAndroid Build Coastguard Worker ifaces.push_back(vpx_codec_vp8_cx());
239*fb1b10abSAndroid Build Coastguard Worker #endif
240*fb1b10abSAndroid Build Coastguard Worker #if CONFIG_VP9_ENCODER
241*fb1b10abSAndroid Build Coastguard Worker ifaces.push_back(vpx_codec_vp9_cx());
242*fb1b10abSAndroid Build Coastguard Worker #endif
243*fb1b10abSAndroid Build Coastguard Worker for (vpx_codec_iface_t *iface : ifaces) {
244*fb1b10abSAndroid Build Coastguard Worker for (vpx_enc_deadline_t deadline :
245*fb1b10abSAndroid Build Coastguard Worker { VPX_DL_REALTIME, VPX_DL_GOOD_QUALITY, VPX_DL_BEST_QUALITY }) {
246*fb1b10abSAndroid Build Coastguard Worker // Test 0 and 1 (both mean all intra), some powers of 2, some multiples
247*fb1b10abSAndroid Build Coastguard Worker // of 10, and some prime numbers.
248*fb1b10abSAndroid Build Coastguard Worker for (unsigned int kf_max_dist :
249*fb1b10abSAndroid Build Coastguard Worker { 0, 1, 2, 3, 4, 7, 10, 13, 16, 20, 23, 29, 32 }) {
250*fb1b10abSAndroid Build Coastguard Worker TestKeyframeMaximumInterval(iface, deadline, kf_max_dist);
251*fb1b10abSAndroid Build Coastguard Worker }
252*fb1b10abSAndroid Build Coastguard Worker }
253*fb1b10abSAndroid Build Coastguard Worker }
254*fb1b10abSAndroid Build Coastguard Worker }
255*fb1b10abSAndroid Build Coastguard Worker
256*fb1b10abSAndroid Build Coastguard Worker } // namespace
257