Browse Source

Add counting of total video frames to outputs

Before it would assign the encoder/media callbacks directly to the
output's callbacks, so instead of doing that, it now goes through
intermediary functions for the sake of counting the frames.
jp9000 11 years ago
parent
commit
64074e9fda
2 changed files with 31 additions and 16 deletions
  1. 2 0
      libobs/obs-internal.h
  2. 29 16
      libobs/obs-output.c

+ 2 - 0
libobs/obs-internal.h

@@ -366,6 +366,8 @@ struct obs_output {
 	os_event_t                      reconnect_stop_event;
 	volatile bool                   reconnect_thread_active;
 
+	int                             total_frames;
+
 	bool                            active;
 	video_t                         video;
 	audio_t                         audio;

+ 29 - 16
libobs/obs-output.c

@@ -464,6 +464,9 @@ static inline void send_interleaved(struct obs_output *output)
 	if (!has_higher_opposing_ts(output, &out))
 		return;
 
+	if (out.type == OBS_ENCODER_VIDEO)
+		output->total_frames++;
+
 	da_erase(output->interleaved_packets, 0);
 	output->info.encoded_packet(output->context.data, &out);
 	obs_free_encoder_packet(&out);
@@ -510,11 +513,26 @@ static void interleave_packets(void *data, struct encoder_packet *packet)
 	pthread_mutex_unlock(&output->interleaved_mutex);
 }
 
+static void default_encoded_callback(void *param, struct encoder_packet *packet)
+{
+	struct obs_output *output = param;
+	output->info.encoded_packet(output->context.data, packet);
+
+	if (packet->type == OBS_ENCODER_VIDEO)
+		output->total_frames++;
+}
+
+static void default_raw_video_callback(void *param, struct video_data *frame)
+{
+	struct obs_output *output = param;
+	output->info.raw_video(output->context.data, frame);
+	output->total_frames++;
+}
+
 static void hook_data_capture(struct obs_output *output, bool encoded,
 		bool has_video, bool has_audio)
 {
 	void (*encoded_callback)(void *data, struct encoder_packet *packet);
-	void *param;
 
 	if (encoded) {
 		output->received_video   = false;
@@ -524,22 +542,19 @@ static void hook_data_capture(struct obs_output *output, bool encoded,
 		free_packets(output);
 
 		encoded_callback = (has_video && has_audio) ?
-			interleave_packets : output->info.encoded_packet;
-		param = (has_video && has_audio) ?
-			output : output->context.data;
+			interleave_packets : default_encoded_callback;
 
 		if (has_video)
 			obs_encoder_start(output->video_encoder,
-					encoded_callback, param);
+					encoded_callback, output);
 		if (has_audio)
 			obs_encoder_start(output->audio_encoder,
-					encoded_callback, param);
+					encoded_callback, output);
 	} else {
 		if (has_video)
 			video_output_connect(output->video,
 					get_video_conversion(output),
-					output->info.raw_video,
-					output->context.data);
+					default_raw_video_callback, output);
 		if (has_audio)
 			audio_output_connect(output->audio,
 					get_audio_conversion(output),
@@ -646,6 +661,8 @@ bool obs_output_begin_data_capture(obs_output_t output, uint32_t flags)
 	if (!output) return false;
 	if (output->active) return false;
 
+	output->total_frames   = 0;
+
 	convert_flags(output, flags, &encoded, &has_video, &has_audio,
 			&has_service);
 
@@ -674,7 +691,6 @@ void obs_output_end_data_capture(obs_output_t output)
 {
 	bool encoded, has_video, has_audio, has_service;
 	void (*encoded_callback)(void *data, struct encoder_packet *packet);
-	void *param;
 
 	if (!output) return;
 	if (!output->active) return;
@@ -684,21 +700,18 @@ void obs_output_end_data_capture(obs_output_t output)
 
 	if (encoded) {
 		encoded_callback = (has_video && has_audio) ?
-			interleave_packets : output->info.encoded_packet;
-		param = (has_video && has_audio) ?
-			output : output->context.data;
+			interleave_packets : default_encoded_callback;
 
 		if (has_video)
 			obs_encoder_stop(output->video_encoder,
-					encoded_callback, param);
+					encoded_callback, output);
 		if (has_audio)
 			obs_encoder_stop(output->audio_encoder,
-					encoded_callback, param);
+					encoded_callback, output);
 	} else {
 		if (has_video)
 			video_output_disconnect(output->video,
-					output->info.raw_video,
-					output->context.data);
+					default_raw_video_callback, output);
 		if (has_audio)
 			audio_output_disconnect(output->audio,
 					output->info.raw_audio,