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