@@ -106,31 +106,27 @@ void Replay::seekTo(double seconds, bool relative) {
106
106
rInfo (" Seeking to %d s, segment %d" , (int )target_time, target_segment);
107
107
notifyEvent (onSeeking, target_time);
108
108
109
- double seeked_to_sec = -1 ;
110
109
interruptStream ([&]() {
111
110
current_segment_ = target_segment;
112
111
cur_mono_time_ = route_start_ts_ + target_time * 1e9 ;
113
- seeking_to_ = target_time;
114
-
115
- if (event_data_->isSegmentLoaded (target_segment)) {
116
- seeked_to_sec = *seeking_to_;
117
- seeking_to_.reset ();
118
- }
112
+ seeking_to_.store (target_time, std::memory_order_relaxed);
119
113
return false ;
120
114
});
121
115
122
- checkSeekProgress (seeked_to_sec);
123
116
seg_mgr_->setCurrentSegment (target_segment);
117
+ checkSeekProgress ();
124
118
}
125
119
126
- void Replay::checkSeekProgress (double seeked_to_sec) {
127
- if (seeked_to_sec >= 0 ) {
128
- if (onSeekedTo) {
129
- onSeekedTo (seeked_to_sec);
130
- } else {
131
- interruptStream ([]() { return true ; });
132
- }
120
+ void Replay::checkSeekProgress () {
121
+ if (!seg_mgr_->getEventData ()->isSegmentLoaded (current_segment_)) return ;
122
+
123
+ double seek_to = seeking_to_.exchange (-1.0 , std::memory_order_relaxed);
124
+ if (seek_to >= 0 && onSeekedTo) {
125
+ onSeekedTo (seek_to);
133
126
}
127
+
128
+ // Resume the interrupted stream
129
+ interruptStream ([]() { return true ; });
134
130
}
135
131
136
132
void Replay::seekToFlag (FindFlag flag) {
@@ -152,29 +148,19 @@ void Replay::pause(bool pause) {
152
148
void Replay::handleSegmentMerge () {
153
149
if (exit_) return ;
154
150
155
- double seeked_to_sec = -1 ;
156
- interruptStream ([&]() {
157
- event_data_ = seg_mgr_->getEventData ();
158
- notifyEvent (onSegmentsMerged);
159
-
160
- bool segment_loaded = event_data_->isSegmentLoaded (current_segment_);
161
- if (seeking_to_ && segment_loaded) {
162
- seeked_to_sec = *seeking_to_;
163
- seeking_to_.reset ();
164
- return false ;
165
- }
166
- return segment_loaded;
167
- });
168
-
169
- checkSeekProgress (seeked_to_sec);
170
- if (!stream_thread_.joinable () && !event_data_->events .empty ()) {
171
- startStream ();
151
+ auto event_data = seg_mgr_->getEventData ();
152
+ if (!stream_thread_.joinable () && !event_data->segments .empty ()) {
153
+ startStream (event_data->segments .begin ()->second );
172
154
}
155
+ notifyEvent (onSegmentsMerged);
156
+
157
+ // Interrupt the stream to handle segment merge
158
+ interruptStream ([]() { return false ; });
159
+ checkSeekProgress ();
173
160
}
174
161
175
- void Replay::startStream () {
176
- const auto &cur_segment = event_data_->segments .begin ()->second ;
177
- const auto &events = cur_segment->log ->events ;
162
+ void Replay::startStream (const std::shared_ptr<Segment> segment) {
163
+ const auto &events = segment->log ->events ;
178
164
route_start_ts_ = events.front ().mono_time ;
179
165
cur_mono_time_ += route_start_ts_ - 1 ;
180
166
@@ -212,7 +198,7 @@ void Replay::startStream() {
212
198
if (!hasFlag (REPLAY_FLAG_NO_VIPC)) {
213
199
std::pair<int , int > camera_size[MAX_CAMERAS] = {};
214
200
for (auto type : ALL_CAMERAS) {
215
- if (auto &fr = cur_segment ->frames [type]) {
201
+ if (auto &fr = segment ->frames [type]) {
216
202
camera_size[type] = {fr->width , fr->height };
217
203
}
218
204
}
@@ -271,6 +257,7 @@ void Replay::streamThread() {
271
257
stream_cv_.wait (lk, [this ]() { return exit_ || (events_ready_ && !interrupt_requested_); });
272
258
if (exit_) break ;
273
259
260
+ event_data_ = seg_mgr_->getEventData ();
274
261
const auto &events = event_data_->events ;
275
262
auto first = std::upper_bound (events.cbegin (), events.cend (), Event (cur_which, cur_mono_time_, {}));
276
263
if (first == events.cend ()) {
0 commit comments