libpromeki 1.0.0-alpha
PROfessional MEdia toolKIt
 
Loading...
Searching...
No Matches
audiodecoder.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
76class AudioDecoder {
77 public:
79 using UPtr = UniquePtr<AudioDecoder>;
80
82 using Factory = Function<AudioDecoder *()>;
83
87 struct BackendRecord {
88 AudioCodec::ID codecId;
89 AudioCodec::Backend backend;
90 int weight = BackendWeight::Vendored;
97 List<int> supportedOutputs;
98 Factory factory;
99 };
100
102 virtual ~AudioDecoder();
103
105 AudioCodec codec() const { return _codec; }
106
115 void configure(const MediaConfig &config);
116
125 virtual Error submitFrame(const Frame &frame) = 0;
126
131 virtual Frame receiveFrame() = 0;
132
134 virtual Error flush() = 0;
135
137 virtual Error reset() = 0;
138
140 Error lastError() const { return _lastError; }
141
143 const String &lastErrorMessage() const { return _lastErrorMessage; }
144
145 // ---- Backend registry ----
146
148 static Error registerBackend(BackendRecord record);
149
150 // ---- Internal bridge from AudioCodec ----
151
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);
156
157 protected:
158 AudioDecoder() = default;
159
161 void setCodec(AudioCodec codec) { _codec = codec; }
162
169 virtual void onConfigure(const MediaConfig &config);
170
177 const MediaConfig &config() const;
178
179 Error _lastError;
180 String _lastErrorMessage;
181
183 void setError(Error err, const String &msg = String());
184
186 void clearError();
187
188 public:
189 // ---- Frame-shaped helpers (public so nested pImpls in concrete backends can use them) ----
190
207 static CompressedAudioPayload::Ptr selectInputPayload(const Frame &frame, int streamIndex = -1);
208
223 static Frame buildOutputFrame(const Frame &source, PcmAudioPayload::Ptr emitted);
224
225 private:
226 UniquePtr<MediaConfig> _stashedConfig;
227 AudioCodec _codec;
228};
229
230PROMEKI_NAMESPACE_END
231
232#endif // PROMEKI_ENABLE_PROAV