[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