Jim Bankoski | a0d9a9d | 2014-12-11 17:34:32 -0800 | [diff] [blame] | 1 | /* |
| 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 Han | 097d59c | 2015-07-29 14:51:36 -0700 | [diff] [blame] | 11 | #include "third_party/googletest/src/include/gtest/gtest.h" |
| 12 | |
Jim Bankoski | a0d9a9d | 2014-12-11 17:34:32 -0800 | [diff] [blame] | 13 | #include "test/codec_factory.h" |
| 14 | #include "test/encode_test_driver.h" |
Jingning Han | 097d59c | 2015-07-29 14:51:36 -0700 | [diff] [blame] | 15 | #include "test/util.h" |
Jim Bankoski | a0d9a9d | 2014-12-11 17:34:32 -0800 | [diff] [blame] | 16 | #include "test/y4m_video_source.h" |
Yaowu Xu | fe5f8a8 | 2016-03-25 09:16:38 -0700 | [diff] [blame] | 17 | #include "av1/av1_dx_iface.c" |
Jim Bankoski | a0d9a9d | 2014-12-11 17:34:32 -0800 | [diff] [blame] | 18 | |
Jim Bankoski | a0d9a9d | 2014-12-11 17:34:32 -0800 | [diff] [blame] | 19 | namespace { |
| 20 | |
Jim Bankoski | a0d9a9d | 2014-12-11 17:34:32 -0800 | [diff] [blame] | 21 | const int kCpuUsed = 2; |
| 22 | |
| 23 | struct EncodePerfTestVideo { |
| 24 | const char *name; |
| 25 | uint32_t width; |
| 26 | uint32_t height; |
| 27 | uint32_t bitrate; |
| 28 | int frames; |
| 29 | }; |
| 30 | |
| 31 | const EncodePerfTestVideo kVP9EncodePerfTestVectors[] = { |
clang-format | 99e28b8 | 2016-01-27 12:42:45 -0800 | [diff] [blame] | 32 | { "niklas_1280_720_30.y4m", 1280, 720, 600, 10 }, |
Jim Bankoski | a0d9a9d | 2014-12-11 17:34:32 -0800 | [diff] [blame] | 33 | }; |
| 34 | |
| 35 | struct 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 Grange | cebe6f0 | 2016-03-25 12:11:05 -0700 | [diff] [blame] | 41 | aom_color_range_t color_range; |
| 42 | aom_color_space_t cs; |
Ronald S. Bultje | 812945a | 2015-09-25 21:51:55 -0400 | [diff] [blame] | 43 | int render_size[2]; |
Jim Bankoski | a0d9a9d | 2014-12-11 17:34:32 -0800 | [diff] [blame] | 44 | // TODO(JBB): quantizers / bitrate |
| 45 | }; |
| 46 | |
| 47 | const EncodeParameters kVP9EncodeParameterSet[] = { |
clang-format | 99e28b8 | 2016-01-27 12:42:45 -0800 | [diff] [blame] | 48 | { 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 Zern | ba317bc | 2015-09-09 23:43:12 -0700 | [diff] [blame] | 52 | // TODO(JBB): Test profiles (requires more work). |
Jim Bankoski | a0d9a9d | 2014-12-11 17:34:32 -0800 | [diff] [blame] | 53 | }; |
| 54 | |
Jingning Han | 41be09a | 2015-08-19 14:13:18 -0700 | [diff] [blame] | 55 | class VpxEncoderParmsGetToDecoder |
Yaowu Xu | 3d26d91 | 2016-03-22 12:33:42 -0700 | [diff] [blame] | 56 | : public ::libaom_test::EncoderTest, |
| 57 | public ::libaom_test::CodecTestWith2Params<EncodeParameters, |
Jim Bankoski | a0d9a9d | 2014-12-11 17:34:32 -0800 | [diff] [blame] | 58 | EncodePerfTestVideo> { |
| 59 | protected: |
Jingning Han | 41be09a | 2015-08-19 14:13:18 -0700 | [diff] [blame] | 60 | VpxEncoderParmsGetToDecoder() |
James Zern | ba317bc | 2015-09-09 23:43:12 -0700 | [diff] [blame] | 61 | : EncoderTest(GET_PARAM(0)), encode_parms(GET_PARAM(1)) {} |
Jim Bankoski | a0d9a9d | 2014-12-11 17:34:32 -0800 | [diff] [blame] | 62 | |
Jingning Han | 41be09a | 2015-08-19 14:13:18 -0700 | [diff] [blame] | 63 | virtual ~VpxEncoderParmsGetToDecoder() {} |
Jim Bankoski | a0d9a9d | 2014-12-11 17:34:32 -0800 | [diff] [blame] | 64 | |
| 65 | virtual void SetUp() { |
| 66 | InitializeConfig(); |
Yaowu Xu | 3d26d91 | 2016-03-22 12:33:42 -0700 | [diff] [blame] | 67 | SetMode(::libaom_test::kTwoPassGood); |
Jim Bankoski | a0d9a9d | 2014-12-11 17:34:32 -0800 | [diff] [blame] | 68 | 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 Xu | 3d26d91 | 2016-03-22 12:33:42 -0700 | [diff] [blame] | 75 | virtual void PreEncodeFrameHook(::libaom_test::VideoSource *video, |
| 76 | ::libaom_test::Encoder *encoder) { |
Jim Bankoski | a0d9a9d | 2014-12-11 17:34:32 -0800 | [diff] [blame] | 77 | if (video->frame() == 1) { |
Yaowu Xu | e94b415 | 2015-01-13 10:07:20 -0800 | [diff] [blame] | 78 | encoder->Control(VP9E_SET_COLOR_SPACE, encode_parms.cs); |
Ronald S. Bultje | eeb5ef0 | 2015-09-15 21:56:51 -0400 | [diff] [blame] | 79 | encoder->Control(VP9E_SET_COLOR_RANGE, encode_parms.color_range); |
Jim Bankoski | a0d9a9d | 2014-12-11 17:34:32 -0800 | [diff] [blame] | 80 | 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. Bultje | 812945a | 2015-09-25 21:51:55 -0400 | [diff] [blame] | 90 | 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 Bankoski | a0d9a9d | 2014-12-11 17:34:32 -0800 | [diff] [blame] | 92 | } |
| 93 | } |
| 94 | |
Adrian Grange | cebe6f0 | 2016-03-25 12:11:05 -0700 | [diff] [blame] | 95 | virtual bool HandleDecodeResult(const aom_codec_err_t res_dec, |
Yaowu Xu | 3d26d91 | 2016-03-22 12:33:42 -0700 | [diff] [blame] | 96 | const libaom_test::VideoSource &video, |
| 97 | libaom_test::Decoder *decoder) { |
Adrian Grange | cebe6f0 | 2016-03-25 12:11:05 -0700 | [diff] [blame] | 98 | 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 Zern | 0fe900a | 2015-09-09 23:10:58 -0700 | [diff] [blame] | 101 | FrameWorkerData *const worker_data = |
| 102 | reinterpret_cast<FrameWorkerData *>(priv->frame_workers[0].data1); |
Yaowu Xu | 01dee0b | 2016-03-25 12:43:01 -0700 | [diff] [blame^] | 103 | AV1_COMMON *const common = &worker_data->pbi->common; |
Jim Bankoski | a0d9a9d | 2014-12-11 17:34:32 -0800 | [diff] [blame] | 104 | |
| 105 | if (encode_parms.lossless) { |
James Zern | 67774db | 2015-09-09 23:27:35 -0700 | [diff] [blame] | 106 | 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 Bankoski | a0d9a9d | 2014-12-11 17:34:32 -0800 | [diff] [blame] | 111 | } |
James Zern | 67774db | 2015-09-09 23:27:35 -0700 | [diff] [blame] | 112 | EXPECT_EQ(encode_parms.error_resilient, common->error_resilient_mode); |
Jim Bankoski | a0d9a9d | 2014-12-11 17:34:32 -0800 | [diff] [blame] | 113 | if (encode_parms.error_resilient) { |
James Zern | 67774db | 2015-09-09 23:27:35 -0700 | [diff] [blame] | 114 | EXPECT_EQ(0, common->use_prev_frame_mvs); |
Jim Bankoski | a0d9a9d | 2014-12-11 17:34:32 -0800 | [diff] [blame] | 115 | } |
Ronald S. Bultje | eeb5ef0 | 2015-09-15 21:56:51 -0400 | [diff] [blame] | 116 | EXPECT_EQ(encode_parms.color_range, common->color_range); |
James Zern | 67774db | 2015-09-09 23:27:35 -0700 | [diff] [blame] | 117 | EXPECT_EQ(encode_parms.cs, common->color_space); |
Ronald S. Bultje | 812945a | 2015-09-25 21:51:55 -0400 | [diff] [blame] | 118 | 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 Zern | 67774db | 2015-09-09 23:27:35 -0700 | [diff] [blame] | 122 | EXPECT_EQ(encode_parms.tile_cols, common->log2_tile_cols); |
| 123 | EXPECT_EQ(encode_parms.tile_rows, common->log2_tile_rows); |
Jim Bankoski | a0d9a9d | 2014-12-11 17:34:32 -0800 | [diff] [blame] | 124 | |
| 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 Zern | 0fe900a | 2015-09-09 23:10:58 -0700 | [diff] [blame] | 135 | TEST_P(VpxEncoderParmsGetToDecoder, BitstreamParms) { |
Jim Bankoski | a0d9a9d | 2014-12-11 17:34:32 -0800 | [diff] [blame] | 136 | init_flags_ = VPX_CODEC_USE_PSNR; |
| 137 | |
Yaowu Xu | 3d26d91 | 2016-03-22 12:33:42 -0700 | [diff] [blame] | 138 | libaom_test::VideoSource *const video = |
| 139 | new libaom_test::Y4mVideoSource(test_video_.name, 0, test_video_.frames); |
James Zern | 21952ba | 2015-09-09 23:19:39 -0700 | [diff] [blame] | 140 | ASSERT_TRUE(video != NULL); |
Jim Bankoski | a0d9a9d | 2014-12-11 17:34:32 -0800 | [diff] [blame] | 141 | |
| 142 | ASSERT_NO_FATAL_FAILURE(RunLoop(video)); |
James Zern | ba317bc | 2015-09-09 23:43:12 -0700 | [diff] [blame] | 143 | delete video; |
Jim Bankoski | a0d9a9d | 2014-12-11 17:34:32 -0800 | [diff] [blame] | 144 | } |
| 145 | |
Yaowu Xu | 01dee0b | 2016-03-25 12:43:01 -0700 | [diff] [blame^] | 146 | AV1_INSTANTIATE_TEST_CASE(VpxEncoderParmsGetToDecoder, |
clang-format | 99e28b8 | 2016-01-27 12:42:45 -0800 | [diff] [blame] | 147 | ::testing::ValuesIn(kVP9EncodeParameterSet), |
| 148 | ::testing::ValuesIn(kVP9EncodePerfTestVectors)); |
Jim Bankoski | a0d9a9d | 2014-12-11 17:34:32 -0800 | [diff] [blame] | 149 | } // namespace |