From c801c65b9dbf83dde9c15317da78f113f3ee6acb Mon Sep 17 00:00:00 2001 From: Dean Lee Date: Tue, 12 Oct 2021 00:57:35 +0800 Subject: [PATCH] replay: get EncoderIndex from capnp::AnyStruct (#22518) * get EncoderIndex from capnp::AnyStruct * const --- selfdrive/ui/replay/logreader.cc | 12 +----------- selfdrive/ui/replay/replay.cc | 25 +++++++++++++------------ 2 files changed, 14 insertions(+), 23 deletions(-) diff --git a/selfdrive/ui/replay/logreader.cc b/selfdrive/ui/replay/logreader.cc index 3980f5f209..1b88402713 100644 --- a/selfdrive/ui/replay/logreader.cc +++ b/selfdrive/ui/replay/logreader.cc @@ -14,17 +14,7 @@ Event::Event(const kj::ArrayPtr &amsg, bool frame) : reader(a // 1) Send video data at t=timestampEof/timestampSof // 2) Send encodeIndex packet at t=logMonoTime if (frame) { - cereal::EncodeIndex::Reader idx; - if (which == cereal::Event::ROAD_ENCODE_IDX) { - idx = event.getRoadEncodeIdx(); - } else if (which == cereal::Event::DRIVER_ENCODE_IDX) { - idx = event.getDriverEncodeIdx(); - } else if (which == cereal::Event::WIDE_ROAD_ENCODE_IDX) { - idx = event.getWideRoadEncodeIdx(); - } else { - assert(false); - } - + auto idx = capnp::AnyStruct::Reader(event).getPointerSection()[0].getAs(); // C2 only has eof set, and some older routes have neither uint64_t sof = idx.getTimestampSof(); uint64_t eof = idx.getTimestampEof(); diff --git a/selfdrive/ui/replay/replay.cc b/selfdrive/ui/replay/replay.cc index dec204b7b3..77f2a1a267 100644 --- a/selfdrive/ui/replay/replay.cc +++ b/selfdrive/ui/replay/replay.cc @@ -187,19 +187,20 @@ void Replay::mergeSegments(const SegmentMap::iterator &begin, const SegmentMap:: } void Replay::publishFrame(const Event *e) { - auto publish = [=](CameraType cam_type, const cereal::EncodeIndex::Reader &eidx) { - int n = eidx.getSegmentNum(); - bool segment_loaded = std::find(segments_merged_.begin(), segments_merged_.end(), n) != segments_merged_.end(); - if (segment_loaded && segments_[n]->frames[cam_type] && eidx.getType() == cereal::EncodeIndex::Type::FULL_H_E_V_C) { - camera_server_->pushFrame(cam_type, segments_[n]->frames[cam_type].get(), eidx); - } + static const std::map cam_types{ + {cereal::Event::ROAD_ENCODE_IDX, RoadCam}, + {cereal::Event::DRIVER_ENCODE_IDX, DriverCam}, + {cereal::Event::WIDE_ROAD_ENCODE_IDX, WideRoadCam}, }; - if (e->which == cereal::Event::ROAD_ENCODE_IDX) { - publish(RoadCam, e->event.getRoadEncodeIdx()); - } else if (e->which == cereal::Event::DRIVER_ENCODE_IDX) { - publish(DriverCam, e->event.getDriverEncodeIdx()); - } else if (e->which == cereal::Event::WIDE_ROAD_ENCODE_IDX) { - publish(WideRoadCam, e->event.getWideRoadEncodeIdx()); + auto eidx = capnp::AnyStruct::Reader(e->event).getPointerSection()[0].getAs(); + if (std::find(segments_merged_.begin(), segments_merged_.end(), eidx.getSegmentNum()) == segments_merged_.end()) { + // eidx's segment is not loaded + return; + } + CameraType cam = cam_types.at(e->which); + auto &fr = segments_[eidx.getSegmentNum()]->frames[cam]; + if (fr && eidx.getType() == cereal::EncodeIndex::Type::FULL_H_E_V_C) { + camera_server_->pushFrame(cam, fr.get(), eidx); } }