Răsfoiți Sursa

libobs: Split do_encode in to two funcs

This splits the "do_encode" function in to "do_encode" and
"send_off_encoder_packet", the latter of which allows the ability for
texture-based encoders to manage their own encoding and just simply send
off a packet to the outputs.
jp9000 6 ani în urmă
părinte
comite
cd1607ca6e
2 a modificat fișierele cu 36 adăugiri și 28 ștergeri
  1. 32 28
      libobs/obs-encoder.c
  2. 4 0
      libobs/obs-internal.h

+ 32 - 28
libobs/obs-encoder.c

@@ -823,59 +823,63 @@ static void full_stop(struct obs_encoder *encoder)
 	}
 }
 
-static const char *do_encode_name = "do_encode";
-static inline void do_encode(struct obs_encoder *encoder,
-		struct encoder_frame *frame)
+void send_off_encoder_packet(obs_encoder_t *encoder, bool success,
+		bool received, struct encoder_packet *pkt)
 {
-	profile_start(do_encode_name);
-	if (!encoder->profile_encoder_encode_name)
-		encoder->profile_encoder_encode_name =
-			profile_store_name(obs_get_profiler_name_store(),
-					"encode(%s)", encoder->context.name);
-
-	struct encoder_packet pkt = {0};
-	bool received = false;
-	bool success;
-
-	pkt.timebase_num = encoder->timebase_num;
-	pkt.timebase_den = encoder->timebase_den;
-	pkt.encoder = encoder;
-
-	profile_start(encoder->profile_encoder_encode_name);
-	success = encoder->info.encode(encoder->context.data, frame, &pkt,
-			&received);
-	profile_end(encoder->profile_encoder_encode_name);
 	if (!success) {
 		full_stop(encoder);
 		blog(LOG_ERROR, "Error encoding with encoder '%s'",
 				encoder->context.name);
-		goto error;
+		return;
 	}
 
 	if (received) {
 		if (!encoder->first_received) {
-			encoder->offset_usec = packet_dts_usec(&pkt);
+			encoder->offset_usec = packet_dts_usec(pkt);
 			encoder->first_received = true;
 		}
 
 		/* we use system time here to ensure sync with other encoders,
 		 * you do not want to use relative timestamps here */
-		pkt.dts_usec = encoder->start_ts / 1000 +
-			packet_dts_usec(&pkt) - encoder->offset_usec;
-		pkt.sys_dts_usec = pkt.dts_usec;
+		pkt->dts_usec = encoder->start_ts / 1000 +
+			packet_dts_usec(pkt) - encoder->offset_usec;
+		pkt->sys_dts_usec = pkt->dts_usec;
 
 		pthread_mutex_lock(&encoder->callbacks_mutex);
 
 		for (size_t i = encoder->callbacks.num; i > 0; i--) {
 			struct encoder_callback *cb;
 			cb = encoder->callbacks.array+(i-1);
-			send_packet(encoder, cb, &pkt);
+			send_packet(encoder, cb, pkt);
 		}
 
 		pthread_mutex_unlock(&encoder->callbacks_mutex);
 	}
+}
+
+static const char *do_encode_name = "do_encode";
+void do_encode(struct obs_encoder *encoder, struct encoder_frame *frame)
+{
+	profile_start(do_encode_name);
+	if (!encoder->profile_encoder_encode_name)
+		encoder->profile_encoder_encode_name =
+			profile_store_name(obs_get_profiler_name_store(),
+					"encode(%s)", encoder->context.name);
+
+	struct encoder_packet pkt = {0};
+	bool received = false;
+	bool success;
+
+	pkt.timebase_num = encoder->timebase_num;
+	pkt.timebase_den = encoder->timebase_den;
+	pkt.encoder = encoder;
+
+	profile_start(encoder->profile_encoder_encode_name);
+	success = encoder->info.encode(encoder->context.data, frame, &pkt,
+			&received);
+	profile_end(encoder->profile_encoder_encode_name);
+	send_off_encoder_packet(encoder, success, received, &pkt);
 
-error:
 	profile_end(do_encode_name);
 }
 

+ 4 - 0
libobs/obs-internal.h

@@ -1015,6 +1015,10 @@ extern void obs_encoder_add_output(struct obs_encoder *encoder,
 extern void obs_encoder_remove_output(struct obs_encoder *encoder,
 		struct obs_output *output);
 
+extern void do_encode(struct obs_encoder *encoder, struct encoder_frame *frame);
+extern void send_off_encoder_packet(obs_encoder_t *encoder, bool success,
+		bool received, struct encoder_packet *pkt);
+
 void obs_encoder_destroy(obs_encoder_t *encoder);
 
 /* ------------------------------------------------------------------------- */