11#include <promeki/config.h>
12#if PROMEKI_ENABLE_PROAV
24PROMEKI_NAMESPACE_BEGIN
42using VideoCodecBackendRegistry = StringRegistry<
"VideoCodecBackend">;
122 PROMEKI_DATATYPE(VideoCodec, DataTypeVideoCodec, 1)
125 Error writeToStream(DataStream &s) const;
127 template <uint32_t V> static Result<VideoCodec> readFromStream(DataStream &s);
144 ProRes_422_Proxy = 7,
154 using IDList = ::promeki::List<ID>;
177 enum RandomAccessGranularity {
196 constexpr Backend() : _id(VideoCodecBackendRegistry::InvalidID) {}
205 static constexpr Backend fromId(uint64_t
id) {
212 constexpr uint64_t id()
const {
return _id; }
215 String name()
const {
return VideoCodecBackendRegistry::instance().name(_id); }
218 constexpr bool isValid()
const {
return _id != VideoCodecBackendRegistry::InvalidID; }
221 constexpr bool operator==(
const Backend &o)
const {
return _id == o._id; }
223 constexpr bool operator!=(
const Backend &o)
const {
return _id != o._id; }
225 constexpr bool operator<(
const Backend &o)
const {
return _id < o._id; }
232 using BackendList = ::promeki::List<Backend>;
248 FourCC::List fourccList;
256 List<int> compressedPixelFormats;
257 CodingType codingType = CodingInvalid;
258 RandomAccessGranularity randomAccessGranularity = AccessInvalid;
259 bool supportsBFrames =
false;
260 bool supportsLossless =
264 bool supportsVariableFrameSize =
266 bool supportsHDRMetadata =
268 bool supportsInterlaced =
false;
275 List<int> supportedBitDepths;
283 List<RateControlMode> rateControlModes;
292 List<FrameRate> supportedFrameRates;
304 static ID registerType();
319 static void registerData(Data &&data);
327 static IDList registeredIDs();
339 static Result<VideoCodec> lookup(
const String &name);
348 static VideoCodec fromPixelFormat(
const PixelFormat &pd);
365 static Result<VideoCodec> fromString(
const String &spec);
380 static Result<Backend> registerBackend(
const String &name);
392 static Result<Backend> lookupBackend(
const String &name);
401 static BackendList registeredBackends();
409 inline VideoCodec(ID
id = Invalid, Backend backend = Backend());
412 bool isValid()
const {
return d !=
nullptr && d->id != Invalid; }
415 ID id()
const {
return d->id; }
418 const String &name()
const {
return d->name; }
421 const String &description()
const {
return d->desc; }
424 const FourCC::List &fourccList()
const {
return d->fourccList; }
427 List<PixelFormat> compressedPixelFormats()
const;
430 CodingType codingType()
const {
return d->codingType; }
433 bool isIntraOnly()
const {
return d->codingType == CodingIntraOnly; }
436 RandomAccessGranularity randomAccessGranularity()
const {
return d->randomAccessGranularity; }
439 bool supportsBFrames()
const {
return d->supportsBFrames; }
442 bool supportsLossless()
const {
return d->supportsLossless; }
445 bool supportsAlpha()
const {
return d->supportsAlpha; }
448 bool supportsVariableFrameSize()
const {
return d->supportsVariableFrameSize; }
451 bool supportsHDRMetadata()
const {
return d->supportsHDRMetadata; }
454 bool supportsInterlaced()
const {
return d->supportsInterlaced; }
457 const List<int> &supportedBitDepths()
const {
return d->supportedBitDepths; }
460 const List<RateControlMode> &rateControlModes()
const {
return d->rateControlModes; }
463 const List<FrameRate> &supportedFrameRates()
const {
return d->supportedFrameRates; }
466 int maxWidth()
const {
return d->maxWidth; }
469 int maxHeight()
const {
return d->maxHeight; }
474 Backend backend()
const {
return _backend; }
479 BackendList availableEncoderBackends()
const;
484 BackendList availableDecoderBackends()
const;
489 bool canEncode()
const;
494 bool canDecode()
const;
505 List<PixelFormat> encoderSupportedInputs()
const;
515 List<PixelFormat> decoderSupportedOutputs()
const;
535 Result<VideoEncoder *> createEncoder(
const MediaConfig *config =
nullptr)
const;
545 Result<VideoDecoder *> createDecoder(
const MediaConfig *config =
nullptr)
const;
550 String toString()
const;
553 bool operator==(
const VideoCodec &o)
const {
return d == o.d && _backend == o._backend; }
556 bool operator!=(
const VideoCodec &o)
const {
return !(*
this == o); }
559 const Data *data()
const {
return d; }
562 const Data *d =
nullptr;
564 static const Data *lookupData(ID
id);
567inline VideoCodec::VideoCodec(ID
id, Backend backend) : d(lookupData(id)), _backend(backend) {}