FFmpeg
Main Page
Related Pages
Modules
Data Structures
Files
Examples
File List
Globals
All
Data Structures
Files
Functions
Variables
Typedefs
Enumerations
Enumerator
Macros
Groups
Pages
libavcodec
audioconvert.c
Go to the documentation of this file.
1
/*
2
* audio conversion
3
* Copyright (c) 2006 Michael Niedermayer <michaelni@gmx.at>
4
*
5
* This file is part of FFmpeg.
6
*
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.
11
*
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.
16
*
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
20
*/
21
22
/**
23
* @file
24
* audio conversion
25
* @author Michael Niedermayer <michaelni@gmx.at>
26
*/
27
28
#include "
libavutil/avstring.h
"
29
#include "
libavutil/common.h
"
30
#include "
libavutil/libm.h
"
31
#include "
libavutil/samplefmt.h
"
32
#include "
avcodec.h
"
33
#include "
audioconvert.h
"
34
35
struct
AVAudioConvert
{
36
int
in_channels
,
out_channels
;
37
int
fmt_pair
;
38
};
39
40
AVAudioConvert
*
av_audio_convert_alloc
(
enum
AVSampleFormat
out_fmt,
int
out_channels,
41
enum
AVSampleFormat
in_fmt,
int
in_channels,
42
const
float
*matrix,
int
flags
)
43
{
44
AVAudioConvert
*ctx;
45
if
(in_channels!=out_channels)
46
return
NULL
;
/* FIXME: not supported */
47
ctx =
av_malloc
(
sizeof
(
AVAudioConvert
));
48
if
(!ctx)
49
return
NULL
;
50
ctx->
in_channels
= in_channels;
51
ctx->
out_channels
= out_channels;
52
ctx->
fmt_pair
= out_fmt +
AV_SAMPLE_FMT_NB
*in_fmt;
53
return
ctx;
54
}
55
56
void
av_audio_convert_free
(
AVAudioConvert
*ctx)
57
{
58
av_free
(ctx);
59
}
60
61
int
av_audio_convert
(
AVAudioConvert
*ctx,
62
void
*
const
out[6],
const
int
out_stride[6],
63
const
void
*
const
in[6],
const
int
in_stride[6],
int
len
)
64
{
65
int
ch;
66
67
//FIXME optimize common cases
68
69
for
(ch=0; ch<ctx->
out_channels
; ch++){
70
const
int
is= in_stride[ch];
71
const
int
os= out_stride[ch];
72
const
uint8_t
*pi= in[ch];
73
uint8_t
*po= out[ch];
74
uint8_t
*
end
= po + os*
len
;
75
if
(!out[ch])
76
continue
;
77
78
#define CONV(ofmt, otype, ifmt, expr)\
79
if(ctx->fmt_pair == ofmt + AV_SAMPLE_FMT_NB*ifmt){\
80
do{\
81
*(otype*)po = expr; pi += is; po += os;\
82
}while(po < end);\
83
}
84
85
//FIXME put things below under ifdefs so we do not waste space for cases no codec will need
86
//FIXME rounding ?
87
88
CONV
(
AV_SAMPLE_FMT_U8
,
uint8_t
,
AV_SAMPLE_FMT_U8
, *(
const
uint8_t
*)pi)
89
else
CONV
(
AV_SAMPLE_FMT_S16
, int16_t,
AV_SAMPLE_FMT_U8
, (*(
const
uint8_t
*)pi - 0x80)<<8)
90
else
CONV
(
AV_SAMPLE_FMT_S32
,
int32_t
,
AV_SAMPLE_FMT_U8
, (*(
const
uint8_t
*)pi - 0x80)<<24)
91
else
CONV
(
AV_SAMPLE_FMT_FLT
,
float
,
AV_SAMPLE_FMT_U8
, (*(
const
uint8_t
*)pi - 0x80)*(1.0 / (1<<7)))
92
else
CONV
(
AV_SAMPLE_FMT_DBL
,
double
,
AV_SAMPLE_FMT_U8
, (*(
const
uint8_t
*)pi - 0x80)*(1.0 / (1<<7)))
93
else
CONV
(
AV_SAMPLE_FMT_U8
,
uint8_t
,
AV_SAMPLE_FMT_S16
, (*(
const
int16_t*)pi>>8) + 0x80)
94
else
CONV
(
AV_SAMPLE_FMT_S16
, int16_t,
AV_SAMPLE_FMT_S16
, *(
const
int16_t*)pi)
95
else
CONV
(
AV_SAMPLE_FMT_S32
,
int32_t
,
AV_SAMPLE_FMT_S16
, *(
const
int16_t*)pi<<16)
96
else
CONV
(
AV_SAMPLE_FMT_FLT
,
float
,
AV_SAMPLE_FMT_S16
, *(
const
int16_t*)pi*(1.0 / (1<<15)))
97
else
CONV
(
AV_SAMPLE_FMT_DBL
,
double
,
AV_SAMPLE_FMT_S16
, *(
const
int16_t*)pi*(1.0 / (1<<15)))
98
else
CONV
(
AV_SAMPLE_FMT_U8
,
uint8_t
,
AV_SAMPLE_FMT_S32
, (*(
const
int32_t
*)pi>>24) + 0x80)
99
else
CONV
(
AV_SAMPLE_FMT_S16
, int16_t,
AV_SAMPLE_FMT_S32
, *(
const
int32_t
*)pi>>16)
100
else
CONV
(
AV_SAMPLE_FMT_S32
,
int32_t
,
AV_SAMPLE_FMT_S32
, *(
const
int32_t
*)pi)
101
else
CONV
(
AV_SAMPLE_FMT_FLT
,
float
,
AV_SAMPLE_FMT_S32
, *(
const
int32_t
*)pi*(1.0 / (1
U
<<31)))
102
else
CONV
(
AV_SAMPLE_FMT_DBL
,
double
,
AV_SAMPLE_FMT_S32
, *(
const
int32_t
*)pi*(1.0 / (1
U
<<31)))
103
else
CONV
(
AV_SAMPLE_FMT_U8
,
uint8_t
,
AV_SAMPLE_FMT_FLT
, av_clip_uint8(
lrintf
(*(
const
float
*)pi * (1<<7)) + 0x80))
104
else
CONV
(
AV_SAMPLE_FMT_S16
, int16_t,
AV_SAMPLE_FMT_FLT
, av_clip_int16(
lrintf
(*(
const
float
*)pi * (1<<15))))
105
else
CONV
(
AV_SAMPLE_FMT_S32
,
int32_t
,
AV_SAMPLE_FMT_FLT
, av_clipl_int32(
llrintf
(*(
const
float
*)pi * (1
U
<<31))))
106
else
CONV
(
AV_SAMPLE_FMT_FLT
,
float
,
AV_SAMPLE_FMT_FLT
, *(
const
float
*)pi)
107
else
CONV
(
AV_SAMPLE_FMT_DBL
,
double
,
AV_SAMPLE_FMT_FLT
, *(
const
float
*)pi)
108
else
CONV
(
AV_SAMPLE_FMT_U8
,
uint8_t
,
AV_SAMPLE_FMT_DBL
, av_clip_uint8(
lrint
(*(
const
double
*)pi * (1<<7)) + 0x80))
109
else
CONV
(
AV_SAMPLE_FMT_S16
, int16_t,
AV_SAMPLE_FMT_DBL
, av_clip_int16(
lrint
(*(
const
double
*)pi * (1<<15))))
110
else
CONV
(
AV_SAMPLE_FMT_S32
,
int32_t
,
AV_SAMPLE_FMT_DBL
, av_clipl_int32(
llrint
(*(
const
double
*)pi * (1
U
<<31))))
111
else
CONV
(
AV_SAMPLE_FMT_FLT
,
float
,
AV_SAMPLE_FMT_DBL
, *(
const
double
*)pi)
112
else
CONV
(
AV_SAMPLE_FMT_DBL
,
double
,
AV_SAMPLE_FMT_DBL
, *(
const
double
*)pi)
113
else
return
-1;
114
}
115
return
0;
116
}
Generated on Sat May 25 2013 03:58:31 for FFmpeg by
1.8.2