void JitterHistory::frame_arrived(steady_clock::time_point now, int64_t frame_duration, size_t dropped_frames)
{
+ if (frame_duration != last_duration) {
+ // If the frame rate changed, the input clock is also going to change,
+ // so our historical data doesn't make much sense anymore.
+ // Also, format changes typically introduce blips that are not representative
+ // of the typical frame stream. (We make the assumption that format changes
+ // don't happen all the time in regular use; if they did, we should probably
+ // rather keep the history so that we take jitter they may introduce into account.)
+ clear();
+ last_duration = frame_duration;
+ }
if (expected_timestamp > steady_clock::time_point::min()) {
expected_timestamp += dropped_frames * nanoseconds(frame_duration * 1000000000 / TIMEBASE);
double jitter_seconds = fabs(duration<double>(expected_timestamp - now).count());
}
void QueueLengthPolicy::update_policy(steady_clock::time_point now,
- steady_clock::time_point expected_next_frame,
+ steady_clock::time_point expected_next_input_frame,
int64_t input_frame_duration,
int64_t master_frame_duration,
double max_input_card_jitter_seconds,
// Figure out when we can expect the next frame for this card, assuming
// worst-case jitter (ie., the frame is maximally late).
- double seconds_until_next_frame = max(duration<double>(expected_next_frame - now).count() + max_input_card_jitter_seconds, 0.0);
+ double seconds_until_next_frame = max(duration<double>(expected_next_input_frame - now).count() + max_input_card_jitter_seconds, 0.0);
// How many times are the master card expected to tick in that time?
// We assume the master clock has worst-case jitter but not any rate
if (global_flags.srt_port >= 0) {
// There's seemingly no other reasonable way to wake up the thread
// (libsrt's epoll equivalent is busy-waiting).
- int sock = srt_socket(AF_INET6, 0, 0);
+ int sock = srt_create_socket();
if (sock != -1) {
sockaddr_in6 addr;
memset(&addr, 0, sizeof(addr));
#ifdef HAVE_SRT
void Mixer::start_srt()
{
- SRTSOCKET sock = srt_socket(AF_INET6, 0, 0);
+ SRTSOCKET sock = srt_create_socket();
sockaddr_in6 addr;
memset(&addr, 0, sizeof(addr));
addr.sin6_family = AF_INET6;