libpromeki 1.0.0-alpha
PROfessional MEdia toolKIt
 
Loading...
Searching...
No Matches
audiocodec.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/enums.h>
19#include <promeki/result.h>
20#include <promeki/error.h>
21#include <promeki/datatype.h>
22
23PROMEKI_NAMESPACE_BEGIN
24
25class AudioEncoder;
26class AudioDecoder;
27class AudioFormat;
28class MediaConfig;
29class DataStream;
30
39using AudioCodecBackendRegistry = StringRegistry<"AudioCodecBackend">;
40
87class AudioCodec {
88 public:
89 PROMEKI_DATATYPE(AudioCodec, DataTypeAudioCodec, 1)
90
91
92 Error writeToStream(DataStream &s) const;
94 template <uint32_t V> static Result<AudioCodec> readFromStream(DataStream &s);
95
103 enum ID {
104 Invalid = 0,
105 AAC = 1,
106 Opus = 2,
107 FLAC = 3,
108 MP3 = 4,
109 AC3 = 5,
110 UserDefined = 1024
111 };
112
114 using IDList = ::promeki::List<ID>;
115
119 enum CompressionType {
120 CompressionInvalid = 0,
121 CompressionLossless = 1,
122 CompressionLossy = 2
123 };
124
131 enum PacketIndependence {
132 PacketIndependenceInvalid = 0,
133 PacketIndependenceEvery = 1,
134 PacketIndependenceKeyframe =
135 2,
136 PacketIndependenceInter =
137 3
138 };
139
148 class Backend {
149 public:
150 constexpr Backend() : _id(AudioCodecBackendRegistry::InvalidID) {}
151
152 static constexpr Backend fromId(uint64_t id) {
153 Backend b;
154 b._id = id;
155 return b;
156 }
157
158 constexpr uint64_t id() const { return _id; }
159
160 String name() const { return AudioCodecBackendRegistry::instance().name(_id); }
161
162 constexpr bool isValid() const { return _id != AudioCodecBackendRegistry::InvalidID; }
163
164 constexpr bool operator==(const Backend &o) const { return _id == o._id; }
165 constexpr bool operator!=(const Backend &o) const { return _id != o._id; }
166 constexpr bool operator<(const Backend &o) const { return _id < o._id; }
167
168 private:
169 uint64_t _id;
170 };
171
173 using BackendList = ::promeki::List<Backend>;
174
185 struct Data {
186 ID id = Invalid;
187 String name;
188 String desc;
189 FourCC::List fourccList;
190 CompressionType compressionType = CompressionInvalid;
198 List<RateControlMode> rateControlModes;
199 PacketIndependence packetIndependence =
200 PacketIndependenceInvalid;
201 bool isStreamable =
202 false;
203 bool supportsDRC =
204 false;
205 bool hasBuiltInSilence =
206 false;
217 List<int> supportedSampleFormats;
225 List<float> supportedSampleRates;
232 List<int> supportedChannelCounts;
233 int maxChannels = 0;
242 List<int> frameSizeSamples;
243 };
244
246 static ID registerType();
247
255 static void registerData(Data &&data);
256
261 static IDList registeredIDs();
262
270 static Result<AudioCodec> lookup(const String &name);
271
279 static Result<AudioCodec> fromString(const String &spec);
280
287 static Result<Backend> registerBackend(const String &name);
288
295 static Result<Backend> lookupBackend(const String &name);
296
300 static BackendList registeredBackends();
301
305 inline AudioCodec(ID id = Invalid, Backend backend = Backend());
306
308 bool isValid() const { return d != nullptr && d->id != Invalid; }
309
311 ID id() const { return d->id; }
312
314 const String &name() const { return d->name; }
315
317 const String &description() const { return d->desc; }
318
320 const FourCC::List &fourccList() const { return d->fourccList; }
321
323 CompressionType compressionType() const { return d->compressionType; }
324
326 bool isLossless() const { return d->compressionType == CompressionLossless; }
327
329 const List<RateControlMode> &rateControlModes() const { return d->rateControlModes; }
330
332 PacketIndependence packetIndependence() const { return d->packetIndependence; }
333
335 bool isStreamable() const { return d->isStreamable; }
336
338 bool supportsDRC() const { return d->supportsDRC; }
339
341 bool hasBuiltInSilence() const { return d->hasBuiltInSilence; }
342
344 List<AudioFormat> supportedSampleFormats() const;
345
347 const List<float> &supportedSampleRates() const { return d->supportedSampleRates; }
348
350 const List<int> &supportedChannelCounts() const { return d->supportedChannelCounts; }
351
353 int maxChannels() const { return d->maxChannels; }
354
356 const List<int> &frameSizeSamples() const { return d->frameSizeSamples; }
357
359 Backend backend() const { return _backend; }
360
362 BackendList availableEncoderBackends() const;
363
365 BackendList availableDecoderBackends() const;
366
368 bool canEncode() const;
369
371 bool canDecode() const;
372
377 List<AudioFormat> encoderSupportedInputs() const;
378
383 List<AudioFormat> decoderSupportedOutputs() const;
384
393 Result<AudioEncoder *> createEncoder(const MediaConfig *config = nullptr) const;
394
400 Result<AudioDecoder *> createDecoder(const MediaConfig *config = nullptr) const;
401
403 String toString() const;
404
406 bool operator==(const AudioCodec &o) const { return d == o.d && _backend == o._backend; }
407
408 bool operator!=(const AudioCodec &o) const { return !(*this == o); }
409
411 const Data *data() const { return d; }
412
413 private:
414 const Data *d = nullptr;
415 Backend _backend;
416 static const Data *lookupData(ID id);
417};
418
419inline AudioCodec::AudioCodec(ID id, Backend backend) : d(lookupData(id)), _backend(backend) {}
420
421PROMEKI_NAMESPACE_END
422
423#endif // PROMEKI_ENABLE_PROAV