Git Inbox Mirror of the ffmpeg-devel mailing list - see https://ffmpeg.org/mailman/listinfo/ffmpeg-devel
 help / color / mirror / Atom feed
* [FFmpeg-devel] [PR] avcodec/pngdec: Move ff_add_png_paeth_prediction() to pngdsp.c (PR #21397)
@ 2026-01-06 16:16 mkver via ffmpeg-devel
  0 siblings, 0 replies; only message in thread
From: mkver via ffmpeg-devel @ 2026-01-06 16:16 UTC (permalink / raw)
  To: ffmpeg-devel; +Cc: mkver

PR #21397 opened by mkver
URL: https://code.ffmpeg.org/FFmpeg/FFmpeg/pulls/21397
Patch URL: https://code.ffmpeg.org/FFmpeg/FFmpeg/pulls/21397.patch


>From b6aa27da24bea6fd35674975386e6a8da343f1bf Mon Sep 17 00:00:00 2001
From: Andreas Rheinhardt <andreas.rheinhardt@outlook.com>
Date: Tue, 6 Jan 2026 16:37:39 +0100
Subject: [PATCH 1/4] avcodec/pngdec: Move ff_add_png_paeth_prediction() to
 pngdsp.c

Also rename it to ff_png_add_paeth_prediction() so that it
has a proper prefix.

Signed-off-by: Andreas Rheinhardt <andreas.rheinhardt@outlook.com>
---
 libavcodec/png.h    |  2 --
 libavcodec/pngdec.c | 28 ----------------------------
 libavcodec/pngdsp.c | 28 +++++++++++++++++++++++++++-
 libavcodec/pngdsp.h |  6 ++++++
 4 files changed, 33 insertions(+), 31 deletions(-)

diff --git a/libavcodec/png.h b/libavcodec/png.h
index 01171e682e..903f217aed 100644
--- a/libavcodec/png.h
+++ b/libavcodec/png.h
@@ -57,8 +57,6 @@ int ff_png_get_nb_channels(int color_type);
 /* compute the row size of an interleaved pass */
 int ff_png_pass_row_size(int pass, int bits_per_pixel, int width);
 
-void ff_add_png_paeth_prediction(uint8_t *dst, uint8_t *src, uint8_t *top, int w, int bpp);
-
 void ff_png_filter_row(PNGDSPContext *dsp, uint8_t *dst, int filter_type,
                        uint8_t *src, uint8_t *last, int size, int bpp);
 
diff --git a/libavcodec/pngdec.c b/libavcodec/pngdec.c
index fff27305d5..3651da265f 100644
--- a/libavcodec/pngdec.c
+++ b/libavcodec/pngdec.c
@@ -218,34 +218,6 @@ static void png_put_interlaced_row(uint8_t *dst, int width,
     }
 }
 
-void ff_add_png_paeth_prediction(uint8_t *dst, uint8_t *src, uint8_t *top,
-                                 int w, int bpp)
-{
-    int i;
-    for (i = 0; i < w; i++) {
-        int a, b, c, p, pa, pb, pc;
-
-        a = dst[i - bpp];
-        b = top[i];
-        c = top[i - bpp];
-
-        p  = b - c;
-        pc = a - c;
-
-        pa = abs(p);
-        pb = abs(pc);
-        pc = abs(p + pc);
-
-        if (pa <= pb && pa <= pc)
-            p = a;
-        else if (pb <= pc)
-            p = b;
-        else
-            p = c;
-        dst[i] = p + src[i];
-    }
-}
-
 #define UNROLL1(bpp, op)                                                      \
     {                                                                         \
         r = dst[0];                                                           \
diff --git a/libavcodec/pngdsp.c b/libavcodec/pngdsp.c
index ae40113a51..fa22bfcb07 100644
--- a/libavcodec/pngdsp.c
+++ b/libavcodec/pngdsp.c
@@ -23,7 +23,6 @@
 #include "libavutil/attributes.h"
 #include "libavutil/intreadwrite.h"
 #include "libavutil/macros.h"
-#include "png.h"
 #include "pngdsp.h"
 
 #if HAVE_FAST_64BIT
@@ -53,6 +52,33 @@ static void add_bytes_l2_c(uint8_t *dst, uint8_t *src1, uint8_t *src2, int w)
         dst[i] = src1[i] + src2[i];
 }
 
+void ff_add_png_paeth_prediction(uint8_t *dst, uint8_t *src, uint8_t *top,
+                                 int w, int bpp)
+{
+    for (int i = 0; i < w; ++i) {
+        int a, b, c, p, pa, pb, pc;
+
+        a = dst[i - bpp];
+        b = top[i];
+        c = top[i - bpp];
+
+        p  = b - c;
+        pc = a - c;
+
+        pa = abs(p);
+        pb = abs(pc);
+        pc = abs(p + pc);
+
+        if (pa <= pb && pa <= pc)
+            p = a;
+        else if (pb <= pc)
+            p = b;
+        else
+            p = c;
+        dst[i] = p + src[i];
+    }
+}
+
 av_cold void ff_pngdsp_init(PNGDSPContext *dsp)
 {
     dsp->add_bytes_l2         = add_bytes_l2_c;
diff --git a/libavcodec/pngdsp.h b/libavcodec/pngdsp.h
index 5475d0d943..a32ffb88af 100644
--- a/libavcodec/pngdsp.h
+++ b/libavcodec/pngdsp.h
@@ -24,6 +24,8 @@
 
 #include <stdint.h>
 
+#include "libavutil/attributes_internal.h"
+
 typedef struct PNGDSPContext {
     void (*add_bytes_l2)(uint8_t *dst,
                          uint8_t *src1 /* align 16 */,
@@ -34,7 +36,11 @@ typedef struct PNGDSPContext {
                                  uint8_t *top, int w, int bpp);
 } PNGDSPContext;
 
+FF_VISIBILITY_PUSH_HIDDEN
+void ff_add_png_paeth_prediction(uint8_t *dst, uint8_t *src, uint8_t *top, int w, int bpp);
+
 void ff_pngdsp_init(PNGDSPContext *dsp);
 void ff_pngdsp_init_x86(PNGDSPContext *dsp);
+FF_VISIBILITY_POP_HIDDEN
 
 #endif /* AVCODEC_PNGDSP_H */
-- 
2.49.1


>From f100eda442185ca44eb891a79ac3ad0dd5d5a16c Mon Sep 17 00:00:00 2001
From: Andreas Rheinhardt <andreas.rheinhardt@outlook.com>
Date: Tue, 6 Jan 2026 16:55:43 +0100
Subject: [PATCH 2/4] avcodec/pngdsp: Constify

Also constify ff_png_filter_row().

Signed-off-by: Andreas Rheinhardt <andreas.rheinhardt@outlook.com>
---
 libavcodec/png.h             |  2 +-
 libavcodec/pngdec.c          |  4 ++--
 libavcodec/pngdsp.c          |  7 ++++---
 libavcodec/pngdsp.h          | 11 ++++++-----
 libavcodec/x86/pngdsp_init.c | 12 ++++++------
 5 files changed, 19 insertions(+), 17 deletions(-)

diff --git a/libavcodec/png.h b/libavcodec/png.h
index 903f217aed..1e2cf11d1c 100644
--- a/libavcodec/png.h
+++ b/libavcodec/png.h
@@ -58,6 +58,6 @@ int ff_png_get_nb_channels(int color_type);
 int ff_png_pass_row_size(int pass, int bits_per_pixel, int width);
 
 void ff_png_filter_row(PNGDSPContext *dsp, uint8_t *dst, int filter_type,
-                       uint8_t *src, uint8_t *last, int size, int bpp);
+                       const uint8_t *src, const uint8_t *last, int size, int bpp);
 
 #endif /* AVCODEC_PNG_H */
diff --git a/libavcodec/pngdec.c b/libavcodec/pngdec.c
index 3651da265f..723f2aec4d 100644
--- a/libavcodec/pngdec.c
+++ b/libavcodec/pngdec.c
@@ -257,7 +257,7 @@ static void png_put_interlaced_row(uint8_t *dst, int width,
 
 /* NOTE: 'dst' can be equal to 'last' */
 void ff_png_filter_row(PNGDSPContext *dsp, uint8_t *dst, int filter_type,
-                       uint8_t *src, uint8_t *last, int size, int bpp)
+                       const uint8_t *src, const uint8_t *last, int size, int bpp)
 {
     int i, p, r, g, b, a;
 
@@ -271,7 +271,7 @@ void ff_png_filter_row(PNGDSPContext *dsp, uint8_t *dst, int filter_type,
         if (bpp == 4) {
             p = *(int *)dst;
             for (; i < size; i += bpp) {
-                unsigned s = *(int *)(src + i);
+                unsigned s = *(const int *)(src + i);
                 p = ((s & 0x7f7f7f7f) + (p & 0x7f7f7f7f)) ^ ((s ^ p) & 0x80808080);
                 *(int *)(dst + i) = p;
             }
diff --git a/libavcodec/pngdsp.c b/libavcodec/pngdsp.c
index fa22bfcb07..c5e870dd6e 100644
--- a/libavcodec/pngdsp.c
+++ b/libavcodec/pngdsp.c
@@ -40,7 +40,8 @@ typedef uint32_t uint_native;
 #define pb_7f (~(uint_native)0 / 255 * 0x7f)
 #define pb_80 (~(uint_native)0 / 255 * 0x80)
 
-static void add_bytes_l2_c(uint8_t *dst, uint8_t *src1, uint8_t *src2, int w)
+static void add_bytes_l2_c(uint8_t *dst, const uint8_t *src1,
+                           const uint8_t *src2, int w)
 {
     long i;
     for (i = 0; i <= w - (int) sizeof(uint_native); i += sizeof(uint_native)) {
@@ -52,8 +53,8 @@ static void add_bytes_l2_c(uint8_t *dst, uint8_t *src1, uint8_t *src2, int w)
         dst[i] = src1[i] + src2[i];
 }
 
-void ff_add_png_paeth_prediction(uint8_t *dst, uint8_t *src, uint8_t *top,
-                                 int w, int bpp)
+void ff_add_png_paeth_prediction(uint8_t *dst, const uint8_t *src,
+                                 const uint8_t *top, int w, int bpp)
 {
     for (int i = 0; i < w; ++i) {
         int a, b, c, p, pa, pb, pc;
diff --git a/libavcodec/pngdsp.h b/libavcodec/pngdsp.h
index a32ffb88af..f2c4b4708f 100644
--- a/libavcodec/pngdsp.h
+++ b/libavcodec/pngdsp.h
@@ -28,16 +28,17 @@
 
 typedef struct PNGDSPContext {
     void (*add_bytes_l2)(uint8_t *dst,
-                         uint8_t *src1 /* align 16 */,
-                         uint8_t *src2, int w);
+                         const uint8_t *src1 /* align 16 */,
+                         const uint8_t *src2, int w);
 
     /* this might write to dst[w] */
-    void (*add_paeth_prediction)(uint8_t *dst, uint8_t *src,
-                                 uint8_t *top, int w, int bpp);
+    void (*add_paeth_prediction)(uint8_t *dst, const uint8_t *src,
+                                 const uint8_t *top, int w, int bpp);
 } PNGDSPContext;
 
 FF_VISIBILITY_PUSH_HIDDEN
-void ff_add_png_paeth_prediction(uint8_t *dst, uint8_t *src, uint8_t *top, int w, int bpp);
+void ff_add_png_paeth_prediction(uint8_t *dst, const uint8_t *src,
+                                 const uint8_t *top, int w, int bpp);
 
 void ff_pngdsp_init(PNGDSPContext *dsp);
 void ff_pngdsp_init_x86(PNGDSPContext *dsp);
diff --git a/libavcodec/x86/pngdsp_init.c b/libavcodec/x86/pngdsp_init.c
index e2cd5effe3..0af58640b8 100644
--- a/libavcodec/x86/pngdsp_init.c
+++ b/libavcodec/x86/pngdsp_init.c
@@ -24,12 +24,12 @@
 #include "libavutil/x86/cpu.h"
 #include "libavcodec/pngdsp.h"
 
-void ff_add_png_paeth_prediction_mmxext(uint8_t *dst, uint8_t *src,
-                                        uint8_t *top, int w, int bpp);
-void ff_add_png_paeth_prediction_ssse3(uint8_t *dst, uint8_t *src,
-                                       uint8_t *top, int w, int bpp);
-void ff_add_bytes_l2_sse2(uint8_t *dst, uint8_t *src1,
-                          uint8_t *src2, int w);
+void ff_add_png_paeth_prediction_mmxext(uint8_t *dst, const uint8_t *src,
+                                        const uint8_t *top, int w, int bpp);
+void ff_add_png_paeth_prediction_ssse3(uint8_t *dst, const uint8_t *src,
+                                       const uint8_t *top, int w, int bpp);
+void ff_add_bytes_l2_sse2(uint8_t *dst, const uint8_t *src1,
+                          const uint8_t *src2, int w);
 
 av_cold void ff_pngdsp_init_x86(PNGDSPContext *dsp)
 {
-- 
2.49.1


>From 71263fdf1bb5c74dbf7d7c5f8eef70e7b6cfd205 Mon Sep 17 00:00:00 2001
From: Andreas Rheinhardt <andreas.rheinhardt@outlook.com>
Date: Tue, 6 Jan 2026 17:05:03 +0100
Subject: [PATCH 3/4] avcodec/pngdsp: Use proper prefix ff_add_png->ff_png_add

Signed-off-by: Andreas Rheinhardt <andreas.rheinhardt@outlook.com>
---
 libavcodec/pngdec.c          | 2 +-
 libavcodec/pngdsp.c          | 4 ++--
 libavcodec/pngdsp.h          | 2 +-
 libavcodec/x86/pngdsp.asm    | 2 +-
 libavcodec/x86/pngdsp_init.c | 8 ++++----
 5 files changed, 9 insertions(+), 9 deletions(-)

diff --git a/libavcodec/pngdec.c b/libavcodec/pngdec.c
index 723f2aec4d..042b6a5c2f 100644
--- a/libavcodec/pngdec.c
+++ b/libavcodec/pngdec.c
@@ -306,7 +306,7 @@ void ff_png_filter_row(PNGDSPContext *dsp, uint8_t *dst, int filter_type,
                 i = w;
             }
         }
-        ff_add_png_paeth_prediction(dst + i, src + i, last + i, size - i, bpp);
+        ff_png_add_paeth_prediction(dst + i, src + i, last + i, size - i, bpp);
         break;
     }
 }
diff --git a/libavcodec/pngdsp.c b/libavcodec/pngdsp.c
index c5e870dd6e..7f44563a2d 100644
--- a/libavcodec/pngdsp.c
+++ b/libavcodec/pngdsp.c
@@ -53,7 +53,7 @@ static void add_bytes_l2_c(uint8_t *dst, const uint8_t *src1,
         dst[i] = src1[i] + src2[i];
 }
 
-void ff_add_png_paeth_prediction(uint8_t *dst, const uint8_t *src,
+void ff_png_add_paeth_prediction(uint8_t *dst, const uint8_t *src,
                                  const uint8_t *top, int w, int bpp)
 {
     for (int i = 0; i < w; ++i) {
@@ -83,7 +83,7 @@ void ff_add_png_paeth_prediction(uint8_t *dst, const uint8_t *src,
 av_cold void ff_pngdsp_init(PNGDSPContext *dsp)
 {
     dsp->add_bytes_l2         = add_bytes_l2_c;
-    dsp->add_paeth_prediction = ff_add_png_paeth_prediction;
+    dsp->add_paeth_prediction = ff_png_add_paeth_prediction;
 
 #if ARCH_X86 && HAVE_X86ASM
     ff_pngdsp_init_x86(dsp);
diff --git a/libavcodec/pngdsp.h b/libavcodec/pngdsp.h
index f2c4b4708f..bd35431ae7 100644
--- a/libavcodec/pngdsp.h
+++ b/libavcodec/pngdsp.h
@@ -37,7 +37,7 @@ typedef struct PNGDSPContext {
 } PNGDSPContext;
 
 FF_VISIBILITY_PUSH_HIDDEN
-void ff_add_png_paeth_prediction(uint8_t *dst, const uint8_t *src,
+void ff_png_add_paeth_prediction(uint8_t *dst, const uint8_t *src,
                                  const uint8_t *top, int w, int bpp);
 
 void ff_pngdsp_init(PNGDSPContext *dsp);
diff --git a/libavcodec/x86/pngdsp.asm b/libavcodec/x86/pngdsp.asm
index 10a1fd648b..59d4ff5d5c 100644
--- a/libavcodec/x86/pngdsp.asm
+++ b/libavcodec/x86/pngdsp.asm
@@ -78,7 +78,7 @@ cglobal add_bytes_l2, 4, 6, 2, dst, src1, src2, wa, w, i
     RET
 
 %macro ADD_PAETH_PRED_FN 1
-cglobal add_png_paeth_prediction, 5, 7, %1, dst, src, top, w, bpp, end, cntr
+cglobal png_add_paeth_prediction, 5, 7, %1, dst, src, top, w, bpp, end, cntr
 %if ARCH_X86_64
     movsxd            bppq, bppd
     movsxd              wq, wd
diff --git a/libavcodec/x86/pngdsp_init.c b/libavcodec/x86/pngdsp_init.c
index 0af58640b8..36cd4c1d42 100644
--- a/libavcodec/x86/pngdsp_init.c
+++ b/libavcodec/x86/pngdsp_init.c
@@ -24,9 +24,9 @@
 #include "libavutil/x86/cpu.h"
 #include "libavcodec/pngdsp.h"
 
-void ff_add_png_paeth_prediction_mmxext(uint8_t *dst, const uint8_t *src,
+void ff_png_add_paeth_prediction_mmxext(uint8_t *dst, const uint8_t *src,
                                         const uint8_t *top, int w, int bpp);
-void ff_add_png_paeth_prediction_ssse3(uint8_t *dst, const uint8_t *src,
+void ff_png_add_paeth_prediction_ssse3(uint8_t *dst, const uint8_t *src,
                                        const uint8_t *top, int w, int bpp);
 void ff_add_bytes_l2_sse2(uint8_t *dst, const uint8_t *src1,
                           const uint8_t *src2, int w);
@@ -36,9 +36,9 @@ av_cold void ff_pngdsp_init_x86(PNGDSPContext *dsp)
     int cpu_flags = av_get_cpu_flags();
 
     if (EXTERNAL_MMXEXT(cpu_flags))
-        dsp->add_paeth_prediction = ff_add_png_paeth_prediction_mmxext;
+        dsp->add_paeth_prediction = ff_png_add_paeth_prediction_mmxext;
     if (EXTERNAL_SSE2(cpu_flags))
         dsp->add_bytes_l2         = ff_add_bytes_l2_sse2;
     if (EXTERNAL_SSSE3(cpu_flags))
-        dsp->add_paeth_prediction = ff_add_png_paeth_prediction_ssse3;
+        dsp->add_paeth_prediction = ff_png_add_paeth_prediction_ssse3;
 }
-- 
2.49.1


>From abe6de59585ef090af3c82f4687e0fc928e925ab Mon Sep 17 00:00:00 2001
From: Andreas Rheinhardt <andreas.rheinhardt@outlook.com>
Date: Wed, 24 Dec 2025 13:32:09 +0100
Subject: [PATCH 4/4] avcodec/x86/pngdsp: Remove MMXEXT function overridden by
 SSSE3

Signed-off-by: Andreas Rheinhardt <andreas.rheinhardt@outlook.com>
---
 libavcodec/x86/pngdsp.asm    | 23 ++---------------------
 libavcodec/x86/pngdsp_init.c |  4 ----
 2 files changed, 2 insertions(+), 25 deletions(-)

diff --git a/libavcodec/x86/pngdsp.asm b/libavcodec/x86/pngdsp.asm
index 59d4ff5d5c..8ff49565d3 100644
--- a/libavcodec/x86/pngdsp.asm
+++ b/libavcodec/x86/pngdsp.asm
@@ -77,8 +77,8 @@ cglobal add_bytes_l2, 4, 6, 2, dst, src1, src2, wa, w, i
     jl .loop_s
     RET
 
-%macro ADD_PAETH_PRED_FN 1
-cglobal png_add_paeth_prediction, 5, 7, %1, dst, src, top, w, bpp, end, cntr
+INIT_MMX ssse3
+cglobal png_add_paeth_prediction, 5, 7, 0, dst, src, top, w, bpp, end, cntr
 %if ARCH_X86_64
     movsxd            bppq, bppd
     movsxd              wq, wd
@@ -109,21 +109,9 @@ cglobal png_add_paeth_prediction, 5, 7, %1, dst, src, top, w, bpp, end, cntr
     psubw               m4, m0
     mova                m5, m3
     paddw               m5, m4
-%if cpuflag(ssse3)
     pabsw               m3, m3
     pabsw               m4, m4
     pabsw               m5, m5
-%else ; !cpuflag(ssse3)
-    psubw               m7, m5
-    pmaxsw              m5, m7
-    pxor                m6, m6
-    pxor                m7, m7
-    psubw               m6, m3
-    psubw               m7, m4
-    pmaxsw              m3, m6
-    pmaxsw              m4, m7
-    pxor                m7, m7
-%endif ; cpuflag(ssse3)
     mova                m6, m4
     pminsw              m6, m5
     pcmpgtw             m3, m6
@@ -153,10 +141,3 @@ cglobal png_add_paeth_prediction, 5, 7, %1, dst, src, top, w, bpp, end, cntr
     POP               dstq
     emms
     RET
-%endmacro
-
-INIT_MMX mmxext
-ADD_PAETH_PRED_FN 0
-
-INIT_MMX ssse3
-ADD_PAETH_PRED_FN 0
diff --git a/libavcodec/x86/pngdsp_init.c b/libavcodec/x86/pngdsp_init.c
index 36cd4c1d42..5121140dcc 100644
--- a/libavcodec/x86/pngdsp_init.c
+++ b/libavcodec/x86/pngdsp_init.c
@@ -24,8 +24,6 @@
 #include "libavutil/x86/cpu.h"
 #include "libavcodec/pngdsp.h"
 
-void ff_png_add_paeth_prediction_mmxext(uint8_t *dst, const uint8_t *src,
-                                        const uint8_t *top, int w, int bpp);
 void ff_png_add_paeth_prediction_ssse3(uint8_t *dst, const uint8_t *src,
                                        const uint8_t *top, int w, int bpp);
 void ff_add_bytes_l2_sse2(uint8_t *dst, const uint8_t *src1,
@@ -35,8 +33,6 @@ av_cold void ff_pngdsp_init_x86(PNGDSPContext *dsp)
 {
     int cpu_flags = av_get_cpu_flags();
 
-    if (EXTERNAL_MMXEXT(cpu_flags))
-        dsp->add_paeth_prediction = ff_png_add_paeth_prediction_mmxext;
     if (EXTERNAL_SSE2(cpu_flags))
         dsp->add_bytes_l2         = ff_add_bytes_l2_sse2;
     if (EXTERNAL_SSSE3(cpu_flags))
-- 
2.49.1

_______________________________________________
ffmpeg-devel mailing list -- ffmpeg-devel@ffmpeg.org
To unsubscribe send an email to ffmpeg-devel-leave@ffmpeg.org

^ permalink raw reply	[flat|nested] only message in thread

only message in thread, other threads:[~2026-01-06 16:16 UTC | newest]

Thread overview: (only message) (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2026-01-06 16:16 [FFmpeg-devel] [PR] avcodec/pngdec: Move ff_add_png_paeth_prediction() to pngdsp.c (PR #21397) mkver via ffmpeg-devel

Git Inbox Mirror of the ffmpeg-devel mailing list - see https://ffmpeg.org/mailman/listinfo/ffmpeg-devel

This inbox may be cloned and mirrored by anyone:

	git clone --mirror https://master.gitmailbox.com/ffmpegdev/0 ffmpegdev/git/0.git

	# If you have public-inbox 1.1+ installed, you may
	# initialize and index your mirror using the following commands:
	public-inbox-init -V2 ffmpegdev ffmpegdev/ https://master.gitmailbox.com/ffmpegdev \
		ffmpegdev@gitmailbox.com
	public-inbox-index ffmpegdev

Example config snippet for mirrors.


AGPL code for this site: git clone https://public-inbox.org/public-inbox.git