3 * Copyright (c) 2006 Michael Niedermayer <michaelni@gmx.at>
5 * This file is part of FFmpeg.
7 * FFmpeg is free software; you can redistribute it and/or
8 * modify it under the terms of the GNU Lesser General Public
9 * License as published by the Free Software Foundation; either
10 * version 2.1 of the License, or (at your option) any later version.
12 * FFmpeg is distributed in the hope that it will be useful,
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
15 * Lesser General Public License for more details.
17 * You should have received a copy of the GNU Lesser General Public
18 * License along with FFmpeg; if not, write to the Free Software
19 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
23 * @file audioconvert.c
25 * @author Michael Niedermayer <michaelni@gmx.at>
30 int av_audio_convert(void *maybe_dspcontext_or_something_av_convert_specific
,
31 void *out
[6], int out_stride
[6], enum SampleFormat out_fmt
,
32 void * in
[6], int in_stride
[6], enum SampleFormat in_fmt
, int len
){
34 const int isize
= FFMIN( in_fmt
+1, 4);
35 const int osize
= FFMIN(out_fmt
+1, 4);
36 const int fmt_pair
= out_fmt
+ 5*in_fmt
;
38 //FIXME optimize common cases
40 for(ch
=0; ch
<6; ch
++){
41 const int is
= in_stride
[ch
] * isize
;
42 const int os
= out_stride
[ch
] * osize
;
45 uint8_t *end
= po
+ os
;
49 #define CONV(ofmt, otype, ifmt, expr)\
50 if(fmt_pair == ofmt + 5*ifmt){\
52 *(otype*)po = expr; pi += is; po += os;\
56 //FIXME put things below under ifdefs so we do not waste space for cases no codec will need
57 //FIXME rounding and clipping ?
59 CONV(SAMPLE_FMT_U8
, uint8_t, SAMPLE_FMT_U8
, *(uint8_t*)pi
)
60 else CONV(SAMPLE_FMT_S16
, int16_t, SAMPLE_FMT_U8
, (*(uint8_t*)pi
- 0x80)<<8)
61 else CONV(SAMPLE_FMT_S32
, int32_t, SAMPLE_FMT_U8
, (*(uint8_t*)pi
- 0x80)<<24)
62 else CONV(SAMPLE_FMT_FLT
, float , SAMPLE_FMT_U8
, (*(uint8_t*)pi
- 0x80)*(1.0 / (1<<7)))
63 else CONV(SAMPLE_FMT_U8
, uint8_t, SAMPLE_FMT_S16
, (*(int16_t*)pi
>>8) + 0x80)
64 else CONV(SAMPLE_FMT_S16
, int16_t, SAMPLE_FMT_S16
, *(int16_t*)pi
)
65 else CONV(SAMPLE_FMT_S32
, int32_t, SAMPLE_FMT_S16
, *(int16_t*)pi
<<16)
66 else CONV(SAMPLE_FMT_FLT
, float , SAMPLE_FMT_S16
, *(int16_t*)pi
*(1.0 / (1<<15)))
67 else CONV(SAMPLE_FMT_U8
, uint8_t, SAMPLE_FMT_S32
, (*(int32_t*)pi
>>24) + 0x80)
68 else CONV(SAMPLE_FMT_S16
, int16_t, SAMPLE_FMT_S32
, *(int32_t*)pi
>>16)
69 else CONV(SAMPLE_FMT_S32
, int32_t, SAMPLE_FMT_S32
, *(int32_t*)pi
)
70 else CONV(SAMPLE_FMT_FLT
, float , SAMPLE_FMT_S32
, *(int32_t*)pi
*(1.0 / (1<<31)))
71 else CONV(SAMPLE_FMT_U8
, uint8_t, SAMPLE_FMT_FLT
, lrintf(*(float*)pi
* (1<<7)) + 0x80)
72 else CONV(SAMPLE_FMT_S16
, int16_t, SAMPLE_FMT_FLT
, lrintf(*(float*)pi
* (1<<15)))
73 else CONV(SAMPLE_FMT_S32
, int32_t, SAMPLE_FMT_FLT
, lrintf(*(float*)pi
* (1<<31)))
74 else CONV(SAMPLE_FMT_FLT
, float , SAMPLE_FMT_FLT
, *(float*)pi
)