Bladeren bron

libobs: Make internal version of remove encoder

John Bradley 3 jaren geleden
bovenliggende
commit
d70171daa6
3 gewijzigde bestanden met toevoegingen van 21 en 4 verwijderingen
  1. 3 1
      libobs/obs-encoder.c
  2. 3 0
      libobs/obs-internal.h
  3. 15 3
      libobs/obs-output.c

+ 3 - 1
libobs/obs-encoder.c

@@ -245,7 +245,9 @@ static void obs_encoder_actually_destroy(obs_encoder_t *encoder)
 		pthread_mutex_lock(&encoder->outputs_mutex);
 		for (size_t i = 0; i < encoder->outputs.num; i++) {
 			struct obs_output *output = encoder->outputs.array[i];
-			obs_output_remove_encoder(output, encoder);
+			// This happens while the output is still "active", so
+			// remove without checking active
+			obs_output_remove_encoder_internal(output, encoder);
 		}
 		da_free(encoder->outputs);
 		pthread_mutex_unlock(&encoder->outputs_mutex);

+ 3 - 0
libobs/obs-internal.h

@@ -1265,3 +1265,6 @@ extern bool obs_service_initialize(struct obs_service *service,
 				   struct obs_output *output);
 
 void obs_service_destroy(obs_service_t *service);
+
+void obs_output_remove_encoder_internal(struct obs_output *output,
+					struct obs_encoder *encoder);

+ 15 - 3
libobs/obs-output.c

@@ -792,10 +792,10 @@ size_t obs_output_get_mixers(const obs_output_t *output)
 		       : 0;
 }
 
-void obs_output_remove_encoder(struct obs_output *output,
-			       struct obs_encoder *encoder)
+void obs_output_remove_encoder_internal(struct obs_output *output,
+					struct obs_encoder *encoder)
 {
-	if (!obs_output_valid(output, "obs_output_remove_encoder"))
+	if (!obs_output_valid(output, "obs_output_remove_encoder_internal"))
 		return;
 
 	if (output->video_encoder == encoder) {
@@ -808,6 +808,18 @@ void obs_output_remove_encoder(struct obs_output *output,
 	}
 }
 
+void obs_output_remove_encoder(struct obs_output *output,
+			       struct obs_encoder *encoder)
+{
+	if (!obs_output_valid(output, "obs_output_remove_encoder"))
+		return;
+	if (active(output)) {
+		return;
+	}
+
+	obs_output_remove_encoder_internal(output, encoder);
+}
+
 void obs_output_set_video_encoder(obs_output_t *output, obs_encoder_t *encoder)
 {
 	if (!obs_output_valid(output, "obs_output_set_video_encoder"))