11#include <promeki/config.h>
12#if PROMEKI_ENABLE_PROAV && PROMEKI_ENABLE_SRT
30PROMEKI_NAMESPACE_BEGIN
123class SrtMediaIO :
public SharedThreadMediaIO {
124 PROMEKI_OBJECT(SrtMediaIO, SharedThreadMediaIO)
127 static inline const MediaIOStats::ID StatsPacketsWritten{
"PacketsWritten"};
130 static inline const MediaIOStats::ID StatsBytesWritten{
"BytesWritten"};
133 static inline const MediaIOStats::ID StatsMessagesWritten{
"MessagesWritten"};
136 static inline const MediaIOStats::ID StatsFramesWritten{
"FramesWritten"};
139 static inline const MediaIOStats::ID StatsPacketsRead{
"PacketsRead"};
142 static inline const MediaIOStats::ID StatsBytesRead{
"BytesRead"};
145 static inline const MediaIOStats::ID StatsMessagesRead{
"MessagesRead"};
148 static inline const MediaIOStats::ID StatsFramesRead{
"FramesRead"};
151 static inline const MediaIOStats::ID StatsContinuityErrors{
"ContinuityErrors"};
154 static inline const MediaIOStats::ID StatsBytesDiscarded{
"BytesDiscarded"};
157 static inline const MediaIOStats::ID StatsRttUs{
"SrtRttUs"};
160 static inline const MediaIOStats::ID StatsLinkBandwidthBps{
"SrtLinkBandwidthBps"};
163 static inline const MediaIOStats::ID StatsRcvDrops{
"SrtRcvDrops"};
166 static inline const MediaIOStats::ID StatsRetransmitted{
"SrtRetransmitted"};
168 SrtMediaIO(ObjectBase *parent =
nullptr);
169 ~SrtMediaIO()
override;
171 Error describe(MediaIODescription *out)
const override;
172 Error proposeInput(
const MediaDesc &offered, MediaDesc *preferred)
const override;
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;
183 Error openSink(
const MediaIOCommandOpen &cmd);
184 Error openSource(
const MediaIOCommandOpen &cmd);
185 Error openTransport(
const MediaIO::Config &cfg);
186 Error flushWriteBuffer();
188 void applyFramerConfig(
const MediaIO::Config &cfg);
191 void armVideoPaceGate();
195 bool paceVideoFrame();
197 bool _isWrite =
false;
200 UniquePtr<SrtSocketTransport> _transport;
201 UniquePtr<MpegTsFramer> _framer;
202 Frame::List _readQueue;
208 size_t _writeBufFill = 0;
209 size_t _writePayloadSize = 1316;
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;
227 FrameRate _frameRate;
228 PacingGate _videoPaceGate;
229 SrtVideoPacing _videoPacingMode{SrtVideoPacing::Internal};
230 int _paceSkipThresholdMs = 0;
231 int _paceReanchorThresholdMs = 0;
232 bool _paceClockIsExternal =
false;
270class SrtFactory :
public MediaIOFactory {
272 SrtFactory() =
default;
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).");
280 bool canBeSink()
const override {
return true; }
281 bool canBeSource()
const override {
return true; }
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;