Browse Source

libobs: Try to pair video with one multi-track encoders

When starting a multi-track output, attempt to pair the video encoder
with one of the audio encoders to ensure that the video and audio
encoders start as close together in time as possible.  This ensures the
best possible audio/video syncing point when using multi-track audio
output.
jp9000 9 years ago
parent
commit
a7067906f3
1 changed files with 20 additions and 11 deletions
  1. 20 11
      libobs/obs-output.c

+ 20 - 11
libobs/obs-output.c

@@ -1384,12 +1384,26 @@ static inline bool initialize_audio_encoders(obs_output_t *output,
 	return true;
 }
 
-static inline bool pair_encoders(obs_output_t *output, size_t num_mixes)
+static inline obs_encoder_t *find_inactive_audio_encoder(obs_output_t *output,
+		size_t num_mixes)
+{
+	for (size_t i = 0; i < num_mixes; i++) {
+		struct obs_encoder *audio = output->audio_encoders[i];
+
+		if (!audio->active && !audio->paired_encoder)
+			return audio;
+	}
+
+	return NULL;
+}
+
+static inline void pair_encoders(obs_output_t *output, size_t num_mixes)
 {
-	if (num_mixes == 1) {
-		struct obs_encoder *audio = output->audio_encoders[0];
-		struct obs_encoder *video = output->video_encoder;
+	struct obs_encoder *video = output->video_encoder;
+	struct obs_encoder *audio = find_inactive_audio_encoder(output,
+			num_mixes);
 
+	if (video && audio) {
 		pthread_mutex_lock(&audio->init_mutex);
 		pthread_mutex_lock(&video->init_mutex);
 
@@ -1406,8 +1420,6 @@ static inline bool pair_encoders(obs_output_t *output, size_t num_mixes)
 		pthread_mutex_unlock(&video->init_mutex);
 		pthread_mutex_unlock(&audio->init_mutex);
 	}
-
-	return true;
 }
 
 bool obs_output_initialize_encoders(obs_output_t *output, uint32_t flags)
@@ -1432,11 +1444,8 @@ bool obs_output_initialize_encoders(obs_output_t *output, uint32_t flags)
 	if (has_audio && !initialize_audio_encoders(output, num_mixes))
 		return false;
 
-	if (has_video && has_audio) {
-		if (!pair_encoders(output, num_mixes)) {
-			return false;
-		}
-	}
+	if (has_video && has_audio)
+		pair_encoders(output, num_mixes);
 
 	return true;
 }