xref: /aosp_15_r20/external/libaom/test/time_stamp_test.cc (revision 77c1e3ccc04c968bd2bc212e87364f250e820521)
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