forked from marfrit/libva-v4l2-request-fourier
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:
+18
-1
@@ -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 */
|
||||
|
||||
Reference in New Issue
Block a user