11#include <promeki/config.h>
12#if PROMEKI_ENABLE_PROAV
32PROMEKI_NAMESPACE_BEGIN
109class ImageFileMediaIO :
public DedicatedThreadMediaIO {
110 PROMEKI_OBJECT(ImageFileMediaIO, DedicatedThreadMediaIO)
113 static inline const FrameRate DefaultFrameRate{FrameRate::FPS_30};
116 static inline constexpr int DefaultSequenceHead = 1;
119 ImageFileMediaIO(ObjectBase *parent =
nullptr);
122 ~ImageFileMediaIO()
override;
124 Error proposeInput(
const MediaDesc &offered, MediaDesc *preferred)
const override;
127 Error executeCmd(MediaIOCommandOpen &cmd)
override;
128 Error executeCmd(MediaIOCommandClose &cmd)
override;
129 Error executeCmd(MediaIOCommandRead &cmd)
override;
130 Error executeCmd(MediaIOCommandWrite &cmd)
override;
131 Error executeCmd(MediaIOCommandSeek &cmd)
override;
138 PixelFormat preferredWriterPixelFormat(
const String &filename,
const PixelFormat &source)
const;
140 Error openSingle(MediaIOCommandOpen &cmd, MediaDesc &mediaDesc,
const String &frSource,
bool isWrite,
141 bool &canSeek, FrameCount &frameCount);
142 Error openSequence(MediaIOCommandOpen &cmd, MediaDesc &mediaDesc,
const String &frSource,
bool isWrite,
143 bool &canSeek, FrameCount &frameCount);
144 Error readSingle(MediaIOCommandRead &cmd);
145 Error readSequence(MediaIOCommandRead &cmd);
146 Error writeSingle(MediaIOCommandWrite &cmd);
147 Error writeSequence(MediaIOCommandWrite &cmd);
149 Error writeImgSeqSidecar();
153 int _imageFileID = ImageFile::Invalid;
154 bool _isOpen =
false;
155 bool _isWrite =
false;
156 bool _sequenceMode =
false;
157 Metadata _writeContainerMetadata;
158 MediaConfig _ioConfig;
159 bool _saveImgSeqEnabled =
true;
160 String _saveImgSeqPath;
161 Enum _saveImgSeqPathMode;
162 FrameRate _writerFrameRate;
166 FrameCount _readCount{0};
167 FrameCount _writeCount{0};
168 bool _loaded =
false;
173 FrameNumber _seqHead{0};
174 FrameNumber _seqTail{0};
175 FrameNumber _seqIndex{0};
176 bool _seqAtEnd =
false;
177 Metadata _seqMetadata;
179 PixelFormat _seqPixelFormat;
182 AudioFile _sidecarAudio;
183 AudioDesc _sidecarAudioDesc;
184 String _sidecarAudioPath;
185 FrameRate _sidecarFrameRate;
186 int64_t _sidecarSampleRate = 0;
187 bool _sidecarAudioOpen =
false;
188 bool _sidecarAudioEnabled =
true;
189 String _sidecarAudioName;
208class ImageFileFactory :
public MediaIOFactory {
221 ImageFileFactory(String name, String displayName, String description, StringList extensions,
222 bool canBeSource,
bool canBeSink);
237 static ImageFileFactory *buildFactoryFor(
const ImageFileIO *io);
239 String name()
const override {
return _name; }
240 String displayName()
const override {
return _displayName; }
241 String description()
const override {
return _description; }
242 StringList extensions()
const override {
return _extensions; }
244 bool canBeSource()
const override {
return _canBeSource; }
245 bool canBeSink()
const override {
return _canBeSink; }
247 bool canHandleDevice(IODevice *device)
const override;
248 Config::SpecMap configSpecs()
const override;
249 Metadata defaultMetadata()
const override;
251 MediaIO *create(
const Config &config, ObjectBase *parent =
nullptr)
const override;
257 StringList _extensions;