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]

Reply via email to