still_picture_test.cc (3707B)
1 /* 2 * Copyright (c) 2020, Alliance for Open Media. All rights reserved. 3 * 4 * This source code is subject to the terms of the BSD 2 Clause License and 5 * the Alliance for Open Media Patent License 1.0. If the BSD 2 Clause License 6 * was not distributed with this source code in the LICENSE file, you can 7 * obtain it at www.aomedia.org/license/software. If the Alliance for Open 8 * Media Patent License 1.0 was not distributed with this source code in the 9 * PATENTS file, you can obtain it at www.aomedia.org/license/patent. 10 */ 11 12 #include "gtest/gtest.h" 13 #include "test/codec_factory.h" 14 #include "test/encode_test_driver.h" 15 #include "test/i420_video_source.h" 16 #include "test/util.h" 17 18 namespace { 19 20 // This class is used to test the presence of still picture feature. 21 class StillPicturePresenceTest 22 : public ::libaom_test::CodecTestWith2Params<libaom_test::TestMode, int>, 23 public ::libaom_test::EncoderTest { 24 protected: 25 StillPicturePresenceTest() 26 : EncoderTest(GET_PARAM(0)), encoding_mode_(GET_PARAM(1)), 27 enable_full_header_(GET_PARAM(2)) { 28 still_picture_coding_violated_ = false; 29 } 30 ~StillPicturePresenceTest() override = default; 31 32 void SetUp() override { 33 InitializeConfig(encoding_mode_); 34 const aom_rational timebase = { 1, 30 }; 35 cfg_.g_timebase = timebase; 36 cfg_.rc_end_usage = AOM_Q; 37 cfg_.g_threads = 1; 38 cfg_.full_still_picture_hdr = enable_full_header_; 39 cfg_.g_limit = 1; 40 } 41 42 bool DoDecode() const override { return true; } 43 44 void PreEncodeFrameHook(::libaom_test::VideoSource *video, 45 ::libaom_test::Encoder *encoder) override { 46 if (video->frame() == 0) { 47 encoder->Control(AOME_SET_CPUUSED, 5); 48 encoder->Control(AV1E_SET_FORCE_VIDEO_MODE, 0); 49 } 50 } 51 52 bool HandleDecodeResult(const aom_codec_err_t res_dec, 53 libaom_test::Decoder *decoder) override { 54 EXPECT_EQ(AOM_CODEC_OK, res_dec) << decoder->DecodeError(); 55 if (AOM_CODEC_OK == res_dec) { 56 aom_codec_ctx_t *ctx_dec = decoder->GetDecoder(); 57 AOM_CODEC_CONTROL_TYPECHECKED(ctx_dec, AOMD_GET_STILL_PICTURE, 58 &still_pic_info_); 59 if (still_pic_info_.is_still_picture != 1) { 60 still_picture_coding_violated_ = true; 61 } 62 if (still_pic_info_.is_reduced_still_picture_hdr == enable_full_header_) { 63 /* If full_still_picture_header is enabled in encoder config but 64 * bitstream contains reduced_still_picture_header set, then set 65 * still_picture_coding_violated_ to true. 66 * Similarly, if full_still_picture_header is disabled in encoder config 67 * but bitstream contains reduced_still_picture_header not set, then set 68 * still_picture_coding_violated_ to true. 69 */ 70 still_picture_coding_violated_ = true; 71 } 72 } 73 return AOM_CODEC_OK == res_dec; 74 } 75 76 ::libaom_test::TestMode encoding_mode_; 77 bool still_picture_coding_violated_; 78 int enable_full_header_; 79 aom_still_picture_info still_pic_info_; 80 aom_rc_mode end_usage_check_; 81 }; 82 83 TEST_P(StillPicturePresenceTest, StillPictureEncodePresenceTest) { 84 libaom_test::I420VideoSource video("hantro_collage_w352h288.yuv", 352, 288, 85 cfg_.g_timebase.den, cfg_.g_timebase.num, 86 0, 1); 87 ASSERT_NO_FATAL_FAILURE(RunLoop(&video)); 88 ASSERT_EQ(still_picture_coding_violated_, false); 89 } 90 91 AV1_INSTANTIATE_TEST_SUITE(StillPicturePresenceTest, 92 ::testing::Values(::libaom_test::kOnePassGood, 93 ::libaom_test::kTwoPassGood), 94 ::testing::Values(1, 0)); 95 } // namespace