LINUX.ORG.RU

mpv и GPU декодирование на Nvidia

 , ,


0

1

Короче не тянет компьютер видео с айфона (HEVC 4K 60 FPS).

Ну значит mpv 0.32:

mpv –hwdec=nvdec Не работает

mpv –hwdec=nvdec-copy Работает

nvdec and nvdec-copy are the newest, and recommended method to do hardware decoding on Nvidia GPUs.

  • nvdec: requires –vo=gpu (Any platform CUDA is available)
  • nvdec-copy: copies video back to system RAM (Any platform CUDA is available)

А в чём разница? И почему первый не работает?

★★★★★

Где сообщение об ошибке? Вообще давай лог с --msg-level=all=debug.

А в чём разница?

Копировать туда-обратно - тормозный говнокод.

anonymous ()
Ответ на: комментарий от gremlin_the_red

И как, ты добавил –vo=gpu ?

Да, видел. И так и сяк писал не работает без copy.

Вот nvdec

[vd] Container reported FPS: 60.000000
[vd] Codec list:
[vd]     hevc - HEVC (High Efficiency Video Coding)
[vd]     hevc_v4l2m2m (hevc) - V4L2 mem2mem HEVC decoder wrapper
[vd]     hevc_cuvid (hevc) - Nvidia CUVID HEVC decoder
[vd] Opening decoder hevc
[vd] Looking at hwdec hevc-nvdec...
[vo/gpu] Loading hwdec driver 'vaapi-egl'
[vo/gpu/vaapi-egl] VAAPI hwdec only works with OpenGL or Vulkan backends.
[vo/gpu] Loading failed.
[vo/gpu] Loading hwdec driver 'vdpau-gl'
[vo/gpu] Loading failed.
[vo/gpu] Loading hwdec driver 'drmprime-drm'
[vo/gpu/drmprime-drm] Failed to retrieve DRM fd from native display.
[vo/gpu] Loading failed.
[vd] Could not create device.
[vd] No hardware decoding available for this codec.
[vd] Using software decoding.
[vd] Detected 4 logical cores.
fornlr ★★★★★ ()
Ответ на: комментарий от gremlin_the_red

А вот работающий nvdec-copy

[vd] Container reported FPS: 60.000000
[vd] Codec list:
[vd]     hevc - HEVC (High Efficiency Video Coding)
[vd]     hevc_v4l2m2m (hevc) - V4L2 mem2mem HEVC decoder wrapper
[vd]     hevc_cuvid (hevc) - Nvidia CUVID HEVC decoder
[vd] Opening decoder hevc
[vd] Looking at hwdec hevc-nvdec-copy...
[vd] Trying hardware decoding via hevc-nvdec-copy.
[vd] Selected codec: hevc (HEVC (High Efficiency Video Coding))
fornlr ★★★★★ ()
Ответ на: комментарий от gremlin_the_red

Если ‘полностью’, то так

mpv --hwdec=nvdec --vo=gpu --frames=1 -v IMG_1816.MOV | grep vd
[cplayer] Command line options: '--hwdec=nvdec' '--vo=gpu' '--frames=1' '-v' 'IMG_1816.MOV'
[cplayer] Configuration: ./waf configure --prefix=/usr --libdir=/usr/lib/x86_64-linux-gnu --confdir=/etc/mpv --zshdir=/usr/share/zsh/vendor-completions --enable-cdda --enable-dvdnav --enable-libmpv-shared --enable-libsmbclient --enable-sdl2 --enable-sndio --disable-build-date --enable-dvbin
[cplayer] List of enabled features: 52arch aligned_alloc alsa asm atomics caca cdda cplayer cplugins debug-build drm drmprime dvbin dvdnav egl egl-drm egl-helpers egl-x11 fchmod ffmpeg gbm gbm.h gl gl-wayland gl-x11 glibc-thread-name glob glob-posix gnuc gpl iconv jack jpeg lcms2 libarchive libass libass-osd libav-any libavcodec libavdevice libavutil libbluray libdl libm libmpv-shared librt libsmbclient linux-fstatfs lua memfd_create optimize oss-audio plain-gl posix posix-or-mingw posix-spawn posix-spawn-native pthreads pulse rubberband sdl2 sdl2-audio sdl2-gamepad sdl2-video sndio stdatomic uchardet vaapi vaapi-drm vaapi-egl vaapi-wayland vaapi-x-egl vaapi-x11 vdpau vdpau-gl-x11 vt.h wayland wayland-protocols x11 xv zlib
[cplayer] Setting option 'hwdec' = 'nvdec-copy' (flags = 4)
[cplayer] Setting option 'hwdec' = 'nvdec' (flags = 8)
[ifo_dvdnav] Opening IMG_1816.MOV
[vd] Container reported FPS: 60.000000
[vd] Codec list:
[vd]     hevc - HEVC (High Efficiency Video Coding)
[vd]     hevc_v4l2m2m (hevc) - V4L2 mem2mem HEVC decoder wrapper
[vd]     hevc_cuvid (hevc) - Nvidia CUVID HEVC decoder
[vd] Opening decoder hevc
[vd] Looking at hwdec hevc-nvdec...
[vo/gpu] Loading hwdec driver 'vdpau-gl'
[vd] Could not create device.
[vd] No hardware decoding available for this codec.
[vd] Using software decoding.
[vd] Detected 4 logical cores.
[vd] Requesting 5 threads for decoding.
[vd] Selected codec: hevc (HEVC (High Efficiency Video Coding))
[vd] Using software decoding.
[vd] Decoder format: 3840x2160 [0:1] yuv420p bt.709/bt.709/bt.1886/limited/auto CL=unknown
[statusline] AV: 00:00:00 / 00:00:05 (0%) A-V: -0.000
fornlr ★★★★★ ()
Ответ на: комментарий от anonymous

С -copy это считай не работает.

Ну как не работает, если не тормозит.

NVDEC это и есть cuda

cuda and cuda-copy are an older implementation of hardware decoding on Nvidia GPUs that uses Nvidia’s bitstream parsers rather than FFmpeg’s. This can lead to feature deficiencies, such as incorrect playback of HDR content, and nvdec/nvdec-copy should always be preferred unless you specifically need Nvidia’s deinterlacing algorithms.

fornlr ★★★★★ ()
Последнее исправление: fornlr (всего исправлений: 1)
Ответ на: комментарий от anonymous

Из всего этого ценно только 60p, и то, если они настоящие, а не пиковые.

Из логики работы кодировщиков видео следует, что они-таки пиковые. Так на неподвижном изображении видео бессмысленно кодировать в 60p — достаточно закодировать один полный кадр и длительность по времени, в течение которого его отображать на экране.

iZEN ★★★★★ ()
Ответ на: комментарий от fornlr

Там вообще про другое написано. Начнём с того, что CUDA это api а не какой-то там «older implementation». NVDEC доступен исключительно через cuda. Декодировать кадр с nvdec ты допусти можешь чисто через ffmpeg, но вот чтобы дальше его вывести на экран или что-то другое сделать, тебе придётся дергать api cuda напрямую.

anonymous ()
Ответ на: комментарий от anonymous

NVDEC это и есть cuda, и он без неё не работает по определению.

GPUs contain one or more hardware-based decoder and encoder(s) (separate from the CUDA cores) which provides fully-accelerated hardware-based video decoding and encoding for several popular codecs. With decoding/encoding offloaded, the graphics engine and the CPU are free for other operations.

GPU hardware accelerator engines for video decoding (referred to as NVDEC) and video encoding (referred to as NVENC) support faster than real-time video processing which makes them suitable to be used for transcoding applications, in addition to video playback.

https://developer.nvidia.com/nvidia-video-codec-sdk

iZEN ★★★★★ ()
Ответ на: комментарий от anonymous

NVENC использует только GPU, и его возможности зависят от поколения чипа GPU. Для H.265 GPU поколений Maxwell и Pascal использовать B-frames действительно не умеют. А вот для H.264 - умеет! Но, возможно, только через CUDA. Напомню, что NVENC и CUDA - разные технологии: NVENC - полностью аппаратная на GPU, CUDA - гибридная: GPU (ядра CUDA) + CPU. В презенташках нашёл упоминания, что NVENC API может использовать как NVENC Driver, так и CUDA Driver (уж не знаю в какой мере).

Изучи: https://forum.ixbt.com/topic.cgi?id=29:36214:76#76

iZEN ★★★★★ ()
Ответ на: комментарий от iZEN

Я ещё раз спрашиваю, нафиг ты мне это запостил? FFMPEG при работе nvdec в AVFrame.data[] возвращае хендл куды CUdeviceptr, смекаешь? CUdeviceptr это хендл куды, ты можешь с ним работать толко через куду, смекаешь?

anonymous ()
Ответ на: комментарий от anonymous

Я ещё раз спрашиваю, нафиг ты мне это запостил?

Скорость кодирования NVENC и декодирования NVDEC не зависит от количества ядер CUDA. Это — отдельная технология, реализованная аппаратными средствами в видеоадаптерах NVIDIA. Понятно, что в отсутствие ядер CUDA (на видеокартах AMD, например) данная технология работать не будет, а значит это вендор-специфичная технология.

ffmpeg использует гибридный режим декодирования видео, если специально не пропатчен для использования NVENC/NVDEC/HEVC.

iZEN ★★★★★ ()
Ответ на: комментарий от pekmop1024

Не работает из-за вяленого

В Ubuntu 20.04 по умолчанию иксы. А уж с проприетарным драйвером Nvidia можно сказать, что железно иксы (чтобы Wayland врубить это надо упороться, и если заработает, то будет глюкота)

fornlr ★★★★★ ()
Ответ на: комментарий от iZEN
Ответ на: комментарий от iZEN

MPV и FFMPEG по умолчанию вообще не работают с CUDA/NVENC/NVDEC/HEVC.

Ты вобще полный ноль в вопросе, тебя носом ткнули в код, а ты какие-то статейки для хомячков кидаел, вообще умора.

anonymous ()
Ответ на: комментарий от iZEN

через CUDA API

Только через него NVENC/NVDEC и доступны. Если у тебя есть какие-то возражения - неси ссылочку на апи. Посмотрим на твои дальнейшие манявры.

anonymous ()
Ответ на: комментарий от anonymous

тебя носом ткнули в код

CUDA — это ещё не NVENC/HEVC. Это базисные вычислительные ядра и программный API для доступа к ним, которые помогают NVENC/NVDEC/HEVC обрабатывать видеопоток. Но NVENC/NVDEC/HEVC без специального патчинга mpv/ffmpeg недоступны, поэтому приложения mpv/ffmpeg вынуждены дёргать ядра CUDA через hwdec_cuda.c — в обход прориетарной технологии NVENC/NVDEC/HEVC. Поэтому ускорение видеокодирование/декодирование на Linux в такой жопе.

iZEN ★★★★★ ()
Последнее исправление: iZEN (всего исправлений: 1)
Ответ на: комментарий от iZEN

Ну и? Там всё делается через куду.

программный API для доступа

Шеф, кажется, они начинают понимать!

без специального патчинга

Показывай этот мифически патчинг, я уже второй день жду.

в обход прориетарной технологии NVENC/NVDEC/HEVC

Нет, не в обход, а именно через неё, я выше кидал хедер: https://github.com/FFmpeg/nv-codec-headers/blob/master/include/ffnvcodec/dynlink_cuviddec.h

Этот хедер - тупо копипаста из проприетарного сдк, никаких други апи там нет. Есть возражения? Кидай код.

декодирование на Linux в такой жопе

Пока я вижу только что лоровские эксперты в жопе xD.

anonymous ()
Ответ на: комментарий от iZEN

Из логики работы кодировщиков видео следует, что они-таки пиковые. Так на неподвижном изображении видео бессмысленно кодировать в 60p — достаточно закодировать один полный кадр и длительность по времени, в течение которого его отображать на экране.

Точно так же ничего не мешает 60 раз в секунду выдавать одинаковый кадр

Harald ★★★★★ ()
Ответ на: комментарий от fornlr

Geforce GT 1030, libvdpau-1.3

> vdpauinfo
display: unix:0.0   screen: 0
API version: 1
Information string: NVIDIA VDPAU Driver Shared Library  440.82  Wed Apr  1 19:38:42 UTC 2020

Video surface:

name   width height types
-------------------------------------------
420     8192  8192  NV12 YV12 
422     8192  8192  UYVY YUYV 
444     8192  8192  NV24 YV24 

Decoder capabilities:

name                        level macbs width height
----------------------------------------------------
MPEG1                           0 65536  4096  4096
MPEG2_SIMPLE                    3 65536  4096  4096
MPEG2_MAIN                      3 65536  4096  4096
H264_BASELINE                  51 65536  4096  4096
H264_MAIN                      51 65536  4096  4096
H264_HIGH                      51 65536  4096  4096
VC1_SIMPLE                      1  8190  2048  2048
VC1_MAIN                        2  8190  2048  2048
VC1_ADVANCED                    4  8190  2048  2048
MPEG4_PART2_SP                  3  8192  2048  2048
MPEG4_PART2_ASP                 5  8192  2048  2048
DIVX4_QMOBILE                   0  8192  2048  2048
DIVX4_MOBILE                    0  8192  2048  2048
DIVX4_HOME_THEATER              0  8192  2048  2048
DIVX4_HD_1080P                  0  8192  2048  2048
DIVX5_QMOBILE                   0  8192  2048  2048
DIVX5_MOBILE                    0  8192  2048  2048
DIVX5_HOME_THEATER              0  8192  2048  2048
DIVX5_HD_1080P                  0  8192  2048  2048
H264_CONSTRAINED_BASELINE      51 65536  4096  4096
H264_EXTENDED                  51 65536  4096  4096
H264_PROGRESSIVE_HIGH          51 65536  4096  4096
H264_CONSTRAINED_HIGH          51 65536  4096  4096
H264_HIGH_444_PREDICTIVE       51 65536  4096  4096
VP9_PROFILE_0                   1 262144  8192  8192
VP9_PROFILE_1                  --- not supported ---
VP9_PROFILE_2                  --- not supported ---
VP9_PROFILE_3                  --- not supported ---
HEVC_MAIN                      153 262144  8192  8192
HEVC_MAIN_10                   --- not supported ---
HEVC_MAIN_STILL                --- not supported ---
HEVC_MAIN_12                   --- not supported ---
HEVC_MAIN_444                  --- not supported ---

Output surface:

name              width height nat types
----------------------------------------------------
B8G8R8A8         32768 32768    y  Y8U8V8A8 V8U8Y8A8 A4I4 I4A4 A8I8 I8A8 
R10G10B10A2      32768 32768    y  Y8U8V8A8 V8U8Y8A8 A4I4 I4A4 A8I8 I8A8 

Bitmap surface:

name              width height
------------------------------
B8G8R8A8         32768 32768
R8G8B8A8         32768 32768
R10G10B10A2      32768 32768
B10G10R10A2      32768 32768
A8               32768 32768

Video mixer:

feature name                    sup
------------------------------------
DEINTERLACE_TEMPORAL             y
DEINTERLACE_TEMPORAL_SPATIAL     y
INVERSE_TELECINE                 y
NOISE_REDUCTION                  y
SHARPNESS                        y
LUMA_KEY                         y
HIGH QUALITY SCALING - L1        y
HIGH QUALITY SCALING - L2        -
HIGH QUALITY SCALING - L3        -
HIGH QUALITY SCALING - L4        -
HIGH QUALITY SCALING - L5        -
HIGH QUALITY SCALING - L6        -
HIGH QUALITY SCALING - L7        -
HIGH QUALITY SCALING - L8        -
HIGH QUALITY SCALING - L9        -

parameter name                  sup      min      max
-----------------------------------------------------
VIDEO_SURFACE_WIDTH              y         1     8192
VIDEO_SURFACE_HEIGHT             y         1     8192
CHROMA_TYPE                      y  
LAYERS                           y         0        4

attribute name                  sup      min      max
-----------------------------------------------------
BACKGROUND_COLOR                 y  
CSC_MATRIX                       y  
NOISE_REDUCTION_LEVEL            y      0.00     1.00
SHARPNESS_LEVEL                  y     -1.00     1.00
LUMA_KEY_MIN_LUMA                y  
LUMA_KEY_MAX_LUMA                y
iZEN ★★★★★ ()