Sfoglia il codice sorgente

libobs: Restore original video_t for encoders when GPU scaling is used

Dennis Sädtler 1 settimana fa
parent
commit
4d7776fc3b
2 ha cambiato i file con 7 aggiunte e 1 eliminazioni
  1. 5 1
      libobs/obs-encoder.c
  2. 2 0
      libobs/obs-internal.h

+ 5 - 1
libobs/obs-encoder.c

@@ -262,6 +262,10 @@ static void maybe_set_up_gpu_rescale(struct obs_encoder *encoder)
 	if (!current_mix)
 	if (!current_mix)
 		return;
 		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);
 	pthread_mutex_lock(&obs->video.mixes_mutex);
 	for (size_t i = 0; i < obs->video.mixes.num; i++) {
 	for (size_t i = 0; i < obs->video.mixes.num; i++) {
 		struct obs_core_video_mix *current = obs->video.mixes.array[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)
 		if (!mix->encoder_only_mix)
 			break;
 			break;
 
 
-		encoder_set_video(encoder, obs_get_video());
+		encoder_set_video(encoder, encoder->original_video);
 		mix->encoder_refs -= 1;
 		mix->encoder_refs -= 1;
 		if (mix->encoder_refs == 0) {
 		if (mix->encoder_refs == 0) {
 			da_erase(obs->video.mixes, i);
 			da_erase(obs->video.mixes, i);

+ 2 - 0
libobs/obs-internal.h

@@ -1427,6 +1427,8 @@ struct obs_encoder {
 
 
 	/* stores the video/audio media output pointer.  video_t *or audio_t **/
 	/* stores the video/audio media output pointer.  video_t *or audio_t **/
 	void *media;
 	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;
 	pthread_mutex_t callbacks_mutex;
 	DARRAY(struct encoder_callback) callbacks;
 	DARRAY(struct encoder_callback) callbacks;