At last, we come to the final codec in this round-up. This is the third software-codec option for AV1, produced by Xiph.Org foundation and marketed as being the “fastest and safest” AV1 encoder, known as librav1e. This codec is definitely not making any claims as to quality and has generally not had a great reputation in that regard. Thus, it would be an interesting test to see where the low-water-mark lies for AV1 encoding.
For this codec, encoding was performed on the Windows platform, using my Intel Core i7-3630QM based system for the majority of speeds, with the exception of some encodes at speed 0 and speed 1 which were performed on an i7-1370P in parallel due to time constraints. To its credit, for many of the speed settings, the encoding speed was not so slow as to rule out encoding on a 3rd-generation Intel CPU. The encoding flags were as follows:
-qp [qp] -speed [speed]
Encoding speeds from 0 to 10 were trialled, with QP values ranging from 0 to 248, as the codec does not support CRF or CQ rate control. Options for row/tile based multithreading were not configured, as it was understood that these options may have a slightly adverse effect on output quality, although as a result the encoding was unbearably slow for higher-bitrate and higher quality outputs as the codec was essentially “single-threaded” and utilising the CPU poorly. Understanding this, many encode processes were dispatched in parallel where possible, subject to RAM constraints, to ensure maximal CPU usage without affecting encoder quality.
Video Quality vs QP at Various Speeds
Let’s see how the QP value influences quality for this codec.
While a QP of 0 generates very large files, it would seem the result is not entirely lossless depending on the speed. However, in general, regardless of speed, PSNR is still fairly close. Below a QP of 96, PSNR seems to increase in a curve exponentially towards lower QP. Above a QP of 96, the PSNR appears to decrease linearly until around 240 when it somewhat plateaus. A PSNR of 45dB is achieved near QP=40, and a PSNR of 40dB at around QP=120.
With regards to SSIM, there seems to be a gap between 1 even at the lowest QPs. All speeds are somewhat similar, with a few of the faster speeds noticeably peeling away at higher QPs. A SSIM of 0.99 is achieved at QP=136, 0.995 at QP=104 and 0.999 at QP=24.
The VMAF scores show some similarity with SSIM scores, showing relatively little difference between encoding speeds especially at lower QPs. A VMAF of 99 is achieved at QP=72 and a VMAF of 99.5 at QP=48.
Best Video Quality vs QP
Looking at only encoding speed “0” gives the following results.
It would seem there is a good scaling of PSNR between best and worst frames for QP=32 and above. Below that, it would seem that much effort is expended to improve worst frames to increase quality.
In SSIM, the trend is very similar to most codecs, although it does seem that worst frame quality takes a bit of a dive around QP=200. Best frame SSIM does peel away from an SSIM of 1 as well, but not by much.
The VMAF result is perhaps more illustrative of codec behaviour, with QP=96 seemingly being a break-point for worst frame results. Below QP=96, worst frames tend to be rather stable above 90 and improving only slowly. Above QP=96, the worst frame quality dives linearly to QP=176, where a slightly slower trend takes over at a VMAF of 40.
Based on these results, I would say that the “sweet” QP range is around 32 to 96.
Bitrate vs QP at Various Speeds
Bitrate-wise, as a QP=0 encode was performed, the bitrate chart is a bit out-of-proportion, showing the nearly exponential rise in bitrate required for this. Nevertheless, there is subtle but small differences between different encode speeds, with faster speeds taking more bitrate (i.e. are less bitrate efficient).
A zoomed-in version of the above graph provides more detail, showing a bump at QP=96, as the codec seems to be doing something different above this, as evidenced by the VMAF results.
Video Quality vs Bitrate at Various Speeds + Cross-Codec
The fun part is to compare across codecs.
On the PSNR metric, it would seem that librav1e lags far behind its contemporary libaom-av1 and libsvtav1. It seems much closer to libx265 when it comes to best compression efficiency, edging it out slightly. At its fastest, it is closer to the worse H.265 hardware encoders and only slightly ahead of libx264, making it a little bit disappointing considering it is an AV1 encoder.
Looking at SSIM, its best seems similarly matched with libx265, with the fastest speeds matching av1_amf, which in itself, is not a particularly good AV1 hardware encoder. The other presets lie somewhere in-between, trading blows with various hardware AV1 and H.265 encoders.
Perhaps VMAF is our best judge, and it seems to place librav1e behind libx265 which is a little surprising given how close they were in the two graphs above. It does have a cross-over with av1_nvenc, which performs better at higher bitrates than librav1e. The fastest setting is a close match to hevc_amf in this metric as well.
Image Comparison
The proof is in the images below.
- Frame 844
- QP=32 starts to make a change to the gradient background, smoothing out much of the grain. Above QP=80, sharp edge artifacts seem to appear. Hair detail beginning to be smoothed at QP=48~64.
- Frame 1347
- Background and fine foreground hair detail smudged at QP=48~64. Foreground hair takes a slightly splotchy appearance at QP=40~48.
- Frame 3733
- Significant softening of moving hair detail at QP=32. Not a very sharp result all-round.
- Frame 4415
- Fine hair details noticeably softened at QP=32, altered by QP=40~48. Crown hair takes a detail-less appearance at QP=32~40.
From this, I would say that QP=24~40 might be a good constraint for decent encodes.
Conclusion
Based on these results, it would seem that librav1e certainly doesn’t deliver headline-grabbing AV1 compression efficiencies. This is not surprising as it seems to prioritise speed and safety (being coded in Rust), reaching more of an H.265 (HEVC) level of compression efficiency with an AV1 bitstream. Whether this is actually useful in real terms is debatable – perhaps sticking with an older codec that provides the same level of quality is a better idea purely due to lower computational demands for decoding and broader compatibility even if the encoding might take a little longer.
Nevertheless, I would say that a sensible range of QPs is 32 to 96 as the codec seems to use a lot more bitrate exponentially below 32, and the worst-frame results fall-off linearly past 96. But based on a visual analysis, good quality seems to be maintained in the QP=24 (25.4Mbit/s) ~ 40 (14.4Mbit/s) range.
While all the encoding and testing has now been done, I hope to wrap this up with a conclusion posting as well, hopefully featuring some nicer, less-cluttered graphs with more range. Stay tuned!
Encode Stats (for this Part)
Total Number of Encodings: 352
Total Size: 142,923,819,986 bytes
Encode Stats (for all Parts)
Total Number of Encodings: 7,630
Total Size: 2,431,756,061,769 bytes
This post is part of a series. See the main index at the bottom of Part 0.

































