11#include <promeki/config.h>
12#if PROMEKI_ENABLE_PROAV
33PROMEKI_NAMESPACE_BEGIN
37class MediaIODescription;
42class MediaIOPortGroup;
113class MediaIO :
public ObjectBase {
114 PROMEKI_OBJECT(MediaIO, ObjectBase)
117 using UPtr = UniquePtr<MediaIO>;
120 using SeekMode = MediaIOSeekMode;
122 static constexpr SeekMode SeekDefault = MediaIO_SeekDefault;
123 static constexpr SeekMode SeekExact = MediaIO_SeekExact;
124 static constexpr SeekMode SeekNearestKeyframe = MediaIO_SeekNearestKeyframe;
125 static constexpr SeekMode SeekKeyframeBefore = MediaIO_SeekKeyframeBefore;
126 static constexpr SeekMode SeekKeyframeAfter = MediaIO_SeekKeyframeAfter;
129 using Config = MediaConfig;
132 using ConfigID = MediaConfigID;
135 static constexpr FrameCount FrameCountUnknown = FrameCount::unknown();
138 static constexpr FrameCount FrameCountInfinite = FrameCount::infinity();
147 static MediaIO *create(
const Config &config, ObjectBase *parent =
nullptr);
166 static MediaIO *createForFileRead(
const String &filename, ObjectBase *parent =
nullptr);
182 static MediaIO *createForFileWrite(
const String &filename, ObjectBase *parent =
nullptr);
199 static MediaIO *createFromUrl(
const Url &url, ObjectBase *parent =
nullptr);
209 static MediaIO *createFromUrl(
const String &url, ObjectBase *parent =
nullptr);
275 static Error applyQueryToConfig(
const Url &url,
const Config::SpecMap &specs, Config *outConfig);
313 static MediaDesc applyOutputOverrides(
const MediaDesc &input,
const MediaConfig &config);
334 static PixelFormat defaultUncompressedPixelFormat(
const PixelFormat &source);
340 MediaIO(ObjectBase *parent =
nullptr);
348 const Config &config()
const {
return _config; }
363 MediaIOSource *source(
int N)
const;
366 int sourceCount()
const;
379 MediaIOSink *sink(
int N)
const;
382 int sinkCount()
const;
397 MediaIOPortGroup *portGroup(
int N)
const;
400 int portGroupCount()
const;
409 bool isSource()
const {
return sourceCount() > 0; }
418 bool isSink()
const {
return sinkCount() > 0; }
435 String name()
const {
return _config.getAs<String>(MediaConfig::Name, String()); }
447 void setName(
const String &val) { _config.set(MediaConfig::Name, val); }
450 bool isOpen()
const {
return _open.value(); }
461 SeekMode defaultSeekMode()
const {
return _defaultSeekMode; }
477 Error setPendingMediaDesc(
const MediaDesc &desc);
480 const MediaDesc &pendingMediaDesc()
const {
return _pendingMediaDesc; }
483 Error setPendingAudioDesc(
const AudioDesc &desc);
486 const AudioDesc &pendingAudioDesc()
const {
return _pendingAudioDesc; }
489 Error setPendingMetadata(
const Metadata &meta);
492 const Metadata &pendingMetadata()
const {
return _pendingMetadata; }
504 Error setVideoTracks(
const List<int> &tracks);
516 Error setAudioTracks(
const List<int> &tracks);
545 MediaIORequest open();
578 MediaIORequest close();
587 bool isClosing()
const {
return _closing.value(); }
597 const MediaDesc &mediaDesc()
const {
return _mediaDesc; }
604 const FrameRate &frameRate()
const {
return _frameRate; }
611 const AudioDesc &audioDesc()
const {
return _audioDesc; }
618 const Metadata &metadata()
const {
return _metadata; }
650 virtual Error describe(MediaIODescription *out)
const;
665 virtual Error proposeInput(
const MediaDesc &offered, MediaDesc *preferred)
const;
695 virtual Error proposeOutput(
const MediaDesc &requested, MediaDesc *achievable,
696 MediaConfig *configDelta =
nullptr)
const;
711 virtual bool isIdle()
const {
return true; }
723 virtual void cancelBlockingWork() {}
737 virtual void cancelPendingWork() {}
751 virtual int pendingInternalWrites()
const {
return 0; }
777 virtual void setIngestPaused(
bool paused) { (void)paused; }
780 void setConfig(
const Config &config) { _config = config; }
807 MediaIORequest sendParams(
const String &name,
const MediaIOParams ¶ms = MediaIOParams());
835 MediaIORequest stats();
866 MediaIOAllocator::Ptr allocator()
const;
880 void setAllocator(MediaIOAllocator::Ptr a);
883 PROMEKI_SIGNAL(errorOccurred, Error);
895 PROMEKI_SIGNAL(descriptorChanged);
908 PROMEKI_SIGNAL(closed, Error);
932 PROMEKI_SIGNAL(commandCompleted, MediaIOCommand::Ptr);
956 virtual void submit(MediaIOCommand::Ptr cmd) = 0;
975 void completeCommand(MediaIOCommand::Ptr cmd);
985 List<MediaIOSource *> _sources;
986 List<MediaIOSink *> _sinks;
987 List<MediaIOPortGroup *> _portGroups;
990 friend class CommandMediaIO;
991 friend class MediaIOPort;
992 friend class MediaIOSink;
993 friend class MediaIOSource;
994 friend class MediaIOPortGroup;
995 friend class MediaIOReadCache;
1007 void resetClosedState();
1021 static int64_t frameByteSize(
const Frame &frame);
1042 void populateStandardStats(MediaIOStats &stats)
const;
1051 MediaIOAllocator::Ptr _allocator;
1060 Atomic<bool> _closing;
1069 MediaDesc _mediaDesc;
1070 AudioDesc _audioDesc;
1072 FrameRate _frameRate;
1073 TimeStamp _originTime;
1074 SeekMode _defaultSeekMode = SeekExact;
1081 MediaDesc _pendingMediaDesc;
1082 AudioDesc _pendingAudioDesc;
1083 Metadata _pendingMetadata;
1084 List<int> _pendingVideoTracks;
1085 List<int> _pendingAudioTracks;
1088PROMEKI_NAMESPACE_END