Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
43 changes: 42 additions & 1 deletion .github/workflows/tests.yml
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,47 @@ jobs:
sudo apt-get install -y ffmpeg
python -m pip install -r requirements-collapse.txt -r requirements-inversion.txt ruff
- name: check changed processor code
run: ruff check --select F frame_pipeline.py timestamped_frames.py stateful_effects.py tests/inversion_regression.py
run: ruff check --select F frame_pipeline.py timestamped_frames.py stateful_effects.py tests/inversion_regression.py tests/platform_support.py tests/install_prompt.py tests/logging_regression.py
- name: run every suite with optional dependencies present
run: python tests/run_tests.py

windows:
runs-on: windows-latest
timeout-minutes: 20
steps:
- uses: actions/checkout@v4
- uses: actions/setup-python@v5
with:
python-version: '3.12'
- name: make sure ffmpeg and ffprobe are on PATH
shell: pwsh
run: |
if (-not (Get-Command ffmpeg -ErrorAction SilentlyContinue)) {
choco install ffmpeg -y --no-progress
}
ffmpeg -version | Select-Object -First 1
ffprobe -version | Select-Object -First 1
- name: platform + installer tables
shell: pwsh
run: |
python tests/platform_support.py
if ($LASTEXITCODE -ne 0) { exit 1 }
- name: diagnostics log
shell: pwsh
run: |
python tests/logging_regression.py
if ($LASTEXITCODE -ne 0) { exit 1 }
- name: cli regression
shell: pwsh
run: |
python tests/cli_regression.py
if ($LASTEXITCODE -ne 0) { exit 1 }
- name: requirement check on windows
shell: pwsh
run: |
python -c "import diagnostics, os; p = diagnostics.log_dir(); print(p); assert 'effex' in str(p).lower() and os.environ['LOCALAPPDATA'].lower() in str(p).lower(), p"
if ($LASTEXITCODE -ne 0) { exit 1 }
python effex.py --check --json
if ($LASTEXITCODE -ne 0) { exit 1 }
python effex.py --list
if ($LASTEXITCODE -ne 0) { exit 1 }
381 changes: 337 additions & 44 deletions README.md

Large diffs are not rendered by default.

351 changes: 331 additions & 20 deletions ROADMAP.md

Large diffs are not rendered by default.

169 changes: 169 additions & 0 deletions benchmarks/collapse-pixelated.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,169 @@
{
"recorded_utc": "2026-10-25T20:34:02.832149+00:00",
"platform": "Linux-7.1.13+parrot7-amd64-x86_64-with-glibc2.41",
"logical_cpus": 22,
"pixelate": true,
"scope": "synthetic moving RGB; process() only; fresh process per mode/size; not end-to-end render FPS",
"results": [
{
"mode": "elastic",
"pixelate": true,
"width": 640,
"height": 360,
"frames": 60,
"config": {
"intensity": 100,
"horizontal": 100,
"vertical": 100,
"preserve": 75,
"mode": "elastic",
"seam_strength": 100,
"motion": 50,
"smoothness": 70,
"speed": 0.35,
"coherence": 80,
"seed": 17,
"pixelate": true,
"block_size": 4,
"mosh": 60
},
"mean_ms": 4.53345871677205,
"p50_ms": 4.532778499196866,
"p95_ms": 4.629504198419454,
"max_ms": 5.058190999989165,
"processor_fps": 220.5821344088533,
"seam_updates": 0,
"seam_update_mean_ms": null,
"peak_rss_mib": 64.90234375,
"persistent_state_mib": 0.3794708251953125,
"work_shape": [
108,
192
],
"python": "3.13.5",
"numpy": "2.2.4",
"opencv": "4.12.0",
"opencv_threads": 1
},
{
"mode": "elastic",
"pixelate": true,
"width": 1280,
"height": 720,
"frames": 60,
"config": {
"intensity": 100,
"horizontal": 100,
"vertical": 100,
"preserve": 75,
"mode": "elastic",
"seam_strength": 100,
"motion": 50,
"smoothness": 70,
"speed": 0.35,
"coherence": 80,
"seed": 17,
"pixelate": true,
"block_size": 4,
"mosh": 60
},
"mean_ms": 11.901544649845164,
"p50_ms": 11.89956549933413,
"p95_ms": 12.149075249908492,
"max_ms": 12.813671000913018,
"processor_fps": 84.02270708726952,
"seam_updates": 0,
"seam_update_mean_ms": null,
"peak_rss_mib": 110.078125,
"persistent_state_mib": 0.3794708251953125,
"work_shape": [
108,
192
],
"python": "3.13.5",
"numpy": "2.2.4",
"opencv": "4.12.0",
"opencv_threads": 1
},
{
"mode": "seam",
"pixelate": true,
"width": 640,
"height": 360,
"frames": 60,
"config": {
"intensity": 100,
"horizontal": 100,
"vertical": 100,
"preserve": 75,
"mode": "seam",
"seam_strength": 100,
"motion": 50,
"smoothness": 70,
"speed": 0.35,
"coherence": 80,
"seed": 17,
"pixelate": true,
"block_size": 4,
"mosh": 60
},
"mean_ms": 22.30460616653242,
"p50_ms": 3.7979685002937913,
"p95_ms": 122.1038680003403,
"max_ms": 126.72199799999362,
"processor_fps": 44.83378870416813,
"seam_updates": 10,
"seam_update_mean_ms": 115.3640908007219,
"peak_rss_mib": 63.4140625,
"persistent_state_mib": 0.5376739501953125,
"work_shape": [
108,
192
],
"python": "3.13.5",
"numpy": "2.2.4",
"opencv": "4.12.0",
"opencv_threads": 1
},
{
"mode": "seam",
"pixelate": true,
"width": 1280,
"height": 720,
"frames": 60,
"config": {
"intensity": 100,
"horizontal": 100,
"vertical": 100,
"preserve": 75,
"mode": "seam",
"seam_strength": 100,
"motion": 50,
"smoothness": 70,
"speed": 0.35,
"coherence": 80,
"seed": 17,
"pixelate": true,
"block_size": 4,
"mosh": 60
},
"mean_ms": 28.215429733124136,
"p50_ms": 10.980474999087164,
"p95_ms": 114.29859154904987,
"max_ms": 126.1383580022084,
"processor_fps": 35.44160090625973,
"seam_updates": 10,
"seam_update_mean_ms": 112.65644670020265,
"peak_rss_mib": 110.16796875,
"persistent_state_mib": 0.5376739501953125,
"work_shape": [
108,
192
],
"python": "3.13.5",
"numpy": "2.2.4",
"opencv": "4.12.0",
"opencv_threads": 1
}
]
}
83 changes: 46 additions & 37 deletions benchmarks/collapse.json
Original file line number Diff line number Diff line change
@@ -1,14 +1,16 @@
{
"recorded_utc": "2026-10-25T14:54:16.689872+00:00",
"recorded_utc": "2026-10-25T20:33:57.695141+00:00",
"platform": "Linux-7.1.13+parrot7-amd64-x86_64-with-glibc2.41",
"logical_cpus": 22,
"pixelate": false,
"scope": "synthetic moving RGB; process() only; fresh process per mode/size; not end-to-end render FPS",
"results": [
{
"mode": "elastic",
"pixelate": false,
"width": 640,
"height": 360,
"frames": 120,
"frames": 60,
"config": {
"intensity": 100,
"horizontal": 100,
Expand All @@ -21,18 +23,19 @@
"speed": 0.35,
"coherence": 80,
"seed": 17,
"pixelate": false,
"block_size": 4,
"mosh": 60
},
"mean_ms": 5.438171333351723,
"p50_ms": 5.658735499764589,
"p95_ms": 6.254641550503948,
"max_ms": 9.980480000194802,
"processor_fps": 183.8853428296948,
"mean_ms": 4.408682266512187,
"p50_ms": 4.397327000333462,
"p95_ms": 4.547749200355611,
"max_ms": 4.9772220008890145,
"processor_fps": 226.82514627916783,
"seam_updates": 0,
"seam_update_mean_ms": null,
"peak_rss_mib": 64.3984375,
"persistent_state_mib": 0.3794708251953125,
"peak_rss_mib": 64.4921875,
"persistent_state_mib": 0.375762939453125,
"work_shape": [
108,
192
Expand All @@ -44,9 +47,10 @@
},
{
"mode": "elastic",
"pixelate": false,
"width": 1280,
"height": 720,
"frames": 120,
"frames": 60,
"config": {
"intensity": 100,
"horizontal": 100,
Expand All @@ -59,18 +63,19 @@
"speed": 0.35,
"coherence": 80,
"seed": 17,
"pixelate": false,
"block_size": 4,
"mosh": 60
},
"mean_ms": 13.62421634172127,
"p50_ms": 12.938760000452021,
"p95_ms": 15.432022549703106,
"max_ms": 17.359763000058592,
"processor_fps": 73.39871702842183,
"mean_ms": 10.508820399991237,
"p50_ms": 10.509210498639732,
"p95_ms": 10.741252650950628,
"max_ms": 11.097615999460686,
"processor_fps": 95.15815875974376,
"seam_updates": 0,
"seam_update_mean_ms": null,
"peak_rss_mib": 110.52734375,
"persistent_state_mib": 0.3794708251953125,
"peak_rss_mib": 109.83203125,
"persistent_state_mib": 0.375762939453125,
"work_shape": [
108,
192
Expand All @@ -82,9 +87,10 @@
},
{
"mode": "seam",
"pixelate": false,
"width": 640,
"height": 360,
"frames": 120,
"frames": 60,
"config": {
"intensity": 100,
"horizontal": 100,
Expand All @@ -97,18 +103,19 @@
"speed": 0.35,
"coherence": 80,
"seed": 17,
"pixelate": false,
"block_size": 4,
"mosh": 60
},
"mean_ms": 22.617298016621135,
"p50_ms": 3.8585624997722334,
"p95_ms": 117.81829465030569,
"max_ms": 120.20515199947113,
"processor_fps": 44.213946301857725,
"seam_updates": 20,
"seam_update_mean_ms": 116.50683889988613,
"peak_rss_mib": 63.53515625,
"persistent_state_mib": 0.5376739501953125,
"mean_ms": 16.714707082913566,
"p50_ms": 2.2866194995003752,
"p95_ms": 89.15058604779915,
"max_ms": 89.45012199910707,
"processor_fps": 59.82755157116929,
"seam_updates": 10,
"seam_update_mean_ms": 88.90546039947367,
"peak_rss_mib": 63.57421875,
"persistent_state_mib": 0.533966064453125,
"work_shape": [
108,
192
Expand All @@ -120,9 +127,10 @@
},
{
"mode": "seam",
"pixelate": false,
"width": 1280,
"height": 720,
"frames": 120,
"frames": 60,
"config": {
"intensity": 100,
"horizontal": 100,
Expand All @@ -135,18 +143,19 @@
"speed": 0.35,
"coherence": 80,
"seed": 17,
"pixelate": false,
"block_size": 4,
"mosh": 60
},
"mean_ms": 32.12750047495471,
"p50_ms": 13.086824499623617,
"p95_ms": 127.86849640019682,
"max_ms": 131.97810400015442,
"processor_fps": 31.1259819536711,
"seam_updates": 20,
"seam_update_mean_ms": 127.5789061499836,
"peak_rss_mib": 108.13671875,
"persistent_state_mib": 0.5376739501953125,
"mean_ms": 26.341212083085946,
"p50_ms": 9.054444499270176,
"p95_ms": 114.34280774901708,
"max_ms": 116.21195299812825,
"processor_fps": 37.9633251820676,
"seam_updates": 10,
"seam_update_mean_ms": 112.72520959973917,
"peak_rss_mib": 110.17578125,
"persistent_state_mib": 0.533966064453125,
"work_shape": [
108,
192
Expand Down
Loading
Loading