Keep startup defaults and reset reserve snapshots consistent

This commit is contained in:
evgeny committed 2026-10-30 20:05:23 +01:00
1 parent a7bb72a0b7
commit e43f95ea83
3 files changed
+7 -5

No files matched your search

+1 -1
View File
@@ -46,7 +46,7 @@ Router сохраняет исходное монотонное enqueued_us в s
Прежние rtt_us/baseline_rtt_us и алгоритм видеорегулятора не меняются.
Полный delivery_rtt_us включает исходную очередь Router, нижние очереди,
путь до приёмника и возврат ACK. Базовый RTT НЕ вычитается. Это не время
путь до приёмника и возврат ACK. Этот показатель сам по себе не доказывает перегрузку. Это не время
доставки в динамик и не измерение односторонней задержки.
Регулятор
+1
View File
@@ -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);
}
+5 -4
View File
@@ -24,19 +24,20 @@
* сумма задержек диагностическая, не общий регулятор всех очередей.
* Константы ниже — параметры политики, проверяемые сценариями, не свойства протокола. */
#pragma once
#include "call_jitter.h"
#include <algorithm>
#include <cstdint>
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;
}
};