Files
shturman/docs/domains/j-cameras-video.md
kk0t9 3fd9b42bb0 docs(tails): закрыть кросс-док хвосты (a-base/b/dev-env/J/hardware) + наполнить glossary
Закрыты накопленные мелкие хвосты из ревью F/J/H/G:
- Stage-нормализация: Stage-0/1/2 → Stage 0/1/2 по 6 докам (a/b/f/h/j/hardware); каноническая запись Stage 0/1/2 в glossary.
- a-base §8: видео-пайплайн (DMABUF камер / VPU dashcam) внесён в OOM-порядок — задняя защищена (Stage 1), dashcam/surround throttleable.
- a-base §12: dashcam-медиа (отдельный носитель) + контакты/журнал (G) в список factory-reset wipe.
- b §12: grace-hold резолвнут  — J запросчик (J §7), B владелец/арбитр (§4 шаг 2, §7).
- dev-environment: моки fake-камера (J)/аудио (H)/BT-телефон (G) + plugin-host-харнесс; just-цели plugin-dev-run/sideload.
- J §3/§11/§13 + hardware §4: сигнал реверса  GPIO фонаря з.х. (выбранный дефолт); CAN-gear отложен (нет gear-сигнала в E).
- glossary.md: наполнен (~55 терминов в 7 областях: машина/CAN, платформа/IPC, ассистент/аудио, питание/boot, хранилище/OTA, связь/телефон, безопасность).

Tier-3 capability-catalog + roadmap не трогаются — зависят от доменов I+L.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-23 12:46:36 +03:00

12 KiB
Raw Permalink Blame History

Домен J — Камеры / видео

Видео-источники и виды: задняя камера, dashcam, круговой обзор. Камеры — динамический набор 0..N источников через data-plane (PipeWire/V4L2). Не safety-critical (#1) — availability-of-view, не управление.

Статус: v2 (на ревью). v2 — после adversarial-ревью (20 находок). Связано с: hardware.md (§4) · architecture.md (§4 data-plane, §6 Stage 0) · a-base-system.md (§3 fscrypt, §4 boot-инфра, §8 память, §10/§12) · ipc.md (Camera) · security-privacy.md (camera_in, приватность) · домены C, B (§7/§12), E/K


1. Назначение и границы

  • Источники видео (0..N, динамические) + виды (задняя/парктроник, dashcam, surround) + оверлеи.
  • Шов с A: boot-инфра Stage 0 раннего пути (initramfs/драйвер/DT) — A §4; J — источник/вид/оверлей. Питание/реверс-wake — B §7.
  • Не safety-critical (#1): вывод картинки, не управление; никаких регуляторных claim'ов.
  • Plane: видео — PipeWire/V4L2 (data-plane); control/состояние — лёгкий D-Bus (Camera).

2. Камеры как 0..N источников

  • V4L2/CVBS capture → PipeWire video (аппаратный VPU — кодирование, §9); набор динамический; плагин может зарегистрировать источник/вид. Низколатентный путь задней — почти прямой V4L2/DMABUF.

3. Задняя камера и ранний путь (Stage 0)

  • Stage 0 рисуется ДО Shell/smithay — минимальным DRM/KMS-клиентом из initramfs (V4L2/DMABUF→KMS-плоскость, без Wayland/слот-протокола, которых ещё нет). Wayland-поверхностный вид (§6) приходит позже, поверх этого кадра.
    • DRM-master: ранний клиент держит DRM-master в Stage 0; на Stage 1 — передача smithay-композитору без чёрного кадра (Shell поднимает overlay-слот с live-видом, затем ранний клиент отпускает master). Boot-инфра — A §4.
    • Риск (открытый): ранний кадр до проверки подписи initramfs подрывает trust-chain, после — бьёт TTFF — развести minimal-trust (до) vs полный вид (после), с a-base §4.
  • Сигнал реверса: GPIO фонаря з.х. — рекомендуемый дефолт (надёжнее/быстрее/Stage 0-совместим). Владелец — Power (B §7), J потребляет; CAN-gear как альтернатива требует нового gear-сигнала в data-model/E (его сейчас нет — ветка нереализуема без этого; gear может быть не на OBD-порту, E §7). выбрано: GPIO (§13).
  • Парктроник-оверлей: дистанция из E (CAN) или K (не-CAN); на stale/unavailable (E §5b) — скрыть/пометить оверлей, не рисовать last-known.
  • Fail-safe «нет сигнала»: per-frame timestamp + frame-watchdog (нет кадра N мс / потеря sync → no_signal); запрещено показывать последний DMABUF-буфер на таймауте — явный no-signal-оверлей (#4). Детектор — J-источник; состояние — Camera.SignalState.
  • Латентность — инженерный бюджет (#11), не safety (#1). Фаза: v2.

4. Dashcam (видеорегистратор)

  • Непрерывная кольцевая (ring-buffer) запись — дефолт, без триггера (K §4: не на гарантированный g-sensor). Event-маркировка опц.: IMU или резкое замедление по GPS-Speed (K).
  • Хранилище: loop на отдельном носителе/разделе (износ — A §10), ограничение размера, retention. ENOSPC/носитель отсутствует → стоп записи с видимой индикацией, не крэш и не слив в /data.
  • Приватность (152-ФЗ, высокочувствительно): записи содержат лица/номера/салон + локацию/время. On-device по умолчанию; экспорт — только по capability + грант, доступ в audit-log; at-rest fscrypt (a-base §3 — добавить dashcam-поддерево); retention + factory-reset wipe (a-base §12); видимый индикатор записи. В онлайн-LLM/облако — никогда без явного согласия (security-privacy §7).
  • Фаза: задел (later).

5. Круговой обзор (surround / 360°)

  • Композит из нескольких источников (later задел); калибровка геометрии — открытый вопрос.
  • Ресурсы: N одновременных capture + композит + warp — бюджет память/GPU/decode/шина (a-base §8, hardware §1a/§4); приоритет vs низколатентная задняя (кто уступает DMABUF/decode — арбитраж с C §4). Surround уступает UI (#11).

6. Виды в shell

  • Камера-виды (steady-state, после Stage 1) — Wayland-поверхности в слотах shell (C §4, slot-протокол). Задняя/парктроник — приоритетный/оверлейный слот (может поверх раннего Stage 0-кадра).

7. Камера и lifecycle (шов с B/E/A)

  • Dashcam в sleep/battery-cutoff: по умолчанию НЕ пишет на заглушённом (B §7 гейт, экономия crank-энергии); «пишет всегда» (§4) = в пределах running/accessory, не sleep. Parking-dashcam — опц. later под арбитражем B (бюджет — B §12).
  • Реверс-wake + grace-hold рейла: J — запросчик удержания дисплей/камера-рейла (через Power, B §7/§4-шаг2/§12); B — владелец/арбитр, ограничивает hold-up-бюджетом, не переопределяет PONR. (Закрыть совместно с B §12.)
  • На ShutdownImminent (B §4): durable-флаш текущего видеофрагмента ДО PONR; сегментная нарезка + atomic-write (a-base §3) → резкий обрыв теряет максимум последний незакрытый сегмент.

8. IPC / data-plane

  • Видео — PipeWire/V4L2 (data-plane).
  • ru.shturman.Camera (домен J, регистрируется в ipc §4): ListSources(), SelectView(id), SignalState (per-source: live/no_signal/acquiring); сигнал ReverseEngaged (источник — Power, §3).
  • Гейтинг: доступ плагинов — capability camera_in:[sources] (security-privacy §3, per-node PipeWire + WirePlumber, как audio_in); прямой /dev/videoNтолько first-party J-сервис, плагины — только PipeWire-нода.

9. Ресурсы видео

  • Кодирование dashcam — на аппаратном VPU RK3588 (rkmpp/V4L2-M2M), не CPU (H.264/H.265). 🟡 кодек/VPU.
  • DMABUF zero-copy capture→encode/composite (N источников × буферы — главный член RAM).
  • Внести видео-пайплайн в a-base §8 (давление памяти + OOM-порядок: задняя — защищена у Stage 1; dashcam/surround — throttleable).
  • GPU-контеншн: surround уступает UI (#11); деградация при throttling (a-base §10) — видимая, не stall.

10. Функции

функция MVP/later зависит от фаза
Задняя камера (capture + вид) + Stage 0 ранний путь (DRM/KMS) later hardware, A §4, B §7, C v2
Парктроник-оверлей (с учётом stale) later E/K v2
Fail-safe «нет сигнала» (frame-watchdog → SignalState) later v2
Камера-вид как Wayland-поверхность later C slot-протокол v2
camera_in capability + per-node гейтинг later security-privacy v2
Dev-симулятор камер (#13) MVP-dev dev-environment (PipeWire/vcan) v0+
Камеры 0..N (динамический набор) later data-plane later
Dashcam (ring-buffer + privacy/fscrypt + ShutdownImminent-флаш) later A §3/§10/§12, B §4 later
Surround / 360° (+ бюджет ресурсов) later a-base §8, hardware later

11. Dev-симулятор камер (#13)

Fake V4L2/PipeWire-источник: тест-паттерн / реплей файла / no-signal (для fail-safe §3); эмуляция реверса обоих путей (GPIO-стаб — дефолтный путь; CAN-gear через vcan — для будущей ветки); Stage 0-мок (замер TTFF); отказ capture-чипа/потеря источника. Поверх существующих PipeWire/vcan/weston (dev-environment). Сценарий «реверс→камера» (e2e) — отсюда.

12. Зависимости

  • Вниз: hardware (§4 capture/реверс/камеры; §1a тепло), A (§4 Stage 0 boot-инфра, §3 fscrypt/atomic, §8 память, §10/§12).
  • Вбок: B (§7 питание/реверс-wake, §4 ShutdownImminent/grace-hold, §12), E/K (парктроник, stale), K (IMU/GPS dashcam), C (слоты/slot-протокол).
  • Вверх: виды камер для UI (C); расширяемо плагинами (camera_in).

13. Открытые вопросы

  • Сигнал реверсаGPIO фонаря з.х. (выбранный дефолт; §3, Журнал); CAN-gear отложен (требует gear-сигнал в data-model/E, которого нет).
  • 🟡 DRM-master handoff Stage 0→Stage 1 (без чёрного кадра) + trust до/после проверки initramfs — с A §4/B.
  • 🟡 Кодек/VPU dashcam (H.264/H.265, rkmpp) — выбрать.
  • ◻️ Носитель dashcam (раздел/карта; износ; retention) — с A/hardware.
  • ◻️ Калибровка surround (геометрия) — later.
  • ◻️ Капасити-бюджет (per-source RAM, VPU-нагрузка, GPU-доля) — числа позже.

Журнал решений (домен J)

Решение Выбор Дата
Модель 0..N источников через PipeWire/V4L2; виды — Wayland-поверхности в слотах C 2026-06-16
Stage 0 ранний кадр — DRM/KMS из initramfs (не Wayland); DRM-master handoff smithay на Stage 1 без чёрного кадра 2026-06-16
Реверс GPIO фонаря з.х. (дефолт), владелец Power/B; CAN-gear требует gear-сигнал в E (нет) 2026-06-16
Fail-safe frame-watchdog → no_signal; не показывать stale DMABUF (#4); Camera.SignalState 2026-06-16
Гейтинг capability camera_in (per-node PipeWire, как audio_in); /dev/videoN — только first-party 2026-06-16
Dashcam ring-buffer; privacy: fscrypt/retention/factory-reset/индикатор (152-ФЗ); VPU-кодирование; ShutdownImminent-флаш сегментами 2026-06-16
Lifecycle не пишет в sleep; реверс-wake/grace-hold — запрос к B (арбитр B) 2026-06-16