libpromeki 1.0.0-alpha
PROfessional MEdia toolKIt
 
Loading...
Searching...
No Matches
audioencoder.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 <functional>
14#include <promeki/function.h>
15#include <promeki/namespace.h>
16#include <promeki/string.h>
17#include <promeki/error.h>
18#include <promeki/list.h>
19#include <promeki/result.h>
20#include <promeki/uniqueptr.h>
21#include <promeki/audiocodec.h>
25
26PROMEKI_NAMESPACE_BEGIN
27
28class MediaConfig;
29class Frame;
30
101class AudioEncoder {
102 public:
104 using UPtr = UniquePtr<AudioEncoder>;
105
107 using Factory = Function<AudioEncoder *()>;
108
112 struct BackendRecord {
113 AudioCodec::ID codecId;
114 AudioCodec::Backend backend;
115 int weight = BackendWeight::Vendored;
122 List<int> supportedInputs;
123 Factory factory;
124 };
125
127 virtual ~AudioEncoder();
128
136 AudioCodec codec() const { return _codec; }
137
146 void configure(const MediaConfig &config);
147
157 virtual Error submitFrame(const Frame &frame) = 0;
158
163 virtual Frame receiveFrame() = 0;
164
166 virtual Error flush() = 0;
167
169 virtual Error reset() = 0;
170
183 virtual void requestKeyframe();
184
186 Error lastError() const { return _lastError; }
187
189 const String &lastErrorMessage() const { return _lastErrorMessage; }
190
191 // ---- Backend registry ----
192
199 static Error registerBackend(BackendRecord record);
200
201 // ---- Internal bridge from AudioCodec (see VideoEncoder's equivalents) ----
202
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);
207
208 protected:
209 AudioEncoder() = default;
210
212 void setCodec(AudioCodec codec) { _codec = codec; }
213
220 virtual void onConfigure(const MediaConfig &config);
221
228 const MediaConfig &config() const;
229
230 Error _lastError;
231 String _lastErrorMessage;
232
234 void setError(Error err, const String &msg = String());
235
237 void clearError();
238
239 public:
240 // ---- Frame-shaped helpers (public so nested pImpls in concrete backends can use them) ----
241
257 static PcmAudioPayload::Ptr selectInputPayload(const Frame &frame, int streamIndex = -1);
258
274 static Frame buildOutputFrame(const Frame &source, CompressedAudioPayload::Ptr emitted);
275
276 private:
277 UniquePtr<MediaConfig> _stashedConfig;
278 AudioCodec _codec;
279};
280
281PROMEKI_NAMESPACE_END
282
283#endif // PROMEKI_ENABLE_PROAV