|
|
|
@ -27,8 +27,17 @@ Event::Event(const kj::ArrayPtr<const capnp::word> &amsg, bool frame) : reader(a |
|
|
|
|
|
|
|
|
|
// class LogReader
|
|
|
|
|
|
|
|
|
|
LogReader::LogReader(size_t memory_pool_block_size) { |
|
|
|
|
const size_t buf_size = sizeof(Event) * memory_pool_block_size; |
|
|
|
|
pool_buffer_ = ::operator new(buf_size); |
|
|
|
|
mbr_ = new std::pmr::monotonic_buffer_resource(pool_buffer_, buf_size); |
|
|
|
|
|
|
|
|
|
events.reserve(memory_pool_block_size); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
LogReader::~LogReader() { |
|
|
|
|
for (auto e : events) delete e; |
|
|
|
|
delete mbr_; |
|
|
|
|
::operator delete(pool_buffer_); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
bool LogReader::load(const std::string &file) { |
|
|
|
@ -47,19 +56,19 @@ bool LogReader::load(const std::string &file) { |
|
|
|
|
kj::ArrayPtr<const capnp::word> words((const capnp::word *)raw_.data(), raw_.size() / sizeof(capnp::word)); |
|
|
|
|
while (words.size() > 0) { |
|
|
|
|
try { |
|
|
|
|
std::unique_ptr<Event> evt = std::make_unique<Event>(words); |
|
|
|
|
Event *evt = new (mbr_) Event(words); |
|
|
|
|
|
|
|
|
|
// Add encodeIdx packet again as a frame packet for the video stream
|
|
|
|
|
if (evt->which == cereal::Event::ROAD_ENCODE_IDX || |
|
|
|
|
evt->which == cereal::Event::DRIVER_ENCODE_IDX || |
|
|
|
|
evt->which == cereal::Event::WIDE_ROAD_ENCODE_IDX) { |
|
|
|
|
|
|
|
|
|
std::unique_ptr<Event> frame_evt = std::make_unique<Event>(words, true); |
|
|
|
|
events.push_back(frame_evt.release()); |
|
|
|
|
Event *frame_evt = new (mbr_) Event(words, true); |
|
|
|
|
events.push_back(frame_evt); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
words = kj::arrayPtr(evt->reader.getEnd(), words.end()); |
|
|
|
|
events.push_back(evt.release()); |
|
|
|
|
events.push_back(evt); |
|
|
|
|
} catch (const kj::Exception &e) { |
|
|
|
|
return false; |
|
|
|
|
} |
|
|
|
|