11#include <promeki/config.h>
12#if PROMEKI_ENABLE_PROAV
25PROMEKI_NAMESPACE_BEGIN
104class SubtitleBurnMediaIO :
public SharedThreadMediaIO {
105 PROMEKI_OBJECT(SubtitleBurnMediaIO, SharedThreadMediaIO)
108 static inline const MediaIOStats::ID StatsFramesPainted{
"FramesPainted"};
110 SubtitleBurnMediaIO(ObjectBase *parent =
nullptr);
111 ~SubtitleBurnMediaIO()
override;
113 Error proposeInput(
const MediaDesc &offered, MediaDesc *preferred)
const override;
114 Error proposeOutput(
const MediaDesc &requested, MediaDesc *achievable,
115 MediaConfig *configDelta =
nullptr)
const override;
116 int pendingInternalWrites()
const override;
119 Error executeCmd(MediaIOCommandOpen &cmd)
override;
120 Error executeCmd(MediaIOCommandClose &cmd)
override;
121 Error executeCmd(MediaIOCommandRead &cmd)
override;
122 Error executeCmd(MediaIOCommandWrite &cmd)
override;
123 Error executeCmd(MediaIOCommandStats &cmd)
override;
126 Error burnFrame(
const Frame &input, Frame &output);
131 Subtitle pickCue(
const Frame &input);
135 bool sourceEnabled(
const SubtitleSource &src)
const;
139 Subtitle tryMetadataSource(
const Frame &input);
147 Subtitle tryAncSource(
const Frame &input, CaptionCodec codec);
149 SubtitleRenderer _renderer;
150 bool _enabled =
false;
154 Frame::List _outputQueue;
155 FrameCount _frameCount{0};
156 int64_t _readCount = 0;
157 FrameCount _framesPainted{0};
158 bool _capacityWarned =
false;
159 bool _notPaintableWarned =
false;
168 AncTranslator _ancTranslator;
169 CaptionDecoder::PtrList _ancDecoders;
176class SubtitleBurnFactory :
public MediaIOFactory {
178 SubtitleBurnFactory() =
default;
180 String name()
const override {
return String(
"SubtitleBurn"); }
181 String displayName()
const override {
return String(
"Subtitle Burn-in"); }
182 String description()
const override {
183 return String(
"Renders the active Metadata::Subtitle cue (or a CEA-608 ANC-decoded "
184 "cue) onto each video frame.");
186 bool canBeTransform()
const override {
return true; }
188 Config::SpecMap configSpecs()
const override;
189 MediaIO *create(
const Config &config, ObjectBase *parent =
nullptr)
const override;