From a4146a685b92a88b4f4359861b7924fd5eace33e Mon Sep 17 00:00:00 2001 From: jp9000 Date: Sat, 23 Oct 2021 05:31:16 -0700 Subject: [PATCH] libobs: Allow last encoder error for last output error (This commit also modifies UI) This makes it more trivial for encoder plugins to communicate to users why specifically an encoder error might have occurred mid-stream. --- UI/data/locale/en-US.ini | 2 ++ UI/window-basic-main.cpp | 18 +++++++++++++----- libobs/obs-output.c | 21 +++++++++++++++++++-- 3 files changed, 34 insertions(+), 7 deletions(-) diff --git a/UI/data/locale/en-US.ini b/UI/data/locale/en-US.ini index 2b685d111..f9714a086 100644 --- a/UI/data/locale/en-US.ini +++ b/UI/data/locale/en-US.ini @@ -377,6 +377,7 @@ Output.ConnectFail.Disconnected="Disconnected from server." # output streaming-related messages Output.StreamEncodeError.Title="Encoding error" Output.StreamEncodeError.Msg="An encoder error occurred while streaming." +Output.StreamEncodeError.Msg.LastError="An encoder error occurred while streaming:\n\n%1" # output recording-related messages Output.RecordFail.Title="Failed to start recording" @@ -386,6 +387,7 @@ Output.RecordNoSpace.Msg="There is not sufficient disk space to continue recordi Output.RecordError.Title="Recording error" Output.RecordError.Msg="An unspecified error occurred while recording." Output.RecordError.EncodeErrorMsg="An encoder error occurred while recording." +Output.RecordError.EncodeErrorMsg.LastError="An encoder error occurred while recording:\n\n%1" # output recording messages Output.BadPath.Title="Bad File Path" diff --git a/UI/window-basic-main.cpp b/UI/window-basic-main.cpp index b6147aef4..dc61aacf2 100644 --- a/UI/window-basic-main.cpp +++ b/UI/window-basic-main.cpp @@ -6800,9 +6800,13 @@ void OBSBasic::StreamingStop(int code, QString last_error) blog(LOG_INFO, STREAMING_STOP); if (encode_error) { + QString msg = + last_error.isEmpty() + ? QTStr("Output.StreamEncodeError.Msg") + : QTStr("Output.StreamEncodeError.Msg.LastError") + .arg(last_error); OBSMessageBox::information( - this, QTStr("Output.StreamEncodeError.Title"), - QTStr("Output.StreamEncodeError.Msg")); + this, QTStr("Output.StreamEncodeError.Title"), msg); } else if (code != OBS_OUTPUT_SUCCESS && isVisible()) { OBSMessageBox::information(this, @@ -6949,9 +6953,13 @@ void OBSBasic::RecordingStop(int code, QString last_error) QTStr("Output.RecordFail.Unsupported")); } else if (code == OBS_OUTPUT_ENCODE_ERROR && isVisible()) { - OBSMessageBox::warning( - this, QTStr("Output.RecordError.Title"), - QTStr("Output.RecordError.EncodeErrorMsg")); + QString msg = + last_error.isEmpty() + ? QTStr("Output.RecordError.EncodeErrorMsg") + : QTStr("Output.RecordError.EncodeErrorMsg.LastError") + .arg(last_error); + OBSMessageBox::warning(this, QTStr("Output.RecordError.Title"), + msg); } else if (code == OBS_OUTPUT_NO_SPACE && isVisible()) { OBSMessageBox::warning(this, diff --git a/libobs/obs-output.c b/libobs/obs-output.c index d4abf2333..6f9633236 100644 --- a/libobs/obs-output.c +++ b/libobs/obs-output.c @@ -1982,7 +1982,8 @@ static inline void signal_stop(struct obs_output *output) struct calldata params; calldata_init(¶ms); - calldata_set_string(¶ms, "last_error", output->last_error_message); + calldata_set_string(¶ms, "last_error", + obs_output_get_last_error(output)); calldata_set_int(¶ms, "code", output->stop_code); calldata_set_ptr(¶ms, "output", output); @@ -2617,7 +2618,23 @@ const char *obs_output_get_last_error(obs_output_t *output) if (!obs_output_valid(output, "obs_output_get_last_error")) return NULL; - return output->last_error_message; + if (output->last_error_message) { + return output->last_error_message; + } else { + obs_encoder_t *vencoder = output->video_encoder; + if (vencoder && vencoder->last_error_message) { + return vencoder->last_error_message; + } + + for (size_t i = 0; i < MAX_AUDIO_MIXES; i++) { + obs_encoder_t *aencoder = output->audio_encoders[i]; + if (aencoder && aencoder->last_error_message) { + return aencoder->last_error_message; + } + } + } + + return NULL; } void obs_output_set_last_error(obs_output_t *output, const char *message)