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);
131 using IDList = ::promeki::List<ID>;
136 enum CompressionType {
137 CompressionInvalid = 0,
138 CompressionLossless = 1,
148 enum PacketIndependence {
149 PacketIndependenceInvalid = 0,
150 PacketIndependenceEvery = 1,
151 PacketIndependenceKeyframe =
153 PacketIndependenceInter =
167 constexpr Backend() : _id(AudioCodecBackendRegistry::InvalidID) {}
169 static constexpr Backend fromId(uint64_t
id) {
175 constexpr uint64_t id()
const {
return _id; }
177 String name()
const {
return AudioCodecBackendRegistry::instance().name(_id); }
179 constexpr bool isValid()
const {
return _id != AudioCodecBackendRegistry::InvalidID; }
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; }
190 using BackendList = ::promeki::List<Backend>;
206 FourCC::List fourccList;
207 CompressionType compressionType = CompressionInvalid;
215 List<RateControlMode> rateControlModes;
216 PacketIndependence packetIndependence =
217 PacketIndependenceInvalid;
222 bool hasBuiltInSilence =
234 List<int> supportedSampleFormats;
242 List<float> supportedSampleRates;
249 List<int> supportedChannelCounts;
259 List<int> frameSizeSamples;
263 static ID registerType();
272 static void registerData(Data &&data);
278 static IDList registeredIDs();
287 static Result<AudioCodec> lookup(
const String &name);
296 static Result<AudioCodec> fromString(
const String &spec);
304 static Result<Backend> registerBackend(
const String &name);
312 static Result<Backend> lookupBackend(
const String &name);
317 static BackendList registeredBackends();
322 inline AudioCodec(ID
id = Invalid, Backend backend = Backend());
325 bool isValid()
const {
return d !=
nullptr && d->id != Invalid; }
328 ID id()
const {
return d->id; }
331 const String &name()
const {
return d->name; }
334 const String &description()
const {
return d->desc; }
337 const FourCC::List &fourccList()
const {
return d->fourccList; }
340 CompressionType compressionType()
const {
return d->compressionType; }
343 bool isLossless()
const {
return d->compressionType == CompressionLossless; }
346 const List<RateControlMode> &rateControlModes()
const {
return d->rateControlModes; }
349 PacketIndependence packetIndependence()
const {
return d->packetIndependence; }
352 bool isStreamable()
const {
return d->isStreamable; }
355 bool supportsDRC()
const {
return d->supportsDRC; }
358 bool hasBuiltInSilence()
const {
return d->hasBuiltInSilence; }
361 List<AudioFormat> supportedSampleFormats()
const;
364 const List<float> &supportedSampleRates()
const {
return d->supportedSampleRates; }
367 const List<int> &supportedChannelCounts()
const {
return d->supportedChannelCounts; }
370 int maxChannels()
const {
return d->maxChannels; }
373 const List<int> &frameSizeSamples()
const {
return d->frameSizeSamples; }
376 Backend backend()
const {
return _backend; }
379 BackendList availableEncoderBackends()
const;
382 BackendList availableDecoderBackends()
const;
385 bool canEncode()
const;
388 bool canDecode()
const;
394 List<AudioFormat> encoderSupportedInputs()
const;
400 List<AudioFormat> decoderSupportedOutputs()
const;
410 Result<AudioEncoder *> createEncoder(
const MediaConfig *config =
nullptr)
const;
417 Result<AudioDecoder *> createDecoder(
const MediaConfig *config =
nullptr)
const;
420 String toString()
const;
423 bool operator==(
const AudioCodec &o)
const {
return d == o.d && _backend == o._backend; }
425 bool operator!=(
const AudioCodec &o)
const {
return !(*
this == o); }
428 const Data *data()
const {
return d; }
431 const Data *d =
nullptr;
433 static const Data *lookupData(ID
id);
436inline AudioCodec::AudioCodec(ID
id, Backend backend) : d(lookupData(id)), _backend(backend) {}