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:
parent
36ffa65b68
commit
cd1607ca6e
@ -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);
|
||||
}
|
||||
|
||||
|
@ -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);
|
||||
|
||||
/* ------------------------------------------------------------------------- */
|
||||
|
Loading…
x
Reference in New Issue
Block a user