[FFmpeg-devel] [PATCH 5/8] lavc/nvenc: Add hardware config metadata
Mark Thompson
sw at jkqxz.net
Sun Apr 26 21:02:47 EEST 2020
On 13/04/2020 17:48, Dennis Mungai wrote:
> On Mon, 13 Apr 2020 at 18:34, Mark Thompson <sw at jkqxz.net> wrote:
>
>> NOT TESTED.
>> ---
>> Needs someone with suitable hardware to try it.
>>
>> With this and the relevant ffmpeg patches, existing stuff should continue
>> to work and you should also be able to choose between multiple devices for
>> a standalone encoder with things like:
>>
>> ffmpeg -init_hw_device cuda:2 ... -c:v nvenc ...
>> ffmpeg -init_hw_device d3d11:2 ... -c:v nvenc ...
>>
>>
>> libavcodec/nvenc.c | 11 +++++++++++
>> libavcodec/nvenc.h | 1 +
>> libavcodec/nvenc_h264.c | 1 +
>> libavcodec/nvenc_hevc.c | 1 +
>> 4 files changed, 14 insertions(+)
>>
>> diff --git a/libavcodec/nvenc.c b/libavcodec/nvenc.c
>> index 9a96bf2bba..b0cd8874ee 100644
>> --- a/libavcodec/nvenc.c
>> +++ b/libavcodec/nvenc.c
>> @@ -30,6 +30,7 @@
>> #include "libavutil/avassert.h"
>> #include "libavutil/mem.h"
>> #include "libavutil/pixdesc.h"
>> +#include "hwconfig.h"
>> #include "internal.h"
>>
>> #define CHECK_CU(x) FF_CUDA_CHECK_DL(avctx, dl_fn->cuda_dl, x)
>> @@ -55,6 +56,16 @@ const enum AVPixelFormat ff_nvenc_pix_fmts[] = {
>> AV_PIX_FMT_NONE
>> };
>>
>> +const AVCodecHWConfigInternal *ff_nvenc_hw_configs[] = {
>> + HW_CONFIG_ENCODER_FRAMES(CUDA, CUDA),
>> + HW_CONFIG_ENCODER_DEVICE(NONE, CUDA),
>> +#if CONFIG_D3D11VA
>> + HW_CONFIG_ENCODER_FRAMES(D3D11, D3D11),
>> + HW_CONFIG_ENCODER_DEVICE(NONE, D3D11),
>> +#endif
>> + NULL,
>> +};
>> +
>> #define IS_10BIT(pix_fmt) (pix_fmt == AV_PIX_FMT_P010 || \
>> pix_fmt == AV_PIX_FMT_P016 || \
>> pix_fmt == AV_PIX_FMT_YUV444P16)
>> diff --git a/libavcodec/nvenc.h b/libavcodec/nvenc.h
>> index c44c81e675..c80332d914 100644
>> --- a/libavcodec/nvenc.h
>> +++ b/libavcodec/nvenc.h
>> @@ -217,5 +217,6 @@ int ff_nvenc_encode_frame(AVCodecContext *avctx,
>> AVPacket *pkt,
>> void ff_nvenc_encode_flush(AVCodecContext *avctx);
>>
>> extern const enum AVPixelFormat ff_nvenc_pix_fmts[];
>> +extern const AVCodecHWConfigInternal *ff_nvenc_hw_configs[];
>>
>> #endif /* AVCODEC_NVENC_H */
>> diff --git a/libavcodec/nvenc_h264.c b/libavcodec/nvenc_h264.c
>> index 479155fe15..6d82422308 100644
>> --- a/libavcodec/nvenc_h264.c
>> +++ b/libavcodec/nvenc_h264.c
>> @@ -248,4 +248,5 @@ AVCodec ff_h264_nvenc_encoder = {
>> .caps_internal = FF_CODEC_CAP_INIT_CLEANUP,
>> .pix_fmts = ff_nvenc_pix_fmts,
>> .wrapper_name = "nvenc",
>> + .hw_configs = ff_nvenc_hw_configs,
>> };
>> diff --git a/libavcodec/nvenc_hevc.c b/libavcodec/nvenc_hevc.c
>> index 7c9b3848f1..58d5265977 100644
>> --- a/libavcodec/nvenc_hevc.c
>> +++ b/libavcodec/nvenc_hevc.c
>> @@ -206,4 +206,5 @@ AVCodec ff_hevc_nvenc_encoder = {
>> .capabilities = AV_CODEC_CAP_DELAY | AV_CODEC_CAP_HARDWARE,
>> .caps_internal = FF_CODEC_CAP_INIT_CLEANUP,
>> .wrapper_name = "nvenc",
>> + .hw_configs = ff_nvenc_hw_configs,
>> };
>> --
>> 2.25.1
>>
>>
>>
> What type of hardware is considered "suitable"? Systems with multiple
> NVENC-capable GPUs?
Something supporting CUDA, NVENC and D3D11.
> Also, provide a sample command line extending on the examples above that
> you'd like tested and I'll report back with results.
Create CUDA and D3D11 devices and make sure that they get passed to an NVENC encoder. Since NVENC chooses a device itself if not given one, I think you would need to stop it in a debugger to make sure that the right thing happened.
Thanks,
- Mark
More information about the ffmpeg-devel
mailing list