11#include <promeki/config.h>
12#if PROMEKI_ENABLE_PROAV
21PROMEKI_NAMESPACE_BEGIN
104class VideoEncoderMediaIO :
public SharedThreadMediaIO {
105 PROMEKI_OBJECT(VideoEncoderMediaIO, SharedThreadMediaIO)
108 static inline const MediaIOStats::ID StatsFramesEncoded{
"FramesEncoded"};
111 static inline const MediaIOStats::ID StatsPacketsOut{
"PacketsOut"};
113 VideoEncoderMediaIO(ObjectBase *parent =
nullptr);
114 ~VideoEncoderMediaIO()
override;
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;
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;
136 void drainEncoderInto();
140 VideoEncoder::UPtr _encoder;
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;
155class VideoEncoderFactory :
public MediaIOFactory {
157 VideoEncoderFactory() =
default;
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");
164 bool canBeTransform()
const override {
return true; }
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;