Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Submit feedback
Contribute to GitLab
Sign in
Toggle navigation
F
ffmpeg
Project
Project
Details
Activity
Releases
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Wiki
Wiki
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
Stefan Westerfeld
ffmpeg
Commits
ac0f5f4c
Commit
ac0f5f4c
authored
Oct 22, 2019
by
Paul B Mahol
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
avfilter/vf_maskedclamp: add x86 SIMD
parent
11cfff04
Changes
5
Show whitespace changes
Inline
Side-by-side
Showing
5 changed files
with
190 additions
and
7 deletions
+190
-7
maskedclamp.h
libavfilter/maskedclamp.h
+35
-0
vf_maskedclamp.c
libavfilter/vf_maskedclamp.c
+11
-7
Makefile
libavfilter/x86/Makefile
+2
-0
vf_maskedclamp.asm
libavfilter/x86/vf_maskedclamp.asm
+95
-0
vf_maskedclamp_init.c
libavfilter/x86/vf_maskedclamp_init.c
+47
-0
No files found.
libavfilter/maskedclamp.h
0 → 100644
View file @
ac0f5f4c
/*
* Copyright (c) 2019 Paul B Mahol
*
* This file is part of FFmpeg.
*
* FFmpeg is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2.1 of the License, or (at your option) any later version.
*
* FFmpeg is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with FFmpeg; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
*/
#ifndef AVFILTER_MASKEDCLAMP_H
#define AVFILTER_MASKEDCLAMP_H
#include <stddef.h>
#include <stdint.h>
typedef
struct
MaskedClampDSPContext
{
void
(
*
maskedclamp
)(
const
uint8_t
*
bsrc
,
uint8_t
*
dst
,
const
uint8_t
*
darksrc
,
const
uint8_t
*
brightsrc
,
int
w
,
int
undershoot
,
int
overshoot
);
}
MaskedClampDSPContext
;
void
ff_maskedclamp_init_x86
(
MaskedClampDSPContext
*
dsp
,
int
depth
);
#endif
/* AVFILTER_MASKEDCLAMP_H */
libavfilter/vf_maskedclamp.c
View file @
ac0f5f4c
...
@@ -26,6 +26,7 @@
...
@@ -26,6 +26,7 @@
#include "internal.h"
#include "internal.h"
#include "video.h"
#include "video.h"
#include "framesync.h"
#include "framesync.h"
#include "maskedclamp.h"
#define OFFSET(x) offsetof(MaskedClampContext, x)
#define OFFSET(x) offsetof(MaskedClampContext, x)
#define FLAGS AV_OPT_FLAG_FILTERING_PARAM|AV_OPT_FLAG_VIDEO_PARAM
#define FLAGS AV_OPT_FLAG_FILTERING_PARAM|AV_OPT_FLAG_VIDEO_PARAM
...
@@ -47,9 +48,7 @@ typedef struct MaskedClampContext {
...
@@ -47,9 +48,7 @@ typedef struct MaskedClampContext {
int
depth
;
int
depth
;
FFFrameSync
fs
;
FFFrameSync
fs
;
void
(
*
maskedclamp
)(
const
uint8_t
*
bsrc
,
uint8_t
*
dst
,
MaskedClampDSPContext
dsp
;
const
uint8_t
*
darksrc
,
const
uint8_t
*
brightsrc
,
int
w
,
int
undershoot
,
int
overshoot
);
}
MaskedClampContext
;
}
MaskedClampContext
;
static
const
AVOption
maskedclamp_options
[]
=
{
static
const
AVOption
maskedclamp_options
[]
=
{
...
@@ -117,7 +116,7 @@ static int maskedclamp_slice(AVFilterContext *ctx, void *arg, int jobnr, int nb_
...
@@ -117,7 +116,7 @@ static int maskedclamp_slice(AVFilterContext *ctx, void *arg, int jobnr, int nb_
}
}
for
(
y
=
slice_start
;
y
<
slice_end
;
y
++
)
{
for
(
y
=
slice_start
;
y
<
slice_end
;
y
++
)
{
s
->
maskedclamp
(
bsrc
,
dst
,
darksrc
,
brightsrc
,
w
,
undershoot
,
overshoot
);
s
->
dsp
.
maskedclamp
(
bsrc
,
dst
,
darksrc
,
brightsrc
,
w
,
undershoot
,
overshoot
);
dst
+=
dlinesize
;
dst
+=
dlinesize
;
bsrc
+=
blinesize
;
bsrc
+=
blinesize
;
...
@@ -210,11 +209,16 @@ static int config_input(AVFilterLink *inlink)
...
@@ -210,11 +209,16 @@ static int config_input(AVFilterLink *inlink)
s
->
width
[
0
]
=
s
->
width
[
3
]
=
inlink
->
w
;
s
->
width
[
0
]
=
s
->
width
[
3
]
=
inlink
->
w
;
s
->
depth
=
desc
->
comp
[
0
].
depth
;
s
->
depth
=
desc
->
comp
[
0
].
depth
;
s
->
undershoot
=
FFMIN
(
s
->
undershoot
,
(
1
<<
s
->
depth
)
-
1
);
s
->
overshoot
=
FFMIN
(
s
->
overshoot
,
(
1
<<
s
->
depth
)
-
1
);
if
(
desc
->
comp
[
0
].
depth
=
=
8
)
if
(
s
->
depth
<
=
8
)
s
->
maskedclamp
=
maskedclamp8
;
s
->
dsp
.
maskedclamp
=
maskedclamp8
;
else
else
s
->
maskedclamp
=
maskedclamp16
;
s
->
dsp
.
maskedclamp
=
maskedclamp16
;
if
(
ARCH_X86
)
ff_maskedclamp_init_x86
(
&
s
->
dsp
,
s
->
depth
);
return
0
;
return
0
;
}
}
...
...
libavfilter/x86/Makefile
View file @
ac0f5f4c
...
@@ -17,6 +17,7 @@ OBJS-$(CONFIG_HQDN3D_FILTER) += x86/vf_hqdn3d_init.o
...
@@ -17,6 +17,7 @@ OBJS-$(CONFIG_HQDN3D_FILTER) += x86/vf_hqdn3d_init.o
OBJS-$(CONFIG_IDET_FILTER)
+=
x86/vf_idet_init.o
OBJS-$(CONFIG_IDET_FILTER)
+=
x86/vf_idet_init.o
OBJS-$(CONFIG_INTERLACE_FILTER)
+=
x86/vf_tinterlace_init.o
OBJS-$(CONFIG_INTERLACE_FILTER)
+=
x86/vf_tinterlace_init.o
OBJS-$(CONFIG_LIMITER_FILTER)
+=
x86/vf_limiter_init.o
OBJS-$(CONFIG_LIMITER_FILTER)
+=
x86/vf_limiter_init.o
OBJS-$(CONFIG_MASKEDCLAMP_FILTER)
+=
x86/vf_maskedclamp_init.o
OBJS-$(CONFIG_MASKEDMERGE_FILTER)
+=
x86/vf_maskedmerge_init.o
OBJS-$(CONFIG_MASKEDMERGE_FILTER)
+=
x86/vf_maskedmerge_init.o
OBJS-$(CONFIG_NOISE_FILTER)
+=
x86/vf_noise.o
OBJS-$(CONFIG_NOISE_FILTER)
+=
x86/vf_noise.o
OBJS-$(CONFIG_OVERLAY_FILTER)
+=
x86/vf_overlay_init.o
OBJS-$(CONFIG_OVERLAY_FILTER)
+=
x86/vf_overlay_init.o
...
@@ -56,6 +57,7 @@ X86ASM-OBJS-$(CONFIG_HQDN3D_FILTER) += x86/vf_hqdn3d.o
...
@@ -56,6 +57,7 @@ X86ASM-OBJS-$(CONFIG_HQDN3D_FILTER) += x86/vf_hqdn3d.o
X86ASM-OBJS-$(CONFIG_IDET_FILTER)
+=
x86/vf_idet.o
X86ASM-OBJS-$(CONFIG_IDET_FILTER)
+=
x86/vf_idet.o
X86ASM-OBJS-$(CONFIG_INTERLACE_FILTER)
+=
x86/vf_interlace.o
X86ASM-OBJS-$(CONFIG_INTERLACE_FILTER)
+=
x86/vf_interlace.o
X86ASM-OBJS-$(CONFIG_LIMITER_FILTER)
+=
x86/vf_limiter.o
X86ASM-OBJS-$(CONFIG_LIMITER_FILTER)
+=
x86/vf_limiter.o
X86ASM-OBJS-$(CONFIG_MASKEDCLAMP_FILTER)
+=
x86/vf_maskedclamp.o
X86ASM-OBJS-$(CONFIG_MASKEDMERGE_FILTER)
+=
x86/vf_maskedmerge.o
X86ASM-OBJS-$(CONFIG_MASKEDMERGE_FILTER)
+=
x86/vf_maskedmerge.o
X86ASM-OBJS-$(CONFIG_OVERLAY_FILTER)
+=
x86/vf_overlay.o
X86ASM-OBJS-$(CONFIG_OVERLAY_FILTER)
+=
x86/vf_overlay.o
X86ASM-OBJS-$(CONFIG_PP7_FILTER)
+=
x86/vf_pp7.o
X86ASM-OBJS-$(CONFIG_PP7_FILTER)
+=
x86/vf_pp7.o
...
...
libavfilter/x86/vf_maskedclamp.asm
0 → 100644
View file @
ac0f5f4c
;*****************************************************************************
;* x86-optimized functions for maskedclamp filter
;*
;* Copyright (c) 2019 Paul B Mahol
;*
;* This file is part of FFmpeg.
;*
;* FFmpeg is free software; you can redistribute it and/or
;* modify it under the terms of the GNU Lesser General Public
;* License as published by the Free Software Foundation; either
;* version 2.1 of the License, or (at your option) any later version.
;*
;* FFmpeg is distributed in the hope that it will be useful,
;* but WITHOUT ANY WARRANTY; without even the implied warranty of
;* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
;* Lesser General Public License for more details.
;*
;* You should have received a copy of the GNU Lesser General Public
;* License along with FFmpeg; if not, write to the Free Software
;* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
;******************************************************************************
%include
"libavutil/x86/x86util.asm"
SECTION
.
text
;------------------------------------------------------------------------------
; void ff_maskedclamp(const uint8_t *src, uint8_t *dst,
; const uint8_t *darksrc,
; const uint8_t *brightsrc,
; int w, int undershoot, int overshoot)
;------------------------------------------------------------------------------
INIT_XMM
sse2
cglobal
maskedclamp8
,
5
,
5
,
5
,
src
,
dst
,
dark
,
bright
,
w
,
undershoot
,
overshoot
movsxdifnidn
wq
,
wd
add
srcq
,
wq
add
darkq
,
wq
add
brightq
,
wq
add
dstq
,
wq
neg
wq
movd
m3
,
r5m
punpcklbw
m3
,
m3
SPLATW
m3
,
m3
movd
m4
,
r6m
punpcklbw
m4
,
m4
SPLATW
m4
,
m4
.
loop
:
movu
m0
,
[
srcq
+
wq
]
movu
m1
,
[
darkq
+
wq
]
movu
m2
,
[
brightq
+
wq
]
psubusb
m1
,
m3
paddusb
m2
,
m4
CLIPUB
m0
,
m1
,
m2
mova
[
dstq
+
wq
]
,
m0
add
wq
,
mmsize
jl
.
loop
RET
INIT_XMM
sse4
cglobal
maskedclamp16
,
5
,
5
,
5
,
src
,
dst
,
dark
,
bright
,
w
,
undershoot
,
overshoot
shl
wd
,
1
add
srcq
,
wq
add
darkq
,
wq
add
brightq
,
wq
add
dstq
,
wq
neg
wq
movd
m3
,
r5m
SPLATW
m3
,
m3
movd
m4
,
r6m
SPLATW
m4
,
m4
.
loop
:
movu
m0
,
[
srcq
+
wq
]
movu
m1
,
[
darkq
+
wq
]
movu
m2
,
[
brightq
+
wq
]
psubusw
m1
,
m3
paddusw
m2
,
m4
pmaxuw
m0
,
m1
pminuw
m0
,
m2
mova
[
dstq
+
wq
]
,
m0
add
wq
,
mmsize
jl
.
loop
RET
libavfilter/x86/vf_maskedclamp_init.c
0 → 100644
View file @
ac0f5f4c
/*
* Copyright (c) 2019 Paul B Mahol
*
* This file is part of FFmpeg.
*
* FFmpeg is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2.1 of the License, or (at your option) any later version.
*
* FFmpeg is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with FFmpeg; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
*/
#include "libavutil/attributes.h"
#include "libavutil/cpu.h"
#include "libavutil/mem.h"
#include "libavutil/x86/asm.h"
#include "libavutil/x86/cpu.h"
#include "libavfilter/maskedclamp.h"
void
ff_maskedclamp8_sse2
(
const
uint8_t
*
bsrc
,
uint8_t
*
dst
,
const
uint8_t
*
darksrc
,
const
uint8_t
*
brightsrc
,
int
w
,
int
undershoot
,
int
overshoot
);
void
ff_maskedclamp16_sse4
(
const
uint8_t
*
bsrc
,
uint8_t
*
dst
,
const
uint8_t
*
darksrc
,
const
uint8_t
*
brightsrc
,
int
w
,
int
undershoot
,
int
overshoot
);
av_cold
void
ff_maskedclamp_init_x86
(
MaskedClampDSPContext
*
dsp
,
int
depth
)
{
int
cpu_flags
=
av_get_cpu_flags
();
if
(
EXTERNAL_SSE2
(
cpu_flags
)
&&
depth
<=
8
)
{
dsp
->
maskedclamp
=
ff_maskedclamp8_sse2
;
}
if
(
EXTERNAL_SSE4
(
cpu_flags
)
&&
depth
>
8
)
{
dsp
->
maskedclamp
=
ff_maskedclamp16_sse4
;
}
}
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment