11#include <promeki/config.h>
12#if PROMEKI_ENABLE_PROAV
27PROMEKI_NAMESPACE_BEGIN
40struct NullPacingSnapshot {
42 int64_t framesConsumed = 0;
46 int64_t framesDropped = 0;
50 int64_t totalLatencyUs = 0;
53 int64_t peakLatencyUs = 0;
57 int64_t latencySamples = 0;
111class NullPacingMediaIO :
public SharedThreadMediaIO {
112 PROMEKI_OBJECT(NullPacingMediaIO, SharedThreadMediaIO)
122 NullPacingMediaIO(ObjectBase *parent =
nullptr);
125 ~NullPacingMediaIO()
override;
136 NullPacingSnapshot snapshot()
const;
139 Error executeCmd(MediaIOCommandOpen &cmd)
override;
140 Error executeCmd(MediaIOCommandClose &cmd)
override;
141 Error executeCmd(MediaIOCommandWrite &cmd)
override;
142 Error executeCmd(MediaIOCommandStats &cmd)
override;
146 NullPacingMode _mode = NullPacingMode::Wallclock;
147 FrameRate _targetRate;
149 bool _burnTimings =
false;
150 bool _isOpen =
false;
166 TimeStamp _lastConsumed;
167 bool _hasLastConsumed =
false;
171 mutable Mutex _stateMutex;
172 NullPacingSnapshot _stats;
185class NullPacingFactory :
public MediaIOFactory {
187 NullPacingFactory() =
default;
189 String name()
const override {
return String(
"NullPacing"); }
190 String displayName()
const override {
return String(
"Null Pacing Sink"); }
191 String description()
const override {
192 return String(
"Frame-pacing null sink (consumes and discards frames at a target rate).");
195 bool canBeSink()
const override {
return true; }
197 Config::SpecMap configSpecs()
const override;
199 MediaIO *create(
const Config &config, ObjectBase *parent =
nullptr)
const override;