Change nvenc preset to p5 to workaround new nvidia driver bug

This commit is contained in:
dec05eba 2023-08-15 23:25:41 +02:00
parent a253be38b7
commit 59bf8e3025
2 changed files with 14 additions and 6 deletions

6
TODO
View File

@ -85,4 +85,8 @@ It may be possible to improve color conversion rgb->yuv shader for color edges b
When webcam is supported mention that nvidia_drm.modeset=1 must be set on nvidia x11 (it's required on wayland so it's not needed there. Or does eglstream work without it??). Check if this really is the case. When webcam is supported mention that nvidia_drm.modeset=1 must be set on nvidia x11 (it's required on wayland so it's not needed there. Or does eglstream work without it??). Check if this really is the case.
Use vfr on nvidia x11 as well, otherwise network data could slow it down to below target fps and mess it up. Use vfr on nvidia x11 as well, otherwise network data could slow it down to below target fps and mess it up.
Preset is set to p5 for now but it should ideally be p6 or p7.
This change is needed because for certain sizes of a window (or monitor?) such as 971x780 causes encoding to freeze
when using h264 codec. This is a new(?) nvidia driver bug.

View File

@ -540,15 +540,15 @@ static void open_video(AVCodecContext *codec_context, VideoQuality video_quality
AVDictionary *options = nullptr; AVDictionary *options = nullptr;
if(vendor == GSR_GPU_VENDOR_NVIDIA) { if(vendor == GSR_GPU_VENDOR_NVIDIA) {
bool supports_p4 = false; bool supports_p4 = false;
bool supports_p6 = false; bool supports_p5 = false;
const AVOption *opt = nullptr; const AVOption *opt = nullptr;
while((opt = av_opt_next(codec_context->priv_data, opt))) { while((opt = av_opt_next(codec_context->priv_data, opt))) {
if(opt->type == AV_OPT_TYPE_CONST) { if(opt->type == AV_OPT_TYPE_CONST) {
if(strcmp(opt->name, "p4") == 0) if(strcmp(opt->name, "p4") == 0)
supports_p4 = true; supports_p4 = true;
else if(strcmp(opt->name, "p6") == 0) else if(strcmp(opt->name, "p5") == 0)
supports_p6 = true; supports_p5 = true;
} }
} }
@ -584,7 +584,7 @@ static void open_video(AVCodecContext *codec_context, VideoQuality video_quality
} }
} }
if(!supports_p4 && !supports_p6) if(!supports_p4 && !supports_p5)
fprintf(stderr, "Info: your ffmpeg version is outdated. It's recommended that you use the flatpak version of gpu-screen-recorder version instead, which you can find at https://flathub.org/apps/details/com.dec05eba.gpu_screen_recorder\n"); fprintf(stderr, "Info: your ffmpeg version is outdated. It's recommended that you use the flatpak version of gpu-screen-recorder version instead, which you can find at https://flathub.org/apps/details/com.dec05eba.gpu_screen_recorder\n");
//if(is_livestream) { //if(is_livestream) {
@ -598,10 +598,14 @@ static void open_video(AVCodecContext *codec_context, VideoQuality video_quality
// older gpus p5-p7 slow the gpu down to a crawl... // older gpus p5-p7 slow the gpu down to a crawl...
// "hq" is now just an alias for p7 in ffmpeg :( // "hq" is now just an alias for p7 in ffmpeg :(
// TODO: Temporary disable because of stuttering? // TODO: Temporary disable because of stuttering?
// TODO: Preset is set to p5 for now but it should ideally be p6 or p7.
// This change is needed because for certain sizes of a window (or monitor?) such as 971x780 causes encoding to freeze
// when using h264 codec. This is a new(?) nvidia driver bug.
if(very_old_gpu) if(very_old_gpu)
av_dict_set(&options, "preset", supports_p4 ? "p4" : "medium", 0); av_dict_set(&options, "preset", supports_p4 ? "p4" : "medium", 0);
else else
av_dict_set(&options, "preset", supports_p6 ? "p6" : "slow", 0); av_dict_set(&options, "preset", supports_p5 ? "p5" : "slow", 0);
av_dict_set(&options, "tune", "hq", 0); av_dict_set(&options, "tune", "hq", 0);
av_dict_set(&options, "rc", "constqp", 0); av_dict_set(&options, "rc", "constqp", 0);