FFmpeg/tests/checkasm
Ramiro Polla 384fe39623 swscale/range_convert: fix mpeg ranges in yuv range conversion for non-8-bit pixel formats
There is an issue with the constants used in YUV to YUV range conversion,
where the upper bound is not respected when converting to mpeg range.

With this commit, the constants are calculated at runtime, depending on
the bit depth. This approach also allows us to more easily understand how
the constants are derived.

For bit depths <= 14, the number of fixed point bits has been set to 14
for all conversions, to simplify the code.
For bit depths > 14, the number of fixed points bits has been raised and
set to 18, to allow for the conversion to be accurate enough for the mpeg
range to be respected.

The convert functions now take the conversion constants (coeff and offset)
as function arguments.
For bit depths <= 14, coeff is unsigned 16-bit and offset is 32-bit.
For bit depths > 14, coeff is unsigned 32-bit and offset is 64-bit.

x86_64:
chrRangeFromJpeg8_1920_c:    2127.4   2125.0  (1.00x)
chrRangeFromJpeg16_1920_c:   2325.2   2127.2  (1.09x)
chrRangeToJpeg8_1920_c:      3166.9   3168.7  (1.00x)
chrRangeToJpeg16_1920_c:     2152.4   3164.8  (0.68x)
lumRangeFromJpeg8_1920_c:    1263.0   1302.5  (0.97x)
lumRangeFromJpeg16_1920_c:   1080.5   1299.2  (0.83x)
lumRangeToJpeg8_1920_c:      1886.8   2112.2  (0.89x)
lumRangeToJpeg16_1920_c:     1077.0   1906.5  (0.56x)

aarch64 A55:
chrRangeFromJpeg8_1920_c:   28835.2  28835.6  (1.00x)
chrRangeFromJpeg16_1920_c:  28839.8  32680.8  (0.88x)
chrRangeToJpeg8_1920_c:     23074.7  23075.4  (1.00x)
chrRangeToJpeg16_1920_c:    17318.9  24996.0  (0.69x)
lumRangeFromJpeg8_1920_c:   15389.7  15384.5  (1.00x)
lumRangeFromJpeg16_1920_c:  15388.2  17306.7  (0.89x)
lumRangeToJpeg8_1920_c:     19227.8  19226.6  (1.00x)
lumRangeToJpeg16_1920_c:    15387.0  21146.3  (0.73x)

aarch64 A76:
chrRangeFromJpeg8_1920_c:    6324.4   6268.1  (1.01x)
chrRangeFromJpeg16_1920_c:   6339.9  11521.5  (0.55x)
chrRangeToJpeg8_1920_c:      9656.0   9612.8  (1.00x)
chrRangeToJpeg16_1920_c:     6340.4  11651.8  (0.54x)
lumRangeFromJpeg8_1920_c:    4422.0   4420.8  (1.00x)
lumRangeFromJpeg16_1920_c:   4420.9   5762.0  (0.77x)
lumRangeToJpeg8_1920_c:      5949.1   5977.5  (1.00x)
lumRangeToJpeg16_1920_c:     4446.8   5946.2  (0.75x)

NOTE: all simd optimizations for range_convert have been disabled.
      they will be re-enabled when they are fixed for each architecture.

NOTE2: the same issue still exists in rgb2yuv conversions, which is not
       addressed in this commit.
2024-12-05 21:10:29 +01:00
..
aarch64 checkasm: aarch64: Check for stack overflows 2020-05-15 21:22:36 +03:00
arm checkasm: arm: Check for stack overflows 2020-05-15 21:22:34 +03:00
riscv checkasm/riscv: preserve T1 whilst calling... 2024-08-01 18:44:01 +03:00
x86 x86: replace explicit REP_RETs with RETs 2023-02-01 04:23:55 +01:00
.gitignore Split global .gitignore file into per-directory files 2016-05-13 14:55:56 +02:00
aacencdsp.c x86/aacencdsp: add AVX version of quantize_bands 2024-06-09 12:29:49 -03:00
aacpsdsp.c lavu: move LOCAL_ALIGNED from internal.h to mem_internal.h 2021-01-01 14:11:01 +01:00
ac3dsp.c checkasm: Increase the tolerance for ac3_sum_square_butterfly_float 2024-07-24 12:10:33 +03:00
af_afir.c checkasm: test for dcmul_add 2023-11-27 17:55:24 +02:00
alacdsp.c lavu: move LOCAL_ALIGNED from internal.h to mem_internal.h 2021-01-01 14:11:01 +01:00
audiodsp.c checkasm/audiodsp: Be strict about MMX 2022-10-11 14:18:54 +02:00
av_tx.c avutil/common: Don't auto-include mem.h 2024-03-31 00:08:43 +01:00
blockdsp.c checkasm/blockdsp: use smallest allowed aligned buffers for fill_block_tab tests 2024-05-08 21:13:23 -03:00
bswapdsp.c lavu: move LOCAL_ALIGNED from internal.h to mem_internal.h 2021-01-01 14:11:01 +01:00
checkasm.c tests/checkasm: Add partial support for wasm 2024-12-04 16:43:07 +08:00
checkasm.h tests/checkasm: Add partial support for wasm 2024-12-04 16:43:07 +08:00
diracdsp.c tests/checkasm/diracdsp: fix alignment for src and ombc_weight buffers 2024-11-19 12:32:49 -03:00
exrdsp.c tests/checkasm: Improve included headers 2024-03-02 02:54:12 +01:00
fdctdsp.c checkasm: add test for fdct 2024-05-11 10:28:59 +02:00
fixed_dsp.c configure: Remove av_restrict 2024-03-15 12:51:15 +01:00
flacdsp.c checkasm/flacdsp: add a test for lpc33 2024-05-24 09:23:00 -03:00
float_dsp.c checkasm/float_dsp: add double-precision scalar product 2024-05-31 22:22:43 +03:00
fmtconvert.c avcodec/fmtconvert: Remove unused AVCodecContext parameter 2022-09-21 20:26:40 +02:00
g722dsp.c checkasm: add a g722dsp test 2017-07-13 17:00:19 -03:00
h263dsp.c checkasm: add h263dsp.{h,v}_loop_filter 2024-05-27 22:42:07 +03:00
h264chroma.c checkasm: Fix h264chroma test name 2024-05-11 11:36:20 +03:00
h264dsp.c checkasm/h264dsp: test TX bypass 2024-07-21 22:36:48 +03:00
h264pred.c tests/checkasm: Improve included headers 2024-03-02 02:54:12 +01:00
h264qpel.c lavu: move LOCAL_ALIGNED from internal.h to mem_internal.h 2021-01-01 14:11:01 +01:00
hevc_add_res.c lavc/hevc*: move to hevc/ subdir 2024-06-04 11:46:27 +02:00
hevc_deblock.c lavc/hevc*: move to hevc/ subdir 2024-06-04 11:46:27 +02:00
hevc_idct.c lavc/hevc*: move to hevc/ subdir 2024-06-04 11:46:27 +02:00
hevc_pel.c lavc/hevc*: move to hevc/ subdir 2024-06-04 11:46:27 +02:00
hevc_sao.c lavc/hevc*: move to hevc/ subdir 2024-06-04 11:46:27 +02:00
huffyuvdsp.c tests/checkasm/huffyuvdsp: Use correct function pointer type 2024-05-17 13:29:34 +02:00
idctdsp.c avcodec/idctdsp: Avoid inclusion of avcodec.h 2023-09-11 00:26:34 +02:00
jpeg2000dsp.c lavu: move LOCAL_ALIGNED from internal.h to mem_internal.h 2021-01-01 14:11:01 +01:00
llauddsp.c tests/checkasm/llauddsp: Avoid UB integer overflow 2024-05-17 13:16:58 +02:00
lls.c checkasm: lls: Use relative tolerances rather than absolute ones 2024-10-09 15:52:56 +03:00
llviddsp.c tests/checkasm: Fix build error when enable linux perf on Android 2024-06-11 01:11:46 +08:00
llviddspenc.c tests/checkasm/llvidencdsp: Don't use declare_func_emms 2023-09-04 11:04:45 +02:00
lpc.c checkasm/lpc: use fixed length to bench apply_welch_window 2024-05-31 17:06:08 -03:00
Makefile checkasm/diracdsp: test add_dirac_obmc 2024-11-15 13:44:53 -05:00
motion.c avcodec/me_cmp: Zero MECmpContext in ff_me_cmp_init() 2024-06-20 18:58:38 +02:00
mpegvideoencdsp.c avcodec/mpegvideoencdsp: convert stride parameters from int to ptrdiff_t 2024-09-01 13:42:30 +02:00
opusdsp.c lavc/opus*: move to opus/ subdir 2024-09-02 11:56:53 +02:00
pixblockdsp.c configure: Remove av_restrict 2024-03-15 12:51:15 +01:00
rv34dsp.c checkasm/rv34dsp: add rv34_idct_dc_add test 2024-02-17 14:33:35 +02:00
rv40dsp.c checkasm/rv40dsp: add chroma_mc test 2024-05-03 18:00:53 +03:00
sbrdsp.c checkasm: test the noise case of sbrdsp.hf_apply_noise 2023-11-13 18:34:29 +02:00
svq1enc.c tests/checkasm/svq1enc: Use proper range for input 2024-05-09 13:40:18 +02:00
sw_gbrp.c swscale: eliminate redundant SwsInternal accesses 2024-11-25 10:59:52 +01:00
sw_range_convert.c swscale/range_convert: fix mpeg ranges in yuv range conversion for non-8-bit pixel formats 2024-12-05 21:10:29 +01:00
sw_rgb.c swscale: eliminate redundant SwsInternal accesses 2024-11-25 10:59:52 +01:00
sw_scale.c swscale: eliminate redundant SwsInternal accesses 2024-11-25 10:59:52 +01:00
sw_yuv2rgb.c swscale: rename SwsContext to SwsInternal 2024-10-24 22:50:00 +02:00
sw_yuv2yuv.c swscale: rename SwsContext to SwsInternal 2024-10-24 22:50:00 +02:00
synth_filter.c dca_core: convert to lavu/tx 2022-11-06 14:39:36 +01:00
takdsp.c avcodec/takdsp: fix const correctness 2023-12-22 09:28:04 -03:00
utvideodsp.c tests/checkasm: Improve included headers 2024-03-02 02:54:12 +01:00
v210dec.c checkasm/v210dec: add extra space to the destination arrays 2022-12-21 00:36:49 +01:00
v210enc.c checkasm/v210enc: test the entire width of 10-bit planar input arrays 2022-12-01 18:19:03 +01:00
vc1dsp.c checkasm: vc1dsp: Align buffers sufficiently for the mspel tests 2024-04-30 23:13:47 +03:00
vf_blend.c tests/checkasm/vf_blend: Update function type 2024-05-17 13:35:33 +02:00
vf_bwdif.c tests/checkasm/vf_bwdif: Use correct function pointer type 2024-05-17 13:31:37 +02:00
vf_colorspace.c tests/checkasm/vf_colorspace: Use correct function pointer type 2024-05-17 13:31:23 +02:00
vf_convolution.c libavfilter/x86/vf_convolution: add sobel filter optimization and unit test with intel AVX512 VNNI 2022-11-14 10:04:16 +08:00
vf_eq.c lavu: move LOCAL_ALIGNED from internal.h to mem_internal.h 2021-01-01 14:11:01 +01:00
vf_gblur.c avutil/common: Don't auto-include mem.h 2024-03-31 00:08:43 +01:00
vf_hflip.c avfilter/vf_hflip: Move ff_hflip_init into a header 2022-05-06 05:19:50 +02:00
vf_nlmeans.c avutil/common: Don't auto-include mem.h 2024-03-31 00:08:43 +01:00
vf_threshold.c avfilter/vf_threshold: Move ff_threshold_init into a header 2022-05-06 05:19:50 +02:00
videodsp.c lavu: move LOCAL_ALIGNED from internal.h to mem_internal.h 2021-01-01 14:11:01 +01:00
vorbisdsp.c configure: Remove av_restrict 2024-03-15 12:51:15 +01:00
vp8dsp.c checkasm/vp8dsp: add VP7 tests 2024-05-30 18:30:52 +03:00
vp9dsp.c avutil/internal: Don't auto-include emms.h 2023-09-04 11:04:45 +02:00
vvc_alf.c checkasm/vvc_alf: ensure right and bottom boundaries are not overwritten by asm 2024-06-25 19:32:17 +08:00
vvc_mc.c checkasm: add vvc_bdof test 2024-08-31 14:08:54 +08:00