diff --git a/src/call/call_jitter.cpp b/src/call/call_jitter.cpp index aa2b2de1..041e3bca 100644 --- a/src/call/call_jitter.cpp +++ b/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 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; } diff --git a/src/call/call_jitter.h b/src/call/call_jitter.h index 1cea4f96..5e48df14 100644 --- a/src/call/call_jitter.h +++ b/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; }; diff --git a/src/call/call_jitter_window.h b/src/call/call_jitter_window.h index 48ad745e..4663a7f5 100644 --- a/src/call/call_jitter_window.h +++ b/src/call/call_jitter_window.h @@ -1,4 +1,5 @@ #pragma once +#include "call_jitter.h" #include #include @@ -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(60, std::min(max_reserve, high - low)); + reserve = (int)std::max(CALL_JITTER_MIN_RESERVE_MS, std::min(max_reserve, high - low)); return changed_second; }