On 2017/12/18 4:05, Mark Thompson wrote:
> 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.
I think the root cause for HECV enc can't work in SKL is iHD have a
limitation for
max_transform_hierarchy_depth_inter/max_transform_hierarchy_depth_intra,
you can apply the patch in
https://github.com/mypopydev/FFmpeg/commit/fb35b6167d16d1acb81d0c82e19293c7cf97a574,
then re-try h265 ENC with iHD in SKL. Tks.
>
>  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;
>  }

_______________________________________________
libav-devel mailing list
[email protected]
https://lists.libav.org/mailman/listinfo/libav-devel

Reply via email to