|
@@ -823,59 +823,63 @@ static void full_stop(struct obs_encoder *encoder)
|
|
|
}
|
|
|
}
|
|
|
|
|
|
-static const char *do_encode_name = "do_encode";
|
|
|
-static inline void do_encode(struct obs_encoder *encoder,
|
|
|
- struct encoder_frame *frame)
|
|
|
+void send_off_encoder_packet(obs_encoder_t *encoder, bool success,
|
|
|
+ bool received, struct encoder_packet *pkt)
|
|
|
{
|
|
|
- profile_start(do_encode_name);
|
|
|
- if (!encoder->profile_encoder_encode_name)
|
|
|
- encoder->profile_encoder_encode_name =
|
|
|
- profile_store_name(obs_get_profiler_name_store(),
|
|
|
- "encode(%s)", encoder->context.name);
|
|
|
-
|
|
|
- struct encoder_packet pkt = {0};
|
|
|
- bool received = false;
|
|
|
- bool success;
|
|
|
-
|
|
|
- pkt.timebase_num = encoder->timebase_num;
|
|
|
- pkt.timebase_den = encoder->timebase_den;
|
|
|
- pkt.encoder = encoder;
|
|
|
-
|
|
|
- profile_start(encoder->profile_encoder_encode_name);
|
|
|
- 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;
|
|
|
+ return;
|
|
|
}
|
|
|
|
|
|
if (received) {
|
|
|
if (!encoder->first_received) {
|
|
|
- encoder->offset_usec = packet_dts_usec(&pkt);
|
|
|
+ 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;
|
|
|
+ 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);
|
|
|
+ send_packet(encoder, cb, pkt);
|
|
|
}
|
|
|
|
|
|
pthread_mutex_unlock(&encoder->callbacks_mutex);
|
|
|
}
|
|
|
+}
|
|
|
+
|
|
|
+static const char *do_encode_name = "do_encode";
|
|
|
+void do_encode(struct obs_encoder *encoder, struct encoder_frame *frame)
|
|
|
+{
|
|
|
+ profile_start(do_encode_name);
|
|
|
+ if (!encoder->profile_encoder_encode_name)
|
|
|
+ encoder->profile_encoder_encode_name =
|
|
|
+ profile_store_name(obs_get_profiler_name_store(),
|
|
|
+ "encode(%s)", encoder->context.name);
|
|
|
+
|
|
|
+ struct encoder_packet pkt = {0};
|
|
|
+ bool received = false;
|
|
|
+ bool success;
|
|
|
+
|
|
|
+ pkt.timebase_num = encoder->timebase_num;
|
|
|
+ pkt.timebase_den = encoder->timebase_den;
|
|
|
+ pkt.encoder = encoder;
|
|
|
+
|
|
|
+ profile_start(encoder->profile_encoder_encode_name);
|
|
|
+ success = encoder->info.encode(encoder->context.data, frame, &pkt,
|
|
|
+ &received);
|
|
|
+ profile_end(encoder->profile_encoder_encode_name);
|
|
|
+ send_off_encoder_packet(encoder, success, received, &pkt);
|
|
|
|
|
|
-error:
|
|
|
profile_end(do_encode_name);
|
|
|
}
|
|
|
|