ASCII Engine is a deterministic, non-ML C++20 renderer that converts video and images into ANSI/ASCII output for terminal playback and file export.
- Real-time terminal rendering from video/images.
- Output modes: live terminal,
.txt, encoded video,.areplayreplay. - Color modes:
none,16,256,truecolor,blockart. - Content presets:
natural,anime,ui. - Deterministic replay capture with config hash.
Recent performance-oriented updates include:
- Hierarchical motion estimation (coarse-to-fine pyramid refinement)
- SIMD hot paths (AVX2/SSE2 where available, scalar fallback)
- Cache-aware tiling in edge/blur kernels
- Optimized in-tree FFT phase-correlation (plan/twiddle caching, workspace reuse, rectangular FFT)
- Stable-frame cache reuse for pipeline and cell stats
These changes target better throughput without changing the external CLI.
src/
core/ pipeline, frame source, edge, motion, temporal, config, replay
glyph/ font loading, glyph cache, character sets
mapping/ glyph selection and color mapping
render/ terminal/block/bitmap/video rendering and dithering
terminal/ terminal capability and ANSI output
audio/ audio decode/playback
cli/ CLI parsing
tests/ unit/integration style targets
vendor/ vendored headers
assets/ assets
- Visual Studio 2022 (Build Tools or Community) with C++ desktop workload
- CMake
- Ninja
- Git
Dependencies installed by script:
- SDL2
- FFmpeg
- zstd
- C++20 compiler
- CMake
- SDL2 + FFmpeg + zstd development packages
- Optional OpenCV 4.x (
ASCII_USE_OPENCV=ON)
setup_windows_deps.cmd
build_noopencv_check.cmdBinary:
build-noopencv\ascii-engine.exe
cmake -S . -B build -DCMAKE_BUILD_TYPE=Release -DASCII_USE_OPENCV=OFF
cmake --build build --target ascii-engine -jWith OpenCV:
cmake -S . -B build -DCMAKE_BUILD_TYPE=Release -DASCII_USE_OPENCV=ON
cmake --build build --target ascii-engine -jEnable AVX2 kernel paths (optional):
cmake -S . -B build -DCMAKE_BUILD_TYPE=Release -DASCII_USE_OPENCV=OFF -DASCII_ENABLE_AVX2=ON
cmake --build build --target ascii-engine -jShow help:
.\build-noopencv\ascii-engine.exe --helpRender video:
.\build-noopencv\ascii-engine.exe ".\media\clip.mp4"Render image:
.\build-noopencv\ascii-engine.exe ".\images\shot.png" --profile ui --cols 120 --rows 40Webcam:
.\build-noopencv\ascii-engine.exe webcam --fps 30Export video:
.\build-noopencv\ascii-engine.exe ".\media\clip.mp4" -o out.mp4Export animated GIF:
.\build-noopencv\ascii-engine.exe ".\media\clip.mp4" -o out.gifExport text:
.\build-noopencv\ascii-engine.exe ".\media\clip.mp4" -o out.txtWrite replay:
.\build-noopencv\ascii-engine.exe ".\media\clip.mp4" --replay run.areplay--profile natural|anime|ui--char-set basic|blocks|line-art--color none|16|256|truecolor|blockart--fps N --cols N --rows N--edge-thresh X --blur X --temporal X--motion-solve-div N --motion-reuse N --motion-still-thresh X--phase-interval N --phase-scene-trigger X--scale fit|fill|stretch--font <PATH>--no-audio--debug grayscale|edges|orientation--profile-live--strict-memory--fast(disables costly analysis features for speed-focused preview)
At program exit the engine prints a summary to stderr:
[PERF]total frames, wall time, effective FPS, processing FPS[PERF_STAGES]absolute stage times (pipeline, motion, select, render, encode, misc)[PERF_STAGES_PCT]stage percentages of processing time
For higher FPS with good quality balance on terminal playback:
.\build-noopencv\ascii-engine.exe ".\media\clip.mp4" --cols 96 --rows 32 --motion-solve-div 4 --motion-reuse 5 --phase-interval 8 --motion-still-thresh 0.006Space: pause/resumeqorEsc: quitc: cycle color mode+/-: edge threshold up/down
Default config path:
- Linux:
~/.config/ascii-engine/config.toml - macOS:
~/Library/Application Support/ascii-engine/config.toml - Windows:
%APPDATA%\ascii-engine\config.toml
Precedence:
- built-in defaults
- config file
- CLI overrides
Presets are documented in PRESETS.md.
setup_windows_deps.cmd
build_noopencv_check.cmd- Rebuild and run the newest executable.
- Verify path and extension (
png/jpg/jpeg/bmp/gif/tiff/webp).
- Reduce grid size (
--cols,--rows). - Use
--profile uifor screenshots/text. - Increase
--edge-threshand/or--blur. - Use
--color truecoloror--color none.