blob: 602bbcaeb569ff1202a02c3bab7cd8f35d36ace7 [file] [log] [blame]
Jim Bankoskia0d9a9d2014-12-11 17:34:32 -08001/*
2 * Copyright (c) 2014 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
Jingning Han097d59c2015-07-29 14:51:36 -070011#include "third_party/googletest/src/include/gtest/gtest.h"
12
Jim Bankoskia0d9a9d2014-12-11 17:34:32 -080013#include "test/codec_factory.h"
14#include "test/encode_test_driver.h"
Jingning Han097d59c2015-07-29 14:51:36 -070015#include "test/util.h"
Jim Bankoskia0d9a9d2014-12-11 17:34:32 -080016#include "test/y4m_video_source.h"
Yaowu Xufe5f8a82016-03-25 09:16:38 -070017#include "av1/av1_dx_iface.c"
Jim Bankoskia0d9a9d2014-12-11 17:34:32 -080018
Jim Bankoskia0d9a9d2014-12-11 17:34:32 -080019namespace {
20
Jim Bankoskia0d9a9d2014-12-11 17:34:32 -080021const int kCpuUsed = 2;
22
23struct EncodePerfTestVideo {
24 const char *name;
25 uint32_t width;
26 uint32_t height;
27 uint32_t bitrate;
28 int frames;
29};
30
31const EncodePerfTestVideo kVP9EncodePerfTestVectors[] = {
clang-format99e28b82016-01-27 12:42:45 -080032 { "niklas_1280_720_30.y4m", 1280, 720, 600, 10 },
Jim Bankoskia0d9a9d2014-12-11 17:34:32 -080033};
34
35struct EncodeParameters {
36 int32_t tile_rows;
37 int32_t tile_cols;
38 int32_t lossless;
39 int32_t error_resilient;
40 int32_t frame_parallel;
Adrian Grangecebe6f02016-03-25 12:11:05 -070041 aom_color_range_t color_range;
42 aom_color_space_t cs;
Ronald S. Bultje812945a2015-09-25 21:51:55 -040043 int render_size[2];
Jim Bankoskia0d9a9d2014-12-11 17:34:32 -080044 // TODO(JBB): quantizers / bitrate
45};
46
47const EncodeParameters kVP9EncodeParameterSet[] = {
clang-format99e28b82016-01-27 12:42:45 -080048 { 0, 0, 0, 1, 0, VPX_CR_STUDIO_RANGE, VPX_CS_BT_601 },
49 { 0, 0, 0, 0, 0, VPX_CR_FULL_RANGE, VPX_CS_BT_709 },
50 { 0, 0, 1, 0, 0, VPX_CR_FULL_RANGE, VPX_CS_BT_2020 },
51 { 0, 2, 0, 0, 1, VPX_CR_STUDIO_RANGE, VPX_CS_UNKNOWN, { 640, 480 } },
James Zernba317bc2015-09-09 23:43:12 -070052 // TODO(JBB): Test profiles (requires more work).
Jim Bankoskia0d9a9d2014-12-11 17:34:32 -080053};
54
Jingning Han41be09a2015-08-19 14:13:18 -070055class VpxEncoderParmsGetToDecoder
Yaowu Xu3d26d912016-03-22 12:33:42 -070056 : public ::libaom_test::EncoderTest,
57 public ::libaom_test::CodecTestWith2Params<EncodeParameters,
Jim Bankoskia0d9a9d2014-12-11 17:34:32 -080058 EncodePerfTestVideo> {
59 protected:
Jingning Han41be09a2015-08-19 14:13:18 -070060 VpxEncoderParmsGetToDecoder()
James Zernba317bc2015-09-09 23:43:12 -070061 : EncoderTest(GET_PARAM(0)), encode_parms(GET_PARAM(1)) {}
Jim Bankoskia0d9a9d2014-12-11 17:34:32 -080062
Jingning Han41be09a2015-08-19 14:13:18 -070063 virtual ~VpxEncoderParmsGetToDecoder() {}
Jim Bankoskia0d9a9d2014-12-11 17:34:32 -080064
65 virtual void SetUp() {
66 InitializeConfig();
Yaowu Xu3d26d912016-03-22 12:33:42 -070067 SetMode(::libaom_test::kTwoPassGood);
Jim Bankoskia0d9a9d2014-12-11 17:34:32 -080068 cfg_.g_lag_in_frames = 25;
69 cfg_.g_error_resilient = encode_parms.error_resilient;
70 dec_cfg_.threads = 4;
71 test_video_ = GET_PARAM(2);
72 cfg_.rc_target_bitrate = test_video_.bitrate;
73 }
74
Yaowu Xu3d26d912016-03-22 12:33:42 -070075 virtual void PreEncodeFrameHook(::libaom_test::VideoSource *video,
76 ::libaom_test::Encoder *encoder) {
Jim Bankoskia0d9a9d2014-12-11 17:34:32 -080077 if (video->frame() == 1) {
Yaowu Xue94b4152015-01-13 10:07:20 -080078 encoder->Control(VP9E_SET_COLOR_SPACE, encode_parms.cs);
Ronald S. Bultjeeeb5ef02015-09-15 21:56:51 -040079 encoder->Control(VP9E_SET_COLOR_RANGE, encode_parms.color_range);
Jim Bankoskia0d9a9d2014-12-11 17:34:32 -080080 encoder->Control(VP9E_SET_LOSSLESS, encode_parms.lossless);
81 encoder->Control(VP9E_SET_FRAME_PARALLEL_DECODING,
82 encode_parms.frame_parallel);
83 encoder->Control(VP9E_SET_TILE_ROWS, encode_parms.tile_rows);
84 encoder->Control(VP9E_SET_TILE_COLUMNS, encode_parms.tile_cols);
85 encoder->Control(VP8E_SET_CPUUSED, kCpuUsed);
86 encoder->Control(VP8E_SET_ENABLEAUTOALTREF, 1);
87 encoder->Control(VP8E_SET_ARNR_MAXFRAMES, 7);
88 encoder->Control(VP8E_SET_ARNR_STRENGTH, 5);
89 encoder->Control(VP8E_SET_ARNR_TYPE, 3);
Ronald S. Bultje812945a2015-09-25 21:51:55 -040090 if (encode_parms.render_size[0] > 0 && encode_parms.render_size[1] > 0)
91 encoder->Control(VP9E_SET_RENDER_SIZE, encode_parms.render_size);
Jim Bankoskia0d9a9d2014-12-11 17:34:32 -080092 }
93 }
94
Adrian Grangecebe6f02016-03-25 12:11:05 -070095 virtual bool HandleDecodeResult(const aom_codec_err_t res_dec,
Yaowu Xu3d26d912016-03-22 12:33:42 -070096 const libaom_test::VideoSource &video,
97 libaom_test::Decoder *decoder) {
Adrian Grangecebe6f02016-03-25 12:11:05 -070098 aom_codec_ctx_t *const vp9_decoder = decoder->GetDecoder();
99 aom_codec_alg_priv_t *const priv =
100 reinterpret_cast<aom_codec_alg_priv_t *>(vp9_decoder->priv);
James Zern0fe900a2015-09-09 23:10:58 -0700101 FrameWorkerData *const worker_data =
102 reinterpret_cast<FrameWorkerData *>(priv->frame_workers[0].data1);
Yaowu Xu01dee0b2016-03-25 12:43:01 -0700103 AV1_COMMON *const common = &worker_data->pbi->common;
Jim Bankoskia0d9a9d2014-12-11 17:34:32 -0800104
105 if (encode_parms.lossless) {
James Zern67774db2015-09-09 23:27:35 -0700106 EXPECT_EQ(0, common->base_qindex);
107 EXPECT_EQ(0, common->y_dc_delta_q);
108 EXPECT_EQ(0, common->uv_dc_delta_q);
109 EXPECT_EQ(0, common->uv_ac_delta_q);
110 EXPECT_EQ(ONLY_4X4, common->tx_mode);
Jim Bankoskia0d9a9d2014-12-11 17:34:32 -0800111 }
James Zern67774db2015-09-09 23:27:35 -0700112 EXPECT_EQ(encode_parms.error_resilient, common->error_resilient_mode);
Jim Bankoskia0d9a9d2014-12-11 17:34:32 -0800113 if (encode_parms.error_resilient) {
James Zern67774db2015-09-09 23:27:35 -0700114 EXPECT_EQ(0, common->use_prev_frame_mvs);
Jim Bankoskia0d9a9d2014-12-11 17:34:32 -0800115 }
Ronald S. Bultjeeeb5ef02015-09-15 21:56:51 -0400116 EXPECT_EQ(encode_parms.color_range, common->color_range);
James Zern67774db2015-09-09 23:27:35 -0700117 EXPECT_EQ(encode_parms.cs, common->color_space);
Ronald S. Bultje812945a2015-09-25 21:51:55 -0400118 if (encode_parms.render_size[0] > 0 && encode_parms.render_size[1] > 0) {
119 EXPECT_EQ(encode_parms.render_size[0], common->render_width);
120 EXPECT_EQ(encode_parms.render_size[1], common->render_height);
121 }
James Zern67774db2015-09-09 23:27:35 -0700122 EXPECT_EQ(encode_parms.tile_cols, common->log2_tile_cols);
123 EXPECT_EQ(encode_parms.tile_rows, common->log2_tile_rows);
Jim Bankoskia0d9a9d2014-12-11 17:34:32 -0800124
125 EXPECT_EQ(VPX_CODEC_OK, res_dec) << decoder->DecodeError();
126 return VPX_CODEC_OK == res_dec;
127 }
128
129 EncodePerfTestVideo test_video_;
130
131 private:
132 EncodeParameters encode_parms;
133};
134
James Zern0fe900a2015-09-09 23:10:58 -0700135TEST_P(VpxEncoderParmsGetToDecoder, BitstreamParms) {
Jim Bankoskia0d9a9d2014-12-11 17:34:32 -0800136 init_flags_ = VPX_CODEC_USE_PSNR;
137
Yaowu Xu3d26d912016-03-22 12:33:42 -0700138 libaom_test::VideoSource *const video =
139 new libaom_test::Y4mVideoSource(test_video_.name, 0, test_video_.frames);
James Zern21952ba2015-09-09 23:19:39 -0700140 ASSERT_TRUE(video != NULL);
Jim Bankoskia0d9a9d2014-12-11 17:34:32 -0800141
142 ASSERT_NO_FATAL_FAILURE(RunLoop(video));
James Zernba317bc2015-09-09 23:43:12 -0700143 delete video;
Jim Bankoskia0d9a9d2014-12-11 17:34:32 -0800144}
145
Yaowu Xu01dee0b2016-03-25 12:43:01 -0700146AV1_INSTANTIATE_TEST_CASE(VpxEncoderParmsGetToDecoder,
clang-format99e28b82016-01-27 12:42:45 -0800147 ::testing::ValuesIn(kVP9EncodeParameterSet),
148 ::testing::ValuesIn(kVP9EncodePerfTestVectors));
Jim Bankoskia0d9a9d2014-12-11 17:34:32 -0800149} // namespace