From 5d1049cd8f120b2c86a4c383114332a7506f1d4f Mon Sep 17 00:00:00 2001 From: henryruhs Date: Wed, 22 Jul 2026 14:45:56 +0200 Subject: [PATCH] Skip forward reads and warm the reference frame to avoid reader restarts Co-Authored-By: Claude Opus 4.8 Claude-Session: https://claude.ai/code/session_01M8GqDtmNT89ei6EJrQKWXx --- facefusion/video_manager.py | 7 +++++++ facefusion/workflows/image_to_video.py | 4 ++++ 2 files changed, 11 insertions(+) diff --git a/facefusion/video_manager.py b/facefusion/video_manager.py index fe1ad843..fc04e854 100644 --- a/facefusion/video_manager.py +++ b/facefusion/video_manager.py @@ -50,6 +50,13 @@ def get_video_reader(video_path : str) -> VideoReader: def conditional_set_video_reader_position(video_reader : VideoReader, frame_position : int) -> None: + skip_margin = 128 + skipping = video_reader.get('position') < frame_position and frame_position - video_reader.get('position') <= skip_margin + + while skipping: + has_vision_frame, vision_frame = read_video_reader_frame(video_reader) + skipping = has_vision_frame and video_reader.get('position') < frame_position + if not video_reader.get('position') == frame_position: restart_video_reader(video_reader, frame_position) diff --git a/facefusion/workflows/image_to_video.py b/facefusion/workflows/image_to_video.py index 1339592b..1bde61d3 100644 --- a/facefusion/workflows/image_to_video.py +++ b/facefusion/workflows/image_to_video.py @@ -97,6 +97,8 @@ def process_stream_frames() -> ErrorCode: with tqdm(total = len(frame_range), desc = translator.get('processing'), unit = 'frame', ascii = ' =', disable = state_manager.get_item('log_level') in [ 'warn', 'error' ]) as progress: progress.set_postfix(execution_providers = state_manager.get_item('execution_providers')) + read_static_video_frame(state_manager.get_item('target_path'), state_manager.get_item('reference_frame_number')) + with ThreadPoolExecutor(max_workers = state_manager.get_item('execution_thread_count')) as executor: futures = [] # TODO: review - this has to be a dedicated method @@ -235,6 +237,8 @@ def process_disk_frames() -> ErrorCode: with tqdm(total = len(temp_frame_set), desc = translator.get('processing'), unit = 'frame', ascii = ' =', disable = state_manager.get_item('log_level') in [ 'warn', 'error' ]) as progress: progress.set_postfix(execution_providers = state_manager.get_item('execution_providers')) + read_static_video_frame(state_manager.get_item('target_path'), state_manager.get_item('reference_frame_number')) + with ThreadPoolExecutor(max_workers = state_manager.get_item('execution_thread_count')) as executor: futures = []