This is an automated email from the git hooks/post-receive script.

Git pushed a commit to branch master
in repository ffmpeg.

commit e9d1ed3fdcfd649070a2f06a88ec51d6ec78932f
Author:     Niklas Haas <[email protected]>
AuthorDate: Thu Feb 26 16:49:19 2026 +0100
Commit:     Niklas Haas <[email protected]>
CommitDate: Fri Feb 27 16:18:34 2026 +0000

    swscale/graph: avoid stack copies of SwsImg
    
    In the process of nuking this abstraction in favor of AVFrame.
    
    Sponsored-by: Sovereign Tech Fund
    Signed-off-by: Niklas Haas <[email protected]>
---
 libswscale/graph.c | 70 ++++++++++++++++++++++++++++++++----------------------
 libswscale/graph.h |  8 -------
 2 files changed, 42 insertions(+), 36 deletions(-)

diff --git a/libswscale/graph.c b/libswscale/graph.c
index 55636a2816..07248f2ba6 100644
--- a/libswscale/graph.c
+++ b/libswscale/graph.c
@@ -157,26 +157,37 @@ static int pass_append(SwsGraph *graph, enum 
AVPixelFormat fmt, int w, int h,
     return 0;
 }
 
-static void run_copy(const SwsImg *out_base, const SwsImg *in_base,
-                     int y, int h, const SwsPass *pass)
+static void img_shift(const SwsImg *img, const int y, uint8_t *data[4])
 {
-    SwsImg in  = ff_sws_img_shift(in_base,  y);
-    SwsImg out = ff_sws_img_shift(out_base, y);
-
-    for (int i = 0; i < FF_ARRAY_ELEMS(out.data) && out.data[i]; i++) {
-        const int lines = h >> ff_fmt_vshift(in.fmt, i);
-        av_assert1(in.data[i]);
+    for (int i = 0; i < 4; i++) {
+        if (img->data[i])
+            data[i] = img->data[i] + (y >> ff_fmt_vshift(img->fmt, i)) * 
img->linesize[i];
+        else
+            data[i] = NULL;
+    }
+}
 
-        if (in.data[i] == out.data[i]) {
-            av_assert0(in.linesize[i] == out.linesize[i]);
-        } else if (in.linesize[i] == out.linesize[i]) {
-            memcpy(out.data[i], in.data[i], lines * out.linesize[i]);
+static void run_copy(const SwsImg *out, const SwsImg *in, int y, int h,
+                     const SwsPass *pass)
+{
+    uint8_t *in_data[4], *out_data[4];
+    img_shift(in,  y, in_data);
+    img_shift(out, y, out_data);
+
+    for (int i = 0; i < 4 && out_data[i]; i++) {
+        const int lines = h >> ff_fmt_vshift(in->fmt, i);
+        av_assert1(in_data[i]);
+
+        if (in_data[i] == out_data[i]) {
+            av_assert0(in->linesize[i] == out->linesize[i]);
+        } else if (in->linesize[i] == out->linesize[i]) {
+            memcpy(out_data[i], in_data[i], lines * out->linesize[i]);
         } else {
-            const int linesize = FFMIN(out.linesize[i], in.linesize[i]);
+            const int linesize = FFMIN(out->linesize[i], in->linesize[i]);
             for (int j = 0; j < lines; j++) {
-                memcpy(out.data[i], in.data[i], linesize);
-                in.data[i]  += in.linesize[i];
-                out.data[i] += out.linesize[i];
+                memcpy(out_data[i], in_data[i], linesize);
+                in_data[i]  += in->linesize[i];
+                out_data[i] += out->linesize[i];
             }
         }
     }
@@ -266,26 +277,28 @@ static inline SwsContext *slice_ctx(const SwsPass *pass, 
int y)
     return sws;
 }
 
-static void run_legacy_unscaled(const SwsImg *out, const SwsImg *in_base,
+static void run_legacy_unscaled(const SwsImg *out, const SwsImg *in,
                                 int y, int h, const SwsPass *pass)
 {
     SwsContext *sws = slice_ctx(pass, y);
     SwsInternal *c = sws_internal(sws);
-    const SwsImg in = ff_sws_img_shift(in_base, y);
+    uint8_t *in_data[4];
+    img_shift(in, y, in_data);
 
-    c->convert_unscaled(c, (const uint8_t *const *) in.data, in.linesize, y, h,
+    c->convert_unscaled(c, (const uint8_t *const *) in_data, in->linesize, y, 
h,
                         out->data, out->linesize);
 }
 
-static void run_legacy_swscale(const SwsImg *out_base, const SwsImg *in,
+static void run_legacy_swscale(const SwsImg *out, const SwsImg *in,
                                int y, int h, const SwsPass *pass)
 {
     SwsContext *sws = slice_ctx(pass, y);
     SwsInternal *c = sws_internal(sws);
-    const SwsImg out = ff_sws_img_shift(out_base, y);
+    uint8_t *out_data[4];
+    img_shift(out, y, out_data);
 
     ff_swscale(c, (const uint8_t *const *) in->data, in->linesize, 0,
-               sws->src_h, out.data, out.linesize, y, h);
+               sws->src_h, out_data, out->linesize, y, h);
 }
 
 static void get_chroma_pos(SwsGraph *graph, int *h_chr_pos, int *v_chr_pos,
@@ -621,15 +634,16 @@ static void setup_lut3d(const SwsImg *out, const SwsImg 
*in, const SwsPass *pass
     ff_sws_lut3d_update(lut, &pass->graph->src.color);
 }
 
-static void run_lut3d(const SwsImg *out_base, const SwsImg *in_base,
-                      int y, int h, const SwsPass *pass)
+static void run_lut3d(const SwsImg *out, const SwsImg *in, int y, int h,
+                      const SwsPass *pass)
 {
     SwsLut3D *lut = pass->priv;
-    const SwsImg in  = ff_sws_img_shift(in_base,  y);
-    const SwsImg out = ff_sws_img_shift(out_base, y);
+    uint8_t *in_data[4], *out_data[4];
+    img_shift(in,  y, in_data);
+    img_shift(out, y, out_data);
 
-    ff_sws_lut3d_apply(lut, in.data[0], in.linesize[0], out.data[0],
-                       out.linesize[0], pass->width, h);
+    ff_sws_lut3d_apply(lut, in_data[0], in->linesize[0], out_data[0],
+                       out->linesize[0], pass->width, h);
 }
 
 static int adapt_colors(SwsGraph *graph, SwsFormat src, SwsFormat dst,
diff --git a/libswscale/graph.h b/libswscale/graph.h
index c93c37a98e..94b2051d94 100644
--- a/libswscale/graph.h
+++ b/libswscale/graph.h
@@ -45,14 +45,6 @@ static av_always_inline av_const int ff_fmt_vshift(enum 
AVPixelFormat fmt, int p
     return (plane == 1 || plane == 2) ? desc->log2_chroma_h : 0;
 }
 
-static av_const inline SwsImg ff_sws_img_shift(const SwsImg *base, const int y)
-{
-    SwsImg img = *base;
-    for (int i = 0; i < 4 && img.data[i]; i++)
-        img.data[i] += (y >> ff_fmt_vshift(img.fmt, i)) * img.linesize[i];
-    return img;
-}
-
 typedef struct SwsPass  SwsPass;
 typedef struct SwsGraph SwsGraph;
 

_______________________________________________
ffmpeg-cvslog mailing list -- [email protected]
To unsubscribe send an email to [email protected]

Reply via email to