diff --git a/README.md b/README.md
index 45111d09..56abfa69 100644
--- a/README.md
+++ b/README.md
@@ -40,10 +40,10 @@ A small Android app for watching RTSP streams from IP cameras, with hardware H.2
Ready-to-install builds are in the [**latest** release](https://github.com/OpenIPC/decoder/releases/tag/latest):
-| File | What it is |
-|---|---|
-| `decoder-v2.apk` | **Current version**, recommended |
-| `decoder.apk` | Legacy version from the `basic` branch |
+| File | What it is |
+|------------------|----------------------------------------|
+| `decoder-v2.apk` | **Current version**, recommended |
+| `decoder.apk` | Legacy version from the `basic` branch |
Every build is replaced in `latest` by the next one. Development is continuous, so there are no releases per version; every `v2` and `basic` build is also posted with its version and commit to the OpenIPC Telegram channel ([our channels](https://openipc.org/our-channels)).
@@ -74,14 +74,14 @@ A beta channel is available on [Google Play](https://play.google.com/apps/intern
[ Exit | Reset | Debug | UDP ]
```
-| Input | Action |
-|---|---|
-| Tap / **OK** | Open or close the menu |
-| **1**–**8** | Camera slot; the number's colour shows the connection quality |
-| **Grid** / **Slides** | Multi-view or one camera / every frame or key frames only |
-| **Debug** / **UDP** | Text in the multi-view cells / the camera that pushes RTP to port 5600 |
-| Pinch, double tap | Zoom and pan, reset the zoom (single view) |
-| Long press | Screenshot (single view) / play this cell's sound (multi-view) |
+| Input | Action |
+|-----------------------|------------------------------------------------------------------------|
+| Tap / **OK** | Open or close the menu |
+| **1**–**8** | Camera slot; the number's colour shows the connection quality |
+| **Grid** / **Slides** | Multi-view or one camera / every frame or key frames only |
+| **Debug** / **UDP** | Text in the multi-view cells / the camera that pushes RTP to port 5600 |
+| Pinch, double tap | Zoom and pan, reset the zoom (single view) |
+| Long press | Screenshot (single view) / play this cell's sound (multi-view) |
Every item, the remote, sharing a URL from another app and **Reset**: [Usage](docs/usage.md).
@@ -101,16 +101,16 @@ Every item, the remote, sharing a URL from another app and **Reset**: [Usage](do
## Documentation
-| Document | Contents |
-|---|---|
-| [Usage](docs/usage.md) | menu, gestures and keys, remote control, multi-view, Slides, the U cell, WebUI, sharing a URL from another app, screenshots, Reset |
-| [Transports](docs/transports.md) | URL formats and options: RTSP over TCP/UDP/Auto/multicast, `udp://` push (Majestic `outgoing`), HTTP MJPEG; codecs, authentication, what the servers support |
-| [Debug](docs/debug.md) | debug page on port 8085, `/stats.json` field reference, `/log`, snapshots, what to send with a bug report |
-| [Architecture](docs/architecture.md) | data path, classes, threads, the decode planner, SurfaceView rendering, repository layout |
-| [Testing and releases](docs/testing.md) | branches, CI, unit tests, versions and releases, branch builds, `mapping.txt`, building locally |
-| [Security](docs/security.md) | credential store, debug server (LAN only), log redaction, no encryption on the network |
-| [Devices](docs/devices.md) | verified and not working devices, hardware decoder notes, device and camera reports |
-| [Drones and Wi‑Fi toys](docs/toys.md) | how toys stream, FLOW-UFO (in testing), what to try with an unknown toy, what to send |
+| Document | Contents |
+|-----------------------------------------|--------------------------------------------------------------------------------------------------------------------------------------------------------------|
+| [Usage](docs/usage.md) | menu, gestures and keys, remote control, multi-view, Slides, the U cell, WebUI, sharing a URL from another app, screenshots, Reset |
+| [Transports](docs/transports.md) | URL formats and options: RTSP over TCP/UDP/Auto/multicast, `udp://` push (Majestic `outgoing`), HTTP MJPEG; codecs, authentication, what the servers support |
+| [Debug](docs/debug.md) | debug page on port 8085, `/stats.json` field reference, `/log`, snapshots, what to send with a bug report |
+| [Architecture](docs/architecture.md) | data path, classes, threads, the decode planner, SurfaceView rendering, repository layout |
+| [Testing and releases](docs/testing.md) | branches, CI, unit tests, versions and releases, branch builds, `mapping.txt`, building locally |
+| [Security](docs/security.md) | credential store, debug server (LAN only), log redaction, no encryption on the network |
+| [Devices](docs/devices.md) | verified and not working devices, hardware decoder notes, device and camera reports |
+| [Drones and Wi‑Fi toys](docs/toys.md) | how toys stream, FLOW-UFO (in testing), what to try with an unknown toy, what to send |
The change history is the [merged pull requests](https://github.com/OpenIPC/decoder/pulls?q=is%3Apr+is%3Amerged+base%3Av2) and the [commits of v2](https://github.com/OpenIPC/decoder/commits/v2).
diff --git a/README.ru.md b/README.ru.md
index 54f41a82..6b47b53f 100644
--- a/README.ru.md
+++ b/README.ru.md
@@ -40,10 +40,10 @@
Готовые сборки лежат в [релизе **latest**](https://github.com/OpenIPC/decoder/releases/tag/latest):
-| Файл | Что это |
-|---|---|
+| Файл | Что это |
+|------------------|-----------------------------------|
| `decoder-v2.apk` | **Текущая версия**, рекомендуется |
-| `decoder.apk` | Старая версия из ветки `basic` |
+| `decoder.apk` | Старая версия из ветки `basic` |
Каждая новая сборка заменяет предыдущую в `latest`. Разработка идёт непрерывно, поэтому отдельных релизов по версиям нет; каждая сборка веток `v2` и `basic` с номером версии и коммитом публикуется в Telegram-канале OpenIPC ([наши каналы](https://openipc.org/our-channels)).
@@ -74,14 +74,14 @@
[ Exit | Reset | Debug | UDP ]
```
-| Действие | Результат |
-|---|---|
-| Касание / **OK** | Открыть или закрыть меню |
-| **1**–**8** | Слот камеры; цвет номера показывает качество связи |
-| **Grid** / **Slides** | Мультивид или одна камера / все кадры или только ключевые |
-| **Debug** / **UDP** | Текст в ячейках мультивида / камера, которая шлёт RTP на порт 5600 |
-| Два пальца, двойное касание | Масштаб и перемещение, сброс масштаба (одиночный режим) |
-| Долгое нажатие | Скриншот (одиночный режим) / звук этой ячейки (мультивид) |
+| Действие | Результат |
+|-----------------------------|--------------------------------------------------------------------|
+| Касание / **OK** | Открыть или закрыть меню |
+| **1**–**8** | Слот камеры; цвет номера показывает качество связи |
+| **Grid** / **Slides** | Мультивид или одна камера / все кадры или только ключевые |
+| **Debug** / **UDP** | Текст в ячейках мультивида / камера, которая шлёт RTP на порт 5600 |
+| Два пальца, двойное касание | Масштаб и перемещение, сброс масштаба (одиночный режим) |
+| Долгое нажатие | Скриншот (одиночный режим) / звук этой ячейки (мультивид) |
Все пункты меню, пульт, передача адреса из другого приложения и **Reset** — в [Usage](docs/usage.md) (на английском).
@@ -103,16 +103,16 @@
Документация написана на английском языке; ссылки ведут на английские документы.
-| Документ | Содержание |
-|---|---|
-| [Usage](docs/usage.md) | меню, жесты и клавиши, пульт, мультивид, Slides, ячейка U, WebUI, передача адреса из другого приложения, скриншоты, Reset |
-| [Transports](docs/transports.md) | форматы адресов и параметры: RTSP поверх TCP/UDP/Auto/multicast, приём `udp://` (Majestic `outgoing`), HTTP MJPEG; кодеки, авторизация, что умеют серверы |
-| [Debug](docs/debug.md) | отладочная страница на порту 8085, описание полей `/stats.json`, `/log`, снимки, что приложить к сообщению об ошибке |
-| [Architecture](docs/architecture.md) | путь данных, классы, потоки, планировщик декодирования, вывод через SurfaceView, структура репозитория |
-| [Testing and releases](docs/testing.md) | ветки, CI, юнит-тесты, версии и релизы, сборки веток, `mapping.txt`, локальная сборка |
-| [Security](docs/security.md) | хранилище учётных данных, отладочный сервер (только локальная сеть), скрытие паролей в логах, отсутствие шифрования в сети |
-| [Devices](docs/devices.md) | проверенные и неработающие устройства, особенности аппаратных декодеров, отчёты об устройствах и камерах |
-| [Drones and Wi‑Fi toys](docs/toys.md) | как передают видео игрушки, FLOW-UFO (в тестировании), что попробовать с неизвестной игрушкой, что прислать |
+| Документ | Содержание |
+|-----------------------------------------|-----------------------------------------------------------------------------------------------------------------------------------------------------------|
+| [Usage](docs/usage.md) | меню, жесты и клавиши, пульт, мультивид, Slides, ячейка U, WebUI, передача адреса из другого приложения, скриншоты, Reset |
+| [Transports](docs/transports.md) | форматы адресов и параметры: RTSP поверх TCP/UDP/Auto/multicast, приём `udp://` (Majestic `outgoing`), HTTP MJPEG; кодеки, авторизация, что умеют серверы |
+| [Debug](docs/debug.md) | отладочная страница на порту 8085, описание полей `/stats.json`, `/log`, снимки, что приложить к сообщению об ошибке |
+| [Architecture](docs/architecture.md) | путь данных, классы, потоки, планировщик декодирования, вывод через SurfaceView, структура репозитория |
+| [Testing and releases](docs/testing.md) | ветки, CI, юнит-тесты, версии и релизы, сборки веток, `mapping.txt`, локальная сборка |
+| [Security](docs/security.md) | хранилище учётных данных, отладочный сервер (только локальная сеть), скрытие паролей в логах, отсутствие шифрования в сети |
+| [Devices](docs/devices.md) | проверенные и неработающие устройства, особенности аппаратных декодеров, отчёты об устройствах и камерах |
+| [Drones and Wi‑Fi toys](docs/toys.md) | как передают видео игрушки, FLOW-UFO (в тестировании), что попробовать с неизвестной игрушкой, что прислать |
История изменений — это [принятые pull request'ы](https://github.com/OpenIPC/decoder/pulls?q=is%3Apr+is%3Amerged+base%3Av2) и [коммиты ветки v2](https://github.com/OpenIPC/decoder/commits/v2).
diff --git a/README.zh-CN.md b/README.zh-CN.md
index 1fea1b09..2b1c9b43 100644
--- a/README.zh-CN.md
+++ b/README.zh-CN.md
@@ -40,10 +40,10 @@
可直接安装的版本位于 [**latest** 发布页](https://github.com/OpenIPC/decoder/releases/tag/latest):
-| 文件 | 说明 |
-|---|---|
+| 文件 | 说明 |
+|------------------|------------------------|
| `decoder-v2.apk` | **当前版本**,推荐使用 |
-| `decoder.apk` | `basic` 分支的旧版本 |
+| `decoder.apk` | `basic` 分支的旧版本 |
每次新构建都会替换 `latest` 中的上一个构建。开发是持续进行的,因此不再按版本单独发布;`v2` 和 `basic` 分支的每个构建连同版本号和提交都会发布到 OpenIPC 的 Telegram 频道([我们的频道](https://openipc.org/our-channels))。
@@ -74,14 +74,14 @@
[ Exit | Reset | Debug | UDP ]
```
-| 输入 | 功能 |
-|---|---|
-| 点击 / **OK** | 打开或关闭菜单 |
-| **1**–**8** | 摄像机槽位;编号的颜色表示连接质量 |
-| **Grid** / **Slides** | 多画面或单路画面 / 解码全部帧或仅关键帧 |
-| **Debug** / **UDP** | 多画面中每个画面的文字 / 向端口 5600 推送 RTP 的摄像机 |
-| 双指捏合、双击 | 缩放和平移、恢复原始大小(单路画面) |
-| 长按 | 截图(单路画面)/ 播放该画面的声音(多画面) |
+| 输入 | 功能 |
+|-----------------------|--------------------------------------------------------|
+| 点击 / **OK** | 打开或关闭菜单 |
+| **1**–**8** | 摄像机槽位;编号的颜色表示连接质量 |
+| **Grid** / **Slides** | 多画面或单路画面 / 解码全部帧或仅关键帧 |
+| **Debug** / **UDP** | 多画面中每个画面的文字 / 向端口 5600 推送 RTP 的摄像机 |
+| 双指捏合、双击 | 缩放和平移、恢复原始大小(单路画面) |
+| 长按 | 截图(单路画面)/ 播放该画面的声音(多画面) |
菜单各项、遥控器、从其他应用分享地址以及 **Reset** 的说明见 [Usage](docs/usage.md)(英文)。
@@ -103,16 +103,16 @@
文档以英文撰写,以下链接均指向英文文档。
-| 文档 | 内容 |
-|---|---|
-| [Usage](docs/usage.md) | 菜单、手势与按键、遥控器、多画面、Slides、U 画面、WebUI、从其他应用分享地址、截图、Reset |
-| [Transports](docs/transports.md) | 地址格式与参数:RTSP over TCP/UDP/Auto/组播、`udp://` 推流接收(Majestic `outgoing`)、HTTP MJPEG;编码、认证、各服务器的支持情况 |
-| [Debug](docs/debug.md) | 端口 8085 上的调试页面、`/stats.json` 字段说明、`/log`、快照、提交错误报告时需附带的内容 |
-| [Architecture](docs/architecture.md) | 数据流程、类、线程、解码调度器、SurfaceView 渲染、仓库结构 |
-| [Testing and releases](docs/testing.md) | 分支、CI、单元测试、版本与发布、分支构建、`mapping.txt`、本地构建 |
-| [Security](docs/security.md) | 凭据存储、调试服务器(仅限局域网)、日志脱敏、网络传输未加密 |
-| [Devices](docs/devices.md) | 已验证和无法使用的设备、硬件解码器说明、设备与摄像机报告 |
-| [Drones and Wi‑Fi toys](docs/toys.md) | 玩具如何传输视频、FLOW-UFO(测试中)、遇到未知玩具时可以尝试什么、需要提交哪些信息 |
+| 文档 | 内容 |
+|-----------------------------------------|-----------------------------------------------------------------------------------------------------------------------------------|
+| [Usage](docs/usage.md) | 菜单、手势与按键、遥控器、多画面、Slides、U 画面、WebUI、从其他应用分享地址、截图、Reset |
+| [Transports](docs/transports.md) | 地址格式与参数:RTSP over TCP/UDP/Auto/组播、`udp://` 推流接收(Majestic `outgoing`)、HTTP MJPEG;编码、认证、各服务器的支持情况 |
+| [Debug](docs/debug.md) | 端口 8085 上的调试页面、`/stats.json` 字段说明、`/log`、快照、提交错误报告时需附带的内容 |
+| [Architecture](docs/architecture.md) | 数据流程、类、线程、解码调度器、SurfaceView 渲染、仓库结构 |
+| [Testing and releases](docs/testing.md) | 分支、CI、单元测试、版本与发布、分支构建、`mapping.txt`、本地构建 |
+| [Security](docs/security.md) | 凭据存储、调试服务器(仅限局域网)、日志脱敏、网络传输未加密 |
+| [Devices](docs/devices.md) | 已验证和无法使用的设备、硬件解码器说明、设备与摄像机报告 |
+| [Drones and Wi‑Fi toys](docs/toys.md) | 玩具如何传输视频、FLOW-UFO(测试中)、遇到未知玩具时可以尝试什么、需要提交哪些信息 |
更新历史即[已合并的 pull request](https://github.com/OpenIPC/decoder/pulls?q=is%3Apr+is%3Amerged+base%3Av2) 和 [v2 分支的提交](https://github.com/OpenIPC/decoder/commits/v2)。
diff --git a/docs/architecture.md b/docs/architecture.md
index 9300d32b..72746236 100644
--- a/docs/architecture.md
+++ b/docs/architecture.md
@@ -41,48 +41,48 @@ The single view runs one `RtspClient` (one `RtspSession`, assemblers, audio, con
## Classes
-| Class | Role |
-|---|---|
-| `Decoder` | Main activity: UI, lifecycle, settings, single-view decoding, multi-view grid, debug state |
-| `RtspClient` | Single-view stream: RTSP session, NAL assembly, audio, connection quality (jitter) |
-| `RtspSession` | One session over TCP, UDP or multicast (and the `udp://`, `http://` fronts): handshake, RTP receive, keepalive, watchdog, reconnect with back-off, Auto fallback |
-| `RtspAuth`, `Sdp` | Basic and Digest authentication; parsing of the session description |
-| `Transport` | Slot transport mode; the RTSP `Transport` header (request and reply) |
-| `UdpReceiver`, `RtpReorder` | UDP and multicast receive with a sender filter; packet reordering |
-| `RtpListener` | `udp://` slots: plain RTP pushed by the camera |
-| `HttpMjpeg` | `http://` slots: MJPEG over HTTP (`multipart/x-mixed-replace`, chunked or not) |
-| `NalAssembler` | H.264/H.265 NAL units from RTP; drops units damaged by packet loss, or passes them on cut short |
-| `JpegAssembler` | Whole JPEG frames from RTP/JPEG (RFC 2435) |
-| `JpegCodec`, `JpegRenderer` | MJPEG on screen: the device's JPEG decoder where there is one, otherwise BitmapFactory |
-| `MediaCodecManager`, `DecoderRetry` | Video decoder lifecycle, instance budget per MIME type, software fallback, recovery after errors |
-| `CodecInfo` | The device's video decoders and their declared limits (for `/stats.json`) |
-| `DecodePlanner` | Multi-view: which cells decode every frame and which only key frames |
-| `AudioManager`, `AudioConfig` | Audio: G.711/L16 conversion, AAC/Opus decoding, AudioTrack playback |
-| `QuadCell` | One multi-view cell: its own session, decoder, queue and optional audio |
-| `MenuManager` | Menu grid, URL dialog, reset dialog, WebUI browser |
-| `CredentialStore`, `KeystoreCipher` | Encrypted storage of camera URLs (Android Keystore) |
-| `FramePool`, `Frame` | Buffer pool that reduces garbage-collector load |
-| `DebugServer`, `LogBuffer`, `NetInfo`, `Snapshots` | Debug server on port 8085, redacted log ring, device addresses and the LAN rule, screen snapshots |
-| `StreamProbe`, `StreamProbes` | Short stream checks of the slots not on screen (single view, debug page in use) |
-| `App`, `Crash`, `Restart` | Uncaught-exception handler and crash screen; restart after Reset |
+| Class | Role |
+|----------------------------------------------------|------------------------------------------------------------------------------------------------------------------------------------------------------------------|
+| `Decoder` | Main activity: UI, lifecycle, settings, single-view decoding, multi-view grid, debug state |
+| `RtspClient` | Single-view stream: RTSP session, NAL assembly, audio, connection quality (jitter) |
+| `RtspSession` | One session over TCP, UDP or multicast (and the `udp://`, `http://` fronts): handshake, RTP receive, keepalive, watchdog, reconnect with back-off, Auto fallback |
+| `RtspAuth`, `Sdp` | Basic and Digest authentication; parsing of the session description |
+| `Transport` | Slot transport mode; the RTSP `Transport` header (request and reply) |
+| `UdpReceiver`, `RtpReorder` | UDP and multicast receive with a sender filter; packet reordering |
+| `RtpListener` | `udp://` slots: plain RTP pushed by the camera |
+| `HttpMjpeg` | `http://` slots: MJPEG over HTTP (`multipart/x-mixed-replace`, chunked or not) |
+| `NalAssembler` | H.264/H.265 NAL units from RTP; drops units damaged by packet loss, or passes them on cut short |
+| `JpegAssembler` | Whole JPEG frames from RTP/JPEG (RFC 2435) |
+| `JpegCodec`, `JpegRenderer` | MJPEG on screen: the device's JPEG decoder where there is one, otherwise BitmapFactory |
+| `MediaCodecManager`, `DecoderRetry` | Video decoder lifecycle, instance budget per MIME type, software fallback, recovery after errors |
+| `CodecInfo` | The device's video decoders and their declared limits (for `/stats.json`) |
+| `DecodePlanner` | Multi-view: which cells decode every frame and which only key frames |
+| `AudioManager`, `AudioConfig` | Audio: G.711/L16 conversion, AAC/Opus decoding, AudioTrack playback |
+| `QuadCell` | One multi-view cell: its own session, decoder, queue and optional audio |
+| `MenuManager` | Menu grid, URL dialog, reset dialog, WebUI browser |
+| `CredentialStore`, `KeystoreCipher` | Encrypted storage of camera URLs (Android Keystore) |
+| `FramePool`, `Frame` | Buffer pool that reduces garbage-collector load |
+| `DebugServer`, `LogBuffer`, `NetInfo`, `Snapshots` | Debug server on port 8085, redacted log ring, device addresses and the LAN rule, screen snapshots |
+| `StreamProbe`, `StreamProbes` | Short stream checks of the slots not on screen (single view, debug page in use) |
+| `App`, `Crash`, `Restart` | Uncaught-exception handler and crash screen; restart after Reset |
## Threads
Network, video decoding and audio run on separate threads, so a slow decoder never blocks the socket.
-| Thread | Work |
-|---|---|
-| UI (main) | layout, menu, planner step and stats once a second, debug state on request |
-| `