1 /*
2  *  Copyright (C) 2005-2018 Team Kodi
3  *  This file is part of Kodi - https://kodi.tv
4  *
5  *  SPDX-License-Identifier: GPL-2.0-or-later
6  *  See LICENSES/README.md for more information.
7  */
8 
9 #pragma once
10 
11 #include "threads/CriticalSection.h"
12 #include "threads/Event.h"
13 #include "threads/Thread.h"
14 
15 #include <memory>
16 
17 class CVideoSync;
18 
19 class CVideoReferenceClock : CThread
20 {
21   public:
22     CVideoReferenceClock();
23     ~CVideoReferenceClock() override;
24 
25     int64_t GetTime(bool interpolated = true);
26     void    SetSpeed(double Speed);
27     double  GetSpeed();
28     double  GetRefreshRate(double* interval = nullptr);
29     bool    GetClockInfo(int& MissedVblanks, double& ClockSpeed, double& RefreshRate) const;
30 
31   private:
32     void    Process() override;
33     void Start();
34     void    UpdateRefreshrate();
35     void    UpdateClock(int NrVBlanks, bool CheckMissed);
36     double  UpdateInterval() const;
37     int64_t TimeOfNextVblank() const;
38     static void CBUpdateClock(int NrVBlanks, uint64_t time, void *clock);
39 
40     int64_t m_CurrTime;          //the current time of the clock when using vblank as clock source
41     int64_t m_LastIntTime;       //last interpolated clock value, to make sure the clock doesn't go backwards
42     double  m_CurrTimeFract;     //fractional part that is lost due to rounding when updating the clock
43     double  m_ClockSpeed;        //the frequency of the clock set by VideoPlayer
44     int64_t m_SystemFrequency;   //frequency of the systemclock
45 
46     bool    m_UseVblank;         //set to true when vblank is used as clock source
47     double  m_RefreshRate;       //current refreshrate
48     int     m_MissedVblanks;     //number of clock updates missed by the vblank clock
49     int     m_TotalMissedVblanks;//total number of clock updates missed, used by codec information screen
50     int64_t m_VblankTime;        //last time the clock was updated when using vblank as clock
51 
52     CEvent m_vsyncStopEvent;
53 
54     mutable CCriticalSection m_CritSection;
55 
56     std::unique_ptr<CVideoSync> m_pVideoSync;
57 };
58