libpromeki 1.0.0-alpha
PROfessional MEdia toolKIt
 
Loading...
Searching...
No Matches
debugmediafile.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/namespace.h>
14#include <promeki/objectbase.h>
15#include <promeki/string.h>
16#include <promeki/error.h>
17#include <promeki/frame.h>
18#include <promeki/framenumber.h>
19#include <promeki/framecount.h>
20#include <promeki/metadata.h>
21#include <promeki/list.h>
22#include <promeki/uniqueptr.h>
23
24PROMEKI_NAMESPACE_BEGIN
25
26class File;
27
89class DebugMediaFile : public ObjectBase {
90 PROMEKI_OBJECT(DebugMediaFile, ObjectBase)
91 public:
93 using UPtr = UniquePtr<DebugMediaFile>;
94
96 enum Mode {
97 NotOpen = 0,
98 Read,
99 Write
100 };
101
108 struct OpenOptions {
111 Metadata sessionInfo;
112 };
113
115 struct FrameIndexEntry {
116 int64_t fileOffset = 0;
117 FrameNumber frameNumber;
118 int64_t presentationUs =
119 0;
120 };
121
123 static constexpr char kMagic[8] = {'P', 'M', 'D', 'F', '\x1A', '\x0A', '\x00', '\x00'};
124
126 static constexpr uint32_t kFormatVersion = 1;
127
129 static constexpr uint32_t kFileFlagHasFooter = 0x00000001;
130
132 explicit DebugMediaFile(ObjectBase *parent = nullptr);
133
135 ~DebugMediaFile() override;
136
151 Error open(const String &filename, Mode mode, const OpenOptions &opts = {});
152
164 Error close();
165
167 bool isOpen() const { return _mode != NotOpen; }
168
170 Mode mode() const { return _mode; }
171
173 const String &filename() const { return _filename; }
174
175 // ---- Write API ----
176
190 Error writeFrame(const Frame &frame);
191
193 FrameCount framesWritten() const { return _framesWritten; }
194
195 // ---- Read API ----
196
207 Error readFrame(Frame &out);
208
222 Error readFrameAt(const FrameNumber &frameNumber, Frame &out);
223
233 Error seek(const FrameNumber &frameNumber);
234
236 const Metadata &sessionInfo() const { return _sessionInfo; }
237
239 FrameCount frameCount() const;
240
242 bool hasFooter() const { return (_fileFlags & kFileFlagHasFooter) != 0; }
243
248 const List<FrameIndexEntry> &index() const;
249
250 private:
251 String _filename;
252 Mode _mode = NotOpen;
253 File *_file = nullptr;
254 uint32_t _fileFlags = 0;
255 uint32_t _fileVersion = 0;
256 int64_t _firstFramePos = 0;
257 FrameCount _framesWritten{0};
258 mutable FrameNumber _readCursor{0};
259 mutable bool _indexBuilt = false;
260 mutable List<FrameIndexEntry> _index;
261 Metadata _sessionInfo;
262
263 Error writeSignature(uint32_t flags);
264 Error writeSessionChunk(const Metadata &sessionInfo);
265 Error readSignature();
266 Error readSessionChunk();
267 Error appendFooter();
268 Error buildIndex() const;
269};
270
271PROMEKI_NAMESPACE_END
272
273#endif // PROMEKI_ENABLE_PROAV