ffmpeg/tests
Nil Fons Miret e294b390a0 avfilter/vf_unsharp: fix amount scaling in the high-bit-depth path
The 16-bit kernel is dispatched for every non-8-bit pixel format
(9/10/12/16-bit content, all stored in uint16_t). It's supposed to
undo the Q16 scaling that set_filter_param() applies to `amount`:

    fp->amount = amount * 65536.0;

but the shift written in the kernel is `>> (8+nbits)`, which for the
nbits=16 instantiation of the macro comes out to `>> 24` instead of
`>> 16`. Because of this, on any non-8-bit input, unsharp applies ~1/256
of the user's requested strength and is effectively a no-op. The
8-bit kernel (nbits=8) happens to be correct because 8+8 == 16.

This commit also widens the intermediate product to int64 before the
shift, to avoid a potential overflow. Take a 16-bit pixel at the
edge of a sharp white/black region, with the user-facing `amount`
set to its declared maximum of 5.0.

    *srx       = 65535
    blur       = 32768
    diff       = *srx - blur                  = 32767
    amount_q16 = 5.0 * 65536                  = 327680

Then the kernel computes:

    product    = diff * amount_q16
               = 32767 * 327680               = 10,737,090,560     (~1.07e10)

which overflows INT32_MAX. Widening to int64 keeps the
multiplication in range; the subsequent `>> 16` brings it back to
sample range and the final cast to int32 is then safe. The widening
is a semantic no-op for 8/9/10/12-bit content where the product
always fits in int32 (worst case at 12-bit: 4095 * 327680 ~ 1.34e9).

Introduced by ee792ebe08 (2019-11-08, "avfilter/vf_unsharp: add 10bit
support"). The fate-filter-unsharp-yuv420p10 reference added in the
same series was generated from the broken kernel and is regenerated
here. fate-filter-unsharp (8-bit) is unaffected.

Repro:

    python3 -c "import numpy as np; y=np.tile(np.where(np.arange(128)//8 & 1, 512, 256).astype('<u2'), (128,1)); c=np.full((64,64), 512, '<u2'); open('in.yuv','wb').write(y.tobytes()+c.tobytes()*2)"

    ffmpeg -f rawvideo -pix_fmt yuv420p10le -s 128x128 -i in.yuv \
        -lavfi "split=2[a][b];[b]unsharp=la=1[bs];[a][bs]psnr" \
        -f null - 2>&1 | grep PSNR

Before: `PSNR y:66.50 ...` -- the filter is effectively a no-op,
        so the sharpened output matches the input almost exactly.
After:  `PSNR y:28.27 ...` -- the filter actually sharpens, so
        output and input differ as expected.

Signed-off-by: Nil Fons Miret <nilf@netflix.com>
Made-with: Cursor
2026-04-30 21:15:58 +00:00
..
api avcodec/tests: add encoder-parser API test for H.261 2026-03-29 23:01:39 +00:00
checkasm swscale/x86/yuv2yuvX: Port ff_yuv2yuvX_mmxext to SSE2 2026-04-26 23:48:21 +02:00
fate fate/filter-video: add frei0r_src test 2026-04-30 03:46:18 +00:00
filtergraphs tests/fate: add fate test for excessive frame buffering when using filters 2025-07-14 22:05:11 +02:00
maps fate: Add fsync filter tests 2024-01-05 09:29:05 +01:00
ref avfilter/vf_unsharp: fix amount scaling in the high-bit-depth path 2026-04-30 21:15:58 +00:00
streamgroups tests/fate/iamf: add tests for Projection mode ambisonic Audio Elements 2025-12-29 12:02:53 -03:00
.gitignore
audiogen.c tests/audiogen: Fix total RIFF chunk size 2024-03-28 11:54:41 +01:00
audiomatch.c tests/audiomatch: add free to make static analysis tools happy 2020-12-10 19:38:32 +08:00
base64.c
copycooker.sh
extended.ffconcat all: fix whitespace/new-line issues 2025-08-03 13:48:47 +02:00
fate-run.sh libavformat/oggenc.c: re-initialize stream on new metadata. 2026-02-18 16:25:06 +00:00
fate-valgrind.supp
fate.sh fate.sh: Allow specifying --ar through a separate variable 2025-12-19 18:41:23 +00:00
Makefile tests/fate: Add SBC tests 2026-03-28 11:25:38 +01:00
md5.sh
refcmp-metadata.awk fate/filter-refcmp-*: make refcmp_metadata fail on empty or truncated input 2022-04-10 20:12:23 +02:00
reference.pnm
rotozoom.c
simple1.ffconcat all: fix whitespace/new-line issues 2025-08-03 13:48:47 +02:00
simple2.ffconcat all: fix whitespace/new-line issues 2025-08-03 13:48:47 +02:00
test.ffmeta
tiny_psnr.c
tiny_ssim.c test: tiny_ssim: Don't include config.h 2022-03-30 14:56:07 +03:00
utils.c
videogen.c