diff --git a/doc/chat_call_arch.md b/doc/chat_call_arch.md index c118b02c..55b8c411 100644 --- a/doc/chat_call_arch.md +++ b/doc/chat_call_arch.md @@ -41,7 +41,7 @@ CALL_DECLINE 0x04 {call_id:8, reason:1} CALL_BUSY 0x05 {call_id:8} CALL_CANCEL 0x06 {call_id:8} CALL_HANGUP 0x07 {call_id:8, reason:1} -CALL_MEDIA 0x10 {call_id:8, track_id:1, seq:2, ts_ms:4, payload} +CALL_MEDIA 0x10 {call_id:8, track_id:1, seq:2, ts_ms:4, capture_pts_us:8, capture_epoch:8, codec_delay_samples:4, payload} ``` - `call_id` — случайный uint64, генерит вызывающий; идентифицирует сессию на обеих сторонах. @@ -50,6 +50,10 @@ CALL_MEDIA 0x10 {call_id:8, track_id:1, seq:2, ts_ms:4, payload} - Медиа: без подписи (уже внутри шифрованного канала etcp_router). - `CALL_MEDIA` — общий контейнер; `track_id` оставляет место видео (`type=VIDEO`). - Аудио: Opus 48kHz mono, 20ms (960 сэмплов), ~24–32 kbps. ~50 кадров/с. +- Заголовок медиа — 36 байт с subcmd. `ts_ms` — время отправки для оценки сетевого джиттера; + `capture_pts_us` — время первого входного сэмпла в монотонной шкале отправителя, `INT64_MIN` при отсутствии метки. + `capture_epoch` различает разрывы захвата; `codec_delay_samples` передаёт Opus lookahead. + Старый формат не поддерживается; медиа принимается только от пира текущего звонка. ## 4. Машина состояний @@ -111,6 +115,10 @@ CM handle инициирует оптимальное подключение и Аудиопоток кодирует PCM и постит `call_send_media`; приём в uasync кладёт Opus в `call_jitter`. Декодер, SoundTouch и генератор тонов принадлежат аудиопотоку. Кольцо кодированных кадров и снимок статистики защищены мьютексом; статистика не читает SoundTouch из другого потока. +`CallTimeline` хранит фактическое соответствие входных участков SoundTouch выходному PCM. +Платформа публикует позицию воспроизведения с локальной монотонной меткой; `call_audio_get_clock` +возвращает исходный PTS слышимого участка. Локальная тишина и тоны удерживают PTS. +Невалидная/устаревшая отметка устройства не разрешает продвижение видео. Контракт и ограничения — `call_video.txt`. GUI запускает аудиоустройство по CALL_ACCEPTED. При CALL_ENDED начинается финальный тон; устройство останавливается перед `call_audio_release`. Явное завершение звонка прекращает diff --git a/doc/tasks.md b/doc/tasks.md index 19c4609d..8ba2d5fe 100644 --- a/doc/tasks.md +++ b/doc/tasks.md @@ -8,8 +8,9 @@ H.265 с fallback H.264, смена камеры/разрешения/кодека/битрейта во время звонка. Общая шкала захвата, приёмное видео следует аудиоряду; адаптация по ACK 500мс/50мс и задолженности. Реализованы router ACK/debt и отдельный регулятор; check.sh 153/153 + proxy/burst/load проходят. - Видео пока не подключено. Остановлено на выявленном дрейфе SoundTouch feed/tempo; - измерения и два варианта временной шкалы зафиксированы в спецификации. + Реализован вариант 2: фактическая карта Copy/Mix SoundTouch, CallTimeline, capture PTS/эпоха/Opus delay + в протоколе, часы воспроизведения desktop/Android. Сборки успешны, 79 Kotlin-тестов и профильные C++-тесты проходят. + Видео пока не подключено: далее codecs/capabilities, ограниченные очереди и A/V scheduler, UI обеих платформ. Контракты, этапы и проверки: `doc/call_video.txt`. [+] **Android live: увеличение и перемещение видео как в просмотрщике файлов** — 14.10.2026: