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_mmx
(
const
int16_t *src,
int
len
);
31
extern
int
ff_ac3_max_msb_abs_int16_mmxext
(
const
int16_t *src,
int
len
);
32
extern
int
ff_ac3_max_msb_abs_int16_sse2
(
const
int16_t *src,
int
len
);
33
extern
int
ff_ac3_max_msb_abs_int16_ssse3
(
const
int16_t *src,
int
len
);
34
35
extern
void
ff_ac3_lshift_int16_mmx
(int16_t *src,
unsigned
int
len
,
unsigned
int
shift);
36
extern
void
ff_ac3_lshift_int16_sse2
(int16_t *src,
unsigned
int
len
,
unsigned
int
shift);
37
38
extern
void
ff_ac3_rshift_int32_mmx
(int32_t *src,
unsigned
int
len
,
unsigned
int
shift);
39
extern
void
ff_ac3_rshift_int32_sse2
(int32_t *src,
unsigned
int
len
,
unsigned
int
shift);
40
41
extern
void
ff_float_to_fixed24_3dnow
(int32_t *dst,
const
float
*src,
unsigned
int
len
);
42
extern
void
ff_float_to_fixed24_sse
(int32_t *dst,
const
float
*src,
unsigned
int
len
);
43
extern
void
ff_float_to_fixed24_sse2
(int32_t *dst,
const
float
*src,
unsigned
int
len
);
44
45
extern
int
ff_ac3_compute_mantissa_size_sse2
(uint16_t mant_cnt[6][16]);
46
47
extern
void
ff_ac3_extract_exponents_3dnow
(uint8_t *exp, int32_t *coef,
int
nb_coefs);
48
extern
void
ff_ac3_extract_exponents_sse2
(uint8_t *exp, int32_t *coef,
int
nb_coefs);
49
extern
void
ff_ac3_extract_exponents_ssse3
(uint8_t *exp, int32_t *coef,
int
nb_coefs);
50
51
av_cold
void
ff_ac3dsp_init_x86
(
AC3DSPContext
*c,
int
bit_exact)
52
{
53
#if HAVE_YASM
54
int
mm_flags =
av_get_cpu_flags
();
55
56
if
(mm_flags &
AV_CPU_FLAG_MMX
) {
57
c->
ac3_exponent_min
=
ff_ac3_exponent_min_mmx
;
58
c->
ac3_max_msb_abs_int16
=
ff_ac3_max_msb_abs_int16_mmx
;
59
c->
ac3_lshift_int16
=
ff_ac3_lshift_int16_mmx
;
60
c->
ac3_rshift_int32
=
ff_ac3_rshift_int32_mmx
;
61
}
62
if
(mm_flags &
AV_CPU_FLAG_3DNOW
&&
HAVE_AMD3DNOW
) {
63
c->
extract_exponents
=
ff_ac3_extract_exponents_3dnow
;
64
if
(!bit_exact) {
65
c->
float_to_fixed24
=
ff_float_to_fixed24_3dnow
;
66
}
67
}
68
if
(mm_flags &
AV_CPU_FLAG_MMX2
&&
HAVE_MMX2
) {
69
c->
ac3_exponent_min
=
ff_ac3_exponent_min_mmxext
;
70
c->
ac3_max_msb_abs_int16
=
ff_ac3_max_msb_abs_int16_mmxext
;
71
}
72
if
(mm_flags &
AV_CPU_FLAG_SSE
&&
HAVE_SSE
) {
73
c->
float_to_fixed24
=
ff_float_to_fixed24_sse
;
74
}
75
if
(mm_flags &
AV_CPU_FLAG_SSE2
&&
HAVE_SSE
) {
76
c->
ac3_exponent_min
=
ff_ac3_exponent_min_sse2
;
77
c->
ac3_max_msb_abs_int16
=
ff_ac3_max_msb_abs_int16_sse2
;
78
c->
float_to_fixed24
=
ff_float_to_fixed24_sse2
;
79
c->
compute_mantissa_size
=
ff_ac3_compute_mantissa_size_sse2
;
80
c->
extract_exponents
=
ff_ac3_extract_exponents_sse2
;
81
if
(!(mm_flags &
AV_CPU_FLAG_SSE2SLOW
)) {
82
c->
ac3_lshift_int16
=
ff_ac3_lshift_int16_sse2
;
83
c->
ac3_rshift_int32
=
ff_ac3_rshift_int32_sse2
;
84
}
85
}
86
if
(mm_flags &
AV_CPU_FLAG_SSSE3
&&
HAVE_SSSE3
) {
87
c->
ac3_max_msb_abs_int16
=
ff_ac3_max_msb_abs_int16_ssse3
;
88
if
(!(mm_flags &
AV_CPU_FLAG_ATOM
)) {
89
c->
extract_exponents
=
ff_ac3_extract_exponents_ssse3
;
90
}
91
}
92
#endif
93
}