mirror of https://github.com/FFmpeg/FFmpeg.git
parent
b5587fd2c6
commit
bbfcb1b7c8
5 changed files with 169 additions and 22 deletions
@ -0,0 +1,51 @@ |
||||
/*
|
||||
* Copyright (c) 2016 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_THRESHOLD_H |
||||
#define AVFILTER_THRESHOLD_H |
||||
|
||||
#include "avfilter.h" |
||||
#include "framesync.h" |
||||
|
||||
typedef struct ThresholdContext { |
||||
const AVClass *class; |
||||
|
||||
int depth; |
||||
int planes; |
||||
int bpc; |
||||
|
||||
int nb_planes; |
||||
int width[4], height[4]; |
||||
|
||||
void (*threshold)(const uint8_t *in, const uint8_t *threshold, |
||||
const uint8_t *min, const uint8_t *max, |
||||
uint8_t *out, |
||||
ptrdiff_t ilinesize, ptrdiff_t tlinesize, |
||||
ptrdiff_t flinesize, ptrdiff_t slinesize, |
||||
ptrdiff_t olinesize, |
||||
int w, int h); |
||||
|
||||
AVFrame *frames[4]; |
||||
FFFrameSync fs; |
||||
} ThresholdContext; |
||||
|
||||
void ff_threshold_init_x86(ThresholdContext *s); |
||||
|
||||
#endif /* AVFILTER_THRESHOLD_H */ |
@ -0,0 +1,69 @@ |
||||
;***************************************************************************** |
||||
;* x86-optimized functions for threshold filter |
||||
;* |
||||
;* Copyright (C) 2017 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" |
||||
|
||||
%if ARCH_X86_64 |
||||
|
||||
SECTION_RODATA |
||||
|
||||
pb_128: times 16 db 128 |
||||
|
||||
SECTION .text |
||||
|
||||
INIT_XMM sse4 |
||||
cglobal threshold8, 10, 13, 5, in, threshold, min, max, out, ilinesize, tlinesize, flinesize, slinesize, olinesize, w, h, x |
||||
mov wd, dword wm |
||||
mov hd, dword hm |
||||
mova m4, [pb_128] |
||||
add inq, wq |
||||
add thresholdq, wq |
||||
add minq, wq |
||||
add maxq, wq |
||||
add outq, wq |
||||
neg wq |
||||
.nextrow: |
||||
mov xq, wq |
||||
|
||||
.loop: |
||||
movu m1, [inq + xq] |
||||
movu m0, [thresholdq + xq] |
||||
movu m2, [minq + xq] |
||||
movu m3, [maxq + xq] |
||||
pxor m0, m4 |
||||
pxor m1, m4 |
||||
pcmpgtb m0, m1 |
||||
pblendvb m3, m2, m0 |
||||
movu [outq + xq], m3 |
||||
add xq, mmsize |
||||
jl .loop |
||||
|
||||
add inq, ilinesizeq |
||||
add thresholdq, tlinesizeq |
||||
add minq, flinesizeq |
||||
add maxq, slinesizeq |
||||
add outq, olinesizeq |
||||
sub hd, 1 |
||||
jg .nextrow |
||||
RET |
||||
|
||||
%endif |
@ -0,0 +1,41 @@ |
||||
/*
|
||||
* Copyright (c) 2015 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/x86/cpu.h" |
||||
#include "libavfilter/threshold.h" |
||||
|
||||
void ff_threshold8_sse4(const uint8_t *in, const uint8_t *threshold, |
||||
const uint8_t *min, const uint8_t *max, |
||||
uint8_t *out, |
||||
ptrdiff_t ilinesize, ptrdiff_t tlinesize, |
||||
ptrdiff_t flinesize, ptrdiff_t slinesize, |
||||
ptrdiff_t olinesize, |
||||
int w, int h); |
||||
|
||||
av_cold void ff_threshold_init_x86(ThresholdContext *s) |
||||
{ |
||||
int cpu_flags = av_get_cpu_flags(); |
||||
|
||||
if (ARCH_X86_64 && EXTERNAL_SSE4(cpu_flags) && s->depth == 8) { |
||||
s->threshold = ff_threshold8_sse4; |
||||
} |
||||
} |
Loading…
Reference in new issue