blob: b955cee659e59abe1e41aa63efb709be99e9df93 [file] [log] [blame]
Ivan Maltz1ed0e1b2013-10-23 11:53:37 -07001/*
2 * Copyright (c) 2013 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
11#include <string>
12#include "third_party/googletest/src/include/gtest/gtest.h"
13#include "test/codec_factory.h"
14#include "test/decode_test_driver.h"
15#include "test/i420_video_source.h"
Minghai Shange1b5d242014-08-13 13:12:00 -070016
17#include "vp9/decoder/vp9_decoder.h"
18
Ivan Maltz1ed0e1b2013-10-23 11:53:37 -070019#include "vpx/svc_context.h"
20#include "vpx/vp8cx.h"
21#include "vpx/vpx_encoder.h"
22
23namespace {
24
25using libvpx_test::CodecFactory;
26using libvpx_test::Decoder;
Minghai Shange1b5d242014-08-13 13:12:00 -070027using libvpx_test::DxDataIterator;
Ivan Maltz1ed0e1b2013-10-23 11:53:37 -070028using libvpx_test::VP9CodecFactory;
29
30class SvcTest : public ::testing::Test {
31 protected:
32 static const uint32_t kWidth = 352;
33 static const uint32_t kHeight = 288;
34
35 SvcTest()
36 : codec_iface_(0),
37 test_file_name_("hantro_collage_w352h288.yuv"),
Ivan Maltzd2c8cb72013-11-11 13:55:34 -080038 codec_initialized_(false),
39 decoder_(0) {
40 memset(&svc_, 0, sizeof(svc_));
41 memset(&codec_, 0, sizeof(codec_));
42 memset(&codec_enc_, 0, sizeof(codec_enc_));
43 }
Ivan Maltz1ed0e1b2013-10-23 11:53:37 -070044
45 virtual ~SvcTest() {}
46
47 virtual void SetUp() {
Ivan Maltz1ed0e1b2013-10-23 11:53:37 -070048 svc_.log_level = SVC_LOG_DEBUG;
49 svc_.log_print = 0;
50
51 codec_iface_ = vpx_codec_vp9_cx();
52 const vpx_codec_err_t res =
53 vpx_codec_enc_config_default(codec_iface_, &codec_enc_, 0);
54 EXPECT_EQ(VPX_CODEC_OK, res);
55
56 codec_enc_.g_w = kWidth;
57 codec_enc_.g_h = kHeight;
58 codec_enc_.g_timebase.num = 1;
59 codec_enc_.g_timebase.den = 60;
60 codec_enc_.kf_min_dist = 100;
61 codec_enc_.kf_max_dist = 100;
62
James Zernb4b191a2014-08-22 12:16:20 -070063 vpx_codec_dec_cfg_t dec_cfg = vpx_codec_dec_cfg_t();
Ivan Maltz1ed0e1b2013-10-23 11:53:37 -070064 VP9CodecFactory codec_factory;
65 decoder_ = codec_factory.CreateDecoder(dec_cfg, 0);
Minghai Shang4aa92552015-04-15 14:59:17 -070066
67 tile_columns_ = 0;
68 tile_rows_ = 0;
Ivan Maltz1ed0e1b2013-10-23 11:53:37 -070069 }
70
71 virtual void TearDown() {
Minghai Shange1b5d242014-08-13 13:12:00 -070072 ReleaseEncoder();
Ivan Maltzd2c8cb72013-11-11 13:55:34 -080073 delete(decoder_);
Minghai Shange1b5d242014-08-13 13:12:00 -070074 }
75
76 void InitializeEncoder() {
77 const vpx_codec_err_t res =
78 vpx_svc_init(&svc_, &codec_, vpx_codec_vp9_cx(), &codec_enc_);
79 EXPECT_EQ(VPX_CODEC_OK, res);
Minghai Shang12aaff52014-09-11 10:52:26 -070080 vpx_codec_control(&codec_, VP8E_SET_CPUUSED, 4); // Make the test faster
Minghai Shang4aa92552015-04-15 14:59:17 -070081 vpx_codec_control(&codec_, VP9E_SET_TILE_COLUMNS, tile_columns_);
82 vpx_codec_control(&codec_, VP9E_SET_TILE_ROWS, tile_rows_);
Minghai Shange1b5d242014-08-13 13:12:00 -070083 codec_initialized_ = true;
84 }
85
86 void ReleaseEncoder() {
87 vpx_svc_release(&svc_);
Ivan Maltzd2c8cb72013-11-11 13:55:34 -080088 if (codec_initialized_) vpx_codec_destroy(&codec_);
Minghai Shange1b5d242014-08-13 13:12:00 -070089 codec_initialized_ = false;
90 }
91
Minghai Shang12aaff52014-09-11 10:52:26 -070092 void GetStatsData(std::string *const stats_buf) {
93 vpx_codec_iter_t iter = NULL;
94 const vpx_codec_cx_pkt_t *cx_pkt;
95
96 while ((cx_pkt = vpx_codec_get_cx_data(&codec_, &iter)) != NULL) {
97 if (cx_pkt->kind == VPX_CODEC_STATS_PKT) {
98 EXPECT_GT(cx_pkt->data.twopass_stats.sz, 0U);
99 ASSERT_TRUE(cx_pkt->data.twopass_stats.buf != NULL);
100 stats_buf->append(static_cast<char*>(cx_pkt->data.twopass_stats.buf),
101 cx_pkt->data.twopass_stats.sz);
102 }
103 }
104 }
105
Minghai Shange1b5d242014-08-13 13:12:00 -0700106 void Pass1EncodeNFrames(const int n, const int layers,
107 std::string *const stats_buf) {
108 vpx_codec_err_t res;
Minghai Shange1b5d242014-08-13 13:12:00 -0700109
110 ASSERT_GT(n, 0);
111 ASSERT_GT(layers, 0);
112 svc_.spatial_layers = layers;
113 codec_enc_.g_pass = VPX_RC_FIRST_PASS;
114 InitializeEncoder();
115
Minghai Shang4aa92552015-04-15 14:59:17 -0700116 libvpx_test::I420VideoSource video(test_file_name_,
117 codec_enc_.g_w, codec_enc_.g_h,
Minghai Shange1b5d242014-08-13 13:12:00 -0700118 codec_enc_.g_timebase.den,
119 codec_enc_.g_timebase.num, 0, 30);
120 video.Begin();
121
122 for (int i = 0; i < n; ++i) {
123 res = vpx_svc_encode(&svc_, &codec_, video.img(), video.pts(),
124 video.duration(), VPX_DL_GOOD_QUALITY);
125 ASSERT_EQ(VPX_CODEC_OK, res);
Minghai Shang12aaff52014-09-11 10:52:26 -0700126 GetStatsData(stats_buf);
Minghai Shange1b5d242014-08-13 13:12:00 -0700127 video.Next();
128 }
129
Minghai Shangd4a407c2014-08-18 14:51:04 -0700130 // Flush encoder and test EOS packet.
Minghai Shange1b5d242014-08-13 13:12:00 -0700131 res = vpx_svc_encode(&svc_, &codec_, NULL, video.pts(),
132 video.duration(), VPX_DL_GOOD_QUALITY);
Minghai Shang12aaff52014-09-11 10:52:26 -0700133 ASSERT_EQ(VPX_CODEC_OK, res);
134 GetStatsData(stats_buf);
Minghai Shange1b5d242014-08-13 13:12:00 -0700135
136 ReleaseEncoder();
137 }
138
139 void StoreFrames(const size_t max_frame_received,
140 struct vpx_fixed_buf *const outputs,
141 size_t *const frame_received) {
Minghai Shang12aaff52014-09-11 10:52:26 -0700142 vpx_codec_iter_t iter = NULL;
143 const vpx_codec_cx_pkt_t *cx_pkt;
Minghai Shange1b5d242014-08-13 13:12:00 -0700144
Minghai Shang12aaff52014-09-11 10:52:26 -0700145 while ((cx_pkt = vpx_codec_get_cx_data(&codec_, &iter)) != NULL) {
146 if (cx_pkt->kind == VPX_CODEC_CX_FRAME_PKT) {
147 const size_t frame_size = cx_pkt->data.frame.sz;
148
149 EXPECT_GT(frame_size, 0U);
150 ASSERT_TRUE(cx_pkt->data.frame.buf != NULL);
151 ASSERT_LT(*frame_received, max_frame_received);
152
153 if (*frame_received == 0)
154 EXPECT_EQ(1, !!(cx_pkt->data.frame.flags & VPX_FRAME_IS_KEY));
155
156 outputs[*frame_received].buf = malloc(frame_size + 16);
157 ASSERT_TRUE(outputs[*frame_received].buf != NULL);
158 memcpy(outputs[*frame_received].buf, cx_pkt->data.frame.buf,
159 frame_size);
160 outputs[*frame_received].sz = frame_size;
161 ++(*frame_received);
Minghai Shange1b5d242014-08-13 13:12:00 -0700162 }
Minghai Shange1b5d242014-08-13 13:12:00 -0700163 }
164 }
165
166 void Pass2EncodeNFrames(std::string *const stats_buf,
167 const int n, const int layers,
168 struct vpx_fixed_buf *const outputs) {
169 vpx_codec_err_t res;
170 size_t frame_received = 0;
171
172 ASSERT_TRUE(outputs != NULL);
173 ASSERT_GT(n, 0);
174 ASSERT_GT(layers, 0);
175 svc_.spatial_layers = layers;
176 codec_enc_.rc_target_bitrate = 500;
177 if (codec_enc_.g_pass == VPX_RC_LAST_PASS) {
178 ASSERT_TRUE(stats_buf != NULL);
179 ASSERT_GT(stats_buf->size(), 0U);
180 codec_enc_.rc_twopass_stats_in.buf = &(*stats_buf)[0];
181 codec_enc_.rc_twopass_stats_in.sz = stats_buf->size();
182 }
183 InitializeEncoder();
184
Minghai Shang4aa92552015-04-15 14:59:17 -0700185 libvpx_test::I420VideoSource video(test_file_name_,
186 codec_enc_.g_w, codec_enc_.g_h,
Minghai Shange1b5d242014-08-13 13:12:00 -0700187 codec_enc_.g_timebase.den,
188 codec_enc_.g_timebase.num, 0, 30);
189 video.Begin();
190
191 for (int i = 0; i < n; ++i) {
192 res = vpx_svc_encode(&svc_, &codec_, video.img(), video.pts(),
193 video.duration(), VPX_DL_GOOD_QUALITY);
194 ASSERT_EQ(VPX_CODEC_OK, res);
195 StoreFrames(n, outputs, &frame_received);
196 video.Next();
197 }
198
Minghai Shangd4a407c2014-08-18 14:51:04 -0700199 // Flush encoder.
Minghai Shange1b5d242014-08-13 13:12:00 -0700200 res = vpx_svc_encode(&svc_, &codec_, NULL, 0,
201 video.duration(), VPX_DL_GOOD_QUALITY);
202 EXPECT_EQ(VPX_CODEC_OK, res);
203 StoreFrames(n, outputs, &frame_received);
204
Minghai Shangd4a407c2014-08-18 14:51:04 -0700205 EXPECT_EQ(frame_received, static_cast<size_t>(n));
Minghai Shange1b5d242014-08-13 13:12:00 -0700206
207 ReleaseEncoder();
208 }
209
210 void DecodeNFrames(const struct vpx_fixed_buf *const inputs, const int n) {
211 int decoded_frames = 0;
212 int received_frames = 0;
213
214 ASSERT_TRUE(inputs != NULL);
215 ASSERT_GT(n, 0);
216
217 for (int i = 0; i < n; ++i) {
218 ASSERT_TRUE(inputs[i].buf != NULL);
219 ASSERT_GT(inputs[i].sz, 0U);
220 const vpx_codec_err_t res_dec =
221 decoder_->DecodeFrame(static_cast<const uint8_t *>(inputs[i].buf),
222 inputs[i].sz);
223 ASSERT_EQ(VPX_CODEC_OK, res_dec) << decoder_->DecodeError();
224 ++decoded_frames;
225
226 DxDataIterator dec_iter = decoder_->GetDxData();
Minghai Shangd4a407c2014-08-18 14:51:04 -0700227 while (dec_iter.Next() != NULL) {
Minghai Shange1b5d242014-08-13 13:12:00 -0700228 ++received_frames;
229 }
230 }
231 EXPECT_EQ(decoded_frames, n);
232 EXPECT_EQ(received_frames, n);
233 }
234
Minghai Shang68b550f2014-10-14 16:25:03 -0700235 void DropEnhancementLayers(struct vpx_fixed_buf *const inputs,
236 const int num_super_frames,
237 const int remained_spatial_layers) {
Minghai Shange1b5d242014-08-13 13:12:00 -0700238 ASSERT_TRUE(inputs != NULL);
239 ASSERT_GT(num_super_frames, 0);
Minghai Shangbe3b08d2014-09-02 12:05:14 -0700240 ASSERT_GT(remained_spatial_layers, 0);
Minghai Shange1b5d242014-08-13 13:12:00 -0700241
242 for (int i = 0; i < num_super_frames; ++i) {
243 uint32_t frame_sizes[8] = {0};
244 int frame_count = 0;
245 int frames_found = 0;
246 int frame;
247 ASSERT_TRUE(inputs[i].buf != NULL);
248 ASSERT_GT(inputs[i].sz, 0U);
249
250 vpx_codec_err_t res =
251 vp9_parse_superframe_index(static_cast<const uint8_t*>(inputs[i].buf),
252 inputs[i].sz, frame_sizes, &frame_count,
253 NULL, NULL);
254 ASSERT_EQ(VPX_CODEC_OK, res);
255
Minghai Shangbe3b08d2014-09-02 12:05:14 -0700256 if (frame_count == 0) {
257 // There's no super frame but only a single frame.
258 ASSERT_EQ(1, remained_spatial_layers);
Minghai Shangbe3b08d2014-09-02 12:05:14 -0700259 } else {
260 // Found a super frame.
261 uint8_t *frame_data = static_cast<uint8_t*>(inputs[i].buf);
262 uint8_t *frame_start = frame_data;
263 for (frame = 0; frame < frame_count; ++frame) {
264 // Looking for a visible frame.
265 if (frame_data[0] & 0x02) {
266 ++frames_found;
267 if (frames_found == remained_spatial_layers)
268 break;
269 }
270 frame_data += frame_sizes[frame];
271 }
272 ASSERT_LT(frame, frame_count) << "Couldn't find a visible frame. "
273 << "remained_spatial_layers: " << remained_spatial_layers
Minghai Shang68b550f2014-10-14 16:25:03 -0700274 << " super_frame: " << i;
275 if (frame == frame_count - 1)
Minghai Shangbe3b08d2014-09-02 12:05:14 -0700276 continue;
277
Minghai Shange1b5d242014-08-13 13:12:00 -0700278 frame_data += frame_sizes[frame];
Minghai Shange1b5d242014-08-13 13:12:00 -0700279
Minghai Shangbe3b08d2014-09-02 12:05:14 -0700280 // We need to add one more frame for multiple frame contexts.
Minghai Shangbe3b08d2014-09-02 12:05:14 -0700281 uint8_t marker =
282 static_cast<const uint8_t*>(inputs[i].buf)[inputs[i].sz - 1];
283 const uint32_t mag = ((marker >> 3) & 0x3) + 1;
284 const size_t index_sz = 2 + mag * frame_count;
285 const size_t new_index_sz = 2 + mag * (frame + 1);
286 marker &= 0x0f8;
287 marker |= frame;
Minghai Shangd4a407c2014-08-18 14:51:04 -0700288
Minghai Shangbe3b08d2014-09-02 12:05:14 -0700289 // Copy existing frame sizes.
Minghai Shang68b550f2014-10-14 16:25:03 -0700290 memmove(frame_data + 1, frame_start + inputs[i].sz - index_sz + 1,
291 new_index_sz - 2);
Minghai Shangbe3b08d2014-09-02 12:05:14 -0700292 // New marker.
293 frame_data[0] = marker;
294 frame_data += (mag * (frame + 1) + 1);
Minghai Shangd4a407c2014-08-18 14:51:04 -0700295
Minghai Shangbe3b08d2014-09-02 12:05:14 -0700296 *frame_data++ = marker;
297 inputs[i].sz = frame_data - frame_start;
Minghai Shangd4a407c2014-08-18 14:51:04 -0700298 }
Minghai Shange1b5d242014-08-13 13:12:00 -0700299 }
300 }
301
302 void FreeBitstreamBuffers(struct vpx_fixed_buf *const inputs, const int n) {
303 ASSERT_TRUE(inputs != NULL);
304 ASSERT_GT(n, 0);
305
306 for (int i = 0; i < n; ++i) {
307 free(inputs[i].buf);
308 inputs[i].buf = NULL;
309 inputs[i].sz = 0;
310 }
Ivan Maltz1ed0e1b2013-10-23 11:53:37 -0700311 }
312
313 SvcContext svc_;
314 vpx_codec_ctx_t codec_;
315 struct vpx_codec_enc_cfg codec_enc_;
316 vpx_codec_iface_t *codec_iface_;
317 std::string test_file_name_;
Ivan Maltzd2c8cb72013-11-11 13:55:34 -0800318 bool codec_initialized_;
Ivan Maltz1ed0e1b2013-10-23 11:53:37 -0700319 Decoder *decoder_;
Minghai Shang4aa92552015-04-15 14:59:17 -0700320 int tile_columns_;
321 int tile_rows_;
Ivan Maltz1ed0e1b2013-10-23 11:53:37 -0700322};
323
324TEST_F(SvcTest, SvcInit) {
Ivan Maltzd2c8cb72013-11-11 13:55:34 -0800325 // test missing parameters
326 vpx_codec_err_t res = vpx_svc_init(NULL, &codec_, codec_iface_, &codec_enc_);
Ivan Maltz1ed0e1b2013-10-23 11:53:37 -0700327 EXPECT_EQ(VPX_CODEC_INVALID_PARAM, res);
Ivan Maltz1ed0e1b2013-10-23 11:53:37 -0700328 res = vpx_svc_init(&svc_, NULL, codec_iface_, &codec_enc_);
329 EXPECT_EQ(VPX_CODEC_INVALID_PARAM, res);
Ivan Maltz1ed0e1b2013-10-23 11:53:37 -0700330 res = vpx_svc_init(&svc_, &codec_, NULL, &codec_enc_);
331 EXPECT_EQ(VPX_CODEC_INVALID_PARAM, res);
332
333 res = vpx_svc_init(&svc_, &codec_, codec_iface_, NULL);
334 EXPECT_EQ(VPX_CODEC_INVALID_PARAM, res);
335
336 svc_.spatial_layers = 6; // too many layers
337 res = vpx_svc_init(&svc_, &codec_, codec_iface_, &codec_enc_);
338 EXPECT_EQ(VPX_CODEC_INVALID_PARAM, res);
339
Ivan Maltzd2c8cb72013-11-11 13:55:34 -0800340 svc_.spatial_layers = 0; // use default layers
Minghai Shange1b5d242014-08-13 13:12:00 -0700341 InitializeEncoder();
Ivan Maltzd2c8cb72013-11-11 13:55:34 -0800342 EXPECT_EQ(VPX_SS_DEFAULT_LAYERS, svc_.spatial_layers);
343}
344
345TEST_F(SvcTest, InitTwoLayers) {
Ivan Maltz1ed0e1b2013-10-23 11:53:37 -0700346 svc_.spatial_layers = 2;
Minghai Shange1b5d242014-08-13 13:12:00 -0700347 InitializeEncoder();
Ivan Maltz1ed0e1b2013-10-23 11:53:37 -0700348}
349
Ivan Maltzd2c8cb72013-11-11 13:55:34 -0800350TEST_F(SvcTest, InvalidOptions) {
351 vpx_codec_err_t res = vpx_svc_set_options(&svc_, NULL);
Ivan Maltz1ed0e1b2013-10-23 11:53:37 -0700352 EXPECT_EQ(VPX_CODEC_INVALID_PARAM, res);
353
Ivan Maltzd2c8cb72013-11-11 13:55:34 -0800354 res = vpx_svc_set_options(&svc_, "not-an-option=1");
355 EXPECT_EQ(VPX_CODEC_OK, res);
356 res = vpx_svc_init(&svc_, &codec_, vpx_codec_vp9_cx(), &codec_enc_);
Ivan Maltz1ed0e1b2013-10-23 11:53:37 -0700357 EXPECT_EQ(VPX_CODEC_INVALID_PARAM, res);
Ivan Maltzd2c8cb72013-11-11 13:55:34 -0800358}
Ivan Maltz1ed0e1b2013-10-23 11:53:37 -0700359
Ivan Maltzd2c8cb72013-11-11 13:55:34 -0800360TEST_F(SvcTest, SetLayersOption) {
Minghai Shangbe3b08d2014-09-02 12:05:14 -0700361 vpx_codec_err_t res = vpx_svc_set_options(&svc_, "spatial-layers=3");
Ivan Maltzd2c8cb72013-11-11 13:55:34 -0800362 EXPECT_EQ(VPX_CODEC_OK, res);
Minghai Shange1b5d242014-08-13 13:12:00 -0700363 InitializeEncoder();
Ivan Maltz1ed0e1b2013-10-23 11:53:37 -0700364 EXPECT_EQ(3, svc_.spatial_layers);
Ivan Maltzd2c8cb72013-11-11 13:55:34 -0800365}
Ivan Maltz1ed0e1b2013-10-23 11:53:37 -0700366
Ivan Maltzd2c8cb72013-11-11 13:55:34 -0800367TEST_F(SvcTest, SetMultipleOptions) {
Minghai Shangdf381962014-06-25 10:42:04 -0700368 vpx_codec_err_t res =
Minghai Shangbe3b08d2014-09-02 12:05:14 -0700369 vpx_svc_set_options(&svc_, "spatial-layers=2 scale-factors=1/3,2/3");
Ivan Maltz1ed0e1b2013-10-23 11:53:37 -0700370 EXPECT_EQ(VPX_CODEC_OK, res);
Minghai Shange1b5d242014-08-13 13:12:00 -0700371 InitializeEncoder();
Ivan Maltz1ed0e1b2013-10-23 11:53:37 -0700372 EXPECT_EQ(2, svc_.spatial_layers);
Ivan Maltzd2c8cb72013-11-11 13:55:34 -0800373}
Ivan Maltz1ed0e1b2013-10-23 11:53:37 -0700374
Ivan Maltzd2c8cb72013-11-11 13:55:34 -0800375TEST_F(SvcTest, SetScaleFactorsOption) {
376 svc_.spatial_layers = 2;
377 vpx_codec_err_t res =
378 vpx_svc_set_options(&svc_, "scale-factors=not-scale-factors");
379 EXPECT_EQ(VPX_CODEC_OK, res);
Ivan Maltz1ed0e1b2013-10-23 11:53:37 -0700380 res = vpx_svc_init(&svc_, &codec_, vpx_codec_vp9_cx(), &codec_enc_);
381 EXPECT_EQ(VPX_CODEC_INVALID_PARAM, res);
382
Minghai Shang76885de2014-09-17 17:39:16 -0700383 res = vpx_svc_set_options(&svc_, "scale-factors=1/3, 3*3");
384 EXPECT_EQ(VPX_CODEC_OK, res);
385 res = vpx_svc_init(&svc_, &codec_, vpx_codec_vp9_cx(), &codec_enc_);
386 EXPECT_EQ(VPX_CODEC_INVALID_PARAM, res);
387
388 res = vpx_svc_set_options(&svc_, "scale-factors=1/3");
389 EXPECT_EQ(VPX_CODEC_OK, res);
390 res = vpx_svc_init(&svc_, &codec_, vpx_codec_vp9_cx(), &codec_enc_);
391 EXPECT_EQ(VPX_CODEC_INVALID_PARAM, res);
392
Ivan Maltzd2c8cb72013-11-11 13:55:34 -0800393 res = vpx_svc_set_options(&svc_, "scale-factors=1/3,2/3");
394 EXPECT_EQ(VPX_CODEC_OK, res);
Minghai Shange1b5d242014-08-13 13:12:00 -0700395 InitializeEncoder();
Ivan Maltzd2c8cb72013-11-11 13:55:34 -0800396}
Ivan Maltz1ed0e1b2013-10-23 11:53:37 -0700397
Ivan Maltzd2c8cb72013-11-11 13:55:34 -0800398TEST_F(SvcTest, SetQuantizersOption) {
399 svc_.spatial_layers = 2;
Minghai Shang4f5b2b22014-09-18 11:10:11 -0700400 vpx_codec_err_t res = vpx_svc_set_options(&svc_, "max-quantizers=nothing");
Ivan Maltzd2c8cb72013-11-11 13:55:34 -0800401 EXPECT_EQ(VPX_CODEC_OK, res);
Ivan Maltz1ed0e1b2013-10-23 11:53:37 -0700402 res = vpx_svc_init(&svc_, &codec_, vpx_codec_vp9_cx(), &codec_enc_);
403 EXPECT_EQ(VPX_CODEC_INVALID_PARAM, res);
404
Minghai Shang4f5b2b22014-09-18 11:10:11 -0700405 res = vpx_svc_set_options(&svc_, "min-quantizers=nothing");
Minghai Shang76885de2014-09-17 17:39:16 -0700406 EXPECT_EQ(VPX_CODEC_OK, res);
407 res = vpx_svc_init(&svc_, &codec_, vpx_codec_vp9_cx(), &codec_enc_);
408 EXPECT_EQ(VPX_CODEC_INVALID_PARAM, res);
409
Minghai Shang4f5b2b22014-09-18 11:10:11 -0700410 res = vpx_svc_set_options(&svc_, "max-quantizers=40");
411 EXPECT_EQ(VPX_CODEC_OK, res);
412 res = vpx_svc_init(&svc_, &codec_, vpx_codec_vp9_cx(), &codec_enc_);
413 EXPECT_EQ(VPX_CODEC_INVALID_PARAM, res);
414
415 res = vpx_svc_set_options(&svc_, "min-quantizers=40");
416 EXPECT_EQ(VPX_CODEC_OK, res);
417 res = vpx_svc_init(&svc_, &codec_, vpx_codec_vp9_cx(), &codec_enc_);
418 EXPECT_EQ(VPX_CODEC_INVALID_PARAM, res);
419
420 res = vpx_svc_set_options(&svc_, "max-quantizers=30,30 min-quantizers=40,40");
421 EXPECT_EQ(VPX_CODEC_OK, res);
422 res = vpx_svc_init(&svc_, &codec_, vpx_codec_vp9_cx(), &codec_enc_);
423 EXPECT_EQ(VPX_CODEC_INVALID_PARAM, res);
424
425 res = vpx_svc_set_options(&svc_, "max-quantizers=40,40 min-quantizers=30,30");
Minghai Shange1b5d242014-08-13 13:12:00 -0700426 InitializeEncoder();
Ivan Maltz1ed0e1b2013-10-23 11:53:37 -0700427}
428
Minghai Shange8998592014-07-14 11:24:17 -0700429TEST_F(SvcTest, SetAutoAltRefOption) {
430 svc_.spatial_layers = 5;
431 vpx_codec_err_t res = vpx_svc_set_options(&svc_, "auto-alt-refs=none");
432 EXPECT_EQ(VPX_CODEC_OK, res);
433 res = vpx_svc_init(&svc_, &codec_, vpx_codec_vp9_cx(), &codec_enc_);
434 EXPECT_EQ(VPX_CODEC_INVALID_PARAM, res);
435
436 res = vpx_svc_set_options(&svc_, "auto-alt-refs=1,1,1,1,0");
437 EXPECT_EQ(VPX_CODEC_OK, res);
438 res = vpx_svc_init(&svc_, &codec_, vpx_codec_vp9_cx(), &codec_enc_);
439 EXPECT_EQ(VPX_CODEC_INVALID_PARAM, res);
440
441 vpx_svc_set_options(&svc_, "auto-alt-refs=0,1,1,1,0");
Minghai Shange1b5d242014-08-13 13:12:00 -0700442 InitializeEncoder();
Minghai Shange8998592014-07-14 11:24:17 -0700443}
444
Adrian Grange475d1d62013-11-20 09:49:33 -0800445// Test that decoder can handle an SVC frame as the first frame in a sequence.
Minghai Shange1b5d242014-08-13 13:12:00 -0700446TEST_F(SvcTest, OnePassEncodeOneFrame) {
447 codec_enc_.g_pass = VPX_RC_ONE_PASS;
448 vpx_fixed_buf output = {0};
449 Pass2EncodeNFrames(NULL, 1, 2, &output);
450 DecodeNFrames(&output, 1);
451 FreeBitstreamBuffers(&output, 1);
Ivan Maltz1ed0e1b2013-10-23 11:53:37 -0700452}
453
Minghai Shange1b5d242014-08-13 13:12:00 -0700454TEST_F(SvcTest, OnePassEncodeThreeFrames) {
455 codec_enc_.g_pass = VPX_RC_ONE_PASS;
Marcoc139b812015-05-21 16:15:37 -0700456 codec_enc_.g_lag_in_frames = 0;
Minghai Shange1b5d242014-08-13 13:12:00 -0700457 vpx_fixed_buf outputs[3];
458 memset(&outputs[0], 0, sizeof(outputs));
459 Pass2EncodeNFrames(NULL, 3, 2, &outputs[0]);
460 DecodeNFrames(&outputs[0], 3);
461 FreeBitstreamBuffers(&outputs[0], 3);
Ivan Maltz1ed0e1b2013-10-23 11:53:37 -0700462}
463
Minghai Shange1b5d242014-08-13 13:12:00 -0700464TEST_F(SvcTest, TwoPassEncode10Frames) {
Minghai Shang6b747762014-06-09 13:32:27 -0700465 // First pass encode
466 std::string stats_buf;
Minghai Shange1b5d242014-08-13 13:12:00 -0700467 Pass1EncodeNFrames(10, 2, &stats_buf);
Minghai Shang6b747762014-06-09 13:32:27 -0700468
469 // Second pass encode
Minghai Shang6b2e4062014-03-27 13:43:20 -0700470 codec_enc_.g_pass = VPX_RC_LAST_PASS;
Minghai Shange1b5d242014-08-13 13:12:00 -0700471 vpx_fixed_buf outputs[10];
472 memset(&outputs[0], 0, sizeof(outputs));
473 Pass2EncodeNFrames(&stats_buf, 10, 2, &outputs[0]);
474 DecodeNFrames(&outputs[0], 10);
475 FreeBitstreamBuffers(&outputs[0], 10);
476}
477
478TEST_F(SvcTest, TwoPassEncode20FramesWithAltRef) {
479 // First pass encode
480 std::string stats_buf;
481 Pass1EncodeNFrames(20, 2, &stats_buf);
482
483 // Second pass encode
484 codec_enc_.g_pass = VPX_RC_LAST_PASS;
Minghai Shange8998592014-07-14 11:24:17 -0700485 vpx_svc_set_options(&svc_, "auto-alt-refs=1,1");
Minghai Shange1b5d242014-08-13 13:12:00 -0700486 vpx_fixed_buf outputs[20];
487 memset(&outputs[0], 0, sizeof(outputs));
488 Pass2EncodeNFrames(&stats_buf, 20, 2, &outputs[0]);
489 DecodeNFrames(&outputs[0], 20);
490 FreeBitstreamBuffers(&outputs[0], 20);
491}
Minghai Shang6b2e4062014-03-27 13:43:20 -0700492
Minghai Shangbe3b08d2014-09-02 12:05:14 -0700493TEST_F(SvcTest, TwoPassEncode2SpatialLayersDecodeBaseLayerOnly) {
Minghai Shange1b5d242014-08-13 13:12:00 -0700494 // First pass encode
495 std::string stats_buf;
496 Pass1EncodeNFrames(10, 2, &stats_buf);
Minghai Shang9ee60872014-03-27 16:59:44 -0700497
Minghai Shange1b5d242014-08-13 13:12:00 -0700498 // Second pass encode
499 codec_enc_.g_pass = VPX_RC_LAST_PASS;
500 vpx_svc_set_options(&svc_, "auto-alt-refs=1,1");
501 vpx_fixed_buf outputs[10];
502 memset(&outputs[0], 0, sizeof(outputs));
503 Pass2EncodeNFrames(&stats_buf, 10, 2, &outputs[0]);
Minghai Shang68b550f2014-10-14 16:25:03 -0700504 DropEnhancementLayers(&outputs[0], 10, 1);
Minghai Shange1b5d242014-08-13 13:12:00 -0700505 DecodeNFrames(&outputs[0], 10);
506 FreeBitstreamBuffers(&outputs[0], 10);
507}
Minghai Shang9ee60872014-03-27 16:59:44 -0700508
Minghai Shangbe3b08d2014-09-02 12:05:14 -0700509TEST_F(SvcTest, TwoPassEncode5SpatialLayersDecode54321Layers) {
Minghai Shange1b5d242014-08-13 13:12:00 -0700510 // First pass encode
511 std::string stats_buf;
512 Pass1EncodeNFrames(10, 5, &stats_buf);
Minghai Shang9ee60872014-03-27 16:59:44 -0700513
Minghai Shange1b5d242014-08-13 13:12:00 -0700514 // Second pass encode
515 codec_enc_.g_pass = VPX_RC_LAST_PASS;
516 vpx_svc_set_options(&svc_, "auto-alt-refs=0,1,1,1,0");
517 vpx_fixed_buf outputs[10];
518 memset(&outputs[0], 0, sizeof(outputs));
519 Pass2EncodeNFrames(&stats_buf, 10, 5, &outputs[0]);
Minghai Shang9ee60872014-03-27 16:59:44 -0700520
Minghai Shange1b5d242014-08-13 13:12:00 -0700521 DecodeNFrames(&outputs[0], 10);
Minghai Shang68b550f2014-10-14 16:25:03 -0700522 DropEnhancementLayers(&outputs[0], 10, 4);
Minghai Shange1b5d242014-08-13 13:12:00 -0700523 DecodeNFrames(&outputs[0], 10);
Minghai Shang68b550f2014-10-14 16:25:03 -0700524 DropEnhancementLayers(&outputs[0], 10, 3);
Minghai Shange1b5d242014-08-13 13:12:00 -0700525 DecodeNFrames(&outputs[0], 10);
Minghai Shang68b550f2014-10-14 16:25:03 -0700526 DropEnhancementLayers(&outputs[0], 10, 2);
Minghai Shange1b5d242014-08-13 13:12:00 -0700527 DecodeNFrames(&outputs[0], 10);
Minghai Shang68b550f2014-10-14 16:25:03 -0700528 DropEnhancementLayers(&outputs[0], 10, 1);
Minghai Shange1b5d242014-08-13 13:12:00 -0700529 DecodeNFrames(&outputs[0], 10);
Minghai Shang9ee60872014-03-27 16:59:44 -0700530
Minghai Shange1b5d242014-08-13 13:12:00 -0700531 FreeBitstreamBuffers(&outputs[0], 10);
532}
Minghai Shang9ee60872014-03-27 16:59:44 -0700533
Minghai Shange1b5d242014-08-13 13:12:00 -0700534TEST_F(SvcTest, TwoPassEncode2SNRLayers) {
535 // First pass encode
536 std::string stats_buf;
537 vpx_svc_set_options(&svc_, "scale-factors=1/1,1/1");
538 Pass1EncodeNFrames(20, 2, &stats_buf);
Minghai Shang277338f2014-06-24 14:01:17 -0700539
Minghai Shange1b5d242014-08-13 13:12:00 -0700540 // Second pass encode
541 codec_enc_.g_pass = VPX_RC_LAST_PASS;
542 vpx_svc_set_options(&svc_,
543 "auto-alt-refs=1,1 scale-factors=1/1,1/1");
544 vpx_fixed_buf outputs[20];
545 memset(&outputs[0], 0, sizeof(outputs));
546 Pass2EncodeNFrames(&stats_buf, 20, 2, &outputs[0]);
547 DecodeNFrames(&outputs[0], 20);
548 FreeBitstreamBuffers(&outputs[0], 20);
549}
Minghai Shang277338f2014-06-24 14:01:17 -0700550
Minghai Shange1b5d242014-08-13 13:12:00 -0700551TEST_F(SvcTest, TwoPassEncode3SNRLayersDecode321Layers) {
552 // First pass encode
553 std::string stats_buf;
554 vpx_svc_set_options(&svc_, "scale-factors=1/1,1/1,1/1");
555 Pass1EncodeNFrames(20, 3, &stats_buf);
Minghai Shang277338f2014-06-24 14:01:17 -0700556
Minghai Shange1b5d242014-08-13 13:12:00 -0700557 // Second pass encode
558 codec_enc_.g_pass = VPX_RC_LAST_PASS;
559 vpx_svc_set_options(&svc_,
560 "auto-alt-refs=1,1,1 scale-factors=1/1,1/1,1/1");
561 vpx_fixed_buf outputs[20];
562 memset(&outputs[0], 0, sizeof(outputs));
563 Pass2EncodeNFrames(&stats_buf, 20, 3, &outputs[0]);
564 DecodeNFrames(&outputs[0], 20);
Minghai Shang68b550f2014-10-14 16:25:03 -0700565 DropEnhancementLayers(&outputs[0], 20, 2);
Minghai Shange1b5d242014-08-13 13:12:00 -0700566 DecodeNFrames(&outputs[0], 20);
Minghai Shang68b550f2014-10-14 16:25:03 -0700567 DropEnhancementLayers(&outputs[0], 20, 1);
Minghai Shange1b5d242014-08-13 13:12:00 -0700568 DecodeNFrames(&outputs[0], 20);
569
570 FreeBitstreamBuffers(&outputs[0], 20);
Minghai Shang6b2e4062014-03-27 13:43:20 -0700571}
572
Minghai Shangbe3b08d2014-09-02 12:05:14 -0700573TEST_F(SvcTest, SetMultipleFrameContextsOption) {
Minghai Shangd4a407c2014-08-18 14:51:04 -0700574 svc_.spatial_layers = 5;
575 vpx_codec_err_t res =
576 vpx_svc_set_options(&svc_, "multi-frame-contexts=1");
577 EXPECT_EQ(VPX_CODEC_OK, res);
578 res = vpx_svc_init(&svc_, &codec_, vpx_codec_vp9_cx(), &codec_enc_);
579 EXPECT_EQ(VPX_CODEC_INVALID_PARAM, res);
580
581 svc_.spatial_layers = 2;
582 res = vpx_svc_set_options(&svc_, "multi-frame-contexts=1");
583 InitializeEncoder();
584}
585
Minghai Shangbe3b08d2014-09-02 12:05:14 -0700586TEST_F(SvcTest, TwoPassEncode2SpatialLayersWithMultipleFrameContexts) {
Minghai Shangd4a407c2014-08-18 14:51:04 -0700587 // First pass encode
588 std::string stats_buf;
589 Pass1EncodeNFrames(10, 2, &stats_buf);
590
591 // Second pass encode
592 codec_enc_.g_pass = VPX_RC_LAST_PASS;
593 codec_enc_.g_error_resilient = 0;
594 vpx_svc_set_options(&svc_, "auto-alt-refs=1,1 multi-frame-contexts=1");
595 vpx_fixed_buf outputs[10];
596 memset(&outputs[0], 0, sizeof(outputs));
597 Pass2EncodeNFrames(&stats_buf, 10, 2, &outputs[0]);
Minghai Shangd4a407c2014-08-18 14:51:04 -0700598 DecodeNFrames(&outputs[0], 10);
599 FreeBitstreamBuffers(&outputs[0], 10);
600}
601
Minghai Shangbe3b08d2014-09-02 12:05:14 -0700602TEST_F(SvcTest,
603 TwoPassEncode2SpatialLayersWithMultipleFrameContextsDecodeBaselayer) {
Minghai Shangd4a407c2014-08-18 14:51:04 -0700604 // First pass encode
605 std::string stats_buf;
606 Pass1EncodeNFrames(10, 2, &stats_buf);
607
608 // Second pass encode
609 codec_enc_.g_pass = VPX_RC_LAST_PASS;
610 codec_enc_.g_error_resilient = 0;
611 vpx_svc_set_options(&svc_, "auto-alt-refs=1,1 multi-frame-contexts=1");
612 vpx_fixed_buf outputs[10];
613 memset(&outputs[0], 0, sizeof(outputs));
614 Pass2EncodeNFrames(&stats_buf, 10, 2, &outputs[0]);
Minghai Shang68b550f2014-10-14 16:25:03 -0700615 DropEnhancementLayers(&outputs[0], 10, 1);
Minghai Shangd4a407c2014-08-18 14:51:04 -0700616 DecodeNFrames(&outputs[0], 10);
617 FreeBitstreamBuffers(&outputs[0], 10);
618}
619
Minghai Shangbe3b08d2014-09-02 12:05:14 -0700620TEST_F(SvcTest, TwoPassEncode2SNRLayersWithMultipleFrameContexts) {
Minghai Shangd4a407c2014-08-18 14:51:04 -0700621 // First pass encode
622 std::string stats_buf;
623 vpx_svc_set_options(&svc_, "scale-factors=1/1,1/1");
624 Pass1EncodeNFrames(10, 2, &stats_buf);
625
626 // Second pass encode
627 codec_enc_.g_pass = VPX_RC_LAST_PASS;
628 codec_enc_.g_error_resilient = 0;
629 vpx_svc_set_options(&svc_, "auto-alt-refs=1,1 scale-factors=1/1,1/1 "
630 "multi-frame-contexts=1");
631 vpx_fixed_buf outputs[10];
632 memset(&outputs[0], 0, sizeof(outputs));
633 Pass2EncodeNFrames(&stats_buf, 10, 2, &outputs[0]);
Minghai Shangd4a407c2014-08-18 14:51:04 -0700634 DecodeNFrames(&outputs[0], 10);
635 FreeBitstreamBuffers(&outputs[0], 10);
636}
637
Minghai Shangbe3b08d2014-09-02 12:05:14 -0700638TEST_F(SvcTest,
639 TwoPassEncode3SNRLayersWithMultipleFrameContextsDecode321Layer) {
Minghai Shangd4a407c2014-08-18 14:51:04 -0700640 // First pass encode
641 std::string stats_buf;
642 vpx_svc_set_options(&svc_, "scale-factors=1/1,1/1,1/1");
643 Pass1EncodeNFrames(10, 3, &stats_buf);
644
645 // Second pass encode
646 codec_enc_.g_pass = VPX_RC_LAST_PASS;
647 codec_enc_.g_error_resilient = 0;
648 vpx_svc_set_options(&svc_, "auto-alt-refs=1,1,1 scale-factors=1/1,1/1,1/1 "
649 "multi-frame-contexts=1");
650 vpx_fixed_buf outputs[10];
651 memset(&outputs[0], 0, sizeof(outputs));
652 Pass2EncodeNFrames(&stats_buf, 10, 3, &outputs[0]);
653
Minghai Shang68b550f2014-10-14 16:25:03 -0700654 DecodeNFrames(&outputs[0], 10);
655 DropEnhancementLayers(&outputs[0], 10, 2);
656 DecodeNFrames(&outputs[0], 10);
657 DropEnhancementLayers(&outputs[0], 10, 1);
658 DecodeNFrames(&outputs[0], 10);
Minghai Shangd4a407c2014-08-18 14:51:04 -0700659
660 FreeBitstreamBuffers(&outputs[0], 10);
Minghai Shangd4a407c2014-08-18 14:51:04 -0700661}
662
Minghai Shangbe3b08d2014-09-02 12:05:14 -0700663TEST_F(SvcTest, TwoPassEncode2TemporalLayers) {
664 // First pass encode
665 std::string stats_buf;
666 vpx_svc_set_options(&svc_, "scale-factors=1/1");
667 svc_.temporal_layers = 2;
668 Pass1EncodeNFrames(10, 1, &stats_buf);
669
670 // Second pass encode
671 codec_enc_.g_pass = VPX_RC_LAST_PASS;
672 svc_.temporal_layers = 2;
673 vpx_svc_set_options(&svc_, "auto-alt-refs=1 scale-factors=1/1");
674 vpx_fixed_buf outputs[10];
675 memset(&outputs[0], 0, sizeof(outputs));
676 Pass2EncodeNFrames(&stats_buf, 10, 1, &outputs[0]);
677 DecodeNFrames(&outputs[0], 10);
678 FreeBitstreamBuffers(&outputs[0], 10);
679}
680
681TEST_F(SvcTest, TwoPassEncode2TemporalLayersWithMultipleFrameContexts) {
682 // First pass encode
683 std::string stats_buf;
684 vpx_svc_set_options(&svc_, "scale-factors=1/1");
685 svc_.temporal_layers = 2;
686 Pass1EncodeNFrames(10, 1, &stats_buf);
687
688 // Second pass encode
689 codec_enc_.g_pass = VPX_RC_LAST_PASS;
690 svc_.temporal_layers = 2;
691 codec_enc_.g_error_resilient = 0;
692 vpx_svc_set_options(&svc_, "auto-alt-refs=1 scale-factors=1/1 "
693 "multi-frame-contexts=1");
694 vpx_fixed_buf outputs[10];
695 memset(&outputs[0], 0, sizeof(outputs));
696 Pass2EncodeNFrames(&stats_buf, 10, 1, &outputs[0]);
Minghai Shangbe3b08d2014-09-02 12:05:14 -0700697 DecodeNFrames(&outputs[0], 10);
698 FreeBitstreamBuffers(&outputs[0], 10);
699}
700
701TEST_F(SvcTest, TwoPassEncode2TemporalLayersDecodeBaseLayer) {
702 // First pass encode
703 std::string stats_buf;
704 vpx_svc_set_options(&svc_, "scale-factors=1/1");
705 svc_.temporal_layers = 2;
706 Pass1EncodeNFrames(10, 1, &stats_buf);
707
708 // Second pass encode
709 codec_enc_.g_pass = VPX_RC_LAST_PASS;
710 svc_.temporal_layers = 2;
711 vpx_svc_set_options(&svc_, "auto-alt-refs=1 scale-factors=1/1");
712 vpx_fixed_buf outputs[10];
713 memset(&outputs[0], 0, sizeof(outputs));
714 Pass2EncodeNFrames(&stats_buf, 10, 1, &outputs[0]);
715
716 vpx_fixed_buf base_layer[5];
717 for (int i = 0; i < 5; ++i)
718 base_layer[i] = outputs[i * 2];
719
720 DecodeNFrames(&base_layer[0], 5);
721 FreeBitstreamBuffers(&outputs[0], 10);
722}
723
724TEST_F(SvcTest,
725 TwoPassEncode2TemporalLayersWithMultipleFrameContextsDecodeBaseLayer) {
726 // First pass encode
727 std::string stats_buf;
728 vpx_svc_set_options(&svc_, "scale-factors=1/1");
729 svc_.temporal_layers = 2;
730 Pass1EncodeNFrames(10, 1, &stats_buf);
731
732 // Second pass encode
733 codec_enc_.g_pass = VPX_RC_LAST_PASS;
734 svc_.temporal_layers = 2;
735 codec_enc_.g_error_resilient = 0;
736 vpx_svc_set_options(&svc_, "auto-alt-refs=1 scale-factors=1/1 "
737 "multi-frame-contexts=1");
738 vpx_fixed_buf outputs[10];
739 memset(&outputs[0], 0, sizeof(outputs));
740 Pass2EncodeNFrames(&stats_buf, 10, 1, &outputs[0]);
Minghai Shangbe3b08d2014-09-02 12:05:14 -0700741
742 vpx_fixed_buf base_layer[5];
743 for (int i = 0; i < 5; ++i)
744 base_layer[i] = outputs[i * 2];
745
746 DecodeNFrames(&base_layer[0], 5);
747 FreeBitstreamBuffers(&outputs[0], 10);
748}
749
Minghai Shang4aa92552015-04-15 14:59:17 -0700750TEST_F(SvcTest, TwoPassEncode2TemporalLayersWithTiles) {
751 // First pass encode
752 std::string stats_buf;
753 vpx_svc_set_options(&svc_, "scale-factors=1/1");
754 svc_.temporal_layers = 2;
755 Pass1EncodeNFrames(10, 1, &stats_buf);
756
757 // Second pass encode
758 codec_enc_.g_pass = VPX_RC_LAST_PASS;
759 svc_.temporal_layers = 2;
760 vpx_svc_set_options(&svc_, "auto-alt-refs=1 scale-factors=1/1");
761 codec_enc_.g_w = 704;
762 codec_enc_.g_h = 144;
763 tile_columns_ = 1;
764 tile_rows_ = 1;
765 vpx_fixed_buf outputs[10];
766 memset(&outputs[0], 0, sizeof(outputs));
767 Pass2EncodeNFrames(&stats_buf, 10, 1, &outputs[0]);
768 DecodeNFrames(&outputs[0], 10);
769 FreeBitstreamBuffers(&outputs[0], 10);
770}
771
772TEST_F(SvcTest,
773 TwoPassEncode2TemporalLayersWithMultipleFrameContextsAndTiles) {
774 // First pass encode
775 std::string stats_buf;
776 vpx_svc_set_options(&svc_, "scale-factors=1/1");
777 svc_.temporal_layers = 2;
778 Pass1EncodeNFrames(10, 1, &stats_buf);
779
780 // Second pass encode
781 codec_enc_.g_pass = VPX_RC_LAST_PASS;
782 svc_.temporal_layers = 2;
783 codec_enc_.g_error_resilient = 0;
784 codec_enc_.g_w = 704;
785 codec_enc_.g_h = 144;
786 tile_columns_ = 1;
787 tile_rows_ = 1;
788 vpx_svc_set_options(&svc_, "auto-alt-refs=1 scale-factors=1/1 "
789 "multi-frame-contexts=1");
790 vpx_fixed_buf outputs[10];
791 memset(&outputs[0], 0, sizeof(outputs));
792 Pass2EncodeNFrames(&stats_buf, 10, 1, &outputs[0]);
793 DecodeNFrames(&outputs[0], 10);
794 FreeBitstreamBuffers(&outputs[0], 10);
795}
796
Ivan Maltz1ed0e1b2013-10-23 11:53:37 -0700797} // namespace