libpromeki 1.0.0-alpha
PROfessional MEdia toolKIt
 
Loading...
Searching...
No Matches
imagefilemediaio.h
Go to the documentation of this file.
1
8#pragma once
9
10
11#include <promeki/config.h>
12#if PROMEKI_ENABLE_PROAV
13#include <promeki/audiodesc.h>
14#include <promeki/audiofile.h>
16#include <promeki/enum.h>
17#include <promeki/filepath.h>
18#include <promeki/framenumber.h>
19#include <promeki/framerate.h>
20#include <promeki/imagefile.h>
21#include <promeki/mediaconfig.h>
22#include <promeki/mediadesc.h>
24#include <promeki/metadata.h>
25#include <promeki/namespace.h>
26#include <promeki/numname.h>
27#include <promeki/pixelformat.h>
28#include <promeki/size2d.h>
29#include <promeki/string.h>
30#include <promeki/stringlist.h>
31
32PROMEKI_NAMESPACE_BEGIN
33
34class ImageFileIO;
35
109class ImageFileMediaIO : public DedicatedThreadMediaIO {
110 PROMEKI_OBJECT(ImageFileMediaIO, DedicatedThreadMediaIO)
111 public:
113 static inline const FrameRate DefaultFrameRate{FrameRate::FPS_30};
114
116 static inline constexpr int DefaultSequenceHead = 1;
117
119 ImageFileMediaIO(ObjectBase *parent = nullptr);
120
122 ~ImageFileMediaIO() override;
123
124 Error proposeInput(const MediaDesc &offered, MediaDesc *preferred) const override;
125
126 protected:
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;
132
133 private:
134 // Maps the extension in @p filename to the preferred writer
135 // PixelFormat for that format, taking the source's bit depth
136 // into account so we don't drop precision unnecessarily
137 // (e.g. 10-bit source -> 10-bit DPX, not 8-bit).
138 PixelFormat preferredWriterPixelFormat(const String &filename, const PixelFormat &source) const;
139
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);
148
149 Error writeImgSeqSidecar();
150
151 // Common state
152 String _filename;
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;
163
164 // Single-file state
165 Frame _frame;
166 FrameCount _readCount{0};
167 FrameCount _writeCount{0};
168 bool _loaded = false;
169
170 // Sequence state
171 NumName _seqName;
172 FilePath _seqDir;
173 FrameNumber _seqHead{0};
174 FrameNumber _seqTail{0};
175 FrameNumber _seqIndex{0};
176 bool _seqAtEnd = false;
177 Metadata _seqMetadata;
178 Size2Du32 _seqSize;
179 PixelFormat _seqPixelFormat;
180
181 // Sidecar audio state (sequence mode only)
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;
190};
191
208class ImageFileFactory : public MediaIOFactory {
209 public:
221 ImageFileFactory(String name, String displayName, String description, StringList extensions,
222 bool canBeSource, bool canBeSink);
223
237 static ImageFileFactory *buildFactoryFor(const ImageFileIO *io);
238
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; }
243
244 bool canBeSource() const override { return _canBeSource; }
245 bool canBeSink() const override { return _canBeSink; }
246
247 bool canHandleDevice(IODevice *device) const override;
248 Config::SpecMap configSpecs() const override;
249 Metadata defaultMetadata() const override;
250
251 MediaIO *create(const Config &config, ObjectBase *parent = nullptr) const override;
252
253 private:
254 String _name;
255 String _displayName;
256 String _description;
257 StringList _extensions;
258 bool _canBeSource;
259 bool _canBeSink;
260};
261
262PROMEKI_NAMESPACE_END
263
264#endif // PROMEKI_ENABLE_PROAV