mirror of
https://github.com/obsproject/obs-studio.git
synced 2024-09-20 04:42:18 +02:00
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.
This commit is contained in:
parent
be2b0d1398
commit
64074e9fda
@ -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;
|
||||
|
@ -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,
|
||||
|
Loading…
Reference in New Issue
Block a user