From 5f5ea7a21858e7194bc0e455fd5bc45897bfbc83 Mon Sep 17 00:00:00 2001 From: Andreas Rheinhardt Date: Tue, 27 May 2025 21:46:06 +0200 Subject: [PATCH 6/7] avcodec/asvenc,dvenc: Optimize unaligned checks away if possible For certain arches (AARCH64, x86, generic) get_pixels and get_pixels_unaligned always coincide for 8 bit input. In these cases it is possible to avoid checks for unaligned input in asvenc, dvenc. Signed-off-by: Andreas Rheinhardt --- libavcodec/asvenc.c | 7 ++++--- libavcodec/dvenc.c | 7 ++++--- libavcodec/pixblockdsp.h | 7 ++++++- 3 files changed, 14 insertions(+), 7 deletions(-) diff --git a/libavcodec/asvenc.c b/libavcodec/asvenc.c index 159b070821..883edd0468 100644 --- a/libavcodec/asvenc.c +++ b/libavcodec/asvenc.c @@ -301,9 +301,10 @@ static int encode_frame(AVCodecContext *avctx, AVPacket *pkt, if (ret < 0) return ret; - if ((uintptr_t)pict->data[0] & 7 || pict->linesize[0] & 7 || - (uintptr_t)pict->data[1] & 7 || pict->linesize[1] & 7 || - (uintptr_t)pict->data[2] & 7 || pict->linesize[2] & 7) + if (!PIXBLOCKDSP_8BPP_GET_PIXELS_SUPPORTS_UNALIGNED && + ((uintptr_t)pict->data[0] & 7 || pict->linesize[0] & 7 || + (uintptr_t)pict->data[1] & 7 || pict->linesize[1] & 7 || + (uintptr_t)pict->data[2] & 7 || pict->linesize[2] & 7)) a->get_pixels = a->pdsp.get_pixels_unaligned; else a->get_pixels = a->pdsp.get_pixels; diff --git a/libavcodec/dvenc.c b/libavcodec/dvenc.c index b6764e9c2c..a477b84261 100644 --- a/libavcodec/dvenc.c +++ b/libavcodec/dvenc.c @@ -1200,9 +1200,10 @@ static int dvvideo_encode_frame(AVCodecContext *c, AVPacket *pkt, DVEncContext *s = c->priv_data; int ret; - if ((uintptr_t)frame->data[0] & 7 || frame->linesize[0] & 7 || - (uintptr_t)frame->data[1] & 7 || frame->linesize[1] & 7 || - (uintptr_t)frame->data[2] & 7 || frame->linesize[2] & 7) + if (!PIXBLOCKDSP_8BPP_GET_PIXELS_SUPPORTS_UNALIGNED && + ((uintptr_t)frame->data[0] & 7 || frame->linesize[0] & 7 || + (uintptr_t)frame->data[1] & 7 || frame->linesize[1] & 7 || + (uintptr_t)frame->data[2] & 7 || frame->linesize[2] & 7)) s->get_pixels = s->pdsp.get_pixels_unaligned; else s->get_pixels = s->pdsp.get_pixels; diff --git a/libavcodec/pixblockdsp.h b/libavcodec/pixblockdsp.h index 8d767b2fd3..d493d0e22b 100644 --- a/libavcodec/pixblockdsp.h +++ b/libavcodec/pixblockdsp.h @@ -22,9 +22,14 @@ #include #include +#define PIXBLOCKDSP_8BPP_GET_PIXELS_SUPPORTS_UNALIGNED \ + !(ARCH_ARM || ARCH_MIPS || ARCH_PPC || ARCH_RISCV) + typedef struct PixblockDSPContext { void (*get_pixels)(int16_t *restrict block /* align 16 */, - const uint8_t *pixels /* align 8 for <= 8 bit, 16 otherwise */, + /* align 16 for > 8 bits; align 8 for <= 8 bits + * (or 1 if PIXBLOCKDSP_8BPP_GET_PIXELS_SUPPORTS_UNALIGNED is set) */ + const uint8_t *pixels, ptrdiff_t stride); void (*get_pixels_unaligned)(int16_t *restrict block /* align 16 */, const uint8_t *pixels, -- 2.45.2