swscale/ppc: check the CPU flags outside the AltiVec files

The PPC init functions run on every CPU to check whether AltiVec and VSX
are available, so they must not be built with the AltiVec and VSX flags
that the code next to them needs. Move the checks to swscale.c,
yuv2rgb.c and yuv2yuv.c, which hold no AltiVec code and call init
functions in the AltiVec and VSX files after them.

Signed-off-by: Kacper Michajłow <kasper93@gmail.com>
This commit is contained in:
Kacper Michajłow committed 2026-11-02 07:24:04 +00:00
1 parent 1cfb18f66f
commit 9ff448c18a
9 files changed
+105 -29

No files matched your search

+3 -1
View File
@@ -1,5 +1,7 @@
OBJS += ppc/swscale_altivec.o \
OBJS += ppc/swscale.o \
ppc/swscale_altivec.o \
ppc/yuv2rgb.o \
ppc/yuv2rgb_altivec.o \
ppc/yuv2yuv.o \
ppc/yuv2yuv_altivec.o \
ppc/swscale_vsx.o
+33
View File
@@ -0,0 +1,33 @@
/*
* 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 "libavutil/attributes.h"
#include "libavutil/cpu.h"
#include "libavutil/ppc/cpu.h"
#include "libswscale/swscale_internal.h"
av_cold void ff_sws_init_swscale_ppc(SwsInternal *c)
{
int cpu_flags = av_get_cpu_flags();
if (PPC_ALTIVEC(cpu_flags))
ff_sws_init_swscale_altivec(c);
if (PPC_VSX(cpu_flags))
ff_sws_init_swscale_vsx(c);
}
+1 -7
View File
@@ -27,7 +27,6 @@
#include "libswscale/swscale.h"
#include "libswscale/swscale_internal.h"
#include "libavutil/attributes.h"
#include "libavutil/cpu.h"
#include "libavutil/intfloat.h"
#include "yuv2rgb_altivec.h"
#include "libavutil/ppc/util_altivec.h"
@@ -230,14 +229,11 @@ yuv2plane1_float(yuv2plane1_float_bswap_altivec, uint32_t, BE)
#endif /* HAVE_ALTIVEC */
av_cold void ff_sws_init_swscale_ppc(SwsInternal *c)
av_cold void ff_sws_init_swscale_altivec(SwsInternal *c)
{
#if HAVE_ALTIVEC
enum AVPixelFormat dstFormat = c->opts.dst_format;
if (!(av_get_cpu_flags() & AV_CPU_FLAG_ALTIVEC))
return;
#if HAVE_BIGENDIAN
if (c->srcBpc == 8 && c->dstBpc <= 14) {
c->hyScale = c->hcScale = hScale_real_altivec;
@@ -280,6 +276,4 @@ av_cold void ff_sws_init_swscale_ppc(SwsInternal *c)
}
}
#endif /* HAVE_ALTIVEC */
ff_sws_init_swscale_vsx(c);
}
-3
View File
@@ -2023,9 +2023,6 @@ av_cold void ff_sws_init_swscale_vsx(SwsInternal *c)
const int cpu_flags = av_get_cpu_flags();
const unsigned char power8 = HAVE_POWER8 && cpu_flags & AV_CPU_FLAG_POWER8;
if (!(cpu_flags & AV_CPU_FLAG_VSX))
return;
#if !HAVE_BIGENDIAN
if (c->srcBpc == 8) {
if (c->dstBpc <= 14) {
+25
View File
@@ -19,11 +19,36 @@
#include "config.h"
#include "libavutil/attributes.h"
#include "libavutil/cpu.h"
#include "libavutil/error.h"
#include "libavutil/mem.h"
#include "libavutil/ppc/cpu.h"
#include "libswscale/swscale_internal.h"
av_cold SwsFunc ff_yuv2rgb_init_ppc(SwsInternal *c)
{
int cpu_flags = av_get_cpu_flags();
if (PPC_ALTIVEC(cpu_flags))
return ff_yuv2rgb_init_altivec(c);
return NULL;
}
av_cold void ff_yuv2rgb_init_tables_ppc(SwsInternal *c,
const int inv_table[4],
int brightness,
int contrast,
int saturation)
{
int cpu_flags = av_get_cpu_flags();
if (PPC_ALTIVEC(cpu_flags))
ff_yuv2rgb_init_tables_altivec(c, inv_table, brightness, contrast,
saturation);
}
#if HAVE_ALTIVEC
av_cold int ff_sws_init_altivec_bufs(SwsInternal *c)
{
+6 -13
View File
@@ -95,7 +95,6 @@
#include "libswscale/swscale.h"
#include "libswscale/swscale_internal.h"
#include "libavutil/attributes.h"
#include "libavutil/cpu.h"
#include "libavutil/mem_internal.h"
#include "libavutil/pixdesc.h"
#include "yuv2rgb_altivec.h"
@@ -561,12 +560,9 @@ static int altivec_uyvy_rgb32(SwsInternal *c, const unsigned char *const *in,
*
* So we just fall back to the C codes for this.
*/
av_cold SwsFunc ff_yuv2rgb_init_ppc(SwsInternal *c)
av_cold SwsFunc ff_yuv2rgb_init_altivec(SwsInternal *c)
{
#if HAVE_ALTIVEC
if (!(av_get_cpu_flags() & AV_CPU_FLAG_ALTIVEC))
return NULL;
/*
* and this seems not to matter too much I tried a bunch of
* videos with abnormal widths and MPlayer crashes elsewhere.
@@ -632,11 +628,11 @@ av_cold SwsFunc ff_yuv2rgb_init_ppc(SwsInternal *c)
return NULL;
}
av_cold void ff_yuv2rgb_init_tables_ppc(SwsInternal *c,
const int inv_table[4],
int brightness,
int contrast,
int saturation)
av_cold void ff_yuv2rgb_init_tables_altivec(SwsInternal *c,
const int inv_table[4],
int brightness,
int contrast,
int saturation)
{
#if HAVE_ALTIVEC
SwsInternalAltivec *const a = sws_internal_altivec(c);
@@ -646,9 +642,6 @@ av_cold void ff_yuv2rgb_init_tables_ppc(SwsInternal *c,
vector signed short vec;
} buf;
if (!(av_get_cpu_flags() & AV_CPU_FLAG_ALTIVEC))
return;
buf.tmp[0] = ((0xffffLL) * contrast >> 8) >> 9; // cy
buf.tmp[1] = -256 * brightness; // oy
buf.tmp[2] = (inv_table[0] >> 3) * (contrast >> 16) * (saturation >> 16); // crv
+31
View File
@@ -0,0 +1,31 @@
/*
* 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 "libavutil/attributes.h"
#include "libavutil/cpu.h"
#include "libavutil/ppc/cpu.h"
#include "libswscale/swscale_internal.h"
av_cold void ff_get_unscaled_swscale_ppc(SwsInternal *c)
{
int cpu_flags = av_get_cpu_flags();
if (PPC_ALTIVEC(cpu_flags))
ff_get_unscaled_swscale_altivec(c);
}
+1 -5
View File
@@ -25,7 +25,6 @@
#include "config.h"
#include "libavutil/attributes.h"
#include "libavutil/cpu.h"
#include "libswscale/swscale.h"
#include "libswscale/swscale_internal.h"
@@ -185,12 +184,9 @@ static int yv12touyvy_unscaled_altivec(SwsInternal *c, const uint8_t *const src[
#endif /* HAVE_ALTIVEC */
av_cold void ff_get_unscaled_swscale_ppc(SwsInternal *c)
av_cold void ff_get_unscaled_swscale_altivec(SwsInternal *c)
{
#if HAVE_ALTIVEC
if (!(av_get_cpu_flags() & AV_CPU_FLAG_ALTIVEC))
return;
if (!(c->opts.src_w & 15) && !(c->opts.flags & SWS_BITEXACT) &&
c->opts.src_format == AV_PIX_FMT_YUV420P) {
enum AVPixelFormat dstFormat = c->opts.dst_format;
+5
View File
@@ -723,6 +723,8 @@ int ff_yuv2rgb_c_init_tables(SwsInternal *c, const int inv_table[4],
int contrast, int saturation);
void ff_yuv2rgb_init_tables_ppc(SwsInternal *c, const int inv_table[4],
int brightness, int contrast, int saturation);
void ff_yuv2rgb_init_tables_altivec(SwsInternal *c, const int inv_table[4],
int brightness, int contrast, int saturation);
void ff_updateMMXDitherTables(SwsInternal *c, int dstY);
@@ -741,6 +743,7 @@ av_cold int ff_sws_fill_st428_tables(SwsInternal *c);
SwsFunc ff_yuv2rgb_init_x86(SwsInternal *c);
SwsFunc ff_yuv2rgb_init_ppc(SwsInternal *c);
SwsFunc ff_yuv2rgb_init_altivec(SwsInternal *c);
SwsFunc ff_yuv2rgb_init_loongarch(SwsInternal *c);
SwsFunc ff_yuv2rgb_init_aarch64(SwsInternal *c);
@@ -1012,6 +1015,7 @@ int ff_sws_init_single_context(SwsContext *sws, SwsFilter *srcFilter,
*/
void ff_get_unscaled_swscale(SwsInternal *c);
void ff_get_unscaled_swscale_ppc(SwsInternal *c);
void ff_get_unscaled_swscale_altivec(SwsInternal *c);
void ff_get_unscaled_swscale_arm(SwsInternal *c);
void ff_get_unscaled_swscale_aarch64(SwsInternal *c);
void ff_get_unscaled_swscale_loongarch(SwsInternal *c);
@@ -1034,6 +1038,7 @@ void ff_sws_init_output_funcs(SwsInternal *c,
yuv2packedX_fn *yuv2packedX,
yuv2anyX_fn *yuv2anyX);
void ff_sws_init_swscale_ppc(SwsInternal *c);
void ff_sws_init_swscale_altivec(SwsInternal *c);
void ff_sws_init_swscale_vsx(SwsInternal *c);
void ff_sws_init_swscale_x86(SwsInternal *c);
void ff_sws_init_swscale_aarch64(SwsInternal *c);