Browse Source

Document video playout timing contract tests and remaining live cadence issues

master
evgeny 5 days ago
parent
commit
a373180c10
  1. 61
      doc/call_video.txt
  2. 10
      doc/tasks.md

61
doc/call_video.txt

@ -19,11 +19,14 @@ VBV является локальной настройкой software encoder,
аудиосэмпла/кадра сохраняется до вывода; время сетевой отправки учитывается отдельно. аудиосэмпла/кадра сохраняется до вывода; время сетевой отправки учитывается отдельно.
Приёмное видео следует исходной позиции реально воспроизводимого аудио, включая Приёмное видео следует исходной позиции реально воспроизводимого аудио, включая
SoundTouch и очередь устройства. Алгоритм регулирования аудиобуфера сохраняется. SoundTouch и очередь устройства. Алгоритм регулирования аудиобуфера сохраняется.
Показ имеет собственное абсолютное расписание 1.04x; audio clock ограничивает фазу
в диапазоне videoPTS-audioPTS = -50..+40мс при выдаче кадра на отображение.
Подробности и границы измерения — в разделе «Независимое расписание показа» ниже.
Искусственная тишина/тоны не продвигают исходную позицию. Формат видео меняется по PTS; Искусственная тишина/тоны не продвигают исходную позицию. Формат видео меняется по PTS;
новое поколение не уничтожает старые кадры, соответствующие ещё не прозвучавшей речи. новое поколение не уничтожает старые кадры, соответствующие ещё не прозвучавшей речи.
Передача и регулирование Передача и регулирование
Один A/V-планировщик, независимые логические каналы управления/аудио/видео. Одна шкала времени A/V, независимые логические каналы управления/аудио/видео.
Звук продолжает работу при отказе камеры. Ограничены ожидание encode, очереди, Звук продолжает работу при отказе камеры. Ограничены ожидание encode, очереди,
размер сборки кадра и память получателя; ACK не равен успешному decode/render. размер сборки кадра и память получателя; ACK не равен успешному decode/render.
Роутер считает исходный payload и пакеты, видеомодуль вычитает фиксированный Роутер считает исходный payload и пакеты, видеомодуль вычитает фиксированный
@ -498,7 +501,7 @@ VIDEO_DECODE_OK/REJECT передают результат decoder; Auto иск
отправки после очередного tick регулятора. При смене звонка очищаются pending команды port. отправки после очередного tick регулятора. При смене звонка очищаются pending команды port.
Сетевой долг ограничен полусекундой целевого потока плюс базовый RTT, с минимумом Сетевой долг ограничен полусекундой целевого потока плюс базовый RTT, с минимумом
64 KiB для IDR и абсолютным пределом 2 MiB. Частичная отправка по-прежнему ограничена 64 KiB для IDR и абсолютным пределом 2 MiB. Частичная отправка по-прежнему ограничена
2с. Обе платформы отбрасывают показ кадров, отставших от аудио более чем на 500мс. 2с. На этом этапе предел отставания был 500мс; с 15.10.2026 заменён общим playout на 50мс (см. ниже).
Подтверждено на подключённых устройствах последней debug instrumentation: Подтверждено на подключённых устройствах последней debug instrumentation:
- D2AR10P3600820: c2.unisoc.hevc.encoder Main/level 93/DPB=3; AVC Baseline/level 31. - D2AR10P3600820: c2.unisoc.hevc.encoder Main/level 93/DPB=3; AVC Baseline/level 31.
@ -684,3 +687,57 @@ Samsung удерживает кадр/следующие encoded frames до н
Сборки /tmp/video-timing-*-build.log и /tmp/video-commit-*-build.log; 103 Android unit PASS, Сборки /tmp/video-timing-*-build.log и /tmp/video-commit-*-build.log; 103 Android unit PASS,
test_call_video_clock exit=0, test_call_video_encoder 13/13 PASS. Диагностика установлена на Samsung, test_call_video_clock exit=0, test_call_video_encoder 13/13 PASS. Диагностика установлена на Samsung,
ChatGUI пересобран и перезапущен. Поведение кодеков, очередей, аудиосинхронизации не изменено. ChatGUI пересобран и перезапущен. Поведение кодеков, очередей, аудиосинхронизации не изменено.
Независимое расписание показа, 15.10.2026
Общий C-модуль call_video_playout принадлежит RX worker, не владеет изображениями/decoder.
Последовательные сроки: D[i] = D[i-1] + (PTS[i]-PTS[i-1])*25/26.
Локальная received_us ставится на входе RX port в CLOCK_MONOTONIC до ожидания worker;
это дополнительное локальное поле, wire format не изменён. Desktop использует тот же источник
времени, Android System.nanoTime соответствует MONOTONIC. BOOTTIME из транспортных логов сюда не подмешивается.
Если received_us > D[i], срок переносится на received_us. Поздний pull, decode или poll не переносят
его на фактическое время показа. Поэтому ожидание данных постепенно съедается ускорением,
а опоздание CPU не добавляется к последующим срокам. На полностью разгруженном входе скорость
естественно ограничена поступлением кадров; дополнительных кадров и фиксированного запаса не создаём.
Свежий audio clock ограничивает фазу: ранний кадр ждёт, поздний более 50мс не показывается.
Проекция аудиометки на 1x ограничивает плановый срок, но решение SHOW всегда проверяет текущие часы;
проверка не реже 5мс, поэтому изменение темпа аудио не требует отдельного rate estimator.
При WAIT кадр не потребляется, следующая проверка не накапливает сдвиги. При длинной паузе CPU
готовый следующий кадр с уже наступившим сроком вытесняет устаревший показ; codec references не удаляются.
После невалидных аудиочасов снимается привязка расписания, но сохраняются decoder и монотонный порядок PTS.
Изменение source_epoch само по себе не сбрасывает видео. Долг таймера после outage не отрабатывается пачкой.
Обе платформы держат до двух готовых изображений для lookahead; ждать второго для показа первого не нужно.
Android продолжает подачу input во время ожидания output, суммарно до восьми кадров в decoder/готовой очереди.
Метка received_us переносится через input FIFO по PTS. EOS закрывает decoder лишь после показа/пропуска
всех выходов, включая непустой последний EOS output. Переход формата сохраняет расписание.
На desktop публикация remote image больше не зависит от UI-таймера 20мс: одно coalesced queued notification,
последний выбранный кадр и проверка поколения публикации при stop/restart. Preview/status сохраняют свой таймер.
Сводка call/debug раз в секунду: shown, drop_late/drop_schedule/drop_order, cadence_us,
av_us, dispatch_max_us, data_shift_us, audio_wait/clock_wait. Для самого большого промежутка
gap_pts_us/gap_rx_us/gap_dispatch_us различают нерегулярность исходных кадров, доступности входа и исполнения.
data_shift_us — сумма сдвигов расписания по доступности входа, не накопленная задержка сети:
даже ровный вход 30fps ограничивает 1.04x примерно на 40мс за секунду.
Задержку uasync/его backpressure эта метка не отличает от задержки доставки; это не физический socket timestamp.
Граница A/V относится к выдаче на отображение. UI/render/scanout измеряются отдельно, строгой аппаратной
гарантии в условиях остановки CPU или отсутствия новых кадров нет. Для большой сетевой паузы одновременно
сохранить все кадры, только плавно догнать и сразу соблюдать 50мс невозможно — действует drop_late.
Проверки: test_call_video_playout — абсолютные сроки при CPU+9мс, задержка данных+20мс,
пропуск backlog, верхняя граница A/V, outage/recovery, порядок PTS и 400 кадров с jitter/FPS/темпом аудио.
Комбинированный сценарий: 389 показано, 11 пропущено, все SHOW внутри A/V-границ.
Qt test_call_video_clock использует настоящий decoder: ровный вход 90/90; доставка+20мс,
RX CPU+80мс и UI+60мс — 87/90, без key requests/rejections и без публикаций после stop.
Повторный start того же call_id и 32 source_epoch за сценарий не разрывают декодирование.
test_call_video, test_call_video_rate, test_call (2/2), Qt encoder (13/13), Android unit (103) прошли.
Ядро, ChatGUI, APK собраны. Логи /tmp/video-playout-*-test.log и /tmp/video-playout-*-build.log.
Пробный живой звонок 11342339676311998023: Samsung 3719 показов за 127.374с (~29.2fps),
drop_late/drop_schedule=0, av=-43819..39982мкс. Desktop 5737 показов за 217.560с (~26.4fps),
646 drop_late, 3 drop_schedule, av=-49934..39988мкс. Окна выборок различаются, это не парный glass-to-glass замер.
На Samsung остаются отдельные промежутки 50–70мс; на desktop обратное направление теряет около 10%
кадров по строгой границе отставания. Полностью ровный живой показ пока не подтверждён.
Снимки /tmp/video-playout-live-{desktop,sm}.log. После этого замера добавлен контекст максимального
промежутка и уточнён абсолютный срок сна Android; финальная сборка установлена на Samsung и Q8.
Следующая проверка: по gap_* установить источник остаточных пауз и late drops, не расширяя A/V-границы вслепую.

10
doc/tasks.md

@ -4,6 +4,16 @@
## Текущие задачи ## Текущие задачи
[ ] **Равномерный показ видео с минимальной задержкой** — 15.10.2026:
Общий call_video_playout подключён к Android/desktop: абсолютные сроки 1.04x, A/V -50..+40мс,
отдельная метка доступности кадра в RX port, отсутствие накопления опозданий CPU.
Android продолжает подачу decoder во время ожидания показа; desktop публикует через coalesced UI notification.
Управляемые сценарии, реальный Qt decoder с задержками сети/CPU/UI и повторным start, codec/transport
и 103 Android unit-теста прошли; ядро/ChatGUI/APK собраны, обновление установлено на Samsung и Q8.
Живой звонок 11342339676311998023: SM ~29.2fps без drops, desktop ~26.4fps с ~10% late drops.
Остаточные паузы и обратное направление ещё требуют проверки. В финальную сводку добавлены
gap_pts_us/gap_rx_us/gap_dispatch_us для точного разделения причин; подробности в doc/call_video.txt.
[+] **Измерить задержку видео desktop -> Samsung по этапам** — 15.10.2026: [+] **Измерить задержку видео desktop -> Samsung по этапам** — 15.10.2026:
Добавлена выборочная трассировка по одному окну исходного PTS в секунду: encode/send/receive, Добавлена выборочная трассировка по одному окну исходного PTS в секунду: encode/send/receive,
pull/queue/decode/release, Android frame commit и desktop select/publish. Протокол и A/V-планировщик не менялись. pull/queue/decode/release, Android frame commit и desktop select/publish. Протокол и A/V-планировщик не менялись.

Loading…
Cancel
Save