This is an automated email from the git hooks/post-receive script. Git pushed a commit to branch release/8.0 in repository ffmpeg.
commit 1c479fdf64b91dab45a9e7da47d8c964a2c6b488 Author: Michael Niedermayer <[email protected]> AuthorDate: Thu Jun 4 20:50:45 2026 +0200 Commit: Michael Niedermayer <[email protected]> CommitDate: Sun Jun 14 04:59:14 2026 +0200 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]> (cherry picked from commit 10f2abc41fdb8624a95676a10764904ee58e4ccb) 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 7299df4736..75e094f2da 100644 --- a/libswscale/swscale.c +++ b/libswscale/swscale.c @@ -991,6 +991,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); @@ -1055,7 +1065,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]
