【ISP】ISP链路中FE( 前端)BE(后端)区别(海思)

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就够了