libpromeki 1.0.0-alpha
PROfessional MEdia toolKIt
 
Loading...
Searching...
No Matches
videoencodermediaio.h
Go to the documentation of this file.
1
8#pragma once
9
10
11#include <promeki/config.h>
12#if PROMEKI_ENABLE_PROAV
13#include <promeki/namespace.h>
16#include <promeki/mediaconfig.h>
18#include <promeki/string.h>
19#include <promeki/videocodec.h>
20
21PROMEKI_NAMESPACE_BEGIN
22
104class VideoEncoderMediaIO : public SharedThreadMediaIO {
105 PROMEKI_OBJECT(VideoEncoderMediaIO, SharedThreadMediaIO)
106 public:
108 static inline const MediaIOStats::ID StatsFramesEncoded{"FramesEncoded"};
109
111 static inline const MediaIOStats::ID StatsPacketsOut{"PacketsOut"};
112
113 VideoEncoderMediaIO(ObjectBase *parent = nullptr);
114 ~VideoEncoderMediaIO() override;
115
116 Error describe(MediaIODescription *out) const override;
117 Error proposeInput(const MediaDesc &offered, MediaDesc *preferred) const override;
118 Error proposeOutput(const MediaDesc &requested, MediaDesc *achievable,
119 MediaConfig *configDelta = nullptr) const override;
120 int pendingInternalWrites() const override;
121
122 protected:
123 Error executeCmd(MediaIOCommandOpen &cmd) override;
124 Error executeCmd(MediaIOCommandClose &cmd) override;
125 Error executeCmd(MediaIOCommandRead &cmd) override;
126 Error executeCmd(MediaIOCommandWrite &cmd) override;
127 Error executeCmd(MediaIOCommandStats &cmd) override;
128 void configChanged(const MediaConfig &delta) override;
129
130 private:
131 // Drains the underlying encoder's ready Frames into
132 // @c _outputQueue. The encoder is responsible for
133 // echoing the source Frame's audio / ANC / metadata
134 // through onto each emitted Frame via the base
135 // @ref VideoEncoder::buildOutputFrame helper.
136 void drainEncoderInto();
137
138 MediaConfig _config;
139 VideoCodec _codec;
140 VideoEncoder::UPtr _encoder;
141 int _capacity = 8;
142 Frame::List _outputQueue;
143 FrameCount _frameCount{0};
144 int64_t _readCount = 0;
145 FrameCount _framesEncoded{0};
146 int64_t _packetsOut = 0;
147 bool _capacityWarned = false;
148 bool _closed = false;
149};
150
155class VideoEncoderFactory : public MediaIOFactory {
156 public:
157 VideoEncoderFactory() = default;
158
159 String name() const override { return String("VideoEncoder"); }
160 String displayName() const override { return String("Video Encoder"); }
161 String description() const override {
162 return String("Encodes uncompressed video frames into a registered VideoCodec bitstream");
163 }
164 bool canBeTransform() const override { return true; }
165
166 Config::SpecMap configSpecs() const override;
167 bool bridge(const MediaDesc &from, const MediaDesc &to, Config *outConfig,
168 int *outCost) const override;
169 MediaIO *create(const Config &config, ObjectBase *parent = nullptr) const override;
170};
171
172PROMEKI_NAMESPACE_END
173
174#endif // PROMEKI_ENABLE_PROAV