Handle source discontinuities and reject stale device epochs

This commit is contained in:
evgeny committed 2026-10-14 19:27:54 +02:00
1 parent 9aba8e278c
commit 7bac999d93
3 files changed
+30 -9

No files matched your search

+11 -1
View File
@@ -32,6 +32,8 @@ struct call_jitter {
call_capture_time timing[CALL_JITTER_MAX_FRAMES];
CallTimeline timeline;
uint64_t playback_epoch = 1;
uint64_t source_epoch = 0;
int64_t capture_end = INT64_MIN;
int head = 0, count = 0;
uint32_t dropped = 0, underruns = 0;
call_jitter_diagnostics diagnostics{};
@@ -168,7 +170,14 @@ int call_jitter_pull(struct call_jitter* j, int16_t* out, int max_samples) {
}
for (int i = 0; i < n; i++) j->input[i] = j->pcm[i] / 32768.0f;
int64_t pts = timing.pts_us == INT64_MIN ? INT64_MIN : timing.pts_us - (int64_t)timing.delay_samples * 1000000 / kSampleRate;
j->timeline.feed(pts, (unsigned)n, timing.epoch);
bool discontinuity = j->source_epoch != timing.epoch || (timing.pts_us != INT64_MIN && j->capture_end != INT64_MIN
&& (timing.pts_us < j->capture_end - 2000 || timing.pts_us > j->capture_end + 2000));
unsigned prefix = discontinuity ? std::min((unsigned)n, timing.delay_samples) : 0;
if (prefix) j->timeline.feed(INT64_MIN, prefix, timing.epoch);
if (prefix < (unsigned)n) j->timeline.feed(pts == INT64_MIN ? pts : pts + prefix * 1000000ll / kSampleRate,
n - prefix, timing.epoch);
j->source_epoch = timing.epoch;
j->capture_end = timing.pts_us == INT64_MIN ? INT64_MIN : timing.pts_us + n * 1000000ll / kSampleRate;
j->st.putSamples(j->input, (uint)n);
}
j->output.resize((size_t)max_samples);
@@ -231,6 +240,7 @@ void call_jitter_reset(struct call_jitter* j) {
j->dropped += discard;
j->st.clear(); j->st.setTempo(1.0);
j->timeline.reset(++j->playback_epoch);
j->source_epoch = 0; j->capture_end = INT64_MIN;
j->primed = false; j->catching_up = false;
j->tempo = 1.0; j->ema_ms = j->arrival_window.reserve;
j->processing_ms = 0; j->tempo_x100 = 100;