11#include <promeki/config.h>
12#if PROMEKI_ENABLE_PROAV
26PROMEKI_NAMESPACE_BEGIN
104 using UPtr = UniquePtr<AudioEncoder>;
107 using Factory = Function<AudioEncoder *()>;
112 struct BackendRecord {
113 AudioCodec::ID codecId;
114 AudioCodec::Backend backend;
115 int weight = BackendWeight::Vendored;
122 List<int> supportedInputs;
127 virtual ~AudioEncoder();
136 AudioCodec codec()
const {
return _codec; }
146 void configure(
const MediaConfig &config);
157 virtual Error submitFrame(
const Frame &frame) = 0;
163 virtual Frame receiveFrame() = 0;
166 virtual Error flush() = 0;
169 virtual Error reset() = 0;
183 virtual void requestKeyframe();
186 Error lastError()
const {
return _lastError; }
189 const String &lastErrorMessage()
const {
return _lastErrorMessage; }
199 static Error registerBackend(BackendRecord record);
203 static AudioCodec::BackendList availableBackends(AudioCodec::ID codecId);
204 static List<int> supportedInputsFor(AudioCodec::ID codecId, AudioCodec::Backend backend);
205 static Result<AudioEncoder *> create(AudioCodec::ID codecId, AudioCodec::Backend pinned,
206 const MediaConfig *config);
209 AudioEncoder() =
default;
212 void setCodec(AudioCodec codec) { _codec = codec; }
220 virtual void onConfigure(
const MediaConfig &config);
228 const MediaConfig &config()
const;
231 String _lastErrorMessage;
234 void setError(Error err,
const String &msg = String());
257 static PcmAudioPayload::Ptr selectInputPayload(
const Frame &frame,
int streamIndex = -1);
274 static Frame buildOutputFrame(
const Frame &source, CompressedAudioPayload::Ptr emitted);
277 UniquePtr<MediaConfig> _stashedConfig;