[FFmpeg-trac] #10263(undetermined:new): Regression: Huge increase in FFmpeg QSV memory usage + OOMs
FFmpeg
trac at avcodec.org
Wed Mar 15 12:39:11 EET 2023
#10263: Regression: Huge increase in FFmpeg QSV memory usage + OOMs
-------------------------------------+-------------------------------------
Reporter: eero-t | Type: defect
Status: new | Priority: normal
Component: | Version:
undetermined | unspecified
Keywords: | Blocked By:
Blocking: | Reproduced by developer: 0
Analyzed by developer: 0 |
-------------------------------------+-------------------------------------
Summary of the bug:
Between following FFmpeg commits:
* 2023-02-02: 7d49fef8b4 lavc/vaapi_encode: fix propagating durations and
opaques
* 2023-02-03: 9a820ec8b1 ffmpeg: add video heartbeat capability to
fix_sub_duration
Doing H.264 transcoding with downscaling & FPS conversion started to take
enormous amounts of memory, so that FFmpeg gets OOM killed regardless of
how much free memory that host has:
{{{
[11930.611964] oom-
kill:constraint=CONSTRAINT_NONE,nodemask=(null),cpuset=user.slice,mems_allowed=0,global_oom,task_memcg=/user.slice/user-1000.slice/session-c3.scope,task=ffmpeg,pid=19970,uid=1000
[11930.612006] Out of memory: Killed process 19970 (ffmpeg) total-
vm:9158180kB, anon-rss:7277512kB, file-rss:128kB, shmem-rss:0kB, UID:1000
pgtables:17128kB oom_score_adj:0
}}}
Earlier it had worked fine also on machine that had only 8GB RAM, but now
it OOMs on machine with 32GB, after using all that RAM...
How to reproduce:
{{{
% ffmpeg -loglevel verbose -vsync passthrough -fpsprobesize 300
-analyzeduration 500K -hwaccel qsv -hwaccel_output_format qsv -qsv_device
/dev/dri/renderD128 -c:v h264_qsv -i 1280x720p_29.97_10mb_h264_cabac.264
-c:v h264_qsv -b:v 800K -vf scale_qsv=w=352:h=240,fps=15
-compression_level 4 -an -vframes 2400 -y output.h264
ffmpeg version N-110014-ga6e9d01f88 Copyright (c) 2000-2023 the FFmpeg
developers
built with gcc 11 (Ubuntu 11.3.0-1ubuntu1~22.04)
configuration: --prefix=/opt/install/ --enable-libmfx --enable-vaapi
--enable-sdl2 --disable-libx265 --disable-libx264 --disable-libvpx
--enable-libvorbis --enable-libopus --disable-libmp3lame --disable-libass
--disable-sndio --enable-libfreetype --enable-gpl --disable-doc
...
Input #0, h264, from '1280x720p_29.97_10mb_h264_cabac.264':
Duration: N/A, bitrate: N/A
Stream #0:0: Video: h264 (High), 1 reference frame, yuv420p(tv, bt709,
progressive, left), 1280x720 [SAR 1:1 DAR 16:9], 29.97 fps, 29.97 tbr,
1200k tbn
[h264_mp4toannexb @ 0x562553551580] The input looks like it is Annex B
already
Stream mapping:
Stream #0:0 -> #0:0 (h264 (h264_qsv) -> h264 (h264_qsv))
Press [q] to stop, [?] for help
[AVHWDeviceContext @ 0x562553551440] VAAPI driver: Intel iHD driver for
Intel(R) Gen Graphics - 23.1.4 (02d29220e).
[AVHWDeviceContext @ 0x562553551440] Driver not found in known nonstandard
list, using standard behaviour.
[h264_qsv @ 0x562553539500] Decoder: output is video memory surface
[h264_qsv @ 0x562553539500] Use Intel(R) Media SDK to create MFX session,
the required implementation version is 1.35
[AVHWDeviceContext @ 0x5625535bd300] VAAPI driver: Intel iHD driver for
Intel(R) Gen Graphics - 23.1.4 (02d29220e).
[AVHWDeviceContext @ 0x5625535bd300] Driver not found in known nonstandard
list, using standard behaviour.
[h264_qsv @ 0x562553539500] Decoder: output is video memory surface
[h264_qsv @ 0x562553539500] Use Intel(R) Media SDK to create MFX session,
the required implementation version is 1.35
[graph 0 input from stream 0:0 @ 0x5625535fa900] w:1280 h:720 pixfmt:qsv
tb:1/1200000 fr:30000/1001 sar:1/1
[AVHWDeviceContext @ 0x5625535f7f00] VAAPI driver: Intel iHD driver for
Intel(R) Gen Graphics - 23.1.4 (02d29220e).
[AVHWDeviceContext @ 0x5625535f7f00] Driver not found in known nonstandard
list, using standard behaviour.
[Parsed_scale_qsv_0 @ 0x5625535f9980] Use Intel(R) Media SDK to create MFX
session, API version is 1.35, the required implementation version is 1.35
[Parsed_scale_qsv_0 @ 0x5625535f9980] VPP: input is video memory surface
[Parsed_scale_qsv_0 @ 0x5625535f9980] VPP: output is video memory surface
[Parsed_fps_1 @ 0x5625535fa000] fps=15/1
[Parsed_fps_1 @ 0x5625535fa000] Set first pts to 0
[h264_qsv @ 0x562553551dc0] Using input frames context (format qsv) with
h264_qsv encoder.
[h264_qsv @ 0x562553551dc0] Encoder: input is video memory surface
[h264_qsv @ 0x562553551dc0] Use Intel(R) Media SDK to create MFX session,
the required implementation version is 1.35
[h264_qsv @ 0x562553551dc0] Using the variable bitrate (VBR) ratecontrol
method
[h264_qsv @ 0x562553551dc0] MFMode:2
[h264_qsv @ 0x562553551dc0] profile: avc high; level: 20
[h264_qsv @ 0x562553551dc0] GopPicSize: 256; GopRefDist: 3; GopOptFlag:
closed; IdrInterval: 0
[h264_qsv @ 0x562553551dc0] TargetUsage: 4; RateControlMethod: VBR
[h264_qsv @ 0x562553551dc0] BufferSizeInKB: 300; InitialDelayInKB: 150;
TargetKbps: 800; MaxKbps: 1200; BRCParamMultiplier: 1
[h264_qsv @ 0x562553551dc0] NumSlice: 1; NumRefFrame: 2
[h264_qsv @ 0x562553551dc0] RateDistortionOpt: OFF
[h264_qsv @ 0x562553551dc0] RecoveryPointSEI: OFF
[h264_qsv @ 0x562553551dc0] VDENC: OFF
[h264_qsv @ 0x562553551dc0] Entropy coding: CABAC; MaxDecFrameBuffering: 2
[h264_qsv @ 0x562553551dc0] NalHrdConformance: ON; SingleSeiNalUnit: ON;
VuiVclHrdParameters: OFF VuiNalHrdParameters: ON
[h264_qsv @ 0x562553551dc0] FrameRateExtD: 1; FrameRateExtN: 15
[h264_qsv @ 0x562553551dc0] IntRefType: 0; IntRefCycleSize: 0;
IntRefQPDelta: 0
[h264_qsv @ 0x562553551dc0] MaxFrameSize: 67584; MaxSliceSize: 0
[h264_qsv @ 0x562553551dc0] BitrateLimit: ON; MBBRC: OFF; ExtBRC: OFF
[h264_qsv @ 0x562553551dc0] Trellis: auto
[h264_qsv @ 0x562553551dc0] RepeatPPS: OFF; NumMbPerSlice: 0; LookAheadDS:
2x
[h264_qsv @ 0x562553551dc0] AdaptiveI: OFF; AdaptiveB: OFF; BRefType:off
[h264_qsv @ 0x562553551dc0] MinQPI: 0; MaxQPI: 0; MinQPP: 0; MaxQPP: 0;
MinQPB: 0; MaxQPB: 0
[h264_qsv @ 0x562553551dc0] DisableDeblockingIdc: 0
[h264_qsv @ 0x562553551dc0] SkipFrame: no_skip
[h264_qsv @ 0x562553551dc0] PRefType: default
[h264_qsv @ 0x562553551dc0] TransformSkip: unknown
[h264_qsv @ 0x562553551dc0] IntRefCycleDist: 0
[h264_qsv @ 0x562553551dc0] LowDelayBRC: OFF
[h264_qsv @ 0x562553551dc0] MaxFrameSizeI: 0; MaxFrameSizeP: 0
[h264_qsv @ 0x562553551dc0] ScenarioInfo: 0
Output #0, h264, to 'output/0030_HD22_1.0.h264':
Metadata:
encoder : Lavf60.4.100
Stream #0:0: Video: h264, 1 reference frame, qsv(progressive), 352x240
(0x0) [SAR 1:1 DAR 22:15], q=2-31, 800 kb/s, 15 fps, 15 tbn
Metadata:
encoder : Lavc60.6.101 h264_qsv
Side data:
cpb: bitrate max/min/avg: 0/0/800000 buffer size: 0 vbv_delay: N/A
frame= 0 fps=0.0 q=0.0 size= 0kB time=-577014:32:22.77 bitrate=
-0.0kbits/s speed=N/A
frame= 361 fps=0.0 q=20.0 size= 2048kB time=00:00:24.00 bitrate=
699.1kbits/s speed=46.8x
frame= 689 fps=680 q=23.0 size= 4352kB time=00:00:45.86 bitrate=
777.3kbits/s speed=45.3x
frame= 1037 fps=685 q=23.0 size= 6656kB time=00:01:09.06 bitrate=
789.5kbits/s speed=45.6x
frame= 1396 fps=693 q=26.0 size= 8960kB time=00:01:33.00 bitrate=
789.3kbits/s speed=46.2x
frame= 1745 fps=694 q=20.0 size= 11008kB time=00:01:56.26 bitrate=
775.6kbits/s speed=46.2x
[in#0/h264 @ 0x562553530d40] EOF while reading input
[in#0/h264 @ 0x562553530d40] Terminating demuxer thread
[h264_qsv @ 0x562553539500] A decode call did not consume any data: expect
more data at input (-10)
Last message repeated 2 times
[out_0_0 @ 0x5625535fb540] 100 buffers queued in out_0_0, something may be
wrong.
[out_0_0 @ 0x5625535fb540] 1000 buffers queued in out_0_0, something may
be wrong.
[out_0_0 @ 0x5625535fb540] 10000 buffers queued in out_0_0, something may
be wrong.
[out_0_0 @ 0x5625535fb540] 100000 buffers queued in out_0_0, something may
be wrong.
[out_0_0 @ 0x5625535fb540] 1000000 buffers queued in out_0_0, something
may be wrong.
[out_0_0 @ 0x5625535fb540] 10000000 buffers queued in out_0_0, something
may be wrong.
}}}
(Errors at the end of output are probably due to its memory allocations
getting denied before it is OOM-killed.)
It is FFmpeg bug, because doing same with MSDK tool works fine:
{{{
sample_multi_transcode -i::h264 input/1280x720p_29.97_10mb_h264_cabac.264
-o::h264 output/0030_HD22_1.0.h264 -b 800 -u 4 -n 2400 -f 15 -w 352 -h 240
-FRC::PT -async 4 -hw
}}}
I'm not seeing this with FFpeg VA-API, or other FFmpeg tests I'm running,
so it's most likely related to using QSV to do both downscaling and FPS
conversion.
--
Ticket URL: <https://trac.ffmpeg.org/ticket/10263>
FFmpeg <https://ffmpeg.org>
FFmpeg issue tracker
More information about the FFmpeg-trac
mailing list