11#include <promeki/config.h>
12#if PROMEKI_ENABLE_PROAV
20PROMEKI_NAMESPACE_BEGIN
109class BurnMediaIO :
public SharedThreadMediaIO {
110 PROMEKI_OBJECT(BurnMediaIO, SharedThreadMediaIO)
113 static inline const MediaIOStats::ID StatsFramesBurned{
"FramesBurned"};
115 BurnMediaIO(ObjectBase *parent =
nullptr);
116 ~BurnMediaIO()
override;
118 Error proposeInput(
const MediaDesc &offered, MediaDesc *preferred)
const override;
119 Error proposeOutput(
const MediaDesc &requested, MediaDesc *achievable,
120 MediaConfig *configDelta =
nullptr)
const override;
121 int pendingInternalWrites()
const override;
124 Error executeCmd(MediaIOCommandOpen &cmd)
override;
125 Error executeCmd(MediaIOCommandClose &cmd)
override;
126 Error executeCmd(MediaIOCommandRead &cmd)
override;
127 Error executeCmd(MediaIOCommandWrite &cmd)
override;
128 Error executeCmd(MediaIOCommandStats &cmd)
override;
131 Error burnFrame(
const Frame &input, Frame &output);
133 VideoTestPattern _pattern;
134 String _burnTextTemplate;
135 bool _burnEnabled =
false;
138 Frame::List _outputQueue;
139 FrameCount _frameCount{0};
140 int64_t _readCount = 0;
141 FrameCount _framesBurned{0};
142 bool _capacityWarned =
false;
143 bool _notPaintableWarned =
false;
150class BurnFactory :
public MediaIOFactory {
152 BurnFactory() =
default;
154 String name()
const override {
return String(
"Burn"); }
155 String displayName()
const override {
return String(
"Burn-in (Timecode / Text)"); }
156 String description()
const override {
return String(
"Text burn-in overlay on video frames"); }
157 bool canBeTransform()
const override {
return true; }
159 Config::SpecMap configSpecs()
const override;
160 MediaIO *create(
const Config &config, ObjectBase *parent =
nullptr)
const override;