Main Page
Related Pages
Modules
Data Structures
Files
Examples
File List
Globals
libavcodec
x86
ac3dsp_mmx.c
Go to the documentation of this file.
1
/*
2
* x86-optimized AC-3 DSP utils
3
* Copyright (c) 2011 Justin Ruggles
4
*
5
* This file is part of Libav.
6
*
7
* Libav 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
* Libav 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 Libav; if not, write to the Free Software
19
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
20
*/
21
22
#include "
libavutil/x86_cpu.h
"
23
#include "
dsputil_mmx.h
"
24
#include "
libavcodec/ac3dsp.h
"
25
26
extern
void
ff_ac3_exponent_min_mmx
(uint8_t *exp,
int
num_reuse_blocks,
int
nb_coefs);
27
extern
void
ff_ac3_exponent_min_mmxext
(uint8_t *exp,
int
num_reuse_blocks,
int
nb_coefs);
28
extern
void
ff_ac3_exponent_min_sse2
(uint8_t *exp,
int
num_reuse_blocks,
int
nb_coefs);
29
30
extern
int
ff_ac3_max_msb_abs_int16_mmxext
(
const
int16_t *src,
int
len
);
31
extern
int
ff_ac3_max_msb_abs_int16_sse2
(
const
int16_t *src,
int
len
);
32
extern
int
ff_ac3_max_msb_abs_int16_ssse3
(
const
int16_t *src,
int
len
);
33
34
extern
void
ff_ac3_lshift_int16_mmx
(int16_t *src,
unsigned
int
len
,
unsigned
int
shift);
35
extern
void
ff_ac3_lshift_int16_sse2
(int16_t *src,
unsigned
int
len
,
unsigned
int
shift);
36
37
extern
void
ff_ac3_rshift_int32_mmx
(int32_t *src,
unsigned
int
len
,
unsigned
int
shift);
38
extern
void
ff_ac3_rshift_int32_sse2
(int32_t *src,
unsigned
int
len
,
unsigned
int
shift);
39
40
extern
void
ff_float_to_fixed24_3dnow
(int32_t *dst,
const
float
*src,
unsigned
int
len
);
41
extern
void
ff_float_to_fixed24_sse
(int32_t *dst,
const
float
*src,
unsigned
int
len
);
42
extern
void
ff_float_to_fixed24_sse2
(int32_t *dst,
const
float
*src,
unsigned
int
len
);
43
44
extern
int
ff_ac3_compute_mantissa_size_sse2
(uint16_t mant_cnt[6][16]);
45
46
extern
void
ff_ac3_extract_exponents_3dnow
(uint8_t *exp, int32_t *coef,
int
nb_coefs);
47
extern
void
ff_ac3_extract_exponents_sse2
(uint8_t *exp, int32_t *coef,
int
nb_coefs);
48
extern
void
ff_ac3_extract_exponents_ssse3
(uint8_t *exp, int32_t *coef,
int
nb_coefs);
49
50
av_cold
void
ff_ac3dsp_init_x86
(
AC3DSPContext
*c,
int
bit_exact)
51
{
52
#if HAVE_YASM
53
int
mm_flags =
av_get_cpu_flags
();
54
55
if
(mm_flags &
AV_CPU_FLAG_MMX
) {
56
c->
ac3_exponent_min
=
ff_ac3_exponent_min_mmx
;
57
c->
ac3_lshift_int16
=
ff_ac3_lshift_int16_mmx
;
58
c->
ac3_rshift_int32
=
ff_ac3_rshift_int32_mmx
;
59
}
60
if
(mm_flags &
AV_CPU_FLAG_3DNOW
&&
HAVE_AMD3DNOW
) {
61
c->
extract_exponents
=
ff_ac3_extract_exponents_3dnow
;
62
if
(!bit_exact) {
63
c->
float_to_fixed24
=
ff_float_to_fixed24_3dnow
;
64
}
65
}
66
if
(mm_flags &
AV_CPU_FLAG_MMX2
&&
HAVE_MMX2
) {
67
c->
ac3_exponent_min
=
ff_ac3_exponent_min_mmxext
;
68
c->
ac3_max_msb_abs_int16
=
ff_ac3_max_msb_abs_int16_mmxext
;
69
}
70
if
(mm_flags &
AV_CPU_FLAG_SSE
&&
HAVE_SSE
) {
71
c->
float_to_fixed24
=
ff_float_to_fixed24_sse
;
72
}
73
if
(mm_flags &
AV_CPU_FLAG_SSE2
&&
HAVE_SSE
) {
74
c->
ac3_exponent_min
=
ff_ac3_exponent_min_sse2
;
75
c->
ac3_max_msb_abs_int16
=
ff_ac3_max_msb_abs_int16_sse2
;
76
c->
float_to_fixed24
=
ff_float_to_fixed24_sse2
;
77
c->
compute_mantissa_size
=
ff_ac3_compute_mantissa_size_sse2
;
78
c->
extract_exponents
=
ff_ac3_extract_exponents_sse2
;
79
if
(!(mm_flags &
AV_CPU_FLAG_SSE2SLOW
)) {
80
c->
ac3_lshift_int16
=
ff_ac3_lshift_int16_sse2
;
81
c->
ac3_rshift_int32
=
ff_ac3_rshift_int32_sse2
;
82
}
83
}
84
if
(mm_flags &
AV_CPU_FLAG_SSSE3
&&
HAVE_SSSE3
) {
85
c->
ac3_max_msb_abs_int16
=
ff_ac3_max_msb_abs_int16_ssse3
;
86
if
(!(mm_flags &
AV_CPU_FLAG_ATOM
)) {
87
c->
extract_exponents
=
ff_ac3_extract_exponents_ssse3
;
88
}
89
}
90
#endif
91
}