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_codec.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,
126 PCM = 6,
127 UserDefined = 1024
128 };
129
131 using IDList = ::promeki::List<ID>;
132
136 enum CompressionType {
137 CompressionInvalid = 0,
138 CompressionLossless = 1,
139 CompressionLossy = 2
140 };
141
148 enum PacketIndependence {
149 PacketIndependenceInvalid = 0,
150 PacketIndependenceEvery = 1,
151 PacketIndependenceKeyframe =
152 2,
153 PacketIndependenceInter =
154 3
155 };
156
165 class Backend {
166 public:
167 constexpr Backend() : _id(AudioCodecBackendRegistry::InvalidID) {}
168
169 static constexpr Backend fromId(uint64_t id) {
170 Backend b;
171 b._id = id;
172 return b;
173 }
174
175 constexpr uint64_t id() const { return _id; }
176
177 String name() const { return AudioCodecBackendRegistry::instance().name(_id); }
178
179 constexpr bool isValid() const { return _id != AudioCodecBackendRegistry::InvalidID; }
180
181 constexpr bool operator==(const Backend &o) const { return _id == o._id; }
182 constexpr bool operator!=(const Backend &o) const { return _id != o._id; }
183 constexpr bool operator<(const Backend &o) const { return _id < o._id; }
184
185 private:
186 uint64_t _id;
187 };
188
190 using BackendList = ::promeki::List<Backend>;
191
202 struct Data {
203 ID id = Invalid;
204 String name;
205 String desc;
206 FourCC::List fourccList;
207 CompressionType compressionType = CompressionInvalid;
215 List<RateControlMode> rateControlModes;
216 PacketIndependence packetIndependence =
217 PacketIndependenceInvalid;
218 bool isStreamable =
219 false;
220 bool supportsDRC =
221 false;
222 bool hasBuiltInSilence =
223 false;
234 List<int> supportedSampleFormats;
242 List<float> supportedSampleRates;
249 List<int> supportedChannelCounts;
250 int maxChannels = 0;
259 List<int> frameSizeSamples;
260 };
261
263 static ID registerType();
264
272 static void registerData(Data &&data);
273
278 static IDList registeredIDs();
279
287 static Result<AudioCodec> lookup(const String &name);
288
296 static Result<AudioCodec> fromString(const String &spec);
297
304 static Result<Backend> registerBackend(const String &name);
305
312 static Result<Backend> lookupBackend(const String &name);
313
317 static BackendList registeredBackends();
318
322 inline AudioCodec(ID id = Invalid, Backend backend = Backend());
323
325 bool isValid() const { return d != nullptr && d->id != Invalid; }
326
328 ID id() const { return d->id; }
329
331 const String &name() const { return d->name; }
332
334 const String &description() const { return d->desc; }
335
337 const FourCC::List &fourccList() const { return d->fourccList; }
338
340 CompressionType compressionType() const { return d->compressionType; }
341
343 bool isLossless() const { return d->compressionType == CompressionLossless; }
344
346 const List<RateControlMode> &rateControlModes() const { return d->rateControlModes; }
347
349 PacketIndependence packetIndependence() const { return d->packetIndependence; }
350
352 bool isStreamable() const { return d->isStreamable; }
353
355 bool supportsDRC() const { return d->supportsDRC; }
356
358 bool hasBuiltInSilence() const { return d->hasBuiltInSilence; }
359
361 List<AudioFormat> supportedSampleFormats() const;
362
364 const List<float> &supportedSampleRates() const { return d->supportedSampleRates; }
365
367 const List<int> &supportedChannelCounts() const { return d->supportedChannelCounts; }
368
370 int maxChannels() const { return d->maxChannels; }
371
373 const List<int> &frameSizeSamples() const { return d->frameSizeSamples; }
374
376 Backend backend() const { return _backend; }
377
379 BackendList availableEncoderBackends() const;
380
382 BackendList availableDecoderBackends() const;
383
385 bool canEncode() const;
386
388 bool canDecode() const;
389
394 List<AudioFormat> encoderSupportedInputs() const;
395
400 List<AudioFormat> decoderSupportedOutputs() const;
401
410 Result<AudioEncoder *> createEncoder(const MediaConfig *config = nullptr) const;
411
417 Result<AudioDecoder *> createDecoder(const MediaConfig *config = nullptr) const;
418
420 String toString() const;
421
423 bool operator==(const AudioCodec &o) const { return d == o.d && _backend == o._backend; }
424
425 bool operator!=(const AudioCodec &o) const { return !(*this == o); }
426
428 const Data *data() const { return d; }
429
430 private:
431 const Data *d = nullptr;
432 Backend _backend;
433 static const Data *lookupData(ID id);
434};
435
436inline AudioCodec::AudioCodec(ID id, Backend backend) : d(lookupData(id)), _backend(backend) {}
437
438PROMEKI_NAMESPACE_END
439
440#endif // PROMEKI_ENABLE_PROAV