Hi, On Sun, Apr 12, 2026 at 4:23 PM mkver via ffmpeg-devel <[email protected]> wrote: > > PR #22803 opened by mkver > URL: https://code.ffmpeg.org/FFmpeg/FFmpeg/pulls/22803 > Patch URL: https://code.ffmpeg.org/FFmpeg/FFmpeg/pulls/22803.patch > > > >From 3f105293ed23a55ba15f53c26aeee128fbbe0ae5 Mon Sep 17 00:00:00 2001 > From: Andreas Rheinhardt <[email protected]> > Date: Sun, 12 Apr 2026 22:34:12 +0200 > Subject: [PATCH 1/4] tests/checkasm/vp3dsp: Add test for put_no_rnd_pixels_l2 > > Signed-off-by: Andreas Rheinhardt <[email protected]> > --- > tests/checkasm/vp3dsp.c | 60 ++++++++++++++++++++++++++++++++++++----- > 1 file changed, 54 insertions(+), 6 deletions(-) > > diff --git a/tests/checkasm/vp3dsp.c b/tests/checkasm/vp3dsp.c > index a269581898..acdd1e57e8 100644 > --- a/tests/checkasm/vp3dsp.c > +++ b/tests/checkasm/vp3dsp.c > @@ -47,8 +47,52 @@ enum { > buf0[k] = buf1[k] = rnd(); \ > } while (0) > > +static void vp3_check_put_no_rnd_pixels_l2(const VP3DSPContext *const vp3dsp) > +{ > + enum { > + HEIGHT = 8, ///< only used height, so only tested height > + WIDTH = 8, > + BUF_SIZE = MAX_STRIDE * (HEIGHT - 1) + WIDTH, > + SRC_BUF_SIZE = BUF_SIZE + (WIDTH - 1), ///< WIDTH-1 to use > misaligned input > + }; > + declare_func_emms(AV_CPU_FLAG_MMX, void, uint8_t *dst, > + const uint8_t *a, const uint8_t *b, > + ptrdiff_t stride, int h); > > -static void vp3_check_loop_filter(void) > + if (!check_func(vp3dsp->put_no_rnd_pixels_l2, "put_no_rnd_pixels_l2")) > + return; > + > + DECLARE_ALIGNED(8, uint8_t, dstbuf_new)[BUF_SIZE]; > + DECLARE_ALIGNED(8, uint8_t, dstbuf_ref)[BUF_SIZE]; > + DECLARE_ALIGNED(4, uint8_t, src0_buf)[SRC_BUF_SIZE]; > + DECLARE_ALIGNED(4, uint8_t, src1_buf)[SRC_BUF_SIZE]; > + > + size_t src0_offset = rnd() % WIDTH, src1_offset = rnd() % WIDTH; > + ptrdiff_t stride = (rnd() % (MAX_STRIDE / WIDTH) + 1) * WIDTH; > + const uint8_t *src0 = src0_buf + src0_offset, *src1 = src1_buf + > src1_offset; > + uint8_t *dst_new = dstbuf_new, *dst_ref = dstbuf_ref; > + const int h = HEIGHT; > + > + if (rnd() & 1) { > + // Flip stride. > + dst_new += (h - 1) * stride; > + dst_ref += (h - 1) * stride; > + src0 += (h - 1) * stride; > + src1 += (h - 1) * stride; > + stride = -stride; > + } > + > + randomize_buffers(src0_buf, src1_buf, sizeof(src0_buf)); > + randomize_buffers(dstbuf_new, dstbuf_ref, sizeof(dstbuf_new)); > + call_ref(dst_ref, src0, src1, stride, h); > + call_new(dst_new, src0, src1, stride, h); > + if (memcmp(dstbuf_new, dstbuf_ref, sizeof(dstbuf_new))) > + fail(); > + bench_new(dst_new, src1, src1, stride, h); > +} > + > + > +static void vp3_check_loop_filter(const VP3DSPContext *const vp3dsp) > { > DECLARE_ALIGNED(8, uint8_t, hor_buf0)[HORIZONTAL_BUF_SIZE]; > DECLARE_ALIGNED(8, uint8_t, hor_buf1)[HORIZONTAL_BUF_SIZE]; > @@ -56,7 +100,6 @@ static void vp3_check_loop_filter(void) > DECLARE_ALIGNED(8, uint8_t, ver_buf1)[VERTICAL_BUF_SIZE]; > DECLARE_ALIGNED(16, int, bounding_values_array)[256 + 4]; > int *const bounding_values = bounding_values_array + 127; > - VP3DSPContext vp3dsp; > static const struct { > const char *name; > size_t offset; > @@ -73,14 +116,12 @@ static void vp3_check_loop_filter(void) > }; > declare_func(void, uint8_t *src, ptrdiff_t stride, int *bounding_values); > > - ff_vp3dsp_init(&vp3dsp); > - > int filter_limit = rnd() % 128; > > ff_vp3dsp_set_bounding_values(bounding_values_array, filter_limit); > > for (size_t i = 0; i < FF_ARRAY_ELEMS(tests); ++i) { > - void (*loop_filter)(uint8_t *, ptrdiff_t, int*) = *(void(**)(uint8_t > *, ptrdiff_t, int*))((char*)&vp3dsp + tests[i].offset); > + void (*loop_filter)(uint8_t *, ptrdiff_t, int*) = *(void(**)(uint8_t > *, ptrdiff_t, int*))((const char*)vp3dsp + tests[i].offset); > > if (check_func(loop_filter, "%s", tests[i].name)) { > uint8_t *buf0 = tests[i].horizontal ? hor_buf0 : ver_buf0; > @@ -112,6 +153,13 @@ static void vp3_check_loop_filter(void) > > void checkasm_check_vp3dsp(void) > { > - vp3_check_loop_filter(); > + VP3DSPContext vp3dsp; > + > + ff_vp3dsp_init(&vp3dsp); > + > + vp3_check_put_no_rnd_pixels_l2(&vp3dsp); > + report("put_no_rnd_pixels_l2"); > + > + vp3_check_loop_filter(&vp3dsp); > report("loop_filter"); > } > -- > 2.52.0 > > > >From 1006e32dded9301769cb9c317e7ecfabaa596e3f Mon Sep 17 00:00:00 2001 > From: Andreas Rheinhardt <[email protected]> > Date: Sun, 12 Apr 2026 22:39:04 +0200 > Subject: [PATCH 2/4] avcodec/x86/vp3dsp: Port ff_put_vp_no_rnd_pixels8_l2_mmx > to SSE2 > > This allows to use pavgb to reduce the amount of instruction used > to calculate the average. It also avoids a load. > > Old benchmarks: > put_no_rnd_pixels_l2_c: 13.3 ( 1.00x) > put_no_rnd_pixels_l2_mmx: 11.6 ( 1.15x) > > New benchmarks: > put_no_rnd_pixels_l2_c: 13.5 ( 1.00x) > put_no_rnd_pixels_l2_sse2: 9.3 ( 1.45x) > > Signed-off-by: Andreas Rheinhardt <[email protected]> > --- > libavcodec/x86/vp3dsp.asm | 51 ++++++++++++++++-------------------- > libavcodec/x86/vp3dsp_init.c | 12 ++++----- > tests/checkasm/vp3dsp.c | 2 +- > 3 files changed, 29 insertions(+), 36 deletions(-) > > diff --git a/libavcodec/x86/vp3dsp.asm b/libavcodec/x86/vp3dsp.asm > index b79477288a..7b7a6879a0 100644 > --- a/libavcodec/x86/vp3dsp.asm > +++ b/libavcodec/x86/vp3dsp.asm > @@ -34,7 +34,6 @@ vp3_idct_data: times 8 dw 64277 > times 8 dw 12785 > > cextern pb_80 > -cextern pb_FE > > cextern pw_4 > cextern pw_8 > @@ -155,40 +154,36 @@ cglobal vp3_h_loop_filter, 3, 4, 6 > RET > > %macro PAVGB_NO_RND 0 > - mova m4, m0 > - mova m5, m2 > - pand m4, m1 > - pand m5, m3 > - pxor m1, m0 > - pxor m3, m2 > - pand m1, m6 > - pand m3, m6 > - psrlq m1, 1 > - psrlq m3, 1 > - paddb m4, m1 > - paddb m5, m3 > + pxor m0, m4 > + pxor m1, m4 > + pxor m2, m4 > + pxor m3, m4 > + pavgb m0, m1 > + pavgb m2, m3 > + pxor m0, m4 > + pxor m2, m4 > %endmacro > > -INIT_MMX mmx > -cglobal put_vp_no_rnd_pixels8_l2, 5, 6, 0, dst, src1, src2, stride, h, > stride3 > - mova m6, [pb_FE] > +INIT_XMM sse2 > +cglobal vp3_put_no_rnd_pixels8_l2, 5, 6, 5, dst, src1, src2, stride, h, > stride3 > lea stride3q,[strideq+strideq*2] > + pcmpeqb m4, m4 > .loop: > - mova m0, [src1q] > - mova m1, [src2q] > - mova m2, [src1q+strideq] > - mova m3, [src2q+strideq] > + movq m0, [src1q] > + movq m1, [src2q] > + movq m2, [src1q+strideq] > + movq m3, [src2q+strideq]
Better not to include unrelated whitespace change. Other places too > PAVGB_NO_RND ... -- Zuxy Beauty is truth, While truth is beauty. PGP KeyID: E8555ED6 _______________________________________________ ffmpeg-devel mailing list -- [email protected] To unsubscribe send an email to [email protected]
