[FFmpeg-user] Trouble selecting a pixel format/colorspace while trying to encode a video using ffmpeg and HW accelerated vaapi or qsv interfaces

caetano at vision.ime.usp.br caetano at vision.ime.usp.br
Thu Dec 8 21:32:02 EET 2022


I'm having trouble selecting a pixel format/colorspace while trying to encode a video using ffmpeg and HW accelerated vaapi or qsv interfaces. I have an i7-1165G7 with integrated graphics and I'm using ffmpeg 5.1.1 with ubuntu

I'm able to select the pixel format/colorspace with the SW encoder, for instance, if I use the following command:

====
ffmpeg -f x11grab -draw_mouse 0 -framerate 20 -probesize 42M -video_size 1920x1200 -thread_queue_size 1000 -vcodec rawvideo -i ":0.0" -an -c:v hevc -preset veryslow -global_quality 17 -look_ahead 1 -y /tmp/output.mkv
====

I get the correct pixel format and with ffprobe I have the following:

====
Input #0, matroska,webm, from '/tmp/output.mkv':
  Metadata:
    ENCODER         : Lavf59.27.100
  Duration: 00:00:02.90, start: 0.000000, bitrate: 92 kb/s
  Stream #0:0: Video: hevc (Rext), gbrp(pc, gbr/unknown/unknown, progressive), 1920x1200, 20 fps, 20 tbr, 1k tbn
    Metadata:
      ENCODER         : Lavc59.37.100 libx265
      DURATION        : 00:00:02.900000000
====

The video from the above example is correctly encoded and colors are exactly what I need them to be.

On the other hand, when I try to use the HW encoder, the pixel format is wrong. For instance:

====
ffmpeg -init_hw_device qsv=hw -filter_hw_device hw -v verbose -f x11grab -draw_mouse 0 -framerate 20 -probesize 42M -video_size 1920x1200 -thread_queue_size 1000 -vcodec rawvideo -i ":0.0" -an -vf 'hwupload=extra_hw_frames=64,scale_qsv=format=bgra' -c:v hevc_qsv -preset veryslow -global_quality 17 -look_ahead 1 -y /tmp/output.mkv
====

ffprobe generates:

====
Input #0, matroska,webm, from '/tmp/output.mkv':
  Metadata:
    ENCODER         : Lavf59.27.100
  Duration: 00:00:04.40, start: 0.000000, bitrate: 55 kb/s
  Stream #0:0: Video: hevc (Main), yuvj420p(pc, gbr/unknown/unknown, progressive), 1920x1200 [SAR 1:1 DAR 8:5], 20 fps, 20 tbr, 1k tbn
    Metadata:
      ENCODER         : Lavc59.37.100 hevc_qsv
      DURATION        : 00:00:04.400000000
====

As you can see, in the first example, libx265 SW encoder based, the output is generated with the "gbrp" colorspace while in the second example, hevc_qsv HW encoder based, the output is generated with the "yuvj420p" pixel format.

QUESTION: How can I properly control the pixel format/colorspace of the generated output using the HW based encoders such as QSV or VAAPI with my i7-1165G7 integrated graphics card ? I would like a format that is 24 or 32bits instead of the 12bits I'm getting


More information about the ffmpeg-user mailing list