VRS
A file format for sensor data.
Loading...
Searching...
No Matches
MultiRecordFileReader.h
1/*
2 * Copyright (c) Meta Platforms, Inc. and affiliates.
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16
17#pragma once
18
19#ifdef GTEST_BUILD
20#include <gtest/gtest.h>
21class GTEST_TEST_CLASS_NAME_(MultiRecordFileReaderTest, multiFile);
22#endif
23
24#include <string>
25#include <vector>
26
27#include <vrs/IndexRecord.h>
28#include <vrs/RecordFileReader.h>
29#include <vrs/TagConventions.h>
30
31namespace vrs {
32
38 public:
44
45 MultiRecordFileReader() = default;
47 MultiRecordFileReader& operator=(const MultiRecordFileReader&) = delete;
48 virtual ~MultiRecordFileReader();
49
59 int open(const std::vector<std::string>& paths);
60
70 int open(const std::vector<FileSpec>& fileSpecs);
71
77 int open(const std::string& path) {
78 return open(std::vector<std::string>{path});
79 }
80
86 int open(const FileSpec& fileSpec) {
87 return open(std::vector<FileSpec>{fileSpec});
88 }
89
92 static inline const string kRelatedFileTags[] = {
93 tag_conventions::kCaptureTimeEpoch,
94 tag_conventions::kSessionId};
95
100 int close();
101
106 const set<UniqueStreamId>& getStreams() const;
107
110 bool isOpened() const {
111 return isOpened_;
112 }
113
116 uint32_t getRecordCount() const;
117
121 uint32_t getRecordCount(UniqueStreamId uniqueStreamId) const;
122
128 uint32_t getRecordCount(UniqueStreamId uniqueStreamId, Record::Type recordType) const;
129
134 const StreamTags& getTags(UniqueStreamId uniqueStreamId) const;
135
141 const string& getTag(const string& name) const {
142 return getTag(fileTags_, name);
143 }
144
149 const string& getTag(UniqueStreamId uniqueStreamId, const string& name) const {
150 return getTag(getTags(uniqueStreamId).user, name);
151 }
152
158 vector<std::pair<string, int64_t>> getFileChunks() const;
159
166 const string& getFlavor(UniqueStreamId uniqueStreamId) const;
167
171 const string& getSerialNumber(UniqueStreamId uniqueStreamId) const;
172
178 vector<UniqueStreamId> getStreams(RecordableTypeId typeId, const string& flavor = {}) const;
179
188 UniqueStreamId getStreamForName(const string& name) const;
189
201 const string& tagName,
202 const string& tag,
204
209 UniqueStreamId getStreamForSerialNumber(const string& serialNumber) const;
210
216 bool mightContainImages(UniqueStreamId uniqueStreamId) const;
217
223 bool mightContainAudio(UniqueStreamId uniqueStreamId) const;
224
229 uint32_t getRecordIndex(const IndexRecord::RecordInfo* record) const;
230
234 const IndexRecord::RecordInfo* getRecord(uint32_t globalIndex) const;
235
239 uint32_t getRecordSize(uint32_t globalIndex) const;
240
247 const IndexRecord::RecordInfo* getRecord(UniqueStreamId streamId, uint32_t indexNumber) const;
248
256 const IndexRecord::RecordInfo*
257 getRecord(UniqueStreamId streamId, Record::Type recordType, uint32_t indexNumber) const;
258
264 const IndexRecord::RecordInfo* getLastRecord(UniqueStreamId streamId, Record::Type recordType)
265 const;
266
270 const vector<const IndexRecord::RecordInfo*>& getIndex(UniqueStreamId streamId) const;
271
276 const string& getOriginalRecordableTypeName(UniqueStreamId streamId) const {
278 }
279
287 void setStreamPlayer(UniqueStreamId streamId, StreamPlayer* streamPlayer);
288
294 uint32_t getRecordFormats(UniqueStreamId streamId, RecordFormatMap& outFormats) const;
295
301 int readRecord(const IndexRecord::RecordInfo& recordInfo);
302
312 int readRecord(const IndexRecord::RecordInfo& recordInfo, StreamPlayer* player, bool setupPlayer);
313
320 bool setCachingStrategy(CachingStrategy cachingStrategy);
321
325
341 const vector<const IndexRecord::RecordInfo*>& records,
342 bool clearSequence = true);
343
349
354 bool purgeFileCache();
355
358 const map<string, string>& getTags() const {
359 return fileTags_;
360 }
361
367 const IndexRecord::RecordInfo* getFirstRecord(Record::Type recordType) const;
368
374 const IndexRecord::RecordInfo* getLastRecord(Record::Type recordType) const;
375
379 const IndexRecord::RecordInfo* getRecordByTime(double timestamp) const;
380
385 const IndexRecord::RecordInfo* getRecordByTime(UniqueStreamId streamId, double timestamp) const;
386
393 getRecordByTime(StreamId streamId, Record::Type recordType, double timestamp) const;
394
403 double timestamp,
404 double epsilon,
405 StreamId streamId = {},
406 Record::Type recordType = Record::Type::UNDEFINED) const;
407
411 std::unique_ptr<FileHandler> getFileHandler() const;
412
419 UniqueStreamId getUniqueStreamId(const IndexRecord::RecordInfo* record) const;
420
423 int64_t getTotalSourceSize() const;
424
443 UniqueStreamId uniqueStreamId,
444 StreamPlayer* streamPlayer = nullptr);
445
463 bool readFirstConfigurationRecords(StreamPlayer* streamPlayer = nullptr);
464
474 RecordableTypeId typeId,
475 StreamPlayer* streamPlayer = nullptr);
476
478 const std::vector<unique_ptr<RecordFileReader>>& getReaders() const {
479 return readers_;
480 }
481
482 private:
483 using StreamIdToUniqueIdMap = map<StreamId, UniqueStreamId>;
484 using StreamIdReaderPair = std::pair<StreamId, RecordFileReader*>;
485
488 bool hasSingleFile() const {
489 return readers_.size() == 1;
490 }
491
496 bool areFilesRelated() const;
497
498 void initializeUniqueStreamIds();
499
501 void createConsolidatedIndex();
502
503 void initializeFileTags();
504
506 UniqueStreamId generateUniqueStreamId(StreamId duplicateStreamId) const;
507
508 const StreamIdReaderPair* getStreamIdReaderPair(UniqueStreamId uniqueStreamId) const;
509
510 static const string& getTag(const map<string, string>& tags, const string& name);
511
514 RecordFileReader* getReader(const IndexRecord::RecordInfo* record) const;
515
519 UniqueStreamId getUniqueStreamIdInternal(const IndexRecord::RecordInfo* record) const;
520 UniqueStreamId getUniqueStreamIdInternal(const RecordFileReader* reader, StreamId streamId) const;
521
522 bool timeLessThan(const IndexRecord::RecordInfo* lhs, const IndexRecord::RecordInfo* rhs) const;
523
524 class RecordComparatorGT {
525 public:
526 explicit RecordComparatorGT(const MultiRecordFileReader& parent) : parent_(parent) {}
527
528 bool operator()(const IndexRecord::RecordInfo* lhs, const IndexRecord::RecordInfo* rhs) const {
529 return parent_.timeLessThan(rhs, lhs);
530 }
531
532 private:
533 const MultiRecordFileReader& parent_;
534 };
535
536 bool isOpened_{false};
538 std::vector<unique_ptr<RecordFileReader>> readers_;
540 unique_ptr<std::vector<const IndexRecord::RecordInfo*>> recordIndex_;
543 set<UniqueStreamId> uniqueStreamIds_;
544 map<const RecordFileReader*, StreamIdToUniqueIdMap> readerStreamIdToUniqueMap_;
545 map<UniqueStreamId, StreamIdReaderPair> uniqueToStreamIdReaderPairMap_;
547 vector<string> filePaths_;
548 const RecordComparatorGT recordComparatorGT_{*this};
549 map<string, string> fileTags_;
550
551#ifdef GTEST_BUILD
552 FRIEND_TEST(::MultiRecordFileReaderTest, multiFile);
553#endif
554};
555
556} // namespace vrs
Facilitates reading multiple VRS files simultaneously. Records are sorted by timestamps across all th...
Definition MultiRecordFileReader.h:37
int open(const std::vector< FileSpec > &fileSpecs)
const IndexRecord::RecordInfo * getRecordByTime(double timestamp) const
Definition MultiRecordFileReader.cpp:571
bool mightContainImages(UniqueStreamId uniqueStreamId) const
Definition MultiRecordFileReader.cpp:282
const IndexRecord::RecordInfo * getNearestRecordByTime(double timestamp, double epsilon, StreamId streamId={}, Record::Type recordType=Record::Type::UNDEFINED) const
Definition MultiRecordFileReader.cpp:618
UniqueStreamId getUniqueStreamId(const IndexRecord::RecordInfo *record) const
Definition MultiRecordFileReader.cpp:649
bool isRecordAvailableOrPrefetch(const IndexRecord::RecordInfo &record) const
Definition MultiRecordFileReader.cpp:551
bool purgeFileCache()
Definition MultiRecordFileReader.cpp:560
int open(const std::string &path)
Definition MultiRecordFileReader.h:77
bool setCachingStrategy(CachingStrategy cachingStrategy)
Definition MultiRecordFileReader.cpp:508
bool mightContainAudio(UniqueStreamId uniqueStreamId) const
Definition MultiRecordFileReader.cpp:296
UniqueStreamId getStreamForTag(const string &tagName, const string &tag, RecordableTypeId typeId=RecordableTypeId::Undefined) const
Definition MultiRecordFileReader.cpp:247
bool readFirstConfigurationRecord(UniqueStreamId uniqueStreamId, StreamPlayer *streamPlayer=nullptr)
Definition MultiRecordFileReader.cpp:672
std::unique_ptr< FileHandler > getFileHandler() const
Definition MultiRecordFileReader.cpp:642
const string & getOriginalRecordableTypeName(UniqueStreamId streamId) const
Definition MultiRecordFileReader.h:276
uint32_t getRecordFormats(UniqueStreamId streamId, RecordFormatMap &outFormats) const
Definition MultiRecordFileReader.cpp:461
bool prefetchRecordSequence(const vector< const IndexRecord::RecordInfo * > &records, bool clearSequence=true)
Definition MultiRecordFileReader.cpp:527
bool isOpened() const
Definition MultiRecordFileReader.h:110
const IndexRecord::RecordInfo * getFirstRecord(Record::Type recordType) const
Definition MultiRecordFileReader.cpp:407
const IndexRecord::RecordInfo * getLastRecord(UniqueStreamId streamId, Record::Type recordType) const
Definition MultiRecordFileReader.cpp:395
const vector< const IndexRecord::RecordInfo * > & getIndex(UniqueStreamId streamId) const
Definition MultiRecordFileReader.cpp:430
uint32_t getRecordSize(uint32_t globalIndex) const
Definition MultiRecordFileReader.cpp:346
int close()
Definition MultiRecordFileReader.cpp:94
void setStreamPlayer(UniqueStreamId streamId, StreamPlayer *streamPlayer)
Definition MultiRecordFileReader.cpp:447
const std::vector< unique_ptr< RecordFileReader > > & getReaders() const
Get the list of RecordFileReader objects used to read all the streams.
Definition MultiRecordFileReader.h:478
const IndexRecord::RecordInfo * getRecord(uint32_t globalIndex) const
Definition MultiRecordFileReader.cpp:335
UniqueStreamId getStreamForSerialNumber(const string &serialNumber) const
Definition MultiRecordFileReader.cpp:266
int open(const FileSpec &fileSpec)
Definition MultiRecordFileReader.h:86
int open(const std::vector< std::string > &paths)
const string & getSerialNumber(UniqueStreamId uniqueStreamId) const
Definition MultiRecordFileReader.cpp:212
int readRecord(const IndexRecord::RecordInfo &recordInfo)
Definition MultiRecordFileReader.cpp:479
uint32_t getRecordIndex(const IndexRecord::RecordInfo *record) const
Definition MultiRecordFileReader.cpp:310
const string & getTag(const string &name) const
Definition MultiRecordFileReader.h:141
int64_t getTotalSourceSize() const
Definition MultiRecordFileReader.cpp:664
const string & getTag(UniqueStreamId uniqueStreamId, const string &name) const
Definition MultiRecordFileReader.h:149
vector< std::pair< string, int64_t > > getFileChunks() const
Definition MultiRecordFileReader.cpp:192
bool readFirstConfigurationRecords(StreamPlayer *streamPlayer=nullptr)
Definition MultiRecordFileReader.cpp:690
UniqueStreamId getStreamForName(const string &name) const
Definition MultiRecordFileReader.cpp:232
CachingStrategy getCachingStrategy() const
Definition MultiRecordFileReader.cpp:520
const map< string, string > & getTags() const
Definition MultiRecordFileReader.h:358
bool readFirstConfigurationRecordsForType(RecordableTypeId typeId, StreamPlayer *streamPlayer=nullptr)
Definition MultiRecordFileReader.cpp:701
const set< UniqueStreamId > & getStreams() const
Definition MultiRecordFileReader.cpp:116
static const string kRelatedFileTags[]
Definition MultiRecordFileReader.h:92
uint32_t getRecordCount() const
Definition MultiRecordFileReader.cpp:131
const string & getFlavor(UniqueStreamId uniqueStreamId) const
Definition MultiRecordFileReader.cpp:208
Type
Definition Record.h:88
@ UNDEFINED
don't use.
static const string & getOriginalNameTagName()
Definition Recordable.h:203
VRS stream identifier class.
Definition StreamId.h:242
Class designed to receive record data when reading a VRS file.
Definition StreamPlayer.h:53
Definition AsyncDiskFileChunk.hpp:49
map< pair< Record::Type, uint32_t >, RecordFormat > RecordFormatMap
Map a pair of record type/format version to a record format, for a particular stream.
Definition RecordFormat.h:590
CachingStrategy
Caching strategy requests.
Definition FileHandler.h:37
RecordableTypeId
VRS stream type or class identifier enum.
Definition StreamId.h:49
@ Undefined
Value used for default initializations and marking undefined situations.
Generalized file descriptor class, allowing the efficient representation of complex file objects,...
Definition FileSpec.h:37
Helper class to hold the details about a single VRS record in memory.
Definition IndexRecord.h:105
Container for a stream's tags, both user and VRS controlled.
Definition Recordable.h:37