11#include <promeki/config.h>
12#if PROMEKI_ENABLE_PROAV
28PROMEKI_NAMESPACE_BEGIN
83 using UPtr = UniquePtr<VideoDecoder>;
86 using Factory = Function<VideoDecoder *()>;
93 struct BackendRecord {
94 VideoCodec::ID codecId;
95 VideoCodec::Backend backend;
96 int weight = BackendWeight::Vendored;
103 List<int> supportedOutputs;
108 virtual ~VideoDecoder();
111 VideoCodec codec()
const {
return _codec; }
121 void configure(
const MediaConfig &config);
141 virtual Error submitFrame(
const Frame &frame) = 0;
153 virtual Frame receiveFrame() = 0;
156 virtual Error flush() = 0;
159 virtual Error reset() = 0;
162 Error lastError()
const {
return _lastError; }
165 const String &lastErrorMessage()
const {
return _lastErrorMessage; }
190 MediaIOAllocator::Ptr allocator()
const;
209 virtual void setAllocator(MediaIOAllocator::Ptr a);
217 static Error registerBackend(BackendRecord record);
221 static VideoCodec::BackendList availableBackends(VideoCodec::ID codecId);
222 static List<int> supportedOutputsFor(VideoCodec::ID codecId, VideoCodec::Backend backend);
223 static Result<VideoDecoder *> create(VideoCodec::ID codecId, VideoCodec::Backend pinned,
224 const MediaConfig *config);
227 VideoDecoder() =
default;
230 void setCodec(VideoCodec codec) { _codec = codec; }
238 virtual void onConfigure(
const MediaConfig &config);
246 const MediaConfig &config()
const;
249 String _lastErrorMessage;
252 void setError(Error err,
const String &msg = String());
266 MediaIOAllocator::Ptr _allocator;
287 static CompressedVideoPayload::Ptr selectInputPayload(
const Frame &frame,
int streamIndex = -1);
301 static void attachExtractedAnc(Frame &frame, AncPacket pkt,
int pairedVideoStreamIndex);
318 static Frame buildOutputFrame(
const Frame &source, UncompressedVideoPayload::Ptr emitted);
321 UniquePtr<MediaConfig> _stashedConfig;