@ -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 ) ) ;