From 60d62ca4065198b0db323e7c9e4d3efa973e7569 Mon Sep 17 00:00:00 2001 From: Michael Niedermayer Date: Fri, 23 Oct 2026 17:39:52 +0200 Subject: [PATCH] avcodec/ffv1dec: clamp k in get_vlc_symbol() at 20 instead of bits Add a FATE test with such planes. --- libavcodec/ffv1dec.c | 6 ++++-- tests/fate/ffv1.mak | 7 ++++++- tests/ref/fate/ffv1-golomb-float32-1bit | 8 ++++++++ 3 files changed, 18 insertions(+), 3 deletions(-) create mode 100644 tests/ref/fate/ffv1-golomb-float32-1bit diff --git a/libavcodec/ffv1dec.c b/libavcodec/ffv1dec.c index 8de15d2476..c15ae288f6 100644 --- a/libavcodec/ffv1dec.c +++ b/libavcodec/ffv1dec.c @@ -56,10 +56,12 @@ static inline int get_vlc_symbol(GetBitContext *gb, VlcState *const state, k++; i += i; } - if (k > bits) { + /* get_ur_golomb() reads at most 32 bits, 12 of which the escape limit + * reserves for the prefix */ + if (k > 20) { ff_dlog(NULL, "k-overflow bias:%d error:%d drift:%d count:%d k:%d", state->bias, state->error_sum, state->drift, state->count, k); - k = bits; + k = 20; } v = get_sr_golomb(gb, k, 12, bits); diff --git a/tests/fate/ffv1.mak b/tests/fate/ffv1.mak index 5175c8df96..a2aa057732 100644 --- a/tests/fate/ffv1.mak +++ b/tests/fate/ffv1.mak @@ -1,9 +1,14 @@ FATE_FFV1_FLOAT32-$(call TRANSCODE, FFV1, NUT, LAVFI_INDEV WRAPPED_AVFRAME_DECODER COLOR_FILTER FORMAT_FILTER GEQ_FILTER SCALE_FILTER) += \ - fate-ffv1-golomb-float32-26bit + fate-ffv1-golomb-float32-26bit fate-ffv1-golomb-float32-1bit fate-ffv1-golomb-float32-26bit: CMD = transcode lavfi "color=black:s=352x288:r=1:d=8,format=gbrpf32,geq=r=X+Y*W:g=X+Y*W:b=X+W*if(lt(Y\,2*(25+N+floor(N/2)+2*floor(N/7))-4)\,if(mod(Y\,2)\,290-(25+N+floor(N/2)+2*floor(N/7))+(Y-1)/2\,290-2*(25+N+floor(N/2)+2*floor(N/7))+Y/2)\,if(eq(Y\,2*(25+N+floor(N/2)+2*floor(N/7))-4)\,19\,if(lt(Y\,2*(25+N+floor(N/2)+2*floor(N/7))+16)\,Y-2*(25+N+floor(N/2)+2*floor(N/7))+3\,if(lt(Y\,286)\,Y-2*(25+N+floor(N/2)+2*floor(N/7))+4\,Y-(25+N+floor(N/2)+2*floor(N/7))+2))))" nut \ "-c:v ffv1 -strict experimental -coder 0 -remap_mode 1 -slices 1 -g 1" "-pix_fmt gbrpf32le -vf scale" +# Planes with 2 distinct values are coded with 1 bit residuals while the +# Golomb-Rice parameter k starts at 2. +fate-ffv1-golomb-float32-1bit: CMD = transcode lavfi "color=black:s=64x48:r=1:d=1,format=gbrpf32,geq=r=1+mod(floor(X*Y/7)\,2):g=1+mod(floor(X*Y/7)\,2):b=1+mod(floor(X*Y/7)\,2)" nut \ + "-c:v ffv1 -strict experimental -coder 0 -remap_mode 1" "-pix_fmt gbrpf32le -vf scale" + FATE_FFMPEG += $(FATE_FFV1_FLOAT32-yes) fate-ffv1: $(FATE_FFV1_FLOAT32-yes) diff --git a/tests/ref/fate/ffv1-golomb-float32-1bit b/tests/ref/fate/ffv1-golomb-float32-1bit new file mode 100644 index 0000000000..e12e748b4b --- /dev/null +++ b/tests/ref/fate/ffv1-golomb-float32-1bit @@ -0,0 +1,8 @@ +eb334f7a8c79e6eb915ac7440a88ddc9 *tests/data/fate/ffv1-golomb-float32-1bit.nut +1455 tests/data/fate/ffv1-golomb-float32-1bit.nut +#tb 0: 1/1 +#media_type 0: video +#codec_id 0: rawvideo +#dimensions 0: 64x48 +#sar 0: 1/1 +0, 0, 0, 1, 36864, 0x1ad349e2