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.
This commit is contained in:
jp9000 2019-02-05 17:32:25 -08:00
parent 36ffa65b68
commit cd1607ca6e
2 changed files with 40 additions and 32 deletions

View File

@ -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);
}

View File

@ -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);
/* ------------------------------------------------------------------------- */