diff --git a/doc/call_video.txt b/doc/call_video.txt new file mode 100644 index 00000000..f079a8d9 --- /dev/null +++ b/doc/call_video.txt @@ -0,0 +1,53 @@ +Видеозвонки Android и ChatGUI + +Контракт +Каждая сторона независимо включает видео. Автовыбор H.265 Main 8-bit, затем +H.264 Constrained Baseline: пересечение encoder отправителя и decoder получателя. +Камера, разрешение, кодек и верхняя граница битрейта меняются во время звонка. + +Время +Общая монотонная шкала захвата аудио и видео на каждом отправителе. PTS первого +аудиосэмпла/кадра сохраняется до вывода; время сетевой отправки учитывается отдельно. +Приёмное видео следует исходной позиции реально воспроизводимого аудио, включая +SoundTouch и очередь устройства. Алгоритм регулирования аудиобуфера сохраняется. +Искусственная тишина/тоны не продвигают исходную позицию. Формат видео меняется по PTS; +новое поколение не уничтожает старые кадры, соответствующие ещё не прозвучавшей речи. + +Передача и регулирование +Один A/V-планировщик, независимые логические каналы управления/аудио/видео. +Звук продолжает работу при отказе камеры. Ограничены ожидание encode, очереди, +размер сборки кадра и память получателя; ACK не равен успешному decode/render. +Роутер считает исходный payload и пакеты, видеомодуль вычитает фиксированный +заголовок фрагмента. Физические очереди повторно не суммируются с router inflight. +Окно ACK: 10 завершённых интервалов по 50мс, текущая ячейка отдельно. +Регулятор общий C, решения проверяются управляемым временем. Снижение учитывает +подтверждённую скорость и разгрузку задолженности; повышение — малыми пробами. +Нет отдельного неограниченного интегратора: задолженность уже интегрирует дефицит. +Учитываются прогрев, RTT, minrtt_probe, отсутствие маршрута, локальное удержание +планировщиком, применение encoder-команды и смена эпохи. + +Владение +Состояние звонка/регулятора/роутера — uasync. Камера и encoder/decoder — платформенные +workers. Ограниченный mailbox, одно ожидающее уведомление. Команды bitrate имеют +call_id, video_generation и request_id; одно исполнение и последнее желаемое значение. +Принятая настройка не заменяет измерение фактического выхода. Shutdown отменяет +уведомления/таймеры, останавливает producers, затем освобождает очереди и codecs. + +Порядок реализации +[+] История первых ACK 500мс/50мс и снимок payload send_q/inflight отдельного сервиса. +[ ] Проверки интеграции счётчиков: retransmit, duplicate ACK, reset, UDP/STCP. +[ ] Проверка переноса аудиопозиции через SoundTouch при темпе 1.0..1.6. +[ ] H.265 runtime bitrate: поддерживаемый backend без циклического пересоздания. +[ ] Общий регулятор с детерминированными сценариями. +[ ] Протокол возможностей/формата, видеофрагменты, сборка, A/V scheduler. +[ ] Общие capture PTS и отображение позиции аудиоустройства в исходное время. +[ ] ChatGUI: движок, окно и настройки; Android: движок, JNI, сервис и экран. +[ ] Интеграционные проверки всех пар, перегрузки, смены формата и lifecycle. + +Приёмка +Нет двойного учёта байтов: принято = подтверждено + отменено + задолженность. +Повторные ACK/передачи не увеличивают delivered. Reset не считается доставкой. +Свободный канал не вызывает снижение на статичной сцене; рост полосы обнаруживается +пробами. Очереди остаются ограниченными при отсутствии ACK и остановке decoder. +Видео следует аудио при догоне, underrun, смене устройства и формате видеотрека. +Завершение звонка безопасно во время переключения камеры, bitrate и decoder. diff --git a/doc/tasks.md b/doc/tasks.md index 9dbc8da0..fa4cffdb 100644 --- a/doc/tasks.md +++ b/doc/tasks.md @@ -4,6 +4,11 @@ ## Текущие задачи +[ ] **Видеозвонки Android и ChatGUI** — 14.10.2026: + H.265 с fallback H.264, смена камеры/разрешения/кодека/битрейта во время звонка. + Общая шкала захвата, приёмное видео следует аудиоряду; адаптация по ACK 500мс/50мс и задолженности. + Контракты, этапы и проверки: `doc/call_video.txt`. + [+] **Android live: увеличение и перемещение видео как в просмотрщике файлов** — 14.10.2026: Общий VideoZoomState задаёт масштаб 1x..4x вокруг центра жеста, ограничение сдвига и центрирование при возврате к 1x. File/live используют одну геометрию; смена размеров окна или aspect ограничивает текущий offset заново.