11#include <promeki/config.h>
12#if PROMEKI_ENABLE_NTV2
23PROMEKI_NAMESPACE_BEGIN
118class Ntv2DeviceClock :
public Clock {
130 static const ClockDomain &domainFor(
const Ntv2Device &device);
147 Ntv2DeviceClock(Ntv2Device *device,
bool vbiFallback);
149 ~Ntv2DeviceClock()
override;
172 static Ntv2DeviceClock *createForTest(
const String &testDomainName,
bool vbiFallback);
174 int64_t resolutionNs()
const override;
175 ClockJitter jitter()
const override;
202 double rateRatio()
const override;
217 void noteVbi(
const TimeStamp &now);
229 void setSampleRate(
float sampleRateHz);
253 MediaTimeStamp mediaTimeStampFromSamples(uint64_t samples)
const;
262 void setFrameRate(
const FrameRate &frameRate);
280 void setCounterSourceForTest(
bool (*fn)(uint32_t *out,
void *ctx),
void *ctx);
296 void setWallTimeSourceForTest(int64_t (*fn)(
void *ctx),
void *ctx);
310 static constexpr int64_t kRateBaselineMinWindowNs = 5'000'000'000LL;
321 static constexpr int64_t kRateUpdateIntervalNs = 1'000'000'000LL;
333 static constexpr int _kRateLpfAlphaPer1000 = 100;
336 Result<int64_t> raw()
const override;
337 Error sleepUntilNs(int64_t targetNs)
const override;
342 Ntv2DeviceClock(
const ClockDomain &domain,
bool vbiFallback);
344 int64_t sampleTicksToNs(uint64_t ticks)
const;
346 Ntv2Device *_device =
nullptr;
347 bool _vbiFallback =
false;
351 float _sampleRateHz = 48000.0f;
355 mutable Mutex _mutex;
356 mutable uint32_t _lastLow = 0;
357 mutable uint64_t _highBits = 0;
358 mutable bool _hasShadow =
false;
361 mutable Atomic<int64_t> _lastVbiNs{0};
364 FrameRate _frameRate;
369 bool (*_testCounterFn)(uint32_t *,
void *) =
nullptr;
370 void *_testCounterCtx =
nullptr;
376 int64_t (*_testWallFn)(
void *) =
nullptr;
377 void *_testWallCtx =
nullptr;
382 mutable Atomic<int64_t> _ratePpb{1'000'000'000};
383 mutable bool _rateBaselineValid =
false;
384 mutable int64_t _rateBaselineWallNs = 0;
385 mutable int64_t _rateBaselineCounterNs = 0;
386 mutable int64_t _lastRateUpdateWallNs = 0;