2 * Format Conversion Utils
3 * Copyright (c) 2000, 2001 Fabrice Bellard
4 * Copyright (c) 2002-2004 Michael Niedermayer <michaelni@gmx.at>
6 * This file is part of Libav.
8 * Libav is free software; you can redistribute it and/or
9 * modify it under the terms of the GNU Lesser General Public
10 * License as published by the Free Software Foundation; either
11 * version 2.1 of the License, or (at your option) any later version.
13 * Libav is distributed in the hope that it will be useful,
14 * but WITHOUT ANY WARRANTY; without even the implied warranty of
15 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
16 * Lesser General Public License for more details.
18 * You should have received a copy of the GNU Lesser General Public
19 * License along with Libav; if not, write to the Free Software
20 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
24 #include "fmtconvert.h"
25 #include "libavutil/common.h"
27 static void int32_to_float_fmul_scalar_c(float *dst
, const int *src
, float mul
, int len
){
30 dst
[i
] = src
[i
] * mul
;
33 static av_always_inline
int float_to_int16_one(const float *src
){
34 return av_clip_int16(lrintf(*src
));
37 static void float_to_int16_c(int16_t *dst
, const float *src
, long len
)
41 dst
[i
] = float_to_int16_one(src
+i
);
44 static void float_to_int16_interleave_c(int16_t *dst
, const float **src
,
45 long len
, int channels
)
50 dst
[2*i
] = float_to_int16_one(src
[0]+i
);
51 dst
[2*i
+1] = float_to_int16_one(src
[1]+i
);
54 for(c
=0; c
<channels
; c
++)
55 for(i
=0, j
=c
; i
<len
; i
++, j
+=channels
)
56 dst
[j
] = float_to_int16_one(src
[c
]+i
);
60 void ff_float_interleave_c(float *dst
, const float **src
, unsigned int len
,
66 for (i
= 0; i
< len
; i
++) {
68 dst
[2*i
+1] = src
[1][i
];
70 } else if (channels
== 1 && len
< INT_MAX
/ sizeof(float)) {
71 memcpy(dst
, src
[0], len
* sizeof(float));
73 for (c
= 0; c
< channels
; c
++)
74 for (i
= 0, j
= c
; i
< len
; i
++, j
+= channels
)
79 av_cold
void ff_fmt_convert_init(FmtConvertContext
*c
, AVCodecContext
*avctx
)
81 c
->int32_to_float_fmul_scalar
= int32_to_float_fmul_scalar_c
;
82 c
->float_to_int16
= float_to_int16_c
;
83 c
->float_to_int16_interleave
= float_to_int16_interleave_c
;
84 c
->float_interleave
= ff_float_interleave_c
;
86 if (ARCH_ARM
) ff_fmt_convert_init_arm(c
, avctx
);
87 if (HAVE_ALTIVEC
) ff_fmt_convert_init_altivec(c
, avctx
);
88 if (ARCH_X86
) ff_fmt_convert_init_x86(c
, avctx
);