From bc92214e2712d7d185afbd4ad359623eea4f69ed Mon Sep 17 00:00:00 2001 From: Mans Rullgard Date: Thu, 7 Jun 2012 14:20:44 +0100 Subject: [PATCH 1/6] vc1dsp: mark put/avg_vc1_mspel_mc() always_inline This ensures that these functions are inlined into the per-position entry points, allowing constant propagation as needed for proper optimisation. 18% faster VC1 decoding on Cortex-A9. Signed-off-by: Mans Rullgard --- libavcodec/vc1dsp.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/libavcodec/vc1dsp.c b/libavcodec/vc1dsp.c index b40824b86a..7b50af6a21 100644 --- a/libavcodec/vc1dsp.c +++ b/libavcodec/vc1dsp.c @@ -561,7 +561,7 @@ static av_always_inline int vc1_mspel_filter(const uint8_t *src, int stride, int /** Function used to do motion compensation with bicubic interpolation */ #define VC1_MSPEL_MC(OP, OPNAME)\ -static void OPNAME ## vc1_mspel_mc(uint8_t *dst, const uint8_t *src, int stride, int hmode, int vmode, int rnd)\ +static av_always_inline void OPNAME ## vc1_mspel_mc(uint8_t *dst, const uint8_t *src, int stride, int hmode, int vmode, int rnd)\ {\ int i, j;\ \ From 94d2b0d2fdfec0882d072ffa089c5bf32d1b8642 Mon Sep 17 00:00:00 2001 From: Justin Ruggles Date: Mon, 21 May 2012 15:46:23 -0400 Subject: [PATCH 2/6] ARM: Move asm.S from libavcodec to libavutil This will allow for easier implementation of ARM-optimized functions in libraries other than libavcodec. --- libavcodec/arm/aacpsdsp_neon.S | 2 +- libavcodec/arm/ac3dsp_arm.S | 2 +- libavcodec/arm/ac3dsp_armv6.S | 2 +- libavcodec/arm/ac3dsp_neon.S | 2 +- libavcodec/arm/dcadsp_neon.S | 2 +- libavcodec/arm/dsputil_arm.S | 2 +- libavcodec/arm/dsputil_armv6.S | 2 +- libavcodec/arm/dsputil_neon.S | 2 +- libavcodec/arm/dsputil_vfp.S | 2 +- libavcodec/arm/fft_fixed_neon.S | 2 +- libavcodec/arm/fft_neon.S | 2 +- libavcodec/arm/fmtconvert_neon.S | 2 +- libavcodec/arm/fmtconvert_vfp.S | 2 +- libavcodec/arm/h264cmc_neon.S | 2 +- libavcodec/arm/h264dsp_neon.S | 2 +- libavcodec/arm/h264idct_neon.S | 2 +- libavcodec/arm/h264pred_neon.S | 2 +- libavcodec/arm/int_neon.S | 2 +- libavcodec/arm/jrevdct_arm.S | 2 +- libavcodec/arm/mdct_fixed_neon.S | 2 +- libavcodec/arm/mdct_neon.S | 2 +- libavcodec/arm/mpegaudiodsp_fixed_armv6.S | 2 +- libavcodec/arm/mpegvideo_armv5te_s.S | 2 +- libavcodec/arm/mpegvideo_neon.S | 2 +- libavcodec/arm/rdft_neon.S | 2 +- libavcodec/arm/rv34dsp_neon.S | 2 +- libavcodec/arm/rv40dsp_neon.S | 2 +- libavcodec/arm/sbrdsp_neon.S | 2 +- libavcodec/arm/simple_idct_arm.S | 2 +- libavcodec/arm/simple_idct_armv5te.S | 2 +- libavcodec/arm/simple_idct_armv6.S | 2 +- libavcodec/arm/simple_idct_neon.S | 2 +- libavcodec/arm/synth_filter_neon.S | 2 +- libavcodec/arm/vp3dsp_neon.S | 2 +- libavcodec/arm/vp56dsp_neon.S | 2 +- libavcodec/arm/vp8_armv6.S | 2 +- libavcodec/arm/vp8dsp_armv6.S | 2 +- libavcodec/arm/vp8dsp_neon.S | 2 +- {libavcodec => libavutil}/arm/asm.S | 0 39 files changed, 38 insertions(+), 38 deletions(-) rename {libavcodec => libavutil}/arm/asm.S (100%) diff --git a/libavcodec/arm/aacpsdsp_neon.S b/libavcodec/arm/aacpsdsp_neon.S index e75760a2d6..fb00900a4d 100644 --- a/libavcodec/arm/aacpsdsp_neon.S +++ b/libavcodec/arm/aacpsdsp_neon.S @@ -18,7 +18,7 @@ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ -#include "asm.S" +#include "libavutil/arm/asm.S" function ff_ps_add_squares_neon, export=1 mov r3, r0 diff --git a/libavcodec/arm/ac3dsp_arm.S b/libavcodec/arm/ac3dsp_arm.S index 9a7d20eb7b..ed8eb37845 100644 --- a/libavcodec/arm/ac3dsp_arm.S +++ b/libavcodec/arm/ac3dsp_arm.S @@ -18,7 +18,7 @@ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ -#include "asm.S" +#include "libavutil/arm/asm.S" function ff_ac3_update_bap_counts_arm, export=1 push {lr} diff --git a/libavcodec/arm/ac3dsp_armv6.S b/libavcodec/arm/ac3dsp_armv6.S index df8bfbaa03..7e2f40edf0 100644 --- a/libavcodec/arm/ac3dsp_armv6.S +++ b/libavcodec/arm/ac3dsp_armv6.S @@ -18,7 +18,7 @@ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ -#include "asm.S" +#include "libavutil/arm/asm.S" function ff_ac3_bit_alloc_calc_bap_armv6, export=1 ldr r12, [sp] diff --git a/libavcodec/arm/ac3dsp_neon.S b/libavcodec/arm/ac3dsp_neon.S index e97197c27a..82ff8af9fb 100644 --- a/libavcodec/arm/ac3dsp_neon.S +++ b/libavcodec/arm/ac3dsp_neon.S @@ -18,7 +18,7 @@ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ -#include "asm.S" +#include "libavutil/arm/asm.S" function ff_ac3_max_msb_abs_int16_neon, export=1 vmov.i16 q0, #0 diff --git a/libavcodec/arm/dcadsp_neon.S b/libavcodec/arm/dcadsp_neon.S index 71f5dd843b..fe3aae801a 100644 --- a/libavcodec/arm/dcadsp_neon.S +++ b/libavcodec/arm/dcadsp_neon.S @@ -18,7 +18,7 @@ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ -#include "asm.S" +#include "libavutil/arm/asm.S" function ff_dca_lfe_fir_neon, export=1 push {r4-r6,lr} diff --git a/libavcodec/arm/dsputil_arm.S b/libavcodec/arm/dsputil_arm.S index 136551f4c9..dd65f705a7 100644 --- a/libavcodec/arm/dsputil_arm.S +++ b/libavcodec/arm/dsputil_arm.S @@ -20,7 +20,7 @@ @ #include "config.h" -#include "asm.S" +#include "libavutil/arm/asm.S" preserve8 diff --git a/libavcodec/arm/dsputil_armv6.S b/libavcodec/arm/dsputil_armv6.S index becf85182d..6eabeee7ab 100644 --- a/libavcodec/arm/dsputil_armv6.S +++ b/libavcodec/arm/dsputil_armv6.S @@ -18,7 +18,7 @@ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ -#include "asm.S" +#include "libavutil/arm/asm.S" preserve8 diff --git a/libavcodec/arm/dsputil_neon.S b/libavcodec/arm/dsputil_neon.S index b59c901ea6..b2243c8ccb 100644 --- a/libavcodec/arm/dsputil_neon.S +++ b/libavcodec/arm/dsputil_neon.S @@ -20,7 +20,7 @@ */ #include "config.h" -#include "asm.S" +#include "libavutil/arm/asm.S" preserve8 diff --git a/libavcodec/arm/dsputil_vfp.S b/libavcodec/arm/dsputil_vfp.S index cbc4bd6c70..8d385c7e42 100644 --- a/libavcodec/arm/dsputil_vfp.S +++ b/libavcodec/arm/dsputil_vfp.S @@ -19,7 +19,7 @@ */ #include "config.h" -#include "asm.S" +#include "libavutil/arm/asm.S" /* * VFP is a floating point coprocessor used in some ARM cores. VFP11 has 1 cycle diff --git a/libavcodec/arm/fft_fixed_neon.S b/libavcodec/arm/fft_fixed_neon.S index 0508088590..4d891ba1a4 100644 --- a/libavcodec/arm/fft_fixed_neon.S +++ b/libavcodec/arm/fft_fixed_neon.S @@ -18,7 +18,7 @@ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ -#include "asm.S" +#include "libavutil/arm/asm.S" .macro bflies d0, d1, r0, r1 vrev64.32 \r0, \d1 @ t5, t6, t1, t2 diff --git a/libavcodec/arm/fft_neon.S b/libavcodec/arm/fft_neon.S index a45898592e..aa06e6daa7 100644 --- a/libavcodec/arm/fft_neon.S +++ b/libavcodec/arm/fft_neon.S @@ -24,7 +24,7 @@ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ -#include "asm.S" +#include "libavutil/arm/asm.S" #define M_SQRT1_2 0.70710678118654752440 diff --git a/libavcodec/arm/fmtconvert_neon.S b/libavcodec/arm/fmtconvert_neon.S index ad1c15d0fa..66ff166f24 100644 --- a/libavcodec/arm/fmtconvert_neon.S +++ b/libavcodec/arm/fmtconvert_neon.S @@ -20,7 +20,7 @@ */ #include "config.h" -#include "asm.S" +#include "libavutil/arm/asm.S" preserve8 diff --git a/libavcodec/arm/fmtconvert_vfp.S b/libavcodec/arm/fmtconvert_vfp.S index f7b0e3dcb5..8aeec2aa12 100644 --- a/libavcodec/arm/fmtconvert_vfp.S +++ b/libavcodec/arm/fmtconvert_vfp.S @@ -19,7 +19,7 @@ */ #include "config.h" -#include "asm.S" +#include "libavutil/arm/asm.S" /** * ARM VFP optimized float to int16 conversion. diff --git a/libavcodec/arm/h264cmc_neon.S b/libavcodec/arm/h264cmc_neon.S index a6feadd189..e82394d899 100644 --- a/libavcodec/arm/h264cmc_neon.S +++ b/libavcodec/arm/h264cmc_neon.S @@ -18,7 +18,7 @@ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ -#include "asm.S" +#include "libavutil/arm/asm.S" /* chroma_mc8(uint8_t *dst, uint8_t *src, int stride, int h, int x, int y) */ .macro h264_chroma_mc8 type, codec=h264 diff --git a/libavcodec/arm/h264dsp_neon.S b/libavcodec/arm/h264dsp_neon.S index a4abf66494..4ad886334c 100644 --- a/libavcodec/arm/h264dsp_neon.S +++ b/libavcodec/arm/h264dsp_neon.S @@ -18,7 +18,7 @@ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ -#include "asm.S" +#include "libavutil/arm/asm.S" #include "neon.S" /* H.264 loop filter */ diff --git a/libavcodec/arm/h264idct_neon.S b/libavcodec/arm/h264idct_neon.S index edb2ae5270..182d3b2393 100644 --- a/libavcodec/arm/h264idct_neon.S +++ b/libavcodec/arm/h264idct_neon.S @@ -18,7 +18,7 @@ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ -#include "asm.S" +#include "libavutil/arm/asm.S" preserve8 diff --git a/libavcodec/arm/h264pred_neon.S b/libavcodec/arm/h264pred_neon.S index 815b67b81f..332f94bd53 100644 --- a/libavcodec/arm/h264pred_neon.S +++ b/libavcodec/arm/h264pred_neon.S @@ -18,7 +18,7 @@ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ -#include "asm.S" +#include "libavutil/arm/asm.S" .macro ldcol.8 rd, rs, rt, n=8, hi=0 .if \n == 8 || \hi == 0 diff --git a/libavcodec/arm/int_neon.S b/libavcodec/arm/int_neon.S index ea479bb580..92cc518338 100644 --- a/libavcodec/arm/int_neon.S +++ b/libavcodec/arm/int_neon.S @@ -19,7 +19,7 @@ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ -#include "asm.S" +#include "libavutil/arm/asm.S" preserve8 .fpu neon diff --git a/libavcodec/arm/jrevdct_arm.S b/libavcodec/arm/jrevdct_arm.S index 93cbbbe8eb..331ad85328 100644 --- a/libavcodec/arm/jrevdct_arm.S +++ b/libavcodec/arm/jrevdct_arm.S @@ -25,7 +25,7 @@ */ -#include "asm.S" +#include "libavutil/arm/asm.S" #define FIX_0_298631336 2446 #define FIX_0_541196100 4433 diff --git a/libavcodec/arm/mdct_fixed_neon.S b/libavcodec/arm/mdct_fixed_neon.S index d219216a20..08a388777a 100644 --- a/libavcodec/arm/mdct_fixed_neon.S +++ b/libavcodec/arm/mdct_fixed_neon.S @@ -18,7 +18,7 @@ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ -#include "asm.S" +#include "libavutil/arm/asm.S" preserve8 diff --git a/libavcodec/arm/mdct_neon.S b/libavcodec/arm/mdct_neon.S index 5669075521..09dfdf4dd2 100644 --- a/libavcodec/arm/mdct_neon.S +++ b/libavcodec/arm/mdct_neon.S @@ -19,7 +19,7 @@ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ -#include "asm.S" +#include "libavutil/arm/asm.S" preserve8 diff --git a/libavcodec/arm/mpegaudiodsp_fixed_armv6.S b/libavcodec/arm/mpegaudiodsp_fixed_armv6.S index b517b973e7..49bd0bcaf2 100644 --- a/libavcodec/arm/mpegaudiodsp_fixed_armv6.S +++ b/libavcodec/arm/mpegaudiodsp_fixed_armv6.S @@ -18,7 +18,7 @@ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ -#include "asm.S" +#include "libavutil/arm/asm.S" .macro skip args:vararg .endm diff --git a/libavcodec/arm/mpegvideo_armv5te_s.S b/libavcodec/arm/mpegvideo_armv5te_s.S index 952c8d74cb..ec95346d37 100644 --- a/libavcodec/arm/mpegvideo_armv5te_s.S +++ b/libavcodec/arm/mpegvideo_armv5te_s.S @@ -20,7 +20,7 @@ */ #include "config.h" -#include "asm.S" +#include "libavutil/arm/asm.S" /* * Special optimized version of dct_unquantize_h263_helper_c, it diff --git a/libavcodec/arm/mpegvideo_neon.S b/libavcodec/arm/mpegvideo_neon.S index 206a71a14d..0c6c428854 100644 --- a/libavcodec/arm/mpegvideo_neon.S +++ b/libavcodec/arm/mpegvideo_neon.S @@ -18,7 +18,7 @@ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ -#include "asm.S" +#include "libavutil/arm/asm.S" #include "asm-offsets.h" function ff_dct_unquantize_h263_inter_neon, export=1 diff --git a/libavcodec/arm/rdft_neon.S b/libavcodec/arm/rdft_neon.S index fba275eb8c..eb7433aca4 100644 --- a/libavcodec/arm/rdft_neon.S +++ b/libavcodec/arm/rdft_neon.S @@ -19,7 +19,7 @@ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ -#include "asm.S" +#include "libavutil/arm/asm.S" preserve8 diff --git a/libavcodec/arm/rv34dsp_neon.S b/libavcodec/arm/rv34dsp_neon.S index 15a015deef..522e387582 100644 --- a/libavcodec/arm/rv34dsp_neon.S +++ b/libavcodec/arm/rv34dsp_neon.S @@ -18,7 +18,7 @@ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ -#include "asm.S" +#include "libavutil/arm/asm.S" #include "neon.S" .macro rv34_inv_transform r0 diff --git a/libavcodec/arm/rv40dsp_neon.S b/libavcodec/arm/rv40dsp_neon.S index f68f38234a..6bd45eb5ad 100644 --- a/libavcodec/arm/rv40dsp_neon.S +++ b/libavcodec/arm/rv40dsp_neon.S @@ -19,7 +19,7 @@ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ -#include "asm.S" +#include "libavutil/arm/asm.S" #include "neon.S" .macro qpel_lowpass r0, r1, rc1, rc2, shift diff --git a/libavcodec/arm/sbrdsp_neon.S b/libavcodec/arm/sbrdsp_neon.S index 835c32caee..4b681bfe6a 100644 --- a/libavcodec/arm/sbrdsp_neon.S +++ b/libavcodec/arm/sbrdsp_neon.S @@ -18,7 +18,7 @@ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ -#include "asm.S" +#include "libavutil/arm/asm.S" function ff_sbr_sum64x5_neon, export=1 push {lr} diff --git a/libavcodec/arm/simple_idct_arm.S b/libavcodec/arm/simple_idct_arm.S index a9c3095157..c6540a1e40 100644 --- a/libavcodec/arm/simple_idct_arm.S +++ b/libavcodec/arm/simple_idct_arm.S @@ -23,7 +23,7 @@ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ -#include "asm.S" +#include "libavutil/arm/asm.S" /* useful constants for the algorithm, they are save in __constant_ptr__ at */ /* the end of the source code.*/ diff --git a/libavcodec/arm/simple_idct_armv5te.S b/libavcodec/arm/simple_idct_armv5te.S index 24641e47b6..e880a8aab2 100644 --- a/libavcodec/arm/simple_idct_armv5te.S +++ b/libavcodec/arm/simple_idct_armv5te.S @@ -21,7 +21,7 @@ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ -#include "asm.S" +#include "libavutil/arm/asm.S" #define W1 22725 /* cos(i*M_PI/16)*sqrt(2)*(1<<14) + 0.5 */ #define W2 21407 /* cos(i*M_PI/16)*sqrt(2)*(1<<14) + 0.5 */ diff --git a/libavcodec/arm/simple_idct_armv6.S b/libavcodec/arm/simple_idct_armv6.S index 284eb1f941..9395f88084 100644 --- a/libavcodec/arm/simple_idct_armv6.S +++ b/libavcodec/arm/simple_idct_armv6.S @@ -21,7 +21,7 @@ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ -#include "asm.S" +#include "libavutil/arm/asm.S" #define W1 22725 /* cos(i*M_PI/16)*sqrt(2)*(1<<14) + 0.5 */ #define W2 21407 /* cos(i*M_PI/16)*sqrt(2)*(1<<14) + 0.5 */ diff --git a/libavcodec/arm/simple_idct_neon.S b/libavcodec/arm/simple_idct_neon.S index 0c4e05d869..df24a45270 100644 --- a/libavcodec/arm/simple_idct_neon.S +++ b/libavcodec/arm/simple_idct_neon.S @@ -23,7 +23,7 @@ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ -#include "asm.S" +#include "libavutil/arm/asm.S" #define W1 22725 //cos(i*M_PI/16)*sqrt(2)*(1<<14) + 0.5 #define W2 21407 //cos(i*M_PI/16)*sqrt(2)*(1<<14) + 0.5 diff --git a/libavcodec/arm/synth_filter_neon.S b/libavcodec/arm/synth_filter_neon.S index 1d6e5b2b86..6dabce6db8 100644 --- a/libavcodec/arm/synth_filter_neon.S +++ b/libavcodec/arm/synth_filter_neon.S @@ -18,7 +18,7 @@ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ -#include "asm.S" +#include "libavutil/arm/asm.S" preserve8 diff --git a/libavcodec/arm/vp3dsp_neon.S b/libavcodec/arm/vp3dsp_neon.S index 279b13225b..8d22d00038 100644 --- a/libavcodec/arm/vp3dsp_neon.S +++ b/libavcodec/arm/vp3dsp_neon.S @@ -18,7 +18,7 @@ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ -#include "asm.S" +#include "libavutil/arm/asm.S" const vp3_idct_constants, align=4 .short 64277, 60547, 54491, 46341, 36410, 25080, 12785 diff --git a/libavcodec/arm/vp56dsp_neon.S b/libavcodec/arm/vp56dsp_neon.S index b95d8ab28b..10b4d0f14c 100644 --- a/libavcodec/arm/vp56dsp_neon.S +++ b/libavcodec/arm/vp56dsp_neon.S @@ -18,7 +18,7 @@ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ -#include "asm.S" +#include "libavutil/arm/asm.S" .macro vp6_edge_filter vdup.16 q3, r2 @ t diff --git a/libavcodec/arm/vp8_armv6.S b/libavcodec/arm/vp8_armv6.S index c9dc30b46d..1fa6d15617 100644 --- a/libavcodec/arm/vp8_armv6.S +++ b/libavcodec/arm/vp8_armv6.S @@ -18,7 +18,7 @@ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ -#include "asm.S" +#include "libavutil/arm/asm.S" .macro rac_get_prob h, bs, buf, cw, pr, t0, t1 adds \bs, \bs, \t0 diff --git a/libavcodec/arm/vp8dsp_armv6.S b/libavcodec/arm/vp8dsp_armv6.S index 08054ff262..a26a2a9813 100644 --- a/libavcodec/arm/vp8dsp_armv6.S +++ b/libavcodec/arm/vp8dsp_armv6.S @@ -52,7 +52,7 @@ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ -#include "asm.S" +#include "libavutil/arm/asm.S" @ idct diff --git a/libavcodec/arm/vp8dsp_neon.S b/libavcodec/arm/vp8dsp_neon.S index c1a91e1461..0cd2efa523 100644 --- a/libavcodec/arm/vp8dsp_neon.S +++ b/libavcodec/arm/vp8dsp_neon.S @@ -21,7 +21,7 @@ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ -#include "asm.S" +#include "libavutil/arm/asm.S" #include "neon.S" function ff_vp8_luma_dc_wht_neon, export=1 diff --git a/libavcodec/arm/asm.S b/libavutil/arm/asm.S similarity index 100% rename from libavcodec/arm/asm.S rename to libavutil/arm/asm.S From 98db4e2a4e35ccc2406004216270ceaa1c6a7d00 Mon Sep 17 00:00:00 2001 From: Justin Ruggles Date: Mon, 21 May 2012 16:24:42 -0400 Subject: [PATCH 3/6] PPC: Move types_altivec.h and util_altivec.h from libavcodec to libavutil This will allow for easier implementation of Altivec functions in libraries other than libavcodec. --- libavcodec/ppc/dsputil_altivec.c | 4 ++-- libavcodec/ppc/fft_altivec.c | 5 +++-- libavcodec/ppc/float_altivec.c | 2 +- libavcodec/ppc/fmtconvert_altivec.c | 2 +- libavcodec/ppc/gmc_altivec.c | 4 ++-- libavcodec/ppc/h264_altivec.c | 4 ++-- libavcodec/ppc/idct_altivec.c | 2 +- libavcodec/ppc/int_altivec.c | 3 +-- libavcodec/ppc/mpegaudiodec_altivec.c | 2 +- libavcodec/ppc/mpegvideo_altivec.c | 5 +++-- libavcodec/ppc/vc1dsp_altivec.c | 5 ++--- libavcodec/ppc/vp3dsp_altivec.c | 4 ++-- libavcodec/ppc/vp8dsp_altivec.c | 4 ++-- {libavcodec => libavutil}/ppc/types_altivec.h | 6 +++--- {libavcodec => libavutil}/ppc/util_altivec.h | 6 +++--- 15 files changed, 29 insertions(+), 29 deletions(-) rename {libavcodec => libavutil}/ppc/types_altivec.h (93%) rename {libavcodec => libavutil}/ppc/util_altivec.h (96%) diff --git a/libavcodec/ppc/dsputil_altivec.c b/libavcodec/ppc/dsputil_altivec.c index 6679359659..9ad73ef5d5 100644 --- a/libavcodec/ppc/dsputil_altivec.c +++ b/libavcodec/ppc/dsputil_altivec.c @@ -24,9 +24,9 @@ #if HAVE_ALTIVEC_H #include #endif +#include "libavutil/ppc/types_altivec.h" +#include "libavutil/ppc/util_altivec.h" #include "libavcodec/dsputil.h" -#include "util_altivec.h" -#include "types_altivec.h" #include "dsputil_altivec.h" static int sad16_x2_altivec(void *v, uint8_t *pix1, uint8_t *pix2, int line_size, int h) diff --git a/libavcodec/ppc/fft_altivec.c b/libavcodec/ppc/fft_altivec.c index 39830b29a0..c85d04ff79 100644 --- a/libavcodec/ppc/fft_altivec.c +++ b/libavcodec/ppc/fft_altivec.c @@ -19,9 +19,10 @@ * License along with Libav; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ + +#include "libavutil/ppc/types_altivec.h" +#include "libavutil/ppc/util_altivec.h" #include "libavcodec/fft.h" -#include "util_altivec.h" -#include "types_altivec.h" /** * Do a complex FFT with the parameters defined in ff_fft_init(). The diff --git a/libavcodec/ppc/float_altivec.c b/libavcodec/ppc/float_altivec.c index 8253716caa..6e0556ec42 100644 --- a/libavcodec/ppc/float_altivec.c +++ b/libavcodec/ppc/float_altivec.c @@ -18,10 +18,10 @@ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ +#include "libavutil/ppc/util_altivec.h" #include "libavcodec/dsputil.h" #include "dsputil_altivec.h" -#include "util_altivec.h" static void vector_fmul_altivec(float *dst, const float *src0, const float *src1, int len) { diff --git a/libavcodec/ppc/fmtconvert_altivec.c b/libavcodec/ppc/fmtconvert_altivec.c index b1eaf9b482..20a05d7f8f 100644 --- a/libavcodec/ppc/fmtconvert_altivec.c +++ b/libavcodec/ppc/fmtconvert_altivec.c @@ -20,8 +20,8 @@ #include "libavcodec/fmtconvert.h" +#include "libavutil/ppc/util_altivec.h" #include "dsputil_altivec.h" -#include "util_altivec.h" static void int32_to_float_fmul_scalar_altivec(float *dst, const int *src, float mul, int len) { diff --git a/libavcodec/ppc/gmc_altivec.c b/libavcodec/ppc/gmc_altivec.c index fb67b9ec36..45243c26f5 100644 --- a/libavcodec/ppc/gmc_altivec.c +++ b/libavcodec/ppc/gmc_altivec.c @@ -20,9 +20,9 @@ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ +#include "libavutil/ppc/types_altivec.h" +#include "libavutil/ppc/util_altivec.h" #include "libavcodec/dsputil.h" -#include "util_altivec.h" -#include "types_altivec.h" #include "dsputil_altivec.h" /* diff --git a/libavcodec/ppc/h264_altivec.c b/libavcodec/ppc/h264_altivec.c index 79e1714f4e..92bfd454a4 100644 --- a/libavcodec/ppc/h264_altivec.c +++ b/libavcodec/ppc/h264_altivec.c @@ -19,13 +19,13 @@ */ #include "libavutil/cpu.h" +#include "libavutil/ppc/types_altivec.h" +#include "libavutil/ppc/util_altivec.h" #include "libavcodec/dsputil.h" #include "libavcodec/h264data.h" #include "libavcodec/h264dsp.h" #include "dsputil_altivec.h" -#include "util_altivec.h" -#include "types_altivec.h" #define PUT_OP_U8_ALTIVEC(d, s, dst) d = s #define AVG_OP_U8_ALTIVEC(d, s, dst) d = vec_avg(dst, s) diff --git a/libavcodec/ppc/idct_altivec.c b/libavcodec/ppc/idct_altivec.c index d2e9017da4..e599491855 100644 --- a/libavcodec/ppc/idct_altivec.c +++ b/libavcodec/ppc/idct_altivec.c @@ -41,8 +41,8 @@ #if HAVE_ALTIVEC_H #include #endif +#include "libavutil/ppc/types_altivec.h" #include "libavcodec/dsputil.h" -#include "types_altivec.h" #include "dsputil_altivec.h" #define IDCT_HALF \ diff --git a/libavcodec/ppc/int_altivec.c b/libavcodec/ppc/int_altivec.c index 3c8b852298..4fcdf7727d 100644 --- a/libavcodec/ppc/int_altivec.c +++ b/libavcodec/ppc/int_altivec.c @@ -28,12 +28,11 @@ #include #endif +#include "libavutil/ppc/types_altivec.h" #include "libavcodec/dsputil.h" #include "dsputil_altivec.h" -#include "types_altivec.h" - static int ssd_int8_vs_int16_altivec(const int8_t *pix1, const int16_t *pix2, int size) { int i, size16; diff --git a/libavcodec/ppc/mpegaudiodec_altivec.c b/libavcodec/ppc/mpegaudiodec_altivec.c index 5df0fdafe4..fabde6aac0 100644 --- a/libavcodec/ppc/mpegaudiodec_altivec.c +++ b/libavcodec/ppc/mpegaudiodec_altivec.c @@ -20,7 +20,7 @@ */ #include "dsputil_altivec.h" -#include "util_altivec.h" +#include "libavutil/ppc/util_altivec.h" #include "libavcodec/dsputil.h" #include "libavcodec/mpegaudiodsp.h" diff --git a/libavcodec/ppc/mpegvideo_altivec.c b/libavcodec/ppc/mpegvideo_altivec.c index 42702fd84a..df111e997c 100644 --- a/libavcodec/ppc/mpegvideo_altivec.c +++ b/libavcodec/ppc/mpegvideo_altivec.c @@ -23,12 +23,13 @@ #include #include + #include "libavutil/cpu.h" +#include "libavutil/ppc/types_altivec.h" +#include "libavutil/ppc/util_altivec.h" #include "libavcodec/dsputil.h" #include "libavcodec/mpegvideo.h" -#include "util_altivec.h" -#include "types_altivec.h" #include "dsputil_altivec.h" /* AltiVec version of dct_unquantize_h263 diff --git a/libavcodec/ppc/vc1dsp_altivec.c b/libavcodec/ppc/vc1dsp_altivec.c index 307e0e9f6b..38a7da23f5 100644 --- a/libavcodec/ppc/vc1dsp_altivec.c +++ b/libavcodec/ppc/vc1dsp_altivec.c @@ -19,12 +19,11 @@ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ +#include "libavutil/ppc/types_altivec.h" +#include "libavutil/ppc/util_altivec.h" #include "libavcodec/dsputil.h" #include "libavcodec/vc1dsp.h" -#include "util_altivec.h" -#include "dsputil_altivec.h" - // main steps of 8x8 transform #define STEP8(s0, s1, s2, s3, s4, s5, s6, s7, vec_rnd) \ do { \ diff --git a/libavcodec/ppc/vp3dsp_altivec.c b/libavcodec/ppc/vp3dsp_altivec.c index bbe9170edf..938502e8bd 100644 --- a/libavcodec/ppc/vp3dsp_altivec.c +++ b/libavcodec/ppc/vp3dsp_altivec.c @@ -18,9 +18,9 @@ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ +#include "libavutil/ppc/types_altivec.h" +#include "libavutil/ppc/util_altivec.h" #include "libavcodec/dsputil.h" -#include "util_altivec.h" -#include "types_altivec.h" #include "dsputil_altivec.h" static const vec_s16 constants = diff --git a/libavcodec/ppc/vp8dsp_altivec.c b/libavcodec/ppc/vp8dsp_altivec.c index c3f6502ded..f5700007d9 100644 --- a/libavcodec/ppc/vp8dsp_altivec.c +++ b/libavcodec/ppc/vp8dsp_altivec.c @@ -21,10 +21,10 @@ */ #include "libavutil/cpu.h" +#include "libavutil/ppc/types_altivec.h" +#include "libavutil/ppc/util_altivec.h" #include "libavcodec/vp8dsp.h" #include "dsputil_altivec.h" -#include "types_altivec.h" -#include "util_altivec.h" #define REPT4(...) { __VA_ARGS__, __VA_ARGS__, __VA_ARGS__, __VA_ARGS__ } diff --git a/libavcodec/ppc/types_altivec.h b/libavutil/ppc/types_altivec.h similarity index 93% rename from libavcodec/ppc/types_altivec.h rename to libavutil/ppc/types_altivec.h index defa20e243..0a4eaf885f 100644 --- a/libavcodec/ppc/types_altivec.h +++ b/libavutil/ppc/types_altivec.h @@ -18,8 +18,8 @@ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ -#ifndef AVCODEC_PPC_TYPES_ALTIVEC_H -#define AVCODEC_PPC_TYPES_ALTIVEC_H +#ifndef AVUTIL_PPC_TYPES_ALTIVEC_H +#define AVUTIL_PPC_TYPES_ALTIVEC_H /*********************************************************************** * Vector types @@ -44,4 +44,4 @@ #define zero_u32v (vec_u32) zerov #define zero_s32v (vec_s32) zerov -#endif /* AVCODEC_PPC_TYPES_ALTIVEC_H */ +#endif /* AVUTIL_PPC_TYPES_ALTIVEC_H */ diff --git a/libavcodec/ppc/util_altivec.h b/libavutil/ppc/util_altivec.h similarity index 96% rename from libavcodec/ppc/util_altivec.h rename to libavutil/ppc/util_altivec.h index 19ea9626db..bdbf86219d 100644 --- a/libavcodec/ppc/util_altivec.h +++ b/libavutil/ppc/util_altivec.h @@ -21,8 +21,8 @@ * Contains misc utility macros and inline functions */ -#ifndef AVCODEC_PPC_UTIL_ALTIVEC_H -#define AVCODEC_PPC_UTIL_ALTIVEC_H +#ifndef AVUTIL_PPC_UTIL_ALTIVEC_H +#define AVUTIL_PPC_UTIL_ALTIVEC_H #include @@ -115,4 +115,4 @@ static inline vec_u8 load_with_perm_vec(int offset, uint8_t *src, vec_u8 perm_ve return vec_perm(a, b, perm_vec); } -#endif /* AVCODEC_PPC_UTIL_ALTIVEC_H */ +#endif /* AVUTIL_PPC_UTIL_ALTIVEC_H */ From d5a7229ba4aabc2b6407c731d9175879ae54c5ea Mon Sep 17 00:00:00 2001 From: Justin Ruggles Date: Mon, 21 May 2012 12:58:41 -0400 Subject: [PATCH 4/6] Add a float DSP framework to libavutil Move vector_fmul() from DSPContext to AVFloatDSPContext. --- libavcodec/aac.h | 2 + libavcodec/aacdec.c | 7 +-- libavcodec/aacenc.c | 20 ++++++--- libavcodec/aacenc.h | 2 + libavcodec/ac3enc.c | 1 + libavcodec/ac3enc.h | 3 ++ libavcodec/ac3enc_fixed.c | 5 ++- libavcodec/ac3enc_float.c | 8 ++-- libavcodec/ac3enc_template.c | 7 ++- libavcodec/arm/dsputil_init_neon.c | 2 - libavcodec/arm/dsputil_init_vfp.c | 7 --- libavcodec/arm/dsputil_neon.S | 39 ----------------- libavcodec/arm/dsputil_vfp.S | 47 -------------------- libavcodec/atrac3.c | 8 ++-- libavcodec/dsputil.c | 7 --- libavcodec/dsputil.h | 1 - libavcodec/nellymoserenc.c | 7 ++- libavcodec/ppc/float_altivec.c | 16 ------- libavcodec/ra288.c | 9 ++-- libavcodec/twinvq.c | 9 ++-- libavcodec/vorbisdec.c | 5 ++- libavcodec/x86/dsputil_mmx.c | 7 --- libavcodec/x86/dsputil_yasm.asm | 32 -------------- libavutil/Makefile | 1 + libavutil/arm/Makefile | 7 +++ libavutil/arm/float_dsp_arm.h | 29 ++++++++++++ libavutil/arm/float_dsp_init_arm.c | 33 ++++++++++++++ libavutil/arm/float_dsp_init_neon.c | 32 ++++++++++++++ libavutil/arm/float_dsp_init_vfp.c | 34 +++++++++++++++ libavutil/arm/float_dsp_neon.S | 64 +++++++++++++++++++++++++++ libavutil/arm/float_dsp_vfp.S | 68 +++++++++++++++++++++++++++++ libavutil/float_dsp.c | 42 ++++++++++++++++++ libavutil/float_dsp.h | 53 ++++++++++++++++++++++ libavutil/ppc/Makefile | 3 ++ libavutil/ppc/float_dsp_altivec.c | 37 ++++++++++++++++ libavutil/ppc/float_dsp_init.c | 37 ++++++++++++++++ libavutil/x86/Makefile | 3 ++ libavutil/x86/float_dsp.asm | 55 +++++++++++++++++++++++ libavutil/x86/float_dsp_init.c | 41 +++++++++++++++++ 39 files changed, 602 insertions(+), 188 deletions(-) create mode 100644 libavutil/arm/float_dsp_arm.h create mode 100644 libavutil/arm/float_dsp_init_arm.c create mode 100644 libavutil/arm/float_dsp_init_neon.c create mode 100644 libavutil/arm/float_dsp_init_vfp.c create mode 100644 libavutil/arm/float_dsp_neon.S create mode 100644 libavutil/arm/float_dsp_vfp.S create mode 100644 libavutil/float_dsp.c create mode 100644 libavutil/float_dsp.h create mode 100644 libavutil/ppc/float_dsp_altivec.c create mode 100644 libavutil/ppc/float_dsp_init.c create mode 100644 libavutil/x86/float_dsp.asm create mode 100644 libavutil/x86/float_dsp_init.c diff --git a/libavcodec/aac.h b/libavcodec/aac.h index 1b6013e458..45aacd1071 100644 --- a/libavcodec/aac.h +++ b/libavcodec/aac.h @@ -30,6 +30,7 @@ #ifndef AVCODEC_AAC_H #define AVCODEC_AAC_H +#include "libavutil/float_dsp.h" #include "avcodec.h" #include "dsputil.h" #include "fft.h" @@ -292,6 +293,7 @@ typedef struct { FFTContext mdct_ltp; DSPContext dsp; FmtConvertContext fmt_conv; + AVFloatDSPContext fdsp; int random_state; /** @} */ diff --git a/libavcodec/aacdec.c b/libavcodec/aacdec.c index ddc7eef138..3cf4a7fe18 100644 --- a/libavcodec/aacdec.c +++ b/libavcodec/aacdec.c @@ -79,7 +79,7 @@ Parametric Stereo. */ - +#include "libavutil/float_dsp.h" #include "avcodec.h" #include "internal.h" #include "get_bits.h" @@ -867,6 +867,7 @@ static av_cold int aac_decode_init(AVCodecContext *avctx) ff_dsputil_init(&ac->dsp, avctx); ff_fmt_convert_init(&ac->fmt_conv, avctx); + avpriv_float_dsp_init(&ac->fdsp, avctx->flags & CODEC_FLAG_BITEXACT); ac->random_state = 0x1f2e3d4c; @@ -2032,10 +2033,10 @@ static void windowing_and_mdct_ltp(AACContext *ac, float *out, const float *swindow_prev = ics->use_kb_window[1] ? ff_aac_kbd_short_128 : ff_sine_128; if (ics->window_sequence[0] != LONG_STOP_SEQUENCE) { - ac->dsp.vector_fmul(in, in, lwindow_prev, 1024); + ac->fdsp.vector_fmul(in, in, lwindow_prev, 1024); } else { memset(in, 0, 448 * sizeof(float)); - ac->dsp.vector_fmul(in + 448, in + 448, swindow_prev, 128); + ac->fdsp.vector_fmul(in + 448, in + 448, swindow_prev, 128); } if (ics->window_sequence[0] != LONG_START_SEQUENCE) { ac->dsp.vector_fmul_reverse(in + 1024, in + 1024, lwindow, 1024); diff --git a/libavcodec/aacenc.c b/libavcodec/aacenc.c index 6021c375bb..0186011136 100644 --- a/libavcodec/aacenc.c +++ b/libavcodec/aacenc.c @@ -30,6 +30,7 @@ * add temporal noise shaping ***********************************/ +#include "libavutil/float_dsp.h" #include "libavutil/opt.h" #include "avcodec.h" #include "put_bits.h" @@ -182,7 +183,9 @@ static void put_audio_specific_config(AVCodecContext *avctx) } #define WINDOW_FUNC(type) \ -static void apply_ ##type ##_window(DSPContext *dsp, SingleChannelElement *sce, const float *audio) +static void apply_ ##type ##_window(DSPContext *dsp, AVFloatDSPContext *fdsp, \ + SingleChannelElement *sce, \ + const float *audio) WINDOW_FUNC(only_long) { @@ -190,7 +193,7 @@ WINDOW_FUNC(only_long) const float *pwindow = sce->ics.use_kb_window[1] ? ff_aac_kbd_long_1024 : ff_sine_1024; float *out = sce->ret; - dsp->vector_fmul (out, audio, lwindow, 1024); + fdsp->vector_fmul (out, audio, lwindow, 1024); dsp->vector_fmul_reverse(out + 1024, audio + 1024, pwindow, 1024); } @@ -200,7 +203,7 @@ WINDOW_FUNC(long_start) const float *swindow = sce->ics.use_kb_window[0] ? ff_aac_kbd_short_128 : ff_sine_128; float *out = sce->ret; - dsp->vector_fmul(out, audio, lwindow, 1024); + fdsp->vector_fmul(out, audio, lwindow, 1024); memcpy(out + 1024, audio + 1024, sizeof(out[0]) * 448); dsp->vector_fmul_reverse(out + 1024 + 448, audio + 1024 + 448, swindow, 128); memset(out + 1024 + 576, 0, sizeof(out[0]) * 448); @@ -213,7 +216,7 @@ WINDOW_FUNC(long_stop) float *out = sce->ret; memset(out, 0, sizeof(out[0]) * 448); - dsp->vector_fmul(out + 448, audio + 448, swindow, 128); + fdsp->vector_fmul(out + 448, audio + 448, swindow, 128); memcpy(out + 576, audio + 576, sizeof(out[0]) * 448); dsp->vector_fmul_reverse(out + 1024, audio + 1024, lwindow, 1024); } @@ -227,7 +230,7 @@ WINDOW_FUNC(eight_short) int w; for (w = 0; w < 8; w++) { - dsp->vector_fmul (out, in, w ? pwindow : swindow, 128); + fdsp->vector_fmul (out, in, w ? pwindow : swindow, 128); out += 128; in += 128; dsp->vector_fmul_reverse(out, in, swindow, 128); @@ -235,7 +238,9 @@ WINDOW_FUNC(eight_short) } } -static void (*const apply_window[4])(DSPContext *dsp, SingleChannelElement *sce, const float *audio) = { +static void (*const apply_window[4])(DSPContext *dsp, AVFloatDSPContext *fdsp, + SingleChannelElement *sce, + const float *audio) = { [ONLY_LONG_SEQUENCE] = apply_only_long_window, [LONG_START_SEQUENCE] = apply_long_start_window, [EIGHT_SHORT_SEQUENCE] = apply_eight_short_window, @@ -248,7 +253,7 @@ static void apply_window_and_mdct(AACEncContext *s, SingleChannelElement *sce, int i; float *output = sce->ret; - apply_window[sce->ics.window_sequence[0]](&s->dsp, sce, audio); + apply_window[sce->ics.window_sequence[0]](&s->dsp, &s->fdsp, sce, audio); if (sce->ics.window_sequence[0] != EIGHT_SHORT_SEQUENCE) s->mdct1024.mdct_calc(&s->mdct1024, sce->coeffs, output); @@ -694,6 +699,7 @@ static av_cold int dsp_init(AVCodecContext *avctx, AACEncContext *s) int ret = 0; ff_dsputil_init(&s->dsp, avctx); + avpriv_float_dsp_init(&s->fdsp, avctx->flags & CODEC_FLAG_BITEXACT); // window init ff_kbd_window_init(ff_aac_kbd_long_1024, 4.0, 1024); diff --git a/libavcodec/aacenc.h b/libavcodec/aacenc.h index f4e531a9a6..81ffb973d6 100644 --- a/libavcodec/aacenc.h +++ b/libavcodec/aacenc.h @@ -22,6 +22,7 @@ #ifndef AVCODEC_AACENC_H #define AVCODEC_AACENC_H +#include "libavutil/float_dsp.h" #include "avcodec.h" #include "put_bits.h" #include "dsputil.h" @@ -58,6 +59,7 @@ typedef struct AACEncContext { FFTContext mdct1024; ///< long (1024 samples) frame transform context FFTContext mdct128; ///< short (128 samples) frame transform context DSPContext dsp; + AVFloatDSPContext fdsp; float *planar_samples[6]; ///< saved preprocessed input int samplerate_index; ///< MPEG-4 samplerate index diff --git a/libavcodec/ac3enc.c b/libavcodec/ac3enc.c index 3962fab748..50d7f704fa 100644 --- a/libavcodec/ac3enc.c +++ b/libavcodec/ac3enc.c @@ -2494,6 +2494,7 @@ av_cold int ff_ac3_encode_init(AVCodecContext *avctx) #endif ff_dsputil_init(&s->dsp, avctx); + avpriv_float_dsp_init(&s->fdsp, avctx->flags & CODEC_FLAG_BITEXACT); ff_ac3dsp_init(&s->ac3dsp, avctx->flags & CODEC_FLAG_BITEXACT); dprint_options(s); diff --git a/libavcodec/ac3enc.h b/libavcodec/ac3enc.h index e8415a2d69..be9dcf21c1 100644 --- a/libavcodec/ac3enc.h +++ b/libavcodec/ac3enc.h @@ -29,6 +29,8 @@ #define AVCODEC_AC3ENC_H #include + +#include "libavutil/float_dsp.h" #include "ac3.h" #include "ac3dsp.h" #include "avcodec.h" @@ -158,6 +160,7 @@ typedef struct AC3EncodeContext { AVCodecContext *avctx; ///< parent AVCodecContext PutBitContext pb; ///< bitstream writer context DSPContext dsp; + AVFloatDSPContext fdsp; AC3DSPContext ac3dsp; ///< AC-3 optimized functions FFTContext mdct; ///< FFT context for MDCT calculation const SampleType *mdct_window; ///< MDCT window function array diff --git a/libavcodec/ac3enc_fixed.c b/libavcodec/ac3enc_fixed.c index 8d75ee303b..cc8f158c9d 100644 --- a/libavcodec/ac3enc_fixed.c +++ b/libavcodec/ac3enc_fixed.c @@ -68,10 +68,11 @@ av_cold int AC3_NAME(mdct_init)(AC3EncodeContext *s) /* * Apply KBD window to input samples prior to MDCT. */ -static void apply_window(DSPContext *dsp, int16_t *output, const int16_t *input, +static void apply_window(void *dsp, int16_t *output, const int16_t *input, const int16_t *window, unsigned int len) { - dsp->apply_window_int16(output, input, window, len); + DSPContext *dsp0 = dsp; + dsp0->apply_window_int16(output, input, window, len); } diff --git a/libavcodec/ac3enc_float.c b/libavcodec/ac3enc_float.c index 0b9e1de298..9eff5c5b6c 100644 --- a/libavcodec/ac3enc_float.c +++ b/libavcodec/ac3enc_float.c @@ -86,10 +86,12 @@ av_cold int ff_ac3_float_mdct_init(AC3EncodeContext *s) /* * Apply KBD window to input samples prior to MDCT. */ -static void apply_window(DSPContext *dsp, float *output, const float *input, - const float *window, unsigned int len) +static void apply_window(void *dsp, float *output, + const float *input, const float *window, + unsigned int len) { - dsp->vector_fmul(output, input, window, len); + AVFloatDSPContext *fdsp = dsp; + fdsp->vector_fmul(output, input, window, len); } diff --git a/libavcodec/ac3enc_template.c b/libavcodec/ac3enc_template.c index 9427cfe971..6e0a2b6f34 100644 --- a/libavcodec/ac3enc_template.c +++ b/libavcodec/ac3enc_template.c @@ -33,7 +33,7 @@ static void scale_coefficients(AC3EncodeContext *s); -static void apply_window(DSPContext *dsp, SampleType *output, +static void apply_window(void *dsp, SampleType *output, const SampleType *input, const SampleType *window, unsigned int len); @@ -107,8 +107,13 @@ static void apply_mdct(AC3EncodeContext *s) AC3Block *block = &s->blocks[blk]; const SampleType *input_samples = &s->planar_samples[ch][blk * AC3_BLOCK_SIZE]; +#if CONFIG_AC3ENC_FLOAT + apply_window(&s->fdsp, s->windowed_samples, input_samples, + s->mdct_window, AC3_WINDOW_SIZE); +#else apply_window(&s->dsp, s->windowed_samples, input_samples, s->mdct_window, AC3_WINDOW_SIZE); +#endif if (s->fixed_point) block->coeff_shift[ch+1] = normalize_samples(s); diff --git a/libavcodec/arm/dsputil_init_neon.c b/libavcodec/arm/dsputil_init_neon.c index d3ef85048f..398326c8c8 100644 --- a/libavcodec/arm/dsputil_init_neon.c +++ b/libavcodec/arm/dsputil_init_neon.c @@ -150,7 +150,6 @@ void ff_avg_h264_chroma_mc2_neon(uint8_t *, uint8_t *, int, int, int, int); void ff_vp3_v_loop_filter_neon(uint8_t *, int, int *); void ff_vp3_h_loop_filter_neon(uint8_t *, int, int *); -void ff_vector_fmul_neon(float *dst, const float *src0, const float *src1, int len); void ff_vector_fmul_window_neon(float *dst, const float *src0, const float *src1, const float *win, int len); void ff_vector_fmul_scalar_neon(float *dst, const float *src, float mul, @@ -328,7 +327,6 @@ void ff_dsputil_init_neon(DSPContext *c, AVCodecContext *avctx) c->vp3_idct_dc_add = ff_vp3_idct_dc_add_neon; } - c->vector_fmul = ff_vector_fmul_neon; c->vector_fmul_window = ff_vector_fmul_window_neon; c->vector_fmul_scalar = ff_vector_fmul_scalar_neon; c->vector_fmac_scalar = ff_vector_fmac_scalar_neon; diff --git a/libavcodec/arm/dsputil_init_vfp.c b/libavcodec/arm/dsputil_init_vfp.c index d5e2d3b4ef..d77d686578 100644 --- a/libavcodec/arm/dsputil_init_vfp.c +++ b/libavcodec/arm/dsputil_init_vfp.c @@ -18,20 +18,13 @@ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ -#include "libavutil/arm/cpu.h" #include "libavcodec/dsputil.h" #include "dsputil_arm.h" -void ff_vector_fmul_vfp(float *dst, const float *src0, - const float *src1, int len); void ff_vector_fmul_reverse_vfp(float *dst, const float *src0, const float *src1, int len); void ff_dsputil_init_vfp(DSPContext* c, AVCodecContext *avctx) { - int cpu_flags = av_get_cpu_flags(); - - if (!have_vfpv3(cpu_flags)) - c->vector_fmul = ff_vector_fmul_vfp; c->vector_fmul_reverse = ff_vector_fmul_reverse_vfp; } diff --git a/libavcodec/arm/dsputil_neon.S b/libavcodec/arm/dsputil_neon.S index b2243c8ccb..9a5a40d6ac 100644 --- a/libavcodec/arm/dsputil_neon.S +++ b/libavcodec/arm/dsputil_neon.S @@ -534,45 +534,6 @@ function ff_add_pixels_clamped_neon, export=1 bx lr endfunc -function ff_vector_fmul_neon, export=1 - subs r3, r3, #8 - vld1.32 {d0-d3}, [r1,:128]! - vld1.32 {d4-d7}, [r2,:128]! - vmul.f32 q8, q0, q2 - vmul.f32 q9, q1, q3 - beq 3f - bics ip, r3, #15 - beq 2f -1: subs ip, ip, #16 - vld1.32 {d0-d1}, [r1,:128]! - vld1.32 {d4-d5}, [r2,:128]! - vmul.f32 q10, q0, q2 - vld1.32 {d2-d3}, [r1,:128]! - vld1.32 {d6-d7}, [r2,:128]! - vmul.f32 q11, q1, q3 - vst1.32 {d16-d19},[r0,:128]! - vld1.32 {d0-d1}, [r1,:128]! - vld1.32 {d4-d5}, [r2,:128]! - vmul.f32 q8, q0, q2 - vld1.32 {d2-d3}, [r1,:128]! - vld1.32 {d6-d7}, [r2,:128]! - vmul.f32 q9, q1, q3 - vst1.32 {d20-d23},[r0,:128]! - bne 1b - ands r3, r3, #15 - beq 3f -2: vld1.32 {d0-d1}, [r1,:128]! - vld1.32 {d4-d5}, [r2,:128]! - vst1.32 {d16-d17},[r0,:128]! - vmul.f32 q8, q0, q2 - vld1.32 {d2-d3}, [r1,:128]! - vld1.32 {d6-d7}, [r2,:128]! - vst1.32 {d18-d19},[r0,:128]! - vmul.f32 q9, q1, q3 -3: vst1.32 {d16-d19},[r0,:128]! - bx lr -endfunc - function ff_vector_fmul_window_neon, export=1 push {r4,r5,lr} ldr lr, [sp, #12] diff --git a/libavcodec/arm/dsputil_vfp.S b/libavcodec/arm/dsputil_vfp.S index 8d385c7e42..9df955dbf9 100644 --- a/libavcodec/arm/dsputil_vfp.S +++ b/libavcodec/arm/dsputil_vfp.S @@ -36,53 +36,6 @@ * optimization manuals can be found at http://www.arm.com */ -/** - * ARM VFP optimized implementation of 'vector_fmul_c' function. - * Assume that len is a positive number and is multiple of 8 - */ -@ void ff_vector_fmul_vfp(float *dst, const float *src0, const float *src1, int len) -function ff_vector_fmul_vfp, export=1 - vpush {d8-d15} - fmrx r12, fpscr - orr r12, r12, #(3 << 16) /* set vector size to 4 */ - fmxr fpscr, r12 - - vldmia r1!, {s0-s3} - vldmia r2!, {s8-s11} - vldmia r1!, {s4-s7} - vldmia r2!, {s12-s15} - vmul.f32 s8, s0, s8 -1: - subs r3, r3, #16 - vmul.f32 s12, s4, s12 - itttt ge - vldmiage r1!, {s16-s19} - vldmiage r2!, {s24-s27} - vldmiage r1!, {s20-s23} - vldmiage r2!, {s28-s31} - it ge - vmulge.f32 s24, s16, s24 - vstmia r0!, {s8-s11} - vstmia r0!, {s12-s15} - it ge - vmulge.f32 s28, s20, s28 - itttt gt - vldmiagt r1!, {s0-s3} - vldmiagt r2!, {s8-s11} - vldmiagt r1!, {s4-s7} - vldmiagt r2!, {s12-s15} - ittt ge - vmulge.f32 s8, s0, s8 - vstmiage r0!, {s24-s27} - vstmiage r0!, {s28-s31} - bgt 1b - - bic r12, r12, #(7 << 16) /* set vector size back to 1 */ - fmxr fpscr, r12 - vpop {d8-d15} - bx lr -endfunc - /** * ARM VFP optimized implementation of 'vector_fmul_reverse_c' function. * Assume that len is a positive number and is multiple of 8 diff --git a/libavcodec/atrac3.c b/libavcodec/atrac3.c index f468f11065..638889b32b 100644 --- a/libavcodec/atrac3.c +++ b/libavcodec/atrac3.c @@ -36,9 +36,9 @@ #include #include +#include "libavutil/float_dsp.h" #include "avcodec.h" #include "get_bits.h" -#include "dsputil.h" #include "bytestream.h" #include "fft.h" #include "fmtconvert.h" @@ -125,13 +125,13 @@ typedef struct { FFTContext mdct_ctx; FmtConvertContext fmt_conv; + AVFloatDSPContext fdsp; } ATRAC3Context; static DECLARE_ALIGNED(32, float, mdct_window)[MDCT_SIZE]; static VLC spectral_coeff_tab[7]; static float gain_tab1[16]; static float gain_tab2[31]; -static DSPContext dsp; /** @@ -164,7 +164,7 @@ static void IMLT(ATRAC3Context *q, float *pInput, float *pOutput, int odd_band) q->mdct_ctx.imdct_calc(&q->mdct_ctx,pOutput,pInput); /* Perform windowing on the output. */ - dsp.vector_fmul(pOutput, pOutput, mdct_window, MDCT_SIZE); + q->fdsp.vector_fmul(pOutput, pOutput, mdct_window, MDCT_SIZE); } @@ -1039,7 +1039,7 @@ static av_cold int atrac3_decode_init(AVCodecContext *avctx) q->matrix_coeff_index_next[i] = 3; } - ff_dsputil_init(&dsp, avctx); + avpriv_float_dsp_init(&q->fdsp, avctx->flags & CODEC_FLAG_BITEXACT); ff_fmt_convert_init(&q->fmt_conv, avctx); q->pUnits = av_mallocz(sizeof(channel_unit)*q->channels); diff --git a/libavcodec/dsputil.c b/libavcodec/dsputil.c index f42c58516f..942f606ea8 100644 --- a/libavcodec/dsputil.c +++ b/libavcodec/dsputil.c @@ -2363,12 +2363,6 @@ WRAPPER8_16_SQ(quant_psnr8x8_c, quant_psnr16_c) WRAPPER8_16_SQ(rd8x8_c, rd16_c) WRAPPER8_16_SQ(bit8x8_c, bit16_c) -static void vector_fmul_c(float *dst, const float *src0, const float *src1, int len){ - int i; - for(i=0; iac3_downmix = ff_ac3_downmix_c; #endif - c->vector_fmul = vector_fmul_c; c->vector_fmul_reverse = vector_fmul_reverse_c; c->vector_fmul_add = vector_fmul_add_c; c->vector_fmul_window = vector_fmul_window_c; diff --git a/libavcodec/dsputil.h b/libavcodec/dsputil.h index e0e5083d99..ec3d7ee007 100644 --- a/libavcodec/dsputil.h +++ b/libavcodec/dsputil.h @@ -399,7 +399,6 @@ typedef struct DSPContext { void (*vorbis_inverse_coupling)(float *mag, float *ang, int blocksize); void (*ac3_downmix)(float (*samples)[256], float (*matrix)[2], int out_ch, int in_ch, int len); /* assume len is a multiple of 16, and arrays are 32-byte aligned */ - void (*vector_fmul)(float *dst, const float *src0, const float *src1, int len); void (*vector_fmul_reverse)(float *dst, const float *src0, const float *src1, int len); /* assume len is a multiple of 8, and src arrays are 16-byte aligned */ void (*vector_fmul_add)(float *dst, const float *src0, const float *src1, const float *src2, int len); diff --git a/libavcodec/nellymoserenc.c b/libavcodec/nellymoserenc.c index e1b1d793a4..18ea6846c2 100644 --- a/libavcodec/nellymoserenc.c +++ b/libavcodec/nellymoserenc.c @@ -35,6 +35,7 @@ * http://wiki.multimedia.cx/index.php?title=Nellymoser */ +#include "libavutil/float_dsp.h" #include "libavutil/mathematics.h" #include "nellymoser.h" #include "avcodec.h" @@ -55,6 +56,7 @@ typedef struct NellyMoserEncodeContext { AVCodecContext *avctx; int last_frame; DSPContext dsp; + AVFloatDSPContext fdsp; FFTContext mdct_ctx; AudioFrameQueue afq; DECLARE_ALIGNED(32, float, mdct_out)[NELLY_SAMPLES]; @@ -120,11 +122,11 @@ static void apply_mdct(NellyMoserEncodeContext *s) float *in1 = s->buf + NELLY_BUF_LEN; float *in2 = s->buf + 2 * NELLY_BUF_LEN; - s->dsp.vector_fmul (s->in_buff, in0, ff_sine_128, NELLY_BUF_LEN); + s->fdsp.vector_fmul (s->in_buff, in0, ff_sine_128, NELLY_BUF_LEN); s->dsp.vector_fmul_reverse(s->in_buff + NELLY_BUF_LEN, in1, ff_sine_128, NELLY_BUF_LEN); s->mdct_ctx.mdct_calc(&s->mdct_ctx, s->mdct_out, s->in_buff); - s->dsp.vector_fmul (s->in_buff, in1, ff_sine_128, NELLY_BUF_LEN); + s->fdsp.vector_fmul (s->in_buff, in1, ff_sine_128, NELLY_BUF_LEN); s->dsp.vector_fmul_reverse(s->in_buff + NELLY_BUF_LEN, in2, ff_sine_128, NELLY_BUF_LEN); s->mdct_ctx.mdct_calc(&s->mdct_ctx, s->mdct_out + NELLY_BUF_LEN, s->in_buff); } @@ -172,6 +174,7 @@ static av_cold int encode_init(AVCodecContext *avctx) if ((ret = ff_mdct_init(&s->mdct_ctx, 8, 0, 32768.0)) < 0) goto error; ff_dsputil_init(&s->dsp, avctx); + avpriv_float_dsp_init(&s->fdsp, avctx->flags & CODEC_FLAG_BITEXACT); /* Generate overlap window */ ff_sine_window_init(ff_sine_128, 128); diff --git a/libavcodec/ppc/float_altivec.c b/libavcodec/ppc/float_altivec.c index 6e0556ec42..5068fd4eb8 100644 --- a/libavcodec/ppc/float_altivec.c +++ b/libavcodec/ppc/float_altivec.c @@ -23,21 +23,6 @@ #include "dsputil_altivec.h" -static void vector_fmul_altivec(float *dst, const float *src0, const float *src1, int len) -{ - int i; - vector float d0, d1, s, zero = (vector float)vec_splat_u32(0); - for(i=0; ivector_fmul = vector_fmul_altivec; c->vector_fmul_reverse = vector_fmul_reverse_altivec; c->vector_fmul_add = vector_fmul_add_altivec; if(!(avctx->flags & CODEC_FLAG_BITEXACT)) { diff --git a/libavcodec/ra288.c b/libavcodec/ra288.c index d7cda3ccf8..aa7ad33312 100644 --- a/libavcodec/ra288.c +++ b/libavcodec/ra288.c @@ -19,6 +19,7 @@ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ +#include "libavutil/float_dsp.h" #include "avcodec.h" #define BITSTREAM_READER_LE #include "get_bits.h" @@ -26,7 +27,6 @@ #include "lpc.h" #include "celp_math.h" #include "celp_filters.h" -#include "dsputil.h" #define MAX_BACKWARD_FILTER_ORDER 36 #define MAX_BACKWARD_FILTER_LEN 40 @@ -38,6 +38,7 @@ typedef struct { AVFrame frame; DSPContext dsp; + AVFloatDSPContext fdsp; DECLARE_ALIGNED(32, float, sp_lpc)[FFALIGN(36, 16)]; ///< LPC coefficients for speech data (spec: A) DECLARE_ALIGNED(32, float, gain_lpc)[FFALIGN(10, 16)]; ///< LPC coefficients for gain (spec: GB) @@ -62,7 +63,7 @@ static av_cold int ra288_decode_init(AVCodecContext *avctx) { RA288Context *ractx = avctx->priv_data; avctx->sample_fmt = AV_SAMPLE_FMT_FLT; - ff_dsputil_init(&ractx->dsp, avctx); + avpriv_float_dsp_init(&ractx->fdsp, avctx->flags & CODEC_FLAG_BITEXACT); avcodec_get_frame_defaults(&ractx->frame); avctx->coded_frame = &ractx->frame; @@ -137,7 +138,7 @@ static void do_hybrid_window(RA288Context *ractx, MAX_BACKWARD_FILTER_LEN + MAX_BACKWARD_FILTER_NONREC, 16)]); - ractx->dsp.vector_fmul(work, window, hist, FFALIGN(order + n + non_rec, 16)); + ractx->fdsp.vector_fmul(work, window, hist, FFALIGN(order + n + non_rec, 16)); convolve(buffer1, work + order , n , order); convolve(buffer2, work + order + n, non_rec, order); @@ -164,7 +165,7 @@ static void backward_filter(RA288Context *ractx, do_hybrid_window(ractx, order, n, non_rec, temp, hist, rec, window); if (!compute_lpc_coefs(temp, order, lpc, 0, 1, 1)) - ractx->dsp.vector_fmul(lpc, lpc, tab, FFALIGN(order, 16)); + ractx->fdsp.vector_fmul(lpc, lpc, tab, FFALIGN(order, 16)); memmove(hist, hist + n, move_size*sizeof(*hist)); } diff --git a/libavcodec/twinvq.c b/libavcodec/twinvq.c index 67bc16088e..4421074d80 100644 --- a/libavcodec/twinvq.c +++ b/libavcodec/twinvq.c @@ -19,6 +19,7 @@ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ +#include "libavutil/float_dsp.h" #include "avcodec.h" #include "get_bits.h" #include "dsputil.h" @@ -176,6 +177,7 @@ typedef struct TwinContext { AVCodecContext *avctx; AVFrame frame; DSPContext dsp; + AVFloatDSPContext fdsp; FFTContext mdct_ctx[3]; const ModeTab *mtab; @@ -787,8 +789,8 @@ static void read_and_decode_spectrum(TwinContext *tctx, GetBitContext *gb, dec_bark_env(tctx, bark1[i][j], bark_use_hist[i][j], i, tctx->tmp_buf, gain[sub*i+j], ftype); - tctx->dsp.vector_fmul(chunk + block_size*j, chunk + block_size*j, tctx->tmp_buf, - block_size); + tctx->fdsp.vector_fmul(chunk + block_size*j, chunk + block_size*j, + tctx->tmp_buf, block_size); } @@ -809,7 +811,7 @@ static void read_and_decode_spectrum(TwinContext *tctx, GetBitContext *gb, dec_lpc_spectrum_inv(tctx, lsp, ftype, tctx->tmp_buf); for (j = 0; j < mtab->fmode[ftype].sub; j++) { - tctx->dsp.vector_fmul(chunk, chunk, tctx->tmp_buf, block_size); + tctx->fdsp.vector_fmul(chunk, chunk, tctx->tmp_buf, block_size); chunk += block_size; } } @@ -1156,6 +1158,7 @@ static av_cold int twin_decode_init(AVCodecContext *avctx) } ff_dsputil_init(&tctx->dsp, avctx); + avpriv_float_dsp_init(&tctx->fdsp, avctx->flags & CODEC_FLAG_BITEXACT); if ((ret = init_mdct_win(tctx))) { av_log(avctx, AV_LOG_ERROR, "Error initializing MDCT\n"); twin_decode_close(avctx); diff --git a/libavcodec/vorbisdec.c b/libavcodec/vorbisdec.c index 3489b8f029..08198d732a 100644 --- a/libavcodec/vorbisdec.c +++ b/libavcodec/vorbisdec.c @@ -26,6 +26,7 @@ #include #define BITSTREAM_READER_LE +#include "libavutil/float_dsp.h" #include "avcodec.h" #include "get_bits.h" #include "dsputil.h" @@ -124,6 +125,7 @@ typedef struct vorbis_context_s { AVFrame frame; GetBitContext gb; DSPContext dsp; + AVFloatDSPContext fdsp; FmtConvertContext fmt_conv; FFTContext mdct[2]; @@ -983,6 +985,7 @@ static av_cold int vorbis_decode_init(AVCodecContext *avccontext) vc->avccontext = avccontext; ff_dsputil_init(&vc->dsp, avccontext); + avpriv_float_dsp_init(&vc->fdsp, avccontext->flags & CODEC_FLAG_BITEXACT); ff_fmt_convert_init(&vc->fmt_conv, avccontext); if (avccontext->request_sample_fmt == AV_SAMPLE_FMT_FLT) { @@ -1605,7 +1608,7 @@ static int vorbis_parse_audio_packet(vorbis_context *vc) for (j = vc->audio_channels-1;j >= 0; j--) { ch_floor_ptr = vc->channel_floors + j * blocksize / 2; ch_res_ptr = vc->channel_residues + res_chan[j] * blocksize / 2; - vc->dsp.vector_fmul(ch_floor_ptr, ch_floor_ptr, ch_res_ptr, blocksize / 2); + vc->fdsp.vector_fmul(ch_floor_ptr, ch_floor_ptr, ch_res_ptr, blocksize / 2); mdct->imdct_half(mdct, ch_res_ptr, ch_floor_ptr); } diff --git a/libavcodec/x86/dsputil_mmx.c b/libavcodec/x86/dsputil_mmx.c index fca09b4e65..434d1859ec 100644 --- a/libavcodec/x86/dsputil_mmx.c +++ b/libavcodec/x86/dsputil_mmx.c @@ -2502,11 +2502,6 @@ int ff_add_hfyu_left_prediction_sse4(uint8_t *dst, const uint8_t *src, float ff_scalarproduct_float_sse(const float *v1, const float *v2, int order); -void ff_vector_fmul_sse(float *dst, const float *src0, const float *src1, - int len); -void ff_vector_fmul_avx(float *dst, const float *src0, const float *src1, - int len); - void ff_vector_fmul_reverse_sse(float *dst, const float *src0, const float *src1, int len); void ff_vector_fmul_reverse_avx(float *dst, const float *src0, @@ -2833,7 +2828,6 @@ static void dsputil_init_sse(DSPContext *c, AVCodecContext *avctx, int mm_flags) c->vorbis_inverse_coupling = vorbis_inverse_coupling_sse; c->ac3_downmix = ac3_downmix_sse; #if HAVE_YASM - c->vector_fmul = ff_vector_fmul_sse; c->vector_fmul_reverse = ff_vector_fmul_reverse_sse; c->vector_fmul_add = ff_vector_fmul_add_sse; #endif @@ -2995,7 +2989,6 @@ static void dsputil_init_avx(DSPContext *c, AVCodecContext *avctx, int mm_flags) } } c->butterflies_float_interleave = ff_butterflies_float_interleave_avx; - c->vector_fmul = ff_vector_fmul_avx; c->vector_fmul_reverse = ff_vector_fmul_reverse_avx; c->vector_fmul_add = ff_vector_fmul_add_avx; #endif diff --git a/libavcodec/x86/dsputil_yasm.asm b/libavcodec/x86/dsputil_yasm.asm index c6ef834503..313e774669 100644 --- a/libavcodec/x86/dsputil_yasm.asm +++ b/libavcodec/x86/dsputil_yasm.asm @@ -1129,38 +1129,6 @@ VECTOR_CLIP_INT32 11, 1, 1, 0 VECTOR_CLIP_INT32 6, 1, 0, 0 %endif -;----------------------------------------------------------------------------- -; void vector_fmul(float *dst, const float *src0, const float *src1, int len) -;----------------------------------------------------------------------------- -%macro VECTOR_FMUL 0 -cglobal vector_fmul, 4,4,2, dst, src0, src1, len - lea lenq, [lend*4 - 2*mmsize] -ALIGN 16 -.loop - mova m0, [src0q + lenq] - mova m1, [src0q + lenq + mmsize] - mulps m0, m0, [src1q + lenq] - mulps m1, m1, [src1q + lenq + mmsize] - mova [dstq + lenq], m0 - mova [dstq + lenq + mmsize], m1 - - sub lenq, 2*mmsize - jge .loop -%if mmsize == 32 - vzeroupper - RET -%else - REP_RET -%endif -%endmacro - -INIT_XMM sse -VECTOR_FMUL -%if HAVE_AVX -INIT_YMM avx -VECTOR_FMUL -%endif - ;----------------------------------------------------------------------------- ; void vector_fmul_reverse(float *dst, const float *src0, const float *src1, ; int len) diff --git a/libavutil/Makefile b/libavutil/Makefile index fb19ebf1e2..56ccd04dff 100644 --- a/libavutil/Makefile +++ b/libavutil/Makefile @@ -57,6 +57,7 @@ OBJS = adler32.o \ eval.o \ fifo.o \ file.o \ + float_dsp.o \ imgutils.o \ intfloat_readwrite.o \ inverse.o \ diff --git a/libavutil/arm/Makefile b/libavutil/arm/Makefile index e600383b9c..ac7eca6751 100644 --- a/libavutil/arm/Makefile +++ b/libavutil/arm/Makefile @@ -1 +1,8 @@ OBJS += arm/cpu.o \ + arm/float_dsp_init_arm.o \ + +ARMVFP-OBJS += arm/float_dsp_init_vfp.o \ + arm/float_dsp_vfp.o \ + +NEON-OBJS += arm/float_dsp_init_neon.o \ + arm/float_dsp_neon.o \ diff --git a/libavutil/arm/float_dsp_arm.h b/libavutil/arm/float_dsp_arm.h new file mode 100644 index 0000000000..976e5a0a24 --- /dev/null +++ b/libavutil/arm/float_dsp_arm.h @@ -0,0 +1,29 @@ +/* + * Copyright (c) 2009 Mans Rullgard + * + * 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 AVUTIL_ARM_FLOAT_DSP_ARM_H +#define AVUTIL_ARM_FLOAT_DSP_ARM_H + +#include "libavutil/float_dsp.h" + +void ff_dsputil_init_vfp (AVFloatDSPContext *fdsp); +void ff_dsputil_init_neon(AVFloatDSPContext *fdsp); + +#endif /* AVUTIL_ARM_FLOAT_DSP_ARM_H */ diff --git a/libavutil/arm/float_dsp_init_arm.c b/libavutil/arm/float_dsp_init_arm.c new file mode 100644 index 0000000000..0fee8611c4 --- /dev/null +++ b/libavutil/arm/float_dsp_init_arm.c @@ -0,0 +1,33 @@ +/* + * ARM optimized DSP utils + * + * 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 + */ + +#include "libavutil/arm/cpu.h" +#include "libavutil/float_dsp.h" +#include "float_dsp_arm.h" + +void ff_float_dsp_init_arm(AVFloatDSPContext *fdsp) +{ + int cpu_flags = av_get_cpu_flags(); + + if (have_vfp(cpu_flags)) + ff_dsputil_init_vfp(fdsp); + if (have_neon(cpu_flags)) + ff_dsputil_init_neon(fdsp); +} diff --git a/libavutil/arm/float_dsp_init_neon.c b/libavutil/arm/float_dsp_init_neon.c new file mode 100644 index 0000000000..1e732db9df --- /dev/null +++ b/libavutil/arm/float_dsp_init_neon.c @@ -0,0 +1,32 @@ +/* + * ARM NEON optimised Float DSP functions + * Copyright (c) 2008 Mans Rullgard + * + * 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 + */ + +#include + +#include "libavutil/float_dsp.h" +#include "float_dsp_arm.h" + +void ff_vector_fmul_neon(float *dst, const float *src0, const float *src1, int len); + +void ff_dsputil_init_neon(AVFloatDSPContext *fdsp) +{ + c->vector_fmul = ff_vector_fmul_neon; +} diff --git a/libavutil/arm/float_dsp_init_vfp.c b/libavutil/arm/float_dsp_init_vfp.c new file mode 100644 index 0000000000..d58dbded3a --- /dev/null +++ b/libavutil/arm/float_dsp_init_vfp.c @@ -0,0 +1,34 @@ +/* + * Copyright (c) 2008 Siarhei Siamashka + * + * 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 + */ + +#include "libavutil/arm/cpu.h" +#include "libavutil/float_dsp.h" +#include "float_dsp_arm.h" + +void ff_vector_fmul_vfp(float *dst, const float *src0, const float *src1, + int len); + +void ff_dsputil_init_vfp(DSPContext* c, AVCodecContext *avctx) +{ + int cpu_flags = av_get_cpu_flags(); + + if (!have_vfpv3(cpu_flags)) + c->vector_fmul = ff_vector_fmul_vfp; +} diff --git a/libavutil/arm/float_dsp_neon.S b/libavutil/arm/float_dsp_neon.S new file mode 100644 index 0000000000..d66fa09424 --- /dev/null +++ b/libavutil/arm/float_dsp_neon.S @@ -0,0 +1,64 @@ +/* + * ARM NEON optimised Float DSP functions + * Copyright (c) 2008 Mans Rullgard + * + * 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 + */ + +#include "config.h" +#include "asm.S" + + preserve8 + +function ff_vector_fmul_neon, export=1 + subs r3, r3, #8 + vld1.32 {d0-d3}, [r1,:128]! + vld1.32 {d4-d7}, [r2,:128]! + vmul.f32 q8, q0, q2 + vmul.f32 q9, q1, q3 + beq 3f + bics ip, r3, #15 + beq 2f +1: subs ip, ip, #16 + vld1.32 {d0-d1}, [r1,:128]! + vld1.32 {d4-d5}, [r2,:128]! + vmul.f32 q10, q0, q2 + vld1.32 {d2-d3}, [r1,:128]! + vld1.32 {d6-d7}, [r2,:128]! + vmul.f32 q11, q1, q3 + vst1.32 {d16-d19},[r0,:128]! + vld1.32 {d0-d1}, [r1,:128]! + vld1.32 {d4-d5}, [r2,:128]! + vmul.f32 q8, q0, q2 + vld1.32 {d2-d3}, [r1,:128]! + vld1.32 {d6-d7}, [r2,:128]! + vmul.f32 q9, q1, q3 + vst1.32 {d20-d23},[r0,:128]! + bne 1b + ands r3, r3, #15 + beq 3f +2: vld1.32 {d0-d1}, [r1,:128]! + vld1.32 {d4-d5}, [r2,:128]! + vst1.32 {d16-d17},[r0,:128]! + vmul.f32 q8, q0, q2 + vld1.32 {d2-d3}, [r1,:128]! + vld1.32 {d6-d7}, [r2,:128]! + vst1.32 {d18-d19},[r0,:128]! + vmul.f32 q9, q1, q3 +3: vst1.32 {d16-d19},[r0,:128]! + bx lr +endfunc diff --git a/libavutil/arm/float_dsp_vfp.S b/libavutil/arm/float_dsp_vfp.S new file mode 100644 index 0000000000..3931828381 --- /dev/null +++ b/libavutil/arm/float_dsp_vfp.S @@ -0,0 +1,68 @@ +/* + * Copyright (c) 2008 Siarhei Siamashka + * + * 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 + */ + +#include "config.h" +#include "asm.S" + +/** + * Assume that len is a positive number and is multiple of 8 + */ +@ void ff_vector_fmul_vfp(float *dst, const float *src0, const float *src1, int len) +function ff_vector_fmul_vfp, export=1 + vpush {d8-d15} + fmrx r12, fpscr + orr r12, r12, #(3 << 16) /* set vector size to 4 */ + fmxr fpscr, r12 + + vldmia r1!, {s0-s3} + vldmia r2!, {s8-s11} + vldmia r1!, {s4-s7} + vldmia r2!, {s12-s15} + vmul.f32 s8, s0, s8 +1: + subs r3, r3, #16 + vmul.f32 s12, s4, s12 + itttt ge + vldmiage r1!, {s16-s19} + vldmiage r2!, {s24-s27} + vldmiage r1!, {s20-s23} + vldmiage r2!, {s28-s31} + it ge + vmulge.f32 s24, s16, s24 + vstmia r0!, {s8-s11} + vstmia r0!, {s12-s15} + it ge + vmulge.f32 s28, s20, s28 + itttt gt + vldmiagt r1!, {s0-s3} + vldmiagt r2!, {s8-s11} + vldmiagt r1!, {s4-s7} + vldmiagt r2!, {s12-s15} + ittt ge + vmulge.f32 s8, s0, s8 + vstmiage r0!, {s24-s27} + vstmiage r0!, {s28-s31} + bgt 1b + + bic r12, r12, #(7 << 16) /* set vector size back to 1 */ + fmxr fpscr, r12 + vpop {d8-d15} + bx lr +endfunc diff --git a/libavutil/float_dsp.c b/libavutil/float_dsp.c new file mode 100644 index 0000000000..039dd07d36 --- /dev/null +++ b/libavutil/float_dsp.c @@ -0,0 +1,42 @@ +/* + * 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 + */ + +#include "config.h" + +#include "float_dsp.h" + +static void vector_fmul_c(float *dst, const float *src0, const float *src1, + int len) +{ + int i; + for (i = 0; i < len; i++) + dst[i] = src0[i] * src1[i]; +} + +void avpriv_float_dsp_init(AVFloatDSPContext *fdsp, int bit_exact) +{ + fdsp->vector_fmul = vector_fmul_c; + +#if ARCH_ARM + ff_float_dsp_init_arm(fdsp); +#elif ARCH_PPC + ff_float_dsp_init_ppc(fdsp, bit_exact); +#elif ARCH_X86 + ff_float_dsp_init_x86(fdsp); +#endif +} diff --git a/libavutil/float_dsp.h b/libavutil/float_dsp.h new file mode 100644 index 0000000000..30161a252b --- /dev/null +++ b/libavutil/float_dsp.h @@ -0,0 +1,53 @@ +/* + * 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 AVUTIL_FLOAT_DSP_H +#define AVUTIL_FLOAT_DSP_H + +typedef struct AVFloatDSPContext { + /** + * Calculate the product of two vectors of floats and store the result in + * a vector of floats. + * + * @param dst output vector + * constraints: 32-byte aligned + * @param src0 first input vector + * constraints: 32-byte aligned + * @param src1 second input vector + * constraints: 32-byte aligned + * @param len number of elements in the input + * constraints: multiple of 16 + */ + void (*vector_fmul)(float *dst, const float *src0, const float *src1, + int len); +} AVFloatDSPContext; + +/** + * Initialize a float DSP context. + * + * @param fdsp float DSP context + * @param strict setting to non-zero avoids using functions which may not be IEEE-754 compliant + */ +void avpriv_float_dsp_init(AVFloatDSPContext *fdsp, int strict); + + +void ff_float_dsp_init_arm(AVFloatDSPContext *fdsp); +void ff_float_dsp_init_ppc(AVFloatDSPContext *fdsp, int strict); +void ff_float_dsp_init_x86(AVFloatDSPContext *fdsp); + +#endif /* AVUTIL_FLOAT_DSP_H */ diff --git a/libavutil/ppc/Makefile b/libavutil/ppc/Makefile index 5b18b08957..4fd8d6d57e 100644 --- a/libavutil/ppc/Makefile +++ b/libavutil/ppc/Makefile @@ -1 +1,4 @@ OBJS += ppc/cpu.o \ + ppc/float_dsp_init.o \ + +ALTIVEC-OBJS += ppc/float_dsp_altivec.o \ diff --git a/libavutil/ppc/float_dsp_altivec.c b/libavutil/ppc/float_dsp_altivec.c new file mode 100644 index 0000000000..f08abc8d6f --- /dev/null +++ b/libavutil/ppc/float_dsp_altivec.c @@ -0,0 +1,37 @@ +/* + * Copyright (c) 2006 Luca Barbato + * + * 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 + */ + +#include "util_altivec.h" + +void ff_vector_fmul_altivec(float *dst, const float *src0, const float *src1, + int len) +{ + int i; + vector float d0, d1, s, zero = (vector float)vec_splat_u32(0); + for (i = 0; i < len - 7; i += 8) { + d0 = vec_ld( 0, src0 + i); + s = vec_ld( 0, src1 + i); + d1 = vec_ld(16, src0 + i); + d0 = vec_madd(d0, s, zero); + d1 = vec_madd(d1, vec_ld(16, src1 + i), zero); + vec_st(d0, 0, dst + i); + vec_st(d1, 16, dst + i); + } +} diff --git a/libavutil/ppc/float_dsp_init.c b/libavutil/ppc/float_dsp_init.c new file mode 100644 index 0000000000..0477749e83 --- /dev/null +++ b/libavutil/ppc/float_dsp_init.c @@ -0,0 +1,37 @@ +/* + * Copyright (c) 2006 Luca Barbato + * + * 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 + */ + +#include "libavutil/cpu.h" +#include "libavutil/float_dsp.h" + +extern void ff_vector_fmul_altivec(float *dst, const float *src0, + const float *src1, int len); + +void ff_float_dsp_init_ppc(AVFloatDSPContext *fdsp, int bit_exact) +{ +#if HAVE_ALTIVEC + int mm_flags = av_get_cpu_flags(); + + if (!(mm_flags & AV_CPU_FLAG_ALTIVEC)) + return; + + fdsp->vector_fmul = ff_vector_fmul_altivec; +#endif +} diff --git a/libavutil/x86/Makefile b/libavutil/x86/Makefile index de8a341442..4546353669 100644 --- a/libavutil/x86/Makefile +++ b/libavutil/x86/Makefile @@ -1 +1,4 @@ OBJS += x86/cpu.o \ + x86/float_dsp_init.o \ + +YASM-OBJS += x86/float_dsp.o \ diff --git a/libavutil/x86/float_dsp.asm b/libavutil/x86/float_dsp.asm new file mode 100644 index 0000000000..53be7ab99a --- /dev/null +++ b/libavutil/x86/float_dsp.asm @@ -0,0 +1,55 @@ +;***************************************************************************** +;* x86-optimized Float DSP functions +;* +;* 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 +;****************************************************************************** + +%include "x86inc.asm" + +SECTION .text + +;----------------------------------------------------------------------------- +; void vector_fmul(float *dst, const float *src0, const float *src1, int len) +;----------------------------------------------------------------------------- +%macro VECTOR_FMUL 0 +cglobal vector_fmul, 4,4,2, dst, src0, src1, len + lea lenq, [lend*4 - 2*mmsize] +ALIGN 16 +.loop + mova m0, [src0q + lenq] + mova m1, [src0q + lenq + mmsize] + mulps m0, m0, [src1q + lenq] + mulps m1, m1, [src1q + lenq + mmsize] + mova [dstq + lenq], m0 + mova [dstq + lenq + mmsize], m1 + + sub lenq, 2*mmsize + jge .loop +%if mmsize == 32 + vzeroupper + RET +%else + REP_RET +%endif +%endmacro + +INIT_XMM sse +VECTOR_FMUL +%if HAVE_AVX +INIT_YMM avx +VECTOR_FMUL +%endif diff --git a/libavutil/x86/float_dsp_init.c b/libavutil/x86/float_dsp_init.c new file mode 100644 index 0000000000..10bb226f23 --- /dev/null +++ b/libavutil/x86/float_dsp_init.c @@ -0,0 +1,41 @@ +/* + * 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 + */ + +#include "config.h" + +#include "libavutil/cpu.h" +#include "libavutil/float_dsp.h" + +extern void ff_vector_fmul_sse(float *dst, const float *src0, const float *src1, + int len); +extern void ff_vector_fmul_avx(float *dst, const float *src0, const float *src1, + int len); + +void ff_float_dsp_init_x86(AVFloatDSPContext *fdsp) +{ +#if HAVE_YASM + int mm_flags = av_get_cpu_flags(); + + if (mm_flags & AV_CPU_FLAG_SSE && HAVE_SSE) { + fdsp->vector_fmul = ff_vector_fmul_sse; + } + if (mm_flags & AV_CPU_FLAG_AVX && HAVE_AVX) { + fdsp->vector_fmul = ff_vector_fmul_avx; + } +#endif +} From a839d6abf870af82bdde8afdef40377eb31c82f8 Mon Sep 17 00:00:00 2001 From: Mans Rullgard Date: Fri, 8 Jun 2012 19:24:51 +0100 Subject: [PATCH 5/6] ARM: fix float_dsp breakage from d5a7229 Signed-off-by: Mans Rullgard --- libavutil/arm/float_dsp_arm.h | 4 ++-- libavutil/arm/float_dsp_init_arm.c | 4 ++-- libavutil/arm/float_dsp_init_neon.c | 4 ++-- libavutil/arm/float_dsp_init_vfp.c | 4 ++-- 4 files changed, 8 insertions(+), 8 deletions(-) diff --git a/libavutil/arm/float_dsp_arm.h b/libavutil/arm/float_dsp_arm.h index 976e5a0a24..81fad3ef2f 100644 --- a/libavutil/arm/float_dsp_arm.h +++ b/libavutil/arm/float_dsp_arm.h @@ -23,7 +23,7 @@ #include "libavutil/float_dsp.h" -void ff_dsputil_init_vfp (AVFloatDSPContext *fdsp); -void ff_dsputil_init_neon(AVFloatDSPContext *fdsp); +void ff_float_dsp_init_vfp (AVFloatDSPContext *fdsp); +void ff_float_dsp_init_neon(AVFloatDSPContext *fdsp); #endif /* AVUTIL_ARM_FLOAT_DSP_ARM_H */ diff --git a/libavutil/arm/float_dsp_init_arm.c b/libavutil/arm/float_dsp_init_arm.c index 0fee8611c4..a352becd0c 100644 --- a/libavutil/arm/float_dsp_init_arm.c +++ b/libavutil/arm/float_dsp_init_arm.c @@ -27,7 +27,7 @@ void ff_float_dsp_init_arm(AVFloatDSPContext *fdsp) int cpu_flags = av_get_cpu_flags(); if (have_vfp(cpu_flags)) - ff_dsputil_init_vfp(fdsp); + ff_float_dsp_init_vfp(fdsp); if (have_neon(cpu_flags)) - ff_dsputil_init_neon(fdsp); + ff_float_dsp_init_neon(fdsp); } diff --git a/libavutil/arm/float_dsp_init_neon.c b/libavutil/arm/float_dsp_init_neon.c index 1e732db9df..fa6d0d7d15 100644 --- a/libavutil/arm/float_dsp_init_neon.c +++ b/libavutil/arm/float_dsp_init_neon.c @@ -26,7 +26,7 @@ void ff_vector_fmul_neon(float *dst, const float *src0, const float *src1, int len); -void ff_dsputil_init_neon(AVFloatDSPContext *fdsp) +void ff_float_dsp_init_neon(AVFloatDSPContext *fdsp) { - c->vector_fmul = ff_vector_fmul_neon; + fdsp->vector_fmul = ff_vector_fmul_neon; } diff --git a/libavutil/arm/float_dsp_init_vfp.c b/libavutil/arm/float_dsp_init_vfp.c index d58dbded3a..30a9ce4ed7 100644 --- a/libavutil/arm/float_dsp_init_vfp.c +++ b/libavutil/arm/float_dsp_init_vfp.c @@ -25,10 +25,10 @@ void ff_vector_fmul_vfp(float *dst, const float *src0, const float *src1, int len); -void ff_dsputil_init_vfp(DSPContext* c, AVCodecContext *avctx) +void ff_float_dsp_init_vfp(AVFloatDSPContext *fdsp) { int cpu_flags = av_get_cpu_flags(); if (!have_vfpv3(cpu_flags)) - c->vector_fmul = ff_vector_fmul_vfp; + fdsp->vector_fmul = ff_vector_fmul_vfp; } From 3b81a18ba30bf18bab78f56744d8f3e1e4060104 Mon Sep 17 00:00:00 2001 From: Justin Ruggles Date: Fri, 8 Jun 2012 13:58:03 -0400 Subject: [PATCH 6/6] float_dsp: ppc: add a separate header for Altivec function prototypes Also include config.h so that HAVE_ALTIVEC will be defined. Fixes compilation on PPC with Altivec enabled. --- libavutil/ppc/float_dsp_altivec.c | 1 + libavutil/ppc/float_dsp_altivec.h | 27 +++++++++++++++++++++++++++ libavutil/ppc/float_dsp_init.c | 5 ++--- 3 files changed, 30 insertions(+), 3 deletions(-) create mode 100644 libavutil/ppc/float_dsp_altivec.h diff --git a/libavutil/ppc/float_dsp_altivec.c b/libavutil/ppc/float_dsp_altivec.c index f08abc8d6f..55e3fbe91f 100644 --- a/libavutil/ppc/float_dsp_altivec.c +++ b/libavutil/ppc/float_dsp_altivec.c @@ -19,6 +19,7 @@ */ #include "util_altivec.h" +#include "float_dsp_altivec.h" void ff_vector_fmul_altivec(float *dst, const float *src0, const float *src1, int len) diff --git a/libavutil/ppc/float_dsp_altivec.h b/libavutil/ppc/float_dsp_altivec.h new file mode 100644 index 0000000000..0b9425bef4 --- /dev/null +++ b/libavutil/ppc/float_dsp_altivec.h @@ -0,0 +1,27 @@ +/* + * Copyright (c) 2006 Luca Barbato + * + * 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 AVUTIL_PPC_FLOAT_DSP_ALTIVEC_H +#define AVUTIL_PPC_FLOAT_DSP_ALTIVEC_H + +extern void ff_vector_fmul_altivec(float *dst, const float *src0, + const float *src1, int len); + +#endif /* AVUTIL_PPC_FLOAT_DSP_ALTIVEC_H */ diff --git a/libavutil/ppc/float_dsp_init.c b/libavutil/ppc/float_dsp_init.c index 0477749e83..20527642cc 100644 --- a/libavutil/ppc/float_dsp_init.c +++ b/libavutil/ppc/float_dsp_init.c @@ -18,11 +18,10 @@ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ +#include "config.h" #include "libavutil/cpu.h" #include "libavutil/float_dsp.h" - -extern void ff_vector_fmul_altivec(float *dst, const float *src0, - const float *src1, int len); +#include "float_dsp_altivec.h" void ff_float_dsp_init_ppc(AVFloatDSPContext *fdsp, int bit_exact) {