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