Browse Source

Specify jitter reserve at startup and expose delay diagnostics

master
evgeny 5 days ago
parent
commit
c1cc3c459b
  1. 6
      src/call/call_jitter.h
  2. 7
      tools/chatgui/tests/test_call_jitter.cpp

6
src/call/call_jitter.h

@ -9,7 +9,8 @@ extern "C" {
#endif
/* Звонок: FIFO Opus, запас 20мс..max_reserve_ms по изменению задержки доставки за 10 секунд и догон после паузы устройства.
* push — сетевой поток, pull/decode/SoundTouch — единственный аудиопоток.
* push — сетевой поток, pull/decode/CallDelay — единственный аудиопоток.
* Старт/восстановление ждут запас плюс запрошенный блок; при выдаче PCM запас не резервируется повторно.
* destroy — после остановки обоих потребителей. get_stats — любой поток. */
#define CALL_JITTER_FRAME_MS 20
#define CALL_JITTER_MIN_RESERVE_MS 20
@ -24,6 +25,9 @@ struct call_jitter_diagnostics {
int encoded_ms, processing_ms, pcm_samples;
int64_t arrival_spread_ms;
uint32_t underruns;
int delay_mode, tempo_ppm;
unsigned phase_samples;
uint64_t cut_samples, stretch_entries, stretch_exits;
};
/* Снимок и сброс событий под mutex; логировать после выхода из mutex голосового стека. */
void call_jitter_get_diagnostics(struct call_jitter*, struct call_jitter_diagnostics*, int reset_events);

7
tools/chatgui/tests/test_call_jitter.cpp

@ -123,7 +123,7 @@ int main() {
decoder d;
auto* j = call_jitter_create(decode, &d, 1000);
CHECK(j);
push(j, 0); // 20мс достаточно для допуска в decoder, но SoundTouch ещё накапливает PCM.
push(j, 0); // Сохраняем запас 20мс после первого блока, а не расходуем его при старте.
CHECK(call_jitter_pull(j, pcm, 480) == 0);
push(j, 1);
CHECK(call_jitter_pull(j, pcm, 480) > 0);
@ -159,7 +159,10 @@ int main() {
for (size_t i = 0; i < d.seen.size(); i++) CHECK(d.seen[i] == (int)i);
for (int i = 0; i < 100; i++) call_jitter_pull(j, pcm, 480);
size_t before = d.seen.size();
// После опустошения один кадр дополняет остаток SoundTouch и возобновляет PCM при запасе 20мс.
// После опустошения ждём полный блок сверх сетевого запаса; скрытого накопления DSP больше нет.
push(j, next++);
CHECK(call_jitter_pull(j, pcm, 480) == 0);
CHECK(d.seen.size() == before);
push(j, next++);
int refill = call_jitter_pull(j, pcm, 480);
if (refill != 480) {

Loading…
Cancel
Save