11#include <promeki/config.h>
12#if PROMEKI_ENABLE_PROAV && PROMEKI_ENABLE_CSC
20PROMEKI_NAMESPACE_BEGIN
82class CscMediaIO :
public SharedThreadMediaIO {
83 PROMEKI_OBJECT(CscMediaIO, SharedThreadMediaIO)
86 static inline const MediaIOStats::ID StatsFramesConverted{
"FramesConverted"};
88 CscMediaIO(ObjectBase *parent =
nullptr);
89 ~CscMediaIO()
override;
91 Error describe(MediaIODescription *out)
const override;
92 Error proposeInput(
const MediaDesc &offered, MediaDesc *preferred)
const override;
93 Error proposeOutput(
const MediaDesc &requested, MediaDesc *achievable,
94 MediaConfig *configDelta =
nullptr)
const override;
95 int pendingInternalWrites()
const override;
98 Error executeCmd(MediaIOCommandOpen &cmd)
override;
99 Error executeCmd(MediaIOCommandClose &cmd)
override;
100 Error executeCmd(MediaIOCommandRead &cmd)
override;
101 Error executeCmd(MediaIOCommandWrite &cmd)
override;
102 Error executeCmd(MediaIOCommandStats &cmd)
override;
105 Error convertPayload(
const UncompressedVideoPayload &input,
106 UncompressedVideoPayload::Ptr &output)
const;
107 Error convertFrame(
const Frame &input, Frame &output);
109 PixelFormat _outputPixelFormat;
110 bool _outputPixelFormatSet =
false;
113 Frame::List _outputQueue;
114 FrameCount _frameCount{0};
115 int64_t _readCount = 0;
116 FrameCount _framesConverted{0};
117 bool _capacityWarned =
false;
124class CscFactory :
public MediaIOFactory {
126 CscFactory() =
default;
128 String name()
const override {
return String(
"CSC"); }
129 String displayName()
const override {
return String(
"Color Space Converter"); }
130 String description()
const override {
131 return String(
"Color space converter (uncompressed pixel format conversion)");
133 bool canBeTransform()
const override {
return true; }
135 Config::SpecMap configSpecs()
const override;
136 bool bridge(
const MediaDesc &from,
const MediaDesc &to, Config *outConfig,
137 int *outCost)
const override;
138 MediaIO *create(
const Config &config, ObjectBase *parent =
nullptr)
const override;