/* * Copyright (c) 2019, Alliance for Open Media. All rights reserved * * This source code is subject to the terms of the BSD 2 Clause License and * the Alliance for Open Media Patent License 1.0. If the BSD 2 Clause License * was not distributed with this source code in the LICENSE file, you can * obtain it at www.aomedia.org/license/software. If the Alliance for Open * Media Patent License 1.0 was not distributed with this source code in the * PATENTS file, you can obtain it at www.aomedia.org/license/patent. */ // Test AOM timestamp handling #include "test/codec_factory.h" #include "test/encode_test_driver.h" #include "test/util.h" #include "test/video_source.h" #include "third_party/googletest/src/googletest/include/gtest/gtest.h" namespace { const int kVideoSourceWidth = 320; const int kVideoSourceHeight = 240; const int kFramesToEncode = 3; // A video source that exposes functions to set the timebase, framerate and // starting pts. class DummyTimebaseVideoSource : public ::libaom_test::DummyVideoSource { public: // Parameters num and den set the timebase for the video source. DummyTimebaseVideoSource(int num, int den) : framerate_numerator_(30), framerate_denominator_(1), starting_pts_(0) { SetSize(kVideoSourceWidth, kVideoSourceHeight); set_limit(kFramesToEncode); timebase_.num = num; timebase_.den = den; } void SetFramerate(int numerator, int denominator) { framerate_numerator_ = numerator; framerate_denominator_ = denominator; } // Returns one frames duration in timebase units as a double. double FrameDuration() const { return (static_cast(timebase_.den) / timebase_.num) / (static_cast(framerate_numerator_) / framerate_denominator_); } aom_codec_pts_t pts() const override { return static_cast(frame_ * FrameDuration() + starting_pts_ + 0.5); } unsigned long duration() const override { return static_cast(FrameDuration() + 0.5); } aom_rational_t timebase() const override { return timebase_; } void set_starting_pts(int64_t starting_pts) { starting_pts_ = starting_pts; } private: aom_rational_t timebase_; int framerate_numerator_; int framerate_denominator_; int64_t starting_pts_; }; class TimestampTest : public ::libaom_test::EncoderTest, public ::libaom_test::CodecTestWithParam { protected: TimestampTest() : EncoderTest(GET_PARAM(0)) {} ~TimestampTest() override = default; void SetUp() override { InitializeConfig(GET_PARAM(1)); } }; // Tests encoding in millisecond timebase. TEST_P(TimestampTest, EncodeFrames) { DummyTimebaseVideoSource video(1, 1000); ASSERT_NO_FATAL_FAILURE(RunLoop(&video)); } TEST_P(TimestampTest, TestMicrosecondTimebase) { // Set the timebase to microseconds. DummyTimebaseVideoSource video(1, 1000000); video.set_limit(1); ASSERT_NO_FATAL_FAILURE(RunLoop(&video)); } TEST_P(TimestampTest, TestAv1Rollover) { DummyTimebaseVideoSource video(1, 1000); video.set_starting_pts(922337170351ll); ASSERT_NO_FATAL_FAILURE(RunLoop(&video)); } #if CONFIG_REALTIME_ONLY AV1_INSTANTIATE_TEST_SUITE(TimestampTest, ::testing::Values(::libaom_test::kRealTime)); #else AV1_INSTANTIATE_TEST_SUITE(TimestampTest, ::testing::Values(::libaom_test::kRealTime, ::libaom_test::kTwoPassGood)); #endif } // namespace