| @@ -109,6 +109,8 @@ av_cold void ff_ac3dsp_init(AC3DSPContext *c, int bit_exact) | |||||
| c->ac3_rshift_int32 = ac3_rshift_int32_c; | c->ac3_rshift_int32 = ac3_rshift_int32_c; | ||||
| c->float_to_fixed24 = float_to_fixed24_c; | c->float_to_fixed24 = float_to_fixed24_c; | ||||
| if (ARCH_ARM) | |||||
| ff_ac3dsp_init_arm(c, bit_exact); | |||||
| if (HAVE_MMX) | if (HAVE_MMX) | ||||
| ff_ac3dsp_init_x86(c, bit_exact); | ff_ac3dsp_init_x86(c, bit_exact); | ||||
| } | } | ||||
| @@ -84,6 +84,7 @@ typedef struct AC3DSPContext { | |||||
| } AC3DSPContext; | } AC3DSPContext; | ||||
| void ff_ac3dsp_init (AC3DSPContext *c, int bit_exact); | void ff_ac3dsp_init (AC3DSPContext *c, int bit_exact); | ||||
| void ff_ac3dsp_init_arm(AC3DSPContext *c, int bit_exact); | |||||
| void ff_ac3dsp_init_x86(AC3DSPContext *c, int bit_exact); | void ff_ac3dsp_init_x86(AC3DSPContext *c, int bit_exact); | ||||
| #endif /* AVCODEC_AC3DSP_H */ | #endif /* AVCODEC_AC3DSP_H */ | ||||
| @@ -1,3 +1,4 @@ | |||||
| OBJS-$(CONFIG_AC3DSP) += arm/ac3dsp_init_arm.o | |||||
| OBJS-$(CONFIG_DCA_DECODER) += arm/dcadsp_init_arm.o \ | OBJS-$(CONFIG_DCA_DECODER) += arm/dcadsp_init_arm.o \ | ||||
| OBJS-$(CONFIG_VP5_DECODER) += arm/vp56dsp_init_arm.o | OBJS-$(CONFIG_VP5_DECODER) += arm/vp56dsp_init_arm.o | ||||
| @@ -46,6 +47,8 @@ NEON-OBJS-$(CONFIG_H264DSP) += arm/h264dsp_neon.o \ | |||||
| NEON-OBJS-$(CONFIG_H264PRED) += arm/h264pred_neon.o \ | NEON-OBJS-$(CONFIG_H264PRED) += arm/h264pred_neon.o \ | ||||
| NEON-OBJS-$(CONFIG_AC3DSP) += arm/ac3dsp_neon.o | |||||
| NEON-OBJS-$(CONFIG_DCA_DECODER) += arm/dcadsp_neon.o \ | NEON-OBJS-$(CONFIG_DCA_DECODER) += arm/dcadsp_neon.o \ | ||||
| arm/synth_filter_neon.o \ | arm/synth_filter_neon.o \ | ||||
| @@ -0,0 +1,35 @@ | |||||
| /* | |||||
| * Copyright (c) 2011 Mans Rullgard <mans@mansr.com> | |||||
| * | |||||
| * 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 <stdint.h> | |||||
| #include "libavutil/attributes.h" | |||||
| #include "libavcodec/ac3dsp.h" | |||||
| #include "config.h" | |||||
| void ff_ac3_exponent_min_neon(uint8_t *exp, int num_reuse_blocks, int nb_coefs); | |||||
| int ff_ac3_max_msb_abs_int16_neon(const int16_t *src, int len); | |||||
| av_cold void ff_ac3dsp_init_arm(AC3DSPContext *c, int bit_exact) | |||||
| { | |||||
| if (HAVE_NEON) { | |||||
| c->ac3_exponent_min = ff_ac3_exponent_min_neon; | |||||
| c->ac3_max_msb_abs_int16 = ff_ac3_max_msb_abs_int16_neon; | |||||
| } | |||||
| } | |||||
| @@ -0,0 +1,59 @@ | |||||
| /* | |||||
| * Copyright (c) 2011 Mans Rullgard <mans@mansr.com> | |||||
| * | |||||
| * 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 "asm.S" | |||||
| function ff_ac3_max_msb_abs_int16_neon, export=1 | |||||
| vmov.i16 q0, #0 | |||||
| vmov.i16 q2, #0 | |||||
| 1: vld1.16 {q1}, [r0,:128]! | |||||
| vabs.s16 q1, q1 | |||||
| vld1.16 {q3}, [r0,:128]! | |||||
| vabs.s16 q3, q3 | |||||
| vorr q0, q0, q1 | |||||
| vorr q2, q2, q3 | |||||
| subs r1, r1, #16 | |||||
| bgt 1b | |||||
| vorr q0, q0, q2 | |||||
| vorr d0, d0, d1 | |||||
| vpmax.u16 d0, d0, d0 | |||||
| vpmax.u16 d0, d0, d0 | |||||
| vmov.u16 r0, d0[0] | |||||
| bx lr | |||||
| endfunc | |||||
| function ff_ac3_exponent_min_neon, export=1 | |||||
| cmp r1, #0 | |||||
| bxeq lr | |||||
| push {lr} | |||||
| mov r12, #256 | |||||
| 1: | |||||
| vld1.8 {q0}, [r0,:128] | |||||
| mov lr, r1 | |||||
| add r3, r0, #256 | |||||
| 2: vld1.8 {q1}, [r3,:128], r12 | |||||
| subs lr, lr, #1 | |||||
| vmin.u8 q0, q0, q1 | |||||
| bgt 2b | |||||
| subs r2, r2, #16 | |||||
| vst1.8 {q0}, [r0,:128]! | |||||
| bgt 1b | |||||
| pop {pc} | |||||
| endfunc | |||||