FFmpeg
libavfilter
x86
scene_sad_init.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/x86/cpu.h
"
21
#include "
libavfilter/scene_sad.h
"
22
23
#define SCENE_SAD_FUNC(FUNC_NAME, ASM_FUNC_NAME, MMSIZE) \
24
void ASM_FUNC_NAME(SCENE_SAD_PARAMS); \
25
\
26
static void FUNC_NAME(SCENE_SAD_PARAMS) { \
27
uint64_t sad[MMSIZE / 8] = {0}; \
28
ptrdiff_t awidth = width & ~(MMSIZE - 1); \
29
*sum = 0; \
30
ASM_FUNC_NAME(src1, stride1, src2, stride2, awidth, height, sad); \
31
for (int i = 0; i < MMSIZE / 8; i++) \
32
*sum += sad[i]; \
33
ff_scene_sad_c(src1 + awidth, stride1, \
34
src2 + awidth, stride2, \
35
width - awidth, height, sad); \
36
*sum += sad[0]; \
37
}
38
39
#if HAVE_X86ASM
40
SCENE_SAD_FUNC
(scene_sad_sse2, ff_scene_sad_sse2, 16)
41
#if HAVE_AVX2_EXTERNAL
42
SCENE_SAD_FUNC
(scene_sad_avx2, ff_scene_sad_avx2, 32)
43
#endif
44
#endif
45
46
ff_scene_sad_fn
ff_scene_sad_get_fn_x86
(
int
depth)
47
{
48
#if HAVE_X86ASM
49
int
cpu_flags
=
av_get_cpu_flags
();
50
if
(depth == 8) {
51
#if HAVE_AVX2_EXTERNAL
52
if
(
EXTERNAL_AVX2_FAST
(
cpu_flags
))
53
return
scene_sad_avx2;
54
#endif
55
if
(
EXTERNAL_SSE2
(
cpu_flags
))
56
return
scene_sad_sse2;
57
}
58
#endif
59
return
NULL
;
60
}
cpu.h
EXTERNAL_AVX2_FAST
#define EXTERNAL_AVX2_FAST(flags)
Definition:
cpu.h:79
av_get_cpu_flags
int av_get_cpu_flags(void)
Return the flags which specify extensions supported by the CPU.
Definition:
cpu.c:98
ff_scene_sad_get_fn_x86
ff_scene_sad_fn ff_scene_sad_get_fn_x86(int depth)
Definition:
scene_sad_init.c:46
cpu_flags
static atomic_int cpu_flags
Definition:
cpu.c:50
NULL
#define NULL
Definition:
coverity.c:32
SCENE_SAD_FUNC
#define SCENE_SAD_FUNC(FUNC_NAME, ASM_FUNC_NAME, MMSIZE)
Definition:
scene_sad_init.c:23
scene_sad.h
cpu.h
ff_scene_sad_fn
void(* ff_scene_sad_fn)(SCENE_SAD_PARAMS)
Definition:
scene_sad.h:34
EXTERNAL_SSE2
#define EXTERNAL_SSE2(flags)
Definition:
cpu.h:59
Generated on Wed Aug 24 2022 21:38:19 for FFmpeg by
1.8.17