diff --git a/.github/ISSUE_TEMPLATE/config.yml b/.github/ISSUE_TEMPLATE/config.yml
new file mode 100644
index 00000000..c1eb9c94
--- /dev/null
+++ b/.github/ISSUE_TEMPLATE/config.yml
@@ -0,0 +1,5 @@
+blank_issues_enabled: true
+contact_links:
+ - name: OpenIPC Telegram channels
+ url: https://openipc.org/our-channels
+ about: Questions and discussion
diff --git a/.github/ISSUE_TEMPLATE/device_report.yml b/.github/ISSUE_TEMPLATE/device_report.yml
new file mode 100644
index 00000000..78ff2150
--- /dev/null
+++ b/.github/ISSUE_TEMPLATE/device_report.yml
@@ -0,0 +1,101 @@
+name: Device report
+description: Report how OpenIPC Decoder works on your phone, tablet, TV, set-top box or car device
+title: "[Device]: "
+labels: ["device-report"]
+body:
+ - type: markdown
+ attributes:
+ value: |
+ Thanks for testing! Reports are collected into the **Verified devices** table in the README.
+ The app version and build hash are shown in the menu next to **Exit**, for example `v1.28, a9ac8df`.
+
+ - type: dropdown
+ id: device_type
+ attributes:
+ label: Device type
+ options:
+ - Phone
+ - Tablet
+ - TV
+ - Set-top box
+ - Car device / mirror
+ - Other
+ validations:
+ required: true
+
+ - type: input
+ id: model
+ attributes:
+ label: Manufacturer and model
+ placeholder: "Samsung Galaxy A51 (SM-A515F)"
+ validations:
+ required: true
+
+ - type: input
+ id: android
+ attributes:
+ label: Android version / firmware
+ description: Android version, plus the vendor firmware if it is not stock (ColorOS, SlimBOXtv, ...)
+ placeholder: "Android 13 / One UI 5.1"
+ validations:
+ required: true
+
+ - type: input
+ id: soc
+ attributes:
+ label: SoC and kernel version
+ description: Settings → About → Kernel version. SoC if known (Amlogic S905X3, Allwinner H313, ...)
+ placeholder: "Exynos 9611, kernel 4.14.113"
+
+ - type: input
+ id: app_version
+ attributes:
+ label: App version
+ description: Shown in the menu next to Exit
+ placeholder: "v1.28, a9ac8df"
+ validations:
+ required: true
+
+ - type: dropdown
+ id: result
+ attributes:
+ label: Overall result
+ options:
+ - Works
+ - Works with issues
+ - Does not work
+ validations:
+ required: true
+
+ - type: checkboxes
+ id: works
+ attributes:
+ label: What works
+ options:
+ - label: H.264 video
+ - label: H.265 video
+ - label: Audio
+ - label: Quad mode
+ - label: Remote control / D-pad
+ - label: WebUI
+ - label: Screenshot (long press)
+
+ - type: textarea
+ id: stream
+ attributes:
+ label: Camera and stream
+ description: Camera firmware (OpenIPC or other), resolution, FPS, bitrate, audio codec
+ placeholder: "OpenIPC on gk7205v300, H.265 1920x1080@25, 2 Mbps, AAC 16 kHz"
+
+ - type: textarea
+ id: notes
+ attributes:
+ label: Problems and notes
+ description: What did not work or looked wrong (cropped picture, no sound, delay, crash, ...)
+
+ - type: textarea
+ id: logs
+ attributes:
+ label: Log (optional)
+ description: "With USB/network debugging enabled: `adb logcat -d -s OpenIPCDecoder`"
+ render: text
diff --git a/README.md b/README.md
index bc4c0cd5..210809ba 100644
--- a/README.md
+++ b/README.md
@@ -6,142 +6,213 @@
# OpenIPC Decoder
+**English** | [Русский](README.ru.md) | [简体中文](README.zh-CN.md)
+
[](https://github.com/OpenIPC/decoder/actions/workflows/build.yml)
+[](https://github.com/OpenIPC/decoder/releases/tag/latest)
[](LICENSE.md)
[](https://developer.android.com/about/versions/lollipop)
-[](https://openipc.org/our-channels)
-Android application for viewing RTSP streams from IP cameras with hardware-accelerated H.264/H.265 decoding.
+A small Android app for watching RTSP streams from IP cameras, with hardware H.264/H.265 decoding. It is built for cameras running [OpenIPC](https://openipc.org) firmware and works on phones, tablets, TVs, set-top boxes and car devices.
+## Download
+
+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 |
+| `*.aab` | Android App Bundles for Google Play; not for manual install |
+
+A beta channel is available on [Google Play](https://play.google.com/apps/internaltest/4701231141824898735). To join it, send your e-mail through the [OpenIPC Telegram channels](https://openipc.org/our-channels).
+
## Features
-- **Video**: RTSP playback, H.264/H.265 hardware decoding via MediaCodec
-- **Audio**: PCM, AAC (ADTS), G.711
-- **Display modes**: Single camera, Quad (4 cameras simultaneously)
-- **Controls**: Pinch-to-zoom, pan, double-tap reset, Android TV remote (Leanback)
-- **Network**: TCP, automatic reconnection with exponential backoff, Basic auth
-- **WebUI**: Built-in browser for camera web interface access
-- **Additional**: Long-press screenshot, status indicators, object pooling, 4 camera slots
+- **Video:** RTSP playback, hardware H.264/H.265 decoding via MediaCodec
+- **Audio:** AAC (RFC 3640 `mpeg4-generic`, ADTS), G.711 μ-law/A-law, L16 PCM (mono/stereo)
+- **Display:** single camera, or Quad mode with 4 cameras at once
+- **Controls:** pinch-to-zoom, pan, double-tap to reset, Android TV remote (Leanback launcher)
+- **Network:** automatic reconnection with exponential back-off, connection-quality indicator
+- **WebUI:** built-in browser for the camera's web interface
+- **More:** long-press screenshot, 4 camera slots, URLs can be shared from other apps
## Requirements
- Android 5.0 (API 21) or higher
-- IP camera with RTSP support
+- An IP camera with RTSP over TCP (see [Known limitations](#known-limitations))
-## Quick Start
+## Quick start
-1. Install the application on your Android device
-2. Launch the application
-3. Tap the screen to open the menu
-4. Configure camera URL in the format:
+1. Install the APK from the [latest release](https://github.com/OpenIPC/decoder/releases/tag/latest) and launch the app.
+2. Tap the screen, or press **OK** on a remote, to open the menu.
+3. Choose a camera number (**1**–**4**), then press **Settings** and enter the camera URL:
```
- rtsp://username:password@ip_address:port/stream
+ rtsp://username:password@ip_address:554/stream=0
```
-5. Select transport (TCP only)
-6. Tap camera number to activate
+4. Press **Save**. The app connects straight away and reconnects automatically if the stream drops.
-## Building
+## Controls
-```bash
-cd android && ./gradlew assembleRelease
-```
+### Menu
-### Signing
+| Item | Action |
+|--------------|------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
+| **Q** | Turn Quad mode on or off |
+| **1**–**4** | Switch to a camera slot. The active slot's number shows the connection quality: green under 100 ms of jitter, yellow 100–300 ms, red above 300 ms. A grey number is an empty slot. |
+| **Settings** | Edit the RTSP URL of the active slot (single-camera mode only) |
+| **WebUI** | Open the camera's web interface; credentials come from the RTSP URL (single-camera mode only) |
+| **Exit** | Close the app. The small text next to it is the app version and build hash. |
-Set environment variables for release signing:
+### Gestures and keys
-```bash
-export KEYSTORE_PASS=your_password
-export KEY_ALIAS=your_alias
-export KEY_PASS=your_key_password
-```
+| Input | Action |
+|--------------------------|-----------------------------------------|
+| Tap / **OK** / **Enter** | Open or close the menu |
+| **Back** / **Esc** | Close the menu |
+| Pinch, then drag | Zoom (up to 5×) and pan |
+| Double tap | Reset zoom |
+| Long press | Save a screenshot to `Pictures/OpenIPC` |
-## Settings
+### Opening a camera from another app
-### Camera Menu
+The app accepts plain-text shares (`ACTION_SEND`, `text/plain`). Sharing an `rtsp://` URL from another app, for example OpenIPC Network, puts it into the active slot.
-- **1-8** — camera slot selection
-- **Settings** — advanced settings
-- **Transport** — set RTSP URL
-- **Quad** — enable/disable quad mode
-- **WebUI** — open camera web interface
-- **Long-press** — take screenshot
-- **Exit** — exit application
+### Quad mode
-### Quad Mode
+Shows all configured slots in a 2×2 grid. Each cell has its own connection and decoder. Audio is off in this mode. Tap any cell to open the menu.
-Simultaneous viewing of up to 4 cameras with individual settings per cell. TCP transport only. Audio is disabled to reduce resource usage.
+## Known limitations
-## Architecture
+> [!IMPORTANT]
+> These are known gaps that we plan to address. Each one has an issue — comments, test results and pull requests are welcome.
+>
+> - **RTSP over TCP only.** No UDP or multicast — [#7](https://github.com/OpenIPC/decoder/issues/7)
+> - **Basic authentication only.** Cameras that require Digest auth will not connect — [#8](https://github.com/OpenIPC/decoder/issues/8)
+> - **Video codec is detected by payload type number** (96 = H.264, 97 = H.265), not from the SDP. H.265 sent on PT 96 will not play — [#9](https://github.com/OpenIPC/decoder/issues/9)
+> - **Simplified RTP handling for video:** no STAP-A/AP aggregation, packets with CSRC or header extensions are dropped, no packet-loss recovery — [#10](https://github.com/OpenIPC/decoder/issues/10)
+> - **No RTSP keepalive.** Servers that enforce a session timeout may drop the stream periodically — [#11](https://github.com/OpenIPC/decoder/issues/11)
+> - **No audio in Quad mode** — [#12](https://github.com/OpenIPC/decoder/issues/12)
+> - **Only 4 camera slots** — [#13](https://github.com/OpenIPC/decoder/issues/13)
+> - **Audio formats not supported:** MP4A-LATM, Opus, G.726, and AAC frames split across RTP packets — [#14](https://github.com/OpenIPC/decoder/issues/14)
+> - **Possible dependency on Google services (GAPPS)** on some devices; under investigation, so disable GAPPS with care — [#15](https://github.com/OpenIPC/decoder/issues/15)
+> - **Credentials are stored and sent in clear text** (plain RTSP/HTTP with Basic auth) — [#16](https://github.com/OpenIPC/decoder/issues/16)
+>
+> Known bugs are tracked separately under the [`bug` label](https://github.com/OpenIPC/decoder/issues?q=is%3Aissue+is%3Aopen+label%3Abug).
-Multi-threaded processing on a fixed thread pool (5 threads): network I/O, watchdog, video decoding, audio playback, AAC decoding. Hardware video decoding via MediaCodec. Object pooling (`FramePool`) minimizes GC pressure. Quad mode creates dedicated per-cell pipelines (3 threads each).
+## Branches
-## Security
+| Branch | Status |
+|---------|----------------------------------------------------------------------------------------------------------------|
+| `v2` | **Main development branch** (default). Modular code in `android/`. Builds are published as `decoder-v2.apk`. |
+| `basic` | Legacy single-file version (1.0x), kept for reference and older setups. Builds are published as `decoder.apk`. |
-- Credentials stripped from RTSP request URIs, sent only in `Authorization: Basic` header
-- Resource cleanup on pause/stop: sockets closed, executor threads shut down, codecs stopped/released
-- Global `UncaughtExceptionHandler` prevents silent crashes
+Please base pull requests on `v2`.
-## Device Compatibility
+## Building
-**Please send information about devices where the program was tested only in this format:**
+You need JDK 17 and the Android SDK (platform 36). Point the build at the SDK with `ANDROID_HOME` or `android/local.properties`.
+```bash
+cd android
+./gradlew assembleDebug # debug build, no signing keys needed
+# → app/build/outputs/apk/debug/app-debug.apk
```
-Device type, Manufacturer and Model, Android Version, Kernel Version
+
+A release build needs a keystore at `android/key.jks` and these environment variables:
+
+```bash
+export KEYSTORE_PASS=your_password
+export KEY_ALIAS=your_alias
+export KEY_PASS=your_key_password
+./gradlew assembleRelease # → app/build/outputs/apk/release/app-release.apk
```
-### Verified Devices
-
-- Phones
- - Asus ZC553KL, Android 8.1, Kernel 3.18.71
- - Blackview BV4900Pro, Android 12, Kernel 4.19.191
- - Oppo 5X, ColorOS 15.0, Kernel 5.15.149
- - Oppo A17, ColorOS 12.1, Kernel 4.19.191
- - Samsung Galaxy A51, Android 13, Kernel 4.14.113
- - Samsung Galaxy M21 (SM-M215F/DSN), Android 12, Kernel 4.14.113
- - Samsung Galaxy S25, Android 15, Kernel 6.6.30
- - Samsung A55 5G, Android 14, Kernel 6.1.93
- - Samsung Galaxy J7, Android 10, Kernel 3.18.150
- - Samsung S8, Android 9, Kernel 4.4.153
- - Samsung S23 Ultra, Android 15, Kernel 5.15.153
- - Xiaomi Redmi 7A, Android 10, Kernel 4.9.261
- - Xiaomi Redmi Note 7 (M1901F7G), Android 10, Kernel 4.4.192
- - Xiaomi Redmi Note 13 4G, Android 13, Kernel 5.15.94
-- Tablets
- - Lenovo TB-X304L, Android 8.1.0, Kernel 3.18.71 (image cropped at edges)
- - Lenovo TB-X606F, Android 10, Kernel unknown (image cropped at edges)
- - Lenovo Tab P11, Android 11, Kernel 4.19.157-perf+ (image cropped at edges)
- - Samsung Galaxy Tab A, Android 7.1.1, Kernel 3.10.49
- - Samsung Galaxy Tab A, Android 11, Kernel 4.9.227
- - Samsung Tab A7 (SM-T505), Android 12, Kernel 4.19.157-perf-
-- TVs and Set-top Boxes
- - A95X F3 AIR, Android 9, Kernel 4.9.113, SlimBOXtv AOSP 9.14 without GAPPS
- - IE X3 Air, Android 9, Kernel 4.9.113, SlimBOXtv AOSP 9.14 without GAPPS
- - Haier Candy Android TV 2K, Android 11, Kernel 4.9.243+ (no icon in device apps)
- - SberBox SBDV-00001, Custom ?, Kernel 4.9.228
- - TV Box X96Q, Android 10, Kernel 4.9.170 (original H313 SoC)
- - Yandex TV Novex NVX-55U169TSY, Android 7.1.1, Kernel 4.4.3
-- Car Devices
- - Media Center JCAC10003, Android 12, Kernel 3.18.79+ (SoC ac8227/ac8229)
- - Mirror Z55, Android 8.1.0, Kernel 4.4.83
-
-## GAPPS Compatibility Note
-
-It has been noticed that the Decoder application may sometimes use some GAPPS components/libraries, so do not disable them or do it consciously. Research in this area is highly encouraged!
+Debug and release builds are signed with different keys. To switch from one to the other, uninstall the app first; its saved camera URLs are removed with it.
+
+**CI:** every push is built by GitHub Actions. Pushes to `v2` and `basic` update the [latest](https://github.com/OpenIPC/decoder/releases/tag/latest) release and notify the OpenIPC Telegram channel. Other branches only attach the APK as a workflow artifact on the run page.
+
+## Architecture
+
+| Class | Role |
+|-------------------------------|-------------------------------------------------------------------------|
+| `Decoder` | Main activity: UI, lifecycle, settings, video decode thread |
+| `RtspClient` | RTSP handshake, RTP-over-TCP receive loop, watchdog, SDP parsing |
+| `NalAssembler` | Rebuilds H.264/H.265 NAL units from RTP fragmentation units |
+| `MediaCodecManager` | Hardware video decoder lifecycle |
+| `AudioManager`, `AudioConfig` | Audio pipeline: G.711/L16 conversion, AAC decoding, AudioTrack playback |
+| `QuadCell` | A self-contained stream (network, watchdog, decoder) for one Quad cell |
+| `MenuManager` | Popup menu, URL editor, WebUI browser |
+| `FramePool` | Buffer pool that reduces garbage-collector load |
+
+Network, video decoding and audio run on separate threads, so a slow decoder never blocks the socket.
+
+## Security notes
+
+- Credentials are taken from the URL and sent as an HTTP/RTSP `Authorization: Basic` header. They are not included in the RTSP request line.
+- Plain RTSP and HTTP are not encrypted. Use the app only on trusted networks, see [#16](https://github.com/OpenIPC/decoder/issues/16).
+- Camera URLs, including passwords, are kept in the app's private storage. Backup is disabled (`allowBackup="false"`).
+
+## Device compatibility
+
+Tested the app on your device? Please [**submit a Device report**](https://github.com/OpenIPC/decoder/issues/new?template=device_report.yml). It takes a minute and helps other users.
+
+### Verified devices
+
+The devices below were reported with the legacy 1.0x version (`basic` branch). New reports should include the app version.
+
+| Type | Device | Android | Kernel | App | Notes |
+|-------------|----------------------------------------|-----------------------------------|----------------|------|----------------------------------------------------------------------|
+| Phone | Asus ZC553KL | 8.1 | 3.18.71 | 1.0x | |
+| Phone | Blackview BV4900Pro | 12 | 4.19.191 | 1.0x | |
+| Phone | Oppo 5X | ColorOS 15.0 | 5.15.149 | 1.0x | |
+| Phone | Oppo A17 | ColorOS 12.1 | 4.19.191 | 1.0x | |
+| Phone | Samsung Galaxy A51 | 13 | 4.14.113 | 1.0x | |
+| Phone | Samsung Galaxy M21 (SM-M215F/DSN) | 12 | 4.14.113 | 1.0x | |
+| Phone | Samsung Galaxy S25 | 15 | 6.6.30 | 1.0x | |
+| Phone | Samsung A55 5G | 14 | 6.1.93 | 1.0x | |
+| Phone | Samsung Galaxy J7 | 10 | 3.18.150 | 1.0x | |
+| Phone | Samsung S8 | 9 | 4.4.153 | 1.0x | |
+| Phone | Samsung S23 Ultra | 15 | 5.15.153 | 1.0x | |
+| Phone | Xiaomi Redmi 7A | 10 | 4.9.261 | 1.0x | |
+| Phone | Xiaomi Redmi Note 7 (M1901F7G) | 10 | 4.4.192 | 1.0x | |
+| Phone | Xiaomi Redmi Note 13 4G | 13 | 5.15.94 | 1.0x | |
+| Tablet | Lenovo TB-X304L | 8.1.0 | 3.18.71 | 1.0x | Picture cropped, [#17](https://github.com/OpenIPC/decoder/issues/17) |
+| Tablet | Lenovo TB-X606F | 10 | — | 1.0x | Picture cropped, [#17](https://github.com/OpenIPC/decoder/issues/17) |
+| Tablet | Lenovo Tab P11 | 11 | 4.19.157-perf+ | 1.0x | Picture cropped, [#17](https://github.com/OpenIPC/decoder/issues/17) |
+| Tablet | Samsung Galaxy Tab A | 7.1.1 | 3.10.49 | 1.0x | |
+| Tablet | Samsung Galaxy Tab A | 11 | 4.9.227 | 1.0x | |
+| Tablet | Samsung Tab A7 (SM-T505) | 12 | 4.19.157-perf- | 1.0x | |
+| Set-top box | A95X F3 AIR | 9 (SlimBOXtv AOSP 9.14, no GAPPS) | 4.9.113 | 1.0x | |
+| Set-top box | IE X3 Air | 9 (SlimBOXtv AOSP 9.14, no GAPPS) | 4.9.113 | 1.0x | |
+| Set-top box | SberBox SBDV-00001 | custom | 4.9.228 | 1.0x | |
+| Set-top box | X96Q (Allwinner H313) | 10 | 4.9.170 | 1.0x | |
+| TV | Haier Candy Android TV 2K | 11 | 4.9.243+ | 1.0x | No icon in the device's app list |
+| TV | Yandex TV Novex NVX-55U169TSY | 7.1.1 | 4.4.3 | 1.0x | |
+| Car | Media Center JCAC10003 (ac8227/ac8229) | 12 | 3.18.79+ | 1.0x | |
+| Car | Mirror Z55 | 8.1.0 | 4.4.83 | 1.0x | |
+
+### Not working
+
+| Type | Device | Android | Kernel | App | Notes |
+|-------------|----------------|---------|---------|------|----------|
+| Set-top box | Unnamed TV box | 5.1.1 | 3.14.29 | 1.0x | No video |
+
+## Version history
+
+Changes are listed on the [releases page](https://github.com/OpenIPC/decoder/releases) and in the [commit history](https://github.com/OpenIPC/decoder/commits/v2). The history of 1.0x versions is in the [`basic` branch README](https://github.com/OpenIPC/decoder/tree/basic#version-history).
## License
-[The Prosperity Public License 3.0.0](LICENSE.md). See [LICENSE.md](LICENSE.md) for details.
+[The Prosperity Public License 3.0.0](LICENSE.md): free for noncommercial use, with a 30-day trial for commercial use. See [LICENSE.md](LICENSE.md) for the full terms.
## Support
+- Questions and bug reports: [GitHub Issues](https://github.com/OpenIPC/decoder/issues)
- Documentation: [openipc.org](https://openipc.org)
-- Source code: [github.com/OpenIPC/decoder](https://github.com/OpenIPC/decoder)
-- Questions and suggestions: via [GitHub Issues](https://github.com/OpenIPC/decoder/issues)
-- Telegram: [OpenIPC Channels](https://openipc.org/our-channels)
[](https://openipc.org/our-channels)
diff --git a/README.ru.md b/README.ru.md
new file mode 100644
index 00000000..dc57b62f
--- /dev/null
+++ b/README.ru.md
@@ -0,0 +1,218 @@
+
+
+
+
+
+
+# OpenIPC Decoder
+
+[English](README.md) | **Русский** | [简体中文](README.zh-CN.md)
+
+[](https://github.com/OpenIPC/decoder/actions/workflows/build.yml)
+[](https://github.com/OpenIPC/decoder/releases/tag/latest)
+[](LICENSE.md)
+[](https://developer.android.com/about/versions/lollipop)
+
+Компактное приложение для Android: показывает RTSP-потоки с IP-камер и декодирует H.264/H.265 аппаратно. Создано для камер с прошивкой [OpenIPC](https://openipc.org). Работает на телефонах, планшетах, телевизорах, ТВ-приставках и автомобильных устройствах.
+
+
+
+
+
+## Скачать
+
+Готовые сборки лежат в [релизе **latest**](https://github.com/OpenIPC/decoder/releases/tag/latest):
+
+| Файл | Что это |
+|------------------|----------------------------------------------------|
+| `decoder-v2.apk` | **Текущая версия**, рекомендуется |
+| `decoder.apk` | Старая версия из ветки `basic` |
+| `*.aab` | Пакеты для Google Play; вручную не устанавливаются |
+
+Есть бета-канал в [Google Play](https://play.google.com/apps/internaltest/4701231141824898735). Чтобы попасть в него, пришлите свой e-mail через [Telegram-каналы OpenIPC](https://openipc.org/our-channels).
+
+## Возможности
+
+- **Видео:** воспроизведение RTSP, аппаратное декодирование H.264/H.265 через MediaCodec
+- **Звук:** AAC (RFC 3640 `mpeg4-generic`, ADTS), G.711 μ-law/A-law, L16 PCM (моно и стерео)
+- **Режимы:** одна камера или Quad — 4 камеры на одном экране
+- **Управление:** масштаб двумя пальцами, перемещение, сброс двойным касанием, пульт Android TV (Leanback)
+- **Сеть:** автоматическое переподключение с растущей задержкой, индикатор качества связи
+- **WebUI:** встроенный браузер для веб-интерфейса камеры
+- **Прочее:** скриншот долгим нажатием, 4 слота для камер, приём ссылок из других приложений
+
+## Требования
+
+- Android 5.0 (API 21) или новее
+- IP-камера с RTSP поверх TCP (см. [Известные ограничения](#известные-ограничения))
+
+## Быстрый старт
+
+1. Установите APK из [релиза latest](https://github.com/OpenIPC/decoder/releases/tag/latest) и запустите приложение.
+2. Коснитесь экрана или нажмите **OK** на пульте, чтобы открыть меню.
+3. Выберите номер камеры (**1**–**4**), нажмите **Settings** и введите адрес камеры:
+ ```
+ rtsp://username:password@ip_address:554/stream=0
+ ```
+4. Нажмите **Save**. Приложение сразу подключится и само переподключится, если поток прервётся.
+
+## Управление
+
+### Меню
+
+| Пункт | Действие |
+|--------------|------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
+| **Q** | Включить или выключить режим Quad |
+| **1**–**4** | Переключиться на слот камеры. Цвет номера активного слота показывает качество связи: зелёный — джиттер меньше 100 мс, жёлтый — 100–300 мс, красный — больше 300 мс. Серый номер — пустой слот. |
+| **Settings** | Изменить RTSP-адрес активного слота (только в режиме одной камеры) |
+| **WebUI** | Открыть веб-интерфейс камеры; логин и пароль берутся из RTSP-адреса (только в режиме одной камеры) |
+| **Exit** | Закрыть приложение. Мелкий текст рядом — версия приложения и хеш сборки. |
+
+### Жесты и кнопки
+
+| Ввод | Действие |
+|------------------------------|-----------------------------------------|
+| Касание / **OK** / **Enter** | Открыть или закрыть меню |
+| **Back** / **Esc** | Закрыть меню |
+| Щипок, затем перетаскивание | Увеличение (до 5×) и перемещение |
+| Двойное касание | Сбросить масштаб |
+| Долгое нажатие | Сохранить скриншот в `Pictures/OpenIPC` |
+
+### Открытие камеры из другого приложения
+
+Приложение принимает текст через «Поделиться» (`ACTION_SEND`, `text/plain`). Если поделиться ссылкой `rtsp://` из другого приложения, например из OpenIPC Network, она запишется в активный слот.
+
+### Режим Quad
+
+Показывает все настроенные слоты сеткой 2×2. У каждой ячейки своё подключение и свой декодер. Звук в этом режиме выключен. Коснитесь любой ячейки, чтобы открыть меню.
+
+## Известные ограничения
+
+> [!IMPORTANT]
+> Это известные пробелы, которые мы планируем закрыть. На каждый заведён issue — комментарии, результаты проверок и pull request приветствуются.
+>
+> - **Только RTSP поверх TCP.** UDP и multicast не поддерживаются — [#7](https://github.com/OpenIPC/decoder/issues/7)
+> - **Только Basic-авторизация.** Камеры, которым нужен Digest, не подключатся — [#8](https://github.com/OpenIPC/decoder/issues/8)
+> - **Кодек видео определяется по номеру payload type** (96 = H.264, 97 = H.265), а не по SDP. H.265 на PT 96 не воспроизводится — [#9](https://github.com/OpenIPC/decoder/issues/9)
+> - **Упрощённая обработка RTP для видео:** нет агрегации STAP-A/AP, пакеты с CSRC или расширением заголовка отбрасываются, потери пакетов не обрабатываются — [#10](https://github.com/OpenIPC/decoder/issues/10)
+> - **Нет RTSP keepalive.** Серверы с таймаутом сессии могут периодически обрывать поток — [#11](https://github.com/OpenIPC/decoder/issues/11)
+> - **В режиме Quad нет звука** — [#12](https://github.com/OpenIPC/decoder/issues/12)
+> - **Только 4 слота для камер** — [#13](https://github.com/OpenIPC/decoder/issues/13)
+> - **Не поддерживаются форматы звука** MP4A-LATM, Opus, G.726, а также AAC-кадры, разбитые на несколько RTP-пакетов — [#14](https://github.com/OpenIPC/decoder/issues/14)
+> - **Возможная зависимость от сервисов Google (GAPPS)** на некоторых устройствах; изучается, поэтому отключайте GAPPS осознанно — [#15](https://github.com/OpenIPC/decoder/issues/15)
+> - **Логин и пароль хранятся и передаются в открытом виде** (RTSP/HTTP без шифрования, Basic-авторизация) — [#16](https://github.com/OpenIPC/decoder/issues/16)
+>
+> Известные ошибки собраны отдельно, под [меткой `bug`](https://github.com/OpenIPC/decoder/issues?q=is%3Aissue+is%3Aopen+label%3Abug).
+
+## Ветки
+
+| Ветка | Назначение |
+|---------|-----------------------------------------------------------------------------------------------------------------------|
+| `v2` | **Основная ветка разработки** (по умолчанию). Модульный код в `android/`. Сборки публикуются как `decoder-v2.apk`. |
+| `basic` | Старая версия 1.0x в одном файле, сохранена для справки и для старых установок. Сборки публикуются как `decoder.apk`. |
+
+Pull request делайте от ветки `v2`.
+
+## Сборка
+
+Нужны JDK 17 и Android SDK (platform 36). Путь к SDK задаётся через `ANDROID_HOME` или `android/local.properties`.
+
+```bash
+cd android
+./gradlew assembleDebug # отладочная сборка, ключи подписи не нужны
+# → app/build/outputs/apk/debug/app-debug.apk
+```
+
+Для релизной сборки нужно хранилище ключей `android/key.jks` и переменные окружения:
+
+```bash
+export KEYSTORE_PASS=your_password
+export KEY_ALIAS=your_alias
+export KEY_PASS=your_key_password
+./gradlew assembleRelease # → app/build/outputs/apk/release/app-release.apk
+```
+
+Отладочная и релизная сборки подписаны разными ключами. Чтобы перейти с одной на другую, сначала удалите приложение; сохранённые адреса камер удалятся вместе с ним.
+
+**CI:** GitHub Actions собирает каждый push. Push в `v2` и `basic` обновляет релиз [latest](https://github.com/OpenIPC/decoder/releases/tag/latest) и отправляет уведомление в Telegram-канал OpenIPC. Для остальных веток APK прикладывается только как артефакт на странице запуска.
+
+## Архитектура
+
+| Класс | Назначение |
+|-------------------------------|-----------------------------------------------------------------------------------|
+| `Decoder` | Главная activity: интерфейс, жизненный цикл, настройки, поток декодирования видео |
+| `RtspClient` | RTSP-рукопожатие, приём RTP поверх TCP, сторожевой таймер, разбор SDP |
+| `NalAssembler` | Сборка NAL-блоков H.264/H.265 из RTP-фрагментов |
+| `MediaCodecManager` | Жизненный цикл аппаратного видеодекодера |
+| `AudioManager`, `AudioConfig` | Звук: преобразование G.711/L16, декодирование AAC, вывод через AudioTrack |
+| `QuadCell` | Независимый поток (сеть, сторожевой таймер, декодер) для одной ячейки Quad |
+| `MenuManager` | Всплывающее меню, редактор адреса, браузер WebUI |
+| `FramePool` | Пул буферов, снижает нагрузку на сборщик мусора |
+
+Сеть, декодирование видео и звук работают в отдельных потоках, поэтому медленный декодер не блокирует сокет.
+
+## Безопасность
+
+- Логин и пароль берутся из адреса и передаются в заголовке `Authorization: Basic`. В строку RTSP-запроса они не попадают.
+- RTSP и HTTP без шифрования. Используйте приложение только в доверенных сетях, см. [#16](https://github.com/OpenIPC/decoder/issues/16).
+- Адреса камер вместе с паролями хранятся в закрытом хранилище приложения. Резервное копирование отключено (`allowBackup="false"`).
+
+## Совместимость с устройствами
+
+Проверили приложение на своём устройстве? [**Отправьте Device report**](https://github.com/OpenIPC/decoder/issues/new?template=device_report.yml) — это займёт минуту и поможет другим пользователям.
+
+### Проверенные устройства
+
+Отчёты ниже получены для старой версии 1.0x (ветка `basic`). В новых отчётах указывайте версию приложения.
+
+| Тип | Устройство | Android | Ядро | Версия | Примечание |
+|--------------|--------------------------------------|------------------------------------|----------------|--------|---------------------------------------------------------------------------|
+| Телефон | Asus ZC553KL | 8.1 | 3.18.71 | 1.0x | |
+| Телефон | Blackview BV4900Pro | 12 | 4.19.191 | 1.0x | |
+| Телефон | Oppo 5X | ColorOS 15.0 | 5.15.149 | 1.0x | |
+| Телефон | Oppo A17 | ColorOS 12.1 | 4.19.191 | 1.0x | |
+| Телефон | Samsung Galaxy A51 | 13 | 4.14.113 | 1.0x | |
+| Телефон | Samsung Galaxy M21 (SM-M215F/DSN) | 12 | 4.14.113 | 1.0x | |
+| Телефон | Samsung Galaxy S25 | 15 | 6.6.30 | 1.0x | |
+| Телефон | Samsung A55 5G | 14 | 6.1.93 | 1.0x | |
+| Телефон | Samsung Galaxy J7 | 10 | 3.18.150 | 1.0x | |
+| Телефон | Samsung S8 | 9 | 4.4.153 | 1.0x | |
+| Телефон | Samsung S23 Ultra | 15 | 5.15.153 | 1.0x | |
+| Телефон | Xiaomi Redmi 7A | 10 | 4.9.261 | 1.0x | |
+| Телефон | Xiaomi Redmi Note 7 (M1901F7G) | 10 | 4.4.192 | 1.0x | |
+| Телефон | Xiaomi Redmi Note 13 4G | 13 | 5.15.94 | 1.0x | |
+| Планшет | Lenovo TB-X304L | 8.1.0 | 3.18.71 | 1.0x | Изображение обрезано, [#17](https://github.com/OpenIPC/decoder/issues/17) |
+| Планшет | Lenovo TB-X606F | 10 | — | 1.0x | Изображение обрезано, [#17](https://github.com/OpenIPC/decoder/issues/17) |
+| Планшет | Lenovo Tab P11 | 11 | 4.19.157-perf+ | 1.0x | Изображение обрезано, [#17](https://github.com/OpenIPC/decoder/issues/17) |
+| Планшет | Samsung Galaxy Tab A | 7.1.1 | 3.10.49 | 1.0x | |
+| Планшет | Samsung Galaxy Tab A | 11 | 4.9.227 | 1.0x | |
+| Планшет | Samsung Tab A7 (SM-T505) | 12 | 4.19.157-perf- | 1.0x | |
+| ТВ-приставка | A95X F3 AIR | 9 (SlimBOXtv AOSP 9.14, без GAPPS) | 4.9.113 | 1.0x | |
+| ТВ-приставка | IE X3 Air | 9 (SlimBOXtv AOSP 9.14, без GAPPS) | 4.9.113 | 1.0x | |
+| ТВ-приставка | SberBox SBDV-00001 | своя | 4.9.228 | 1.0x | |
+| ТВ-приставка | X96Q (Allwinner H313) | 10 | 4.9.170 | 1.0x | |
+| Телевизор | Haier Candy Android TV 2K | 11 | 4.9.243+ | 1.0x | Нет значка в списке приложений |
+| Телевизор | Yandex TV Novex NVX-55U169TSY | 7.1.1 | 4.4.3 | 1.0x | |
+| Авто | Медиацентр JCAC10003 (ac8227/ac8229) | 12 | 3.18.79+ | 1.0x | |
+| Авто | Зеркало Z55 | 8.1.0 | 4.4.83 | 1.0x | |
+
+### Не работает
+
+| Тип | Устройство | Android | Ядро | Версия | Примечание |
+|--------------|---------------------------|---------|---------|--------|------------|
+| ТВ-приставка | ТВ-приставка без названия | 5.1.1 | 3.14.29 | 1.0x | Нет видео |
+
+## История версий
+
+Изменения описаны на [странице релизов](https://github.com/OpenIPC/decoder/releases) и в [истории коммитов](https://github.com/OpenIPC/decoder/commits/v2). История версий 1.0x — в [README ветки `basic`](https://github.com/OpenIPC/decoder/tree/basic#version-history).
+
+## Лицензия
+
+[The Prosperity Public License 3.0.0](LICENSE.md): бесплатно для некоммерческого использования; для коммерческого — пробный период 30 дней. Полный текст — в [LICENSE.md](LICENSE.md).
+
+## Поддержка
+
+- Вопросы и сообщения об ошибках: [GitHub Issues](https://github.com/OpenIPC/decoder/issues)
+- Документация: [openipc.org](https://openipc.org)
+
+[](https://openipc.org/our-channels)
diff --git a/README.zh-CN.md b/README.zh-CN.md
new file mode 100644
index 00000000..87f73038
--- /dev/null
+++ b/README.zh-CN.md
@@ -0,0 +1,218 @@
+
+
+
+
+
+
+# OpenIPC Decoder
+
+[English](README.md) | [Русский](README.ru.md) | **简体中文**
+
+[](https://github.com/OpenIPC/decoder/actions/workflows/build.yml)
+[](https://github.com/OpenIPC/decoder/releases/tag/latest)
+[](LICENSE.md)
+[](https://developer.android.com/about/versions/lollipop)
+
+一款小巧的 Android 应用,用于观看 IP 摄像机的 RTSP 视频流,支持 H.264/H.265 硬件解码。专为运行 [OpenIPC](https://openipc.org) 固件的摄像机设计,可在手机、平板、电视、电视盒子和车载设备上使用。
+
+