Main Page
Related Pages
Modules
Data Structures
Files
Examples
File List
Globals
libavcodec
fmtconvert.c
Go to the documentation of this file.
1
/*
2
* Format Conversion Utils
3
* Copyright (c) 2000, 2001 Fabrice Bellard
4
* Copyright (c) 2002-2004 Michael Niedermayer <michaelni@gmx.at>
5
*
6
* This file is part of Libav.
7
*
8
* Libav is free software; you can redistribute it and/or
9
* modify it under the terms of the GNU Lesser General Public
10
* License as published by the Free Software Foundation; either
11
* version 2.1 of the License, or (at your option) any later version.
12
*
13
* Libav is distributed in the hope that it will be useful,
14
* but WITHOUT ANY WARRANTY; without even the implied warranty of
15
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
16
* Lesser General Public License for more details.
17
*
18
* You should have received a copy of the GNU Lesser General Public
19
* License along with Libav; if not, write to the Free Software
20
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
21
*/
22
23
#include "
avcodec.h
"
24
#include "
fmtconvert.h
"
25
#include "
libavutil/common.h
"
26
27
static
void
int32_to_float_fmul_scalar_c
(
float
*dst,
const
int
*src,
float
mul,
int
len
){
28
int
i;
29
for
(i=0; i<
len
; i++)
30
dst[i] = src[i] * mul;
31
}
32
33
static
av_always_inline
int
float_to_int16_one
(
const
float
*src){
34
return
av_clip_int16(
lrintf
(*src));
35
}
36
37
static
void
float_to_int16_c
(int16_t *dst,
const
float
*src,
long
len
)
38
{
39
int
i;
40
for
(i=0; i<
len
; i++)
41
dst[i] =
float_to_int16_one
(src+i);
42
}
43
44
static
void
float_to_int16_interleave_c
(int16_t *dst,
const
float
**src,
45
long
len
,
int
channels)
46
{
47
int
i,j,c;
48
if
(channels==2){
49
for
(i=0; i<
len
; i++){
50
dst[2*i] =
float_to_int16_one
(src[0]+i);
51
dst[2*i+1] =
float_to_int16_one
(src[1]+i);
52
}
53
}
else
{
54
for
(c=0; c<channels; c++)
55
for
(i=0, j=c; i<
len
; i++, j+=channels)
56
dst[j] =
float_to_int16_one
(src[c]+i);
57
}
58
}
59
60
void
ff_float_interleave_c
(
float
*dst,
const
float
**src,
unsigned
int
len
,
61
int
channels)
62
{
63
int
j, c;
64
unsigned
int
i;
65
if
(channels == 2) {
66
for
(i = 0; i <
len
; i++) {
67
dst[2*i] = src[0][i];
68
dst[2*i+1] = src[1][i];
69
}
70
}
else
if
(channels == 1 && len < INT_MAX /
sizeof
(
float
)) {
71
memcpy(dst, src[0], len *
sizeof
(
float
));
72
}
else
{
73
for
(c = 0; c < channels; c++)
74
for
(i = 0, j = c; i <
len
; i++, j += channels)
75
dst[j] = src[c][i];
76
}
77
}
78
79
av_cold
void
ff_fmt_convert_init
(
FmtConvertContext
*c,
AVCodecContext
*avctx)
80
{
81
c->
int32_to_float_fmul_scalar
=
int32_to_float_fmul_scalar_c
;
82
c->
float_to_int16
=
float_to_int16_c
;
83
c->
float_to_int16_interleave
=
float_to_int16_interleave_c
;
84
c->
float_interleave
=
ff_float_interleave_c
;
85
86
if
(
ARCH_ARM
)
ff_fmt_convert_init_arm
(c, avctx);
87
if
(
HAVE_ALTIVEC
)
ff_fmt_convert_init_altivec
(c, avctx);
88
if
(
ARCH_X86
)
ff_fmt_convert_init_x86
(c, avctx);
89
}