# Домен 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). 🟡 выбрать (§10). - **Парктроник-оверлей:** дистанция из 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 (рек.) vs CAN gear — выбрать; CAN требует 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 |