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;
48 virtual ~MultiRecordFileReader();
49
50 MultiRecordFileReader& operator=(const MultiRecordFileReader&) = delete;
51 MultiRecordFileReader& operator=(MultiRecordFileReader&&) = delete;
52
62 int open(const std::vector<std::string>& paths);
63
73 int open(const std::vector<FileSpec>& fileSpecs);
74
80 int open(const std::string& path) {
81 return open(std::vector<std::string>{path});
82 }
83
89 int open(const FileSpec& fileSpec) {
90 return open(std::vector<FileSpec>{fileSpec});
91 }
92
95 static inline const string kRelatedFileTags[] = {
96 tag_conventions::kCaptureTimeEpoch,
97 tag_conventions::kSessionId};
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<std::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 std::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 std::vector<unique_ptr<RecordFileReader>>& getReaders() const {
482 return readers_;
483 }
484
485 static std::unique_ptr<RecordFileReader> reduceToRecordFileReader_TEMPORARY_API_TO_DELETE(
486 MultiRecordFileReader& multiRecordFileReader);
487
488 private:
489 using StreamIdToUniqueIdMap = map<StreamId, UniqueStreamId>;
490 using StreamIdReaderPair = std::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 std::vector<unique_ptr<RecordFileReader>> readers_;
546 unique_ptr<std::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_;
556
557#ifdef GTEST_BUILD
558 FRIEND_TEST(::MultiRecordFileReaderTest, multiFile);
559#endif
560};
561
562} // 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:80
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:279
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:113
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:481
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:89
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:144
int64_t getTotalSourceSize() const
Definition MultiRecordFileReader.cpp:664
const string & getTag(UniqueStreamId uniqueStreamId, const string &name) const
Definition MultiRecordFileReader.h:152
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:361
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:95
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:208
VRS stream identifier class.
Definition StreamId.h:243
Class designed to receive record data when reading a VRS file.
Definition StreamPlayer.h:53
Definition Compressor.cpp:113
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:624
CachingStrategy
Caching strategy requests.
Definition FileHandler.h:39
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