The iHD driver looks at entries beyond num_ref_idx_l[01]_active_minus1
for unknown reasons.
---
This still isn't enough to actually work for encoding H.265 with the iHD driver
on Skylake. It can generate output with this rather than crashing, but the
output is still wrong (though it does resemble the input somewhat).
It also seems to like inserting emulation prevention bytes everywhere in slice
headers after the first, so it breaks totally if AUDs are present.
libavcodec/vaapi_encode_h265.c | 21 +++++++++++++++++++--
1 file changed, 19 insertions(+), 2 deletions(-)
diff --git a/libavcodec/vaapi_encode_h265.c b/libavcodec/vaapi_encode_h265.c
index a9853a3aa..813d4f944 100644
--- a/libavcodec/vaapi_encode_h265.c
+++ b/libavcodec/vaapi_encode_h265.c
@@ -767,8 +767,6 @@ static int
vaapi_encode_h265_init_slice_params(AVCodecContext *avctx,
.num_ref_idx_l0_active_minus1 = sh->num_ref_idx_l0_active_minus1,
.num_ref_idx_l1_active_minus1 = sh->num_ref_idx_l1_active_minus1,
- .ref_pic_list0[0] = vpic->reference_frames[0],
- .ref_pic_list1[0] = vpic->reference_frames[1],
.luma_log2_weight_denom = sh->luma_log2_weight_denom,
.delta_chroma_log2_weight_denom = sh->delta_chroma_log2_weight_denom,
@@ -802,6 +800,25 @@ static int
vaapi_encode_h265_init_slice_params(AVCodecContext *avctx,
},
};
+ for (i = 0; i < FF_ARRAY_ELEMS(vslice->ref_pic_list0); i++) {
+ vslice->ref_pic_list0[i].picture_id = VA_INVALID_ID;
+ vslice->ref_pic_list0[i].flags = VA_PICTURE_HEVC_INVALID;
+ vslice->ref_pic_list1[i].picture_id = VA_INVALID_ID;
+ vslice->ref_pic_list1[i].flags = VA_PICTURE_HEVC_INVALID;
+ }
+
+ av_assert0(pic->nb_refs <= 2);
+ if (pic->nb_refs >= 1) {
+ // Backward reference for P- or B-frame.
+ av_assert0(pic->type == PICTURE_TYPE_P ||
+ pic->type == PICTURE_TYPE_B);
+ vslice->ref_pic_list0[0] = vpic->reference_frames[0];
+ }
+ if (pic->nb_refs >= 2) {
+ // Forward reference for B-frame.
+ av_assert0(pic->type == PICTURE_TYPE_B);
+ vslice->ref_pic_list1[0] = vpic->reference_frames[1];
+ }
return 0;
}
--
2.11.0
_______________________________________________
libav-devel mailing list
[email protected]
https://lists.libav.org/mailman/listinfo/libav-devel