From 4ff3b21de5000d0e7cf0c99485b98671ea831bea Mon Sep 17 00:00:00 2001 From: Andreas Rheinhardt Date: Tue, 27 May 2025 17:09:34 +0200 Subject: [PATCH 3/7] avcodec/pixblockdsp: Improve 8 vs 16 bit check Before this commit, the input in get_pixels and get_pixels_unaligned has been treated inconsistenly: - The generic code treated 9, 10, 12 and 14 bits as 16bit input (these bits correspond to what FFmpeg's dsputils supported), everything with <= 8 bits as 8 bit and everything else as 8 bit when used via AVDCT (which exposes these functions and purports to support up to 14 bits). - AARCH64, ARM, PPC and RISC-V, x86 ignore this AVDCT special case. - RISC-V also ignored the restriction to 9, 10, 12 and 14 for its 16bit check and treated everything > 8 bits as 16bit. - The mmi MIPS code treats everything as 8 bit when used via AVDCT (this is certainly broken); otherwise it checks for <= 8 bits. The msa MIPS code behaves like the generic code. This commit changes this to treat 9..16 bits as 16 bit input, everything else as 8 bit (the former because it makes sense, the latter to preserve the behaviour for external users*). *: The only internal user of AVDCT (the spp filter) always uses 8, 9 or 10 bits. Signed-off-by: Andreas Rheinhardt --- libavcodec/aarch64/pixblockdsp_init_aarch64.c | 2 -- libavcodec/arm/pixblockdsp_init_arm.c | 2 -- libavcodec/mips/pixblockdsp_init_mips.c | 20 ++--------- libavcodec/pixblockdsp.c | 33 ++++++++----------- libavcodec/pixblockdsp.h | 12 +++---- libavcodec/ppc/pixblockdsp.c | 2 -- libavcodec/riscv/pixblockdsp_init.c | 2 -- libavcodec/x86/pixblockdsp_init.c | 1 - 8 files changed, 22 insertions(+), 52 deletions(-) diff --git a/libavcodec/aarch64/pixblockdsp_init_aarch64.c b/libavcodec/aarch64/pixblockdsp_init_aarch64.c index e4bac722f8..404f3680a6 100644 --- a/libavcodec/aarch64/pixblockdsp_init_aarch64.c +++ b/libavcodec/aarch64/pixblockdsp_init_aarch64.c @@ -21,7 +21,6 @@ #include "libavutil/attributes.h" #include "libavutil/cpu.h" #include "libavutil/aarch64/cpu.h" -#include "libavcodec/avcodec.h" #include "libavcodec/pixblockdsp.h" void ff_get_pixels_neon(int16_t *block, const uint8_t *pixels, @@ -30,7 +29,6 @@ void ff_diff_pixels_neon(int16_t *block, const uint8_t *s1, const uint8_t *s2, ptrdiff_t stride); av_cold void ff_pixblockdsp_init_aarch64(PixblockDSPContext *c, - AVCodecContext *avctx, unsigned high_bit_depth) { int cpu_flags = av_get_cpu_flags(); diff --git a/libavcodec/arm/pixblockdsp_init_arm.c b/libavcodec/arm/pixblockdsp_init_arm.c index 5481c0178c..121338ad0c 100644 --- a/libavcodec/arm/pixblockdsp_init_arm.c +++ b/libavcodec/arm/pixblockdsp_init_arm.c @@ -21,7 +21,6 @@ #include "libavutil/attributes.h" #include "libavutil/cpu.h" #include "libavutil/arm/cpu.h" -#include "libavcodec/avcodec.h" #include "libavcodec/pixblockdsp.h" void ff_get_pixels_armv6(int16_t *block, const uint8_t *pixels, @@ -39,7 +38,6 @@ void ff_diff_pixels_unaligned_neon(int16_t *block, const uint8_t *s1, const uint8_t *s2, ptrdiff_t stride); av_cold void ff_pixblockdsp_init_arm(PixblockDSPContext *c, - AVCodecContext *avctx, unsigned high_bit_depth) { int cpu_flags = av_get_cpu_flags(); diff --git a/libavcodec/mips/pixblockdsp_init_mips.c b/libavcodec/mips/pixblockdsp_init_mips.c index 00f189d558..acea95d36e 100644 --- a/libavcodec/mips/pixblockdsp_init_mips.c +++ b/libavcodec/mips/pixblockdsp_init_mips.c @@ -23,7 +23,7 @@ #include "libavcodec/pixblockdsp.h" #include "pixblockdsp_mips.h" -void ff_pixblockdsp_init_mips(PixblockDSPContext *c, AVCodecContext *avctx, +void ff_pixblockdsp_init_mips(PixblockDSPContext *c, unsigned high_bit_depth) { int cpu_flags = av_get_cpu_flags(); @@ -31,27 +31,13 @@ void ff_pixblockdsp_init_mips(PixblockDSPContext *c, AVCodecContext *avctx, if (have_mmi(cpu_flags)) { c->diff_pixels = ff_diff_pixels_mmi; - if (!high_bit_depth || avctx->codec_type != AVMEDIA_TYPE_VIDEO) { + if (!high_bit_depth) c->get_pixels = ff_get_pixels_8_mmi; - } } if (have_msa(cpu_flags)) { c->diff_pixels = ff_diff_pixels_msa; - switch (avctx->bits_per_raw_sample) { - case 9: - case 10: - case 12: - case 14: - c->get_pixels = ff_get_pixels_16_msa; - break; - default: - if (avctx->bits_per_raw_sample <= 8 || avctx->codec_type != - AVMEDIA_TYPE_VIDEO) { - c->get_pixels = ff_get_pixels_8_msa; - } - break; - } + c->get_pixels = high_bit_depth ? ff_get_pixels_16_msa : ff_get_pixels_8_msa; } } diff --git a/libavcodec/pixblockdsp.c b/libavcodec/pixblockdsp.c index 1fff244511..78f1f9b5c7 100644 --- a/libavcodec/pixblockdsp.c +++ b/libavcodec/pixblockdsp.c @@ -87,38 +87,31 @@ static void diff_pixels_c(int16_t *restrict block, const uint8_t *s1, av_cold void ff_pixblockdsp_init(PixblockDSPContext *c, AVCodecContext *avctx) { - av_unused const unsigned high_bit_depth = avctx->bits_per_raw_sample > 8; + const unsigned high_bit_depth = avctx->bits_per_raw_sample > 8 && + avctx->bits_per_raw_sample <= 16; c->diff_pixels_unaligned = c->diff_pixels = diff_pixels_c; - switch (avctx->bits_per_raw_sample) { - case 9: - case 10: - case 12: - case 14: + if (high_bit_depth) { c->get_pixels_unaligned = get_pixels_unaligned_16_c; - c->get_pixels = get_pixels_16_c; - break; - default: - if (avctx->bits_per_raw_sample<=8 || avctx->codec_type != AVMEDIA_TYPE_VIDEO) { - c->get_pixels_unaligned = - c->get_pixels = get_pixels_8_c; - } - break; + c->get_pixels = get_pixels_16_c; + } else { + c->get_pixels_unaligned = + c->get_pixels = get_pixels_8_c; } #if ARCH_AARCH64 - ff_pixblockdsp_init_aarch64(c, avctx, high_bit_depth); + ff_pixblockdsp_init_aarch64(c, high_bit_depth); #elif ARCH_ARM - ff_pixblockdsp_init_arm(c, avctx, high_bit_depth); + ff_pixblockdsp_init_arm(c, high_bit_depth); #elif ARCH_PPC - ff_pixblockdsp_init_ppc(c, avctx, high_bit_depth); + ff_pixblockdsp_init_ppc(c, high_bit_depth); #elif ARCH_RISCV - ff_pixblockdsp_init_riscv(c, avctx, high_bit_depth); + ff_pixblockdsp_init_riscv(c, high_bit_depth); #elif ARCH_X86 - ff_pixblockdsp_init_x86(c, avctx, high_bit_depth); + ff_pixblockdsp_init_x86(c, high_bit_depth); #elif ARCH_MIPS - ff_pixblockdsp_init_mips(c, avctx, high_bit_depth); + ff_pixblockdsp_init_mips(c, high_bit_depth); #endif } diff --git a/libavcodec/pixblockdsp.h b/libavcodec/pixblockdsp.h index 215b0905d7..999aa8a926 100644 --- a/libavcodec/pixblockdsp.h +++ b/libavcodec/pixblockdsp.h @@ -42,17 +42,17 @@ typedef struct PixblockDSPContext { } PixblockDSPContext; void ff_pixblockdsp_init(PixblockDSPContext *c, AVCodecContext *avctx); -void ff_pixblockdsp_init_aarch64(PixblockDSPContext *c, AVCodecContext *avctx, +void ff_pixblockdsp_init_aarch64(PixblockDSPContext *c, unsigned high_bit_depth); -void ff_pixblockdsp_init_arm(PixblockDSPContext *c, AVCodecContext *avctx, +void ff_pixblockdsp_init_arm(PixblockDSPContext *c, unsigned high_bit_depth); -void ff_pixblockdsp_init_ppc(PixblockDSPContext *c, AVCodecContext *avctx, +void ff_pixblockdsp_init_ppc(PixblockDSPContext *c, unsigned high_bit_depth); -void ff_pixblockdsp_init_riscv(PixblockDSPContext *c, AVCodecContext *avctx, +void ff_pixblockdsp_init_riscv(PixblockDSPContext *c, unsigned high_bit_depth); -void ff_pixblockdsp_init_x86(PixblockDSPContext *c, AVCodecContext *avctx, +void ff_pixblockdsp_init_x86(PixblockDSPContext *c, unsigned high_bit_depth); -void ff_pixblockdsp_init_mips(PixblockDSPContext *c, AVCodecContext *avctx, +void ff_pixblockdsp_init_mips(PixblockDSPContext *c, unsigned high_bit_depth); #endif /* AVCODEC_PIXBLOCKDSP_H */ diff --git a/libavcodec/ppc/pixblockdsp.c b/libavcodec/ppc/pixblockdsp.c index 01d14b4124..75287b1e85 100644 --- a/libavcodec/ppc/pixblockdsp.c +++ b/libavcodec/ppc/pixblockdsp.c @@ -27,7 +27,6 @@ #include "libavutil/ppc/cpu.h" #include "libavutil/ppc/util_altivec.h" -#include "libavcodec/avcodec.h" #include "libavcodec/pixblockdsp.h" #if HAVE_ALTIVEC @@ -263,7 +262,6 @@ static void diff_pixels_vsx(int16_t *restrict block, const uint8_t *s1, #endif /* HAVE_VSX */ av_cold void ff_pixblockdsp_init_ppc(PixblockDSPContext *c, - AVCodecContext *avctx, unsigned high_bit_depth) { #if HAVE_ALTIVEC diff --git a/libavcodec/riscv/pixblockdsp_init.c b/libavcodec/riscv/pixblockdsp_init.c index 28caa99dff..e59fba63cc 100644 --- a/libavcodec/riscv/pixblockdsp_init.c +++ b/libavcodec/riscv/pixblockdsp_init.c @@ -24,7 +24,6 @@ #include "libavutil/attributes.h" #include "libavutil/cpu.h" #include "libavutil/riscv/cpu.h" -#include "libavcodec/avcodec.h" #include "libavcodec/pixblockdsp.h" void ff_get_pixels_8_rvi(int16_t *block, const uint8_t *pixels, @@ -42,7 +41,6 @@ void ff_diff_pixels_unaligned_rvv(int16_t *block, const uint8_t *s1, const uint8_t *s2, ptrdiff_t stride); av_cold void ff_pixblockdsp_init_riscv(PixblockDSPContext *c, - AVCodecContext *avctx, unsigned high_bit_depth) { #if HAVE_RV diff --git a/libavcodec/x86/pixblockdsp_init.c b/libavcodec/x86/pixblockdsp_init.c index 51f2a0033a..f105775c2b 100644 --- a/libavcodec/x86/pixblockdsp_init.c +++ b/libavcodec/x86/pixblockdsp_init.c @@ -28,7 +28,6 @@ void ff_diff_pixels_sse2(int16_t *block, const uint8_t *s1, const uint8_t *s2, ptrdiff_t stride); av_cold void ff_pixblockdsp_init_x86(PixblockDSPContext *c, - AVCodecContext *avctx, unsigned high_bit_depth) { int cpu_flags = av_get_cpu_flags(); -- 2.45.2