11#include <promeki/config.h>
12#if PROMEKI_ENABLE_PROAV
21PROMEKI_NAMESPACE_BEGIN
94class FrameSyncMediaIO :
public SharedThreadMediaIO {
95 PROMEKI_OBJECT(FrameSyncMediaIO, SharedThreadMediaIO)
98 static inline const MediaIOStats::ID StatsFramesPushed{
"FramesPushed"};
101 static inline const MediaIOStats::ID StatsFramesPulled{
"FramesPulled"};
103 FrameSyncMediaIO(ObjectBase *parent =
nullptr);
104 ~FrameSyncMediaIO()
override;
115 void setClock(
const Clock::Ptr &clock);
124 FrameSync &frameSync() {
return _sync; }
126 Error describe(MediaIODescription *out)
const override;
127 Error proposeInput(
const MediaDesc &offered, MediaDesc *preferred)
const override;
128 Error proposeOutput(
const MediaDesc &requested, MediaDesc *achievable,
129 MediaConfig *configDelta =
nullptr)
const override;
132 Error executeCmd(MediaIOCommandOpen &cmd)
override;
133 Error executeCmd(MediaIOCommandClose &cmd)
override;
134 Error executeCmd(MediaIOCommandRead &cmd)
override;
135 Error executeCmd(MediaIOCommandWrite &cmd)
override;
136 Error executeCmd(MediaIOCommandStats &cmd)
override;
140 Clock::Ptr _ownedClock;
141 Clock::Ptr _externalClock;
142 FrameCount _framesPushed{0};
143 FrameCount _framesPulled{0};
150class FrameSyncFactory :
public MediaIOFactory {
152 FrameSyncFactory() =
default;
154 String name()
const override {
return String(
"FrameSync"); }
155 String displayName()
const override {
return String(
"Frame Sync (clock-paced)"); }
156 String description()
const override {
157 return String(
"Resyncs media to a target clock cadence (frame-rate / sample-rate / channel "
160 bool canBeTransform()
const override {
return true; }
162 Config::SpecMap configSpecs()
const override;
163 bool bridge(
const MediaDesc &from,
const MediaDesc &to, Config *outConfig,
164 int *outCost)
const override;
165 MediaIO *create(
const Config &config, ObjectBase *parent =
nullptr)
const override;