diff --git a/src/h265.c b/src/h265.c index e32331e..0f186a4 100644 --- a/src/h265.c +++ b/src/h265.c @@ -79,6 +79,7 @@ #include #include +#include "utils.h" #include "v4l2.h" /* @@ -386,7 +387,21 @@ static void h265_fill_slice_params(VAPictureParameterBufferHEVC *picture, * buffer. FFmpeg pattern at v4l2_request_hevc.c:190. */ slice_params->data_byte_offset = source_offset + slice->slice_data_byte_offset; - slice_params->num_entry_point_offsets = 0; /* iter2 doesn't do tiles */ + /* + * iter27 α-27: populate num_entry_point_offsets from VAAPI. + * + * BBB HEVC uses WPP (entropy_coding_sync_enabled_flag); each CTU row + * after the first creates an entry point. For 720p with 32-pixel + * CTUs that's 22 entry points per slice. Hardcoding 0 made rkvdec + * miscount the slice header skip distance → wrong slice data + * boundary → frame 2+ decoded with garbage reference data. + * + * Comment "iter2 doesn't do tiles" was inaccurate: WPP isn't tiles + * but uses the same entry_point_offsets mechanism. + */ + slice_params->num_entry_point_offsets = slice->num_entry_point_offsets; + request_log("iter27diag: slice %p num_entry_point_offsets=%u\n", + (void *)slice, (unsigned)slice->num_entry_point_offsets); slice_params->nal_unit_type = nal_unit_type; slice_params->nuh_temporal_id_plus1 = nuh_temporal_id_plus1;