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 "third_party/googletest/src/include/gtest/gtest.h" 11233d2500723e5594f3e7c70896ffeeef32b9c950ywan#include "test/codec_factory.h" 12233d2500723e5594f3e7c70896ffeeef32b9c950ywan#include "test/encode_test_driver.h" 13233d2500723e5594f3e7c70896ffeeef32b9c950ywan#include "test/i420_video_source.h" 14233d2500723e5594f3e7c70896ffeeef32b9c950ywan#include "test/util.h" 15233d2500723e5594f3e7c70896ffeeef32b9c950ywannamespace { 16233d2500723e5594f3e7c70896ffeeef32b9c950ywan 17233d2500723e5594f3e7c70896ffeeef32b9c950ywan// lookahead range: [kLookAheadMin, kLookAheadMax). 18233d2500723e5594f3e7c70896ffeeef32b9c950ywanconst int kLookAheadMin = 5; 19233d2500723e5594f3e7c70896ffeeef32b9c950ywanconst int kLookAheadMax = 26; 20233d2500723e5594f3e7c70896ffeeef32b9c950ywan 21233d2500723e5594f3e7c70896ffeeef32b9c950ywanclass AltRefTest : public ::libvpx_test::EncoderTest, 22233d2500723e5594f3e7c70896ffeeef32b9c950ywan public ::libvpx_test::CodecTestWithParam<int> { 23233d2500723e5594f3e7c70896ffeeef32b9c950ywan protected: 24233d2500723e5594f3e7c70896ffeeef32b9c950ywan AltRefTest() : EncoderTest(GET_PARAM(0)), altref_count_(0) {} 25233d2500723e5594f3e7c70896ffeeef32b9c950ywan virtual ~AltRefTest() {} 26233d2500723e5594f3e7c70896ffeeef32b9c950ywan 27233d2500723e5594f3e7c70896ffeeef32b9c950ywan virtual void SetUp() { 28233d2500723e5594f3e7c70896ffeeef32b9c950ywan InitializeConfig(); 29233d2500723e5594f3e7c70896ffeeef32b9c950ywan SetMode(libvpx_test::kTwoPassGood); 30233d2500723e5594f3e7c70896ffeeef32b9c950ywan } 31233d2500723e5594f3e7c70896ffeeef32b9c950ywan 32233d2500723e5594f3e7c70896ffeeef32b9c950ywan virtual void BeginPassHook(unsigned int pass) { 33233d2500723e5594f3e7c70896ffeeef32b9c950ywan altref_count_ = 0; 34233d2500723e5594f3e7c70896ffeeef32b9c950ywan } 35233d2500723e5594f3e7c70896ffeeef32b9c950ywan 36233d2500723e5594f3e7c70896ffeeef32b9c950ywan virtual void PreEncodeFrameHook(libvpx_test::VideoSource *video, 37233d2500723e5594f3e7c70896ffeeef32b9c950ywan libvpx_test::Encoder *encoder) { 38233d2500723e5594f3e7c70896ffeeef32b9c950ywan if (video->frame() == 1) { 39233d2500723e5594f3e7c70896ffeeef32b9c950ywan encoder->Control(VP8E_SET_ENABLEAUTOALTREF, 1); 40233d2500723e5594f3e7c70896ffeeef32b9c950ywan encoder->Control(VP8E_SET_CPUUSED, 3); 41233d2500723e5594f3e7c70896ffeeef32b9c950ywan } 42233d2500723e5594f3e7c70896ffeeef32b9c950ywan } 43233d2500723e5594f3e7c70896ffeeef32b9c950ywan 44233d2500723e5594f3e7c70896ffeeef32b9c950ywan virtual void FramePktHook(const vpx_codec_cx_pkt_t *pkt) { 45233d2500723e5594f3e7c70896ffeeef32b9c950ywan if (pkt->data.frame.flags & VPX_FRAME_IS_INVISIBLE) ++altref_count_; 46233d2500723e5594f3e7c70896ffeeef32b9c950ywan } 47233d2500723e5594f3e7c70896ffeeef32b9c950ywan 48233d2500723e5594f3e7c70896ffeeef32b9c950ywan int altref_count() const { return altref_count_; } 49233d2500723e5594f3e7c70896ffeeef32b9c950ywan 50233d2500723e5594f3e7c70896ffeeef32b9c950ywan private: 51233d2500723e5594f3e7c70896ffeeef32b9c950ywan int altref_count_; 52233d2500723e5594f3e7c70896ffeeef32b9c950ywan}; 53233d2500723e5594f3e7c70896ffeeef32b9c950ywan 54233d2500723e5594f3e7c70896ffeeef32b9c950ywanTEST_P(AltRefTest, MonotonicTimestamps) { 55233d2500723e5594f3e7c70896ffeeef32b9c950ywan const vpx_rational timebase = { 33333333, 1000000000 }; 56233d2500723e5594f3e7c70896ffeeef32b9c950ywan cfg_.g_timebase = timebase; 57233d2500723e5594f3e7c70896ffeeef32b9c950ywan cfg_.rc_target_bitrate = 1000; 58233d2500723e5594f3e7c70896ffeeef32b9c950ywan cfg_.g_lag_in_frames = GET_PARAM(1); 59233d2500723e5594f3e7c70896ffeeef32b9c950ywan 60233d2500723e5594f3e7c70896ffeeef32b9c950ywan libvpx_test::I420VideoSource video("hantro_collage_w352h288.yuv", 352, 288, 61233d2500723e5594f3e7c70896ffeeef32b9c950ywan timebase.den, timebase.num, 0, 30); 62233d2500723e5594f3e7c70896ffeeef32b9c950ywan ASSERT_NO_FATAL_FAILURE(RunLoop(&video)); 63233d2500723e5594f3e7c70896ffeeef32b9c950ywan EXPECT_GE(altref_count(), 1); 64233d2500723e5594f3e7c70896ffeeef32b9c950ywan} 65233d2500723e5594f3e7c70896ffeeef32b9c950ywan 66233d2500723e5594f3e7c70896ffeeef32b9c950ywan 67233d2500723e5594f3e7c70896ffeeef32b9c950ywanVP8_INSTANTIATE_TEST_CASE(AltRefTest, 68233d2500723e5594f3e7c70896ffeeef32b9c950ywan ::testing::Range(kLookAheadMin, kLookAheadMax)); 69233d2500723e5594f3e7c70896ffeeef32b9c950ywan} // namespace 70