11#include <promeki/config.h>
12#if PROMEKI_ENABLE_PROAV
28PROMEKI_NAMESPACE_BEGIN
122 using UPtr = UniquePtr<VideoEncoder>;
125 using Factory = Function<VideoEncoder *()>;
134 struct BackendRecord {
135 VideoCodec::ID codecId;
138 int weight = BackendWeight::
148 List<int> supportedInputs;
153 virtual ~VideoEncoder();
165 VideoCodec codec()
const {
return _codec; }
177 void configure(
const MediaConfig &config);
202 virtual Error submitFrame(
const Frame &frame) = 0;
215 virtual Frame receiveFrame() = 0;
218 virtual Error flush() = 0;
221 virtual Error reset() = 0;
233 virtual void requestKeyframe();
236 Error lastError()
const {
return _lastError; }
239 const String &lastErrorMessage()
const {
return _lastErrorMessage; }
259 static UncompressedVideoPayload::Ptr selectInputPayload(
const Frame &frame,
int streamIndex = -1);
277 static AncPacket::List selectAncForSei(
const Frame &frame,
int pairedVideoStreamIndex,
278 const AncFormat::IDList &allowedFormats);
296 static Frame buildOutputFrame(
const Frame &source, CompressedVideoPayload::Ptr emitted);
316 static Error registerBackend(BackendRecord record);
327 static VideoCodec::BackendList availableBackends(VideoCodec::ID codecId);
336 static List<int> supportedInputsFor(VideoCodec::ID codecId, VideoCodec::Backend backend);
348 static Result<VideoEncoder *> create(VideoCodec::ID codecId, VideoCodec::Backend pinned,
349 const MediaConfig *config);
352 VideoEncoder() =
default;
364 void setCodec(VideoCodec codec) { _codec = codec; }
374 virtual void onConfigure(
const MediaConfig &config);
386 const MediaConfig &config()
const;
389 String _lastErrorMessage;
392 void setError(Error err,
const String &msg = String());
398 UniquePtr<MediaConfig> _stashedConfig;