obs-ffmpeg: Preserve error message from new NVENC

If we fallback to ffmpeg NVENC, the error from new NVENC might still be
present in the encoder structure. Given that this provides a lot more
actionable information to the user, let's use it if possible.
master
Richard Stanway 2020-04-26 23:35:28 +02:00
parent aa97534057
commit 6b441a180c
1 changed files with 27 additions and 19 deletions

View File

@ -90,27 +90,35 @@ static bool nvenc_init_codec(struct nvenc_encoder *enc)
ret = avcodec_open2(enc->context, enc->nvenc, NULL); ret = avcodec_open2(enc->context, enc->nvenc, NULL);
if (ret < 0) { if (ret < 0) {
struct dstr error_message = {0}; // if we were a fallback from jim-nvenc, there may already be a
// more useful error returned from that, so don't overwrite.
// this can be removed if / when ffmpeg fallback is removed.
if (!obs_encoder_get_last_error(enc->encoder)) {
struct dstr error_message = {0};
// special case for common NVENC error // special case for common NVENC error
if (ret == AVERROR_EXTERNAL) { if (ret == AVERROR_EXTERNAL) {
dstr_printf(&error_message, dstr_printf(
"Failed to open NVENC codec: %s\r\n\r\n" &error_message,
"Check your video drivers are up to " "Failed to open NVENC codec: %s\r\n\r\n"
"date. Disable other software that may " "Check your video drivers are up to "
"be using NVENC such as NVIDIA " "date. Disable other software that may "
"ShadowPlay or Windows 10 Game " "be using NVENC such as NVIDIA "
"DVR.", "ShadowPlay or Windows 10 Game "
av_err2str(ret)); "DVR.",
} else { av_err2str(ret));
dstr_printf( } else {
&error_message, dstr_printf(
"Failed to open NVENC codec: %s\r\n\r\n" &error_message,
"Please check your video drivers are up to date.", "Failed to open NVENC codec: %s\r\n\r\n"
av_err2str(ret)); "Please check your video drivers are up to date.",
av_err2str(ret));
}
obs_encoder_set_last_error(enc->encoder,
error_message.array);
dstr_free(&error_message);
} }
obs_encoder_set_last_error(enc->encoder, error_message.array);
dstr_free(&error_message);
warn("Failed to open NVENC codec: %s", av_err2str(ret)); warn("Failed to open NVENC codec: %s", av_err2str(ret));
return false; return false;
} }