avfilter/vf_threshold: fix handling of zero threshold

This commit is contained in:
Paul B Mahol 2022-10-20 19:38:55 +02:00
parent 0e5e3b37c0
commit 00b03331a0
2 changed files with 10 additions and 17 deletions

View File

@ -38,7 +38,7 @@ static void threshold8(const uint8_t *in, const uint8_t *threshold,
{
for (int y = 0; y < h; y++) {
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;
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 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;
threshold += tlinesize / 2;

View File

@ -22,15 +22,10 @@
%include "libavutil/x86/x86util.asm"
SECTION_RODATA
pb_128: times 16 db 128
pb_128_0 : times 8 db 0, 128
SECTION .text
;%1 depth (8 or 16) ; %2 b or w ; %3 constant
%macro THRESHOLD 3
;%1 depth (8 or 16) ; %2 b or w
%macro THRESHOLD 2
%if ARCH_X86_64
cglobal threshold%1, 10, 13, 5, in, threshold, min, max, out, ilinesize, tlinesize, flinesize, slinesize, olinesize, w, h, x
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 hd r11mp
%endif
VBROADCASTI128 m4, [%3]
%if %1 == 16
add wq, wq ; w *= 2 (16 bits instead of 8)
%endif
@ -63,9 +57,8 @@ cglobal threshold%1, 5, 7, 5, in, threshold, min, max, out, w, x
movu m0, [thresholdq + xq]
movu m2, [minq + xq]
movu m3, [maxq + xq]
pxor m0, m4
pxor m1, m4
pcmpgt%2 m0, m1
pminu%2 m0, m1
pcmpeq%2 m0, m1
PBLENDVB m3, m2, m0
movu [outq + xq], m3
add xq, mmsize
@ -82,11 +75,11 @@ RET
%endmacro
INIT_XMM sse4
THRESHOLD 8, b, pb_128
THRESHOLD 16, w, pb_128_0
THRESHOLD 8, b
THRESHOLD 16, w
%if HAVE_AVX2_EXTERNAL
INIT_YMM avx2
THRESHOLD 8, b, pb_128
THRESHOLD 16, w, pb_128_0
THRESHOLD 8, b
THRESHOLD 16, w
%endif