浏览代码

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 年之前
父节点
当前提交
a4146a685b
共有 3 个文件被更改,包括 34 次插入7 次删除
  1. 2 0
      UI/data/locale/en-US.ini
  2. 13 5
      UI/window-basic-main.cpp
  3. 19 2
      libobs/obs-output.c

+ 2 - 0
UI/data/locale/en-US.ini

@@ -377,6 +377,7 @@ Output.ConnectFail.Disconnected="Disconnected from server."
 # output streaming-related messages
 # output streaming-related messages
 Output.StreamEncodeError.Title="Encoding error"
 Output.StreamEncodeError.Title="Encoding error"
 Output.StreamEncodeError.Msg="An encoder error occurred while streaming."
 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 recording-related messages
 Output.RecordFail.Title="Failed to start recording"
 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.Title="Recording error"
 Output.RecordError.Msg="An unspecified error occurred while recording."
 Output.RecordError.Msg="An unspecified error occurred while recording."
 Output.RecordError.EncodeErrorMsg="An encoder 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 recording messages
 Output.BadPath.Title="Bad File Path"
 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);
 	blog(LOG_INFO, STREAMING_STOP);
 
 
 	if (encode_error) {
 	if (encode_error) {
+		QString msg =
+			last_error.isEmpty()
+				? QTStr("Output.StreamEncodeError.Msg")
+				: QTStr("Output.StreamEncodeError.Msg.LastError")
+					  .arg(last_error);
 		OBSMessageBox::information(
 		OBSMessageBox::information(
-			this, QTStr("Output.StreamEncodeError.Title"),
-			QTStr("Output.StreamEncodeError.Msg"));
+			this, QTStr("Output.StreamEncodeError.Title"), msg);
 
 
 	} else if (code != OBS_OUTPUT_SUCCESS && isVisible()) {
 	} else if (code != OBS_OUTPUT_SUCCESS && isVisible()) {
 		OBSMessageBox::information(this,
 		OBSMessageBox::information(this,
@@ -6949,9 +6953,13 @@ void OBSBasic::RecordingStop(int code, QString last_error)
 					QTStr("Output.RecordFail.Unsupported"));
 					QTStr("Output.RecordFail.Unsupported"));
 
 
 	} else if (code == OBS_OUTPUT_ENCODE_ERROR && isVisible()) {
 	} 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()) {
 	} else if (code == OBS_OUTPUT_NO_SPACE && isVisible()) {
 		OBSMessageBox::warning(this,
 		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;
 	struct calldata params;
 
 
 	calldata_init(&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_int(&params, "code", output->stop_code);
 	calldata_set_ptr(&params, "output", output);
 	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"))
 	if (!obs_output_valid(output, "obs_output_get_last_error"))
 		return NULL;
 		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)
 void obs_output_set_last_error(obs_output_t *output, const char *message)