2 * Copyright (C) 2015-2018 Team Kodi
3 * This file is part of Kodi - https://kodi.tv
5 * SPDX-License-Identifier: GPL-2.0-or-later
6 * See LICENSES/README.md for more information.
9 #include "VideoSyncIos.h"
11 #include "cores/VideoPlayer/VideoReferenceClock.h"
12 #include "utils/MathUtils.h"
13 #include "utils/TimeUtils.h"
14 #include "utils/log.h"
15 #include "windowing/GraphicContext.h"
16 #include "windowing/ios/WinSystemIOS.h"
18 bool CVideoSyncIos::Setup()
20 CLog::Log(LOGDEBUG
, "CVideoSyncIos::{} setting up OSX", __FUNCTION__
);
22 //init the vblank timestamp
23 m_LastVBlankTime
= CurrentHostCounter();
26 bool setupOk
= InitDisplayLink();
29 m_winSystem
.Register(this);
35 void CVideoSyncIos::Run(CEvent
& stopEvent
)
37 //because cocoa has a vblank callback, we just keep sleeping until we're asked to stop the thread
38 XbmcThreads::CEventGroup waitGroup
{&stopEvent
, &m_abortEvent
};
42 void CVideoSyncIos::Cleanup()
44 CLog::Log(LOGDEBUG
, "CVideoSyncIos::{} cleaning up OSX", __FUNCTION__
);
46 m_winSystem
.Unregister(this);
49 float CVideoSyncIos::GetFps()
51 m_fps
= CServiceBroker::GetWinSystem()->GetGfxContext().GetFPS();
52 CLog::Log(LOGDEBUG
, "CVideoSyncIos::{} Detected refreshrate: {:f} hertz", __FUNCTION__
, m_fps
);
56 void CVideoSyncIos::OnResetDisplay()
61 void CVideoSyncIos::IosVblankHandler()
65 int64_t nowtime
= CurrentHostCounter();
67 //calculate how many vblanks happened
68 VBlankTime
= (double)(nowtime
- m_LastVBlankTime
) / (double)CurrentHostFrequency();
69 NrVBlanks
= MathUtils::round_int(VBlankTime
* static_cast<double>(m_fps
));
71 //save the timestamp of this vblank so we can calculate how many happened next time
72 m_LastVBlankTime
= nowtime
;
74 //update the vblank timestamp, update the clock and send a signal that we got a vblank
75 m_refClock
->UpdateClock(NrVBlanks
, nowtime
);
78 bool CVideoSyncIos::InitDisplayLink()
81 CLog::Log(LOGDEBUG
, "CVideoSyncIos: setting up displaylink");
82 if (!m_winSystem
.InitDisplayLink(this))
84 CLog::Log(LOGDEBUG
, "CVideoSyncIos: InitDisplayLink failed");
90 void CVideoSyncIos::DeinitDisplayLink()
92 m_winSystem
.DeinitDisplayLink();