[FFmpeg-user] Issue with hwaccel cuvid

Dennis Mungai dmngaie at gmail.com
Wed Apr 8 18:30:39 EEST 2020


On Wed, 8 Apr 2020 at 17:57, Andy Sheimo <asheimo at gmail.com> wrote:

> I keep getting an error on some files and it appears to be due to a
> scaler being inserted but I don't know how to fix it. Any help would be
> appreciated. logging below:
>
> K:\Video\GAMERA THE BRAVE>ffmpeg -loglevel verbose -hwaccel cuvid
> -hwaccel_output_format yuv420p -c:v mpeg2_cuvid -i
> "l:\welter_originals\gamera the brave\Latatude Zero-trailer.mkv" -c:a copy
> -c:v h264_nvenc test.mkv
> ffmpeg version 4.2.2 Copyright (c) 2000-2019 the FFmpeg developers
>   built with gcc 9.2.1 (GCC) 20200122
>   configuration: --enable-gpl --enable-version3 --enable-sdl2
> --enable-fontconfig --enable-gnutls --enable-iconv --enable-libass
> --enable-libdav1d --enable-libbluray --enable-libfreetype
> --enable-libmp3lame --enable-libopencore-amrnb --enable-libopencore-amrwb
> --enable-libopenjpeg --enable-libopus --enable-libshine --enable-libsnappy
> --enable-libsoxr --enable-libtheora --enable-libtwolame --enable-libvpx
> --enable-libwavpack --enable-libwebp --enable-libx264 --enable-libx265
> --enable-libxml2 --enable-libzimg --enable-lzma --enable-zlib --enable-gmp
> --enable-libvidstab --enable-libvorbis --enable-libvo-amrwbenc
> --enable-libmysofa --enable-libspeex --enable-libxvid --enable-libaom
> --enable-libmfx --enable-amf --enable-ffnvcodec --enable-cuvid
> --enable-d3d11va --enable-nvenc --enable-nvdec --enable-dxva2
> --enable-avisynth --enable-libopenmpt
>   libavutil      56. 31.100 / 56. 31.100
>   libavcodec     58. 54.100 / 58. 54.100
>   libavformat    58. 29.100 / 58. 29.100
>   libavdevice    58.  8.100 / 58.  8.100
>   libavfilter     7. 57.100 /  7. 57.100
>   libswscale      5.  5.100 /  5.  5.100
>   libswresample   3.  5.100 /  3.  5.100
>   libpostproc    55.  5.100 / 55.  5.100
> Input #0, matroska,webm, from 'l:\welter_originals\gamera the
> brave\Latatude Zero-trailer.mkv':
>   Metadata:
>     encoder         : libmakemkv v1.15.0 (1.3.5/1.4.7) win(x64-release)
>     creation_time   : 2020-03-05T18:41:29.000000Z
>   Duration: 00:02:28.75, start: 0.000000, bitrate: 4685 kb/s
>     Stream #0:0(eng): Video: mpeg2video (Main), 1 reference frame,
> yuv420p(tv, top first, left), 720x480 [SAR 32:27 DAR 16:9], SAR 186:157 DAR
> 279:157, 29.97 fps, 29.97 tbr, 1k tbn, 59.94 tbc
>     Metadata:
>       BPS-eng         : 4488094
>       DURATION-eng    : 00:02:28.748600000
>       NUMBER_OF_FRAMES-eng: 3567
>       NUMBER_OF_BYTES-eng: 83449382
>       SOURCE_ID-eng   : 0100E0
>       _STATISTICS_WRITING_APP-eng: MakeMKV v1.15.0 win(x64-release)
>       _STATISTICS_WRITING_DATE_UTC-eng: 2020-03-05 18:41:29
>       _STATISTICS_TAGS-eng: BPS DURATION NUMBER_OF_FRAMES NUMBER_OF_BYTES
> SOURCE_ID
>     Stream #0:1(eng): Audio: ac3, 48000 Hz, mono, fltp, 192 kb/s (default)
>     Metadata:
>       title           : Mono
>       BPS-eng         : 192000
>       DURATION-eng    : 00:02:28.704000000
>       NUMBER_OF_FRAMES-eng: 4647
>       NUMBER_OF_BYTES-eng: 3568896
>       SOURCE_ID-eng   : 0180BD
>       _STATISTICS_WRITING_APP-eng: MakeMKV v1.15.0 win(x64-release)
>       _STATISTICS_WRITING_DATE_UTC-eng: 2020-03-05 18:41:29
>       _STATISTICS_TAGS-eng: BPS DURATION NUMBER_OF_FRAMES NUMBER_OF_BYTES
> SOURCE_ID
> File 'test.mkv' already exists. Overwrite ? [y/N] y
> [mpeg2_cuvid @ 000001ec985dfbc0] Initializing cuvid hwaccel
> [mpeg2_cuvid @ 000001ec985dfbc0] CUVID capabilities for mpeg2_cuvid:
> [mpeg2_cuvid @ 000001ec985dfbc0] 8 bit: supported: 1, min_width: 48,
> max_width: 4080, min_height: 16, max_height: 4080
> [mpeg2_cuvid @ 000001ec985dfbc0] 10 bit: supported: 0, min_width: 0,
> max_width: 0, min_height: 0, max_height: 0
> [mpeg2_cuvid @ 000001ec985dfbc0] 12 bit: supported: 0, min_width: 0,
> max_width: 0, min_height: 0, max_height: 0
> Stream mapping:
>   Stream #0:0 -> #0:0 (mpeg2video (mpeg2_cuvid) -> h264 (h264_nvenc))
>   Stream #0:1 -> #0:1 (copy)
> Press [q] to stop, [?] for help
> [mpeg2_cuvid @ 000001ec985dfbc0] Initializing cuvid hwaccel
> [mpeg2_cuvid @ 000001ec985dfbc0] Formats: Original: cuda | HW: cuda | SW:
> nv12
> [graph 0 input from stream 0:0 @ 000001ec98632f00] w:720 h:480 pixfmt:cuda
> tb:1/1000 fr:30000/1001 sar:186/157 sws_param:flags=2
> [h264_nvenc @ 000001ec985efe00] Loaded Nvenc version 10.0
> [h264_nvenc @ 000001ec985efe00] Nvenc initialized successfully
> Output #0, matroska, to 'test.mkv':
>   Metadata:
>     encoder         : Lavf58.29.100
>     Stream #0:0(eng): Video: h264 (h264_nvenc) (Main), 1 reference frame
> (H264 / 0x34363248), cuda(left), 720x480 [SAR 186:157 DAR 279:157],
> q=-1--1, 2000 kb/s, 29.97 fps, 1k tbn, 29.97 tbc
>     Metadata:
>       BPS-eng         : 4488094
>       DURATION-eng    : 00:02:28.748600000
>       NUMBER_OF_FRAMES-eng: 3567
>       NUMBER_OF_BYTES-eng: 83449382
>       SOURCE_ID-eng   : 0100E0
>       _STATISTICS_WRITING_APP-eng: MakeMKV v1.15.0 win(x64-release)
>       _STATISTICS_WRITING_DATE_UTC-eng: 2020-03-05 18:41:29
>       _STATISTICS_TAGS-eng: BPS DURATION NUMBER_OF_FRAMES NUMBER_OF_BYTES
> SOURCE_ID
>       encoder         : Lavc58.54.100 h264_nvenc
>     Side data:
>       cpb: bitrate max/min/avg: 0/0/2000000 buffer size: 4000000 vbv_delay:
> -1
>     Stream #0:1(eng): Audio: ac3 ([0] [0][0] / 0x2000), 48000 Hz, mono,
> fltp, 192 kb/s (default)
>     Metadata:
>       title           : Mono
>       BPS-eng         : 192000
>       DURATION-eng    : 00:02:28.704000000
>       NUMBER_OF_FRAMES-eng: 4647
>       NUMBER_OF_BYTES-eng: 3568896
>       SOURCE_ID-eng   : 0180BD
>       _STATISTICS_WRITING_APP-eng: MakeMKV v1.15.0 win(x64-release)
>       _STATISTICS_WRITING_DATE_UTC-eng: 2020-03-05 18:41:29
>       _STATISTICS_TAGS-eng: BPS DURATION NUMBER_OF_FRAMES NUMBER_OF_BYTES
> SOURCE_ID
> [mpeg2_cuvid @ 000001ec985dfbc0] Initializing cuvid hwaccel2
> bitrate=1805.6kbits/s speed=77.9x
> [mpeg2_cuvid @ 000001ec985dfbc0] Formats: Original: cuda | HW: cuda | SW:
> nv12
> [graph 0 input from stream 0:0 @ 000001ec985e3a40] w:720 h:480 pixfmt:cuda
> tb:1/1000 fr:30000/1001 sar:186/157 sws_param:flags=2
> [scaler_out_0_0 @ 000001ecac63f100] w:720 h:480 flags:'bicubic' interl:0
> [auto_scaler_0 @ 000001ec986aed80] w:iw h:ih flags:'bicubic' interl:0
> [scaler_out_0_0 @ 000001ecac63f100] auto-inserting filter 'auto_scaler_0'
> between the filter 'Parsed_null_0' and the filter 'scaler_out_0_0'
> Impossible to convert between the formats supported by the filter
> 'Parsed_null_0' and the filter 'auto_scaler_0'
> Error reinitializing filters!
> Failed to inject frame into filter network: Function not implemented
> Error while processing the decoded data for stream #0:0
> [AVIOContext @ 000001ec985f1b00] Statistics: 0 seeks, 156 writeouts
> [h264_nvenc @ 000001ec985efe00] Nvenc unloaded
> [AVIOContext @ 000001ec985e3bc0] Statistics: 87142507 bytes read, 2 seeks
> Conversion failed!
>
>
Try this instead:

ffmpeg -threads 1 -loglevel verbose -hwaccel cuvid
-hwaccel_output_format cuda -c:v mpeg2_cuvid -extra_hw_frames 3 -i
"l:\welter_originals\gamera the brave\Latatude Zero-trailer.mkv" -c:a copy
-c:v h264_nvenc test.mkv

Or with NVDEC:

ffmpeg -threads 1 -loglevel verbose -hwaccel cuda
-hwaccel_output_format cuda -extra_hw_frames 3 -i
"l:\welter_originals\gamera the brave\Latatude Zero-trailer.mkv" -c:a copy
-c:v h264_nvenc test.mkv

See the hwaccel_output_format is set to cuda, and not the generic yuv420p.

If you must use the yuv420p pixel format, then:

(a). Unset -hwaccel_output_format option. When present, this disallows
downloading textures to system memory.

(b). Then use the hwdownload filter chained to the format=yuv420p. Note
that this *might* not be supported, and may require you to use a planar
pixel format such as nv12, depending on consequent filter chains.

Note that doing so in your case would only decrease throughput, and is only
necessary *if* you're using some software-based filter down the line, such
as the generic overlay filter.

Where possible, stick to either full H/W decode+encode, OR skip H/W decode
entirely if the input format is likely to be unsupported by the underlying
device.
In the latter case, the use of the hwupload or hwupload_cuda filter(s) can
then be used to create the required CUDA contexts for filters that depend
on them, such as yadif_cuda, overlay_cuda, etc.
Note that with hwupload filter, a device reference is required to upload
hwframes to, typically via the -init_hw_device
$device_type:$index=$identifier -filter_hw_device $identifier arguments,
where $device_type in this  case would be cuda and $index would be the GPU
to use for that session, and $identifier being a unique name to identify
the hardware device by.

Example:

-init_hw_device cuda:0=hw -filter_hw_device hw

Would initialize a device type cuda, using GPU index (from nvidia-smi) as 0
(the first GPU), with the identifier passed to -filter_hw_device as hw.

The filter hwupload_cuda initializes a device to use and does not require
the manual step above. However, you can select *what* GPU to use by passing
it directly to the filter, via:

hwupload_cuda=$index

To achieve the same result.

On the -extra_hw_frames option and why its' needed for NVDEC (and CUVID),
see this ticket: https://trac.ffmpeg.org/ticket/7562

Recommended: Limit decoder threads to 1 as shown above to prevent NVDEC
from misbehaving. It will outright warn you if thread count (or surface
count in use) exceeds 16.

Hope that helps.


More information about the ffmpeg-user mailing list