annotate audioconvert.c @ 4765:85298e8c55c4 libavcodec

bfin dsputils, basic pixel operations sads, diffs, motion compensation and standard IEEE 8x8 block transforms patch by Marc Hoffman, mmh pleasantst com
author diego
date Sun, 01 Apr 2007 22:28:45 +0000
parents c8c591fe26f8
children 4dbe6578f811
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
3594
10c577c37617 audio format conversion
michael
parents:
diff changeset
1 /*
3596
2dc9933dc75f cosmetics
michael
parents: 3594
diff changeset
2 * audio conversion
3594
10c577c37617 audio format conversion
michael
parents:
diff changeset
3 * Copyright (c) 2006 Michael Niedermayer <michaelni@gmx.at>
10c577c37617 audio format conversion
michael
parents:
diff changeset
4 *
3947
c8c591fe26f8 Change license headers to say 'FFmpeg' instead of 'this program/this library'
diego
parents: 3596
diff changeset
5 * This file is part of FFmpeg.
c8c591fe26f8 Change license headers to say 'FFmpeg' instead of 'this program/this library'
diego
parents: 3596
diff changeset
6 *
c8c591fe26f8 Change license headers to say 'FFmpeg' instead of 'this program/this library'
diego
parents: 3596
diff changeset
7 * FFmpeg is free software; you can redistribute it and/or
3594
10c577c37617 audio format conversion
michael
parents:
diff changeset
8 * modify it under the terms of the GNU Lesser General Public
10c577c37617 audio format conversion
michael
parents:
diff changeset
9 * License as published by the Free Software Foundation; either
3947
c8c591fe26f8 Change license headers to say 'FFmpeg' instead of 'this program/this library'
diego
parents: 3596
diff changeset
10 * version 2.1 of the License, or (at your option) any later version.
3594
10c577c37617 audio format conversion
michael
parents:
diff changeset
11 *
3947
c8c591fe26f8 Change license headers to say 'FFmpeg' instead of 'this program/this library'
diego
parents: 3596
diff changeset
12 * FFmpeg is distributed in the hope that it will be useful,
3594
10c577c37617 audio format conversion
michael
parents:
diff changeset
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
10c577c37617 audio format conversion
michael
parents:
diff changeset
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
10c577c37617 audio format conversion
michael
parents:
diff changeset
15 * Lesser General Public License for more details.
10c577c37617 audio format conversion
michael
parents:
diff changeset
16 *
10c577c37617 audio format conversion
michael
parents:
diff changeset
17 * You should have received a copy of the GNU Lesser General Public
3947
c8c591fe26f8 Change license headers to say 'FFmpeg' instead of 'this program/this library'
diego
parents: 3596
diff changeset
18 * License along with FFmpeg; if not, write to the Free Software
3594
10c577c37617 audio format conversion
michael
parents:
diff changeset
19 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
10c577c37617 audio format conversion
michael
parents:
diff changeset
20 *
10c577c37617 audio format conversion
michael
parents:
diff changeset
21 */
10c577c37617 audio format conversion
michael
parents:
diff changeset
22
10c577c37617 audio format conversion
michael
parents:
diff changeset
23 /**
10c577c37617 audio format conversion
michael
parents:
diff changeset
24 * @file audioconvert.c
3596
2dc9933dc75f cosmetics
michael
parents: 3594
diff changeset
25 * audio conversion
3594
10c577c37617 audio format conversion
michael
parents:
diff changeset
26 * @author Michael Niedermayer <michaelni@gmx.at>
10c577c37617 audio format conversion
michael
parents:
diff changeset
27 */
10c577c37617 audio format conversion
michael
parents:
diff changeset
28
10c577c37617 audio format conversion
michael
parents:
diff changeset
29 #include "avcodec.h"
10c577c37617 audio format conversion
michael
parents:
diff changeset
30
10c577c37617 audio format conversion
michael
parents:
diff changeset
31 int av_audio_convert(void *maybe_dspcontext_or_something_av_convert_specific,
10c577c37617 audio format conversion
michael
parents:
diff changeset
32 void *out[6], int out_stride[6], enum SampleFormat out_fmt,
10c577c37617 audio format conversion
michael
parents:
diff changeset
33 void * in[6], int in_stride[6], enum SampleFormat in_fmt, int len){
10c577c37617 audio format conversion
michael
parents:
diff changeset
34 int ch;
10c577c37617 audio format conversion
michael
parents:
diff changeset
35 const int isize= FFMIN( in_fmt+1, 4);
10c577c37617 audio format conversion
michael
parents:
diff changeset
36 const int osize= FFMIN(out_fmt+1, 4);
10c577c37617 audio format conversion
michael
parents:
diff changeset
37 const int fmt_pair= out_fmt + 5*in_fmt;
10c577c37617 audio format conversion
michael
parents:
diff changeset
38
10c577c37617 audio format conversion
michael
parents:
diff changeset
39 //FIXME optimize common cases
10c577c37617 audio format conversion
michael
parents:
diff changeset
40
10c577c37617 audio format conversion
michael
parents:
diff changeset
41 for(ch=0; ch<6; ch++){
10c577c37617 audio format conversion
michael
parents:
diff changeset
42 const int is= in_stride[ch] * isize;
10c577c37617 audio format conversion
michael
parents:
diff changeset
43 const int os= out_stride[ch] * osize;
10c577c37617 audio format conversion
michael
parents:
diff changeset
44 uint8_t *pi= in[ch];
10c577c37617 audio format conversion
michael
parents:
diff changeset
45 uint8_t *po= out[ch];
10c577c37617 audio format conversion
michael
parents:
diff changeset
46 uint8_t *end= po + os;
10c577c37617 audio format conversion
michael
parents:
diff changeset
47 if(!out[ch])
10c577c37617 audio format conversion
michael
parents:
diff changeset
48 continue;
10c577c37617 audio format conversion
michael
parents:
diff changeset
49
10c577c37617 audio format conversion
michael
parents:
diff changeset
50 #define CONV(ofmt, otype, ifmt, expr)\
10c577c37617 audio format conversion
michael
parents:
diff changeset
51 if(fmt_pair == ofmt + 5*ifmt){\
10c577c37617 audio format conversion
michael
parents:
diff changeset
52 do{\
10c577c37617 audio format conversion
michael
parents:
diff changeset
53 *(otype*)po = expr; pi += is; po += os;\
10c577c37617 audio format conversion
michael
parents:
diff changeset
54 }while(po < end);\
10c577c37617 audio format conversion
michael
parents:
diff changeset
55 }
10c577c37617 audio format conversion
michael
parents:
diff changeset
56
10c577c37617 audio format conversion
michael
parents:
diff changeset
57 //FIXME put things below under ifdefs so we dont waste space for cases no codec will need
10c577c37617 audio format conversion
michael
parents:
diff changeset
58 //FIXME rounding and cliping ?
10c577c37617 audio format conversion
michael
parents:
diff changeset
59
10c577c37617 audio format conversion
michael
parents:
diff changeset
60 CONV(SAMPLE_FMT_U8 , uint8_t, SAMPLE_FMT_U8 , *(uint8_t*)pi)
10c577c37617 audio format conversion
michael
parents:
diff changeset
61 else CONV(SAMPLE_FMT_S16, int16_t, SAMPLE_FMT_U8 , (*(uint8_t*)pi - 0x80)<<8)
10c577c37617 audio format conversion
michael
parents:
diff changeset
62 else CONV(SAMPLE_FMT_S32, int32_t, SAMPLE_FMT_U8 , (*(uint8_t*)pi - 0x80)<<24)
10c577c37617 audio format conversion
michael
parents:
diff changeset
63 else CONV(SAMPLE_FMT_FLT, float , SAMPLE_FMT_U8 , (*(uint8_t*)pi - 0x80)*(1.0 / (1<<7)))
10c577c37617 audio format conversion
michael
parents:
diff changeset
64 else CONV(SAMPLE_FMT_U8 , uint8_t, SAMPLE_FMT_S16, (*(int16_t*)pi>>8) + 0x80)
10c577c37617 audio format conversion
michael
parents:
diff changeset
65 else CONV(SAMPLE_FMT_S16, int16_t, SAMPLE_FMT_S16, *(int16_t*)pi)
10c577c37617 audio format conversion
michael
parents:
diff changeset
66 else CONV(SAMPLE_FMT_S32, int32_t, SAMPLE_FMT_S16, *(int16_t*)pi<<16)
10c577c37617 audio format conversion
michael
parents:
diff changeset
67 else CONV(SAMPLE_FMT_FLT, float , SAMPLE_FMT_S16, *(int16_t*)pi*(1.0 / (1<<15)))
10c577c37617 audio format conversion
michael
parents:
diff changeset
68 else CONV(SAMPLE_FMT_U8 , uint8_t, SAMPLE_FMT_S32, (*(int32_t*)pi>>24) + 0x80)
10c577c37617 audio format conversion
michael
parents:
diff changeset
69 else CONV(SAMPLE_FMT_S16, int16_t, SAMPLE_FMT_S32, *(int32_t*)pi>>16)
10c577c37617 audio format conversion
michael
parents:
diff changeset
70 else CONV(SAMPLE_FMT_S32, int32_t, SAMPLE_FMT_S32, *(int32_t*)pi)
10c577c37617 audio format conversion
michael
parents:
diff changeset
71 else CONV(SAMPLE_FMT_FLT, float , SAMPLE_FMT_S32, *(int32_t*)pi*(1.0 / (1<<31)))
10c577c37617 audio format conversion
michael
parents:
diff changeset
72 else CONV(SAMPLE_FMT_U8 , uint8_t, SAMPLE_FMT_FLT, lrintf(*(float*)pi * (1<<7)) + 0x80)
10c577c37617 audio format conversion
michael
parents:
diff changeset
73 else CONV(SAMPLE_FMT_S16, int16_t, SAMPLE_FMT_FLT, lrintf(*(float*)pi * (1<<15)))
10c577c37617 audio format conversion
michael
parents:
diff changeset
74 else CONV(SAMPLE_FMT_S32, int32_t, SAMPLE_FMT_FLT, lrintf(*(float*)pi * (1<<31)))
10c577c37617 audio format conversion
michael
parents:
diff changeset
75 else CONV(SAMPLE_FMT_FLT, float , SAMPLE_FMT_FLT, *(float*)pi)
10c577c37617 audio format conversion
michael
parents:
diff changeset
76 else return -1;
10c577c37617 audio format conversion
michael
parents:
diff changeset
77 }
10c577c37617 audio format conversion
michael
parents:
diff changeset
78 return 0;
10c577c37617 audio format conversion
michael
parents:
diff changeset
79 }