forked from FFmpeg/FFmpeg
avfilter/vf_threshold: fix handling of zero threshold
This commit is contained in:
parent
0e5e3b37c0
commit
00b03331a0
2 changed files with 10 additions and 17 deletions
|
@ -38,7 +38,7 @@ static void threshold8(const uint8_t *in, const uint8_t *threshold,
|
||||||
{
|
{
|
||||||
for (int y = 0; y < h; y++) {
|
for (int y = 0; y < h; y++) {
|
||||||
for (int x = 0; x < w; x++)
|
for (int x = 0; x < w; x++)
|
||||||
out[x] = in[x] < threshold[x] ? min[x] : max[x];
|
out[x] = in[x] <= threshold[x] ? min[x] : max[x];
|
||||||
|
|
||||||
in += ilinesize;
|
in += ilinesize;
|
||||||
threshold += tlinesize;
|
threshold += tlinesize;
|
||||||
|
@ -64,7 +64,7 @@ static void threshold16(const uint8_t *iin, const uint8_t *tthreshold,
|
||||||
|
|
||||||
for (int y = 0; y < h; y++) {
|
for (int y = 0; y < h; y++) {
|
||||||
for (int x = 0; x < w; x++)
|
for (int x = 0; x < w; x++)
|
||||||
out[x] = in[x] < threshold[x] ? min[x] : max[x];
|
out[x] = in[x] <= threshold[x] ? min[x] : max[x];
|
||||||
|
|
||||||
in += ilinesize / 2;
|
in += ilinesize / 2;
|
||||||
threshold += tlinesize / 2;
|
threshold += tlinesize / 2;
|
||||||
|
|
|
@ -22,15 +22,10 @@
|
||||||
|
|
||||||
%include "libavutil/x86/x86util.asm"
|
%include "libavutil/x86/x86util.asm"
|
||||||
|
|
||||||
SECTION_RODATA
|
|
||||||
|
|
||||||
pb_128: times 16 db 128
|
|
||||||
pb_128_0 : times 8 db 0, 128
|
|
||||||
|
|
||||||
SECTION .text
|
SECTION .text
|
||||||
|
|
||||||
;%1 depth (8 or 16) ; %2 b or w ; %3 constant
|
;%1 depth (8 or 16) ; %2 b or w
|
||||||
%macro THRESHOLD 3
|
%macro THRESHOLD 2
|
||||||
%if ARCH_X86_64
|
%if ARCH_X86_64
|
||||||
cglobal threshold%1, 10, 13, 5, in, threshold, min, max, out, ilinesize, tlinesize, flinesize, slinesize, olinesize, w, h, x
|
cglobal threshold%1, 10, 13, 5, in, threshold, min, max, out, ilinesize, tlinesize, flinesize, slinesize, olinesize, w, h, x
|
||||||
mov wd, dword wm
|
mov wd, dword wm
|
||||||
|
@ -45,7 +40,6 @@ cglobal threshold%1, 5, 7, 5, in, threshold, min, max, out, w, x
|
||||||
%define olinesizeq r9mp
|
%define olinesizeq r9mp
|
||||||
%define hd r11mp
|
%define hd r11mp
|
||||||
%endif
|
%endif
|
||||||
VBROADCASTI128 m4, [%3]
|
|
||||||
%if %1 == 16
|
%if %1 == 16
|
||||||
add wq, wq ; w *= 2 (16 bits instead of 8)
|
add wq, wq ; w *= 2 (16 bits instead of 8)
|
||||||
%endif
|
%endif
|
||||||
|
@ -63,9 +57,8 @@ cglobal threshold%1, 5, 7, 5, in, threshold, min, max, out, w, x
|
||||||
movu m0, [thresholdq + xq]
|
movu m0, [thresholdq + xq]
|
||||||
movu m2, [minq + xq]
|
movu m2, [minq + xq]
|
||||||
movu m3, [maxq + xq]
|
movu m3, [maxq + xq]
|
||||||
pxor m0, m4
|
pminu%2 m0, m1
|
||||||
pxor m1, m4
|
pcmpeq%2 m0, m1
|
||||||
pcmpgt%2 m0, m1
|
|
||||||
PBLENDVB m3, m2, m0
|
PBLENDVB m3, m2, m0
|
||||||
movu [outq + xq], m3
|
movu [outq + xq], m3
|
||||||
add xq, mmsize
|
add xq, mmsize
|
||||||
|
@ -82,11 +75,11 @@ RET
|
||||||
%endmacro
|
%endmacro
|
||||||
|
|
||||||
INIT_XMM sse4
|
INIT_XMM sse4
|
||||||
THRESHOLD 8, b, pb_128
|
THRESHOLD 8, b
|
||||||
THRESHOLD 16, w, pb_128_0
|
THRESHOLD 16, w
|
||||||
|
|
||||||
%if HAVE_AVX2_EXTERNAL
|
%if HAVE_AVX2_EXTERNAL
|
||||||
INIT_YMM avx2
|
INIT_YMM avx2
|
||||||
THRESHOLD 8, b, pb_128
|
THRESHOLD 8, b
|
||||||
THRESHOLD 16, w, pb_128_0
|
THRESHOLD 16, w
|
||||||
%endif
|
%endif
|
||||||
|
|
Loading…
Add table
Reference in a new issue