libpromeki 1.0.0-alpha
PROfessional MEdia toolKIt
 
Loading...
Searching...
No Matches
subtitleburnmediaio.h
Go to the documentation of this file.
1
8#pragma once
9
10
11#include <promeki/config.h>
12#if PROMEKI_ENABLE_PROAV
15#include <promeki/enumlist.h>
16#include <promeki/enums.h>
17#include <promeki/list.h>
19#include <promeki/namespace.h>
21#include <promeki/string.h>
23#include <promeki/uniqueptr.h>
24
25PROMEKI_NAMESPACE_BEGIN
26
104class SubtitleBurnMediaIO : public SharedThreadMediaIO {
105 PROMEKI_OBJECT(SubtitleBurnMediaIO, SharedThreadMediaIO)
106 public:
108 static inline const MediaIOStats::ID StatsFramesPainted{"FramesPainted"};
109
110 SubtitleBurnMediaIO(ObjectBase *parent = nullptr);
111 ~SubtitleBurnMediaIO() override;
112
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;
117
118 protected:
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;
124
125 private:
126 Error burnFrame(const Frame &input, Frame &output);
127
131 Subtitle pickCue(const Frame &input);
132
135 bool sourceEnabled(const SubtitleSource &src) const;
136
139 Subtitle tryMetadataSource(const Frame &input);
140
147 Subtitle tryAncSource(const Frame &input, CaptionCodec codec);
148
149 SubtitleRenderer _renderer;
150 bool _enabled = false;
151 EnumList _sources;
152 int _capacity = 4;
153
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;
160
161 // Lazily-constructed ANC helpers (only used when the
162 // corresponding @c SubtitleSource is listed in
163 // @c VideoSubtitleBurnSources). Translator is a plain
164 // value shared across both decoders; each decoder is
165 // stateful and pimpl'd. One @ref CaptionDecoder per
166 // codec rides in @c _ancDecoders, looked up by
167 // @ref CaptionDecoder::codec.
168 AncTranslator _ancTranslator;
169 CaptionDecoder::PtrList _ancDecoders;
170};
171
176class SubtitleBurnFactory : public MediaIOFactory {
177 public:
178 SubtitleBurnFactory() = default;
179
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.");
185 }
186 bool canBeTransform() const override { return true; }
187
188 Config::SpecMap configSpecs() const override;
189 MediaIO *create(const Config &config, ObjectBase *parent = nullptr) const override;
190};
191
192PROMEKI_NAMESPACE_END
193
194#endif // PROMEKI_ENABLE_PROAV