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 FFmpeg.
8 * FFmpeg 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 * FFmpeg 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 FFmpeg; 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 int32_t *src
,
32 dst
[i
] = src
[i
] * mul
;
35 static void int32_to_float_fmul_array8_c(FmtConvertContext
*c
, float *dst
,
36 const int32_t *src
, const float *mul
,
40 for (i
= 0; i
< len
; i
+= 8)
41 c
->int32_to_float_fmul_scalar(&dst
[i
], &src
[i
], *mul
++, 8);
44 static av_always_inline
int float_to_int16_one(const float *src
){
45 return av_clip_int16(lrintf(*src
));
48 static void float_to_int16_c(int16_t *dst
, const float *src
, long len
)
52 dst
[i
] = float_to_int16_one(src
+i
);
55 static void float_to_int16_interleave_c(int16_t *dst
, const float **src
,
56 long len
, int channels
)
61 dst
[2*i
] = float_to_int16_one(src
[0]+i
);
62 dst
[2*i
+1] = float_to_int16_one(src
[1]+i
);
65 for(c
=0; c
<channels
; c
++)
66 for(i
=0, j
=c
; i
<len
; i
++, j
+=channels
)
67 dst
[j
] = float_to_int16_one(src
[c
]+i
);
71 void ff_float_interleave_c(float *dst
, const float **src
, unsigned int len
,
77 for (i
= 0; i
< len
; i
++) {
79 dst
[2*i
+1] = src
[1][i
];
81 } else if (channels
== 1 && len
< INT_MAX
/ sizeof(float)) {
82 memcpy(dst
, src
[0], len
* sizeof(float));
84 for (c
= 0; c
< channels
; c
++)
85 for (i
= 0, j
= c
; i
< len
; i
++, j
+= channels
)
90 av_cold
void ff_fmt_convert_init(FmtConvertContext
*c
, AVCodecContext
*avctx
)
92 c
->int32_to_float_fmul_scalar
= int32_to_float_fmul_scalar_c
;
93 c
->int32_to_float_fmul_array8
= int32_to_float_fmul_array8_c
;
94 c
->float_to_int16
= float_to_int16_c
;
95 c
->float_to_int16_interleave
= float_to_int16_interleave_c
;
96 c
->float_interleave
= ff_float_interleave_c
;
98 if (ARCH_ARM
) ff_fmt_convert_init_arm(c
, avctx
);
99 if (ARCH_PPC
) ff_fmt_convert_init_ppc(c
, avctx
);
100 if (ARCH_X86
) ff_fmt_convert_init_x86(c
, avctx
);
101 if (HAVE_MIPSFPU
) ff_fmt_convert_init_mips(c
);
104 /* ffdshow custom code */
105 void float_interleave(float *dst
, const float **src
, long len
, int channels
)
109 for(i
=0; i
<len
; i
++){
110 dst
[2*i
] = src
[0][i
] / 32768.0f
;
111 dst
[2*i
+1] = src
[1][i
] / 32768.0f
;
114 for(c
=0; c
<channels
; c
++)
115 for(i
=0, j
=c
; i
<len
; i
++, j
+=channels
)
116 dst
[j
] = src
[c
][i
] / 32768.0f
;
120 void float_interleave_noscale(float *dst
, const float **src
, long len
, int channels
)
124 for(i
=0; i
<len
; i
++){
125 dst
[2*i
] = src
[0][i
];
126 dst
[2*i
+1] = src
[1][i
];
129 for(c
=0; c
<channels
; c
++)
130 for(i
=0, j
=c
; i
<len
; i
++, j
+=channels
)