This is an automated email from the git hooks/post-receive script. Git pushed a commit to branch master in repository ffmpeg.
commit 0127016c41092e53809b6548cc1487ec5a8c87d0 Author: Andreas Rheinhardt <[email protected]> AuthorDate: Tue Jul 28 22:43:21 2026 +0200 Commit: Andreas Rheinhardt <[email protected]> CommitDate: Sun Aug 2 02:12:51 2026 +0200 avcodec/x86/huffyuvdsp: Add SSE4 add_hfyu_median_pred_int16 Heavily based upon the existing mmxext function, but it allows to use p{max,min}uw, so also supports 16bpp pixel formats. It is also faster: add_hfyu_median_pred_int16_c: 14368.1 add_hfyu_median_pred_int16_mmxext: 7384.2 ( 1.94x) add_hfyu_median_pred_int16_sse4: 6474.4 ( 2.21x) Signed-off-by: Andreas Rheinhardt <[email protected]> --- libavcodec/x86/huffyuvdsp.asm | 87 ++++++++++++++++++++++++++++++++++++++++ libavcodec/x86/huffyuvdsp_init.c | 6 +++ 2 files changed, 93 insertions(+) diff --git a/libavcodec/x86/huffyuvdsp.asm b/libavcodec/x86/huffyuvdsp.asm index f8eaa921af..e473f75c86 100644 --- a/libavcodec/x86/huffyuvdsp.asm +++ b/libavcodec/x86/huffyuvdsp.asm @@ -135,3 +135,90 @@ cglobal add_hfyu_median_pred_int16, 7,7,0, dst, top, diff, mask, w, left, left_t movzx r2d, word [topq-2] mov [left_topq], r2d RET + +; void ff_add_hfyu_median_pred_sse4(uint16_t *dst, const uint16_t *top, +; const uint16_t *diff, int mask, +; int w, int *left, int *left_top) +INIT_XMM sse4 +cglobal add_hfyu_median_pred_int16, 7,7,8, dst, top, diff, mask, w, left, left_top + movq m1, [topq] + movd m4, [left_topq] + add wd, wd + movd m6, maskd + add diffq, wq + psllq m2, m1, 16 + movd m3, [leftq] + add topq, wq + por m4, m2 + add dstq, wq + psubw m0, m1, m4 ; t-tl + neg wq + jmp .skip +.loop: +%if avx_enabled + movq m1, [topq+wq] ; t + psllq m0, m1, 16 + por m0, m4 + psubw m0, m1, m0 ; t-tl +%else + movq m4, [topq+wq] + mova m0, m4 + psllq m4, 16 + por m4, m1 + mova m1, m0 ; t + psubw m0, m4 ; t-tl +%endif +.skip: + movq m2, [diffq+wq] +%assign i 0 +%rep 4 +%if i<3 + paddw m4, m0, m3 ; t-tl+l +%else + SWAP 0, 4 + paddw m4, m3 ; t-tl+l +%endif +%if avx_enabled + SWAP 3,5 + pmaxuw m3, m5, m1 +%else + mova m5, m3 + pmaxuw m3, m1 +%endif +%if i==2 + punpcklwd m7, m5 +%elif i==3 + punpckldq m7, m5 +%endif + pand m4, m6 + pminuw m5, m1 + pminuw m3, m4 + pmaxuw m3, m5 ; median + paddw m3, m2 ; +residual + pand m3, m6 +%if i==0 + mova m7, m3 +%elif i == 3 + pshuflw m4, m3, 0 + pblendw m7, m4, 1000b +%endif +%if i<3 + psrlq m0, 16 +%if avx_enabled && i == 2 + psrlq m4, m1, 16 + SWAP 1, 4 +%else + psrlq m1, 16 +%endif + psrlq m2, 16 +%endif +%assign i i+1 +%endrep + movq [dstq+wq], m7 + add wq, 8 + jl .loop + movzx r2d, word [dstq-2] + mov [leftq], r2d + movzx r2d, word [topq-2] + mov [left_topq], r2d + RET diff --git a/libavcodec/x86/huffyuvdsp_init.c b/libavcodec/x86/huffyuvdsp_init.c index b25a416d81..feca6a5a95 100644 --- a/libavcodec/x86/huffyuvdsp_init.c +++ b/libavcodec/x86/huffyuvdsp_init.c @@ -31,6 +31,8 @@ void ff_add_int16_avx2(uint16_t *dst, const uint16_t *src, unsigned mask, int w) void ff_add_hfyu_left_pred_bgr32_sse2(uint8_t *dst, const uint8_t *src, intptr_t w, uint8_t *left); void ff_add_hfyu_median_pred_int16_mmxext(uint16_t *dst, const uint16_t *top, const uint16_t *diff, unsigned mask, int w, int *left, int *left_top); +void ff_add_hfyu_median_pred_int16_sse4(uint16_t *dst, const uint16_t *top, const uint16_t *diff, + unsigned mask, int w, int *left, int *left_top); av_cold void ff_huffyuvdsp_init_x86(HuffYUVDSPContext *c, enum AVPixelFormat pix_fmt) { @@ -46,6 +48,10 @@ av_cold void ff_huffyuvdsp_init_x86(HuffYUVDSPContext *c, enum AVPixelFormat pix c->add_hfyu_left_pred_bgr32 = ff_add_hfyu_left_pred_bgr32_sse2; } + if (EXTERNAL_SSE4(cpu_flags)) { + c->add_hfyu_median_pred_int16 = ff_add_hfyu_median_pred_int16_sse4; + } + if (EXTERNAL_AVX2_FAST(cpu_flags)) { c->add_int16 = ff_add_int16_avx2; } _______________________________________________ ffmpeg-cvslog mailing list -- [email protected] To unsubscribe send an email to [email protected]
