Handle source discontinuities and reject stale device epochs
This commit is contained in:
1 parent
9aba8e278c
commit
7bac999d93
3 files changed
+30
-9
No files matched your search
@@ -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;
|
||||
|
||||
Reference in new issue
Block a user