diff --git a/main.py b/main.py index b16c515..5a8e1e5 100644 --- a/main.py +++ b/main.py @@ -362,8 +362,13 @@ class MediaGrader: self.jump_history[current_file].append(self.current_frame) # Jump to the target frame - self.current_cap.set(cv2.CAP_PROP_POS_FRAMES, target_frame) - self.load_current_frame() + if self.multi_segment_mode: + # In multi-segment mode, reposition all segments relative to the jump target + self.reposition_segments_around_frame(target_frame) + else: + # In single mode, just jump the main capture + self.current_cap.set(cv2.CAP_PROP_POS_FRAMES, target_frame) + self.load_current_frame() # Increment jump counter self.jump_counters[current_file] += 1 @@ -514,9 +519,9 @@ class MediaGrader: # Calculate segment positions - evenly spaced through video self.segment_positions = [] for i in range(self.segment_count): - # Position segments at 0%, 25%, 50%, 75% of video - position_ratio = i / max(1, self.segment_count - 1) if self.segment_count > 1 else 0 - start_frame = int(position_ratio * (self.total_frames - 1)) + # Position segments at 0%, 25%, 50%, 75% of video (not 0%, 33%, 66%, 100%) + position_ratio = i / self.segment_count # This gives 0, 0.25, 0.5, 0.75 + start_frame = int(position_ratio * self.total_frames) self.segment_positions.append(start_frame) # Create video captures for each segment @@ -562,6 +567,37 @@ class MediaGrader: if ret: self.segment_frames[i] = frame + def reposition_segments_around_frame(self, center_frame: int): + """Reposition all segments around a center frame while maintaining spacing""" + if not self.multi_segment_mode or not self.segment_caps: + return + + # Calculate new segment positions around the center frame + # Keep the same relative spacing but center around the new frame + segment_spacing = self.total_frames // (self.segment_count + 1) + + new_positions = [] + for i in range(self.segment_count): + # Spread segments around center_frame + offset = (i - (self.segment_count - 1) / 2) * segment_spacing + new_frame = int(center_frame + offset) + new_frame = max(0, min(new_frame, self.total_frames - 1)) + new_positions.append(new_frame) + + # Update segment positions and seek all captures + self.segment_positions = new_positions + + for i, cap in enumerate(self.segment_caps): + if cap and cap.isOpened(): + cap.set(cv2.CAP_PROP_POS_FRAMES, self.segment_positions[i]) + + # Load new frame + ret, frame = cap.read() + if ret: + self.segment_frames[i] = frame + # Reset position for next read + cap.set(cv2.CAP_PROP_POS_FRAMES, self.segment_positions[i]) + def seek_all_segments(self, frames_delta: int): """Seek all segments by the specified number of frames""" if not self.multi_segment_mode or not self.segment_caps: