11#include <promeki/config.h>
12#if PROMEKI_ENABLE_PROAV
22PROMEKI_NAMESPACE_BEGIN
92class VideoDecoderMediaIO :
public SharedThreadMediaIO {
93 PROMEKI_OBJECT(VideoDecoderMediaIO, SharedThreadMediaIO)
96 static inline const MediaIOStats::ID StatsPacketsDecoded{
"PacketsDecoded"};
99 static inline const MediaIOStats::ID StatsImagesOut{
"ImagesOut"};
101 VideoDecoderMediaIO(ObjectBase *parent =
nullptr);
102 ~VideoDecoderMediaIO()
override;
104 Error describe(MediaIODescription *out)
const override;
105 Error proposeInput(
const MediaDesc &offered, MediaDesc *preferred)
const override;
106 Error proposeOutput(
const MediaDesc &requested, MediaDesc *achievable,
107 MediaConfig *configDelta =
nullptr)
const override;
108 int pendingInternalWrites()
const override;
111 Error executeCmd(MediaIOCommandOpen &cmd)
override;
112 Error executeCmd(MediaIOCommandClose &cmd)
override;
113 Error executeCmd(MediaIOCommandRead &cmd)
override;
114 Error executeCmd(MediaIOCommandWrite &cmd)
override;
115 Error executeCmd(MediaIOCommandStats &cmd)
override;
116 void configChanged(
const MediaConfig &delta)
override;
125 void drainDecoderInto();
126 Error createDecoder(
const VideoCodec &codec);
130 VideoDecoder::UPtr _decoder;
131 PixelFormat _outputPixelFormat;
132 bool _outputPixelFormatSet =
false;
134 Frame::List _outputQueue;
135 FrameCount _frameCount{0};
136 int64_t _readCount = 0;
137 int64_t _packetsDecoded = 0;
138 int64_t _imagesOut = 0;
139 bool _capacityWarned =
false;
140 bool _closed =
false;
147class VideoDecoderFactory :
public MediaIOFactory {
149 VideoDecoderFactory() =
default;
151 String name()
const override {
return String(
"VideoDecoder"); }
152 String displayName()
const override {
return String(
"Video Decoder"); }
153 String description()
const override {
154 return String(
"Decodes compressed video bitstreams into uncompressed frames");
156 bool canBeTransform()
const override {
return true; }
158 Config::SpecMap configSpecs()
const override;
159 bool bridge(
const MediaDesc &from,
const MediaDesc &to, Config *outConfig,
160 int *outCost)
const override;
161 MediaIO *create(
const Config &config, ObjectBase *parent =
nullptr)
const override;