diff --git a/facefusion/workflows/image_to_video.py b/facefusion/workflows/image_to_video.py index afcb4f25..b9bb1de9 100644 --- a/facefusion/workflows/image_to_video.py +++ b/facefusion/workflows/image_to_video.py @@ -6,11 +6,9 @@ import cv2 import numpy from tqdm import tqdm -from facefusion import ffmpeg -from facefusion import logger, process_manager, state_manager, translator, video_manager +from facefusion import content_analyser, ffmpeg, logger, process_manager, state_manager, translator, video_manager from facefusion.audio import create_empty_audio_frame, get_audio_frame, get_voice_frame from facefusion.common_helper import get_first, get_middle -from facefusion.content_analyser import analyse_video from facefusion.filesystem import filter_audio_paths, is_video from facefusion.processors.core import get_processors_modules from facefusion.temp_helper import clear_temp_directory, create_temp_directory, move_temp_file, resolve_temp_frame_set @@ -20,28 +18,31 @@ from facefusion.vision import conditional_merge_vision_mask, detect_video_resolu from facefusion.workflows.core import is_process_stopping -#todo: needs review - [workflow] [critical: medium] task list branches on workflow_mode, stream skips extract and merge entirely +#todo: needs review - [workflow] [critical: medium] task list starts with the shared tasks, workflow_mode appends the disk or stream specific tasks def process(start_time : float) -> ErrorCode: tasks =\ [ - setup, - enforce_analysis, - extract_frames, - process_disk_frames, - merge_frames, - restore_audio, - partial(finalize_video, start_time) + analyse_video, + setup ] - if state_manager.get_item('workflow_mode') == 'stream': - tasks =\ + if state_manager.get_item('workflow_mode') == 'disk': + tasks.extend( [ - setup, - enforce_analysis, - process_stream_frames, - restore_audio, - partial(finalize_video, start_time) - ] + extract_frames, + process_disk_frames, + merge_frames + ]) + + if state_manager.get_item('workflow_mode') == 'stream': + tasks.append(process_stream_frames) + + tasks.extend( + [ + restore_audio, + partial(finalize_video,start_time) + ]) + process_manager.start() for task in tasks: @@ -55,7 +56,16 @@ def process(start_time : float) -> ErrorCode: return 0 -#todo: needs review - [workflow] [critical: low] analysis moved out of setup into enforce_analysis +#todo: no review needed - [security] copy of v4 analyse_video task, gates both workflows ahead of setup so no temp cleanup is needed on a hit +def analyse_video() -> ErrorCode: + trim_frame_start, trim_frame_end = restrict_trim_frame(state_manager.get_item('target_path'), state_manager.get_item('trim_frame_start'), state_manager.get_item('trim_frame_end')) + + if content_analyser.analyse_video(state_manager.get_item('target_path'), trim_frame_start, trim_frame_end): + return 3 + return 0 + + +#todo: needs review - [workflow] [critical: low] analysis moved out of setup into the analyse_video task def setup() -> ErrorCode: if clear_temp_directory(state_manager.get_item('target_path')): logger.debug(translator.get('clearing_temp'), __name__) @@ -66,16 +76,6 @@ def setup() -> ErrorCode: return 0 -#todo: needs review - [security] [critical: high] nsfw enforcement gates both workflows and clears temp on hit, must stay ahead of frame processing -def enforce_analysis() -> ErrorCode: - trim_frame_start, trim_frame_end = restrict_trim_frame(state_manager.get_item('target_path'), state_manager.get_item('trim_frame_start'), state_manager.get_item('trim_frame_end')) - - if analyse_video(state_manager.get_item('target_path'), trim_frame_start, trim_frame_end): - clear_temp_directory(state_manager.get_item('target_path')) - return 3 - return 0 - - def extract_frames() -> ErrorCode: trim_frame_start, trim_frame_end = restrict_trim_frame(state_manager.get_item('target_path'), state_manager.get_item('trim_frame_start'), state_manager.get_item('trim_frame_end')) output_video_resolution = scale_resolution(detect_video_resolution(state_manager.get_item('target_path')), state_manager.get_item('output_video_scale'))