11#include <promeki/config.h>
12#if PROMEKI_ENABLE_PROAV
25PROMEKI_NAMESPACE_BEGIN
109class MediaIOPortConnection :
public ObjectBase {
110 PROMEKI_OBJECT(MediaIOPortConnection, ObjectBase)
126 MediaIOPortConnection(MediaIOSource *source, MediaIOSink *sink, ObjectBase *parent =
nullptr);
139 explicit MediaIOPortConnection(MediaIOSource *source, ObjectBase *parent =
nullptr);
142 ~MediaIOPortConnection()
override;
145 MediaIOSource *source()
const {
return _source; }
153 MediaIOSink *sink()
const;
156 List<MediaIOSink *> sinks()
const;
159 int sinkCount()
const {
return static_cast<int>(_sinks.size()); }
162 bool isRunning()
const {
return _running; }
184 Error addSink(MediaIOSink *sink, FrameCount frameLimit = FrameCount());
221 int64_t framesTransferred()
const {
return _framesTransferred.value(); }
231 int64_t framesWritten(MediaIOSink *sink)
const;
234 bool upstreamDone()
const {
return _upstreamDone; }
242 bool sinkStopped(MediaIOSink *sink)
const;
245 bool allSinksDone()
const {
return _allSinksDoneEmitted; }
272 void setSinkGate(MediaIOSink *sink,
bool open);
282 bool sinkGate(MediaIOSink *sink)
const;
294 using FrameInspector = Function<void(
const Frame &)>;
307 void setFrameInspector(FrameInspector cb);
310 bool hasFrameInspector()
const {
return static_cast<bool>(_frameInspector); }
321 PROMEKI_SIGNAL(sinkGateChanged, MediaIOSink *,
bool);
333 PROMEKI_SIGNAL(upstreamDone);
347 PROMEKI_SIGNAL(errorOccurred, Error);
358 PROMEKI_SIGNAL(sinkLimitReached, MediaIOSink *);
373 PROMEKI_SIGNAL(sinkError, MediaIOSink *, Error);
385 PROMEKI_SIGNAL(allSinksDone);
388 PROMEKI_SIGNAL(stopped);
392 MediaIOSink *sink =
nullptr;
393 FrameCount frameLimit;
394 int64_t framesWritten = 0;
395 bool doneByLimit =
false;
396 bool stopped =
false;
398 bool gateOpen =
true;
408 bool pendingForceKeyframe =
false;
412 void onSinkWriteError(MediaIOSink *sink, Error err);
413 SinkState *findSinkState(MediaIOSink *sink);
414 const SinkState *findSinkState(MediaIOSink *sink)
const;
415 void maybeEmitAllSinksDone();
416 bool everyActiveSinkAcceptsWrite()
const;
420 MediaIOSource *_source =
nullptr;
421 List<SinkState> _sinks;
422 FrameInspector _frameInspector;
430 MediaIORequest _pendingRead;
431 bool _running =
false;
432 bool _upstreamDone =
false;
433 bool _allSinksDoneEmitted =
false;
434 Atomic<int64_t> _framesTransferred{0};
444 Atomic<bool> _pumpScheduled{
false};