FFmpeg
Main Page
Related Pages
Modules
Namespaces
Namespace List
Namespace Members
All
Functions
Variables
Data Structures
Data Structures
Data Structure Index
Class Hierarchy
Data Fields
All
_
a
b
c
d
e
f
g
h
i
j
k
l
m
n
o
p
q
r
s
t
u
v
w
x
y
z
~
Functions
_
a
c
d
g
h
i
o
q
r
s
v
~
Variables
_
a
b
c
d
e
f
g
h
i
j
k
l
m
n
o
p
q
r
s
t
u
v
w
x
y
z
Enumerations
Enumerator
a
d
e
f
h
i
j
l
m
n
p
r
s
v
Files
File List
Globals
All
_
a
b
c
d
e
f
g
h
i
j
k
l
m
n
o
p
q
r
s
t
u
v
w
x
y
z
Functions
_
a
b
c
d
e
f
g
h
i
j
k
l
m
n
o
p
q
r
s
t
u
v
w
x
y
z
Variables
_
a
b
c
d
e
f
g
h
i
j
k
l
m
n
o
p
q
r
s
t
u
v
w
x
y
z
Typedefs
a
b
c
d
e
f
g
h
i
l
m
o
p
q
r
s
t
u
v
w
x
y
Enumerations
a
b
c
d
e
f
g
h
i
j
k
l
m
n
o
p
q
r
s
t
u
v
w
x
y
z
Enumerator
a
b
c
d
e
f
g
h
i
j
k
l
m
n
o
p
q
r
s
t
u
v
w
x
y
z
Macros
_
a
b
c
d
e
f
g
h
i
j
k
l
m
n
o
p
q
r
s
t
u
v
w
x
y
z
Examples
•
All
Data Structures
Namespaces
Files
Functions
Variables
Typedefs
Enumerations
Enumerator
Macros
Modules
Pages
libavutil
aarch64
cpu.c
Go to the documentation of this file.
1
/*
2
* This file is part of FFmpeg.
3
*
4
* FFmpeg is free software; you can redistribute it and/or
5
* modify it under the terms of the GNU Lesser General Public
6
* License as published by the Free Software Foundation; either
7
* version 2.1 of the License, or (at your option) any later version.
8
*
9
* FFmpeg is distributed in the hope that it will be useful,
10
* but WITHOUT ANY WARRANTY; without even the implied warranty of
11
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
12
* Lesser General Public License for more details.
13
*
14
* You should have received a copy of the GNU Lesser General Public
15
* License along with FFmpeg; if not, write to the Free Software
16
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
17
*/
18
19
#include "
libavutil/cpu.h
"
20
#include "
libavutil/cpu_internal.h
"
21
#include "config.h"
22
23
#if (defined(__linux__) || defined(__ANDROID__)) && HAVE_GETAUXVAL
24
#include <stdint.h>
25
#include <sys/auxv.h>
26
27
#define get_cpu_feature_reg(reg, val) \
28
__asm__("mrs %0, " #reg : "=r" (val))
29
30
static
int
detect_flags
(
void
)
31
{
32
int
flags
= 0;
33
unsigned
long
hwcap;
34
35
hwcap = getauxval(AT_HWCAP);
36
37
#if defined(HWCAP_CPUID)
38
// We can check for DOTPROD and I8MM using HWCAP_ASIMDDP and
39
// HWCAP2_I8MM too, avoiding to read the CPUID registers (which triggers
40
// a trap, handled by the kernel). However the HWCAP_* defines for these
41
// extensions are added much later than HWCAP_CPUID, so the userland
42
// headers might lack support for them even if the binary later is run
43
// on hardware that does support it (and where the kernel might support
44
// HWCAP_CPUID).
45
// See https://www.kernel.org/doc/html/latest/arm64/cpu-feature-registers.html
46
if
(hwcap & HWCAP_CPUID) {
47
uint64_t
tmp
;
48
49
get_cpu_feature_reg(ID_AA64ISAR0_EL1,
tmp
);
50
if
(((
tmp
>> 44) & 0
xf
) == 0x1)
51
flags
|=
AV_CPU_FLAG_DOTPROD
;
52
get_cpu_feature_reg(ID_AA64ISAR1_EL1,
tmp
);
53
if
(((
tmp
>> 52) & 0
xf
) == 0x1)
54
flags
|=
AV_CPU_FLAG_I8MM
;
55
}
56
#else
57
(void)hwcap;
58
#endif
59
60
return
flags
;
61
}
62
63
#elif defined(__APPLE__) && HAVE_SYSCTLBYNAME
64
#include <sys/sysctl.h>
65
66
static
int
detect_flags
(
void
)
67
{
68
uint32_t
value
= 0;
69
size_t
size
;
70
int
flags
= 0;
71
72
size
=
sizeof
(
value
);
73
if
(!sysctlbyname(
"hw.optional.arm.FEAT_DotProd"
, &
value
, &
size
,
NULL
, 0)) {
74
if
(
value
)
75
flags
|=
AV_CPU_FLAG_DOTPROD
;
76
}
77
size
=
sizeof
(
value
);
78
if
(!sysctlbyname(
"hw.optional.arm.FEAT_I8MM"
, &
value
, &
size
,
NULL
, 0)) {
79
if
(
value
)
80
flags
|=
AV_CPU_FLAG_I8MM
;
81
}
82
return
flags
;
83
}
84
85
#elif defined(_WIN32)
86
#include <windows.h>
87
88
static
int
detect_flags
(
void
)
89
{
90
int
flags
= 0;
91
#ifdef PF_ARM_V82_DP_INSTRUCTIONS_AVAILABLE
92
if
(IsProcessorFeaturePresent(PF_ARM_V82_DP_INSTRUCTIONS_AVAILABLE))
93
flags
|=
AV_CPU_FLAG_DOTPROD
;
94
#endif
95
return
flags
;
96
}
97
#else
98
99
static
int
detect_flags
(
void
)
100
{
101
return
0;
102
}
103
104
#endif
105
106
int
ff_get_cpu_flags_aarch64
(
void
)
107
{
108
int
flags
=
AV_CPU_FLAG_ARMV8
* HAVE_ARMV8 |
109
AV_CPU_FLAG_NEON
* HAVE_NEON;
110
111
#ifdef __ARM_FEATURE_DOTPROD
112
flags
|=
AV_CPU_FLAG_DOTPROD
;
113
#endif
114
#ifdef __ARM_FEATURE_MATMUL_INT8
115
flags
|=
AV_CPU_FLAG_I8MM
;
116
#endif
117
118
flags
|=
detect_flags
();
119
120
return
flags
;
121
}
122
123
size_t
ff_get_cpu_max_align_aarch64
(
void
)
124
{
125
int
flags
=
av_get_cpu_flags
();
126
127
if
(
flags
&
AV_CPU_FLAG_NEON
)
128
return
16;
129
130
return
8;
131
}
tmp
static uint8_t tmp[11]
Definition:
aes_ctr.c:28
AV_CPU_FLAG_DOTPROD
#define AV_CPU_FLAG_DOTPROD
Definition:
cpu.h:72
av_get_cpu_flags
int av_get_cpu_flags(void)
Return the flags which specify extensions supported by the CPU.
Definition:
cpu.c:103
cpu_internal.h
ff_get_cpu_max_align_aarch64
size_t ff_get_cpu_max_align_aarch64(void)
Definition:
cpu.c:123
NULL
#define NULL
Definition:
coverity.c:32
ff_get_cpu_flags_aarch64
int ff_get_cpu_flags_aarch64(void)
Definition:
cpu.c:106
detect_flags
static int detect_flags(void)
Definition:
cpu.c:99
AV_CPU_FLAG_I8MM
#define AV_CPU_FLAG_I8MM
Definition:
cpu.h:73
cpu.h
AV_CPU_FLAG_NEON
#define AV_CPU_FLAG_NEON
Definition:
cpu.h:69
size
int size
Definition:
twinvq_data.h:10344
xf
#define xf(width, name, var, range_min, range_max, subs,...)
Definition:
cbs_av1.c:590
value
it s the only field you need to keep assuming you have a context There is some magic you don t need to care about around this just let it vf default value
Definition:
writing_filters.txt:86
AV_CPU_FLAG_ARMV8
#define AV_CPU_FLAG_ARMV8
Definition:
cpu.h:70
flags
#define flags(name, subs,...)
Definition:
cbs_av1.c:474
Generated on Thu Apr 18 2024 22:42:41 for FFmpeg by
1.8.17