This is an automated email from the git hooks/post-receive script.
Git pushed a commit to branch master
in repository ffmpeg.
The following commit(s) were added to refs/heads/master by this push:
new 10f2abc41f swscale: support sliced input with cascaded scaling contexts
10f2abc41f is described below
commit 10f2abc41fdb8624a95676a10764904ee58e4ccb
Author: Michael Niedermayer <[email protected]>
AuthorDate: Thu Jun 4 20:50:45 2026 +0200
Commit: michaelni <[email protected]>
CommitDate: Sat Jun 13 21:32:37 2026 +0000
swscale: support sliced input with cascaded scaling contexts
Previously scale_cascaded() assumed the whole source frame arrived in a
single sws_scale() call, and the dispatcher only routed full-frame calls
to it. A partial input slice fell through to ff_swscale() on the parent
dispatcher context, whose scaler state (c->desc) is never initialized in
cascade mode, causing a NULL dereference / crash.
Top-down sliced output is bit-exact with full-frame scaling; bottom-up
matches swscale's pre-existing (non-cascade) slice behaviour for
subsampled intermediate formats.
Signed-off-by: Michael Niedermayer <[email protected]>
---
libswscale/swscale.c | 12 +++++++++++-
1 file changed, 11 insertions(+), 1 deletion(-)
diff --git a/libswscale/swscale.c b/libswscale/swscale.c
index 558e332eb2..c0cdd17b78 100644
--- a/libswscale/swscale.c
+++ b/libswscale/swscale.c
@@ -1003,6 +1003,16 @@ static int scale_cascaded(SwsInternal *c,
0, dstH0);
if (ret < 0)
return ret;
+
+ /* The first stage assembles the full intermediate image from the input,
+ * one slice at a time (it is itself a regular slice-capable context). The
+ * second stage scales that whole intermediate to the output in one step,
+ * so it can only run once the entire source has been consumed. The first
+ * stage resets its slice direction to 0 at end of frame; until then the
+ * intermediate is incomplete and this call produces no output lines. */
+ if (sws_internal(c->cascaded_context[0])->sliceDir != 0)
+ return 0;
+
ret = scale_internal(c->cascaded_context[1],
(const uint8_t * const * )c->cascaded_tmp[0],
c->cascaded_tmpStride[0],
0, dstH0, dstSlice, dstStride, dstSliceY, dstSliceH);
@@ -1067,7 +1077,7 @@ static int scale_internal(SwsContext *sws,
return scale_gamma(c, srcSlice, srcStride, srcSliceY, srcSliceH,
dstSlice, dstStride, dstSliceY, dstSliceH);
- if (c->cascaded_context[0] && srcSliceY == 0 && srcSliceH ==
c->cascaded_context[0]->src_h)
+ if (c->cascaded_context[0])
return scale_cascaded(c, srcSlice, srcStride, srcSliceY, srcSliceH,
dstSlice, dstStride, dstSliceY, dstSliceH);
_______________________________________________
ffmpeg-cvslog mailing list -- [email protected]
To unsubscribe send an email to [email protected]