[FFmpeg-user] Bad performance when using h264_vaapi to encode stream from camera.

brucedickinson at wp.pl brucedickinson at wp.pl
Sat May 13 10:32:43 EEST 2023


Hello guys,

 

I am using quite old Intel e3845 processor to do hardware encoding/decoding
via vaapi. It works very well when I test it on transcoding a h264 1920x1080
30 fps file:

 

ffmpeg -vaapi_device /dev/dri/renderD128 -i test_02.mp4 -vf
'format=nv12,hwupload' -c:v h264_vaapi -profile: high -qp: 42
test_02_01_h264_vaapi.mp4

 

[out#0/mp4 @ 0x55c058071e40] video:3194kB audio:0kB subtitle:0kB other
streams:0kB global headers:0kB muxing overhead: 0.287536%

frame=  901 fps= 42 q=-0.0 Lsize=    3203kB time=00:00:29.96 bitrate=
875.5kbits/s speed=1.41x

 

I would think that it will work as good when encoding camera stream (or even
better because there is no decoding involved). To my surprise, performance
is lousy, it is a fraction of speed in comparison to transcoding from a
file:

 

ffmpeg -loglevel debug -vaapi_device /dev/dri/renderD128 -f v4l2 -framerate
30 -video_size 1920x1080 -i /dev/video2 -vf 'format=nv12,hwupload' -c:v
h264_vaapi -profile: high -qp: 42 output_2_vaapi.mp4

ffmpeg version N-110363-g2aad9765ef Copyright (c) 2000-2023 the FFmpeg
developers

  built with gcc 12 (Ubuntu 12.2.0-3ubuntu1)

  configuration: --pkg-config-flags=--static --enable-static
--disable-shared --prefix=/home/sicore/ffmpeg_build --bindir=/home/test/bin
--extra-cflags=-I/home/test/bin/include
--extra-ldflags=-L/home/sicore/bin/lib --extra-cflags=-I/usr/local/include
--extra-ldflags=-L/usr/local/lib --enable-vaapi --disable-debug
--enable-libdrm --enable-gpl --enable-runtime-cpudetect --enable-libx264
--enable-openssl --enable-pic --extra-libs='-lpthread -lm -lz -ldl'
--enable-nonfree

  libavutil      58.  6.100 / 58.  6.100

  libavcodec     60. 10.100 / 60. 10.100

  libavformat    60.  5.100 / 60.  5.100

  libavdevice    60.  2.100 / 60.  2.100

  libavfilter     9.  5.100 /  9.  5.100

  libswscale      7.  2.100 /  7.  2.100

  libswresample   4. 11.100 /  4. 11.100

  libpostproc    57.  2.100 / 57.  2.100

Splitting the commandline.

Reading option '-loglevel' ... matched as option 'loglevel' (set logging
level) with argument 'debug'.

Reading option '-vaapi_device' ... matched as option 'vaapi_device' (set
VAAPI hardware device (DirectX adapter index, DRM path or X11 display name))
with argument '/dev/dri/renderD128'.

Reading option '-f' ... matched as option 'f' (force format) with argument
'v4l2'.

Reading option '-framerate' ... matched as AVOption 'framerate' with
argument '30'.

Reading option '-video_size' ... matched as AVOption 'video_size' with
argument '1920x1080'.

Reading option '-i' ... matched as input url with argument '/dev/video2'.

Reading option '-vf' ... matched as option 'vf' (set video filters) with
argument 'format=nv12,hwupload'.

Reading option '-c:v' ... matched as option 'c' (codec name) with argument
'h264_vaapi'.

Reading option '-profile:' ... matched as option 'profile' (set profile)
with argument 'high'.

Reading option '-qp:' ... matched as AVOption 'qp:' with argument '42'.

Reading option 'output_2_vaapi.mp4' ... matched as output url.

Finished splitting the commandline.

Parsing a group of options: global .

Applying option loglevel (set logging level) with argument debug.

Applying option vaapi_device (set VAAPI hardware device (DirectX adapter
index, DRM path or X11 display name)) with argument /dev/dri/renderD128.

[AVHWDeviceContext @ 0x55c91096d7c0] libva: VA-API version 1.16.0

[AVHWDeviceContext @ 0x55c91096d7c0] libva: User environment variable
requested driver 'i965'

[AVHWDeviceContext @ 0x55c91096d7c0] libva: Trying to open
/usr/lib/x86_64-linux-gnu/dri/i965_drv_video.so

[AVHWDeviceContext @ 0x55c91096d7c0] libva: Found init function
__vaDriverInit_1_16

[AVHWDeviceContext @ 0x55c91096d7c0] libva: va_openDriver() returns 0

[AVHWDeviceContext @ 0x55c91096d7c0] Initialised VAAPI connection: version
1.16

[AVHWDeviceContext @ 0x55c91096d7c0] Format 0x32315659 -> yuv420p.

[AVHWDeviceContext @ 0x55c91096d7c0] Format 0x30323449 -> yuv420p.

[AVHWDeviceContext @ 0x55c91096d7c0] Format 0x3231564e -> nv12.

[AVHWDeviceContext @ 0x55c91096d7c0] Format 0x32595559 -> yuyv422.

[AVHWDeviceContext @ 0x55c91096d7c0] Format 0x59565955 -> uyvy422.

[AVHWDeviceContext @ 0x55c91096d7c0] Format 0x48323234 -> yuv422p.

[AVHWDeviceContext @ 0x55c91096d7c0] Format 0x58424752 -> rgb0.

[AVHWDeviceContext @ 0x55c91096d7c0] Format 0x58524742 -> bgr0.

[AVHWDeviceContext @ 0x55c91096d7c0] Format 0x30313050 -> p010le.

[AVHWDeviceContext @ 0x55c91096d7c0] VAAPI driver: Intel i965 driver for
Intel(R) Bay Trail - 2.4.0.pre1 (2.3.0-35-gab755cb).

[AVHWDeviceContext @ 0x55c91096d7c0] Driver not found in known nonstandard
list, using standard behaviour.

Successfully parsed a group of options.

Parsing a group of options: input url /dev/video2.

Applying option f (force format) with argument v4l2.

Successfully parsed a group of options.

Opening an input file: /dev/video2.

[video4linux2,v4l2 @ 0x55c91097f300] fd:4 capabilities:84a00001

[video4linux2,v4l2 @ 0x55c91097f300] Current input_channel: 0, input_name:
Camera, input_std: 0

[video4linux2,v4l2 @ 0x55c91097f300] The V4L2 driver changed the pixel
format from 0x32315559 to 0x56595559

[video4linux2,v4l2 @ 0x55c91097f300] Trying to set codec:rawvideo
pix_fmt:yuv420p

[video4linux2,v4l2 @ 0x55c91097f300] The V4L2 driver changed the pixel
format from 0x32315559 to 0x56595559

[video4linux2,v4l2 @ 0x55c91097f300] Trying to set codec:rawvideo
pix_fmt:yuv420p

[video4linux2,v4l2 @ 0x55c91097f300] The V4L2 driver changed the pixel
format from 0x32315659 to 0x56595559

[video4linux2,v4l2 @ 0x55c91097f300] Trying to set codec:rawvideo
pix_fmt:yuv422p

[video4linux2,v4l2 @ 0x55c91097f300] The V4L2 driver changed the pixel
format from 0x50323234 to 0x56595559

[video4linux2,v4l2 @ 0x55c91097f300] Trying to set codec:rawvideo
pix_fmt:yuyv422

[video4linux2,v4l2 @ 0x55c91097f300] Setting time per frame to 1/30

[video4linux2,v4l2 @ 0x55c91097f300] All info found

Input #0, video4linux2,v4l2, from '/dev/video2':

  Duration: N/A, start: 172336.109110, bitrate: 995328 kb/s

  Stream #0:0, 1, 1/1000000: Video: rawvideo, 1 reference frame (YUY2 /
0x32595559), yuyv422, 1920x1080, 0/1, 995328 kb/s, 30 fps, 30 tbr, 1000k tbn

Successfully opened the file.

Parsing a group of options: output url output_2_vaapi.mp4.

Applying option vf (set video filters) with argument format=nv12,hwupload.

Applying option c:v (codec name) with argument h264_vaapi.

Applying option profile: (set profile) with argument high.

Successfully parsed a group of options.

Opening an output file: output_2_vaapi.mp4.

[file @ 0x55c9109890c0] Setting default whitelist 'file,crypto,data'

Successfully opened the file.

Stream mapping:

  Stream #0:0 -> #0:0 (rawvideo (native) -> h264 (h264_vaapi))

Press [q] to stop, [?] for help

[vost#0:0/h264_vaapi @ 0x55c910983900] cur_dts is invalid [init:0 i_done:0
finish:0] (this is harmless if it occurs once at the start per stream)

[rawvideo @ 0x55c910982240] PACKET SIZE: 4147200, STRIDE: 3840

[AVFilterGraph @ 0x55c910988340] Setting 'pix_fmts' to value 'nv12'

detected 4 logical cores

[graph 0 input from stream 0:0 @ 0x55c91098a480] Setting 'video_size' to
value '1920x1080'

[graph 0 input from stream 0:0 @ 0x55c91098a480] Setting 'pix_fmt' to value
'1'

[graph 0 input from stream 0:0 @ 0x55c91098a480] Setting 'time_base' to
value '1/1000000'

[graph 0 input from stream 0:0 @ 0x55c91098a480] Setting 'pixel_aspect' to
value '0/1'

[graph 0 input from stream 0:0 @ 0x55c91098a480] Setting 'frame_rate' to
value '30/1'

[graph 0 input from stream 0:0 @ 0x55c91098a480] w:1920 h:1080
pixfmt:yuyv422 tb:1/1000000 fr:30/1 sar:0/1

[format @ 0x55c91098b500] Setting 'pix_fmts' to value 'vaapi'

[auto_scale_0 @ 0x55c91098c980] w:iw h:ih flags:'' interl:0

[Parsed_format_0 @ 0x55c910989680] auto-inserting filter 'auto_scale_0'
between the filter 'graph 0 input from stream 0:0' and the filter
'Parsed_format_0'

[AVFilterGraph @ 0x55c910988340] query_formats: 5 queried, 4 merged, 1
already done, 0 delayed

[auto_scale_0 @ 0x55c91098c980] w:1920 h:1080 fmt:yuyv422 sar:0/1 -> w:1920
h:1080 fmt:nv12 sar:0/1 flags:0x00000004

[hwupload @ 0x55c910989c00] Surface format is nv12.

[AVHWFramesContext @ 0x55c910bc3a00] Created surface 0x4000000.

[AVHWFramesContext @ 0x55c910bc3a00] Direct mapping possible.

[AVHWFramesContext @ 0x55c910bc3a00] Map surface 0x4000000.

[AVHWFramesContext @ 0x55c910bc3a00] Unmap surface 0x4000000.

[h264_vaapi @ 0x55c910983d00] Using input frames context (format vaapi) with
h264_vaapi encoder.

[h264_vaapi @ 0x55c910983d00] Input surface format is nv12.

[h264_vaapi @ 0x55c910983d00] Using VAAPI profile VAProfileH264High (7).

[h264_vaapi @ 0x55c910983d00] Using VAAPI entrypoint VAEntrypointEncSlice
(6).

[h264_vaapi @ 0x55c910983d00] Using VAAPI render target format YUV420 (0x1).

[h264_vaapi @ 0x55c910983d00] Driver supports RC modes CQP, CBR, VBR.

[h264_vaapi @ 0x55c910983d00] RC mode: CQP.

[h264_vaapi @ 0x55c910983d00] RC quality: 42.

[h264_vaapi @ 0x55c910983d00] RC framerate: 30/1 (30.00 fps).

[h264_vaapi @ 0x55c910983d00] Driver does not report any additional
prediction constraints.

[h264_vaapi @ 0x55c910983d00] Using intra, P- and B-frames (supported
references: 1 / 1).

[h264_vaapi @ 0x55c910983d00] All wanted packed headers available (wanted
0xd, found 0x1f).

[h264_vaapi @ 0x55c910983d00] Using nv12 as format of reconstructed frames.

[AVHWFramesContext @ 0x55c910c1b380] Created surface 0x4000001.

[AVHWFramesContext @ 0x55c910c1b380] Direct mapping possible.

[h264_vaapi @ 0x55c910983d00] Using fixed QP = 42 / 42 / 50 for IDR- / P- /
B-frames.

[h264_vaapi @ 0x55c910983d00] Using level 4.

Output #0, mp4, to 'output_2_vaapi.mp4':

  Metadata:

    encoder         : Lavf60.5.100

  Stream #0:0, 0, 1/15360: Video: h264 (High), 1 reference frame (avc1 /
0x31637661), vaapi(tv, progressive), 1920x1080 (0x0), 0/1, q=2-31, 30 fps,
15360 tbn

    Metadata:

      encoder         : Lavc60.10.100 h264_vaapi

 

<some time later>

 

[out#0/mp4 @ 0x55c91097f800] video:74kB audio:0kB subtitle:0kB other
streams:0kB global headers:0kB muxing overhead: 1.961509%

frame=   67 fps= 13 q=-0.0 Lsize=      75kB time=00:00:02.16 bitrate=
285.4kbits/s dup=7 drop=0 speed=0.413x

60 frames successfully decoded, 0 decoding errors

[h264_vaapi @ 0x55c910983d00] Freed output buffer 0x8000000

[in#0/video4linux2,v4l2 @ 0x55c91097f180] Terminating demuxer thread

[in#0/video4linux2,v4l2 @ 0x55c91097f180] Input file #0 (/dev/video2):

[in#0/video4linux2,v4l2 @ 0x55c91097f180]   Input stream #0:0 (video): 60
packets read (248832000 bytes); 60 frames decoded;

[in#0/video4linux2,v4l2 @ 0x55c91097f180]   Total: 60 packets (248832000
bytes) demuxed

 

As you can see, speed is 0.413, it is almost 4 times slower when
transcoding. Is there something I am doing wrong?

 

Thanks for any help.



More information about the ffmpeg-user mailing list