iter31 α-29: slice_params.short_term_ref_pic_set_size = picture->st_rps_bits

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.
This commit is contained in:
2026-05-14 15:28:44 +00:00
parent 68dbbdd4b7
commit 23eb1bd5ae
+18 -1
View File
@@ -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 */