pito-codecs, measured
First frame 12× to 28× faster than ffmpeg, whose time includes starting its process, and decode on the card level or faster, with every place ffmpeg still wins kept on the page. One machine: AMD Ryzen 9 9950X, AMD Radeon RX 9060 XT on Mesa's radeonsi VA-API driver, Linux, ffmpeg 9.0.1, public-domain NASA footage. Every chart drawn by pito-compare from pito-codecs' own data.
Against ffmpeg
Times faster or slower per job, then each job on its own chart.
Open and see
Cut and export
On the card
Where ffmpeg still wins
Every row of the run
All 49 jobs of the 2026-10-15 run, as pito-codecs' README lists them, the slower ones kept.
| Job | pito-codecs | ffmpeg | pito-codecs is |
|---|---|---|---|
| H.264 1080p decode, CPU, 1 thread | 384 fps | 586 fps | 1.5× slower |
| H.264 1080p decode, CPU, all threads | 2018 fps | 2613 fps | 1.3× slower |
| HEVC 1080p decode, CPU, 1 thread | 468 fps | 450 fps | about the same |
| HEVC 1080p decode, CPU, all threads | 1653 fps | 1803 fps | 1.1× slower |
| H.264 1440p decode, CPU, 1 thread | 221 fps | 332 fps | 1.5× slower |
| H.264 1440p decode, CPU, all threads | 1230 fps | 1667 fps | 1.4× slower |
| HEVC 1440p decode, CPU, 1 thread | 269 fps | 252 fps | 1.1× faster |
| HEVC 1440p decode, CPU, all threads | 832 fps | 1294 fps | 1.6× slower |
| H.264 1080p decode, VA-API, frames stay on the GPU | 1154 fps | 1116 fps | about the same |
| H.264 1080p decode, VA-API, frames read back | 879 fps | 709 fps | 1.2× faster |
| HEVC 1080p decode, VA-API, frames stay on the GPU | 1121 fps | 1081 fps | about the same |
| HEVC 1080p decode, VA-API, frames read back | 806 fps | 684 fps | 1.2× faster |
| H.264 1440p decode, VA-API, frames stay on the GPU | 1082 fps | 1036 fps | about the same |
| H.264 1440p decode, VA-API, frames read back | 539 fps | 478 fps | 1.1× faster |
| HEVC 1440p decode, VA-API, frames stay on the GPU | 1054 fps | 1068 fps | about the same |
| HEVC 1440p decode, VA-API, frames read back | 477 fps | 435 fps | 1.1× faster |
| H.264 1080p encode, CPU, CRF 23, against libx264 medium * | 212 fps | 354 fps | 1.7× slower |
| H.264 1080p encode, CPU, CRF 23, against libx264 veryfast * | 215 fps | 664 fps | 3.1× slower |
| H.264 1080p encode, VA-API, QP 23 | 648 fps | 560 fps | 1.2× faster |
| HEVC 1080p encode, VA-API, QP 23 | 836 fps | 702 fps | 1.2× faster |
| H.264 1440p encode, CPU, CRF 23, against libx264 medium * | 137 fps | 167 fps | 1.2× slower |
| H.264 1440p encode, CPU, CRF 23, against libx264 veryfast * | 139 fps | 292 fps | 2.1× slower |
| H.264 1440p encode, VA-API, QP 23 | 411 fps | 369 fps | 1.1× faster |
| HEVC 1440p encode, VA-API, QP 23 | 548 fps | 480 fps | 1.1× faster |
| H.264 1440p GPU transcode, frames stay on the GPU | 314 fps | 303 fps | about the same |
| HEVC 1440p GPU transcode, frames stay on the GPU | 385 fps | 374 fps | about the same |
| H.264 1440p time to first frame, CPU (ffmpeg includes starting its process) | 4.2 ms | 85.2 ms | 20.2× faster |
| H.264 1440p time to first frame, GPU (ffmpeg includes starting its process) | 3.5 ms | 87.4 ms | 24.9× faster |
| HEVC 1440p time to first frame, CPU (ffmpeg includes starting its process) | 7.4 ms | 88.9 ms | 12.1× faster |
| HEVC 1440p time to first frame, GPU (ffmpeg includes starting its process) | 3.2 ms | 88.9 ms | 28.2× faster |
| H.264 1080p filmstrip, 12 stills at 240 px, CPU | 510 stills/s | 57 stills/s | 9.0× faster |
| H.264 1080p filmstrip, 12 stills at 240 px, GPU first | 507 stills/s | 57 stills/s | 8.9× faster |
| H.264 1440p filmstrip, 12 stills at 240 px, CPU | 332 stills/s | 39 stills/s | 8.5× faster |
| H.264 1440p filmstrip, 12 stills at 240 px, GPU first | 340 stills/s | 39 stills/s | 8.7× faster |
| HEVC 1080p filmstrip, 12 stills at 240 px, CPU | 486 stills/s | 51 stills/s | 9.5× faster |
| HEVC 1080p filmstrip, 12 stills at 240 px, GPU first | 470 stills/s | 50 stills/s | 9.4× faster |
| HEVC 1440p filmstrip, 12 stills at 240 px, CPU | 360 stills/s | 33 stills/s | 10.9× faster |
| HEVC 1440p filmstrip, 12 stills at 240 px, GPU first | 369 stills/s | 33 stills/s | 11.1× faster |
| Smart-cut export 1080p, 3 cuts, against ffmpeg re-encoding every frame (both frame-accurate) † | 16.5× real time | 9.9× real time | 1.7× faster |
| Smart-cut export 1080p, 3 cuts, against ffmpeg's stream copy (keyframe cuts only, not frame-accurate) † | 16.5× real time | 78.6× real time | 4.8× slower |
| Smart-cut export 1440p, 3 cuts, against ffmpeg re-encoding every frame (both frame-accurate) † | 11.1× real time | 5.7× real time | 2.0× faster |
| Smart-cut export 1440p, 3 cuts, against ffmpeg's stream copy (keyframe cuts only, not frame-accurate) † | 11.1× real time | 67.4× real time | 6.1× slower |
| Scale 1440p to 1080p, bicubic | 3429 fps | 1870 fps | 1.8× faster |
| Scale 1440p to 720p, bicubic | 3907 fps | 2121 fps | 1.8× faster |
| Scale 1080p to 720p, bicubic | 5489 fps | 2624 fps | 2.1× faster |
| Scale 1080p to 1440p, bicubic | 4124 fps | 2547 fps | 1.6× faster |
| AAC decode, 48 kHz stereo | 1010× real time | 1703× real time | 1.7× slower |
| AAC encode, 128 kbps stereo | 231× real time | 133× real time | 1.7× faster |
| EBU R128 loudness, 48 kHz stereo | 3276× real time | 544× real time | 6.0× faster |
* libx264 is hand-written assembly; pito-codecs' CPU H.264 encoder has no hand-written SIMD. † The export copies the middle of each piece and re-encodes only around each cut, so it is frame-accurate; a stream copy encodes nothing and cuts only on keyframes.
How it was measured
Against ffmpeg: one run of examples/bench.rs on 2026-10-15 at
commit 743f2d0, each job back to back with the system ffmpeg on the same file,
on an AMD Ryzen 9 9950X (16 cores) and an AMD Radeon RX 9060 XT on Mesa 26.2.2
radeonsi through VA-API, Linux, ffmpeg 9.0.1. The input is 20 s of NASA's
public-domain "A Message of Resilience from the International Space Station"
(720p60), scaled to 1080p and 1440p and encoded with libx264 at CRF 20 and
libx265 at CRF 23. The card was the bench's alone, and the load average was
1.4 at the start and 7.1 at the end, on 32 threads.
The two overlay charts were each measured once, back to back against the baseline named, on the same machine while it was busy with other work, at the load given beside each: their absolute numbers are floors and their ratios same-run comparisons. The seek chart ran 1.6.0 and 1.4.2 alternately, A B A B, five runs each after one warm-up, medians taken. The converter rows are medians of three, run in turn, at load 22 to 46.
Every command, input and load is in pito-codecs' README at v1.16.3.
Read it. Run it. It's MIT.
The code is MIT licensed, © Catalin Ilinca: read it, fork it, ship it in your own work. Its name and logos, and PITO MD's, are © Catalin Ilinca, all rights reserved, and are not covered by the MIT licence.
Credits
The charts are drawn by pito-compare from pito-codecs' data files and from numbers its README states.
Set in Archivo by Omnibus-Type and Atkinson Hyperlegible Mono by the Braille Institute, both under the SIL Open Font License.