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
void
int32_to_float_fmul_array8_c
(
FmtConvertContext
*c,
float
*dst,
34
const
int32_t
*src,
const
float
*mul,
35
int
len
)
36
{
37
int
i;
38
for
(i = 0; i <
len
; i += 8)
39
c->
int32_to_float_fmul_scalar
(&dst[i], &src[i], *mul++, 8);
40
}
41
42
static
av_always_inline
int
float_to_int16_one
(
const
float
*src){
43
return
av_clip_int16(
lrintf
(*src));
44
}
45
46
static
void
float_to_int16_c
(int16_t *dst,
const
float
*src,
long
len
)
47
{
48
int
i;
49
for
(i=0; i<
len
; i++)
50
dst[i] =
float_to_int16_one
(src+i);
51
}
52
53
static
void
float_to_int16_interleave_c
(int16_t *dst,
const
float
**src,
54
long
len
,
int
channels)
55
{
56
int
i,j,c;
57
if
(channels==2){
58
for
(i=0; i<
len
; i++){
59
dst[2*i] =
float_to_int16_one
(src[0]+i);
60
dst[2*i+1] =
float_to_int16_one
(src[1]+i);
61
}
62
}
else
{
63
for
(c=0; c<channels; c++)
64
for
(i=0, j=c; i<
len
; i++, j+=channels)
65
dst[j] =
float_to_int16_one
(src[c]+i);
66
}
67
}
68
69
void
ff_float_interleave_c
(
float
*dst,
const
float
**src,
unsigned
int
len
,
70
int
channels)
71
{
72
int
j, c;
73
unsigned
int
i;
74
if
(channels == 2) {
75
for
(i = 0; i <
len
; i++) {
76
dst[2*i] = src[0][i];
77
dst[2*i+1] = src[1][i];
78
}
79
}
else
if
(channels == 1 && len < INT_MAX /
sizeof
(
float
)) {
80
memcpy(dst, src[0], len *
sizeof
(
float
));
81
}
else
{
82
for
(c = 0; c < channels; c++)
83
for
(i = 0, j = c; i <
len
; i++, j += channels)
84
dst[j] = src[c][i];
85
}
86
}
87
88
av_cold
void
ff_fmt_convert_init
(
FmtConvertContext
*c,
AVCodecContext
*avctx)
89
{
90
c->
int32_to_float_fmul_scalar
=
int32_to_float_fmul_scalar_c
;
91
c->
int32_to_float_fmul_array8
=
int32_to_float_fmul_array8_c
;
92
c->
float_to_int16
=
float_to_int16_c
;
93
c->
float_to_int16_interleave
=
float_to_int16_interleave_c
;
94
c->
float_interleave
=
ff_float_interleave_c
;
95
96
if
(
ARCH_ARM
)
ff_fmt_convert_init_arm
(c, avctx);
97
if
(
HAVE_ALTIVEC
)
ff_fmt_convert_init_altivec
(c, avctx);
98
if
(
ARCH_X86
)
ff_fmt_convert_init_x86
(c, avctx);
99
}