00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021 #include <stdint.h>
00022
00023 #include "libavutil/arm/cpu.h"
00024 #include "libavcodec/avcodec.h"
00025 #include "libavcodec/fmtconvert.h"
00026
00027 void ff_int32_to_float_fmul_scalar_neon(float *dst, const int *src,
00028 float mul, int len);
00029
00030 void ff_float_to_int16_neon(int16_t *dst, const float *src, long len);
00031 void ff_float_to_int16_interleave_neon(int16_t *, const float **, long, int);
00032
00033 void ff_float_to_int16_vfp(int16_t *dst, const float *src, long len);
00034
00035 void ff_fmt_convert_init_arm(FmtConvertContext *c, AVCodecContext *avctx)
00036 {
00037 int cpu_flags = av_get_cpu_flags();
00038
00039 if (have_vfp(cpu_flags) && have_armv6(cpu_flags)) {
00040 c->float_to_int16 = ff_float_to_int16_vfp;
00041 }
00042
00043 if (have_neon(cpu_flags)) {
00044 c->int32_to_float_fmul_scalar = ff_int32_to_float_fmul_scalar_neon;
00045
00046 if (!(avctx->flags & CODEC_FLAG_BITEXACT)) {
00047 c->float_to_int16 = ff_float_to_int16_neon;
00048 c->float_to_int16_interleave = ff_float_to_int16_interleave_neon;
00049 }
00050 }
00051 }