11#include <promeki/config.h>
12#if PROMEKI_ENABLE_PROAV
36PROMEKI_NAMESPACE_BEGIN
39class MediaIOPortGroup;
60#define PROMEKI_MEDIAIO_COMMAND(NAME, KIND_TAG) \
62 Kind kind() const override { \
65 NAME *_promeki_clone() const { \
66 assert(false && #NAME " should not be cloned"); \
113 using Ptr = SharedPtr<MediaIOCommand, false>;
123 RefCount _promeki_refct;
131 MediaIOCommand *_promeki_clone()
const {
132 assert(
false &&
"MediaIOCommand should never be cloned");
137 MediaIOCommand() =
default;
140 virtual ~MediaIOCommand() =
default;
146 virtual Kind kind()
const = 0;
157 static const char *kindName(Kind k) {
159 case Open:
return "Open";
160 case Close:
return "Close";
161 case Read:
return "Read";
162 case Write:
return "Write";
163 case Seek:
return "Seek";
164 case Params:
return "Params";
165 case Stats:
return "Stats";
166 case SetClock:
return "SetClock";
172 const char *kindName()
const {
return kindName(kind()); }
189 Atomic<bool> cancelled{
false};
222 Error result = Error::Ok;
280 void markCompleted();
299 Error waitForCompletion(
unsigned int timeoutMs = 0)
const;
306 bool isCompleted()
const {
return _completed.value(); }
320 void setCompletionCallback(Function<
void(Error)> cb, EventLoop *loop);
323 Atomic<bool> _completed{
false};
324 mutable Mutex _completionMutex;
325 mutable WaitCondition _completionCv;
326 Mutex _callbackMutex;
327 Function<void(Error)> _callback;
328 EventLoop *_callbackLoop =
nullptr;
335class MediaIOCommandOpen :
public MediaIOCommand {
336 PROMEKI_MEDIAIO_COMMAND(MediaIOCommandOpen, Open)
343 MediaDesc pendingMediaDesc;
345 Metadata pendingMetadata;
347 AudioDesc pendingAudioDesc;
349 List<int> videoTracks;
351 List<int> audioTracks;
364 bool canSeek =
false;
366 FrameCount frameCount = FrameCount::unknown();
370 int defaultPrefetchDepth = 1;
372 int defaultWriteDepth = 4;
374 MediaIOSeekMode defaultSeekMode = MediaIO_SeekExact;
384class MediaIOCommandClose :
public MediaIOCommand {
385 PROMEKI_MEDIAIO_COMMAND(MediaIOCommandClose, Close)
392class MediaIOCommandRead :
public MediaIOCommand {
393 PROMEKI_MEDIAIO_COMMAND(MediaIOCommandRead, Read)
406 MediaIOPortGroup *group =
nullptr;
427 FrameNumber currentFrame;
440 bool mediaDescChanged =
false;
442 MediaDesc updatedMediaDesc;
449class MediaIOCommandWrite :
public MediaIOCommand {
450 PROMEKI_MEDIAIO_COMMAND(MediaIOCommandWrite, Write)
462 MediaIOPortGroup *group =
nullptr;
474 MediaIOSink *sink =
nullptr;
481 FrameNumber currentFrame;
483 FrameCount frameCount;
490class MediaIOCommandSeek :
public MediaIOCommand {
491 PROMEKI_MEDIAIO_COMMAND(MediaIOCommandSeek, Seek)
502 MediaIOPortGroup *group =
nullptr;
504 FrameNumber frameNumber;
513 MediaIOSeekMode mode = MediaIO_SeekDefault;
518 FrameNumber currentFrame;
536class MediaIOCommandParams :
public MediaIOCommand {
537 PROMEKI_MEDIAIO_COMMAND(MediaIOCommandParams, Params)
541 MediaIOParams params;
544 MediaIOParams output;
564class MediaIOCommandStats :
public MediaIOCommand {
565 PROMEKI_MEDIAIO_COMMAND(MediaIOCommandStats, Stats)
589class MediaIOCommandSetClock :
public MediaIOCommand {
590 PROMEKI_MEDIAIO_COMMAND(MediaIOCommandSetClock, SetClock)
600 MediaIOPortGroup *group =
nullptr;