libpromeki 1.0.0-alpha
PROfessional MEdia toolKIt
 
Loading...
Searching...
No Matches
srtmediaio.h
Go to the documentation of this file.
1
8#pragma once
9
10
11#include <promeki/config.h>
12#if PROMEKI_ENABLE_PROAV && PROMEKI_ENABLE_SRT
13#include <cstdint>
14#include <promeki/namespace.h>
15#include <promeki/buffer.h>
16#include <promeki/frame.h>
17#include <promeki/framerate.h>
18#include <promeki/list.h>
21#include <promeki/framerate.h>
22#include <promeki/pacinggate.h>
26#include <promeki/string.h>
27#include <promeki/uniqueptr.h>
28#include <promeki/url.h>
29
30PROMEKI_NAMESPACE_BEGIN
31
32class MpegTsFramer;
33
123class SrtMediaIO : public SharedThreadMediaIO {
124 PROMEKI_OBJECT(SrtMediaIO, SharedThreadMediaIO)
125 public:
127 static inline const MediaIOStats::ID StatsPacketsWritten{"PacketsWritten"};
128
130 static inline const MediaIOStats::ID StatsBytesWritten{"BytesWritten"};
131
133 static inline const MediaIOStats::ID StatsMessagesWritten{"MessagesWritten"};
134
136 static inline const MediaIOStats::ID StatsFramesWritten{"FramesWritten"};
137
139 static inline const MediaIOStats::ID StatsPacketsRead{"PacketsRead"};
140
142 static inline const MediaIOStats::ID StatsBytesRead{"BytesRead"};
143
145 static inline const MediaIOStats::ID StatsMessagesRead{"MessagesRead"};
146
148 static inline const MediaIOStats::ID StatsFramesRead{"FramesRead"};
149
151 static inline const MediaIOStats::ID StatsContinuityErrors{"ContinuityErrors"};
152
154 static inline const MediaIOStats::ID StatsBytesDiscarded{"BytesDiscarded"};
155
157 static inline const MediaIOStats::ID StatsRttUs{"SrtRttUs"};
158
160 static inline const MediaIOStats::ID StatsLinkBandwidthBps{"SrtLinkBandwidthBps"};
161
163 static inline const MediaIOStats::ID StatsRcvDrops{"SrtRcvDrops"};
164
166 static inline const MediaIOStats::ID StatsRetransmitted{"SrtRetransmitted"};
167
168 SrtMediaIO(ObjectBase *parent = nullptr);
169 ~SrtMediaIO() override;
170
171 Error describe(MediaIODescription *out) const override;
172 Error proposeInput(const MediaDesc &offered, MediaDesc *preferred) const override;
173
174 protected:
175 Error executeCmd(MediaIOCommandOpen &cmd) override;
176 Error executeCmd(MediaIOCommandClose &cmd) override;
177 Error executeCmd(MediaIOCommandWrite &cmd) override;
178 Error executeCmd(MediaIOCommandRead &cmd) override;
179 Error executeCmd(MediaIOCommandStats &cmd) override;
180 Error executeCmd(MediaIOCommandSetClock &cmd) override;
181
182 private:
183 Error openSink(const MediaIOCommandOpen &cmd);
184 Error openSource(const MediaIOCommandOpen &cmd);
185 Error openTransport(const MediaIO::Config &cfg);
186 Error flushWriteBuffer();
187 Error pumpReader();
188 void applyFramerConfig(const MediaIO::Config &cfg);
189
191 void armVideoPaceGate();
192
195 bool paceVideoFrame();
196
197 bool _isWrite = false;
198 bool _eof = false;
199
200 UniquePtr<SrtSocketTransport> _transport;
201 UniquePtr<MpegTsFramer> _framer;
202 Frame::List _readQueue;
203
204 // Writer-side accumulation buffer. We collect TS bytes
205 // from the muxer and only flush whole SRT messages
206 // (configurable, default 1316 bytes = 7 × 188).
207 Buffer _writeBuf;
208 size_t _writeBufFill = 0;
209 size_t _writePayloadSize = 1316;
210
211 // Reader-side scratch buffer for one SRT message.
212 Buffer _readBuf;
213
214 int64_t _packetsWritten = 0;
215 int64_t _bytesWritten = 0;
216 int64_t _messagesWritten = 0;
217 int64_t _framesWritten = 0;
218 int64_t _packetsRead = 0;
219 int64_t _bytesRead = 0;
220 int64_t _messagesRead = 0;
221 int64_t _framesRead = 0;
222
223 // Sink-side wall-clock pacing. Mirrors RtmpMediaIO /
224 // RtpMediaIO's pattern so live-mode transport sinks
225 // gate upstream-produced frames at frame-rate cadence
226 // even when no upstream stage is paced.
227 FrameRate _frameRate;
228 PacingGate _videoPaceGate;
229 SrtVideoPacing _videoPacingMode{SrtVideoPacing::Internal};
230 int _paceSkipThresholdMs = 0;
231 int _paceReanchorThresholdMs = 0;
232 bool _paceClockIsExternal = false;
233};
234
270class SrtFactory : public MediaIOFactory {
271 public:
272 SrtFactory() = default;
273
274 String name() const override { return String("Srt"); }
275 String displayName() const override { return String("SRT (MPEG-TS over SRT)"); }
276 String description() const override {
277 return String("MPEG-2 Transport Stream over Secure Reliable Transport "
278 "(H.264 / HEVC + AAC).");
279 }
280 bool canBeSink() const override { return true; }
281 bool canBeSource() const override { return true; }
282
283 StringList schemes() const override { return {String("srt")}; }
284 Config::SpecMap configSpecs() const override;
285 Error urlToConfig(const Url &url, Config *outConfig) const override;
286 MediaIO *create(const Config &config, ObjectBase *parent = nullptr) const override;
287};
288
289PROMEKI_NAMESPACE_END
290
291#endif // PROMEKI_ENABLE_PROAV && PROMEKI_ENABLE_SRT