FE 和 BE 的本质区别
一句话版本
FE 处理 RAW 图像(Bayer 域,还是马赛克数据)
BE 处理 YUV/RGB 图像(已经完成去马赛克,有完整色彩)
用相机拍照的类比
你用手机拍了一张照片:
cs
你用手机拍了一张照片:
┌─────────────── 手机内部处理流程 ───────────────┐
│ │
│ ① sensor 输出 RAW │
│ 每个像素只有 1 种颜色(R或G或B) │
│ 就像马赛克拼图还没拼完 │
│ 例:像素(0,0)=R, (0,1)=G, (0,2)=B ... │
│ │
│ ② 去马赛克(Demosaic) │
│ 把马赛克插值成完整的 RGB 图像 │
│ 每个像素都有 R、G、B 三个值 │
│ 例:像素(0,0) = (R=120, G=130, B=125) │
│ │
│ ③ 色彩处理(CCM、Gamma、DRC...) │
│ 在完整的 RGB 图像上做色调映射 │
│ │
│ ④ 输出 YUV/JPEG │
└─────────────────────────────────────────────────┘
FE = 步骤 ①② 之前的所有处理(在"马赛克"数据上操作)
BE = 步骤 ②③④ 的所有处理(在"完整色彩"数据上操作)
分界线 = Demosaic(去马赛克)
Demosaic 之前 = FE(Bayer 域)
Demosaic 之后 = BE(RGB/YUV 域)
对应到 ISP 模块
cs
┌─ FE(Bayer 域处理)──────────────────────────────────────┐
│ │
│ sensor 原始数据进来 │
│ 每个像素只有 1 个颜色值(RGGB 排列) │
│ │
│ 能做的事(因为只有一个颜色值): │
│ ├─ BLC:减去黑电平(不需要颜色信息) │
│ ├─ DPC:修补坏点(看周围像素插值) │
│ ├─ LSC:修正镜头暗角(不需要颜色信息) │
│ ├─ GE:校正 Gr/Gb 的不平衡(都是 G,可以比较) │
│ ├─ Bayer NR:降噪(在同一个颜色通道内做) │
│ ├─ AWB 统计:收集色温信息 │
│ ├─ AE 统计:收集亮度信息 │
│ ├─ AF 统计:收集对焦信息 │
│ └─ ⚠️ 可以做 DCG 合成!(只需要对齐同一位置的像素) │
│ │
│ FE 输出:仍然是 Bayer 格式(每个像素1种颜色) │
└───────────────────────────────────┬────────────────────────┘
│
▼
┌─ Demosaic ─┐
│ 去马赛克 │
│ 1色 → 3色 │
└──────┬─────┘
│
▼
┌─ BE(RGB/YUV 域处理)────────────────────────────────────┐
│ │
│ 每个像素有完整的 R、G、B 值 │
│ │
│ 能做的事(因为有完整色彩): │
│ ├─ CCM:色彩矩阵校正(需要3个通道交叉运算) │
│ ├─ Gamma:非线性映射(需要完整亮度信息) │
│ ├─ DRC:动态范围压缩(需要完整亮度信息) │
│ ├─ Sharpen:锐化(需要亮度信息 Y) │
│ ├─ Anti-False-Color:消除拉链(需要比较3个通道) │
│ ├─ CA:色差校正(需要比较通道间的位置偏差) │
│ ├─ Dehaze:去雾(需要亮度+色度分离) │
│ ├─ LDCI:局部对比度(需要完整色彩) │
│ └─ 色彩空间转换:RGB → YUV │
│ │
│ BE 输出:YUV 格式 │
└────────────────────────────────────────────────────────────┘
为什么 DCG 合成必须在 FE 阶段做
cs
IMX989 DCG 模式输出了两种帧:
VC0 (LCG帧):低增益,亮区好,暗区噪声大
VC1 (HCG帧):高增益,暗区好,亮区饱和
合成目的:暗区用HCG帧的像素,亮区用LCG帧的像素
合成需要什么?
→ 逐像素比较 LCG 和 HCG 的亮度值
→ 选择"更好"的那个像素值
→ 两个帧在同一个物理位置上对齐
这个操作需要颜色信息吗?
→ 不需要!只需要亮度(像素值大小)
→ Bayer 数据里每个像素本身就有亮度值
→ 在 Bayer 域就能做逐像素选择
所以 DCG 合成 = 纯像素值比较和选择 → 不需要 Demosaic → 在 FE 做
如果放到 BE 做呢?
→ 先把 LCG 做一遍完整 ISP(Demosaic+CCM+Gamma...)→ 得到 LCG 的 YUV
→ 再把 HCG 做一遍完整 ISP → 得到 HCG 的 YUV
→ 然后在 YUV 域合成
→ 问题:Gamma 和 DRC 已经把亮度非线性化了,合成权重很难算准
→ 效果反而不如 Bayer 域合成
结论:Bayer 域合成(FE阶段)效果最好,这也是所有主流 WDR 方案的通用做法
BYPASS_BE 到底跳过了什么
cs
OT_VI_PIPE_BYPASS_NONE(不跳过):
sensor 数据 → FE → Demosaic → BE → YUV 输出
完整流水线,正常出图
OT_VI_PIPE_BYPASS_BE(跳过 BE):
sensor 数据 → FE → [停止,输出 Bayer RAW]
数据到 FE 结束就"出来"了
不再进入 Demosaic 和 BE
输出的是未去马赛克的 RAW 数据
OT_VI_PIPE_BYPASS_FE(跳过 FE):
外部输入的 Bayer 数据 → [跳过 FE] → Demosaic → BE → YUV 输出
不做前端处理,直接从去马赛克开始
IMX989 DCG 模式的完整数据流图
cs
IMX989 Sensor
│
┌──────────┴──────────┐
│ │
VC0 (LCG帧) VC1 (HCG帧)
低增益,长曝光 高增益,短曝光
│ │
▼ ▼
┌─────────────────┐ ┌─────────────────┐
│ Pipe0 FE │ │ Pipe1 FE │
│ │ │ │
│ BLC │ │ BLC │
│ DPC │ │ DPC │
│ LSC │ │ LSC │
│ Bayer NR │ │ Bayer NR │
│ AWB/AE/AF统计 │ │ │
│ │ │ 注意:没有ISP │
│ 输出: Bayer RAW │ │ 算法运行 │
└────────┬─────────┘ └────────┬─────────┘
│ │
│ Bayer RAW │ Bayer RAW
│ │
▼ ▼
┌─────────────────────────────────────┐
│ DCG 合成模块 │
│ │
│ 逐像素比较 LCG 和 HCG: │
│ if (LCG_pixel < saturation_level) │
│ output = LCG_pixel; │
│ else │
│ output = HCG_pixel × ratio; │
│ │
│ 输出: 合成后的 Bayer RAW │
└───────────────┬─────────────────────┘
│
│ 合成后的 Bayer RAW
▼
┌─────────────────┐
│ Pipe0 BE │ ← 只有合成后的数据才进入 BE
│ │
│ Demosaic │
│ CCM │
│ Gamma │
│ DRC │
│ Sharpen │
│ Anti-False-Color│
│ YUV 转换 │
│ │
│ 输出: YUV │
└────────┬─────────┘
│
▼
YUV 输出给 VPSS/VENC
对应到你的代码
cs
// Pipe0(主Pipe):
pipe_info[0].pipe_attr.pipe_bypass_mode = OT_VI_PIPE_BYPASS_NONE;
// → 跑 FE + BE(但 BE 实际处理的是合成后的数据,不是原始 LCG 帧)
// → 这是由 ISP 内部自动处理的,合成发生在 FE 和 BE 之间的内部通路
// → Pipe0 的 ISP 同时处理 AE/AWB 算法
pipe_info[0].isp_need_run = TD_TRUE;
// → Pipe0 运行 AE/AWB 算法
// → AE/AWB 看到的是合成后的帧的统计数据
// Pipe1(从Pipe):
pipe_info[1].pipe_attr.pipe_bypass_mode = OT_VI_PIPE_BYPASS_BE;
// → 只跑 FE,FE 输出 Bayer RAW → 给 DCG 合成模块用
// → 跳过 BE(不需要去马赛克和色彩处理)
pipe_info[1].isp_need_run = TD_FALSE;
// → Pipe1 不运行 AE/AWB 算法
// → 只有 Pipe0 的 ISP 运行 3A,Pipe1 的数据只被用来做合成
// 为什么 Pipe1 的 pixel_format 写 8BPP?
pipe_info[1].pipe_attr.pixel_format = OT_PIXEL_FORMAT_RGB_BAYER_8BPP;
// → 这个值在 BYPASS_BE 模式下不影响实际数据
// → 因为 FE 输出的位深是固定的(由 sensor 决定)
// → 8BPP 只是一个占位值,不会被使用
如果改成 BYPASS_NONE 会怎样
如果把 Pipe1 改成 OT_VI_PIPE_BYPASS_NONE:
→ Pipe1 也会跑 Demosaic + BE
→ Pipe1 输出一份 YUV 图像(HCG帧的完整处理结果)
→ 但没有人接收这份 YUV(没有绑定到 VPSS/VENC)
→ 白白浪费 SOC 计算资源
→ 帧率可能下降(因为多了一整套 ISP 处理)
但功能上不会出错,只是效率低了
一句话总结
FE = 在"马赛克图"上处理(降噪、黑电平、坏点...)
BE = 在"完整照片"上处理(色彩、锐化、DRC...)
BYPASS_BE = 只要"马赛克图",不需要"完整照片"
DCG合成只需要比较像素值,不需要颜色信息,所以在FE就够了