@ -92,7 +92,7 @@ void Replay::seekTo(int seconds, bool relative) {
cur_mono_time_ = route_start_ts_ + seconds * 1e9 ;
setCurrentSegment ( segment ) ;
bool segment_loaded = std : : find ( segments_merged_ . begin ( ) , segments_merged_ . end ( ) , segment ) ! = segments_merged_ . end ( ) ;
bool segment_loaded = std : : find ( segments_merged_ . begin ( ) , segments_merged_ . end ( ) , segment ) ! = segments_merged_ . end ( ) ;
// return false if segment changed and not loaded yet
return ! segment_changed | | segment_loaded ;
} ) ;
@ -150,19 +150,14 @@ void Replay::mergeSegments(int cur_seg, int end_idx) {
// merge & sort events
std : : vector < Event * > * new_events = new std : : vector < Event * > ( ) ;
std : : unordered_map < uint32_t , EncodeIdx > * new_eidx = new std : : unordered_map < uint32_t , EncodeIdx > [ MAX_CAMERAS ] ;
for ( int n : segments_need_merge ) {
auto & log = segments_ [ n ] - > log ;
auto middle = new_events - > insert ( new_events - > end ( ) , log - > events . begin ( ) , log - > events . end ( ) ) ;
std : : inplace_merge ( new_events - > begin ( ) , middle , new_events - > end ( ) , Event : : lessThan ( ) ) ;
for ( CameraType cam_type : ALL_CAMERAS ) {
new_eidx [ cam_type ] . insert ( log - > eidx [ cam_type ] . begin ( ) , log - > eidx [ cam_type ] . end ( ) ) ;
}
}
// update events
auto prev_events = events_ ;
auto prev_eidx = eidx_ ;
updateEvents ( [ & ] ( ) {
if ( route_start_ts_ = = 0 ) {
// get route start time from initData
@ -174,12 +169,10 @@ void Replay::mergeSegments(int cur_seg, int end_idx) {
}
events_ = new_events ;
eidx_ = new_eidx ;
segments_merged_ = segments_need_merge ;
return true ;
} ) ;
delete prev_events ;
delete [ ] prev_eidx ;
}
// free segments out of current semgnt window.
@ -239,14 +232,15 @@ void Replay::stream() {
}
// publish frame
// TODO: publish all frames
if ( evt - > which = = cereal : : Event : : ROAD_CAMERA_STATE ) {
auto it_ = eidx_ [ RoadCam ] . find ( evt - > event . getRoadCameraState ( ) . getFrameId ( ) ) ;
if ( it_ ! = eidx_ [ RoadCam ] . end ( ) ) {
EncodeIdx & e = it_ - > second ;
auto & seg = segments_ [ e . segmentNum ] ;
if ( seg & & seg - > isLoaded ( ) ) {
if ( evt - > frame ) {
// TODO: publish all frames
if ( evt - > which = = cereal : : Event : : ROAD_ENCODE_IDX ) {
auto idx = evt - > event . getRoadEncodeIdx ( ) ;
auto & seg = segments_ [ idx . getSegmentNum ( ) ] ;
if ( seg & & seg - > isLoaded ( ) & & idx . getType ( ) = = cereal : : EncodeIndex : : Type : : FULL_H_E_V_C ) {
auto & frm = seg - > frames [ RoadCam ] ;
if ( vipc_server = = nullptr ) {
cl_device_id device_id = cl_get_device_id ( CL_DEVICE_TYPE_DEFAULT ) ;
cl_context context = CL_CHECK_ERR ( clCreateContext ( NULL , 1 , & device_id , NULL , NULL , & err ) ) ;
@ -257,7 +251,7 @@ void Replay::stream() {
vipc_server - > start_listener ( ) ;
}
uint8_t * dat = frm - > get ( e . frameEncodeId ) ;
uint8_t * dat = frm - > get ( idx . getSegmentId ( ) ) ;
if ( dat ) {
VisionIpcBufExtra extra = { } ;
VisionBuf * buf = vipc_server - > get_buffer ( VisionStreamType : : VISION_STREAM_RGB_BACK ) ;
@ -266,14 +260,15 @@ void Replay::stream() {
}
}
}
}
// publish msg
if ( sm = = nullptr ) {
auto bytes = evt - > bytes ( ) ;
pm - > send ( type . c_str ( ) , ( capnp : : byte * ) bytes . begin ( ) , bytes . size ( ) ) ;
} else {
sm - > update_msgs ( nanos_since_boot ( ) , { { type , evt - > event } } ) ;
if ( sm = = nullptr ) {
auto bytes = evt - > bytes ( ) ;
pm - > send ( type . c_str ( ) , ( capnp : : byte * ) bytes . begin ( ) , bytes . size ( ) ) ;
} else {
sm - > update_msgs ( nanos_since_boot ( ) , { { type , evt - > event } } ) ;
}
}
}
}