This is an automated email from the git hooks/post-receive script. Git pushed a commit to branch master in repository ffmpeg.
commit 1cfb18f66fa1553855ac328859429ef348af4799 Author: Kacper Michajłow <[email protected]> AuthorDate: Mon Oct 26 14:38:37 2026 +0100 Commit: Kacper Michajłow <[email protected]> CommitDate: Mon Nov 2 07:24:04 2026 +0000 swscale/ppc: set up the coefficient banks outside the AltiVec code ff_sws_init_altivec_bufs() and ff_sws_free_altivec_bufs() run for every context on every CPU and fill the banks with plain C. Keep the bank pointers in SwsInternal as pointers to arrays of 8 int16_t, which need no AltiVec header, and move the two functions to a file without AltiVec code. Signed-off-by: Kacper Michajłow <[email protected]> --- libswscale/ppc/Makefile | 1 + libswscale/ppc/yuv2rgb.c | 57 ++++++++++++++++++++++++++++++++++++++++ libswscale/ppc/yuv2rgb_altivec.c | 41 ++--------------------------- libswscale/swscale_internal.h | 6 ++++- 4 files changed, 65 insertions(+), 40 deletions(-) diff --git a/libswscale/ppc/Makefile b/libswscale/ppc/Makefile index 0a31a3025b..7d28e71bd2 100644 --- a/libswscale/ppc/Makefile +++ b/libswscale/ppc/Makefile @@ -1,4 +1,5 @@ OBJS += ppc/swscale_altivec.o \ + ppc/yuv2rgb.o \ ppc/yuv2rgb_altivec.o \ ppc/yuv2yuv_altivec.o \ ppc/swscale_vsx.o diff --git a/libswscale/ppc/yuv2rgb.c b/libswscale/ppc/yuv2rgb.c new file mode 100644 index 0000000000..a4735b734f --- /dev/null +++ b/libswscale/ppc/yuv2rgb.c @@ -0,0 +1,57 @@ +/* + * This file is part of FFmpeg. + * + * FFmpeg is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * FFmpeg is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with FFmpeg; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + */ + +#include "config.h" + +#include "libavutil/attributes.h" +#include "libavutil/error.h" +#include "libavutil/mem.h" + +#include "libswscale/swscale_internal.h" + +#if HAVE_ALTIVEC +av_cold int ff_sws_init_altivec_bufs(SwsInternal *c) +{ + const SwsContext *const sws = &c->opts; + + c->vYCoeffsBank = av_malloc_array(sws->dst_h, c->vLumFilterSize * sizeof(*c->vYCoeffsBank)); + c->vCCoeffsBank = av_malloc_array(c->chrDstH, c->vChrFilterSize * sizeof(*c->vCCoeffsBank)); + if (!c->vYCoeffsBank || !c->vCCoeffsBank) + return AVERROR(ENOMEM); + + for (int i = 0; i < c->vLumFilterSize * sws->dst_h; ++i) { + short *p = (short *)&c->vYCoeffsBank[i]; + for (int j = 0; j < 8; ++j) + p[j] = c->vLumFilter[i]; + } + + for (int i = 0; i < c->vChrFilterSize * c->chrDstH; ++i) { + short *p = (short *)&c->vCCoeffsBank[i]; + for (int j = 0; j < 8; ++j) + p[j] = c->vChrFilter[i]; + } + + return 0; +} + +av_cold void ff_sws_free_altivec_bufs(SwsInternal *c) +{ + av_freep(&c->vYCoeffsBank); + av_freep(&c->vCCoeffsBank); +} +#endif /* HAVE_ALTIVEC */ diff --git a/libswscale/ppc/yuv2rgb_altivec.c b/libswscale/ppc/yuv2rgb_altivec.c index 1038896ca7..7822ff102a 100644 --- a/libswscale/ppc/yuv2rgb_altivec.c +++ b/libswscale/ppc/yuv2rgb_altivec.c @@ -96,8 +96,6 @@ #include "libswscale/swscale_internal.h" #include "libavutil/attributes.h" #include "libavutil/cpu.h" -#include "libavutil/error.h" -#include "libavutil/mem.h" #include "libavutil/mem_internal.h" #include "libavutil/pixdesc.h" #include "yuv2rgb_altivec.h" @@ -119,7 +117,6 @@ typedef struct SwsInternalAltivec { vector signed short CGV; vector signed short OY; vector unsigned short CSHIFT; - vector signed short *vYCoeffsBank, *vCCoeffsBank; } SwsInternalAltivec; // Check that the sizes of the types match. // Note that given that SwsInternal is always allocated via av_malloc, @@ -685,8 +682,6 @@ static av_always_inline void yuv2packedX_altivec(SwsInternal *c, int dstW, int dstY, enum AVPixelFormat target) { - SwsInternalAltivec *const a = sws_internal_altivec(c); - int i, j; vector signed short X, X0, X1, Y0, U0, V0, Y1, U1, V1, U, V; vector signed short R0, G0, B0, R1, G1, B1; @@ -700,8 +695,8 @@ static av_always_inline void yuv2packedX_altivec(SwsInternal *c, vector signed short *YCoeffs, *CCoeffs; - YCoeffs = a->vYCoeffsBank + dstY * lumFilterSize; - CCoeffs = a->vCCoeffsBank + dstY * chrFilterSize; + YCoeffs = (vector signed short *)(c->vYCoeffsBank + dstY * lumFilterSize); + CCoeffs = (vector signed short *)(c->vCCoeffsBank + dstY * chrFilterSize); out = (vector unsigned char *) dest; @@ -905,36 +900,4 @@ YUV2PACKEDX_WRAPPER(argb, AV_PIX_FMT_ARGB); YUV2PACKEDX_WRAPPER(rgba, AV_PIX_FMT_RGBA); YUV2PACKEDX_WRAPPER(rgb24, AV_PIX_FMT_RGB24); YUV2PACKEDX_WRAPPER(bgr24, AV_PIX_FMT_BGR24); - -av_cold int ff_sws_init_altivec_bufs(SwsInternal *c) -{ - const SwsContext *const sws = &c->opts; - SwsInternalAltivec *const a = sws_internal_altivec(c); - - a->vYCoeffsBank = av_malloc_array(sws->dst_h, c->vLumFilterSize * sizeof(*a->vYCoeffsBank)); - a->vCCoeffsBank = av_malloc_array(c->chrDstH, c->vChrFilterSize * sizeof(*a->vCCoeffsBank)); - if (!a->vYCoeffsBank || !a->vCCoeffsBank) - return AVERROR(ENOMEM); - - for (int i = 0; i < c->vLumFilterSize * sws->dst_h; ++i) { - short *p = (short *)&a->vYCoeffsBank[i]; - for (int j = 0; j < 8; ++j) - p[j] = c->vLumFilter[i]; - } - - for (int i = 0; i < c->vChrFilterSize * c->chrDstH; ++i) { - short *p = (short *)&a->vCCoeffsBank[i]; - for (int j = 0; j < 8; ++j) - p[j] = c->vChrFilter[i]; - } - - return 0; -} - -av_cold void ff_sws_free_altivec_bufs(SwsInternal *c) -{ - SwsInternalAltivec *const a = sws_internal_altivec(c); - av_freep(&a->vYCoeffsBank); - av_freep(&a->vCCoeffsBank); -} #endif /* HAVE_ALTIVEC */ diff --git a/libswscale/swscale_internal.h b/libswscale/swscale_internal.h index dd296f30d1..78b4d6bfd3 100644 --- a/libswscale/swscale_internal.h +++ b/libswscale/swscale_internal.h @@ -41,7 +41,7 @@ #include "libavutil/half2float.h" #if HAVE_ALTIVEC -#define SWSINTERNAL_ADDITIONAL_ASM_SIZE (7*16 + 2*8 + /* alignment */ 16) +#define SWSINTERNAL_ADDITIONAL_ASM_SIZE (7*16 + /* alignment */ 16) #endif #ifndef SWSINTERNAL_ADDITIONAL_ASM_SIZE #define SWSINTERNAL_ADDITIONAL_ASM_SIZE 0 @@ -550,6 +550,10 @@ struct SwsInternal { const uint8_t *chrDither8, *lumDither8; +#if HAVE_ALTIVEC + int16_t (*vYCoeffsBank)[8], (*vCCoeffsBank)[8]; +#endif + int use_mmx_vfilter; SwsColorFunc xyz12Torgb48; -- To stop receiving notification emails like this one, please contact [email protected]. _______________________________________________ ffmpeg-cvslog mailing list -- [email protected] To unsubscribe send an email to [email protected]
