Skip to content

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.