11#include <promeki/config.h>
12#if PROMEKI_ENABLE_PROAV
26PROMEKI_NAMESPACE_BEGIN
79 using UPtr = UniquePtr<AudioDecoder>;
82 using Factory = Function<AudioDecoder *()>;
87 struct BackendRecord {
88 AudioCodec::ID codecId;
89 AudioCodec::Backend backend;
90 int weight = BackendWeight::Vendored;
97 List<int> supportedOutputs;
102 virtual ~AudioDecoder();
105 AudioCodec codec()
const {
return _codec; }
115 void configure(
const MediaConfig &config);
125 virtual Error submitFrame(
const Frame &frame) = 0;
131 virtual Frame receiveFrame() = 0;
134 virtual Error flush() = 0;
137 virtual Error reset() = 0;
140 Error lastError()
const {
return _lastError; }
143 const String &lastErrorMessage()
const {
return _lastErrorMessage; }
148 static Error registerBackend(BackendRecord record);
152 static AudioCodec::BackendList availableBackends(AudioCodec::ID codecId);
153 static List<int> supportedOutputsFor(AudioCodec::ID codecId, AudioCodec::Backend backend);
154 static Result<AudioDecoder *> create(AudioCodec::ID codecId, AudioCodec::Backend pinned,
155 const MediaConfig *config);
158 AudioDecoder() =
default;
161 void setCodec(AudioCodec codec) { _codec = codec; }
169 virtual void onConfigure(
const MediaConfig &config);
177 const MediaConfig &config()
const;
180 String _lastErrorMessage;
183 void setError(Error err,
const String &msg = String());
207 static CompressedAudioPayload::Ptr selectInputPayload(
const Frame &frame,
int streamIndex = -1);
223 static Frame buildOutputFrame(
const Frame &source, PcmAudioPayload::Ptr emitted);
226 UniquePtr<MediaConfig> _stashedConfig;