[FFmpeg-devel] [PATCH] vaapi_h264: Add workaround for bad SEI in old Intel drivers
Mark Thompson
sw at jkqxz.net
Wed Oct 25 02:38:30 EEST 2017
On 25/10/17 00:32, Mark Thompson wrote:
> With pre-2.0 Intel drivers in CBR mode, if an explicit SEI message with
> the old (now deprecated) type is not included, the driver generates and
> inserts some timing SEI which is almost certainly invlaid. Before
> 7a4fac5e91789b73e07bd4ad20493cfde028df76 we always inserted our own SEI
* 2e29ca2a9f19ba9a5b189f322f38497d2e2e3db0
> so this would not be visible, but since then it has been possible to
> disable that. We would also like to avoid using the deprecated type,
> and using the new type, while working in old drivers, does not suppress
> the spurious message like the old type does.
>
> Therefore, suppress the bad SEI insertion by providing a zero-length
> buffer with the old type, which the driver can insert harmlessly.
> ---
> libavcodec/vaapi_encode_h264.c | 18 ++++++++++++++++++
> 1 file changed, 18 insertions(+)
>
> diff --git a/libavcodec/vaapi_encode_h264.c b/libavcodec/vaapi_encode_h264.c
> index 1d43e934ef..5fd0bf7796 100644
> --- a/libavcodec/vaapi_encode_h264.c
> +++ b/libavcodec/vaapi_encode_h264.c
> @@ -82,6 +82,7 @@ typedef struct VAAPIEncodeH264Context {
> CodedBitstreamFragment current_access_unit;
> int aud_needed;
> int sei_needed;
> + int sei_cbr_workaround_needed;
> } VAAPIEncodeH264Context;
>
> typedef struct VAAPIEncodeH264Options {
> @@ -258,6 +259,19 @@ static int vaapi_encode_h264_write_extra_header(AVCodecContext *avctx,
>
> *type = VAEncPackedHeaderRawData;
> return 0;
> +
> +#if !CONFIG_VAAPI_1
> + } else if (priv->sei_cbr_workaround_needed) {
> + // Insert a zero-length header using the old SEI type. This is
> + // required to avoid triggering broken behaviour on Intel platforms
> + // in CBR mode where an invalid SEI message is generated by the
> + // driver and inserted into the stream.
> + *data_len = 0;
> + *type = VAEncPackedHeaderH264_SEI;
> + priv->sei_cbr_workaround_needed = 0;
> + return 0;
> +#endif
> +
> } else {
> return AVERROR_EOF;
> }
> @@ -614,6 +628,10 @@ static int vaapi_encode_h264_init_picture_params(AVCodecContext *avctx,
>
> if (opt->sei & SEI_IDENTIFIER && pic->encode_order == 0)
> priv->sei_needed = 1;
> +#if !CONFIG_VAAPI_1
> + if (ctx->va_rc_mode == VA_RC_CBR)
> + priv->sei_cbr_workaround_needed = 1;
> +#endif
>
> if (opt->sei & SEI_TIMING) {
> memset(&priv->pic_timing, 0, sizeof(priv->pic_timing));
>
More information about the ffmpeg-devel
mailing list