11#include <promeki/config.h>
12#if PROMEKI_ENABLE_PROAV
27PROMEKI_NAMESPACE_BEGIN
55class MediaPipelineConfig {
56 PROMEKI_SHARED_FINAL(MediaPipelineConfig)
59 using Ptr = SharedPtr<MediaPipelineConfig>;
62 using List = ::promeki::List<MediaPipelineConfig>;
65 using PtrList = ::promeki::List<Ptr>;
77 enum class StageRole {
121 StageRole role = StageRole::NotOpen;
139 bool pacesPipeline =
false;
154 bool captureSink =
false;
157 bool operator==(
const Stage &other)
const;
158 bool operator!=(
const Stage &other)
const {
return !(*
this == other); }
184 bool operator==(
const Route &other)
const {
185 return from == other.from && to == other.to && fromTrack == other.fromTrack &&
186 toTrack == other.toTrack;
188 bool operator!=(
const Route &other)
const {
return !(*
this == other); }
192 using StageList = ::promeki::List<Stage>;
195 using RouteList = ::promeki::List<Route>;
198 MediaPipelineConfig() =
default;
205 const StageList &stages()
const {
return _stages; }
208 StageList &stages() {
return _stages; }
211 void addStage(
const Stage &s) { _stages.pushToBack(s); }
214 void addStage(Stage &&s) { _stages.pushToBack(std::move(s)); }
221 const Stage *findStage(
const String &name)
const;
224 bool hasStage(
const String &name)
const {
return findStage(name) !=
nullptr; }
227 StringList stageNames()
const;
234 const RouteList &routes()
const {
return _routes; }
237 RouteList &routes() {
return _routes; }
240 void addRoute(
const Route &r) { _routes.pushToBack(r); }
243 void addRoute(
const String &from,
const String &to);
257 Kind kind()
const {
return _kind; }
260 void setKind(Kind k) { _kind = k; }
273 bool startPaused()
const {
return _startPaused; }
276 void setStartPaused(
bool v) { _startPaused = v; }
283 const Metadata &pipelineMetadata()
const {
return _pipelineMetadata; }
286 Metadata &pipelineMetadata() {
return _pipelineMetadata; }
289 void setPipelineMetadata(
const Metadata &m) { _pipelineMetadata = m; }
314 const FrameCount &frameCount()
const {
return _frameCount; }
317 void setFrameCount(
const FrameCount &count) { _frameCount = count; }
333 int statsWindowSize()
const {
return _statsWindowSize; }
336 void setStatsWindowSize(
int n) { _statsWindowSize = n < 0 ? 0 : n; }
355 bool isResolved(String *diagnostic =
nullptr)
const;
374 MediaPipelineConfig resolved(Error *err =
nullptr, String *diagnostic =
nullptr)
const;
401 Error validate()
const;
414 StringList describe()
const;
428 JsonObject toJson()
const;
438 static MediaPipelineConfig fromJson(
const JsonObject &obj, Error *err =
nullptr);
446 Error saveToFile(
const FilePath &path,
unsigned int indent = 2)
const;
454 static MediaPipelineConfig loadFromFile(
const FilePath &path, Error *err =
nullptr);
457 bool operator==(
const MediaPipelineConfig &other)
const;
458 bool operator!=(
const MediaPipelineConfig &other)
const {
return !(*
this == other); }
466 static String roleName(StageRole role);
474 static StageRole roleFromName(
const String &name, Error *err =
nullptr);
482 static String kindName(Kind kind);
490 static Kind kindFromName(
const String &name, Error *err =
nullptr);
495 Metadata _pipelineMetadata;
496 FrameCount _frameCount;
497 int _statsWindowSize = 256;
498 Kind _kind = Kind::Playback;
499 bool _startPaused =
false;
511DataStream &operator<<(DataStream &stream,
const MediaPipelineConfig::Stage &s);
514DataStream &operator>>(DataStream &stream, MediaPipelineConfig::Stage &s);
517DataStream &operator<<(DataStream &stream,
const MediaPipelineConfig::Route &r);
520DataStream &operator>>(DataStream &stream, MediaPipelineConfig::Route &r);
523DataStream &operator<<(DataStream &stream,
const MediaPipelineConfig &c);
526DataStream &operator>>(DataStream &stream, MediaPipelineConfig &c);