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