Allowed differences from Netflix/vmaf¶
Every row is one fragment of the upstream parity guard's allowlist: a place where this tree's CPU result differs from Netflix/vmaf at the recorded parity head, why, and by how much at most. Anything the guard finds that no row covers fails it, and so does a row nothing matches any more. The guard, the fragment keys and the way a row is added or removed are in the upstream parity guide.
Deliberate deviations¶
| Fragment | Kind | Scope | Metrics | Bound | ADR | Upstream | Evidence |
|---|---|---|---|---|---|---|---|
adm.barten-csf-range | value | runs F.adm.*adm_csf_mode-1* | VMAF_integer_feature_a*, integer_a* | inf | ADR-1325, ADR-1472 | Netflix/vmaf#1662 | adm_csf_mode=1: upstream wraps its fixed-point CSF weights (NaN, or sums a hundred times too large); this tree bounds them. Full matrix in the dev image (43ef1e32cb32: GCC 15.2.0, glibc 2.43) on 2026-10-03, 9b6ecd5ae against Netflix 9e48141b: 8190 values differ, largest inf (cb1, integer_adm_num_csf_1, frame 1: upstream 11807.443923950195, fork 1001106.7299804688) |
adm.frames-of-16-or-less | error | runs F.adm.*; fixtures s16x16, s12x9, s8x8 | all | ends crash / error, ok / error | ADR-1494, ADR-1481 | Netflix/vmaf#1642, Netflix/vmaf#1607 | frames of 16 pixels or less: upstream ends in a segmentation fault, this tree refuses at init. Full matrix in the dev image (43ef1e32cb32: GCC 15.2.0, glibc 2.43) on 2026-10-03, 9b6ecd5ae against Netflix 9e48141b: 18 runs |
adm.gain-limit-truncation | value | runs F.adm.*adm_enhn_gain_limit-1.2*; dispatch avx2, default | VMAF_integer_feature_a*, integer_a* | 1.9e-06 | ADR-1413 | Netflix/vmaf#1633 | adm_enhn_gain_limit=1.2 on the SIMD paths: upstream SIMD rounds the gain-limited sample, this tree truncates on every path. Full matrix in the dev image (43ef1e32cb32: GCC 15.2.0, glibc 2.43) on 2026-10-03, 9b6ecd5ae against Netflix 9e48141b: 1014 values differ, largest 1.82e-06 (q160x90, integer_adm_scale0_egl_1.2, frame 37: upstream 0.96510102460687563, fork 0.96509920073663513) |
adm.gain-limit-truncation-sums | value | runs F.adm.*adm_enhn_gain_limit-1.2*; dispatch avx2, default | integer_adm_num*, integer_adm_den* | 6.2e-05 | ADR-1413 | Netflix/vmaf#1633 | adm_enhn_gain_limit=1.2 on the SIMD paths, debug numerators and denominators: upstream SIMD rounds the gain-limited sample, this tree truncates on every path. Full matrix in the dev image (43ef1e32cb32: GCC 15.2.0, glibc 2.43) on 2026-10-03, 9b6ecd5ae against Netflix 9e48141b: 408 values differ, largest 6.1e-05 (nflx8, integer_adm_num_egl_1.2, frame 4: upstream 367.86595916748047, fork 367.86589813232422) |
adm.noise-centre-tap | value | runs F.adm.*, M.*, C.*, B.*; fixtures noise* | VMAF_integer_feature_a*, integer_a* | 0.00023 | ADR-1402, ADR-1413 | Netflix/vmaf#1602, Netflix/vmaf#1633 | full-range noise: the masking centre tap stays in int32 and the gain-limited sample is truncated; upstream scalar and SIMD disagree here. Full matrix in the dev image (43ef1e32cb32: GCC 15.2.0, glibc 2.43) on 2026-10-03, 9b6ecd5ae against Netflix 9e48141b: 360 values differ, largest 0.000225 (noise8, integer_adm_scale0_egl_1, frame 1: upstream 0.45183322527017361, fork 0.45160802748355244) |
adm.noise-centre-tap-sums | value | runs F.adm.*, M.*, C.*, B.*; fixtures noise* | integer_adm_num*, integer_adm_den* | 0.032 | ADR-1402, ADR-1413 | Netflix/vmaf#1602, Netflix/vmaf#1633 | full-range noise, debug numerators and denominators: the masking centre tap stays in int32 and the gain-limited sample is truncated; upstream scalar and SIMD disagree here. Full matrix in the dev image (43ef1e32cb32: GCC 15.2.0, glibc 2.43) on 2026-10-03, 9b6ecd5ae against Netflix 9e48141b: 78 values differ, largest 0.031 (noise8, integer_adm_num_egl_1, frame 1: upstream 197.33486175537109, fork 197.30386352539062) |
adm.tiny-frames | value | runs F.adm.*; fixtures akiyo18x22, s18x22, s17x17, s19x19, s24x24 | VMAF_integer_feature_a*, integer_a* | 0.24 | ADR-1482 | Netflix/vmaf#1599, Netflix/vmaf#1600 | frames of 17 to 24 pixels: upstream reads index -1 at scale 3 and rounds a zero shift with an undefined constant. Full matrix in the dev image (43ef1e32cb32: GCC 15.2.0, glibc 2.43) on 2026-10-03, 9b6ecd5ae against Netflix 9e48141b: 326 values differ, largest 0.23 (akiyo18x22, integer_adm_scale3, frame 0: upstream 0.91209581535961382, fork 1.1421883345409307) |
adm.tiny-frames-sums | value | runs F.adm.*; fixtures akiyo18x22, s18x22, s17x17, s19x19, s24x24 | integer_adm_num*, integer_adm_den* | 13 | ADR-1482 | Netflix/vmaf#1599, Netflix/vmaf#1600 | frames of 17 to 24 pixels, debug numerators and denominators: upstream reads index -1 at scale 3. Full matrix in the dev image (43ef1e32cb32: GCC 15.2.0, glibc 2.43) on 2026-10-03, 9b6ecd5ae against Netflix 9e48141b: 132 values differ, largest 12.7 (akiyo18x22, integer_adm_den, frame 0: upstream 88.253743171691895, fork 75.552674293518066) |
adm.view-distance-rejected | error | runs F.adm.debug-true+adm_norm_view_dist-1.5 | all | ends ok / error | ADR-1191, ADR-1481 | none yet | adm_norm_view_dist=1.5 alone: the fixed-point CSF cannot represent it; upstream returns success without a value, this tree an error. Full matrix in the dev image (43ef1e32cb32: GCC 15.2.0, glibc 2.43) on 2026-10-03, 9b6ecd5ae against Netflix 9e48141b: 15 runs |
cambi.frames-too-small | error | runs F.cambi.*; fixtures akiyo18x22, q160x90, s24x24, s19x19, s18x22, s17x17, s16x16, s12x9, s8x8 | all | ends ok / error | ADR-1481 | none yet | frames below the minimum size: both trees refuse at init; upstream returns success without a value, this tree the error. Full matrix in the dev image (43ef1e32cb32: GCC 15.2.0, glibc 2.43) on 2026-10-03, 9b6ecd5ae against Netflix 9e48141b: 90 runs |
ciede.chroma-422 | value | runs F.ciede.*; fixtures nflx422* | ciede2000 | 0.16 | ADR-1479 | Netflix/vmaf#1611 | 4:2:2 input: upstream upsamples chroma with the two subsampling flags swapped. Full matrix in the dev image (43ef1e32cb32: GCC 15.2.0, glibc 2.43) on 2026-10-03, 9b6ecd5ae against Netflix 9e48141b: 168 values differ, largest 0.153 (nflx422p10, ciede2000, frame 6: upstream 33.268147359332225, fork 33.11479237659772) |
ciede.gray-refused | error | runs F.ciede.*; fixtures nflx400 | all | ends ok / error | ADR-1481 | none yet | 4:0:0 input: both trees refuse at init; upstream returns success without a value, this tree the error. Full matrix in the dev image (43ef1e32cb32: GCC 15.2.0, glibc 2.43) on 2026-10-03, 9b6ecd5ae against Netflix 9e48141b: 3 runs |
ciede.odd-size-chroma | value | runs F.ciede.*; fixtures s12x9, s17x17, s19x19 | ciede2000 | inf | ADR-1483 | none yet | odd-sized 4:2:0 input: the chroma planes are rounded up, upstream rounds them down. Full matrix in the dev image (43ef1e32cb32: GCC 15.2.0, glibc 2.43) on 2026-10-03, 9b6ecd5ae against Netflix 9e48141b: 21 values differ, largest 0.297 (s17x17, ciede2000, frame 0: upstream 35.914261632229511, fork 35.617241343218446); upstream's value is undefined there: 21 of these outputs changed when the heap was filled (MALLOC_PERTURB_=170) |
float_adm.divide | value | runs F.float_adm.*, M.*, C.*, B.* | VMAF_feature_a*, adm*, aim* | 2.1e-07 | ADR-1442 | Netflix/vmaf#1655, Netflix/vmaf#1654 | the decouple divides instead of multiplying by a reciprocal estimate. Full matrix in the dev image (43ef1e32cb32: GCC 15.2.0, glibc 2.43) on 2026-10-03, 9b6ecd5ae against Netflix 9e48141b: 31887 values differ, largest 2.1e-07 (q160x90, adm_scale1_csf_2_dlmw_0.7_egl_1_min_0.5_nw_0.02, frame 46: upstream 0.95826634741403061, fork 0.95826655720941922) |
float_adm.divide-barten | value | runs F.float_adm.*adm_csf_mode-1* | VMAF_feature_a*, adm*, aim* | 1.7e-07 | ADR-1442 | Netflix/vmaf#1655, Netflix/vmaf#1654 | adm_csf_mode=1: the decouple divides instead of multiplying by a reciprocal estimate. Full matrix in the dev image (43ef1e32cb32: GCC 15.2.0, glibc 2.43) on 2026-10-03, 9b6ecd5ae against Netflix 9e48141b: 708 values differ, largest 1.7e-07 (q160x90, adm_scale0_csf_1, frame 23: upstream 0.91691413388171461, fork 0.91691430355412806) |
float_adm.divide-barten-sums | value | runs F.float_adm.*adm_csf_mode-1* | adm_num*, adm_den* | 0.032 | ADR-1442 | Netflix/vmaf#1655, Netflix/vmaf#1654 | adm_csf_mode=1, debug numerators and denominators (of the order of 1e5 to 1e6): the decouple divides instead of multiplying by a reciprocal estimate. Full matrix in the dev image (43ef1e32cb32: GCC 15.2.0, glibc 2.43) on 2026-10-03, 9b6ecd5ae against Netflix 9e48141b: 111 values differ, largest 0.0312 (cb1, adm_num_csf_1, frame 0: upstream 936852.931640625, fork 936852.962890625) |
float_adm.divide-sums | value | runs F.float_adm.*, M.*, C.*, B.* | adm_num*, adm_den* | 0.002 | ADR-1442 | Netflix/vmaf#1655, Netflix/vmaf#1654 | debug numerators and denominators: the decouple divides instead of multiplying by a reciprocal estimate. Full matrix in the dev image (43ef1e32cb32: GCC 15.2.0, glibc 2.43) on 2026-10-03, 9b6ecd5ae against Netflix 9e48141b: 8103 values differ, largest 0.00195 (cb1, adm_num_csf_2, frame 0: upstream 33516.068374633789, fork 33516.070327758789) |
float_adm.frames-of-16-or-less | error | runs F.float_adm.*; fixtures s16x16, s12x9, s8x8 | all | ends ok / error | ADR-1494, ADR-1481 | none yet | frames of 16 pixels or less: upstream scores them on a one-sample scale-3 band (at 8x8 and 12x9 its value depends on the heap), this tree refuses at init (fork #1770). Full matrix in the dev image (43ef1e32cb32: GCC 15.2.0, glibc 2.43) on 2026-10-03, 9b6ecd5ae against Netflix 9e48141b: 18 runs |
float_motion.scale1-stride | value | runs F.float_motion.motion_add_scale1-true+motion_add_uv-true* | *motion* | inf | ADR-1486 | Netflix/vmaf#1667 | motion_add_scale1 with motion_add_uv: upstream scales the chroma planes with a stride computed from their width. Full matrix in the dev image (43ef1e32cb32: GCC 15.2.0, glibc 2.43) on 2026-10-03, 9b6ecd5ae against Netflix 9e48141b: 894 values differ, largest 25.2 (noise8, motion2_mdc_mau_mfs_3, frame 2: upstream 193.34005737304688, fork 218.57089233398438); upstream's value is undefined there: 894 of these outputs changed when the heap was filled (MALLOC_PERTURB_=170) |
float_ms_ssim.anti-correlated-nan | value | runs F.float_ms_ssim.*; fixtures cb10 | float_ms_ssim* | inf | ADR-1484 | Netflix/vmaf#1665 | 10 px checkerboard: a negative structure term makes upstream NaN, this tree takes its magnitude. Full matrix in the dev image (43ef1e32cb32: GCC 15.2.0, glibc 2.43) on 2026-10-03, 9b6ecd5ae against Netflix 9e48141b: 9 values differ, largest inf |
float_ms_ssim.separable-decimate | value | runs F.float_ms_ssim.* | float_ms_ssim | 1.8e-06 | ADR-0125, ADR-1487 | none yet | the 9/7 decimation filter is applied separably; upstream applies it as one 2-D filter. Full matrix in the dev image (43ef1e32cb32: GCC 15.2.0, glibc 2.43) on 2026-10-03, 9b6ecd5ae against Netflix 9e48141b: 861 values differ, largest 1.79e-06 (cb1, float_ms_ssim, frame 0: upstream 0.8945272294594423, fork 0.89452544363435227) |
float_ms_ssim.separable-decimate-db | value | runs F.float_ms_ssim.*enable_db-true* | float_ms_ssim | 7.4e-05 | ADR-0125, ADR-1487 | none yet | enable_db: the separable decimation of ADR-0125, on the dB scale. Full matrix in the dev image (43ef1e32cb32: GCC 15.2.0, glibc 2.43) on 2026-10-03, 9b6ecd5ae against Netflix 9e48141b: 318 values differ, largest 7.35e-05 (cb1, float_ms_ssim, frame 0: upstream 9.7685964586707303, fork 9.768522926192869) |
float_ms_ssim.separable-decimate-lcs | value | runs F.float_ms_ssim.*enable_lcs-true* | float_ms_ssim_?_scale? | 9.3e-06 | ADR-0125, ADR-1487 | none yet | enable_lcs, per-scale terms: the separable decimation of ADR-0125. Full matrix in the dev image (43ef1e32cb32: GCC 15.2.0, glibc 2.43) on 2026-10-03, 9b6ecd5ae against Netflix 9e48141b: 675 values differ, largest 9.24e-06 (cb1, float_ms_ssim_s_scale4, frame 0: upstream 0.99971765279769897, fork 0.99970841407775879) |
float_vif.frames-below-16 | error | runs F.float_vif.*; fixtures s12x9, s8x8 | all | ends ok / error | ADR-1481, ADR-1487 | none yet | frames below 16 pixels: upstream scores them reading outside the plane at scale 3 (reported as Netflix/vmaf#1582), this tree refuses at init. Full matrix in the dev image (43ef1e32cb32: GCC 15.2.0, glibc 2.43) on 2026-10-03, 9b6ecd5ae against Netflix 9e48141b: 12 runs |
model.float-adm-divide | value | runs M.vmaf_float*, C.vmaf_float*, C.vmaf_rb*, C.vmaf_4k_rb*, M.nflxtrain*, M.vmaf_v0.6.0, B.vmaf_float* | model0* | 1.8e-05 | ADR-1442 | Netflix/vmaf#1655, Netflix/vmaf#1654 | scores of the models that read float_adm follow its division. Full matrix in the dev image (43ef1e32cb32: GCC 15.2.0, glibc 2.43) on 2026-10-03, 9b6ecd5ae against Netflix 9e48141b: 15720 values differ, largest 1.79e-05 (nflx10, model0, frame 2: upstream 79.077078216564914, fork 79.07709611993036) |
model.noise-integer-adm | value | runs M.*, C.*, B.*; fixtures noise* | model0* | 0.0051 | ADR-1402, ADR-1413 | none yet | predicted scores on full-range noise follow the integer ADM difference there. Full matrix in the dev image (43ef1e32cb32: GCC 15.2.0, glibc 2.43) on 2026-10-03, 9b6ecd5ae against Netflix 9e48141b: 95 values differ, largest 0.00509 (noise8, model0_0008, frame 1: upstream 6.3345404258012126, fork 6.3294527063262382) |
psnr.apsnr-disabled-chroma | name | runs F.psnr.*enable_apsnr-true+enable_chroma-false* | apsnr_cb, apsnr_cr | only upstream emits | ADR-1485 | Netflix/vmaf#1666 | enable_chroma=false with enable_apsnr: upstream publishes -inf for the two unmeasured planes, this tree publishes nothing. Full matrix in the dev image (43ef1e32cb32: GCC 15.2.0, glibc 2.43) on 2026-10-03, 9b6ecd5ae against Netflix 9e48141b: 30 differences |
psnr.apsnr-zero-error-plane | value | runs F.psnr.*enable_apsnr-true*; at agg | apsnr_* | 54 | ADR-1485 | Netflix/vmaf#1666, Netflix/vmaf#1618 | aggregate PSNR of a plane without error: the per-frame cap here, a ceiling far above it upstream. Full matrix in the dev image (43ef1e32cb32: GCC 15.2.0, glibc 2.43) on 2026-10-03, 9b6ecd5ae against Netflix 9e48141b: 12 values differ, largest 54 (cb1, apsnr_cb, frame agg: upstream 114, fork 60) |
psnr.odd-size-chroma | value | runs F.psnr.*; fixtures s12x9, s17x17, s19x19 | psnr_cb, psnr_cr, mse_cb, mse_cr, apsnr_cb, apsnr_cr | 0.83 | ADR-1483 | none yet | odd-sized 4:2:0 input: the chroma planes are rounded up, upstream rounds them down. Full matrix in the dev image (43ef1e32cb32: GCC 15.2.0, glibc 2.43) on 2026-10-03, 9b6ecd5ae against Netflix 9e48141b: 42 values differ, largest 0.829 (s12x9, psnr_cr, frame 1: upstream 38.628778292303252, fork 39.458093419024621) |
psnr_hvs.luma-on-gray | name | runs F.psnr_hvs.*; fixtures nflx400 | psnr_hvs, psnr_hvs_y | only fork emits | ADR-1487 | none yet | 4:0:0 input: upstream refuses at init and returns success without a value; this tree scores luma. Full matrix in the dev image (43ef1e32cb32: GCC 15.2.0, glibc 2.43) on 2026-10-03, 9b6ecd5ae against Netflix 9e48141b: 6 differences |
psnr_hvs.pooled-harmonic-mean-guard | value | runs F.psnr_hvs.*; at pool-harmonic | psnr_hvs* | inf | ADR-1008 | none yet | harmonic-mean pooling of a metric whose every frame is infinite or NaN: upstream returns inf or NaN, this tree 0. Full matrix in the dev image (43ef1e32cb32: GCC 15.2.0, glibc 2.43) on 2026-10-03, 9b6ecd5ae against Netflix 9e48141b: 48 values differ, largest inf (cb10, psnr_hvs_y, frame pool-harmonic: upstream -3.8233954273437409, fork 0) |
psnr_hvs.sixteen-bit-refused | error | runs F.psnr_hvs.*; fixtures nflx16*, noise16 | all | ends ok / error | ADR-1481 | none yet | 16-bit input: both trees refuse at init; upstream returns success without a value, this tree the error. Full matrix in the dev image (43ef1e32cb32: GCC 15.2.0, glibc 2.43) on 2026-10-03, 9b6ecd5ae against Netflix 9e48141b: 9 runs |
speed_chroma.frames-too-small | error | runs F.speed_chroma.*; fixtures akiyo18x22, q160x90, s256x144, s24x24, s19x19, s18x22, s17x17, s16x16, s12x9, s8x8 | all | ends crash / error, ok / error | ADR-1481 | Netflix/vmaf#1620 | frames too small for one SpEED block: upstream ends in a segmentation fault, this tree refuses at init. Full matrix in the dev image (43ef1e32cb32: GCC 15.2.0, glibc 2.43) on 2026-10-03, 9b6ecd5ae against Netflix 9e48141b: 87 runs |
speed_chroma.gray-refused | error | runs F.speed_chroma.*; fixtures nflx400 | all | ends ok / error | ADR-1481 | none yet | 4:0:0 input: both trees refuse at init; upstream returns success without a value, this tree the error. Full matrix in the dev image (43ef1e32cb32: GCC 15.2.0, glibc 2.43) on 2026-10-03, 9b6ecd5ae against Netflix 9e48141b: 3 runs |
speed_temporal.frames-too-small | error | runs F.speed_temporal.*; fixtures akiyo18x22, q160x90, s256x144, s24x24, s19x19, s18x22, s17x17, s16x16, s12x9, s8x8 | all | ends crash / error, ok / error | ADR-1481, ADR-1487 | Netflix/vmaf#1620 | frames too small for one SpEED block: upstream ends in a segmentation fault (18x22: scores it), this tree refuses. Full matrix in the dev image (43ef1e32cb32: GCC 15.2.0, glibc 2.43) on 2026-10-03, 9b6ecd5ae against Netflix 9e48141b: 36 runs |
speed_temporal.max-val-applied | value | runs F.speed_temporal.*speed_max_val-3.0* | speed_temporal* | 77 | ADR-1301 | Netflix/vmaf#1668 | speed_max_val=3: upstream ignores the option on speed_temporal, this tree clips. Full matrix in the dev image (43ef1e32cb32: GCC 15.2.0, glibc 2.43) on 2026-10-03, 9b6ecd5ae against Netflix 9e48141b: 159 values differ, largest 76.7 (noise8, speed_temporal_mxv_3, frame 2: upstream 79.741584777832031, fork 3) |
speed_temporal.prescale-above-one | value | runs F.speed_temporal.speed_prescale-2.0* | speed_temporal* | inf; ends crash / ok | ADR-1480 | Netflix/vmaf#1627, Netflix/vmaf#1626 | speed_prescale=2: upstream reads and writes past its frame buffers, so its values there are not defined and some of its runs end in a segmentation fault. Full matrix in the dev image (43ef1e32cb32: GCC 15.2.0, glibc 2.43) on 2026-10-03, 9b6ecd5ae against Netflix 9e48141b: 160 values differ, largest 195; with the pending reverts applied 154 values, largest 195 (nflx8, speed_temporal_ps_2_psm_lanczos4, frame 36: upstream 208.31849670410156, fork 13.179099082946777) |
Pending: differences that are to disappear¶
None: every fragment above is a deliberate deviation with an ADR.