From e43f95ea831cd78caa26b08c6fb1e9b574351e7a Mon Sep 17 00:00:00 2001 From: evgeny Date: Fri, 30 Oct 2026 20:05:23 +0100 Subject: [PATCH] Keep startup defaults and reset reserve snapshots consistent --- doc/call_audio_batch.txt | 2 +- src/call/call_jitter.cpp | 1 + src/call/call_playout_policy.h | 9 +++++---- 3 files changed, 7 insertions(+), 5 deletions(-) diff --git a/doc/call_audio_batch.txt b/doc/call_audio_batch.txt index c457a3d9..72bca24a 100644 --- a/doc/call_audio_batch.txt +++ b/doc/call_audio_batch.txt @@ -46,7 +46,7 @@ Router сохраняет исходное монотонное enqueued_us в s Прежние rtt_us/baseline_rtt_us и алгоритм видеорегулятора не меняются. Полный delivery_rtt_us включает исходную очередь Router, нижние очереди, -путь до приёмника и возврат ACK. Базовый RTT НЕ вычитается. Это не время +путь до приёмника и возврат ACK. Этот показатель сам по себе не доказывает перегрузку. Это не время доставки в динамик и не измерение односторонней задержки. Регулятор diff --git a/src/call/call_jitter.cpp b/src/call/call_jitter.cpp index a556fa10..1fe99972 100644 --- a/src/call/call_jitter.cpp +++ b/src/call/call_jitter.cpp @@ -284,6 +284,7 @@ void call_jitter_reset(struct call_jitter* j) { j->depth_window = {}; j->diagnostics = {}; j->range.min_ms = j->range.max_ms = keep * CALL_JITTER_FRAME_MS; + j->range.reserve_ms = j->policy.reserve_ms; DEBUG_INFO(DEBUG_CATEGORY_CALL, "call_jitter: device discontinuity discarded=%dms kept=%dms reserve=%dms", discard * CALL_JITTER_FRAME_MS, keep * CALL_JITTER_FRAME_MS, j->policy.reserve_ms); } diff --git a/src/call/call_playout_policy.h b/src/call/call_playout_policy.h index f7fb9db0..d54fe44b 100644 --- a/src/call/call_playout_policy.h +++ b/src/call/call_playout_policy.h @@ -24,19 +24,20 @@ * сумма задержек диагностическая, не общий регулятор всех очередей. * Константы ниже — параметры политики, проверяемые сценариями, не свойства протокола. */ #pragma once +#include "call_jitter.h" #include #include struct call_playout_policy { - int reserve_ms = 200; // Нижний сетевой запас, уменьшается только при устойчивом воспроизведении. + int reserve_ms = CALL_JITTER_STARTUP_MS; // Нижний сетевой запас, уменьшается только при устойчивом воспроизведении. int64_t stable_since_ms = -1, last_lower_ms = -1; unsigned packets = 0; // Число новых пачек с последнего нарушения устойчивости. - static constexpr int StableMs = 5000, LowerIntervalMs = 1000, StepMs = 20; + static constexpr int StableMs = 5000, LowerIntervalMs = 1000, StepMs = CALL_JITTER_FRAME_MS; static constexpr unsigned MinimumPackets = 20; // Одна оценка на пачку; observed_ms — размах изменения доставки, без постоянного RTT. void observe(int64_t now_ms, int observed_ms, int maximum_ms, bool playing) { - int required = std::min(maximum_ms, std::max(20, observed_ms + StepMs)); // Одна Opus-граница сверх измеренной вариации. + int required = std::min(maximum_ms, std::max(CALL_JITTER_MIN_RESERVE_MS, observed_ms + StepMs)); if (stable_since_ms < 0 || !playing || required > reserve_ms) { stable_since_ms = now_ms; packets = 0; } @@ -49,7 +50,7 @@ struct call_playout_policy { } // Реальная нехватка/смена устройства отменяет уверенность; повторный старт не расходует старый малый резерв. void recover(int64_t now_ms, int maximum_ms) { - reserve_ms = std::min(maximum_ms, std::max(200, reserve_ms + StepMs)); + reserve_ms = std::min(maximum_ms, std::max(CALL_JITTER_STARTUP_MS, reserve_ms + StepMs)); stable_since_ms = now_ms; packets = 0; last_lower_ms = now_ms; } };