This is an automated email from the git hooks/post-receive script. Git pushed a commit to branch master in repository ffmpeg.
commit 01fc714fc4e65e31f7def59bc8af11b0d4a93f9b Author: Joss Gray <[email protected]> AuthorDate: Fri Jul 24 16:18:09 2026 -0400 Commit: dev-joss <[email protected]> CommitDate: Sat Nov 7 21:59:44 2026 +0000 avcodec/notchlc: fix alpha ramp range expansion Ramp blocks interpolated the 8-bit endpoints and expanded the result with a plain << 4, so full opacity decoded to 4080 while case 1 blocks emit 4095. Fully opaque regions therefore showed a seam wherever the encoder switched block type. Expand the endpoints with (a << 4) | (a >> 4) before interpolating and drop the trailing shift. Full opacity now reconstructs as 4095, and interpolating at 12 bits instead of quantising to 256 levels first also lowers the error against the source. Repeating the high nibble is the conventional 8->12 bit expansion and is what proresdec.c uses for alpha. The chroma ramps in this decoder repeat the low nibble instead. This differs from a * 4095 / 255, rounded to the nearest integer, by up to 14 in either direction. No public NotchLC bitstream reference documents the mapping, but measuring against the source frames of encodes made with the NotchLC Adobe CC plugin, mean alpha error over 1.2M ramp pixels is 1.451 with the high nibble and 4.616 with the low nibble, and the low nibble form leaves a residual that tracks the source value's low nibble. The chroma path measures the same way and is left for a separate patch. --- libavcodec/notchlc.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/libavcodec/notchlc.c b/libavcodec/notchlc.c index 016d39d129..b520f9a9ea 100644 --- a/libavcodec/notchlc.c +++ b/libavcodec/notchlc.c @@ -330,12 +330,14 @@ static int decode_blocks(AVCodecContext *avctx, AVFrame *p, control = bytestream2_get_le64(&dgb); alpha0 = control & 0xFF; alpha1 = (control >> 8) & 0xFF; + alpha0 = (alpha0 << 4) | (alpha0 >> 4); + alpha1 = (alpha1 << 4) | (alpha1 >> 4); control >>= 16; for (int i = 0; i < 4; i++) { for (int j = 0; j < 4; j++) { const int selector = control & 7; - dsta[x + (i + by * 4) * alinesize + bx * 4 + j] = ((alpha0 * (7 - selector) + alpha1 * selector + 6) / 7) << 4; + dsta[x + (i + by * 4) * alinesize + bx * 4 + j] = (alpha0 * (7 - selector) + alpha1 * selector + 6) / 7; control >>= 3; } } -- To stop receiving notification emails like this one, please contact [email protected]. _______________________________________________ ffmpeg-cvslog mailing list -- [email protected] To unsubscribe send an email to [email protected]
