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
30namespace vrs {
31
32using std::pair;
33using std::unique_ptr;
34
40 public:
46
50 virtual ~MultiRecordFileReader();
51
52 MultiRecordFileReader& operator=(const MultiRecordFileReader&) = delete;
53 MultiRecordFileReader& operator=(MultiRecordFileReader&&) = delete;
54
64 int open(const vector<string>& paths);
65
71 int open(const vector<FileSpec>& fileSpecs);
72
78 int open(const string& path) {
79 return open(vector<string>{path});
80 }
81
87 int open(const FileSpec& fileSpec) {
88 return open(vector<FileSpec>{fileSpec});
89 }
90
97 void setRelatedFileTags(vector<string>&& tags);
98
103 int close();
104
109 const set<UniqueStreamId>& getStreams() const;
110
113 bool isOpened() const {
114 return isOpened_;
115 }
116
119 uint32_t getRecordCount() const;
120
124 uint32_t getRecordCount(UniqueStreamId uniqueStreamId) const;
125
131 uint32_t getRecordCount(UniqueStreamId uniqueStreamId, Record::Type recordType) const;
132
137 const StreamTags& getTags(UniqueStreamId uniqueStreamId) const;
138
144 const string& getTag(const string& name) const {
145 return getTag(fileTags_, name);
146 }
147
152 const string& getTag(UniqueStreamId uniqueStreamId, const string& name) const {
153 return getTag(getTags(uniqueStreamId).user, name);
154 }
155
161 vector<pair<string, int64_t>> getFileChunks() const;
162
169 const string& getFlavor(UniqueStreamId uniqueStreamId) const;
170
174 const string& getSerialNumber(UniqueStreamId uniqueStreamId) const;
175
181 vector<UniqueStreamId> getStreams(RecordableTypeId typeId, const string& flavor = {}) const;
182
191 UniqueStreamId getStreamForName(const string& name) const;
192
204 const string& tagName,
205 const string& tag,
207
212 UniqueStreamId getStreamForSerialNumber(const string& serialNumber) const;
213
219 bool mightContainImages(UniqueStreamId uniqueStreamId) const;
220
226 bool mightContainAudio(UniqueStreamId uniqueStreamId) const;
227
232 uint32_t getRecordIndex(const IndexRecord::RecordInfo* record) const;
233
237 const IndexRecord::RecordInfo* getRecord(uint32_t globalIndex) const;
238
242 uint32_t getRecordSize(uint32_t globalIndex) const;
243
250 const IndexRecord::RecordInfo* getRecord(UniqueStreamId streamId, uint32_t indexNumber) const;
251
259 const IndexRecord::RecordInfo*
260 getRecord(UniqueStreamId streamId, Record::Type recordType, uint32_t indexNumber) const;
261
267 const IndexRecord::RecordInfo* getLastRecord(UniqueStreamId streamId, Record::Type recordType)
268 const;
269
273 const vector<const IndexRecord::RecordInfo*>& getIndex(UniqueStreamId streamId) const;
274
279 const string& getOriginalRecordableTypeName(UniqueStreamId streamId) const {
281 }
282
290 void setStreamPlayer(UniqueStreamId streamId, StreamPlayer* streamPlayer);
291
297 uint32_t getRecordFormats(UniqueStreamId streamId, RecordFormatMap& outFormats) const;
298
304 int readRecord(const IndexRecord::RecordInfo& recordInfo);
305
315 int readRecord(const IndexRecord::RecordInfo& recordInfo, StreamPlayer* player, bool setupPlayer);
316
323 bool setCachingStrategy(CachingStrategy cachingStrategy);
324
328
344 const vector<const IndexRecord::RecordInfo*>& records,
345 bool clearSequence = true);
346
352
357 bool purgeFileCache();
358
361 const map<string, string>& getTags() const {
362 return fileTags_;
363 }
364
370 const IndexRecord::RecordInfo* getFirstRecord(Record::Type recordType) const;
371
377 const IndexRecord::RecordInfo* getLastRecord(Record::Type recordType) const;
378
382 const IndexRecord::RecordInfo* getRecordByTime(double timestamp) const;
383
388 const IndexRecord::RecordInfo* getRecordByTime(UniqueStreamId streamId, double timestamp) const;
389
396 getRecordByTime(StreamId streamId, Record::Type recordType, double timestamp) const;
397
406 double timestamp,
407 double epsilon,
408 StreamId streamId = {},
409 Record::Type recordType = Record::Type::UNDEFINED) const;
410
414 unique_ptr<FileHandler> getFileHandler() const;
415
422 UniqueStreamId getUniqueStreamId(const IndexRecord::RecordInfo* record) const;
423
426 int64_t getTotalSourceSize() const;
427
446 UniqueStreamId uniqueStreamId,
447 StreamPlayer* streamPlayer = nullptr);
448
466 bool readFirstConfigurationRecords(StreamPlayer* streamPlayer = nullptr);
467
477 RecordableTypeId typeId,
478 StreamPlayer* streamPlayer = nullptr);
479
481 const vector<unique_ptr<RecordFileReader>>& getReaders() const {
482 return readers_;
483 }
484
485 static unique_ptr<RecordFileReader> reduceToRecordFileReader_TEMPORARY_API_TO_DELETE(
486 MultiRecordFileReader& multiRecordFileReader);
487
488 private:
489 using StreamIdToUniqueIdMap = map<StreamId, UniqueStreamId>;
490 using StreamIdReaderPair = pair<StreamId, RecordFileReader*>;
491
494 bool hasSingleFile() const {
495 return readers_.size() == 1;
496 }
497
502 bool areFilesRelated() const;
503
504 void initializeUniqueStreamIds();
505
507 void createConsolidatedIndex();
508
509 void initializeFileTags();
510
512 UniqueStreamId generateUniqueStreamId(StreamId duplicateStreamId) const;
513
514 const StreamIdReaderPair* getStreamIdReaderPair(UniqueStreamId uniqueStreamId) const;
515
516 static const string& getTag(const map<string, string>& tags, const string& name);
517
520 RecordFileReader* getReader(const IndexRecord::RecordInfo* record) const;
521
525 UniqueStreamId getUniqueStreamIdInternal(const IndexRecord::RecordInfo* record) const;
526 UniqueStreamId getUniqueStreamIdInternal(const RecordFileReader* reader, StreamId streamId) const;
527
528 bool timeLessThan(const IndexRecord::RecordInfo* lhs, const IndexRecord::RecordInfo* rhs) const;
529
530 class RecordComparatorGT {
531 public:
532 explicit RecordComparatorGT(const MultiRecordFileReader& parent) : parent_(parent) {}
533
534 bool operator()(const IndexRecord::RecordInfo* lhs, const IndexRecord::RecordInfo* rhs) const {
535 return parent_.timeLessThan(rhs, lhs);
536 }
537
538 private:
539 const MultiRecordFileReader& parent_;
540 };
541
542 bool isOpened_{false};
544 vector<unique_ptr<RecordFileReader>> readers_;
546 unique_ptr<vector<const IndexRecord::RecordInfo*>> recordIndex_;
549 set<UniqueStreamId> uniqueStreamIds_;
550 map<const RecordFileReader*, StreamIdToUniqueIdMap> readerStreamIdToUniqueMap_;
551 map<UniqueStreamId, StreamIdReaderPair> uniqueToStreamIdReaderPairMap_;
553 vector<string> filePaths_;
554 const RecordComparatorGT recordComparatorGT_{*this};
555 map<string, string> fileTags_;
557 vector<string> relatedFileTags_;
558
559#ifdef GTEST_BUILD
560 FRIEND_TEST(::MultiRecordFileReaderTest, multiFile);
561#endif
562};
563
564} // namespace vrs
Facilitates reading multiple VRS files simultaneously. Records are sorted by timestamps across all th...
Definition MultiRecordFileReader.h:39
int open(const vector< string > &paths)
Definition MultiRecordFileReader.cpp:54
const IndexRecord::RecordInfo * getRecordByTime(double timestamp) const
Definition MultiRecordFileReader.cpp:579
bool mightContainImages(UniqueStreamId uniqueStreamId) const
Definition MultiRecordFileReader.cpp:290
const IndexRecord::RecordInfo * getNearestRecordByTime(double timestamp, double epsilon, StreamId streamId={}, Record::Type recordType=Record::Type::UNDEFINED) const
Definition MultiRecordFileReader.cpp:626
UniqueStreamId getUniqueStreamId(const IndexRecord::RecordInfo *record) const
Definition MultiRecordFileReader.cpp:657
bool isRecordAvailableOrPrefetch(const IndexRecord::RecordInfo &record) const
Definition MultiRecordFileReader.cpp:559
bool purgeFileCache()
Definition MultiRecordFileReader.cpp:568
bool setCachingStrategy(CachingStrategy cachingStrategy)
Definition MultiRecordFileReader.cpp:516
bool mightContainAudio(UniqueStreamId uniqueStreamId) const
Definition MultiRecordFileReader.cpp:304
UniqueStreamId getStreamForTag(const string &tagName, const string &tag, RecordableTypeId typeId=RecordableTypeId::Undefined) const
Definition MultiRecordFileReader.cpp:255
bool readFirstConfigurationRecord(UniqueStreamId uniqueStreamId, StreamPlayer *streamPlayer=nullptr)
Definition MultiRecordFileReader.cpp:680
unique_ptr< FileHandler > getFileHandler() const
Definition MultiRecordFileReader.cpp:650
const string & getOriginalRecordableTypeName(UniqueStreamId streamId) const
Definition MultiRecordFileReader.h:279
uint32_t getRecordFormats(UniqueStreamId streamId, RecordFormatMap &outFormats) const
Definition MultiRecordFileReader.cpp:469
bool prefetchRecordSequence(const vector< const IndexRecord::RecordInfo * > &records, bool clearSequence=true)
Definition MultiRecordFileReader.cpp:535
bool isOpened() const
Definition MultiRecordFileReader.h:113
const IndexRecord::RecordInfo * getFirstRecord(Record::Type recordType) const
Definition MultiRecordFileReader.cpp:415
const IndexRecord::RecordInfo * getLastRecord(UniqueStreamId streamId, Record::Type recordType) const
Definition MultiRecordFileReader.cpp:403
const vector< const IndexRecord::RecordInfo * > & getIndex(UniqueStreamId streamId) const
Definition MultiRecordFileReader.cpp:438
uint32_t getRecordSize(uint32_t globalIndex) const
Definition MultiRecordFileReader.cpp:354
int close()
Definition MultiRecordFileReader.cpp:102
void setStreamPlayer(UniqueStreamId streamId, StreamPlayer *streamPlayer)
Definition MultiRecordFileReader.cpp:455
int open(const string &path)
Definition MultiRecordFileReader.h:78
const IndexRecord::RecordInfo * getRecord(uint32_t globalIndex) const
Definition MultiRecordFileReader.cpp:343
UniqueStreamId getStreamForSerialNumber(const string &serialNumber) const
Definition MultiRecordFileReader.cpp:274
int open(const FileSpec &fileSpec)
Definition MultiRecordFileReader.h:87
const string & getSerialNumber(UniqueStreamId uniqueStreamId) const
Definition MultiRecordFileReader.cpp:220
int readRecord(const IndexRecord::RecordInfo &recordInfo)
Definition MultiRecordFileReader.cpp:487
uint32_t getRecordIndex(const IndexRecord::RecordInfo *record) const
Definition MultiRecordFileReader.cpp:318
const string & getTag(const string &name) const
Definition MultiRecordFileReader.h:144
int64_t getTotalSourceSize() const
Definition MultiRecordFileReader.cpp:672
const string & getTag(UniqueStreamId uniqueStreamId, const string &name) const
Definition MultiRecordFileReader.h:152
vector< pair< string, int64_t > > getFileChunks() const
Definition MultiRecordFileReader.cpp:200
bool readFirstConfigurationRecords(StreamPlayer *streamPlayer=nullptr)
Definition MultiRecordFileReader.cpp:698
UniqueStreamId getStreamForName(const string &name) const
Definition MultiRecordFileReader.cpp:240
CachingStrategy getCachingStrategy() const
Definition MultiRecordFileReader.cpp:528
const map< string, string > & getTags() const
Definition MultiRecordFileReader.h:361
bool readFirstConfigurationRecordsForType(RecordableTypeId typeId, StreamPlayer *streamPlayer=nullptr)
Definition MultiRecordFileReader.cpp:709
const set< UniqueStreamId > & getStreams() const
Definition MultiRecordFileReader.cpp:124
const vector< unique_ptr< RecordFileReader > > & getReaders() const
Get the list of RecordFileReader objects used to read all the streams.
Definition MultiRecordFileReader.h:481
uint32_t getRecordCount() const
Definition MultiRecordFileReader.cpp:139
const string & getFlavor(UniqueStreamId uniqueStreamId) const
Definition MultiRecordFileReader.cpp:216
void setRelatedFileTags(vector< string > &&tags)
Definition MultiRecordFileReader.cpp:98
Type
Definition Record.h:90
@ UNDEFINED
don't use.
static const string & getOriginalNameTagName()
Definition Recordable.h:208
VRS stream identifier class.
Definition StreamId.h:249
Class designed to receive record data when reading a VRS file.
Definition StreamPlayer.h:53
Definition Compressor.cpp:112
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:630
CachingStrategy
Caching strategy requests.
Definition FileHandler.h:38
RecordableTypeId
VRS stream type or class identifier enum.
Definition StreamId.h:51
@ 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:40
Helper class to hold the details about a single VRS record in memory.
Definition IndexRecord.h:109
Container for a stream's tags, both user and VRS controlled.
Definition Recordable.h:37