浏览代码

libobs: Fix an int underflow in log_frame_info

I believe the issue with the next to impossible frame count to be an integer underflow, as in order to achieve those you'd have to have recorded for at least 345 days with 144 fps. So this commit fixes them by using a normal integer first and then deciding on the result if it should be used or be replaced with a 0.
Michael Fabian Dirks 8 年之前
父节点
当前提交
4e3e67bb8c
共有 1 个文件被更改,包括 15 次插入8 次删除
  1. 15 8
      libobs/obs-output.c

+ 15 - 8
libobs/obs-output.c

@@ -283,26 +283,33 @@ static void log_frame_info(struct obs_output *output)
 {
 	struct obs_core_video *video = &obs->video;
 
-	uint32_t video_frames  = video_output_get_total_frames(output->video);
+	uint32_t encoded_frames  = video_output_get_total_frames(output->video);
 
-	uint32_t total   = video_frames  - output->starting_frame_count;
+	int64_t encoded_temp = (int64_t)encoded_frames
+		- (int64_t)output->starting_frame_count;
+	uint32_t encoded = encoded_temp > 0 ? (uint32_t)encoded_temp : 0;
 
-	uint32_t drawn  = video->total_frames - output->starting_drawn_count;
-	uint32_t lagged = video->lagged_frames - output->starting_lagged_count;
+	int64_t drawn_temp = (int64_t)video->total_frames
+		- (int64_t)output->starting_drawn_count;
+	uint32_t drawn = drawn_temp > 0 ? (uint32_t)drawn_temp : 0;
+
+	int64_t lagged_temp = (int64_t)video->total_frames
+		- (int64_t)output->starting_lagged_count;
+	uint32_t lagged = lagged_temp > 0 ? (uint32_t)lagged_temp : 0;
 
 	int dropped = obs_output_get_frames_dropped(output);
 
 	double percentage_lagged = 0.0f;
 	double percentage_dropped = 0.0f;
 
-	if (total)
-		percentage_dropped = (double)dropped / (double)total * 100.0;
+	if (encoded)
+		percentage_dropped = (double)dropped / (double)encoded * 100.0;
 	if (drawn)
 		percentage_lagged = (double)lagged  / (double)drawn * 100.0;
 
 	blog(LOG_INFO, "Output '%s': stopping", output->context.name);
 	blog(LOG_INFO, "Output '%s': Total encoded frames: %"PRIu32,
-			output->context.name, total);
+			output->context.name, encoded);
 	blog(LOG_INFO, "Output '%s': Total drawn frames: %"PRIu32,
 			output->context.name, drawn);
 
@@ -311,7 +318,7 @@ static void log_frame_info(struct obs_output *output)
 				"to rendering lag/stalls: %"PRIu32" (%0.1f%%)",
 				output->context.name,
 				lagged, percentage_lagged);
-	if (total && dropped)
+	if (encoded && dropped)
 		blog(LOG_INFO, "Output '%s': Number of dropped frames due "
 				"to insufficient bandwidth/connection stalls: "
 				"%d (%0.1f%%)",