CodedBitstreamFragment current_access_unit;
int aud_needed;
int sei_needed;
+ int sei_cbr_workaround_needed;
} VAAPIEncodeH264Context;
typedef struct VAAPIEncodeH264Options {
*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;
}
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));