X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=nageru%2Fmixer.cpp;h=ce8a73237fd4a838ee85ca0c307663d6e3c9edda;hb=0f5b8fd8420a450f5994d5f535fdce84dbb10093;hp=01f6abede373918a723629b9ccc0d379cd6911bc;hpb=30c0b7ebd9954339486f1286b82df4776e1bc9b4;p=nageru diff --git a/nageru/mixer.cpp b/nageru/mixer.cpp index 01f6abe..ce8a732 100644 --- a/nageru/mixer.cpp +++ b/nageru/mixer.cpp @@ -234,6 +234,16 @@ void JitterHistory::unregister_metrics(const vector> &label 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(expected_timestamp - now).count()); @@ -277,7 +287,7 @@ void QueueLengthPolicy::unregister_metrics(const vector> &l } 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, @@ -288,7 +298,7 @@ void QueueLengthPolicy::update_policy(steady_clock::time_point now, // 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(expected_next_frame - now).count() + max_input_card_jitter_seconds, 0.0); + double seconds_until_next_frame = max(duration(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