From a7067906f33be91447ae2540b4f5efa34f2662f2 Mon Sep 17 00:00:00 2001 From: jp9000 Date: Sat, 30 Jan 2016 12:47:53 -0800 Subject: [PATCH] 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. --- libobs/obs-output.c | 31 ++++++++++++++++++++----------- 1 file changed, 20 insertions(+), 11 deletions(-) diff --git a/libobs/obs-output.c b/libobs/obs-output.c index 502f28f3b..f7a67afdc 100644 --- a/libobs/obs-output.c +++ b/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) { - if (num_mixes == 1) { - struct obs_encoder *audio = output->audio_encoders[0]; - struct obs_encoder *video = output->video_encoder; + 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) +{ + 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; }