From: Jean-Baptiste Kempf <[email protected]> Assign NEON specific function pointers after runtime check via av_get_cpu_flags().
Signed-off-by: Janne Grunau <[email protected]> --- rv*dsp init stuff still looks weird after this due to use of its own DSP context and the general dsputil context. It copies then function pointers from the dsputil context to its own context to reuse some h264 functions. rv40dsp_init_arm.c holds arm and neon init functions like h264dsp_init_arm.c and h264pred_init_arm.c. libavcodec/arm/Makefile | 12 ++++++------ .../arm/{rv34dsp_init_neon.c => rv34dsp_init_arm.c} | 15 ++++++++++----- .../arm/{rv40dsp_init_neon.c => rv40dsp_init_arm.c} | 11 ++++++++++- libavcodec/rv34dsp.c | 4 ++-- libavcodec/rv34dsp.h | 4 ++-- libavcodec/rv40dsp.c | 4 ++-- 6 files changed, 32 insertions(+), 18 deletions(-) rename libavcodec/arm/{rv34dsp_init_neon.c => rv34dsp_init_arm.c} (73%) rename libavcodec/arm/{rv40dsp_init_neon.c => rv40dsp_init_arm.c} (96%) diff --git a/libavcodec/arm/Makefile b/libavcodec/arm/Makefile index 745a5bd..e4a1635 100644 --- a/libavcodec/arm/Makefile +++ b/libavcodec/arm/Makefile @@ -25,6 +25,10 @@ ARMV6-OBJS-$(CONFIG_VP8_DECODER) += arm/vp8_armv6.o \ OBJS-$(CONFIG_H264DSP) += arm/h264dsp_init_arm.o OBJS-$(CONFIG_H264PRED) += arm/h264pred_init_arm.o +OBJS-$(CONFIG_RV30_DECODER) += arm/rv34dsp_init_arm.o +OBJS-$(CONFIG_RV40_DECODER) += arm/rv34dsp_init_arm.o \ + arm/rv40dsp_init_arm.o \ + OBJS += arm/dsputil_init_arm.o \ arm/dsputil_arm.o \ arm/fft_init_arm.o \ @@ -70,12 +74,8 @@ NEON-OBJS-$(CONFIG_AAC_DECODER) += arm/sbrdsp_neon.o \ NEON-OBJS-$(CONFIG_DCA_DECODER) += arm/dcadsp_neon.o \ arm/synth_filter_neon.o \ -NEON-OBJS-$(CONFIG_RV30_DECODER) += arm/rv34dsp_init_neon.o \ - arm/rv34dsp_neon.o \ - -NEON-OBJS-$(CONFIG_RV40_DECODER) += arm/rv34dsp_init_neon.o \ - arm/rv34dsp_neon.o \ - arm/rv40dsp_init_neon.o \ +NEON-OBJS-$(CONFIG_RV30_DECODER) += arm/rv34dsp_neon.o +NEON-OBJS-$(CONFIG_RV40_DECODER) += arm/rv34dsp_neon.o \ arm/rv40dsp_neon.o \ arm/h264cmc_neon.o \ diff --git a/libavcodec/arm/rv34dsp_init_neon.c b/libavcodec/arm/rv34dsp_init_arm.c similarity index 73% rename from libavcodec/arm/rv34dsp_init_neon.c rename to libavcodec/arm/rv34dsp_init_arm.c index b4a2f01..07f5598 100644 --- a/libavcodec/arm/rv34dsp_init_neon.c +++ b/libavcodec/arm/rv34dsp_init_arm.c @@ -22,6 +22,7 @@ #include "libavcodec/avcodec.h" #include "libavcodec/rv34dsp.h" +#include "libavutil/arm/cpu.h" void ff_rv34_inv_transform_noround_neon(DCTELEM *block); @@ -30,11 +31,15 @@ void ff_rv34_inv_transform_noround_dc_neon(DCTELEM *block); void ff_rv34_idct_add_neon(uint8_t *dst, ptrdiff_t stride, DCTELEM *block); void ff_rv34_idct_dc_add_neon(uint8_t *dst, ptrdiff_t stride, int dc); -void ff_rv34dsp_init_neon(RV34DSPContext *c, DSPContext* dsp) +void ff_rv34dsp_init_arm(RV34DSPContext *c, DSPContext* dsp) { - c->rv34_inv_transform = ff_rv34_inv_transform_noround_neon; - c->rv34_inv_transform_dc = ff_rv34_inv_transform_noround_dc_neon; + int cpu_flags = av_get_cpu_flags(); - c->rv34_idct_add = ff_rv34_idct_add_neon; - c->rv34_idct_dc_add = ff_rv34_idct_dc_add_neon; + if (have_neon(cpu_flags)) { + c->rv34_inv_transform = ff_rv34_inv_transform_noround_neon; + c->rv34_inv_transform_dc = ff_rv34_inv_transform_noround_dc_neon; + + c->rv34_idct_add = ff_rv34_idct_add_neon; + c->rv34_idct_dc_add = ff_rv34_idct_dc_add_neon; + } } diff --git a/libavcodec/arm/rv40dsp_init_neon.c b/libavcodec/arm/rv40dsp_init_arm.c similarity index 96% rename from libavcodec/arm/rv40dsp_init_neon.c rename to libavcodec/arm/rv40dsp_init_arm.c index 2ce50a2..83f4355 100644 --- a/libavcodec/arm/rv40dsp_init_neon.c +++ b/libavcodec/arm/rv40dsp_init_arm.c @@ -22,6 +22,7 @@ #include "libavcodec/avcodec.h" #include "libavcodec/rv34dsp.h" +#include "libavutil/arm/cpu.h" #define DECL_QPEL3(type, w, pos) \ void ff_##type##_rv40_qpel##w##_mc##pos##_neon(uint8_t *dst, uint8_t *src,\ @@ -68,7 +69,7 @@ void ff_rv40_v_weak_loop_filter_neon(uint8_t *src, ptrdiff_t stride, int filter_ int filter_q1, int alpha, int beta, int lim_p0q0, int lim_q1, int lim_p1); -void ff_rv40dsp_init_neon(RV34DSPContext *c, DSPContext* dsp) +static void ff_rv40dsp_init_neon(RV34DSPContext *c) { c->put_pixels_tab[0][ 1] = ff_put_rv40_qpel16_mc10_neon; c->put_pixels_tab[0][ 3] = ff_put_rv40_qpel16_mc30_neon; @@ -136,3 +137,11 @@ void ff_rv40dsp_init_neon(RV34DSPContext *c, DSPContext* dsp) c->rv40_weak_loop_filter[0] = ff_rv40_h_weak_loop_filter_neon; c->rv40_weak_loop_filter[1] = ff_rv40_v_weak_loop_filter_neon; } + +void ff_rv40dsp_init_arm(RV34DSPContext *c, DSPContext* dsp) +{ + int cpu_flags = av_get_cpu_flags(); + + if (have_neon(cpu_flags)) + ff_rv40dsp_init_neon(c); +} diff --git a/libavcodec/rv34dsp.c b/libavcodec/rv34dsp.c index ac14ed9..083616f 100644 --- a/libavcodec/rv34dsp.c +++ b/libavcodec/rv34dsp.c @@ -135,8 +135,8 @@ av_cold void ff_rv34dsp_init(RV34DSPContext *c, DSPContext* dsp) { c->rv34_idct_add = rv34_idct_add_c; c->rv34_idct_dc_add = rv34_idct_dc_add_c; - if (HAVE_NEON) - ff_rv34dsp_init_neon(c, dsp); + if (ARCH_ARM) + ff_rv34dsp_init_arm(c, dsp); if (HAVE_MMX) ff_rv34dsp_init_x86(c, dsp); } diff --git a/libavcodec/rv34dsp.h b/libavcodec/rv34dsp.h index 58da59f..f0263b1 100644 --- a/libavcodec/rv34dsp.h +++ b/libavcodec/rv34dsp.h @@ -77,10 +77,10 @@ void ff_rv30dsp_init(RV34DSPContext *c, DSPContext* dsp); void ff_rv34dsp_init(RV34DSPContext *c, DSPContext* dsp); void ff_rv40dsp_init(RV34DSPContext *c, DSPContext* dsp); -void ff_rv34dsp_init_neon(RV34DSPContext *c, DSPContext *dsp); +void ff_rv34dsp_init_arm(RV34DSPContext *c, DSPContext *dsp); void ff_rv34dsp_init_x86(RV34DSPContext *c, DSPContext *dsp); void ff_rv40dsp_init_x86(RV34DSPContext *c, DSPContext *dsp); -void ff_rv40dsp_init_neon(RV34DSPContext *c, DSPContext *dsp); +void ff_rv40dsp_init_arm(RV34DSPContext *c, DSPContext *dsp); #endif /* AVCODEC_RV34DSP_H */ diff --git a/libavcodec/rv40dsp.c b/libavcodec/rv40dsp.c index 762f714..b11ef0c 100644 --- a/libavcodec/rv40dsp.c +++ b/libavcodec/rv40dsp.c @@ -605,6 +605,6 @@ av_cold void ff_rv40dsp_init(RV34DSPContext *c, DSPContext* dsp) { if (HAVE_MMX) ff_rv40dsp_init_x86(c, dsp); - if (HAVE_NEON) - ff_rv40dsp_init_neon(c, dsp); + if (ARCH_ARM) + ff_rv40dsp_init_arm(c, dsp); } -- 1.7.12 _______________________________________________ libav-devel mailing list [email protected] https://lists.libav.org/mailman/listinfo/libav-devel
