android: fix real-device defects (temp double-conversion, FFC temp jump, image orientation per grip, remote raw+metadata stream)

This commit is contained in:
ZXCLI
2026-09-11 03:01:13 +08:00
parent 0919f5e186
commit 464cfcb5e8
26 changed files with 1938 additions and 277 deletions
+14 -3
View File
@@ -324,12 +324,23 @@ class PipCameraEngine(val context, val textureView) :
`{"type":"welcome","w":160,"h":120,"fps":15,"serial":...}`
- `{"cmd":"start"}` → `{"type":"stream-start"}` 后开始二进制帧
- `{"cmd":"stop"}` → `{"type":"stream-stop"}`
- `{"cmd":"ffc"}` → 主机触发 FFC → `{"type":"ok"}`
- `{"cmd":"ffc"}` → 主机触发 FFC → `{"type":"ok"}`**仅未出流时回复**;出流后
客户端处于帧模式,主机只执行不回复,见下)
- **图像帧**stream-start 之后,TCP 二进制流):
`[u32 LE 0x1BB1B11B][u32 LE frameCounter][u32 LE 38400][38400B 原始 u16LE 像素]`
共 38412B/帧。**客户端用本地 RenderPipeline(160,120)+内置 DDT 自行渲染**
`[u32 LE 0x1BB1B11B][u32 LE frameCounter][u32 LE 38400]`
`[u32 LE flags][u32 LE ffcPhase][i32 LE shutter][38400B 原始 u16LE 像素]`
头部 24B,共 **38424B/帧**。**客户端用本地 RenderPipeline(160,120)+内置 DDT 自行渲染**
(调色板/变倍全在客户端本地,无需回传)。
- `flags` bit0 = 主机本帧是否渲染成功;`ffcPhase` = 主机管线 FFC 阶段
(0 正常 / 1 快门关闭 / 2 参考帧采集);`shutter` = 本帧相机温度(原始单位)。
- **为什么必须带这几项**2026-09-11 修订):NUC 表按快门温度插值,缺了它
counts 会饱和(真机表现为满屏噪声 + 读数 -161℃);参考帧还必须在客户端
按同一规则平均。早期版本只传像素、客户端独立跑 FFC 状态机,画面不正确。
- 客户端相应入口:`RenderPipeline.frameRemote(frame, phase, shutter, out)`。
- **保活**:主机 3s 无帧发 `{"type":"ping"}`;客户端 10s 无任何数据判死重连。
- **单客户端**:已有客户端时,第二连接立即收到 `{"type":"busy"}` 并被关闭。
- **流中不写控制回复**stream-start 之后客户端处于帧模式,此时主机不得再写
JSON 行(会被当作帧内杂散字节);`ffc` 在流中执行但不回复。
### F2. 文件与职责
1. `net/RemoteContract.kt`:常量(端口/魔数)、JSON data class、