[FFmpeg-cvslog] avcodec/pixblockdsp: Improve 8 vs 16 bit check

Andreas Rheinhardt git at videolan.org
Sat May 31 02:52:53 EEST 2025


ffmpeg | branch: master | Andreas Rheinhardt <andreas.rheinhardt at outlook.com> | Tue May 27 17:09:34 2025 +0200| [20ddada2a3c3e19ca8cbdf58650818efc7569ed4] | committer: Andreas Rheinhardt

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 <andreas.rheinhardt at outlook.com>

> http://git.videolan.org/gitweb.cgi/ffmpeg.git/?a=commit;h=20ddada2a3c3e19ca8cbdf58650818efc7569ed4
---

 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();



More information about the ffmpeg-cvslog mailing list