Somebody hands you an encoding ladder and tells you the top rung hits VMAF 95. It sounds like a measurement — a reading taken off an instrument, the way a thermometer reads 21 °C or a scale reads 68 kg. It isn’t. VMAF 95 is the output of a machine-learning model trained to predict what a panel of human viewers would have said if you had actually run the experiment. The number is a forecast of an opinion, not a physical property of the video. Understanding what VMAF 95 means requires knowing which model version produced it, what screen and viewing distance that model assumes, whether enhancement gain was subtracted, and how thousands of per-frame scores got collapsed into a single headline figure.
Get any of those wrong and the number still looks like 95. That is exactly the problem.

This article takes VMAF apart: what it actually computes, why a score without a model version is meaningless, the viewing-distance assumption doing silent work inside every figure, the cross-resolution comparison that Netflix’s own documentation calls apples-to-oranges, the gaming vector Netflix published about itself, and why the mean hides the moments viewers actually remember. It ends where the habit generalizes far past video — because a trained model’s output always inherits its training set’s assumptions, and Goodhart’s law starts running the moment you optimize against it.
VMAF Is a Prediction, Not a Measurement
VMAF stands for Video Multimethod Assessment Fusion, and every word is load-bearing. It is not one formula. It is several “elementary metrics” — each computing something different about how a compressed frame differs from its uncompressed reference — combined by a regressor that was fitted to real human ratings.
Netflix described the original construction publicly in “Toward A Practical Perceptual Video Quality Metric” (June 6, 2016). The v0 model fused three signals: Visual Information Fidelity (VIF), which estimates how much of the source’s information survived compression; the Detail Loss Metric (DLM), which targets loss of fine detail; and a simple motion feature, the frame-to-frame luminance difference that tells the model how much movement is on screen (fast motion masks artifacts, so it changes what a viewer will tolerate). A Support Vector Machine regressor learned the weights that combine those features into one score.
Learned from what? The NFLX Video Dataset: 34 source clips of six seconds each, drawn from Netflix’s catalogue and public sources, encoded into roughly 300 distorted versions spanning 375–20,000 kbps and resolutions from 384×288 up to 1920×1080. Human observers rated the impairments on a five-point Double Stimulus Impairment Scale, and those ratings were converted into Differential Mean Opinion Scores (DMOS) on a 0–100 range. That DMOS scale is the scale VMAF reports on. When a tool prints 95, it is saying: given what I learned from 34 six-second clips rated by a panel under one specific set of viewing conditions, I estimate a comparable panel would have scored this around 95.
That is a genuinely useful thing to know. It is not a measurement of quality. It is a model’s estimate of a survey result.

The distinction matters because measurements and predictions fail differently. A miscalibrated thermometer is wrong by a constant you can correct. A trained model is wrong in the shape of its training data — accurate on content resembling what it was fitted to, and progressively less trustworthy the further your content drifts from those 34 clips. The same logic governs every trained system, from a video metric to a language model; if you have read how large language models work, the failure mode is familiar: confident output, invisible dependence on the training distribution.
The Model Version Is Part of the Number
Here is the single most common way VMAF figures get quoted wrong: without a model version.
VMAF is not one model. It is a family of models, and Netflix has shipped two materially different generations. Quoting “VMAF 95” without naming the model file is like quoting a temperature without saying Celsius or Fahrenheit — except worse, because there is no obvious tell that a unit is missing.
The v0 generation — the one nearly all VMAF writing on the internet still describes — ships as vmaf_v0.6.1.json for 1080p television viewed at three times screen height, a phone variant selected with a --phone-model flag, and vmaf_4k_v0.6.1.json for 4K television viewed at 1.5× screen height, plus v0.6.2/v0.6.3 retrains on the same dataset and a set of _neg variants (Netflix/vmaf, models_v0.md).
In June 2026 Netflix released VMAF v1, and it is not a point upgrade. Per Netflix’s own announcement, “VMAF v1: Good Is Not Good Enough” (June 19, 2026), v1:
- adds AIM (additive impairments), improving sensitivity to blockiness — distracting artifacts that DLM alone under-weighted;
- adds CAMBI, the Contrast Aware Multiscale Banding Index, as an elementary feature, so that banding (the visible stair-stepping in gradients and dark scenes) finally registers — v0 largely missed it;
- adds a chroma feature, a modified SpEED-QA applied to the colour channels, catching chroma quantization and subsampling artifacts v0 could not see at all;
- removes VIF, on the grounds that it was computationally expensive and “did not meaningfully improve accuracy after updating the other features”;
- replaces the old polynomial viewing-distance mapping with modulation of the spatial contrast sensitivity function (CSF) used in DLM, based on normalized viewing distance — a principled way to generalize across screens rather than a curve fitted per device;
- ships four models instead of three; and
- enables NEG by default, with no separate model required.
The v1 models live in the repository as vmaf_v1.0.16_3d0h.json (1080p at 3H), vmaf_v1.0.16_5d0h.json (phone at 5H), vmaf_v1.0.16_1d5h_2160.json (4K at 1.5H) and vmaf_v1.0.16_3d0h_2160.json (4K at 3H), with high-frame-rate variants under model/vmaf_v1.0.16_hfr/ (Netflix/vmaf, models_v1.md).
Read that list again with the number “95” in mind. A v0 score and a v1 score for the same file are produced by models with different features, a different distance model, and a different default on enhancement gain. They are not interchangeable, and there is no conversion factor. Worse, the v1 announcement notes that the 4K-at-3H model is defined on a [0, 110] range, not [0, 100] — so on that model, the assumption that 100 is the ceiling is simply wrong.
| Generation | Model file | Viewing condition | Reported range | What it is for |
|---|---|---|---|---|
| v0 | vmaf_v0.6.1.json | 1080p TV at 3× screen height | 0–100 | The historic default. Most VMAF numbers published online are this model, stated or not. |
| v0 | vmaf_v0.6.1.json + --phone-model | Phone screen | 0–100 | Mobile delivery. Applies a polynomial viewing-distance correction. |
| v0 | vmaf_4k_v0.6.1.json | 4K TV at 1.5× screen height | 0–100 | Close-viewing 4K, where artifacts are far more visible. |
| v0 | vmaf_v0.6.2.json, vmaf_v0.6.3.json | As v0.6.1 | 0–100 | Retrains on the same dataset — not new viewing conditions. |
| v0 | ..._neg.json variants | As the base model | 0–100 | Opt-in No Enhancement Gain, for encoder-vs-encoder comparison. |
| v1 (June 2026) | vmaf_v1.0.16_3d0h.json | 1080p at 3H | 0–100 | The new standard model. NEG on by default. |
| v1 | vmaf_v1.0.16_5d0h.json | Phone at 5H | 0–100 | Mobile, via CSF modulation rather than a fitted polynomial. |
| v1 | vmaf_v1.0.16_1d5h_2160.json | 2160p at 1.5H | 0–100 | Discerning 4K viewing. |
| v1 | vmaf_v1.0.16_3d0h_2160.json | 2160p at 3H | 0–110 | Consumer 4K viewing. Note the range is not 0–100. |
| v1 | model/vmaf_v1.0.16_hfr/… | As above | — | High-frame-rate variants of each. |

The practical consequence: a benchmark, a vendor slide, or a forum post from before mid-2026 that reports “VMAF 95” is almost certainly a v0 number, probably vmaf_v0.6.1, probably without NEG. A fresh run today on default settings may well be a v1 number with NEG on. Comparing the two as though they were the same quantity is a category error, and no amount of decimal places in the output makes it less of one.
The Viewing-Distance Assumption Is Doing Real Work
Every VMAF model encodes an assumption about how far the viewer’s eyes are from the screen, expressed in multiples of screen height and written “H”. The v0 default assumes 3H — a 1080p television viewed from three screen-heights away, roughly the living-room case. The 4K model assumes 1.5H, someone sitting close to a large panel. The v1 phone model assumes 5H, reflecting that a phone held at arm’s length subtends a small visual angle even though the screen is close in absolute terms.
This is not a cosmetic parameter. Viewing distance determines the spatial frequencies a viewer can resolve at all — sit far enough back and fine detail simply falls below the eye’s contrast sensitivity, which is why v1 models it through the contrast sensitivity function directly. The same encode can be visibly flawed at 1.5H and indistinguishable from the source at 3H. Both scores are correct; they answer different questions.

So vmaf_v0.6.1 and vmaf_4k_v0.6.1 are not “the normal one and the fancy one.” They are two different questions: would a living-room TV viewer notice? versus would someone sitting close to a 4K panel notice? Choosing the model is choosing the question. If your delivery target is mobile and you score with the 1080p-at-3H model, you are optimizing bits against a viewer who does not exist in your product.
The Cross-Resolution Trap
The most common practical misuse has its own entry in Netflix’s FAQ, and it is worth quoting the shape of it precisely. You should not compare the absolute VMAF score of a 1080p video against the score of a 480p video when each is scored at its own native resolution (Netflix/vmaf, faq.md).
The reason is the viewing-distance model again. VMAF’s training assumes viewing at 3× screen height. Score a 480p clip at native 480p and you have implicitly told the model that the screen is 480 pixels tall — which, for a viewer sitting at a fixed physical distance from a real display, corresponds to something closer to 6.75× that height. The model duly reports a flattering number, because at that effective distance almost nothing is resolvable. The fix is mechanical: upsample both the reference and the distorted video to a common resolution — 1080p is the usual choice — and score there. That is how a bitrate ladder’s rungs become comparable to each other at all.

Two more scope limits from the same FAQ deserve the same billing. First, VMAF was built for HTTP adaptive streaming artifacts — compression and scaling. Feed it packet loss, transmission corruption, or a stream mangled in some other way and it may predict inaccurately, because those distortions were not in the training set. If your problem is delivery rather than encoding, VMAF is answering a question you did not ask; the relevant instrumentation is on the network side, where ping, jitter, and packet loss live.
Second — and this is the fact that clarifies everything else — comparing a video to a bit-identical copy of itself does not reliably yield 100. The FAQ notes scores typically land around 98–99. If a perfect encode does not score perfectly, then the scale is not a measurement of fidelity. It is the output of a regressor with residual error, exactly like any other fitted model.
Netflix Published the Gaming Manual Themselves
In December 2020 Netflix published “Toward a Better Quality Metric for the Video Community” (December 7, 2020), which is one of the more honest documents any organisation has published about its own metric. The finding: image enhancement applied before compression raises VMAF scores. Sharpening, contrast adjustment, and similar operations move the fused features in the direction the model reads as “higher quality,” and the score obediently goes up.
The concrete example named in the post is tune=vmaf in libaom, an AV1 encoder implementation, which performs frame-based image sharpening prior to compression. Some of the apparent coding advantage that mode showed was not better compression at all — it was pre-processing that the metric rewarded.
Netflix’s response was VMAF NEG — No Enhancement Gain — a mode that estimates the score increase attributable to enhancement and subtracts it, isolating what the post calls “pure compression gain.” NEG is deliberately conservative. It is the right tool for encoder-versus-encoder comparison, where you want to know which codec compresses better and not which pipeline sharpened harder. It is not straightforwardly the better predictor of what a viewer will enjoy, because a viewer watching a tastefully sharpened image may genuinely prefer it. Those are two different questions again, and NEG picks one.

The most telling detail is what changed in 2026: VMAF v1 turns NEG on by default, with no separate model needed. That is a tacit admission that the uncorrected score was being moved by enhancement often enough to make the conservative answer the sane default. It also means the same file, same encoder, same everything can score differently under v0 defaults and v1 defaults purely because of NEG — one more reason the model version is part of the number.
The generalizable lesson is not “VMAF is broken.” It is the opposite. Netflix found a lever that moved the metric without moving the outcome, published it, and then instrumented the lever rather than abandoning the metric. Any team that optimizes a KPI should be running the same search: what could move this number without moving the thing the number stands for? That question is the whole content of Goodhart’s law, and it is why DORA metrics for AI coding agents needed a section on gaming, and why the ImageNet benchmark eventually needed people to ask what “top-5 accuracy” was quietly rewarding.
The Mean Hides the Moments That Matter
VMAF is computed per frame. The score you get quoted is an aggregate — most commonly the arithmetic mean across every frame in the clip. That pooling step throws away the information a viewer actually reacts to.
Consider a two-hour film encoded at some CRF. Suppose 99.5% of frames score in the mid-90s, and one 20-second stretch — a dark, high-motion scene, the exact content that breaks encoders — collapses into the 60s with visible blocking and banding. The mean barely notices: a few thousand bad frames against roughly 170,000 total drags the average down by well under a point. The headline still reads VMAF 95. The viewer’s experience is “the film looked fine and then that one scene fell apart,” and that scene is what they will describe to a friend.

The fix is the same one that separates competent latency measurement from useless latency measurement: report the distribution, not the centre. Pull the per-frame log, then look at the minimum, the 1st and 5th percentiles, and the shape of the curve over time. A pooled harmonic mean — which weights low scores more heavily than the arithmetic mean — is a better single number than the arithmetic mean if you must have exactly one. Anyone who has done capacity work on network performance already has the instinct: the p99 is the number the user feels, and the mean is the number that makes the dashboard look calm.
There is a subtler point buried in the pooling. VMAF was trained on six-second clips. Applying it to a two-hour title and averaging is an extrapolation beyond the training regime — reasonable, widely done, and still an extrapolation. It is part of why Netflix’s own encoding work moved toward per-title and then per-shot optimization: complexity varies enormously within a title, and one global number describing a whole film is exactly the kind of summary that hides the variance you care about.
Practically, FFmpeg gives you the raw material. The libvmaf, psnr, and ssim filters each take the reference as a second input and emit both per-frame and aggregate results, and libvmaf accepts a model option so you can pin the model file explicitly rather than inheriting whatever your build defaults to. Option names have shifted between libvmaf generations, so check ffmpeg -h filter=libvmaf against your own build rather than copying a command from a five-year-old blog post — the current release at the time of writing is FFmpeg 8.1, released 2026-08-12, from the 8.1 “Hoare” branch cut on 2026-06-26 (ffmpeg.org/download; FFmpeg filters documentation).
PSNR, SSIM, and VMAF: Three Models, No Truth
VMAF’s blind spots are easier to hold in mind alongside the two metrics it largely displaced — because all three are models, they are just calibrated against different things.
PSNR is mean squared error wearing a decibel scale. It sums squared per-pixel differences between reference and distorted frames and takes a logarithm. It contains no model of human vision whatsoever, which is why two distortions with identical MSE — a uniform blur and an equivalent dose of additive noise — score identically and look nothing alike. The canonical takedown is titled, with admirable directness, “Mean Squared Error: Love It or Leave It?” (Z. Wang & A. C. Bovik, IEEE Signal Processing Magazine 26(1), 2009). PSNR’s virtue is that it is cheap, deterministic, and utterly transparent: it is arithmetic, and arithmetic cannot be gamed by sharpening because it does not believe in sharpening.
SSIM was designed to fix precisely that blindness, comparing local luminance, contrast, and structure rather than raw error magnitude (Z. Wang, A. C. Bovik, H. R. Sheikh, E. P. Simoncelli, “Image Quality Assessment: From Error Visibility to Structural Similarity”, IEEE Transactions on Image Processing 13(4), 2004). MS-SSIM extends the comparison across multiple spatial scales (Wang, Simoncelli & Bovik, 37th Asilomar Conference, 2003). SSIM is a substantial improvement, and it is still a hand-designed hypothesis about what the visual system cares about — not a model fitted to how people actually rated things.
VMAF is the outlier: the only one of the three whose parameters were learned from human ratings. That is simultaneously why it correlates best with viewer opinion and why it is the only one of the three that can be gamed by moving its input features without improving anything.
| PSNR | SSIM / MS-SSIM | VMAF | |
|---|---|---|---|
| What it computes | Mean squared error between reference and distorted, on a decibel scale | Local luminance, contrast, and structural similarity (MS-SSIM across multiple scales) | A fusion of elementary features (v0: VIF, DLM, motion; v1: DLM, AIM, CAMBI, chroma, motion) combined by a trained regressor |
| Calibrated against | Nothing — it is pure arithmetic | A structural-similarity hypothesis about human vision | Actual DMOS ratings from a subjective panel (the NFLX dataset, 34 six-second clips) |
| Range | Decibels, unbounded (infinite for an identical copy) | 0–1 | Roughly 0–100 on the DMOS scale; the v1 4K-at-3H model reports 0–110 |
| Strengths | Cheap, deterministic, universally implemented, immune to perceptual gaming because it models no perception | Catches blur and structural degradation PSNR is blind to; no training data required | Best correlation with viewer opinion of the three; v1 explicitly models banding, blockiness, and chroma artifacts |
| Failure modes | Not perceptual — equal MSE does not mean equal appearance; no masking model | Still hand-designed; no viewing-condition or content model | Inherits its training set’s assumptions; gameable by pre-processing unless NEG is on; version- and viewing-model-specific; badly misused across resolutions |
| What the number means | “How far these pixels are from the reference” | “How similar the structure is” | “What this model predicts a panel would have said” |
None of these is ground truth. Formal subjective testing is the reference — an actual panel, actual viewing conditions, actual ratings — and every automated metric is a faster, imperfect stand-in for running that panel again. The honest framing is that PSNR, SSIM, and VMAF sit on a ladder of increasing perceptual ambition and increasing dependence on assumptions, and you climb the ladder knowing what you are trading.

How to Quote a VMAF Number Honestly
Everything above collapses into a short checklist. A VMAF figure is only meaningful if it carries its context, and any figure missing these items should be treated as decoration rather than evidence.

| What to state | Why it changes the number |
|---|---|
Model file and generation (e.g. vmaf_v0.6.1 vs vmaf_v1.0.16_3d0h) | Different features, different distance model, different defaults. v0 and v1 scores are not interchangeable. |
| Viewing-condition model (3H, 1.5H, 5H; 1080p or 2160p) | Determines which spatial detail the model believes a viewer can resolve at all. |
| NEG on or off | Off by default in v0, on by default in v1. Shifts the answer between “which encoder compresses better” and “what will a viewer prefer.” |
| The resolution both sides were scored at | Native-resolution cross-resolution comparison is invalid; both must be normalized to a common resolution. |
| Pooling method plus percentiles or minimum | An arithmetic mean over a long title conceals the worst scenes, which is what viewers remember. |
| Source master, clip set, and clip lengths | The model was fitted on six-second clips of specific content; generalization is an assumption, not a guarantee. |
| Encoder, encoder version, preset, and rate-control mode | Presets are a speed-versus-compression-efficiency dial; a fast preset of one encoder against a slow preset of another measures the operator, not the codec. |
One more discipline belongs here, because it is the difference between a benchmark and an anecdote. Never compare two encoders at a single operating point. Both are tunable systems trading bitrate against quality, so a single-point comparison is only valid at that point. The standard tool is the Bjøntegaard delta (BD-rate): encode the same source at several bitrates with each encoder, plot the rate–quality curves, fit them, and integrate the area between them over their common range to get an average bitrate saving at equal quality (G. Bjøntegaard, “Calculation of Average PSNR Differences Between RD-Curves,” ITU-T VCEG-M33, April 2001). One curve-wide number instead of a claim that quietly assumes the winner at one bitrate wins everywhere. That habit transfers directly to anything with a knob — cache size against hit rate, batch size against throughput, model size against accuracy — and it is a good companion to thinking clearly about bandwidth and delivery constraints rather than headline figures.
The Transferable Habit: Ask What Produced the Number
The reason this article is worth reading even if you never run an encoder is that VMAF is an unusually clean, unusually well-documented example of something that is everywhere: a number that looks like a measurement and is actually a model output.

A trained model’s output inherits everything about its training set — the content it saw, the viewers it recruited, the screens they used, the distances they sat at, the artifacts that existed when the data was collected. VMAF v0 could not see banding because banding was not adequately represented in what it learned from; v1 can, because Netflix added a feature for it. That is not a bug being fixed so much as a boundary being redrawn, and the new boundary has its own outside.
Then there is the second half, which arrives the moment anyone starts optimizing. Goodhart’s law — when a measure becomes a target, it ceases to be a good measure — is not a warning about dishonest people. It is a structural fact about proxies. If a metric is a function of features, and something can move those features without moving the underlying thing, then sufficient optimization pressure will find that lever, whether or not anyone is looking for it. Pre-sharpening found VMAF’s. Netflix’s response is the model worth copying: name the lever publicly, build a correction, make the conservative version the default.
So the transferable habit is a single question, asked before repeating any figure: what produced this number? Was it counted, or measured, or predicted by a model? If predicted — trained on what, assuming what, and what could move it that shouldn’t? A person who asks that reflexively about VMAF will also ask it about a benchmark score, a risk score, an engagement metric, and an AI evaluation result. The video-quality case is just where the documentation happens to be unusually good.
VMAF 95 is a fine thing to know. It is a well-constructed prediction from a carefully-built model, and it beats the alternatives. It just isn’t a measurement of quality — and the difference between those two sentences is most of what separates people who read numbers from people who repeat them.
❓ Frequently Asked Questions
Is VMAF 95 “good”? It usually indicates a high-quality encode, but the honest answer is that it depends on the model. VMAF 95 from vmaf_v0.6.1 says a panel viewing a 1080p TV from three screen-heights away would likely have rated it in the mid-90s on a 0–100 impairment scale. The same file scored with the 4K-at-1.5H model — a viewer sitting close to a large panel — can land noticeably lower. And because a bit-identical copy of a file typically scores around 98–99 rather than 100, the top of the scale is not where intuition puts it.
Can I compare a VMAF score from 2023 to one I ran today? Not without checking the model. Scores published before mid-2026 are almost certainly VMAF v0, most likely vmaf_v0.6.1 with NEG off. A default run on a current build may be a v1 model with NEG on. Different features, different viewing-distance modelling, different defaults — there is no conversion factor between them. Re-run the old file with the model you are using now, or state both model versions explicitly.
Why can’t I compare VMAF scores across resolutions? Because VMAF’s training assumes viewing at three times screen height, and scoring a low-resolution clip at its native resolution implicitly tells the model the screen is that small — for 480p, an effective distance closer to 6.75× screen height, where almost nothing is resolvable and the score is flattered. Netflix’s own FAQ calls the native-resolution comparison apples-to-oranges. Upsample both the reference and the distorted video to a common resolution, typically 1080p, and score there.
What is VMAF NEG, and should I use it? NEG stands for No Enhancement Gain. It detects and subtracts the score increase caused by pre-processing such as sharpening or contrast boosting, isolating pure compression gain. Use it when you are comparing encoders and want to know which one actually compresses better. It is deliberately conservative and is not automatically the better predictor of what a viewer will enjoy. As of VMAF v1 (June 2026) it is on by default.
Does VMAF replace PSNR and SSIM? No — it answers a different question with different assumptions. PSNR is pure arithmetic with no perceptual model, which makes it transparent, cheap, and impossible to game by pre-processing. SSIM adds a structural hypothesis. VMAF adds actual human rating data and, with it, a dependence on the training set. Reporting more than one is often the honest move, since they fail in different directions. Formal subjective testing remains the reference all three approximate.
Is a higher VMAF score always a better encode? Not necessarily. A score can rise because compression genuinely improved, or because something moved the model’s input features without improving what a viewer sees — the exact effect NEG was built to strip out. It can also rise because you compared at a resolution or viewing model that flatters the result. A single number rising is evidence; it is not proof, and a per-frame distribution with its low percentiles is far harder to fool than a mean.
📚 Further Reading
- Netflix/vmaf on GitHub — the reference implementation, model files, and release notes. The authoritative source for which models exist right now.
models_v1.mdandmodels_v0.md— the model catalogues and Netflix’s own model-selection guidance for both generations.faq.md— the cross-resolution warning, the design scope, and the self-comparison behaviour, straight from the project.- Netflix Technology Blog, “Toward A Practical Perceptual Video Quality Metric” (June 6, 2016) — the original architecture and the subjective dataset behind it.
- Netflix Technology Blog, “Toward a Better Quality Metric for the Video Community” (December 7, 2020) — the enhancement-gaming disclosure and the introduction of NEG.
- Netflix Technology Blog, “VMAF v1: Good Is Not Good Enough” (June 19, 2026) — the v1 redesign: AIM, CAMBI, chroma, CSF-based distance modelling, four models, NEG by default.
- Z. Wang & A. C. Bovik, “Mean Squared Error: Love It or Leave It?” IEEE Signal Processing Magazine 26(1), 2009 — why PSNR is not perceptual.
- Z. Wang, A. C. Bovik, H. R. Sheikh & E. P. Simoncelli, “Image Quality Assessment: From Error Visibility to Structural Similarity” IEEE Transactions on Image Processing 13(4), 2004 — the original SSIM paper.
- FFmpeg filters documentation — the
libvmaf,psnr, andssimfilters. Confirm option names against your own build withffmpeg -h filter=libvmaf. - G. Bjøntegaard, “Calculation of Average PSNR Differences Between RD-Curves,” ITU-T VCEG-M33, April 2001 — the original BD-rate method, and the reason single-point encoder comparisons do not survive scrutiny.
📚 Recommended Resources
Disclosure: some links below are Amazon affiliate links. If you buy through them, I earn a small commission — at no extra cost to you — which helps keep this site running.
Start free, and mean it. Video quality assessment is a subject where the current, actionable material is written by practitioners and published for nothing, while the printed shelf is older than the metrics it would need to cover. Nothing in print explains VMAF v1, and no book will tell you which model file your build defaults to. Work through these first; buy a book only for the theory underneath, which does not go stale.
- The VMAF project itself — the reference implementation, every model file, and the documentation that settles arguments. Read
models_v1.mdandmodels_v0.mdtogether and the “which model produced this number?” question stops being abstract, then readfaq.mdfor the cross-resolution warning in the project’s own words. Free, primary, and more current than anything else on this page. ffmpeg-quality-metrics— Werner Robitza’s open-source wrapper that runs PSNR, SSIM, VMAF, and VIF over a reference/distorted pair and hands back per-frame results rather than a single headline figure. Requires FFmpeg 7.1 or newer. This is the fastest way to stop quoting the mean and start looking at the low percentiles, which is most of what this article argues for. Robitza holds a Ph.D. from Ilmenau University of Technology and runs a video-quality-assessment consultancy; his writing is the practitioner reference for this corner of the field.- Werner Robitza’s CRF Guide — the standard practitioner explanation of constant-rate-factor encoding across x264, x265, and libvpx, and the natural companion to a quality metric: one document explains the knob, the other measures whether turning it worked. Dated 2017-02-24, so treat its specific default ranges as historical and confirm current values against your own encoder build.
- Digital Video Introduction — Leandro Moreira’s free, illustrated walkthrough of frame types, GOP structure, the transform, quantization, and rate control, with runnable examples. The best free on-ramp to the encoding side of everything measured here, actively maintained and translated into several languages.
- FFmpeg’s own documentation —
ffmpeg-all— every filter and option in one nightly-regenerated page, includinglibvmaf,psnr, andssim. When a five-year-old blog post and this page disagree about an option name, this page is right.
Digital Video and HD: Algorithms and Interfaces
Charles Poynton · 2nd edition, Morgan Kaufmann, 2012 · Hardcover, 752 pp
The book that explains why viewing distance is a parameter at all. Poynton is the reference on the signal-and-vision side — contrast sensitivity, spatial frequency, gamma, colour spaces, and chroma subsampling — which is precisely the machinery VMAF v1 pulled into its viewing-distance model when it switched to modulating the contrast sensitivity function. Worth being clear about what it is not: this is a colour and signals book, with roughly one part of six on compression and no HEVC or AV1 coverage. Buy it to understand human vision and pixels, not codecs.
Introduction to Data Compression
Khalid Sayood · 5th edition, Morgan Kaufmann, 2017 · Paperback, 790 pp
The theory behind the distortions every metric on this page is trying to score. Sayood builds from information theory through quantization, transform coding, and rate–distortion theory, which is where the idea of a rate–quality curve — the thing BD-rate integrates between — actually comes from. It is general compression theory rather than a video-specific text, and it is the better book for it: understand rate–distortion once and the reason single-operating-point encoder comparisons are worthless becomes obvious rather than memorized.
Coding Video: A Practical Guide to HEVC and Beyond
Iain E. Richardson · Wiley, 2024 · Hardcover, 448 pp
The most current codec text on the shelf, from the author of the standard H.264 books. It walks the modern block-based coding pipeline — prediction, transform, quantization, entropy coding — which is what produces the blocking and banding artifacts VMAF v1 added dedicated features to detect. Read it if you want to know what the encoder was doing when the score dropped. One honest caveat: the publisher’s own description does not promise substantive AV1 or VVC coverage, so treat “and Beyond” as an HEVC-centric book with a forward glance rather than a guide to the newer codecs.