1233d2500723e5594f3e7c70896ffeeef32b9c950ywan/* 2233d2500723e5594f3e7c70896ffeeef32b9c950ywan * Copyright (c) 2012 The WebM project authors. All Rights Reserved. 3233d2500723e5594f3e7c70896ffeeef32b9c950ywan * 4233d2500723e5594f3e7c70896ffeeef32b9c950ywan * Use of this source code is governed by a BSD-style license 5233d2500723e5594f3e7c70896ffeeef32b9c950ywan * that can be found in the LICENSE file in the root of the source 6233d2500723e5594f3e7c70896ffeeef32b9c950ywan * tree. An additional intellectual property rights grant can be found 7233d2500723e5594f3e7c70896ffeeef32b9c950ywan * in the file PATENTS. All contributing project authors may 8233d2500723e5594f3e7c70896ffeeef32b9c950ywan * be found in the AUTHORS file in the root of the source tree. 9233d2500723e5594f3e7c70896ffeeef32b9c950ywan */ 10233d2500723e5594f3e7c70896ffeeef32b9c950ywan#include <climits> 11233d2500723e5594f3e7c70896ffeeef32b9c950ywan#include <vector> 12233d2500723e5594f3e7c70896ffeeef32b9c950ywan#include "third_party/googletest/src/include/gtest/gtest.h" 13233d2500723e5594f3e7c70896ffeeef32b9c950ywan#include "test/codec_factory.h" 14233d2500723e5594f3e7c70896ffeeef32b9c950ywan#include "test/encode_test_driver.h" 15233d2500723e5594f3e7c70896ffeeef32b9c950ywan#include "test/i420_video_source.h" 16233d2500723e5594f3e7c70896ffeeef32b9c950ywan#include "test/util.h" 17233d2500723e5594f3e7c70896ffeeef32b9c950ywan 18233d2500723e5594f3e7c70896ffeeef32b9c950ywannamespace { 19233d2500723e5594f3e7c70896ffeeef32b9c950ywan 20233d2500723e5594f3e7c70896ffeeef32b9c950ywanclass BordersTest : public ::libvpx_test::EncoderTest, 21233d2500723e5594f3e7c70896ffeeef32b9c950ywan public ::libvpx_test::CodecTestWithParam<libvpx_test::TestMode> { 22233d2500723e5594f3e7c70896ffeeef32b9c950ywan protected: 23233d2500723e5594f3e7c70896ffeeef32b9c950ywan BordersTest() : EncoderTest(GET_PARAM(0)) {} 24233d2500723e5594f3e7c70896ffeeef32b9c950ywan virtual ~BordersTest() {} 25233d2500723e5594f3e7c70896ffeeef32b9c950ywan 26233d2500723e5594f3e7c70896ffeeef32b9c950ywan virtual void SetUp() { 27233d2500723e5594f3e7c70896ffeeef32b9c950ywan InitializeConfig(); 28233d2500723e5594f3e7c70896ffeeef32b9c950ywan SetMode(GET_PARAM(1)); 29233d2500723e5594f3e7c70896ffeeef32b9c950ywan } 30233d2500723e5594f3e7c70896ffeeef32b9c950ywan 31233d2500723e5594f3e7c70896ffeeef32b9c950ywan virtual void PreEncodeFrameHook(::libvpx_test::VideoSource *video, 32233d2500723e5594f3e7c70896ffeeef32b9c950ywan ::libvpx_test::Encoder *encoder) { 33233d2500723e5594f3e7c70896ffeeef32b9c950ywan if (video->frame() == 1) { 34233d2500723e5594f3e7c70896ffeeef32b9c950ywan encoder->Control(VP8E_SET_CPUUSED, 1); 35233d2500723e5594f3e7c70896ffeeef32b9c950ywan encoder->Control(VP8E_SET_ENABLEAUTOALTREF, 1); 36233d2500723e5594f3e7c70896ffeeef32b9c950ywan encoder->Control(VP8E_SET_ARNR_MAXFRAMES, 7); 37233d2500723e5594f3e7c70896ffeeef32b9c950ywan encoder->Control(VP8E_SET_ARNR_STRENGTH, 5); 38233d2500723e5594f3e7c70896ffeeef32b9c950ywan encoder->Control(VP8E_SET_ARNR_TYPE, 3); 39233d2500723e5594f3e7c70896ffeeef32b9c950ywan } 40233d2500723e5594f3e7c70896ffeeef32b9c950ywan } 41233d2500723e5594f3e7c70896ffeeef32b9c950ywan 42233d2500723e5594f3e7c70896ffeeef32b9c950ywan virtual void FramePktHook(const vpx_codec_cx_pkt_t *pkt) { 43233d2500723e5594f3e7c70896ffeeef32b9c950ywan if (pkt->data.frame.flags & VPX_FRAME_IS_KEY) { 44233d2500723e5594f3e7c70896ffeeef32b9c950ywan } 45233d2500723e5594f3e7c70896ffeeef32b9c950ywan } 46233d2500723e5594f3e7c70896ffeeef32b9c950ywan}; 47233d2500723e5594f3e7c70896ffeeef32b9c950ywan 48233d2500723e5594f3e7c70896ffeeef32b9c950ywanTEST_P(BordersTest, TestEncodeHighBitrate) { 49233d2500723e5594f3e7c70896ffeeef32b9c950ywan // Validate that this non multiple of 64 wide clip encodes and decodes 50233d2500723e5594f3e7c70896ffeeef32b9c950ywan // without a mismatch when passing in a very low max q. This pushes 51233d2500723e5594f3e7c70896ffeeef32b9c950ywan // the encoder to producing lots of big partitions which will likely 52233d2500723e5594f3e7c70896ffeeef32b9c950ywan // extend into the border and test the border condition. 53233d2500723e5594f3e7c70896ffeeef32b9c950ywan cfg_.g_lag_in_frames = 25; 54233d2500723e5594f3e7c70896ffeeef32b9c950ywan cfg_.rc_2pass_vbr_minsection_pct = 5; 55233d2500723e5594f3e7c70896ffeeef32b9c950ywan cfg_.rc_2pass_vbr_minsection_pct = 2000; 56233d2500723e5594f3e7c70896ffeeef32b9c950ywan cfg_.rc_target_bitrate = 2000; 57233d2500723e5594f3e7c70896ffeeef32b9c950ywan cfg_.rc_max_quantizer = 10; 58233d2500723e5594f3e7c70896ffeeef32b9c950ywan 59233d2500723e5594f3e7c70896ffeeef32b9c950ywan ::libvpx_test::I420VideoSource video("hantro_odd.yuv", 208, 144, 30, 1, 0, 60233d2500723e5594f3e7c70896ffeeef32b9c950ywan 40); 61233d2500723e5594f3e7c70896ffeeef32b9c950ywan 62233d2500723e5594f3e7c70896ffeeef32b9c950ywan ASSERT_NO_FATAL_FAILURE(RunLoop(&video)); 63233d2500723e5594f3e7c70896ffeeef32b9c950ywan} 64233d2500723e5594f3e7c70896ffeeef32b9c950ywanTEST_P(BordersTest, TestLowBitrate) { 65233d2500723e5594f3e7c70896ffeeef32b9c950ywan // Validate that this clip encodes and decodes without a mismatch 66233d2500723e5594f3e7c70896ffeeef32b9c950ywan // when passing in a very high min q. This pushes the encoder to producing 67233d2500723e5594f3e7c70896ffeeef32b9c950ywan // lots of small partitions which might will test the other condition. 68233d2500723e5594f3e7c70896ffeeef32b9c950ywan 69233d2500723e5594f3e7c70896ffeeef32b9c950ywan cfg_.g_lag_in_frames = 25; 70233d2500723e5594f3e7c70896ffeeef32b9c950ywan cfg_.rc_2pass_vbr_minsection_pct = 5; 71233d2500723e5594f3e7c70896ffeeef32b9c950ywan cfg_.rc_2pass_vbr_maxsection_pct = 2000; 72233d2500723e5594f3e7c70896ffeeef32b9c950ywan cfg_.rc_target_bitrate = 200; 73233d2500723e5594f3e7c70896ffeeef32b9c950ywan cfg_.rc_min_quantizer = 40; 74233d2500723e5594f3e7c70896ffeeef32b9c950ywan 75233d2500723e5594f3e7c70896ffeeef32b9c950ywan ::libvpx_test::I420VideoSource video("hantro_odd.yuv", 208, 144, 30, 1, 0, 76233d2500723e5594f3e7c70896ffeeef32b9c950ywan 40); 77233d2500723e5594f3e7c70896ffeeef32b9c950ywan 78233d2500723e5594f3e7c70896ffeeef32b9c950ywan ASSERT_NO_FATAL_FAILURE(RunLoop(&video)); 79233d2500723e5594f3e7c70896ffeeef32b9c950ywan} 80233d2500723e5594f3e7c70896ffeeef32b9c950ywan 81233d2500723e5594f3e7c70896ffeeef32b9c950ywanVP9_INSTANTIATE_TEST_CASE(BordersTest, ::testing::Values( 82233d2500723e5594f3e7c70896ffeeef32b9c950ywan ::libvpx_test::kTwoPassGood)); 83233d2500723e5594f3e7c70896ffeeef32b9c950ywan} // namespace 84