Răsfoiți Sursa

Fix one minor bug with new timing code

When the first async video frame is used it would not set audio timing,
moved that code into obs_source_getframe.  Also, might consider renaming
obs_source_getframe.  "Query frame" instead perhaps?  Will sleep on it,
might not even bother.
jp9000 11 ani în urmă
părinte
comite
02a101d1e8
1 a modificat fișierele cu 13 adăugiri și 13 ștergeri
  1. 13 13
      libobs/obs-source.c

+ 13 - 13
libobs/obs-source.c

@@ -894,19 +894,18 @@ static inline bool frame_out_of_bounds(obs_source_t source, uint64_t ts)
 }
 
 static inline struct source_frame *get_closest_frame(obs_source_t source,
-		uint64_t sys_time)
+		uint64_t sys_time, int *audio_time_refs)
 {
 	struct source_frame *next_frame = source->video_frames.array[0];
 	struct source_frame *frame      = NULL;
 	uint64_t sys_offset = sys_time - source->last_sys_timestamp;
 	uint64_t frame_time = next_frame->timestamp;
 	uint64_t frame_offset = 0;
-	int      audio_time_refs = 0;
 
 	/* account for timestamp invalidation */
 	if (frame_out_of_bounds(source, frame_time)) {
 		source->last_frame_ts = next_frame->timestamp;
-		audio_time_refs++;
+		(*audio_time_refs)++;
 	} else {
 		frame_offset = frame_time - source->last_frame_ts;
 		source->last_frame_ts += sys_offset;
@@ -927,20 +926,13 @@ static inline struct source_frame *get_closest_frame(obs_source_t source,
 		if ((next_frame->timestamp - frame_time) > MAX_TIMESTAMP_JUMP) {
 			source->last_frame_ts =
 				next_frame->timestamp - frame_offset;
-			audio_time_refs++;
+			(*audio_time_refs)++;
 		}
 
 		frame_time   = next_frame->timestamp;
 		frame_offset = frame_time - source->last_frame_ts;
 	}
 
-	/* reset timing to current system time */
-	if (frame) {
-		source->timing_adjust = sys_time - frame->timestamp;
-		source->audio_reset_ref += audio_time_refs;
-		source->timing_set = true;
-	}
-
 	return frame;
 }
 
@@ -952,8 +944,9 @@ static inline struct source_frame *get_closest_frame(obs_source_t source,
  */
 struct source_frame *obs_source_getframe(obs_source_t source)
 {
-	uint64_t last_frame_time = source->last_frame_ts;
 	struct source_frame *frame = NULL;
+	uint64_t last_frame_time = source->last_frame_ts;
+	int      audio_time_refs = 0;
 	uint64_t sys_time;
 
 	pthread_mutex_lock(&source->video_mutex);
@@ -969,7 +962,14 @@ struct source_frame *obs_source_getframe(obs_source_t source)
 
 		source->last_frame_ts = frame->timestamp;
 	} else {
-		frame = get_closest_frame(source, sys_time);
+		frame = get_closest_frame(source, sys_time, &audio_time_refs);
+	}
+
+	/* reset timing to current system time */
+	if (frame) {
+		source->audio_reset_ref += audio_time_refs;
+		source->timing_adjust = sys_time - frame->timestamp;
+		source->timing_set = true;
 	}
 
 	source->last_sys_timestamp = sys_time;