#pragma once #include #include #include #include "cereal/gen/cpp/log.capnp.h" #include "selfdrive/camerad/cameras/camera_common.h" const CameraType ALL_CAMERAS[] = {RoadCam, DriverCam, WideRoadCam}; const int MAX_CAMERAS = std::size(ALL_CAMERAS); struct EncodeIdx { int segmentNum; uint32_t frameEncodeId; }; class Event { public: Event(cereal::Event::Which which, uint64_t mono_time) : reader(kj::ArrayPtr{}) { // construct a dummy Event for binary search, e.g std::upper_bound this->which = which; this->mono_time = mono_time; } Event(const kj::ArrayPtr &amsg) : reader(amsg) { words = kj::ArrayPtr(amsg.begin(), reader.getEnd()); event = reader.getRoot(); which = event.which(); mono_time = event.getLogMonoTime(); } inline kj::ArrayPtr bytes() const { return words.asBytes(); } struct lessThan { inline bool operator()(const Event *l, const Event *r) { return l->mono_time < r->mono_time || (l->mono_time == r->mono_time && l->which < r->which); } }; uint64_t mono_time; cereal::Event::Which which; cereal::Event::Reader event; capnp::FlatArrayMessageReader reader; kj::ArrayPtr words; }; class LogReader { public: LogReader() = default; ~LogReader(); bool load(const std::string &file); std::vector events; std::unordered_map eidx[MAX_CAMERAS] = {}; private: std::vector raw_; };