libpromeki 1.0.0-alpha
PROfessional MEdia toolKIt
 
Loading...
Searching...
No Matches
nullpacingmediaio.h
Go to the documentation of this file.
1
8#pragma once
9
10
11#include <promeki/config.h>
12#if PROMEKI_ENABLE_PROAV
13#include <promeki/atomic.h>
14#include <promeki/clock.h>
15#include <promeki/duration.h>
16#include <promeki/enums.h>
17#include <promeki/framerate.h>
18#include <promeki/mediadesc.h>
20#include <promeki/mutex.h>
21#include <promeki/namespace.h>
22#include <promeki/pacinggate.h>
23#include <promeki/ratetracker.h>
25#include <promeki/timestamp.h>
26
27PROMEKI_NAMESPACE_BEGIN
28
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;
58};
59
111class NullPacingMediaIO : public SharedThreadMediaIO {
112 PROMEKI_OBJECT(NullPacingMediaIO, SharedThreadMediaIO)
113 public:
122 NullPacingMediaIO(ObjectBase *parent = nullptr);
123
125 ~NullPacingMediaIO() override;
126
136 NullPacingSnapshot snapshot() const;
137
138 protected:
139 Error executeCmd(MediaIOCommandOpen &cmd) override;
140 Error executeCmd(MediaIOCommandClose &cmd) override;
141 Error executeCmd(MediaIOCommandWrite &cmd) override;
142 Error executeCmd(MediaIOCommandStats &cmd) override;
143
144 private:
145 // ---- Resolved configuration (latched at open time) ----
146 NullPacingMode _mode = NullPacingMode::Wallclock;
147 FrameRate _targetRate;
148 Duration _period;
149 bool _burnTimings = false;
150 bool _isOpen = false;
151
152 // ---- Pacing state ----
153 //
154 // Wallclock-mode pacing runs through PacingGate's
155 // non-blocking tryAcquire path: if the next tick
156 // deadline has arrived we consume, otherwise we drop
157 // (the existing rate-limiter semantic). Free mode
158 // leaves the gate without a clock so tryAcquire
159 // returns true unconditionally and every frame is
160 // consumed.
161 PacingGate _gate;
162
166 TimeStamp _lastConsumed;
167 bool _hasLastConsumed = false;
168
169 // ---- Counters (mutex-guarded; cheap to read via
170 // snapshot, cheap to update on every frame) ----
171 mutable Mutex _stateMutex;
172 NullPacingSnapshot _stats;
173};
174
185class NullPacingFactory : public MediaIOFactory {
186 public:
187 NullPacingFactory() = default;
188
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).");
193 }
194
195 bool canBeSink() const override { return true; }
196
197 Config::SpecMap configSpecs() const override;
198
199 MediaIO *create(const Config &config, ObjectBase *parent = nullptr) const override;
200};
201
202PROMEKI_NAMESPACE_END
203
204#endif // PROMEKI_ENABLE_PROAV