diff --git a/libobs/obs-encoder.c b/libobs/obs-encoder.c index 0054e3127..a389227bf 100644 --- a/libobs/obs-encoder.c +++ b/libobs/obs-encoder.c @@ -262,6 +262,10 @@ static void maybe_set_up_gpu_rescale(struct obs_encoder *encoder) if (!current_mix) return; + /* Store original video_t so it can be restored if scaling is disabled. */ + if (!current_mix->encoder_only_mix) + encoder->original_video = encoder->media; + pthread_mutex_lock(&obs->video.mixes_mutex); for (size_t i = 0; i < obs->video.mixes.num; i++) { struct obs_core_video_mix *current = obs->video.mixes.array[i]; @@ -687,7 +691,7 @@ static void maybe_clear_encoder_core_video_mix(obs_encoder_t *encoder) if (!mix->encoder_only_mix) break; - encoder_set_video(encoder, obs_get_video()); + encoder_set_video(encoder, encoder->original_video); mix->encoder_refs -= 1; if (mix->encoder_refs == 0) { da_erase(obs->video.mixes, i); diff --git a/libobs/obs-internal.h b/libobs/obs-internal.h index aad8e22b1..d88093eec 100644 --- a/libobs/obs-internal.h +++ b/libobs/obs-internal.h @@ -1427,6 +1427,8 @@ struct obs_encoder { /* stores the video/audio media output pointer. video_t *or audio_t **/ void *media; + /* Stores the original video if GPU scaling is enabled and `media` can be overwritten. */ + video_t *original_video; pthread_mutex_t callbacks_mutex; DARRAY(struct encoder_callback) callbacks;