]> git.sesse.net Git - ffmpeg/blobdiff - libavcodec/vaapi_encode_h264.c
avcodec/nvdec: Implement vp8 hwaccel
[ffmpeg] / libavcodec / vaapi_encode_h264.c
index 1d43e934ef0152a3d13aadea5294ee4b0ed294f0..5fd0bf7796d73d71a21d8f72bb7ebd6d0f2609af 100644 (file)
@@ -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));