mpv-player / mpv

🎥 Command line video player
https://mpv.io
Other
26.69k stars 2.83k forks source link

switch to sw_dec from vaapi_dec when use --loop #14306

Closed dudangman closed 3 weeks ago

dudangman commented 3 weeks ago

mpv Information

mpv 0.32.0 Copyright © 2000-2020 mpv/MPlayer/mplayer2 projects
 built on UNKNOWN
ffmpeg library versions:
   libavutil       56.31.100
   libavcodec      58.54.100
   libavformat     58.29.100
   libswscale      5.5.100
   libavfilter     7.57.100
   libswresample   3.5.100
ffmpeg version: 4.2.4-1ubuntu0.1

Other Information

Reproduction Steps

use below command: mpv --hwdec=vaapi ~/Videos/dji_10s.mp4 --loop meets an exception: low available varm causes switch to sw_dec when 2nd loop begin. I debug intel media-driver and found the root-cause: when 1st loop stop, first vaCreateSurfaces for the 2nd loop, then vaDestroySurfaces for the 1nd loop. But vaCreateSurfaces for the 2nd loop may fail due to low avail vram. I record the logs for CreateSurfaces+DestroySurfaces as follow:

++++vaCreateSurfaces. (1280x720) num=1, sur_id=0
++++vaCreateSurfaces. (1280x720) num=1, sur_id=1
++++vaCreateSurfaces. (1280x720) num=1, sur_id=2
++++vaCreateSurfaces. (1280x720) num=1, sur_id=3
++++vaCreateSurfaces. (1280x720) num=1, sur_id=4
++++vaCreateSurfaces. (1280x720) num=1, sur_id=5
++++vaCreateSurfaces. (1280x720) num=1, sur_id=6
++++vaCreateSurfaces. (1280x720) num=1, sur_id=7
++++vaCreateSurfaces. (1280x720) num=1, sur_id=8
++++vaCreateSurfaces. (1280x720) num=1, sur_id=9
++++vaCreateSurfaces. (1280x720) num=1, sur_id=10
++++vaCreateSurfaces. (1280x720) num=1, sur_id=11
++++vaCreateSurfaces. (1280x720) num=1, sur_id=12
++++vaCreateSurfaces. (1280x720) num=1, sur_id=13
++++vaCreateSurfaces. (1280x720) num=1, sur_id=14
++++vaCreateSurfaces. (1280x720) num=1, sur_id=15
++++vaCreateSurfaces. (1280x720) num=1, sur_id=16
++++vaCreateSurfaces. (1280x720) num=1, sur_id=17
++++vaCreateSurfaces. (1280x720) num=1, sur_id=18
++++vaCreateSurfaces. (1280x720) num=1, sur_id=19
++++vaCreateSurfaces. (1280x720) num=1, sur_id=20
++++vaCreateSurfaces. (1280x720) num=1, sur_id=21
Using hardware decoding (vaapi).
VO: [gpu] 1280x720 vaapi[nv12]
V: 00:00:09 / 00:00:09 (99%)
Invalid video timestamp: 9.916633 -> 9.883266
++++vaCreateSurfaces. (1280x720) num=1, sur_id=22
++++vaCreateSurfaces. (1280x720) num=1, sur_id=23
++++vaCreateSurfaces. (1280x720) num=1, sur_id=24
++++vaCreateSurfaces. (1280x720) num=1, sur_id=25
++++vaCreateSurfaces. (1280x720) num=1, sur_id=26
++++vaCreateSurfaces. (1280x720) num=1, sur_id=27
++++vaCreateSurfaces. (1280x720) num=1, sur_id=28
++++vaCreateSurfaces. (1280x720) num=1, sur_id=29
++++vaCreateSurfaces. (1280x720) num=1, sur_id=30
++++vaCreateSurfaces. (1280x720) num=1, sur_id=31
++++vaCreateSurfaces. (1280x720) num=1, sur_id=32
++++vaCreateSurfaces. (1280x720) num=1, sur_id=33
++++vaCreateSurfaces. (1280x720) num=1, sur_id=34
++++vaCreateSurfaces. (1280x720) num=1, sur_id=35
++++vaCreateSurfaces. (1280x720) num=1, sur_id=36
++++vaCreateSurfaces. (1280x720) num=1, sur_id=37
++++vaCreateSurfaces. (1280x720) num=1, sur_id=38
++++vaCreateSurfaces. (1280x720) num=1, sur_id=39
++++vaCreateSurfaces. (1280x720) num=1, sur_id=40
++++vaCreateSurfaces. (1280x720) num=1, sur_id=41
++++vaCreateSurfaces. (1280x720) num=1, sur_id=42
++++vaCreateSurfaces. (1280x720) num=1, sur_id=43
----vaDestroySurfaces. num=1, sur_id=15
----vaDestroySurfaces. num=1, sur_id=17
----vaDestroySurfaces. num=1, sur_id=16
----vaDestroySurfaces. num=1, sur_id=21
----vaDestroySurfaces. num=1, sur_id=20
----vaDestroySurfaces. num=1, sur_id=18
----vaDestroySurfaces. num=1, sur_id=19
----vaDestroySurfaces. num=1, sur_id=14
----vaDestroySurfaces. num=1, sur_id=13
----vaDestroySurfaces. num=1, sur_id=12
----vaDestroySurfaces. num=1, sur_id=11
----vaDestroySurfaces. num=1, sur_id=10
----vaDestroySurfaces. num=1, sur_id=9
----vaDestroySurfaces. num=1, sur_id=8
----vaDestroySurfaces. num=1, sur_id=7
----vaDestroySurfaces. num=1, sur_id=6
----vaDestroySurfaces. num=1, sur_id=5
----vaDestroySurfaces. num=1, sur_id=4
----vaDestroySurfaces. num=1, sur_id=3
----vaDestroySurfaces. num=1, sur_id=2
----vaDestroySurfaces. num=1, sur_id=1
----vaDestroySurfaces. num=1, sur_id=0
V: 00:00:02 / 00:00:09 (21%)

Can reuse the VASurfaces? or Destroy-Create sequence? I found when in_file is h265, it's ok and use reuse behavior. when h264, it's Create-Destroy.

Expected Behavior

not switch to sw_dec when 2nd loop start.

Actual Behavior

low available vram, CreateSurface fail cause switch decoder.

Log File

[Uploading output_loop.txt…]()

Sample Files

No response

I carefully read all instruction and confirm that I did the following:

llyyr commented 3 weeks ago

mpv 0.32.0

Please update mpv, we only provide support for the latest tagged version or newer