[FFmpeg-trac] #10876(avfilter:new): scale_vulkan filter does not accept an output format different than yuv420p
FFmpeg
trac at avcodec.org
Tue Feb 20 22:01:14 EET 2024
#10876: scale_vulkan filter does not accept an output format different than yuv420p
----------------------------------+--------------------------------------
Reporter: bermond | Type: defect
Status: new | Priority: normal
Component: avfilter | Version: git-master
Keywords: vulkan | Blocked By:
Blocking: | Reproduced by developer: 0
Analyzed by developer: 0 |
----------------------------------+--------------------------------------
The `scale_vulkan` filter does not accept an output pixel format different
than `yuv420p` in the `format` **option**.
For example, when trying to use `nv12` in the `format` option, it fails
with an error message of `Unsupported input format for conversion`:
{{{
$ ffmpeg \
-init_hw_device vulkan=hw:0 -filter_hw_device hw \
-f lavfi -i 'color=color=White:size=1280x720' \
-vf
'hwupload,scale_vulkan=w=640:h=480:format=nv12,hwdownload,format=nv12,format=yuv420p'
\
-c:v libx264 -preset:v ultrafast -movflags '+faststart' -t 40 -y test-
out.mp4
ffmpeg version N-113734-gcffadfe99a Copyright (c) 2000-2024 the FFmpeg
developers
built with gcc 13.2.1 (GCC) 20230801
configuration: --prefix=/usr --extra-cflags=-I/opt/cuda/include --extra-
ldflags=-L/opt/cuda/lib64 --enable-lto --disable-rpath --enable-gpl
--enable-version3 --enable-nonfree --enable-shared --disable-static
--disable-stripping --disable-htmlpages --enable-gray --enable-alsa
--enable-avisynth --enable-bzlib --enable-chromaprint --enable-frei0r
--enable-gcrypt --enable-gmp --enable-gnutls --enable-iconv --enable-
ladspa --enable-lcms2 --enable-libaom --enable-libaribb24 --enable-
libaribcaption --enable-libass --enable-libbluray --enable-libbs2b
--enable-libcaca --enable-libcelt --enable-libcdio --enable-libcodec2
--enable-libdav1d --enable-libdavs2 --enable-libdc1394 --enable-libfdk-aac
--enable-libflite --enable-libfontconfig --enable-libfreetype --enable-
libfribidi --enable-libharfbuzz --enable-libglslang --enable-libgme
--enable-libgsm --enable-libiec61883 --enable-libilbc --enable-libjack
--enable-libjxl --enable-libklvanc --enable-libkvazaar --enable-liblensfun
--enable-libmodplug --enable-libmp3lame --enable-libopencore-amrnb
--enable-libopencore-amrwb --enable-libopencv --enable-libopenh264
--enable-libopenjpeg --enable-libopenmpt --enable-libopenvino --enable-
libopus --enable-libplacebo --enable-libpulse --enable-libqrencode
--enable-librabbitmq --enable-librav1e --enable-librist --enable-librsvg
--enable-librubberband --enable-librtmp --disable-libshaderc --enable-
libshine --enable-libsmbclient --enable-libsnappy --enable-libsoxr
--enable-libspeex --enable-libsrt --enable-libssh --enable-libsvtav1
--enable-libsvthevc --enable-libsvtvp9 --disable-libtensorflow --enable-
libtesseract --enable-libtheora --disable-libtls --enable-libtwolame
--enable-libuavs3d --enable-libv4l2 --enable-libvidstab --enable-libvmaf
--enable-libvo-amrwbenc --enable-libvorbis --enable-libvpx --enable-
libwebp --enable-libx264 --enable-libx265 --enable-libxevd --enable-
libxeve --enable-libxavs --enable-libxavs2 --enable-libxcb --enable-
libxcb-shm --enable-libxcb-xfixes --enable-libxcb-shape --enable-libxvid
--enable-libxml2 --enable-libzimg --enable-libzmq --enable-libzvbi
--enable-lv2 --enable-lzma --enable-decklink --disable-mbedtls --enable-
libmysofa --enable-openal --enable-opencl --enable-opengl --disable-
openssl --disable-pocketsphinx --enable-sndio --enable-sdl2 --enable-
vapoursynth --enable-vulkan --enable-xlib --enable-zlib --enable-amf
--enable-cuda-nvcc --enable-cuda-llvm --enable-cuvid --enable-ffnvcodec
--enable-libdrm --enable-libvpl --enable-libnpp --enable-nvdec --enable-
nvenc --enable-omx --enable-rkmpp --enable-v4l2-m2m --enable-vaapi
--enable-vdpau
libavutil 58. 39.100 / 58. 39.100
libavcodec 60. 39.101 / 60. 39.101
libavformat 60. 21.101 / 60. 21.101
libavdevice 60. 4.100 / 60. 4.100
libavfilter 9. 17.100 / 9. 17.100
libswscale 7. 6.100 / 7. 6.100
libswresample 4. 13.100 / 4. 13.100
libpostproc 57. 4.100 / 57. 4.100
Input #0, lavfi, from 'color=color=White:size=1280x720':
Duration: N/A, start: 0.000000, bitrate: N/A
Stream #0:0: Video: wrapped_avframe, yuv420p, 1280x720 [SAR 1:1 DAR
16:9], 25 fps, 25 tbr, 25 tbn
Stream mapping:
Stream #0:0 -> #0:0 (wrapped_avframe (native) -> h264 (libx264))
Press [q] to stop, [?] for help
[Parsed_scale_vulkan_1 @ 0x7b54f0005600] Unsupported input format for
conversion
[Parsed_scale_vulkan_1 @ 0x7b54f0005600] Failed to configure output pad on
Parsed_scale_vulkan_1
[vf#0:0 @ 0x5ee8fea51b00] Error reinitializing filters!
[vf#0:0 @ 0x5ee8fea51b00] Task finished with error code: -22 (Invalid
argument)
[vf#0:0 @ 0x5ee8fea51b00] Terminating thread with return code -22 (Invalid
argument)
[vost#0:0/libx264 @ 0x5ee8feac8c80] Could not open encoder before EOF
[vost#0:0/libx264 @ 0x5ee8feac8c80] Task finished with error code: -22
(Invalid argument)
[vost#0:0/libx264 @ 0x5ee8feac8c80] Terminating thread with return code
-22 (Invalid argument)
[out#0/mp4 @ 0x5ee9006763c0] Nothing was written into output file, because
at least one of its streams received no packets.
frame= 0 fps=0.0 q=0.0 Lsize= 0KiB time=N/A bitrate=N/A speed=N/A
Conversion failed!
}}}
As the error complains about the input pixel format, I tried to insert a
`format=nv12` **filter** before `hwupload`, but this still does **not**
work:
{{{
-vf
'format=nv12,hwupload,scale_vulkan=w=640:h=480:format=nv12,hwdownload,format=nv12,format=yuv420p'
}}}
It **works** when using `yuv420p` pixel format, either by explicitly
setting it or by omitting the `format` option, as bellow:
{{{
-vf
'hwupload,scale_vulkan=w=640:h=480:format=yuv420p,hwdownload,format=yuv420p'
-vf 'hwupload,scale_vulkan=w=640:h=480,hwdownload,format=yuv420p'
}}}
It also **works** when using `rgba` as the input pixel format, but still
no `nv12` is accepted in the `format` option, and produces a green tint
output (wrong colors, maybe related to #10875):
{{{
-vf
'format=bgra,hwupload,scale_vulkan=w=640:h=480:format=yuv420p,hwdownload,format=yuv420p'
}}}
All other hardware accelerated scale filters (`scale_cuda`, `scale_npp`,
`scale_qsv` and `scale_vaapi`) does not behave like this, as they accept,
for example, `nv12` in the `format` option using the example above.
By looking at the `vf_scale_vulkan.c` source code
(https://git.ffmpeg.org/gitweb/ffmpeg.git/blob/cffadfe99a1c41866701bab6c7410c17737a1db1:/libavfilter/vf_scale_vulkan.c#l335),
it looks like that it should support `nv12`, `yuv420p` and `yuv444p`
output formats.
System Information:
- OS: Arch Linux
- Vulkan device: NVIDIA RTX 3060
- GPU driver: NVIDIA proprietary driver version 545.29.06
--
Ticket URL: <https://trac.ffmpeg.org/ticket/10876>
FFmpeg <https://ffmpeg.org>
FFmpeg issue tracker
More information about the FFmpeg-trac
mailing list