@@ -161,52 +161,61 @@ struct LoggerdState {
161
161
class RemoteEncoder {
162
162
public:
163
163
std::unique_ptr<VideoWriter> writer;
164
- int encoder_segment_offset;
164
+ int encoder_segment_offset = 0 ;
165
165
int current_segment = -1 ;
166
166
std::vector<Message *> q;
167
167
int dropped_frames = 0 ;
168
168
bool recording = false ;
169
169
bool marked_ready_to_rotate = false ;
170
170
bool seen_first_packet = false ;
171
171
172
- bool syncSegment (LoggerdState *s, const std::string &name, int encoder_segment_num , int log_segment_num ) {
172
+ bool syncSegment (LoggerdState *s, const std::string &name, int encoder_segment , int logger_segment ) {
173
173
if (!seen_first_packet) {
174
174
seen_first_packet = true ;
175
- encoder_segment_offset = log_segment_num ;
175
+ encoder_segment_offset = encoder_segment - logger_segment ;
176
176
LOGD (" %s: has encoderd offset %d" , name.c_str (), encoder_segment_offset);
177
177
}
178
- int offset_segment_num = encoder_segment_num - encoder_segment_offset;
179
- printf (" offset %d encoder_segment_offset: %d, log_segment_num:%d\n " , offset_segment_num, encoder_segment_offset, log_segment_num);
180
- if (offset_segment_num == log_segment_num) {
181
- // loggerd is now on the segment that matches this packet
182
178
183
- // if this is a new segment, we close any possible old segments, move to the new, and process any queued packets
184
- if (current_segment != log_segment_num) {
179
+ // Calculate adjusted segment based on offset
180
+ int adjusted_segment = encoder_segment - encoder_segment_offset;
181
+
182
+ // Case 1: Segments are synchronized
183
+ if (adjusted_segment == logger_segment) {
184
+ if (current_segment != logger_segment) {
185
+ // New segment detected; reset writer if recording
185
186
if (recording) {
186
187
writer.reset ();
187
188
recording = false ;
188
189
}
189
- current_segment = log_segment_num;
190
- marked_ready_to_rotate = false ;
190
+ current_segment = logger_segment;
191
191
}
192
+ marked_ready_to_rotate = false ;
192
193
return true ;
193
194
}
194
195
195
- if (offset_segment_num > log_segment_num) {
196
- // encoderd packet has a newer segment, this means encoderd has rolled over
196
+ // Case 2: Encoder is ahead (newer segment)
197
+ if (adjusted_segment > logger_segment) {
198
+ int segment_gap = adjusted_segment - logger_segment;
199
+ if (segment_gap > 1 ) {
200
+ LOGE (" %s: encoder jumped ahead by %d segments (adj=%d, log=%d), adjusting offset" ,
201
+ name.c_str (), segment_gap, adjusted_segment, logger_segment);
202
+ encoder_segment_offset += segment_gap - 1 ;
203
+ }
204
+
197
205
if (!marked_ready_to_rotate) {
198
206
marked_ready_to_rotate = true ;
199
207
++s->ready_to_rotate ;
200
208
LOGD (" rotate %d -> %d ready %d/%d for %s" ,
201
- log_segment_num, offset_segment_num ,
209
+ logger_segment, adjusted_segment ,
202
210
s->ready_to_rotate .load (), s->max_waiting , name.c_str ());
203
211
}
204
- } else {
205
- LOGE (" %s: encoderd packet has a older segment!!! idx.getSegmentNum():%d s->logger.segment():%d re.encoder_segment_offset:%d" ,
206
- name.c_str (), encoder_segment_num, log_segment_num, encoder_segment_offset);
207
- // free the message, it's useless. this should never happen
208
- // actually, this can happen if you restart encoderd
209
- encoder_segment_offset = -log_segment_num;
212
+
213
+ }
214
+ // Case 3: Encoder is behind (older segment)
215
+ else {
216
+ LOGE (" %s: encoderd packet has a older segment!!! idx.getSegmentNum():%d s->logger.segment():%d encoder_segment_offset:%d" ,
217
+ name.c_str (), encoder_segment, logger_segment, encoder_segment_offset);
218
+ encoder_segment_offset = encoder_segment - logger_segment;
210
219
}
211
220
return false ;
212
221
}
0 commit comments