20#include <gtest/gtest.h>
21class GTEST_TEST_CLASS_NAME_(MultiRecordFileReaderTest, multiFile);
27#include <vrs/IndexRecord.h>
28#include <vrs/RecordFileReader.h>
29#include <vrs/TagConventions.h>
59 int open(
const std::vector<std::string>& paths);
70 int open(
const std::vector<FileSpec>& fileSpecs);
77 int open(
const std::string& path) {
78 return open(std::vector<std::string>{path});
87 return open(std::vector<FileSpec>{fileSpec});
93 tag_conventions::kCaptureTimeEpoch,
94 tag_conventions::kSessionId};
106 const set<UniqueStreamId>&
getStreams()
const;
141 const string&
getTag(
const string& name)
const {
142 return getTag(fileTags_, name);
201 const string& tagName,
229 uint32_t
getRecordIndex(
const IndexRecord::RecordInfo* record)
const;
234 const IndexRecord::RecordInfo*
getRecord(uint32_t globalIndex)
const;
256 const IndexRecord::RecordInfo*
341 const vector<const IndexRecord::RecordInfo*>& records,
342 bool clearSequence =
true);
444 StreamPlayer* streamPlayer =
nullptr);
475 StreamPlayer* streamPlayer =
nullptr);
478 const std::vector<unique_ptr<RecordFileReader>>&
getReaders()
const {
483 using StreamIdToUniqueIdMap = map<StreamId, UniqueStreamId>;
484 using StreamIdReaderPair = std::pair<StreamId, RecordFileReader*>;
488 bool hasSingleFile()
const {
489 return readers_.size() == 1;
496 bool areFilesRelated()
const;
498 void initializeUniqueStreamIds();
501 void createConsolidatedIndex();
503 void initializeFileTags();
506 UniqueStreamId generateUniqueStreamId(StreamId duplicateStreamId)
const;
508 const StreamIdReaderPair* getStreamIdReaderPair(
UniqueStreamId uniqueStreamId)
const;
510 static const string&
getTag(
const map<string, string>& tags,
const string& name);
514 RecordFileReader* getReader(
const IndexRecord::RecordInfo* record)
const;
519 UniqueStreamId getUniqueStreamIdInternal(
const IndexRecord::RecordInfo* record)
const;
520 UniqueStreamId getUniqueStreamIdInternal(
const RecordFileReader* reader, StreamId streamId)
const;
522 bool timeLessThan(
const IndexRecord::RecordInfo* lhs,
const IndexRecord::RecordInfo* rhs)
const;
524 class RecordComparatorGT {
526 explicit RecordComparatorGT(
const MultiRecordFileReader& parent) : parent_(parent) {}
528 bool operator()(
const IndexRecord::RecordInfo* lhs,
const IndexRecord::RecordInfo* rhs)
const {
529 return parent_.timeLessThan(rhs, lhs);
533 const MultiRecordFileReader& parent_;
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_;
552 FRIEND_TEST(::MultiRecordFileReaderTest, multiFile);
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
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