Преглед на файлове

libobs: Shut down encoder when not in use

This prevents encoders (hardware encoders in particular) from being
continually active when all outputs disconnect from an encoder.  This is
mostly just a temporary measure; the encoding interface may need a bit
of a redesign.  It will also definitely needs to be able to flush at
some point.  Currently when an output is stopped, the pending data is
discarded, which needs to be fixed.
jp9000 преди 10 години
родител
ревизия
fa7286f84c
променени са 2 файла, в които са добавени 11 реда и са изтрити 2 реда
  1. 10 2
      libobs/obs-encoder.c
  2. 1 0
      libobs/obs-internal.h

+ 10 - 2
libobs/obs-encoder.c

@@ -197,6 +197,7 @@ static void remove_connection(struct obs_encoder *encoder)
 		video_output_disconnect(encoder->media, receive_video,
 				encoder);
 
+	obs_encoder_shutdown(encoder);
 	encoder->active = false;
 }
 
@@ -368,9 +369,8 @@ bool obs_encoder_initialize(obs_encoder_t *encoder)
 
 	if (encoder->active)
 		return true;
-
 	if (encoder->context.data)
-		encoder->info.destroy(encoder->context.data);
+		return false;
 
 	if (encoder->info.create)
 		encoder->context.data = encoder->info.create(
@@ -387,6 +387,14 @@ bool obs_encoder_initialize(obs_encoder_t *encoder)
 	return true;
 }
 
+void obs_encoder_shutdown(obs_encoder_t *encoder)
+{
+	if (encoder->context.data) {
+		encoder->info.destroy(encoder->context.data);
+		encoder->context.data = NULL;
+	}
+}
+
 static inline size_t get_callback_idx(
 		const struct obs_encoder *encoder,
 		void (*new_packet)(void *param, struct encoder_packet *packet),

+ 1 - 0
libobs/obs-internal.h

@@ -770,6 +770,7 @@ struct obs_encoder {
 extern struct obs_encoder_info *find_encoder(const char *id);
 
 extern bool obs_encoder_initialize(obs_encoder_t *encoder);
+extern void obs_encoder_shutdown(obs_encoder_t *encoder);
 
 extern void obs_encoder_start(obs_encoder_t *encoder,
 		void (*new_packet)(void *param, struct encoder_packet *packet),