Opened 4 years ago

Last modified 4 years ago

#8666 new enhancement

ffmpeg hardware accel command line settings are inconsistent

Reported by: Kurt Fitzner Owned by:
Priority: normal Component: undetermined
Version: unspecified Keywords:
Cc: Blocked By:
Blocking: Reproduced by developer: no
Analyzed by developer: no

Description

Summary:
The way that ffmpeg specifies different hardware acceleration options on the command line spans different switch paradigms.

Examples:
cuvid (decode) must be specified with with -c:v codec switch.
cuda (decode) must be specified with -hwaccel cuda

Additionally, it would be beneficial to separate specifying the decoding/encoding hardware from specifying the codec format and to remove the requirement to specify the hardware decoding codec. ffmpeg should detect the correct decoder and not require the user to know what the input file's codec actually is.

ffpmeg -vdecoder=cuvid -i input.mkv -vencoder=cuda -c:v hevc output.mp4

Though this may be a step too far, it would also be beneficial to divorce the codec method from the codec library. In other words, stop using the -c:v to tell ffmpeg what library to use. libx264, h264_qsv, h264_nvenc, h264_cuvid and others are all h.264 "codec" names in ffpmeg. It would be much cleaner to:

ffmpeg -i input.mkv -vencoder=software -c:v h264 output.mp4
ffpmeg -i input.mkv -vencoder=cuda -c:v h264 output.mp4
ffpmeg -i input.mkv -vencoder=qsv -c:v h264 output.mp4

or, if you need fine grained specification of the actual software library where there are multiple libraries providing the same codec, then:

ffmpeg -i input.mkv -vencoder=software:libx264 -c:v h264 output.mp4
ffmpeg -i input.mkv -vencoder=software:libnewcoolencoder -c:v h264 output.mp4

It wouldn't be hard to implement this system alongside the old one so as not to break current scripts and GUIs.

Change History (1)

in reply to:  description comment:1 by Hendrik, 4 years ago

Replying to Va1DER:

Examples:
cuvid (decode) must be specified with with -c:v codec switch.
cuda (decode) must be specified with -hwaccel cuda

-hwaccel is the primary method to trigger hardware decoding. The cuvid decoder is deprecated, and uses the same hardware capabilities. With -hwaccel you do not need to know what the input codec is.

ffmpeg -i input.mkv -vencoder=software -c:v h264 output.mp4
ffpmeg -i input.mkv -vencoder=cuda -c:v h264 output.mp4
ffpmeg -i input.mkv -vencoder=qsv -c:v h264 output.mp4

I really don't see the advantage in this. You still need to know that its called "qsv" or "cuda", and its longer to boot. -c:v h264_nvenc or -c:v h264_qsv isnt really any different, just less verbose extra options.

Note: See TracTickets for help on using tickets.