app+docs: 按真机 libcxsdk 反汇编定案——灰度 LUT 改用 Android 版 HistDeRedundance(固定基值/pivot=两段均值/步进上限),曲线插值温度补 fpaTempFix;推翻上轮'参考帧累积'机制(CAccumulator 是 4 帧块平均,与我们等价)
This commit is contained in:
@@ -489,6 +489,55 @@
|
||||
"未连接"分支显示,正常出图时用户看不到任何反馈)。
|
||||
- [x] 单测 66 → **76 项全绿**;debug + release(R8) 双构建通过;APK 已更新。
|
||||
|
||||
## 用户反馈修复 第三十一轮(2026-10-06,按真机 libcxsdk 反汇编定案:显示 LUT 才是差异)
|
||||
|
||||
用户:"先从逆向文件里面找灵感,尽可能多读一些伪代码,然后推测可能缺失的东西,再补上验证"。
|
||||
|
||||
### 1) 读伪代码的对象换了:**手机上的官方库本体**
|
||||
|
||||
从官方 APK 的 `lib/arm/libcxsdk.so` 建 IDB,按 vtable 指针段解析真实函数体,逐条看反汇编
|
||||
(Hex-Rays 会吞掉 `__aeabi_uidiv` 的隐式除数,必须对指令)。顺带把上一轮 dump 的
|
||||
"`CFunctions` 全量伪代码" 对照核清。
|
||||
|
||||
### 2) 三个"缺失"候选,两个被否掉、一个命中
|
||||
|
||||
- **`CAccumulator`**:`mode>=4` 是**恰好 mode 帧的块平均**(不是 IIR),`Controller::PushFrame`
|
||||
对 A+1..A+E(E=baseLineAcc=4)各推一次并 `Restart` 一次 → 官方参考 = 4 帧平均 = **我们一样**。
|
||||
§9.3"官方参考更干净"的机制**不成立**;§9.2 的"官方空间噪声低 2.3×"是**分辨率偏差**
|
||||
(官方预览是 160×120 输出、我们预览是 320×240,逐屏像素 HF 不可比)。
|
||||
- **`CSmoother` / 显示侧累积 / `setEX`**:官方分别由 `0x380c=1`(需>1 才生效)、`0x3808=1`、
|
||||
`imageEX=0` 关闭 → 与我们一致。
|
||||
- **命中:灰度 LUT 是 PC 版形状,官方是 Android 版形状**。另有两处官方默认我们没跟:
|
||||
`MapTemperature` 无条件把 `0x3864=1` → 官方**每帧都跑 7×7 细节增强(强度 255<<3=2040)**;
|
||||
App 传给 SDK 的温度是 `帧尾 FPA + BasePara2.fpaTempFix(真机 1699)`。
|
||||
|
||||
### 3) 定量:把官方照片与我们的 NUC 对齐
|
||||
|
||||
用我们照片里存的 NUC 计数块与官方照片逐像素对齐(垂直翻转后 **r=0.99**)→ **计数一致,
|
||||
差异只在"计数→索引"映射**:官方 ≈ `0.84×我们的LUT + 21`(背景落在索引 45–55 的平台,
|
||||
我们的旧 LUT 把它压到 0–20)。反汇编核对确认 Android 版 `HistDeRedundance` 与 PC 版
|
||||
**结构不同**:固定基值 `16*(448+447*b/200)`、步进上限 `max(1,(0x1800+4j)·k>>13)`
|
||||
(`k=min(0x200,16·span/range)`)、反向 CDF 从 `hist[pivot]` 起、`hist[1023]=hist[1022]`、
|
||||
pivot=`max(center_idx,(meanBelow+meanAbove)/2)`(**pivot 官方是开着的**,`_96_4_` 构造=1
|
||||
且全库无第二处写 → §8 的"关掉 pivot"是误判,已回退)。
|
||||
|
||||
拟合(同一 NUC、逐像素):旧 PC 版 ≈35,round-30 的"pivot 关" ≈14,
|
||||
**Android 版逐指令移植 ≈12.5**,把步进常数取 16(拟合最优)≈5.9,官方实测 p5/p25=45/52。
|
||||
|
||||
### 4) 本轮改动
|
||||
|
||||
- `RenderPipeline.androidLutOf()`:Android `HistDeRedundance` 逐指令移植(+`AndroidLutTest`
|
||||
golden 向量锁定),实时会话 `androidLut = true`;PC 路径保留,C 参考黄金测试不动;
|
||||
- `RenderPipeline.fpaTempFix` → `rebuildTables(shutter + fpaTempFix)`,`IrSession` 从 BasePara2 注入;
|
||||
- 单测 113 全绿。
|
||||
|
||||
### 5) 下一步(需要机主解锁手机:当前被 PIN 锁屏,无法做实时 A/B)
|
||||
|
||||
1. 同刻官方/我们实时画面 + 我们的 NUC,复核"`+fpaTempFix` 是否让计数分布与官方一致",
|
||||
再定 §10.4 里那个 k(21 vs 16);
|
||||
2. 7×7 细节增强按官方默认(2040)打开并回归(离线拟合我们的移植反而略差,需先核移植细节);
|
||||
3. 同步 csdk(Android 版 LUT + fpaTempFix + 温度链)。
|
||||
|
||||
## 用户反馈修复 第三十轮(2026-10-06,"官方还是更细腻"→ 定位到参考帧累积)
|
||||
|
||||
用户:"不对吧,官方的画面看着还是要更细腻,你是不是还是遗漏了什么东西"。
|
||||
|
||||
Reference in New Issue
Block a user