[Cin] Mesa 24.3 and Vulkan

Andrea paz gamberucci.andrea at gmail.com
Fri Dec 6 11:01:02 CET 2024


Arch upgraded to mesa 24.3.1 and my tests with system ffmpeg 7.1 were
successful, but with many problems.
Need to initialize the “vulkan” device otherwise it doesn't work. In
case of AMD graphics you have to use RADV_PERFTEST=video_decode and/or
RADV_PERFTEST=video_encode. This is because the merge in Mesa that
will make device enablement automatic will only be in Mesa 25 (which
should be the next release).

The decoder works (it worked even before Mesa 24.3 came out) but it
should be noted that without vulkan you have fps= 2222 while with
vulkan you have fps=460
Command used for the decoder:

$ RADV_PERFTEST=video_decode ffmpeg -init_hw_device "vulkan=vk:0"
-hwaccel vulkan -hwaccel_output_format vulkan -i
battlefield_1080p_120fps_8mbps.mp4 -f null - -benchmark


The encoder also works (it did not work before Mesa 24.3): you can see
that the file is created (test_vk.mp4) and starts in mpv/VLC; the
sound works but the video is completely black. Also, the original
video is 35 MB while the video encoded with hevc_vulkan is 1.3 GB! The
fps are not bad: 223.
Command used for encoder:

$ RADV_PERFTEST=video_encode ffmpeg -init_hw_device vulkan=vkdev:0
-filter_hw_device vkdev -i battlefield_1080p_120fps_8mbps.mp4
-filter:v "format=nv12,hwupload" -c:v hevc_vulkan test_vk.mp4


Instead when compiling CinGG I can't to enable the vulkan device. How
to do it? i tried to use --enable-vulkan in “configure” but it is not
recognized. How could I use the two strings RADV_PERFTEST=video_encode
and RADV_PERFTEST=video_decode in CinGG?

I attach the test results.

Il giorno gio 28 nov 2024 alle ore 01:06 Terje J. Hanssen via Cin
<cin at lists.cinelerra-gg.org> ha scritto:
>
>
> Den 28.11.2024 00:00, skrev Terje J. Hanssen:
>
>
>
>
> Den 27.11.2024 23:40, skrev Andrew Randrianasulu:
>
>
>
> чт, 28 нояб. 2024 г., 01:22 Terje J. Hanssen via Cin <cin at lists.cinelerra-gg.org>:
>>
>> In August this year we had a thread "h264 vulkan encoding" initiated by Andrea
>> https://lists.cinelerra-gg.org/pipermail/cin/2024-August/008517.html
>>
>> Mesa 24.3 is released with many Vulkan Driver Improvement, and implementations are expected around the corner in rolling distributions.
>>
>> Some articles about this in Phoronix
>> https://www.phoronix.com/news/Mesa-24.3-Released
>> https://www.phoronix.com/news/Mesa-24.3-rc2
>> https://www.phoronix.com/news/Mesa-24.3-rc1-Released
>> https://www.phoronix.com/news/Intel-Vulkan-Video-H264-H265
>>
>> With ffmpeg (7.1) h264/5 vulkan encoder support, I wonder if Cingg is ready to put them into use?
>>
>> ffmpeg -hide_banner -encoders | grep vulkan
>>  V....D h264_vulkan          H.264/AVC (Vulkan) (codec h264)
>>  V....D hevc_vulkan          H.265/HEVC (Vulkan) (codec hevc)
>
>
>
> you can try already (on system's ffmpeg), can't you?
>
>
> Not Mesa 24.3 and vulkan encoding quite yet:
>
> API: OpenGL v: 4.6 vendor: intel mesa v: 24.2.7 renderer: Mesa Intel Arc
>     A750 Graphics (DG2)
>   API: Vulkan v: 1.3.296 drivers: N/A surfaces: xcb,xlib
>   API: EGL Message: EGL data requires eglinfo. Check --recommends.
>
>
> # export ANV_VIDEO_DECODE=1
>
> # vulkaninfo | grep VK_KHR_video
>     VK_KHR_video_decode_h264                      : extension revision 9
>     VK_KHR_video_decode_h265                      : extension revision 8
>     VK_KHR_video_decode_queue                     : extension revision 8
>     VK_KHR_video_queue
>
> So assume the FFmpeg benchmarks sample was vulkan decoding only,  as they work for hdv (mpeg2) input also:
>
> ffmpeg -hide_banner -init_hw_device "vulkan=vk:0" -hwaccel vulkan -hwaccel_output_format vulkan -i hdv09_04.m2t -f null - -benchmark
> frame= 5963 fps=3503 q=-0.0 Lsize=N/A time=00:03:58.77 bitrate=N/A speed= 140x
> bench: utime=19.045s stime=0.313s rtime=1.702s
>
> ffmpeg -hide_banner -init_hw_device "vulkan=vk:0" -hwaccel vulkan -hwaccel_output_format vulkan -i hdv09_04_h264_qsv.mp4 -f null - -benchmark
> frame= 5969 fps=988 q=-0.0 Lsize=N/A time=00:03:58.76 bitrate=N/A speed=39.5x
> bench: utime=1.397s stime=1.390s rtime=6.042s
> bench: maxrss=164700KiB
>
> fmpeg -hide_banner -init_hw_device "vulkan=vk:0" -hwaccel vulkan -hwaccel_output_format vulkan -i hdv09_04_hevc_qsv_8b420.mp4 -f null - -benchmark
> frame=  248 fps=2.0 q=-0.0 size=N/A time=00:00:09.92 bitrate=N/A speed=0.0787x
> hevc terrible slow !!
>
> And I found a sample encoding on reddit, which failed as assumed for me as follows (similar for h264_vulkan):
>
> ffmpeg -init_hw_device vulkan=vkdev:0 -filter_hw_device vkdev -i hdv09_04.m2t -filter:v "format=nv12,hwupload" -c:v h264_vulkan hdv09_04_h264_vulkan_8b420.mp4
>
> ffmpeg version 7.1 Copyright (c) 2000-2024 the FFmpeg developers
>   built with gcc 14 (SUSE Linux)
>   configuration: --prefix=/usr --libdir=/usr/lib64 --shlibdir=/usr/lib64 --incdir=/usr/include/ffmpeg --extra-cflags='-O2 -Wall -U_FORTIFY_SOURCE -D_FORTIFY_SOURCE=3 -fstack-protector-strong -funwind-tables -fasynchronous-unwind-tables -fstack-clash-protection -Werror=return-type -flto=auto -ffat-lto-objects -g' --optflags='-O2 -Wall -U_FORTIFY_SOURCE -D_FORTIFY_SOURCE=3 -fstack-protector-strong -funwind-tables -fasynchronous-unwind-tables -fstack-clash-protection -Werror=return-type -flto=auto -ffat-lto-objects -g' --disable-htmlpages --enable-pic --disable-stripping --enable-shared --disable-static --enable-gpl --enable-version3 --enable-libsmbclient --disable-openssl --enable-gnutls --enable-ladspa --enable-libshaderc --enable-vulkan ......................
> ..........
> [hevc_vulkan @ 0x55c32f8df6c0] Device does not support the VK_KHR_video_encode_queue extension!
> [vost#0:0/hevc_vulkan @ 0x55c32fa0cf00] Error while opening encoder - maybe incorrect parameters such as bit_rate, rate, width or height.
> [vf#0:0 @ 0x55c32f8adcc0] Error sending frames to consumers: Function not implemented
> [vf#0:0 @ 0x55c32f8adcc0] Task finished with error code: -38 (Function not implemented)
> [vf#0:0 @ 0x55c32f8adcc0] Terminating thread with return code -38 (Function not implemented)
> [vost#0:0/hevc_vulkan @ 0x55c32fa0cf00] Could not open encoder before EOF
> [vost#0:0/hevc_vulkan @ 0x55c32fa0cf00] Task finished with error code: -22 (Invalid argument)
> [vost#0:0/hevc_vulkan @ 0x55c32fa0cf00] Terminating thread with return code -22 (Invalid argument)
> [out#0/mp4 @ 0x55c32f8b2c80] Nothing was written into output file, because at least one of its streams received no packets.
> frame=    0 fps=0.0 q=0.0 Lsize=       0KiB time=N/A bitrate=N/A speed=N/A
> [aac @ 0x55c32f90c640] Qavg: 441.163
> Conversion failed!
>
>
>
>
>
>
> --
> Cin mailing list
> Cin at lists.cinelerra-gg.org
> https://lists.cinelerra-gg.org/mailman/listinfo/cin
-------------- next part --------------


DECODER (whithout RADV_PERFTEST=video_decode)

$ ffmpeg -init_hw_device "vulkan=vk:0" -hwaccel vulkan -hwaccel_output_format vulkan -i battlefield_1080p_120fps_8mbps.mp4 -f null - -benchmark

[...]

[h264 @ 0x5c692c1e92c0] Device does not support the VK_KHR_video_decode_queue extension!
[h264 @ 0x5c692c1e92c0] Failed setup for format vulkan: hwaccel initialisation returned error.

[...]

frame= 3436 fps=2222 q=-0.0 Lsize=N/A time=00:00:28.63 bitrate=N/A speed=18.5x
bench: utime=18.612s stime=0.575s rtime=1.547s
bench: maxrss=287444KiB



DECODER (with RADV_PERFTEST=video_decode):

$ RADV_PERFTEST=video_decode ffmpeg -init_hw_device "vulkan=vk:0" -hwaccel vulkan -hwaccel_output_format vulkan -i battlefield_1080p_120fps_8mbps.mp4 -f null - -benchmark
ffmpeg version n7.1 Copyright (c) 2000-2024 the FFmpeg developers
  built with gcc 14.2.1 (GCC) 20240910

Input #0, mov,mp4,m4a,3gp,3g2,mj2, from 'battlefield_1080p_120fps_8mbps.mp4':
  Metadata:
    major_brand     : mp42
    minor_version   : 0
    compatible_brands: mp42isomavc1
    creation_time   : 2013-08-23T09:21:03.000000Z
    encoder         : HandBrake 0.9.9 2013052900
  Duration: 00:00:28.65, start: 0.000000, bitrate: 10140 kb/s
  Stream #0:0[0x1](und): Video: h264 (High) (avc1 / 0x31637661), yuv420p(tv, bt709, progressive), 1920x1080 [SAR 1:1 DAR 16:9], 9971 kb/s, 120 fps, 120 tbr, 90k tbn (default)
      Metadata:
        creation_time   : 2013-08-23T09:21:03.000000Z
        vendor_id       : [0][0][0][0]
        encoder         : JVT/AVC Coding
  Stream #0:1[0x2](und): Audio: aac (LC) (mp4a / 0x6134706D), 48000 Hz, mono, fltp, 160 kb/s (default)
      Metadata:
        creation_time   : 2013-08-23T09:21:03.000000Z
        vendor_id       : [0][0][0][0]
Stream mapping:
  Stream #0:0 -> #0:0 (h264 (native) -> wrapped_avframe (native))
  Stream #0:1 -> #0:1 (aac (native) -> pcm_s16le (native))
Press [q] to stop, [?] for help
Output #0, null, to 'pipe:':
  Metadata:
    major_brand     : mp42
    minor_version   : 0
    compatible_brands: mp42isomavc1
    encoder         : Lavf61.7.100
  Stream #0:0(und): Video: wrapped_avframe, vulkan(tv, bt709, progressive), 1920x1080 [SAR 1:1 DAR 16:9], q=2-31, 200 kb/s, 120 fps, 120 tbn (default)
      Metadata:
        creation_time   : 2013-08-23T09:21:03.000000Z
        vendor_id       : [0][0][0][0]
        encoder         : Lavc61.19.100 wrapped_avframe
  Stream #0:1(und): Audio: pcm_s16le, 48000 Hz, mono, s16, 768 kb/s (default)
      Metadata:
        creation_time   : 2013-08-23T09:21:03.000000Z
        vendor_id       : [0][0][0][0]
        encoder         : Lavc61.19.100 pcm_s16le
[out#0/null @ 0x6337d7b0ddc0] video:1476KiB audio:2684KiB subtitle:0KiB other streams:0KiB global headers:0KiB muxing overhead: unknown
frame= 3436 fps=460 q=-0.0 Lsize=N/A time=00:00:28.63 bitrate=N/A speed=3.83x
bench: utime=0.250s stime=0.343s rtime=7.472s
bench: maxrss=226844KiB




ENCODER (without RADV_PERFTEST=video_encode):

$ ffmpeg -init_hw_device vulkan=vkdev:0 -filter_hw_device vkdev -i battlefield_1080p_120fps_8mbps.mp4 -filter:v "format=nv12,hwupload" -c:v hevc_vulkan test_vk.mp4
ffmpeg version n7.1 Copyright (c) 2000-2024 the FFmpeg developers
  built with gcc 14.2.1 (GCC) 20240910

Input #0, mov,mp4,m4a,3gp,3g2,mj2, from 'battlefield_1080p_120fps_8mbps.mp4':
  Metadata:
    major_brand     : mp42
    minor_version   : 0
    compatible_brands: mp42isomavc1
    creation_time   : 2013-08-23T09:21:03.000000Z
    encoder         : HandBrake 0.9.9 2013052900
  Duration: 00:00:28.65, start: 0.000000, bitrate: 10140 kb/s
  Stream #0:0[0x1](und): Video: h264 (High) (avc1 / 0x31637661), yuv420p(tv, bt709, progressive), 1920x1080 [SAR 1:1 DAR 16:9], 9971 kb/s, 120 fps, 120 tbr, 90k tbn (default)
      Metadata:
        creation_time   : 2013-08-23T09:21:03.000000Z
        vendor_id       : [0][0][0][0]
        encoder         : JVT/AVC Coding
  Stream #0:1[0x2](und): Audio: aac (LC) (mp4a / 0x6134706D), 48000 Hz, mono, fltp, 160 kb/s (default)
      Metadata:
        creation_time   : 2013-08-23T09:21:03.000000Z
        vendor_id       : [0][0][0][0]
Stream mapping:
  Stream #0:0 -> #0:0 (h264 (native) -> hevc (hevc_vulkan))
  Stream #0:1 -> #0:1 (aac (native) -> aac (native))
Press [q] to stop, [?] for help
[hevc_vulkan @ 0x5ec405092f00] Device does not support the VK_KHR_video_encode_queue extension!
[vost#0:0/hevc_vulkan @ 0x5ec404f0a3c0] Error while opening encoder - maybe incorrect parameters such as bit_rate, rate, width or height.
[vf#0:0 @ 0x5ec404f33440] Error sending frames to consumers: Function not implemented
[vf#0:0 @ 0x5ec404f33440] Task finished with error code: -38 (Function not implemented)
[vf#0:0 @ 0x5ec404f33440] Terminating thread with return code -38 (Function not implemented)
[vost#0:0/hevc_vulkan @ 0x5ec404f0a3c0] Could not open encoder before EOF
[vost#0:0/hevc_vulkan @ 0x5ec404f0a3c0] Task finished with error code: -22 (Invalid argument)
[vost#0:0/hevc_vulkan @ 0x5ec404f0a3c0] Terminating thread with return code -22 (Invalid argument)
[out#0/mp4 @ 0x5ec404e9a6c0] Nothing was written into output file, because at least one of its streams received no packets.
frame=    0 fps=0.0 q=0.0 Lsize=       0KiB time=N/A bitrate=N/A speed=N/A
[aac @ 0x5ec40602ce80] Qavg: 276.010
Conversion failed!


ENCODER (with RADV_PERFTEST=video_encode):

$ RADV_PERFTEST=video_encode ffmpeg -init_hw_device vulkan=vkdev:0 -filter_hw_device vkdev -i battlefield_1080p_120fps_8mbps.mp4 -filter:v "format=nv12,hwupload" -c:v hevc_vulkan test_vk.mp4
ffmpeg version n7.1 Copyright (c) 2000-2024 the FFmpeg developers
  built with gcc 14.2.1 (GCC) 20240910

Input #0, mov,mp4,m4a,3gp,3g2,mj2, from 'battlefield_1080p_120fps_8mbps.mp4':
  Metadata:
    major_brand     : mp42
    minor_version   : 0
    compatible_brands: mp42isomavc1
    creation_time   : 2013-08-23T09:21:03.000000Z
    encoder         : HandBrake 0.9.9 2013052900
  Duration: 00:00:28.65, start: 0.000000, bitrate: 10140 kb/s
  Stream #0:0[0x1](und): Video: h264 (High) (avc1 / 0x31637661), yuv420p(tv, bt709, progressive), 1920x1080 [SAR 1:1 DAR 16:9], 9971 kb/s, 120 fps, 120 tbr, 90k tbn (default)
      Metadata:
        creation_time   : 2013-08-23T09:21:03.000000Z
        vendor_id       : [0][0][0][0]
        encoder         : JVT/AVC Coding
  Stream #0:1[0x2](und): Audio: aac (LC) (mp4a / 0x6134706D), 48000 Hz, mono, fltp, 160 kb/s (default)
      Metadata:
        creation_time   : 2013-08-23T09:21:03.000000Z
        vendor_id       : [0][0][0][0]
File 'test_vk.mp4' already exists. Overwrite? [y/N] y
Stream mapping:
  Stream #0:0 -> #0:0 (h264 (native) -> hevc (hevc_vulkan))
  Stream #0:1 -> #0:1 (aac (native) -> aac (native))
Press [q] to stop, [?] for help
[hevc_vulkan @ 0x5c6261fd7fc0] No rate control settings specified, using fixed QP = 18
Output #0, mp4, to 'test_vk.mp4':
  Metadata:
    major_brand     : mp42
    minor_version   : 0
    compatible_brands: mp42isomavc1
    encoder         : Lavf61.7.100
  Stream #0:0(und): Video: hevc (Main) (hev1 / 0x31766568), vulkan(tv, bt709, progressive), 1920x1080 [SAR 1:1 DAR 16:9], q=2-31, 120 fps, 15360 tbn (default)
      Metadata:
        creation_time   : 2013-08-23T09:21:03.000000Z
        vendor_id       : [0][0][0][0]
        encoder         : Lavc61.19.100 hevc_vulkan
  Stream #0:1(und): Audio: aac (LC) (mp4a / 0x6134706D), 48000 Hz, mono, fltp, 69 kb/s (default)
      Metadata:
        creation_time   : 2013-08-23T09:21:03.000000Z
        vendor_id       : [0][0][0][0]
        encoder         : Lavc61.19.100 aac
[out#0/mp4 @ 0x5c6261de06c0] video:1353895KiB audio:248KiB subtitle:0KiB other streams:0KiB global headers:0KiB muxing overhead: 0.003656%
frame= 3436 fps=223 q=-0.0 Lsize= 1354193KiB time=00:00:28.63 bitrate=387434.6kbits/s speed=1.86x
[aac @ 0x5c6262f72c40] Qavg: 276.010

Si vede che  il file viene creato (test_vk.mp4) e parte in mpv/VLC: il sonoro funziona ma lo schermo è completamente nero. Inoltre il video originale è di 35 MB mentre il video codificato con hevc_vulkan è 1.3 GB!

Invece durante la compilazione di CinGG non riesco ad abilitare il device vulkan. Come fare? ho provato ad usare --enable-vulkan in "configure" ma non viene riconosciuto. Come potrei usare le due stringhe RADV_PERFTEST=video_encode e RADV_PERFTEST=video_decode in CinGG?


More information about the Cin mailing list