Files
shturman/docs/domains/j-cameras-video.md
T
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

136 lines
12 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# Домен J — Камеры / видео
> Видео-источники и виды: задняя камера, dashcam, круговой обзор. Камеры — **динамический
> набор 0..N источников** через data-plane (PipeWire/V4L2). **Не safety-critical** (#1) —
> availability-of-view, не управление.
Статус: **v2 (на ревью).** v2 — после adversarial-ревью (20 находок).
Связано с: [hardware.md](../contracts/hardware.md) (§4) · [architecture.md](../architecture.md) (§4 data-plane, §6 Stage 0) · [a-base-system.md](a-base-system.md) (§3 fscrypt, §4 boot-инфра, §8 память, §10/§12) · [ipc.md](../contracts/ipc.md) (`Camera`) · [security-privacy.md](../contracts/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 |