1
0
Эх сурвалжийг харах

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.
jp9000 4 жил өмнө
parent
commit
a4146a685b

+ 2 - 0
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"

+ 13 - 5
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,

+ 19 - 2
libobs/obs-output.c

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