From 23eb1bd5aea670911a8915aa494912efcfbe0e73 Mon Sep 17 00:00:00 2001 From: claude-noether Date: Thu, 14 May 2026 15:28:44 +0000 Subject: [PATCH] =?UTF-8?q?iter31=20=CE=B1-29:=20slice=5Fparams.short=5Fte?= =?UTF-8?q?rm=5Fref=5Fpic=5Fset=5Fsize=20=3D=20picture->st=5Frps=5Fbits?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ROOT CAUSE FIX for HEVC frame 2+ divergence (Bug 5 remainder). rkvdec's assemble_sw_rps (rkvdec-hevc.c:386-389) uses sl_params->short_term_ref_pic_set_size to compute the bit offset where long-term RPS data starts in the slice header. When zero, it falls back to fls(num_short_term_ref_pic_sets - 1) — wrong when num=1 (BBB's case). α-26 misdirected: set decode_params->short_term_ref_pic_set_size = st_rps_bits but rkvdec doesn't use that field. The correct consumer is slice_params per V4L2 spec and rkvdec source. VAAPI's picture->st_rps_bits is documented as: 'number of bits that structure short_term_ref_pic_set(num_short_term_ref_pic_sets) takes in slice segment header when short_term_ref_pic_set_sps_flag equals 0' — exactly what sl_params->short_term_ref_pic_set_size means. Frames 1 (IDR) unaffected (V4L2 rkvdec gates on !IDR_PIC flag). Frames 2+: bit offset for long-term RPS now correct, slice header parsing no longer falls off the edge of the entropy bitstream. --- src/h265.c | 19 ++++++++++++++++++- 1 file changed, 18 insertions(+), 1 deletion(-) diff --git a/src/h265.c b/src/h265.c index 4655ecc..338f41c 100644 --- a/src/h265.c +++ b/src/h265.c @@ -473,7 +473,24 @@ static void h265_fill_slice_params(VAPictureParameterBufferHEVC *picture, slice_params->ref_idx_l1[i] = slice->RefPicList[1][i]; } - slice_params->short_term_ref_pic_set_size = 0; /* VAAPI doesn't expose */ + /* + * iter31 α-29: VAAPI's picture->st_rps_bits IS the bit-count of + * short_term_ref_pic_set() in the slice header (per va_dec_hevc.h + * doc-comment for st_rps_bits). This field is required by rkvdec + * (assemble_sw_rps: line 386 in kernel rkvdec-hevc.c). When zero, + * rkvdec falls back to fls(sps->num_short_term_ref_pic_sets - 1), + * which is wrong when num_short_term_ref_pic_sets == 1 (BBB case). + * + * α-26 mis-targeted this onto decode_params->short_term_ref_pic_set_size + * which rkvdec doesn't use. The actual consumer is slice_params. + * + * Note: VAAPI defines st_rps_bits as 0 when short_term_ref_pic_set_sps_flag=1 + * (i.e. when slice uses an SPS-defined RPS rather than inline). For BBB, + * st_rps_bits is non-zero for non-IDR slices. + * + * long_term_ref_pic_set_size still 0 — VAAPI doesn't expose this. + */ + slice_params->short_term_ref_pic_set_size = picture->st_rps_bits; slice_params->long_term_ref_pic_set_size = 0; /* Pred weight table */