Merge branch 'master' into v4

Resolve 57 conflicts keeping v4's architecture (UI removal, api app
context, path isolation, streaming/codecs/rtc, workflow-mode superset,
args_helper) and taking master's post-fork features so none are dropped:
inference override/adjust provider hooks (+ face_swapper 3.8.1 coreml
fix), is_vision_frame validity guards, resolve_temp_frame_set frame
numbering with the source audio/voice trim offset, the ffmpeg color
pipeline (restrict_color_transfer / convert_color_space / temp_pixel_format),
ffprobe select_stream v:0 + format duration, pre_check ffprobe with
dependency_not_installed, onnxruntime arena-leak guard + version lru_cache,
installer cuda@12/@13 provider split, workflow_strategy disk/memory
(memory default), and the dependency version bumps. content_analyser hash
guard rehashed to 3c6ce25e.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01V7MdZEmd1GE8uSDTMyq34r
This commit is contained in:
henryruhs
2026-08-05 22:12:54 +02:00
co-authored by Claude Opus 4.8
50 changed files with 1032 additions and 302 deletions
+2 -2
View File
@@ -79,7 +79,7 @@ def test_run_video_encode_loop(video_codec : VideoCodec, payload_type : int) ->
video_queue : Queue[Tuple[Time, Future[BufferPack]]] = Queue(maxsize = 30)
with ThreadPoolExecutor(max_workers = 1) as executor:
video_queue.put((0.1, executor.submit(process_video_frame, video_frame)))
video_queue.put((0.1, executor.submit(process_video_frame, [], video_frame)))
with patch('facefusion.apis.stream_video.rtc.send_video') as send_video_mock:
encode_loop_thread = threading.Thread(target = run_video_encode_loop, args = (rtc_peer, video_queue), daemon = True)
@@ -267,7 +267,7 @@ def test_handle_video_frame(video_codec : VideoCodec) -> None:
with ThreadPoolExecutor(max_workers = 1) as executor:
with patch('facefusion.apis.stream_video.decode_video_frame', return_value = video_frame):
with patch('facefusion.apis.stream_video.process_video_frame', return_value = BufferPack(buffer = video_frame.tobytes(), resolution = (426, 226))):
handle_video_frame(video_codec, video_decoder, video_queue, executor, bytes(), 0)
handle_video_frame([], video_codec, video_decoder, video_queue, executor, bytes(), 0)
_, video_future = video_queue.get_nowait()
video_buffer = video_future.result().get('buffer')