|
|
@ -187,19 +187,20 @@ void Replay::mergeSegments(const SegmentMap::iterator &begin, const SegmentMap:: |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
void Replay::publishFrame(const Event *e) { |
|
|
|
void Replay::publishFrame(const Event *e) { |
|
|
|
auto publish = [=](CameraType cam_type, const cereal::EncodeIndex::Reader &eidx) { |
|
|
|
static const std::map<cereal::Event::Which, CameraType> cam_types{ |
|
|
|
int n = eidx.getSegmentNum(); |
|
|
|
{cereal::Event::ROAD_ENCODE_IDX, RoadCam}, |
|
|
|
bool segment_loaded = std::find(segments_merged_.begin(), segments_merged_.end(), n) != segments_merged_.end(); |
|
|
|
{cereal::Event::DRIVER_ENCODE_IDX, DriverCam}, |
|
|
|
if (segment_loaded && segments_[n]->frames[cam_type] && eidx.getType() == cereal::EncodeIndex::Type::FULL_H_E_V_C) { |
|
|
|
{cereal::Event::WIDE_ROAD_ENCODE_IDX, WideRoadCam}, |
|
|
|
camera_server_->pushFrame(cam_type, segments_[n]->frames[cam_type].get(), eidx); |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
}; |
|
|
|
}; |
|
|
|
if (e->which == cereal::Event::ROAD_ENCODE_IDX) { |
|
|
|
auto eidx = capnp::AnyStruct::Reader(e->event).getPointerSection()[0].getAs<cereal::EncodeIndex>(); |
|
|
|
publish(RoadCam, e->event.getRoadEncodeIdx()); |
|
|
|
if (std::find(segments_merged_.begin(), segments_merged_.end(), eidx.getSegmentNum()) == segments_merged_.end()) { |
|
|
|
} else if (e->which == cereal::Event::DRIVER_ENCODE_IDX) { |
|
|
|
// eidx's segment is not loaded
|
|
|
|
publish(DriverCam, e->event.getDriverEncodeIdx()); |
|
|
|
return; |
|
|
|
} else if (e->which == cereal::Event::WIDE_ROAD_ENCODE_IDX) { |
|
|
|
} |
|
|
|
publish(WideRoadCam, e->event.getWideRoadEncodeIdx()); |
|
|
|
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); |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|