static inline void do_encode(struct obs_encoder *encoder, struct encoder_frame *frame) { struct encoder_packet pkt = {0}; bool received = false; bool success; pkt.timebase_num = encoder->timebase_num; pkt.timebase_den = encoder->timebase_den; success = encoder->info.encode(encoder->context.data, frame, &pkt, &received); if (!success) { full_stop(encoder); blog(LOG_ERROR, "Error encoding with encoder '%s'", encoder->context.name); return; } if (received) { /* 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); pthread_mutex_lock(&encoder->callbacks_mutex); for (size_t i = 0; i < encoder->callbacks.num; i++) { struct encoder_callback *cb; cb = encoder->callbacks.array+i; send_packet(encoder, cb, &pkt); } pthread_mutex_unlock(&encoder->callbacks_mutex); } }
static inline 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); if (!success) { full_stop(encoder); blog(LOG_ERROR, "Error encoding with encoder '%s'", encoder->context.name); goto error; } 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); }