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