1 /*
2 * Copyright (c) 2019, 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 // Test AOM timestamp handling
13
14 #include "gtest/gtest.h"
15 #include "test/codec_factory.h"
16 #include "test/encode_test_driver.h"
17 #include "test/util.h"
18 #include "test/video_source.h"
19
20 namespace {
21
22 const int kVideoSourceWidth = 320;
23 const int kVideoSourceHeight = 240;
24 const int kFramesToEncode = 3;
25
26 // A video source that exposes functions to set the timebase, framerate and
27 // starting pts.
28 class DummyTimebaseVideoSource : public ::libaom_test::DummyVideoSource {
29 public:
30 // Parameters num and den set the timebase for the video source.
DummyTimebaseVideoSource(int num,int den)31 DummyTimebaseVideoSource(int num, int den)
32 : framerate_numerator_(30), framerate_denominator_(1), starting_pts_(0) {
33 SetSize(kVideoSourceWidth, kVideoSourceHeight);
34 set_limit(kFramesToEncode);
35 timebase_.num = num;
36 timebase_.den = den;
37 }
38
SetFramerate(int numerator,int denominator)39 void SetFramerate(int numerator, int denominator) {
40 framerate_numerator_ = numerator;
41 framerate_denominator_ = denominator;
42 }
43
44 // Returns one frames duration in timebase units as a double.
FrameDuration() const45 double FrameDuration() const {
46 return (static_cast<double>(timebase_.den) / timebase_.num) /
47 (static_cast<double>(framerate_numerator_) / framerate_denominator_);
48 }
49
pts() const50 aom_codec_pts_t pts() const override {
51 return static_cast<aom_codec_pts_t>(frame_ * FrameDuration() +
52 starting_pts_ + 0.5);
53 }
54
duration() const55 unsigned long duration() const override {
56 return static_cast<unsigned long>(FrameDuration() + 0.5);
57 }
58
timebase() const59 aom_rational_t timebase() const override { return timebase_; }
60
set_starting_pts(int64_t starting_pts)61 void set_starting_pts(int64_t starting_pts) { starting_pts_ = starting_pts; }
62
63 private:
64 aom_rational_t timebase_;
65 int framerate_numerator_;
66 int framerate_denominator_;
67 int64_t starting_pts_;
68 };
69
70 class TimestampTest
71 : public ::libaom_test::EncoderTest,
72 public ::libaom_test::CodecTestWithParam<libaom_test::TestMode> {
73 protected:
TimestampTest()74 TimestampTest() : EncoderTest(GET_PARAM(0)) {}
75 ~TimestampTest() override = default;
76
SetUp()77 void SetUp() override { InitializeConfig(GET_PARAM(1)); }
78 };
79
80 // Tests encoding in millisecond timebase.
TEST_P(TimestampTest,EncodeFrames)81 TEST_P(TimestampTest, EncodeFrames) {
82 DummyTimebaseVideoSource video(1, 1000);
83 ASSERT_NO_FATAL_FAILURE(RunLoop(&video));
84 }
85
TEST_P(TimestampTest,TestMicrosecondTimebase)86 TEST_P(TimestampTest, TestMicrosecondTimebase) {
87 // Set the timebase to microseconds.
88 DummyTimebaseVideoSource video(1, 1000000);
89 video.set_limit(1);
90 ASSERT_NO_FATAL_FAILURE(RunLoop(&video));
91 }
92
TEST_P(TimestampTest,TestAv1Rollover)93 TEST_P(TimestampTest, TestAv1Rollover) {
94 DummyTimebaseVideoSource video(1, 1000);
95 video.set_starting_pts(922337170351ll);
96 ASSERT_NO_FATAL_FAILURE(RunLoop(&video));
97 }
98 #if CONFIG_REALTIME_ONLY
99 AV1_INSTANTIATE_TEST_SUITE(TimestampTest,
100 ::testing::Values(::libaom_test::kRealTime));
101 #else
102 AV1_INSTANTIATE_TEST_SUITE(TimestampTest,
103 ::testing::Values(::libaom_test::kRealTime,
104 ::libaom_test::kTwoPassGood));
105 #endif
106
107 } // namespace
108