From cd1607ca6ecf7dc5ba988b71dd3858e0746d827e Mon Sep 17 00:00:00 2001 From: jp9000 Date: Tue, 5 Feb 2019 17:32:25 -0800 Subject: [PATCH] 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. --- libobs/obs-encoder.c | 68 +++++++++++++++++++++++-------------------- libobs/obs-internal.h | 4 +++ 2 files changed, 40 insertions(+), 32 deletions(-) diff --git a/libobs/obs-encoder.c b/libobs/obs-encoder.c index 84ba447ad..e242a5ebd 100644 --- a/libobs/obs-encoder.c +++ b/libobs/obs-encoder.c @@ -823,9 +823,42 @@ static void full_stop(struct obs_encoder *encoder) } } +void send_off_encoder_packet(obs_encoder_t *encoder, bool success, + bool received, struct encoder_packet *pkt) +{ + if (!success) { + full_stop(encoder); + blog(LOG_ERROR, "Error encoding with encoder '%s'", + encoder->context.name); + return; + } + + if (received) { + if (!encoder->first_received) { + 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; + + 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); + } + + pthread_mutex_unlock(&encoder->callbacks_mutex); + } +} + static const char *do_encode_name = "do_encode"; -static inline void do_encode(struct obs_encoder *encoder, - struct encoder_frame *frame) +void do_encode(struct obs_encoder *encoder, struct encoder_frame *frame) { profile_start(do_encode_name); if (!encoder->profile_encoder_encode_name) @@ -845,37 +878,8 @@ static inline void do_encode(struct obs_encoder *encoder, 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; - } + send_off_encoder_packet(encoder, success, received, &pkt); - if (received) { - if (!encoder->first_received) { - 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; - - 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); - } - - pthread_mutex_unlock(&encoder->callbacks_mutex); - } - -error: profile_end(do_encode_name); } diff --git a/libobs/obs-internal.h b/libobs/obs-internal.h index 29bd358b5..d401a5130 100644 --- a/libobs/obs-internal.h +++ b/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); /* ------------------------------------------------------------------------- */