2025-01-13 10:42:40 +01:00
|
|
|
from shutil import which
|
|
|
|
|
|
|
|
|
|
from facefusion import ffmpeg_builder
|
2025-01-13 12:34:12 +01:00
|
|
|
from facefusion.ffmpeg_builder import chain, run, select_frame_range, set_audio_quality, set_audio_sample_size, set_stream_mode, set_video_quality
|
2025-01-13 10:42:40 +01:00
|
|
|
|
|
|
|
|
|
|
|
|
|
def test_run() -> None:
|
2025-01-13 11:46:56 +01:00
|
|
|
assert run([]) == [ which('ffmpeg'), '-loglevel', 'error' ]
|
2025-01-13 10:42:40 +01:00
|
|
|
|
|
|
|
|
|
|
|
|
|
def test_chain() -> None:
|
2025-01-13 12:34:12 +01:00
|
|
|
assert chain(ffmpeg_builder.set_progress()) == [ '-progress' ]
|
2025-01-13 10:42:40 +01:00
|
|
|
|
|
|
|
|
|
2025-01-26 04:16:28 +01:00
|
|
|
def test_set_stream_mode() -> None:
|
2025-01-13 11:46:56 +01:00
|
|
|
assert set_stream_mode('udp') == [ '-f', 'mpegts' ]
|
|
|
|
|
assert set_stream_mode('v4l2') == [ '-f', 'v4l2' ]
|
2025-01-13 10:42:40 +01:00
|
|
|
|
|
|
|
|
|
|
|
|
|
def test_select_frame_range() -> None:
|
2025-01-13 11:46:56 +01:00
|
|
|
assert select_frame_range(0, None, 30) == [ '-vf', 'trim=start_frame=0,fps=30' ]
|
|
|
|
|
assert select_frame_range(None, 100, 30) == [ '-vf', 'trim=end_frame=100,fps=30' ]
|
|
|
|
|
assert select_frame_range(0, 100, 30) == [ '-vf', 'trim=start_frame=0:end_frame=100,fps=30' ]
|
|
|
|
|
assert select_frame_range(None, None, 30) == [ '-vf', 'fps=30' ]
|
2025-01-13 10:42:40 +01:00
|
|
|
|
|
|
|
|
|
2025-01-26 04:16:28 +01:00
|
|
|
def test_set_audio_sample_size() -> None:
|
|
|
|
|
assert set_audio_sample_size(16) == [ '-f', 's16le' ]
|
|
|
|
|
assert set_audio_sample_size(32) == [ '-f', 's32le' ]
|
2025-01-13 11:46:56 +01:00
|
|
|
|
|
|
|
|
|
|
|
|
|
def test_set_audio_quality() -> None:
|
2025-02-11 09:25:10 +01:00
|
|
|
assert set_audio_quality('aac', 0) == [ '-q:a', '0.1' ]
|
2025-01-13 12:53:32 +01:00
|
|
|
assert set_audio_quality('aac', 50) == [ '-q:a', '1.0' ]
|
2025-02-11 09:25:10 +01:00
|
|
|
assert set_audio_quality('aac', 100) == [ '-q:a', '2.0' ]
|
2025-01-13 11:46:56 +01:00
|
|
|
assert set_audio_quality('libmp3lame', 0) == [ '-q:a', '9' ]
|
|
|
|
|
assert set_audio_quality('libmp3lame', 50) == [ '-q:a', '4' ]
|
|
|
|
|
assert set_audio_quality('libmp3lame', 100) == [ '-q:a', '0' ]
|
|
|
|
|
assert set_audio_quality('libopus', 0) == [ '-b:a', '64k' ]
|
2025-05-25 15:52:52 +02:00
|
|
|
assert set_audio_quality('libopus', 50) == [ '-b:a', '160k' ]
|
|
|
|
|
assert set_audio_quality('libopus', 100) == [ '-b:a', '256k' ]
|
2025-01-13 11:46:56 +01:00
|
|
|
assert set_audio_quality('libvorbis', 0) == [ '-q:a', '-1.0' ]
|
|
|
|
|
assert set_audio_quality('libvorbis', 50) == [ '-q:a', '4.5' ]
|
|
|
|
|
assert set_audio_quality('libvorbis', 100) == [ '-q:a', '10.0' ]
|
2025-01-26 22:54:07 +01:00
|
|
|
assert set_audio_quality('flac', 0) == []
|
|
|
|
|
assert set_audio_quality('flac', 50) == []
|
|
|
|
|
assert set_audio_quality('flac', 100) == []
|
2025-01-13 12:34:12 +01:00
|
|
|
|
|
|
|
|
|
|
|
|
|
def test_set_video_quality() -> None:
|
|
|
|
|
assert set_video_quality('libx264', 0) == [ '-crf', '51' ]
|
|
|
|
|
assert set_video_quality('libx264', 50) == [ '-crf', '26' ]
|
|
|
|
|
assert set_video_quality('libx264', 100) == [ '-crf', '0' ]
|
Next (#945)
* Rename calcXXX to calculateXXX
* Add migraphx support
* Add migraphx support
* Add migraphx support
* Add migraphx support
* Add migraphx support
* Add migraphx support
* Use True for the flags
* Add migraphx support
* add face-swapper-weight
* add face-swapper-weight to facefusion.ini
* changes
* change choice
* Fix typing for xxxWeight
* Feat/log inference session (#906)
* Log inference session, Introduce time helper
* Log inference session, Introduce time helper
* Log inference session, Introduce time helper
* Log inference session, Introduce time helper
* Mark as NEXT
* Follow industry standard x1, x2, y1 and y2
* Follow industry standard x1, x2, y1 and y2
* Follow industry standard in terms of naming (#908)
* Follow industry standard in terms of naming
* Improve xxx_embedding naming
* Fix norm vs. norms
* Reduce timeout to 5
* Sort out voice_extractor once again
* changes
* Introduce many to the occlusion mask (#910)
* Introduce many to the occlusion mask
* Then we use minimum
* Add support for wmv
* Run platform tests before has_execution_provider (#911)
* Add support for wmv
* Introduce benchmark mode (#912)
* Honestly makes no difference to me
* Honestly makes no difference to me
* Fix wording
* Bring back YuNet (#922)
* Reintroduce YuNet without cv2 dependency
* Fix variable naming
* Avoid RGB to YUV colorshift using libx264rgb
* Avoid RGB to YUV colorshift using libx264rgb
* Make libx264 the default again
* Make libx264 the default again
* Fix types in ffmpeg builder
* Fix quality stuff in ffmpeg builder
* Fix quality stuff in ffmpeg builder
* Add libx264rgb to test
* Revamp Processors (#923)
* Introduce new concept of pure target frames
* Radical refactoring of process flow
* Introduce new concept of pure target frames
* Fix webcam
* Minor improvements
* Minor improvements
* Use deque for video processing
* Use deque for video processing
* Extend the video manager
* Polish deque
* Polish deque
* Deque is not even used
* Improve speed with multiple futures
* Fix temp frame mutation and
* Fix RAM usage
* Remove old types and manage method
* Remove execution_queue_count
* Use init_state for benchmarker to avoid issues
* add voice extractor option
* Change the order of voice extractor in code
* Use official download urls
* Use official download urls
* add gui
* fix preview
* Add remote updates for voice extractor
* fix crash on headless-run
* update test_job_helper.py
* Fix it for good
* Remove pointless method
* Fix types and unused imports
* Revamp reference (#925)
* Initial revamp of face references
* Initial revamp of face references
* Initial revamp of face references
* Terminate find_similar_faces
* Improve find mutant faces
* Improve find mutant faces
* Move sort where it belongs
* Forward reference vision frame
* Forward reference vision frame also in preview
* Fix reference selection
* Use static video frame
* Fix CI
* Remove reference type from frame processors
* Improve some naming
* Fix types and unused imports
* Fix find mutant faces
* Fix find mutant faces
* Fix imports
* Correct naming
* Correct naming
* simplify pad
* Improve webcam performance on highres
* Camera manager (#932)
* Introduce webcam manager
* Fix order
* Rename to camera manager, improve video manager
* Fix CI
* Remove optional
* Fix naming in webcam options
* Avoid using temp faces (#933)
* output video scale
* Fix imports
* output image scale
* upscale fix (not limiter)
* add unit test scale_resolution & remove unused methods
* fix and add test
* fix
* change pack_resolution
* fix tests
* Simplify output scale testing
* Fix benchmark UI
* Fix benchmark UI
* Update dependencies
* Introduce REAL multi gpu support using multi dimensional inference pool (#935)
* Introduce REAL multi gpu support using multi dimensional inference pool
* Remove the MULTI:GPU flag
* Restore "processing stop"
* Restore "processing stop"
* Remove old templates
* Go fill in with caching
* add expression restorer areas
* re-arrange
* rename method
* Fix stop for extract frames and merge video
* Replace arcface_converter models with latest crossface models
* Replace arcface_converter models with latest crossface models
* Move module logs to debug mode
* Refactor/streamer (#938)
* Introduce webcam manager
* Fix order
* Rename to camera manager, improve video manager
* Fix CI
* Fix naming in webcam options
* Move logic over to streamer
* Fix streamer, improve webcam experience
* Improve webcam experience
* Revert method
* Revert method
* Improve webcam again
* Use release on capture instead
* Only forward valid frames
* Fix resolution logging
* Add AVIF support
* Add AVIF support
* Limit avif to unix systems
* Drop avif
* Drop avif
* Drop avif
* Default to Documents in the UI if output path is not set
* Update wording.py (#939)
"succeed" is grammatically incorrect in the given context. To succeed is the infinitive form of the verb. Correct would be either "succeeded" or alternatively a form involving the noun "success".
* Fix more grammar issue
* Fix more grammar issue
* Sort out caching
* Move webcam choices back to UI
* Move preview options to own file (#940)
* Fix Migraphx execution provider
* Fix benchmark
* Reuse blend frame method
* Fix CI
* Fix CI
* Fix CI
* Hotfix missing check in face debugger, Enable logger for preview
* Fix reference selection (#942)
* Fix reference selection
* Fix reference selection
* Fix reference selection
* Fix reference selection
* Side by side preview (#941)
* Initial side by side preview
* More work on preview, remove UI only stuff from vision.py
* Improve more
* Use fit frame
* Add different fit methods for vision
* Improve preview part2
* Improve preview part3
* Improve preview part4
* Remove none as choice
* Remove useless methods
* Fix CI
* Fix naming
* use 1024 as preview resolution default
* Fix fit_cover_frame
* Uniform fit_xxx_frame methods
* Add back disabled logger
* Use ui choices alias
* Extract select face logic from processors (#943)
* Extract select face logic from processors to use it for face by face in preview
* Fix order
* Remove old code
* Merge methods
* Refactor face debugger (#944)
* Refactor huge method of face debugger
* Remove text metrics from face debugger
* Remove useless copy of temp frame
* Resort methods
* Fix spacing
* Remove old method
* Fix hard exit to work without signals
* Prevent upscaling for face-by-face
* Switch to version
* Improve exiting
---------
Co-authored-by: harisreedhar <h4harisreedhar.s.s@gmail.com>
Co-authored-by: Harisreedhar <46858047+harisreedhar@users.noreply.github.com>
Co-authored-by: Rafael Tappe Maestro <rafael@tappemaestro.com>
2025-09-08 10:43:58 +02:00
|
|
|
assert set_video_quality('libx264rgb', 0) == [ '-crf', '51' ]
|
|
|
|
|
assert set_video_quality('libx264rgb', 50) == [ '-crf', '26' ]
|
|
|
|
|
assert set_video_quality('libx264rgb', 100) == [ '-crf', '0' ]
|
2025-01-13 12:34:12 +01:00
|
|
|
assert set_video_quality('libx265', 0) == [ '-crf', '51' ]
|
|
|
|
|
assert set_video_quality('libx265', 50) == [ '-crf', '26' ]
|
|
|
|
|
assert set_video_quality('libx265', 100) == [ '-crf', '0' ]
|
|
|
|
|
assert set_video_quality('libvpx-vp9', 0) == [ '-crf', '63' ]
|
|
|
|
|
assert set_video_quality('libvpx-vp9', 50) == [ '-crf', '32' ]
|
|
|
|
|
assert set_video_quality('libvpx-vp9', 100) == [ '-crf', '0' ]
|
|
|
|
|
assert set_video_quality('h264_nvenc', 0) == [ '-cq' , '51' ]
|
|
|
|
|
assert set_video_quality('h264_nvenc', 50) == [ '-cq' , '26' ]
|
|
|
|
|
assert set_video_quality('h264_nvenc', 100) == [ '-cq' , '0' ]
|
|
|
|
|
assert set_video_quality('hevc_nvenc', 0) == [ '-cq' , '51' ]
|
|
|
|
|
assert set_video_quality('hevc_nvenc', 50) == [ '-cq' , '26' ]
|
|
|
|
|
assert set_video_quality('hevc_nvenc', 100) == [ '-cq' , '0' ]
|
|
|
|
|
assert set_video_quality('h264_amf', 0) == [ '-qp_i', '51', '-qp_p', '51', '-qp_b', '51' ]
|
|
|
|
|
assert set_video_quality('h264_amf', 50) == [ '-qp_i', '26', '-qp_p', '26', '-qp_b', '26' ]
|
|
|
|
|
assert set_video_quality('h264_amf', 100) == [ '-qp_i', '0', '-qp_p', '0', '-qp_b', '0' ]
|
|
|
|
|
assert set_video_quality('hevc_amf', 0) == [ '-qp_i', '51', '-qp_p', '51', '-qp_b', '51' ]
|
|
|
|
|
assert set_video_quality('hevc_amf', 50) == [ '-qp_i', '26', '-qp_p', '26', '-qp_b', '26' ]
|
|
|
|
|
assert set_video_quality('hevc_amf', 100) == [ '-qp_i', '0', '-qp_p', '0', '-qp_b', '0' ]
|
|
|
|
|
assert set_video_quality('h264_qsv', 0) == [ '-qp', '51' ]
|
|
|
|
|
assert set_video_quality('h264_qsv', 50) == [ '-qp', '26' ]
|
|
|
|
|
assert set_video_quality('h264_qsv', 100) == [ '-qp', '0' ]
|
|
|
|
|
assert set_video_quality('hevc_qsv', 0) == [ '-qp', '51' ]
|
|
|
|
|
assert set_video_quality('hevc_qsv', 50) == [ '-qp', '26' ]
|
|
|
|
|
assert set_video_quality('hevc_qsv', 100) == [ '-qp', '0' ]
|
|
|
|
|
assert set_video_quality('h264_videotoolbox', 0) == [ '-b:v', '1024k' ]
|
|
|
|
|
assert set_video_quality('h264_videotoolbox', 50) == [ '-b:v', '25768k' ]
|
|
|
|
|
assert set_video_quality('h264_videotoolbox', 100) == [ '-b:v', '50512k' ]
|
|
|
|
|
assert set_video_quality('hevc_videotoolbox', 0) == [ '-b:v', '1024k' ]
|
|
|
|
|
assert set_video_quality('hevc_videotoolbox', 50) == [ '-b:v', '25768k' ]
|
|
|
|
|
assert set_video_quality('hevc_videotoolbox', 100) == [ '-b:v', '50512k' ]
|