[FFmpeg-devel] Recent regression in VA-API compatibility (assertion in H.264 encode)

Mark Thompson sw at jkqxz.net
Fri Dec 1 20:17:16 EET 2017


On 01/12/17 16:48, Devin Heitmueller wrote:
> Hello,
> 
> It looks like a recent patch causes VA-API H.264 encode to stop working and an assertion to be thrown.  I ran a git bisect and narrowed it down to the following commit:
> 
> 32a618a948c20f18db102d0b0976790222a57105 is the first bad commit
> commit 32a618a948c20f18db102d0b0976790222a57105
> Author: Mark Thompson <sw at jkqxz.net>
> Date:   Wed Oct 18 19:46:53 2017 +0100
> 
>     vaapi_h264: Do not use deprecated header type
>     
>     SEI headers should be inserted as generic raw data (the old specific
>     type has been deprecated in libva2).
> 
> 
> When run with the above patch, I get the following output:
> 
> [h264_vaapi @ 0x37d0a20] Warning: some packed headers are not supported (want 0xd, got 0xb).
> [h264_vaapi @ 0x37d0a20] The encode compression level option is not supported with this VAAPI version.
> ffmpeg: i965_drv_video.c:352: va_enc_packed_type_to_idx: Assertion `0' failed.
> 
> Here’s the vainfo output which provides the version info for the driver, va-api version, etc.  This is on a Haswell system running Centos 7.
> 
> libva info: VA-API version 0.34.0
> libva info: va_getDriverName() returns 0
> libva info: Trying to open /usr/lib64/dri/i965_drv_video.so
> libva info: Found init function __vaDriverInit_0_34
> libva info: va_openDriver() returns 0
> vainfo: VA-API version: 0.34 (libva 1.2.1)
> vainfo: Driver version: Intel i965 driver - 1.2.2

Upgrading to a version less than four years old might be a plan - I admit we do notionally support that version because of old RHEL/CentOS, but it is not well tested (as you are finding).

> 
> I’m using the following command line for testing:
> 
> ./ffmpeg -y -vaapi_device /dev/dri/card0 -i /home/devin/inputfile.ts -vf 'format=nv12,hwupload' -c:v h264_vaapi out.mp4
> 
> Any suggestions that could be offered would be greatly appreciated.  Likewise please let me know if there is any other information I can provide that would assist in getting this resolved.

Try this?  (Not tested, hardware which can run a version that old isn't immediately to hand.)

--- a/libavcodec/vaapi_encode_h264.c
+++ b/libavcodec/vaapi_encode_h264.c
@@ -261,7 +261,8 @@ static int vaapi_encode_h264_write_extra_header(AVCodecContext *avctx,
         return 0;
 
 #if !CONFIG_VAAPI_1
-    } else if (priv->sei_cbr_workaround_needed) {
+    } else if (priv->sei_cbr_workaround_needed &&
+               ctx->va_packed_headers & VA_ENC_PACKED_HEADER_SLICE) {
         // 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


(Probably wants a comment pointing at the driver code to explain why that condition, too.)

- Mark


More information about the ffmpeg-devel mailing list