11#include <promeki/config.h>
12#if PROMEKI_ENABLE_PROAV
23PROMEKI_NAMESPACE_BEGIN
39using AudioCodecBackendRegistry = StringRegistry<
"AudioCodecBackend">;
89 PROMEKI_DATATYPE(AudioCodec, DataTypeAudioCodec, 1)
92 Error writeToStream(DataStream &s) const;
94 template <uint32_t V> static Result<AudioCodec> readFromStream(DataStream &s);
114 using IDList = ::promeki::List<ID>;
119 enum CompressionType {
120 CompressionInvalid = 0,
121 CompressionLossless = 1,
131 enum PacketIndependence {
132 PacketIndependenceInvalid = 0,
133 PacketIndependenceEvery = 1,
134 PacketIndependenceKeyframe =
136 PacketIndependenceInter =
150 constexpr Backend() : _id(AudioCodecBackendRegistry::InvalidID) {}
152 static constexpr Backend fromId(uint64_t
id) {
158 constexpr uint64_t id()
const {
return _id; }
160 String name()
const {
return AudioCodecBackendRegistry::instance().name(_id); }
162 constexpr bool isValid()
const {
return _id != AudioCodecBackendRegistry::InvalidID; }
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; }
173 using BackendList = ::promeki::List<Backend>;
189 FourCC::List fourccList;
190 CompressionType compressionType = CompressionInvalid;
198 List<RateControlMode> rateControlModes;
199 PacketIndependence packetIndependence =
200 PacketIndependenceInvalid;
205 bool hasBuiltInSilence =
217 List<int> supportedSampleFormats;
225 List<float> supportedSampleRates;
232 List<int> supportedChannelCounts;
242 List<int> frameSizeSamples;
246 static ID registerType();
255 static void registerData(Data &&data);
261 static IDList registeredIDs();
270 static Result<AudioCodec> lookup(
const String &name);
279 static Result<AudioCodec> fromString(
const String &spec);
287 static Result<Backend> registerBackend(
const String &name);
295 static Result<Backend> lookupBackend(
const String &name);
300 static BackendList registeredBackends();
305 inline AudioCodec(ID
id = Invalid, Backend backend = Backend());
308 bool isValid()
const {
return d !=
nullptr && d->id != Invalid; }
311 ID id()
const {
return d->id; }
314 const String &name()
const {
return d->name; }
317 const String &description()
const {
return d->desc; }
320 const FourCC::List &fourccList()
const {
return d->fourccList; }
323 CompressionType compressionType()
const {
return d->compressionType; }
326 bool isLossless()
const {
return d->compressionType == CompressionLossless; }
329 const List<RateControlMode> &rateControlModes()
const {
return d->rateControlModes; }
332 PacketIndependence packetIndependence()
const {
return d->packetIndependence; }
335 bool isStreamable()
const {
return d->isStreamable; }
338 bool supportsDRC()
const {
return d->supportsDRC; }
341 bool hasBuiltInSilence()
const {
return d->hasBuiltInSilence; }
344 List<AudioFormat> supportedSampleFormats()
const;
347 const List<float> &supportedSampleRates()
const {
return d->supportedSampleRates; }
350 const List<int> &supportedChannelCounts()
const {
return d->supportedChannelCounts; }
353 int maxChannels()
const {
return d->maxChannels; }
356 const List<int> &frameSizeSamples()
const {
return d->frameSizeSamples; }
359 Backend backend()
const {
return _backend; }
362 BackendList availableEncoderBackends()
const;
365 BackendList availableDecoderBackends()
const;
368 bool canEncode()
const;
371 bool canDecode()
const;
377 List<AudioFormat> encoderSupportedInputs()
const;
383 List<AudioFormat> decoderSupportedOutputs()
const;
393 Result<AudioEncoder *> createEncoder(
const MediaConfig *config =
nullptr)
const;
400 Result<AudioDecoder *> createDecoder(
const MediaConfig *config =
nullptr)
const;
403 String toString()
const;
406 bool operator==(
const AudioCodec &o)
const {
return d == o.d && _backend == o._backend; }
408 bool operator!=(
const AudioCodec &o)
const {
return !(*
this == o); }
411 const Data *data()
const {
return d; }
414 const Data *d =
nullptr;
416 static const Data *lookupData(ID
id);
419inline AudioCodec::AudioCodec(ID
id, Backend backend) : d(lookupData(id)), _backend(backend) {}