Browse Source

Lower shared call jitter reserve floor to 20 ms

master
evgeny 4 days ago
parent
commit
f1aec9bb2d
  1. 7
      src/call/call_jitter.cpp
  2. 3
      src/call/call_jitter.h
  3. 5
      src/call/call_jitter_window.h

7
src/call/call_jitter.cpp

@ -17,7 +17,6 @@
static constexpr int kSampleRate = 48000;
static constexpr int kFrameSamples = 960;
static constexpr int kMaxEncoded = 512;
static constexpr int kTargetMs = 60;
static constexpr double kMaxTempo = 1.6;
static constexpr int kTempoRampMs = 500;
@ -39,7 +38,7 @@ struct call_jitter {
call_jitter_diagnostics diagnostics{};
int processing_ms = 0, tempo_x100 = 100; /* снимок аудиопотока под mtx */
call_jitter_window depth_window, arrival_window;
call_jitter_range range = {0, 0, 60}; /* опубликованный снимок под mtx */
call_jitter_range range = {0, 0, CALL_JITTER_MIN_RESERVE_MS}; /* опубликованный снимок под mtx */
call_jitter_decode_fn decode;
void* arg;
soundtouch::SoundTouch st;
@ -47,7 +46,7 @@ struct call_jitter {
float input[kFrameSamples];
std::vector<float> output;
bool primed = false, catching_up = false;
double tempo = 1.0, ema_ms = kTargetMs;
double tempo = 1.0, ema_ms = CALL_JITTER_MIN_RESERVE_MS;
};
extern "C" {
@ -82,7 +81,7 @@ struct call_jitter* call_jitter_create(call_jitter_decode_fn decode, void* arg,
j->~call_jitter(); u_free(j); return nullptr;
}
DEBUG_INFO(DEBUG_CATEGORY_CALL, "call_jitter: created capacity=%dms target=%dms max_reserve=%dms tempo=1.0..%.1f ramp=%dms",
CALL_JITTER_MAX_FRAMES * CALL_JITTER_FRAME_MS, kTargetMs, max_reserve_ms, kMaxTempo, kTempoRampMs);
CALL_JITTER_MAX_FRAMES * CALL_JITTER_FRAME_MS, CALL_JITTER_MIN_RESERVE_MS, max_reserve_ms, kMaxTempo, kTempoRampMs);
return j;
}

3
src/call/call_jitter.h

@ -8,10 +8,11 @@
extern "C" {
#endif
/* Звонок: FIFO Opus, запас 60мс..max_reserve_ms по изменению задержки доставки за 10 секунд и догон после паузы устройства.
/* Звонок: FIFO Opus, запас 20мс..max_reserve_ms по изменению задержки доставки за 10 секунд и догон после паузы устройства.
* push — сетевой поток, pull/decode/SoundTouch — единственный аудиопоток.
* destroy — после остановки обоих потребителей. get_stats — любой поток. */
#define CALL_JITTER_FRAME_MS 20
#define CALL_JITTER_MIN_RESERVE_MS 20
#define CALL_JITTER_MAX_FRAMES 750 /* 10с перебоя + 5с запаса на накопление и восстановление */
typedef int (*call_jitter_decode_fn)(void*, const uint8_t*, int, int16_t*, int);
struct call_jitter_range { int min_ms, max_ms, reserve_ms; };

5
src/call/call_jitter_window.h

@ -1,4 +1,5 @@
#pragma once
#include "call_jitter.h"
#include <algorithm>
#include <cstdint>
@ -6,7 +7,7 @@
struct call_jitter_window {
struct bucket { int64_t second = -1, low = 0, high = 0; } buckets[10];
int64_t low = 0, high = 0;
int reserve = 60;
int reserve = CALL_JITTER_MIN_RESERVE_MS;
int max_reserve = 1000;
int64_t last_received_ms = -1, transit_ms = 0;
uint32_t last_sent_ms = 0;
@ -21,7 +22,7 @@ struct call_jitter_window {
if (item.second < 0 || item.second > second || second - item.second >= 10) continue;
low = std::min(low, item.low); high = std::max(high, item.high);
}
reserve = (int)std::max<int64_t>(60, std::min<int64_t>(max_reserve, high - low));
reserve = (int)std::max<int64_t>(CALL_JITTER_MIN_RESERVE_MS, std::min<int64_t>(max_reserve, high - low));
return changed_second;
}

Loading…
Cancel
Save