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]
