libpromeki 1.0.0-alpha
PROfessional MEdia toolKIt
 
Loading...
Searching...
No Matches
videocodec.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>
14#include <promeki/string.h>
16#include <promeki/list.h>
17#include <promeki/fourcc.h>
18#include <promeki/framerate.h>
19#include <promeki/enums.h>
20#include <promeki/result.h>
21#include <promeki/error.h>
22#include <promeki/datatype.h>
23
24PROMEKI_NAMESPACE_BEGIN
25
26class DataStream;
27
28class PixelFormat;
29class VideoEncoder;
30class VideoDecoder;
31class MediaConfig;
32
42using VideoCodecBackendRegistry = StringRegistry<"VideoCodecBackend">;
43
120class VideoCodec {
121 public:
122 PROMEKI_DATATYPE(VideoCodec, DataTypeVideoCodec, 1)
123
124
125 Error writeToStream(DataStream &s) const;
127 template <uint32_t V> static Result<VideoCodec> readFromStream(DataStream &s);
128
136 enum ID {
137 Invalid = 0,
138 H264 = 1,
139 HEVC = 2,
140 AV1 = 3,
141 VP9 = 4,
142 JPEG = 5,
143 JPEG_XS = 6,
144 ProRes_422_Proxy = 7,
145 ProRes_422_LT = 8,
146 ProRes_422 = 9,
147 ProRes_422_HQ = 10,
148 ProRes_4444 = 11,
149 ProRes_4444_XQ = 12,
150 UserDefined = 1024
151 };
152
154 using IDList = ::promeki::List<ID>;
155
163 enum CodingType {
164 CodingInvalid = 0,
165 CodingIntraOnly =
166 1,
167 CodingTemporal = 2
168 };
169
177 enum RandomAccessGranularity {
178 AccessInvalid = 0,
179 AccessFrame = 1,
180 AccessGOP = 2
181 };
182
193 class Backend {
194 public:
196 constexpr Backend() : _id(VideoCodecBackendRegistry::InvalidID) {}
197
205 static constexpr Backend fromId(uint64_t id) {
206 Backend b;
207 b._id = id;
208 return b;
209 }
210
212 constexpr uint64_t id() const { return _id; }
213
215 String name() const { return VideoCodecBackendRegistry::instance().name(_id); }
216
218 constexpr bool isValid() const { return _id != VideoCodecBackendRegistry::InvalidID; }
219
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; }
226
227 private:
228 uint64_t _id;
229 };
230
232 using BackendList = ::promeki::List<Backend>;
233
244 struct Data {
245 ID id = Invalid;
246 String name;
247 String desc;
248 FourCC::List fourccList;
256 List<int> compressedPixelFormats;
257 CodingType codingType = CodingInvalid;
258 RandomAccessGranularity randomAccessGranularity = AccessInvalid;
259 bool supportsBFrames = false;
260 bool supportsLossless =
261 false;
262 bool supportsAlpha =
263 false;
264 bool supportsVariableFrameSize =
265 false;
266 bool supportsHDRMetadata =
267 false;
268 bool supportsInterlaced = false;
275 List<int> supportedBitDepths;
283 List<RateControlMode> rateControlModes;
292 List<FrameRate> supportedFrameRates;
293 int maxWidth = 0;
294 int maxHeight = 0;
295 int maxChannels =
296 0;
297 };
298
304 static ID registerType();
305
319 static void registerData(Data &&data);
320
327 static IDList registeredIDs();
328
339 static Result<VideoCodec> lookup(const String &name);
340
348 static VideoCodec fromPixelFormat(const PixelFormat &pd);
349
365 static Result<VideoCodec> fromString(const String &spec);
366
380 static Result<Backend> registerBackend(const String &name);
381
392 static Result<Backend> lookupBackend(const String &name);
393
401 static BackendList registeredBackends();
402
409 inline VideoCodec(ID id = Invalid, Backend backend = Backend());
410
412 bool isValid() const { return d != nullptr && d->id != Invalid; }
413
415 ID id() const { return d->id; }
416
418 const String &name() const { return d->name; }
419
421 const String &description() const { return d->desc; }
422
424 const FourCC::List &fourccList() const { return d->fourccList; }
425
427 List<PixelFormat> compressedPixelFormats() const;
428
430 CodingType codingType() const { return d->codingType; }
431
433 bool isIntraOnly() const { return d->codingType == CodingIntraOnly; }
434
436 RandomAccessGranularity randomAccessGranularity() const { return d->randomAccessGranularity; }
437
439 bool supportsBFrames() const { return d->supportsBFrames; }
440
442 bool supportsLossless() const { return d->supportsLossless; }
443
445 bool supportsAlpha() const { return d->supportsAlpha; }
446
448 bool supportsVariableFrameSize() const { return d->supportsVariableFrameSize; }
449
451 bool supportsHDRMetadata() const { return d->supportsHDRMetadata; }
452
454 bool supportsInterlaced() const { return d->supportsInterlaced; }
455
457 const List<int> &supportedBitDepths() const { return d->supportedBitDepths; }
458
460 const List<RateControlMode> &rateControlModes() const { return d->rateControlModes; }
461
463 const List<FrameRate> &supportedFrameRates() const { return d->supportedFrameRates; }
464
466 int maxWidth() const { return d->maxWidth; }
467
469 int maxHeight() const { return d->maxHeight; }
470
474 Backend backend() const { return _backend; }
475
479 BackendList availableEncoderBackends() const;
480
484 BackendList availableDecoderBackends() const;
485
489 bool canEncode() const;
490
494 bool canDecode() const;
495
505 List<PixelFormat> encoderSupportedInputs() const;
506
515 List<PixelFormat> decoderSupportedOutputs() const;
516
535 Result<VideoEncoder *> createEncoder(const MediaConfig *config = nullptr) const;
536
545 Result<VideoDecoder *> createDecoder(const MediaConfig *config = nullptr) const;
546
550 String toString() const;
551
553 bool operator==(const VideoCodec &o) const { return d == o.d && _backend == o._backend; }
554
556 bool operator!=(const VideoCodec &o) const { return !(*this == o); }
557
559 const Data *data() const { return d; }
560
561 private:
562 const Data *d = nullptr;
563 Backend _backend;
564 static const Data *lookupData(ID id);
565};
566
567inline VideoCodec::VideoCodec(ID id, Backend backend) : d(lookupData(id)), _backend(backend) {}
568
569PROMEKI_NAMESPACE_END
570
571#endif // PROMEKI_ENABLE_PROAV