diff --git a/libswscale/Makefile b/libswscale/Makefile index 8ecce99195..7a0d129933 100644 --- a/libswscale/Makefile +++ b/libswscale/Makefile @@ -11,7 +11,8 @@ OBJS-$(ARCH_BFIN) += bfin/internal_bfin.o \ bfin/swscale_bfin.o \ bfin/yuv2rgb_bfin.o OBJS-$(CONFIG_MLIB) += mlib/yuv2rgb_mlib.o -OBJS-$(HAVE_ALTIVEC) += ppc/yuv2rgb_altivec.o \ +OBJS-$(HAVE_ALTIVEC) += ppc/swscale_altivec.o \ + ppc/yuv2rgb_altivec.o \ ppc/yuv2yuv_altivec.o OBJS-$(HAVE_MMX) += x86/rgb2rgb.o \ x86/yuv2rgb_mmx.o diff --git a/libswscale/ppc/swscale_altivec_template.c b/libswscale/ppc/swscale_altivec.c similarity index 96% rename from libswscale/ppc/swscale_altivec_template.c rename to libswscale/ppc/swscale_altivec.c index 3c31c3e130..acfdc94cd8 100644 --- a/libswscale/ppc/swscale_altivec_template.c +++ b/libswscale/ppc/swscale_altivec.c @@ -21,6 +21,13 @@ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ +#include +#include "config.h" +#include "libswscale/swscale.h" +#include "libswscale/swscale_internal.h" +#include "libavutil/cpu.h" +#include "yuv2rgb_altivec.h" + #define vzero vec_splat_s32(0) static inline void @@ -214,10 +221,10 @@ yuv2yuvX_altivec_real(SwsContext *c, } } -static inline void hScale_altivec_real(int16_t *dst, int dstW, - const uint8_t *src, int srcW, - int xInc, const int16_t *filter, - const int16_t *filterPos, int filterSize) +static void hScale_altivec_real(int16_t *dst, int dstW, + const uint8_t *src, int srcW, + int xInc, const int16_t *filter, + const int16_t *filterPos, int filterSize) { register int i; DECLARE_ALIGNED(16, int, tempo)[4]; @@ -394,8 +401,11 @@ static inline void hScale_altivec_real(int16_t *dst, int dstW, } } -static void RENAME(sws_init_swScale)(SwsContext *c) +void ff_sws_init_swScale_altivec(SwsContext *c) { + if (!(av_get_cpu_flags() & AV_CPU_FLAG_ALTIVEC)) + return; + c->yuv2yuvX = yuv2yuvX_altivec_real; /* The following list of supported dstFormat values should diff --git a/libswscale/ppc/yuv2rgb_altivec.c b/libswscale/ppc/yuv2rgb_altivec.c index 4b2bdafca0..476db22489 100644 --- a/libswscale/ppc/yuv2rgb_altivec.c +++ b/libswscale/ppc/yuv2rgb_altivec.c @@ -95,6 +95,7 @@ adjustment. #include "libswscale/swscale.h" #include "libswscale/swscale_internal.h" #include "libavutil/cpu.h" +#include "yuv2rgb_altivec.h" #undef PROFILE_THE_BEAST #undef INC_SCALING diff --git a/libswscale/ppc/yuv2rgb_altivec.h b/libswscale/ppc/yuv2rgb_altivec.h new file mode 100644 index 0000000000..b54a856905 --- /dev/null +++ b/libswscale/ppc/yuv2rgb_altivec.h @@ -0,0 +1,34 @@ +/* + * AltiVec-enhanced yuv2yuvX + * + * Copyright (C) 2004 Romain Dolbeau + * based on the equivalent C code in swscale.c + * + * This file is part of Libav. + * + * Libav 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. + * + * Libav 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 Libav; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + */ + +#ifndef PPC_YUV2RGB_ALTIVEC_H +#define PPC_YUV2RGB_ALTIVEC_H 1 + +void ff_yuv2packedX_altivec(SwsContext *c, const int16_t *lumFilter, + const int16_t **lumSrc, int lumFilterSize, + const int16_t *chrFilter, const int16_t **chrUSrc, + const int16_t **chrVSrc, int chrFilterSize, + const int16_t **alpSrc, uint8_t *dest, + int dstW, int dstY); + +#endif /* PPC_YUV2RGB_ALTIVEC_H */ diff --git a/libswscale/swscale.c b/libswscale/swscale.c index f15495de36..1fc3155ae5 100644 --- a/libswscale/swscale.c +++ b/libswscale/swscale.c @@ -1189,12 +1189,6 @@ static inline void monoblack2Y(uint8_t *dst, const uint8_t *src, int width, uint #include "swscale_template.c" -#if HAVE_ALTIVEC -#undef RENAME -#define RENAME(a) a ## _altivec -#include "ppc/swscale_altivec_template.c" -#endif - //MMX versions #if HAVE_MMX #undef RENAME @@ -1227,10 +1221,8 @@ SwsFunc ff_getSwsFunc(SwsContext *c) if (cpu_flags & AV_CPU_FLAG_MMX2) sws_init_swScale_MMX2(c); #endif -#if HAVE_ALTIVEC - if (cpu_flags & AV_CPU_FLAG_ALTIVEC) - sws_init_swScale_altivec(c); -#endif + if (HAVE_ALTIVEC) + ff_sws_init_swScale_altivec(c); return swScale_c; } diff --git a/libswscale/swscale_internal.h b/libswscale/swscale_internal.h index 09d122418f..15643ae337 100644 --- a/libswscale/swscale_internal.h +++ b/libswscale/swscale_internal.h @@ -335,11 +335,6 @@ SwsFunc ff_yuv2rgb_init_mlib(SwsContext *c); SwsFunc ff_yuv2rgb_init_altivec(SwsContext *c); SwsFunc ff_yuv2rgb_get_func_ptr_bfin(SwsContext *c); void ff_bfin_get_unscaled_swscale(SwsContext *c); -void ff_yuv2packedX_altivec(SwsContext *c, const int16_t *lumFilter, - const int16_t **lumSrc, int lumFilterSize, - const int16_t *chrFilter, const int16_t **chrUSrc, - const int16_t **chrVSrc, int chrFilterSize, - uint8_t *dest, int dstW, int dstY); const char *sws_format_name(enum PixelFormat format); @@ -487,4 +482,6 @@ void ff_swscale_get_unscaled_altivec(SwsContext *c); */ SwsFunc ff_getSwsFunc(SwsContext *c); +void ff_sws_init_swScale_altivec(SwsContext *c); + #endif /* SWSCALE_SWSCALE_INTERNAL_H */