ffmpeg is oom-killed when converting an image to AVIF
Dear FFmpeg users, I've encountered OOM "issue" when encoding PNG image to AVIF using ffmpeg. I have an example of successful conversion for the image about 6000x1800x32, but a bit larger image 7147×1783×32 causes OOM. Any idea why image raster of 7147×1783×4 ~ 50 MB requires ~ 3 GB of memory (which is at least ×50 more memory than raster)? And how to workaround the issue? Many thanks in advance! $ ffmpeg -i test.png -c:v libaom-av1 -crf 30 test.avif ffmpeg version 5.1.3-1 Copyright (c) 2000-2022 the FFmpeg developers built with gcc 12 (Debian 12.2.0-14) configuration: --prefix=/usr --extra-version=1 --toolchain=hardened --libdir=/usr/lib/x86_64-linux-gnu --incdir=/usr/include/x86_64-linux-gnu --arch=amd64 --enable-gpl --disable-stripping --enable-gnutls --enable-ladspa --enable-libaom --enable-libass --enable-libbluray --enable-libbs2b --enable-libcaca --enable-libcdio --enable-libcodec2 --enable-libdav1d --enable-libflite --enable-libfontconfig --enable-libfreetype --enable-libfribidi --enable-libglslang --enable-libgme --enable-libgsm --enable-libjack --enable-libmp3lame --enable-libmysofa --enable-libopenjpeg --enable-libopenmpt --enable-libopus --enable-libpulse --enable-librabbitmq --enable-librist --enable-librubberband --enable-libshine --enable-libsnappy --enable-libsoxr --enable-libspeex --enable-libsrt --enable-libssh --enable-libsvtav1 --enable-libtheora --enable-libtwolame --enable-libvidstab --enable-libvorbis --enable-libvpx --enable-libwebp --enable-libx265 --enable-libxml2 --enable-libxvid --enable-libzimg --enable-libzmq --enable-libzvbi --enable-lv2 --enable-omx --enable-openal --enable-opencl --enable-opengl --enable-sdl2 --disable-sndio --enable-libjxl --enable-pocketsphinx --enable-librsvg --enable-libmfx --enable-libdc1394 --enable-libdrm --enable-libiec61883 --enable-chromaprint --enable-frei0r --enable-libx264 --enable-libplacebo --enable-librav1e --enable-shared Input #0, png_pipe, from 'test.png': Duration: N/A, bitrate: N/A Stream #0:0: Video: png, rgba(pc), 7147x1783 [SAR 2835:2835 DAR 7147:1783], 25 fps, 25 tbr, 25 tbn Stream mapping: Stream #0:0 -> #0:0 (png (native) -> av1 (libaom-av1)) Press [q] to stop, [?] for help [libaom-av1 @ 0x55b79026db40] v3.6.0 Output #0, avif, to 'test.avif': Metadata: encoder : Lavf59.27.100 Stream #0:0: Video: av1 (av01 / 0x31307661), gbrp(pc, gbr/unknown/unknown, progressive), 7147x1783 [SAR 1:1 DAR 7147:1783], q=2-31, 25 fps, 12800 tbn (default) Metadata: encoder : Lavc59.37.100 libaom-av1 Side data: cpb: bitrate max/min/avg: 0/0/0 buffer size: 0 vbv_delay: N/A Killed 1 fps=0.6 q=0.0 size= 0kB time=00:00:00.00 bitrate=N/A speed= 0x # free -t total used free shared buff/cache available Mem: 8017020 4833284 1275188 119672 2330812 3183736 Swap: 102396 102396 0 Total: 8119416 4935680 1275188
From /var/log/kernel.log
kernel: ffmpeg invoked oom-killer: gfp_mask=0x140dca(GFP_HIGHUSER_MOVABLE|__GFP_COMP|__GFP_ZERO), order=0, oom_score_adj=0 kernel: CPU: 0 PID: 466425 Comm: ffmpeg Not tainted 6.1.0-10-amd64 #1 Debian 6.1.38-1 kernel: Call Trace: kernel: <TASK> kernel: dump_stack_lvl+0x44/0x5c kernel: dump_header+0x4a/0x211 kernel: oom_kill_process.cold+0xb/0x10 kernel: out_of_memory+0x1fd/0x4c0 kernel: __alloc_pages_slowpath.constprop.0+0xc73/0xdc0 kernel: __alloc_pages+0x305/0x330 kernel: __folio_alloc+0x17/0x50 kernel: ? policy_node+0x51/0x70 kernel: vma_alloc_folio+0x9c/0x370 kernel: __handle_mm_fault+0x92f/0xfa0 kernel: handle_mm_fault+0xdb/0x2d0 kernel: do_user_addr_fault+0x19c/0x570 kernel: exc_page_fault+0x70/0x170 kernel: asm_exc_page_fault+0x22/0x30 kernel: RIP: 0033:0x7f3cf8f7204a ... kernel: Mem-Info: kernel: active_anon:153032 inactive_anon:1662278 isolated_anon:0 kernel: active_file:382 inactive_file:2194 isolated_file:98 kernel: unevictable:11644 dirty:356 writeback:0 kernel: slab_reclaimable:48560 slab_unreclaimable:43800 kernel: mapped:9888 shmem:25129 pagetables:11368 kernel: sec_pagetables:0 bounce:0 kernel: kernel_misc_reclaimable:0 kernel: free:24673 free_pcp:174 free_cma:0 kernel: 28496 total pagecache pages kernel: 332 pages in swap cache kernel: Free swap = 0kB kernel: Total swap = 102396kB kernel: 2068610 pages RAM kernel: 0 pages HighMem/MovableOnly kernel: 64355 pages reserved kernel: 0 pages hwpoisoned kernel: Tasks state (memory values in pages): kernel: [ pid ] uid tgid total_vm rss pgtables_bytes swapents oom_score_adj name kernel: [ 466425] 1000 466425 1093593 808340 7086080 0 0 ffmpeg ... kernel: oom-kill:constraint=CONSTRAINT_NONE,nodemask=(null),cpuset=user.slice,mems_allowed=0,global_oom,task_memcg=/user.slice/user-1000.slice/session-c1.scope,task=ffmpeg,pid=466425,uid=1000 kernel: Out of memory: Killed process 466425 (ffmpeg) total-vm:4374372kB, anon-rss:3233360kB, file-rss:0kB, shmem-rss:0kB, UID:1000 pgtables:6920kB oom_score_adj:0 -- With best regards, Dmitry
Dear community, Re-posting the issue concerning too extensive memory usage by ffmpeg when converting the image to AV1. Any ideas how to overcome the issue (except of plugging more memory)? Thanks in advance! On 2023-09-27 23:03, Dmitry Katsubo wrote:
Dear FFmpeg users,
I've encountered OOM "issue" when encoding PNG image to AVIF using ffmpeg. I have an example of successful conversion for the image about 6000x1800x32, but a bit larger image 7147×1783×32 causes OOM.
Any idea why image raster of 7147×1783×4 ~ 50 MB requires ~ 3 GB of memory (which is at least ×50 more memory than raster)? And how to workaround the issue?
Many thanks in advance!
$ ffmpeg -i test.png -c:v libaom-av1 -crf 30 test.avif ffmpeg version 5.1.3-1 Copyright (c) 2000-2022 the FFmpeg developers built with gcc 12 (Debian 12.2.0-14) configuration: --prefix=/usr --extra-version=1 --toolchain=hardened --libdir=/usr/lib/x86_64-linux-gnu --incdir=/usr/include/x86_64-linux-gnu --arch=amd64 --enable-gpl --disable-stripping --enable-gnutls --enable-ladspa --enable-libaom --enable-libass --enable-libbluray --enable-libbs2b --enable-libcaca --enable-libcdio --enable-libcodec2 --enable-libdav1d --enable-libflite --enable-libfontconfig --enable-libfreetype --enable-libfribidi --enable-libglslang --enable-libgme --enable-libgsm --enable-libjack --enable-libmp3lame --enable-libmysofa --enable-libopenjpeg --enable-libopenmpt --enable-libopus --enable-libpulse --enable-librabbitmq --enable-librist --enable-librubberband --enable-libshine --enable-libsnappy --enable-libsoxr --enable-libspeex --enable-libsrt --enable-libssh --enable-libsvtav1 --enable-libtheora --enable-libtwolame --enable-libvidstab --enable-libvorbis --enable-libvpx --enable-libwebp --enable-libx265 --enable-libxml2 --enable-libxvid --enable-libzimg --enable-libzmq --enable-libzvbi --enable-lv2 --enable-omx --enable-openal --enable-opencl --enable-opengl --enable-sdl2 --disable-sndio --enable-libjxl --enable-pocketsphinx --enable-librsvg --enable-libmfx --enable-libdc1394 --enable-libdrm --enable-libiec61883 --enable-chromaprint --enable-frei0r --enable-libx264 --enable-libplacebo --enable-librav1e --enable-shared Input #0, png_pipe, from 'test.png': Duration: N/A, bitrate: N/A Stream #0:0: Video: png, rgba(pc), 7147x1783 [SAR 2835:2835 DAR 7147:1783], 25 fps, 25 tbr, 25 tbn Stream mapping: Stream #0:0 -> #0:0 (png (native) -> av1 (libaom-av1)) Press [q] to stop, [?] for help [libaom-av1 @ 0x55b79026db40] v3.6.0 Output #0, avif, to 'test.avif': Metadata: encoder : Lavf59.27.100 Stream #0:0: Video: av1 (av01 / 0x31307661), gbrp(pc, gbr/unknown/unknown, progressive), 7147x1783 [SAR 1:1 DAR 7147:1783], q=2-31, 25 fps, 12800 tbn (default) Metadata: encoder : Lavc59.37.100 libaom-av1 Side data: cpb: bitrate max/min/avg: 0/0/0 buffer size: 0 vbv_delay: N/A Killed 1 fps=0.6 q=0.0 size= 0kB time=00:00:00.00 bitrate=N/A speed= 0x
# free -t total used free shared buff/cache available Mem: 8017020 4833284 1275188 119672 2330812 3183736 Swap: 102396 102396 0 Total: 8119416 4935680 1275188
From /var/log/kernel.log
kernel: ffmpeg invoked oom-killer: gfp_mask=0x140dca(GFP_HIGHUSER_MOVABLE|__GFP_COMP|__GFP_ZERO), order=0, oom_score_adj=0 kernel: CPU: 0 PID: 466425 Comm: ffmpeg Not tainted 6.1.0-10-amd64 #1 Debian 6.1.38-1 kernel: Call Trace: kernel: <TASK> kernel: dump_stack_lvl+0x44/0x5c kernel: dump_header+0x4a/0x211 kernel: oom_kill_process.cold+0xb/0x10 kernel: out_of_memory+0x1fd/0x4c0 kernel: __alloc_pages_slowpath.constprop.0+0xc73/0xdc0 kernel: __alloc_pages+0x305/0x330 kernel: __folio_alloc+0x17/0x50 kernel: ? policy_node+0x51/0x70 kernel: vma_alloc_folio+0x9c/0x370 kernel: __handle_mm_fault+0x92f/0xfa0 kernel: handle_mm_fault+0xdb/0x2d0 kernel: do_user_addr_fault+0x19c/0x570 kernel: exc_page_fault+0x70/0x170 kernel: asm_exc_page_fault+0x22/0x30 kernel: RIP: 0033:0x7f3cf8f7204a ... kernel: Mem-Info: kernel: active_anon:153032 inactive_anon:1662278 isolated_anon:0 kernel: active_file:382 inactive_file:2194 isolated_file:98 kernel: unevictable:11644 dirty:356 writeback:0 kernel: slab_reclaimable:48560 slab_unreclaimable:43800 kernel: mapped:9888 shmem:25129 pagetables:11368 kernel: sec_pagetables:0 bounce:0 kernel: kernel_misc_reclaimable:0 kernel: free:24673 free_pcp:174 free_cma:0 kernel: 28496 total pagecache pages kernel: 332 pages in swap cache kernel: Free swap = 0kB kernel: Total swap = 102396kB kernel: 2068610 pages RAM kernel: 0 pages HighMem/MovableOnly kernel: 64355 pages reserved kernel: 0 pages hwpoisoned kernel: Tasks state (memory values in pages): kernel: [ pid ] uid tgid total_vm rss pgtables_bytes swapents oom_score_adj name kernel: [ 466425] 1000 466425 1093593 808340 7086080 0 0 ffmpeg ... kernel: oom-kill:constraint=CONSTRAINT_NONE,nodemask=(null),cpuset=user.slice,mems_allowed=0,global_oom,task_memcg=/user.slice/user-1000.slice/session-c1.scope,task=ffmpeg,pid=466425,uid=1000 kernel: Out of memory: Killed process 466425 (ffmpeg) total-vm:4374372kB, anon-rss:3233360kB, file-rss:0kB, shmem-rss:0kB, UID:1000 pgtables:6920kB oom_score_adj:0
-- With best regards, Dmitry
On 06-10-2023 02:28, Dmitry Katsubo via ffmpeg-user wrote:
Dear community,
Re-posting the issue concerning too extensive memory usage by ffmpeg when converting the image to AV1. Any ideas how to overcome the issue (except of plugging more memory)? Does the issue also arise when using aomenc directly? If so, file a bug with https://github.com/AOMediaCodec/libavif/issues
I have had a similar issue in the past with libsvtav1, wasn't ffmpeg's fault but a bug in the ecoder library, which was fixed thanks to my bug report.
Thanks in advance!
On 2023-09-27 23:03, Dmitry Katsubo wrote:
Dear FFmpeg users,
I've encountered OOM "issue" when encoding PNG image to AVIF using ffmpeg. I have an example of successful conversion for the image about 6000x1800x32, but a bit larger image 7147×1783×32 causes OOM.
Any idea why image raster of 7147×1783×4 ~ 50 MB requires ~ 3 GB of memory (which is at least ×50 more memory than raster)? And how to workaround the issue?
Many thanks in advance!
$ ffmpeg -i test.png -c:v libaom-av1 -crf 30 test.avif ffmpeg version 5.1.3-1 Copyright (c) 2000-2022 the FFmpeg developers built with gcc 12 (Debian 12.2.0-14) configuration: --prefix=/usr --extra-version=1 --toolchain=hardened --libdir=/usr/lib/x86_64-linux-gnu --incdir=/usr/include/x86_64-linux-gnu --arch=amd64 --enable-gpl --disable-stripping --enable-gnutls --enable-ladspa --enable-libaom --enable-libass --enable-libbluray --enable-libbs2b --enable-libcaca --enable-libcdio --enable-libcodec2 --enable-libdav1d --enable-libflite --enable-libfontconfig --enable-libfreetype --enable-libfribidi --enable-libglslang --enable-libgme --enable-libgsm --enable-libjack --enable-libmp3lame --enable-libmysofa --enable-libopenjpeg --enable-libopenmpt --enable-libopus --enable-libpulse --enable-librabbitmq --enable-librist --enable-librubberband --enable-libshine --enable-libsnappy --enable-libsoxr --enable-libspeex --enable-libsrt --enable-libssh --enable-libsvtav1 --enable-libtheora --enable-libtwolame --enable-libvidstab --enable-libvorbis --enable-libvpx --enable-libwebp --enable-libx265 --enable-libxml2 --enable-libxvid --enable-libzimg --enable-libzmq --enable-libzvbi --enable-lv2 --enable-omx --enable-openal --enable-opencl --enable-opengl --enable-sdl2 --disable-sndio --enable-libjxl --enable-pocketsphinx --enable-librsvg --enable-libmfx --enable-libdc1394 --enable-libdrm --enable-libiec61883 --enable-chromaprint --enable-frei0r --enable-libx264 --enable-libplacebo --enable-librav1e --enable-shared Input #0, png_pipe, from 'test.png': Duration: N/A, bitrate: N/A Stream #0:0: Video: png, rgba(pc), 7147x1783 [SAR 2835:2835 DAR 7147:1783], 25 fps, 25 tbr, 25 tbn Stream mapping: Stream #0:0 -> #0:0 (png (native) -> av1 (libaom-av1)) Press [q] to stop, [?] for help [libaom-av1 @ 0x55b79026db40] v3.6.0 Output #0, avif, to 'test.avif': Metadata: encoder : Lavf59.27.100 Stream #0:0: Video: av1 (av01 / 0x31307661), gbrp(pc, gbr/unknown/unknown, progressive), 7147x1783 [SAR 1:1 DAR 7147:1783], q=2-31, 25 fps, 12800 tbn (default) Metadata: encoder : Lavc59.37.100 libaom-av1 Side data: cpb: bitrate max/min/avg: 0/0/0 buffer size: 0 vbv_delay: N/A Killed 1 fps=0.6 q=0.0 size= 0kB time=00:00:00.00 bitrate=N/A speed= 0x
# free -t total used free shared buff/cache available Mem: 8017020 4833284 1275188 119672 2330812 3183736 Swap: 102396 102396 0 Total: 8119416 4935680 1275188
From /var/log/kernel.log
kernel: ffmpeg invoked oom-killer: gfp_mask=0x140dca(GFP_HIGHUSER_MOVABLE|__GFP_COMP|__GFP_ZERO), order=0, oom_score_adj=0 kernel: CPU: 0 PID: 466425 Comm: ffmpeg Not tainted 6.1.0-10-amd64 #1 Debian 6.1.38-1 kernel: Call Trace: kernel: <TASK> kernel: dump_stack_lvl+0x44/0x5c kernel: dump_header+0x4a/0x211 kernel: oom_kill_process.cold+0xb/0x10 kernel: out_of_memory+0x1fd/0x4c0 kernel: __alloc_pages_slowpath.constprop.0+0xc73/0xdc0 kernel: __alloc_pages+0x305/0x330 kernel: __folio_alloc+0x17/0x50 kernel: ? policy_node+0x51/0x70 kernel: vma_alloc_folio+0x9c/0x370 kernel: __handle_mm_fault+0x92f/0xfa0 kernel: handle_mm_fault+0xdb/0x2d0 kernel: do_user_addr_fault+0x19c/0x570 kernel: exc_page_fault+0x70/0x170 kernel: asm_exc_page_fault+0x22/0x30 kernel: RIP: 0033:0x7f3cf8f7204a ... kernel: Mem-Info: kernel: active_anon:153032 inactive_anon:1662278 isolated_anon:0 kernel: active_file:382 inactive_file:2194 isolated_file:98 kernel: unevictable:11644 dirty:356 writeback:0 kernel: slab_reclaimable:48560 slab_unreclaimable:43800 kernel: mapped:9888 shmem:25129 pagetables:11368 kernel: sec_pagetables:0 bounce:0 kernel: kernel_misc_reclaimable:0 kernel: free:24673 free_pcp:174 free_cma:0 kernel: 28496 total pagecache pages kernel: 332 pages in swap cache kernel: Free swap = 0kB kernel: Total swap = 102396kB kernel: 2068610 pages RAM kernel: 0 pages HighMem/MovableOnly kernel: 64355 pages reserved kernel: 0 pages hwpoisoned kernel: Tasks state (memory values in pages): kernel: [ pid ] uid tgid total_vm rss pgtables_bytes swapents oom_score_adj name kernel: [ 466425] 1000 466425 1093593 808340 7086080 0 0 ffmpeg ... kernel: oom-kill:constraint=CONSTRAINT_NONE,nodemask=(null),cpuset=user.slice,mems_allowed=0,global_oom,task_memcg=/user.slice/user-1000.slice/session-c1.scope,task=ffmpeg,pid=466425,uid=1000 kernel: Out of memory: Killed process 466425 (ffmpeg) total-vm:4374372kB, anon-rss:3233360kB, file-rss:0kB, shmem-rss:0kB, UID:1000 pgtables:6920kB oom_score_adj:0
participants (2)
-
Dmitry Katsubo -
Ferdi Scholten