Bug 41915 - libvpx6: крайне медленное декодирование
Summary: libvpx6: крайне медленное декодирование
Status: CLOSED FIXED
Alias: None
Product: Sisyphus
Classification: Development
Component: libvpx6 (show other bugs)
Version: unstable
Hardware: aarch64 Linux
: P5 normal
Assignee: Anton Farygin
QA Contact: qa-sisyphus
URL:
Keywords:
Depends on:
Blocks:
 
Reported: 2022-02-10 13:49 MSK by Alexey Sheplyakov
Modified: 2022-02-10 19:30 MSK (History)
1 user (show)

See Also:


Attachments
system-wide on-CPU profile (in a flamegraph form) (251.64 KB, image/svg+xml)
2022-02-10 13:49 MSK, Alexey Sheplyakov
no flags Details
system-wide on-CPU profile of NEON-enabled decoding (956.23 KB, image/svg+xml)
2022-02-10 13:58 MSK, Alexey Sheplyakov
no flags Details

Note You need to log in before you can comment on or make changes to this bug.
Description Alexey Sheplyakov 2022-02-10 13:49:58 MSK
Created attachment 10272 [details]
system-wide on-CPU profile (in a flamegraph form)

rpi4$ ffprobe Big_Buck_Bunny_60fps_4K_-_Official_Blender_Foundation_Short_Film-aqz-KE-bpKQ.webm 2>&1 | grep 'Video:'
  Stream #0:0(eng): Video: vp9 (Profile 0), yuv420p(tv, bt709), 1920x1080, SAR 1:1 DAR 16:9, 60 fps, 60 tbr, 1k tbn, 1k tbc (default)
rpi4$ ffplay -loglevel quiet -vcodec libvpx-vp9 -fs Big_Buck_Bunny_60fps_4K_-_Official_Blender_Foundation_Short_Film-aqz-KE-bpKQ.webm

Получаем слайд-шоу, кадр сменяется раз в 10 -- 20 секунд.

rpi4# perf record -g --call-graph=dwarf,16384 -a -F 127
rpi4# apt-get install -y ffplay-debuginfo libvpx6-debuginfo
rpi4# perf script --header > ffplay-libvpx-c.stacks
rpi4$ stackcollapse-perf.pl < ffplay-libvpx-c.stacks | flamegraph.pl --title='ffplay, libvpx, C' > ffplay-libvpx-c.stacks

Более 97% стеков - декодирование видео. В основном
1) motion compensation (функция tile_worker_hook и выше по стеку), ~ 51%
2) deblocking filter (loop_filter_row_worker), ~ 21%

То, что основные затраты при декодировании приходятся на motion compensation
и deblocking -- вполне ожидаемо и правильно. Неправильно то, что при этом
вместо SIMD используются сферические кони в вакууме^W^W^W^W vpx_convolve8_c,
vpx_lpf_horizontal_16_dual_c, и т.п.

vpx декодер активно пользуется арифметикой с насыщением (saturation arithmetics).
Многие SIMD ISA (SSEv2 на x86, NEON на armv{7,8}, и т.п.) предоставляют быструю
арифметику с насыщением. А сделать её правильно и быстро на C сложно.
В libvpx есть и реализация на C, но она очень неторопливая, и годится в
основном для тестирования (чтобы было с чем сравнивать SIMD реализации).
Но для "посмотреть видео" C реализации практически бесполезны, что видно
при попытке проиграть практически любое HD видео с youtube.
Comment 1 Alexey Sheplyakov 2022-02-10 13:56:18 MSK
#294379 BUILDING #5 [locked] [test-only] sisyphus libvpx6.git=1.11.0-alt2
Comment 2 Alexey Sheplyakov 2022-02-10 13:58:34 MSK
Created attachment 10273 [details]
system-wide on-CPU profile of NEON-enabled decoding
Comment 3 Alexey Sheplyakov 2022-02-10 18:22:28 MSK
#294379 EPERM #6 sisyphus libvpx6.git=1.11.0-alt2
Comment 4 Repository Robot 2022-02-10 19:30:41 MSK
libvpx6-1.11.0-alt2 -> sisyphus:

 Thu Feb 10 2022 Alexey Sheplyakov <asheplyakov@altlinux> 1.11.0-alt2
 - Enabled SIMD-optimized decoding on aarch64 (Closes: #41915)