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 CpuSpeedTest : public ::libvpx_test::EncoderTest, 21233d2500723e5594f3e7c70896ffeeef32b9c950ywan public ::libvpx_test::CodecTestWith2Params< 22233d2500723e5594f3e7c70896ffeeef32b9c950ywan libvpx_test::TestMode, int> { 23233d2500723e5594f3e7c70896ffeeef32b9c950ywan protected: 24233d2500723e5594f3e7c70896ffeeef32b9c950ywan CpuSpeedTest() : EncoderTest(GET_PARAM(0)) {} 25233d2500723e5594f3e7c70896ffeeef32b9c950ywan virtual ~CpuSpeedTest() {} 26233d2500723e5594f3e7c70896ffeeef32b9c950ywan 27233d2500723e5594f3e7c70896ffeeef32b9c950ywan virtual void SetUp() { 28233d2500723e5594f3e7c70896ffeeef32b9c950ywan InitializeConfig(); 29233d2500723e5594f3e7c70896ffeeef32b9c950ywan SetMode(GET_PARAM(1)); 30233d2500723e5594f3e7c70896ffeeef32b9c950ywan set_cpu_used_ = GET_PARAM(2); 31233d2500723e5594f3e7c70896ffeeef32b9c950ywan } 32233d2500723e5594f3e7c70896ffeeef32b9c950ywan 33233d2500723e5594f3e7c70896ffeeef32b9c950ywan virtual void PreEncodeFrameHook(::libvpx_test::VideoSource *video, 34233d2500723e5594f3e7c70896ffeeef32b9c950ywan ::libvpx_test::Encoder *encoder) { 35233d2500723e5594f3e7c70896ffeeef32b9c950ywan if (video->frame() == 1) { 36233d2500723e5594f3e7c70896ffeeef32b9c950ywan encoder->Control(VP8E_SET_CPUUSED, set_cpu_used_); 37233d2500723e5594f3e7c70896ffeeef32b9c950ywan encoder->Control(VP8E_SET_ENABLEAUTOALTREF, 1); 38233d2500723e5594f3e7c70896ffeeef32b9c950ywan encoder->Control(VP8E_SET_ARNR_MAXFRAMES, 7); 39233d2500723e5594f3e7c70896ffeeef32b9c950ywan encoder->Control(VP8E_SET_ARNR_STRENGTH, 5); 40233d2500723e5594f3e7c70896ffeeef32b9c950ywan encoder->Control(VP8E_SET_ARNR_TYPE, 3); 41233d2500723e5594f3e7c70896ffeeef32b9c950ywan } 42233d2500723e5594f3e7c70896ffeeef32b9c950ywan } 43233d2500723e5594f3e7c70896ffeeef32b9c950ywan 44233d2500723e5594f3e7c70896ffeeef32b9c950ywan virtual void FramePktHook(const vpx_codec_cx_pkt_t *pkt) { 45233d2500723e5594f3e7c70896ffeeef32b9c950ywan if (pkt->data.frame.flags & VPX_FRAME_IS_KEY) { 46233d2500723e5594f3e7c70896ffeeef32b9c950ywan } 47233d2500723e5594f3e7c70896ffeeef32b9c950ywan } 48233d2500723e5594f3e7c70896ffeeef32b9c950ywan int set_cpu_used_; 49233d2500723e5594f3e7c70896ffeeef32b9c950ywan}; 50233d2500723e5594f3e7c70896ffeeef32b9c950ywan 51233d2500723e5594f3e7c70896ffeeef32b9c950ywanTEST_P(CpuSpeedTest, TestQ0) { 52233d2500723e5594f3e7c70896ffeeef32b9c950ywan // Validate that this non multiple of 64 wide clip encodes and decodes 53233d2500723e5594f3e7c70896ffeeef32b9c950ywan // without a mismatch when passing in a very low max q. This pushes 54233d2500723e5594f3e7c70896ffeeef32b9c950ywan // the encoder to producing lots of big partitions which will likely 55233d2500723e5594f3e7c70896ffeeef32b9c950ywan // extend into the border and test the border condition. 56233d2500723e5594f3e7c70896ffeeef32b9c950ywan cfg_.g_lag_in_frames = 25; 57233d2500723e5594f3e7c70896ffeeef32b9c950ywan cfg_.rc_2pass_vbr_minsection_pct = 5; 58233d2500723e5594f3e7c70896ffeeef32b9c950ywan cfg_.rc_2pass_vbr_minsection_pct = 2000; 59233d2500723e5594f3e7c70896ffeeef32b9c950ywan cfg_.rc_target_bitrate = 400; 60233d2500723e5594f3e7c70896ffeeef32b9c950ywan cfg_.rc_max_quantizer = 0; 61233d2500723e5594f3e7c70896ffeeef32b9c950ywan cfg_.rc_min_quantizer = 0; 62233d2500723e5594f3e7c70896ffeeef32b9c950ywan 63233d2500723e5594f3e7c70896ffeeef32b9c950ywan ::libvpx_test::I420VideoSource video("hantro_odd.yuv", 208, 144, 30, 1, 0, 64233d2500723e5594f3e7c70896ffeeef32b9c950ywan 20); 65233d2500723e5594f3e7c70896ffeeef32b9c950ywan 66233d2500723e5594f3e7c70896ffeeef32b9c950ywan ASSERT_NO_FATAL_FAILURE(RunLoop(&video)); 67233d2500723e5594f3e7c70896ffeeef32b9c950ywan} 68233d2500723e5594f3e7c70896ffeeef32b9c950ywan 69233d2500723e5594f3e7c70896ffeeef32b9c950ywan 70233d2500723e5594f3e7c70896ffeeef32b9c950ywanTEST_P(CpuSpeedTest, TestEncodeHighBitrate) { 71233d2500723e5594f3e7c70896ffeeef32b9c950ywan // Validate that this non multiple of 64 wide clip encodes and decodes 72233d2500723e5594f3e7c70896ffeeef32b9c950ywan // without a mismatch when passing in a very low max q. This pushes 73233d2500723e5594f3e7c70896ffeeef32b9c950ywan // the encoder to producing lots of big partitions which will likely 74233d2500723e5594f3e7c70896ffeeef32b9c950ywan // extend into the border and test the border condition. 75233d2500723e5594f3e7c70896ffeeef32b9c950ywan cfg_.g_lag_in_frames = 25; 76233d2500723e5594f3e7c70896ffeeef32b9c950ywan cfg_.rc_2pass_vbr_minsection_pct = 5; 77233d2500723e5594f3e7c70896ffeeef32b9c950ywan cfg_.rc_2pass_vbr_minsection_pct = 2000; 78233d2500723e5594f3e7c70896ffeeef32b9c950ywan cfg_.rc_target_bitrate = 12000; 79233d2500723e5594f3e7c70896ffeeef32b9c950ywan cfg_.rc_max_quantizer = 10; 80233d2500723e5594f3e7c70896ffeeef32b9c950ywan cfg_.rc_min_quantizer = 0; 81233d2500723e5594f3e7c70896ffeeef32b9c950ywan 82233d2500723e5594f3e7c70896ffeeef32b9c950ywan ::libvpx_test::I420VideoSource video("hantro_odd.yuv", 208, 144, 30, 1, 0, 83233d2500723e5594f3e7c70896ffeeef32b9c950ywan 20); 84233d2500723e5594f3e7c70896ffeeef32b9c950ywan 85233d2500723e5594f3e7c70896ffeeef32b9c950ywan ASSERT_NO_FATAL_FAILURE(RunLoop(&video)); 86233d2500723e5594f3e7c70896ffeeef32b9c950ywan} 87233d2500723e5594f3e7c70896ffeeef32b9c950ywanTEST_P(CpuSpeedTest, TestLowBitrate) { 88233d2500723e5594f3e7c70896ffeeef32b9c950ywan // Validate that this clip encodes and decodes without a mismatch 89233d2500723e5594f3e7c70896ffeeef32b9c950ywan // when passing in a very high min q. This pushes the encoder to producing 90233d2500723e5594f3e7c70896ffeeef32b9c950ywan // lots of small partitions which might will test the other condition. 91233d2500723e5594f3e7c70896ffeeef32b9c950ywan 92233d2500723e5594f3e7c70896ffeeef32b9c950ywan cfg_.g_lag_in_frames = 25; 93233d2500723e5594f3e7c70896ffeeef32b9c950ywan cfg_.rc_2pass_vbr_minsection_pct = 5; 94233d2500723e5594f3e7c70896ffeeef32b9c950ywan cfg_.rc_2pass_vbr_minsection_pct = 2000; 95233d2500723e5594f3e7c70896ffeeef32b9c950ywan cfg_.rc_target_bitrate = 200; 96233d2500723e5594f3e7c70896ffeeef32b9c950ywan cfg_.rc_min_quantizer = 40; 97233d2500723e5594f3e7c70896ffeeef32b9c950ywan 98233d2500723e5594f3e7c70896ffeeef32b9c950ywan ::libvpx_test::I420VideoSource video("hantro_odd.yuv", 208, 144, 30, 1, 0, 99233d2500723e5594f3e7c70896ffeeef32b9c950ywan 20); 100233d2500723e5594f3e7c70896ffeeef32b9c950ywan 101233d2500723e5594f3e7c70896ffeeef32b9c950ywan ASSERT_NO_FATAL_FAILURE(RunLoop(&video)); 102233d2500723e5594f3e7c70896ffeeef32b9c950ywan} 103233d2500723e5594f3e7c70896ffeeef32b9c950ywan 104233d2500723e5594f3e7c70896ffeeef32b9c950ywanusing std::tr1::make_tuple; 105233d2500723e5594f3e7c70896ffeeef32b9c950ywan 106233d2500723e5594f3e7c70896ffeeef32b9c950ywan#define VP9_FACTORY \ 107233d2500723e5594f3e7c70896ffeeef32b9c950ywan static_cast<const libvpx_test::CodecFactory*> (&libvpx_test::kVP9) 108233d2500723e5594f3e7c70896ffeeef32b9c950ywan 109233d2500723e5594f3e7c70896ffeeef32b9c950ywanVP9_INSTANTIATE_TEST_CASE( 110233d2500723e5594f3e7c70896ffeeef32b9c950ywan CpuSpeedTest, 111233d2500723e5594f3e7c70896ffeeef32b9c950ywan ::testing::Values(::libvpx_test::kTwoPassGood, ::libvpx_test::kOnePassGood), 112233d2500723e5594f3e7c70896ffeeef32b9c950ywan ::testing::Range(0, 8)); 113233d2500723e5594f3e7c70896ffeeef32b9c950ywan} // namespace 114