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.
master
jp9000 2021-10-23 05:31:16 -07:00
parent 6534bf5834
commit a4146a685b
3 changed files with 34 additions and 7 deletions

View File

@ -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"

View File

@ -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,

View File

@ -1982,7 +1982,8 @@ static inline void signal_stop(struct obs_output *output)
struct calldata params;
calldata_init(&params);
calldata_set_string(&params, "last_error", output->last_error_message);
calldata_set_string(&params, "last_error",
obs_output_get_last_error(output));
calldata_set_int(&params, "code", output->stop_code);
calldata_set_ptr(&params, "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)