11#include <promeki/config.h>
12#if PROMEKI_ENABLE_PROAV
36PROMEKI_NAMESPACE_BEGIN
38class MediaIOStatsCollector;
77class MediaPipeline :
public ObjectBase {
78 PROMEKI_OBJECT(MediaPipeline, ObjectBase)
108 enum class PlaybackState {
128 enum class CaptureState {
139 explicit MediaPipeline(ObjectBase *parent =
nullptr);
142 ~MediaPipeline()
override;
168 Error build(
const MediaPipelineConfig &config,
bool autoplan =
false);
214 Error injectStage(MediaIO *io);
284 Error close(
bool block =
true);
299 static constexpr unsigned int DefaultCloseTimeoutMs = 3000;
309 void setCloseTimeoutMs(
unsigned int ms) { _closeTimeoutMs = ms; }
312 unsigned int closeTimeoutMs()
const {
return _closeTimeoutMs; }
320 bool isClosing()
const {
return _closing; }
323 State state()
const {
return _state; }
337 PlaybackState playbackState()
const {
return _playbackState; }
373 Error togglePlayPause();
396 Error setRate(
double r);
406 FrameNumber currentFrame()
const;
427 Error seek(FrameNumber pos, MediaIOSeekMode mode = MediaIO_SeekDefault);
439 Error stepForward(int64_t n = 1);
450 Error stepBackward(int64_t n = 1);
464 CaptureState captureState()
const {
return _captureState; }
494 Error startCapture();
510 Error pauseCapture();
525 Error resumeCapture();
552 Error setCaptureTrigger(MediaPipelineTrigger::UPtr trig);
562 Error setCaptureTrigger(Function<
bool(
const Frame &)> fn);
576 Error setCaptureTrigger(
const String &queryExpr);
579 Error clearCaptureTrigger();
586 const MediaPipelineConfig &config()
const {
return _config; }
592 MediaIO *stage(
const String &name)
const;
595 StringList stageNames()
const;
604 StringList describe()
const;
623 MediaPipelineStats stats();
633 MediaPipelineStageStats stageStats(
const String &name);
648 PROMEKI_SIGNAL(pipelineError, String, Error);
651 PROMEKI_SIGNAL(stageOpened, String);
654 PROMEKI_SIGNAL(stageStarted, String);
657 PROMEKI_SIGNAL(stageStopped, String);
660 PROMEKI_SIGNAL(stageClosed, String);
675 PROMEKI_SIGNAL(finished,
bool);
691 PROMEKI_SIGNAL(closed, Error);
706 PROMEKI_SIGNAL(statsUpdated, MediaPipelineStats);
720 PROMEKI_SIGNAL(playbackStateChanged, PlaybackState);
731 PROMEKI_SIGNAL(rateChanged,
double);
740 PROMEKI_SIGNAL(positionChanged, FrameNumber);
751 PROMEKI_SIGNAL(captureStateChanged, CaptureState);
763 using EventCallback = Function<void(
const PipelineEvent &)>;
789 int subscribe(EventCallback cb);
800 void unsubscribe(
int id);
819 void setStatsInterval(Duration interval);
822 Duration statsInterval()
const {
return _statsInterval; }
835 MediaIO *to =
nullptr;
836 MediaIOSink *toSink =
nullptr;
837 bool isSinkEdge =
false;
838 bool capReached =
false;
848 MediaIO *from =
nullptr;
849 MediaIOPortConnection *connection =
nullptr;
850 List<EdgeState> edges;
851 bool upstreamDone =
false;
860 Error destroyStages();
861 Error topologicallySort(List<String> &order)
const;
862 MediaIO *instantiateStage(
const MediaPipelineConfig::Stage &s);
876 void wireConnectionsForOpenedStage(
const String &name);
887 void publish(PipelineEvent ev);
893 void publishStateChanged();
903 void publishTransportStateChanged(
const String &scope,
const String &newState);
912 void setPlaybackState(PlaybackState s);
929 Error resolvePacingStage();
942 Error resolveCaptureSinks();
948 void setCaptureState(CaptureState s);
960 void onCaptureFrame(
const Frame &frame);
969 void setCaptureGates(
bool open);
972 void installCaptureInspectorIfNeeded();
975 void removeCaptureInspector();
981 void publishStageState(
const String &stageName,
const String &transition);
984 void installLoggerTap();
987 void removeLoggerTap();
990 void startStatsTimerIfNeeded();
993 void stopStatsTimer();
996 void emitStatsSnapshot();
1008 void onUpstreamDone(
const String &srcName);
1015 void onSourceConnectionError(
const String &srcName, Error err);
1022 void onSinkConnectionError(
const String &srcName, MediaIOSink *sink, Error err);
1032 void onSinkLimitReached(
const String &srcName, MediaIOSink *sink);
1048 void initiateClose(
bool clean);
1061 void forceCloseRemaining();
1065 void timerEvent(TimerEvent *e)
override;
1074 void onStageClosed(
const String &stageName, Error err);
1085 void finalizeClose();
1098 void attachStatsCollector(
const String &name, MediaIO *io);
1108 void clearStatsCollectors();
1117 MediaPipelineStageStats buildStageStats(
const String &name, MediaIO *io);
1119 MediaPipelineConfig _config;
1120 State _state = State::Empty;
1121 PlaybackState _playbackState = PlaybackState::Idle;
1122 CaptureState _captureState = CaptureState::Idle;
1128 MediaIO *_pacingStage =
nullptr;
1129 MediaIOPortGroup *_pacingGroup =
nullptr;
1130 Clock::Ptr _pacingClock;
1136 List<MediaIO *> _captureSinks;
1137 MediaPipelineTrigger::UPtr _captureTrigger;
1138 Map<String, MediaIO *> _stages;
1139 Map<String, MediaIO *> _injected;
1140 Map<String, MediaIOStatsCollector *> _statsCollectors;
1141 Map<String, SourceState> _sources;
1142 List<String> _topoOrder;
1150 bool _closing =
false;
1151 bool _cleanFinish =
false;
1152 Set<String> _stagesAwaitingClosed;
1153 Error _closeError = Error::Ok;
1159 unsigned int _closeTimeoutMs = DefaultCloseTimeoutMs;
1160 int _closeWatchdogTimerId = -1;
1172 int64_t _frameCountLimit = 0;
1173 int _terminalSinksRemaining = 0;
1182 mutable Mutex _subsMutex;
1183 Map<int, Subscriber> _subscribers;
1185 Logger::ListenerHandle _loggerTap = 0;
1190 Duration _statsInterval;
1191 int _statsTimerId = -1;
1194PROMEKI_NAMESPACE_END