FFmpeg
Main Page
Related Pages
Modules
Namespaces
Data Structures
Files
Examples
File List
Globals
•
All
Data Structures
Namespaces
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
#if FF_API_AUDIO_CONVERT
36
37
struct
AVAudioConvert
{
38
int
in_channels
,
out_channels
;
39
int
fmt_pair
;
40
};
41
42
AVAudioConvert
*
av_audio_convert_alloc
(
enum
AVSampleFormat
out_fmt,
int
out_channels,
43
enum
AVSampleFormat
in_fmt,
int
in_channels,
44
const
float
*matrix,
int
flags
)
45
{
46
AVAudioConvert
*ctx;
47
if
(in_channels!=out_channels)
48
return
NULL
;
/* FIXME: not supported */
49
ctx =
av_malloc
(
sizeof
(
AVAudioConvert
));
50
if
(!ctx)
51
return
NULL
;
52
ctx->
in_channels
= in_channels;
53
ctx->
out_channels
= out_channels;
54
ctx->
fmt_pair
= out_fmt +
AV_SAMPLE_FMT_NB
*in_fmt;
55
return
ctx;
56
}
57
58
void
av_audio_convert_free
(
AVAudioConvert
*ctx)
59
{
60
av_free
(ctx);
61
}
62
63
int
av_audio_convert
(
AVAudioConvert
*ctx,
64
void
*
const
out
[6],
const
int
out_stride[6],
65
const
void
*
const
in
[6],
const
int
in_stride[6],
int
len
)
66
{
67
int
ch;
68
69
//FIXME optimize common cases
70
71
for
(ch=0; ch<ctx->
out_channels
; ch++){
72
const
int
is= in_stride[ch];
73
const
int
os= out_stride[ch];
74
const
uint8_t
*pi= in[ch];
75
uint8_t
*po= out[ch];
76
uint8_t
*
end
= po + os*
len
;
77
if
(!out[ch])
78
continue
;
79
80
#define CONV(ofmt, otype, ifmt, expr)\
81
if(ctx->fmt_pair == ofmt + AV_SAMPLE_FMT_NB*ifmt){\
82
do{\
83
*(otype*)po = expr; pi += is; po += os;\
84
}while(po < end);\
85
}
86
87
//FIXME put things below under ifdefs so we do not waste space for cases no codec will need
88
//FIXME rounding ?
89
90
CONV
(
AV_SAMPLE_FMT_U8
,
uint8_t
,
AV_SAMPLE_FMT_U8
, *(
const
uint8_t
*)pi)
91
else
CONV
(
AV_SAMPLE_FMT_S16
, int16_t,
AV_SAMPLE_FMT_U8
, (*(
const
uint8_t
*)pi - 0x80)<<8)
92
else
CONV
(
AV_SAMPLE_FMT_S32
,
int32_t
,
AV_SAMPLE_FMT_U8
, (*(
const
uint8_t
*)pi - 0x80)<<24)
93
else
CONV
(
AV_SAMPLE_FMT_FLT
,
float
,
AV_SAMPLE_FMT_U8
, (*(
const
uint8_t
*)pi - 0x80)*(1.0 / (1<<7)))
94
else
CONV
(
AV_SAMPLE_FMT_DBL
,
double
,
AV_SAMPLE_FMT_U8
, (*(
const
uint8_t
*)pi - 0x80)*(1.0 / (1<<7)))
95
else
CONV
(
AV_SAMPLE_FMT_U8
,
uint8_t
,
AV_SAMPLE_FMT_S16
, (*(
const
int16_t*)pi>>8) + 0x80)
96
else
CONV
(
AV_SAMPLE_FMT_S16
, int16_t,
AV_SAMPLE_FMT_S16
, *(
const
int16_t*)pi)
97
else
CONV
(
AV_SAMPLE_FMT_S32
,
int32_t
,
AV_SAMPLE_FMT_S16
, *(
const
int16_t*)pi<<16)
98
else
CONV
(
AV_SAMPLE_FMT_FLT
,
float
,
AV_SAMPLE_FMT_S16
, *(
const
int16_t*)pi*(1.0 / (1<<15)))
99
else
CONV
(
AV_SAMPLE_FMT_DBL
,
double
,
AV_SAMPLE_FMT_S16
, *(
const
int16_t*)pi*(1.0 / (1<<15)))
100
else
CONV
(
AV_SAMPLE_FMT_U8
,
uint8_t
,
AV_SAMPLE_FMT_S32
, (*(
const
int32_t
*)pi>>24) + 0x80)
101
else
CONV
(
AV_SAMPLE_FMT_S16
, int16_t,
AV_SAMPLE_FMT_S32
, *(
const
int32_t
*)pi>>16)
102
else
CONV
(
AV_SAMPLE_FMT_S32
,
int32_t
,
AV_SAMPLE_FMT_S32
, *(
const
int32_t
*)pi)
103
else
CONV
(
AV_SAMPLE_FMT_FLT
,
float
,
AV_SAMPLE_FMT_S32
, *(
const
int32_t
*)pi*(1.0 / (1
U
<<31)))
104
else
CONV
(
AV_SAMPLE_FMT_DBL
,
double
,
AV_SAMPLE_FMT_S32
, *(
const
int32_t
*)pi*(1.0 / (1
U
<<31)))
105
else
CONV
(
AV_SAMPLE_FMT_U8
,
uint8_t
,
AV_SAMPLE_FMT_FLT
, av_clip_uint8(
lrintf
(*(
const
float
*)pi * (1<<7)) + 0x80))
106
else
CONV
(
AV_SAMPLE_FMT_S16
, int16_t,
AV_SAMPLE_FMT_FLT
, av_clip_int16(
lrintf
(*(
const
float
*)pi * (1<<15))))
107
else
CONV
(
AV_SAMPLE_FMT_S32
,
int32_t
,
AV_SAMPLE_FMT_FLT
, av_clipl_int32(
llrintf
(*(
const
float
*)pi * (1
U
<<31))))
108
else
CONV
(
AV_SAMPLE_FMT_FLT
,
float
,
AV_SAMPLE_FMT_FLT
, *(
const
float
*)pi)
109
else
CONV
(
AV_SAMPLE_FMT_DBL
,
double
,
AV_SAMPLE_FMT_FLT
, *(
const
float
*)pi)
110
else
CONV
(
AV_SAMPLE_FMT_U8
,
uint8_t
,
AV_SAMPLE_FMT_DBL
, av_clip_uint8(
lrint
(*(
const
double
*)pi * (1<<7)) + 0x80))
111
else
CONV
(
AV_SAMPLE_FMT_S16
, int16_t,
AV_SAMPLE_FMT_DBL
, av_clip_int16(
lrint
(*(
const
double
*)pi * (1<<15))))
112
else
CONV
(
AV_SAMPLE_FMT_S32
,
int32_t
,
AV_SAMPLE_FMT_DBL
, av_clipl_int32(
llrint
(*(
const
double
*)pi * (1
U
<<31))))
113
else
CONV
(
AV_SAMPLE_FMT_FLT
,
float
,
AV_SAMPLE_FMT_DBL
, *(
const
double
*)pi)
114
else
CONV
(
AV_SAMPLE_FMT_DBL
,
double
,
AV_SAMPLE_FMT_DBL
, *(
const
double
*)pi)
115
else
return
-1;
116
}
117
return
0;
118
}
119
120
#endif
/* FF_API_AUDIO_CONVERT */
Generated on Sun Mar 8 2015 02:34:48 for FFmpeg by
1.8.2