@@ -161,52 +161,61 @@ struct LoggerdState {
161161class RemoteEncoder {
162162public:
163163 std::unique_ptr<VideoWriter> writer;
164- int encoder_segment_offset;
164+ int encoder_segment_offset = 0 ;
165165 int current_segment = -1 ;
166166 std::vector<Message *> q;
167167 int dropped_frames = 0 ;
168168 bool recording = false ;
169169 bool marked_ready_to_rotate = false ;
170170 bool seen_first_packet = false ;
171171
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 ) {
173173 if (!seen_first_packet) {
174174 seen_first_packet = true ;
175- encoder_segment_offset = log_segment_num ;
175+ encoder_segment_offset = encoder_segment - logger_segment ;
176176 LOGD (" %s: has encoderd offset %d" , name.c_str (), encoder_segment_offset);
177177 }
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
182178
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
185186 if (recording) {
186187 writer.reset ();
187188 recording = false ;
188189 }
189- current_segment = log_segment_num;
190- marked_ready_to_rotate = false ;
190+ current_segment = logger_segment;
191191 }
192+ marked_ready_to_rotate = false ;
192193 return true ;
193194 }
194195
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+
197205 if (!marked_ready_to_rotate) {
198206 marked_ready_to_rotate = true ;
199207 ++s->ready_to_rotate ;
200208 LOGD (" rotate %d -> %d ready %d/%d for %s" ,
201- log_segment_num, offset_segment_num ,
209+ logger_segment, adjusted_segment ,
202210 s->ready_to_rotate .load (), s->max_waiting , name.c_str ());
203211 }
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;
210219 }
211220 return false ;
212221 }
0 commit comments