9.1.10. 裁剪和缩放算法,用于 sh_mobile_ceu_camera 驱动

作者:Guennadi Liakhovetski <g.liakhovetski@gmx.de>

9.1.10.1. 术语

传感器缩放:水平和垂直缩放,由传感器驱动配置 主机缩放:-”- 主机驱动 组合缩放:sensor_scale * host_scale

9.1.10.2. 通用缩放/裁剪方案

-1--
|
-2-- -\
|      --\
|         --\
+-5-- .      -- -3-- -\
|      `...            -\
|          `... -4-- .   - -7..
|                     `.
|                       `. .6--
|
|                        . .6'-
|                      .´
|           ... -4'- .´
|       ...´             - -7'.
+-5'- .´               -/
|            -- -3'- -/
|         --/
|      --/
-2'- -/
|
|
-1'-

在上面的图表中,减号和斜杠表示“真实”数据量,点和重音符号表示“有用”数据,基本上是 CEU 缩放和裁剪后的输出,映射回客户端的源平面。

这种配置可以通过用户请求生成

S_CROP(左 / 上 = (5) - (1), 宽 / 高 = (5’) - (5)) S_FMT(宽 / 高 = (6’) - (6))

这里

(1) 到 (1’) - 整个最大宽度或高度 (1) 到 (2) - 传感器裁剪的左侧或顶部 (2) 到 (2’) - 传感器裁剪的宽度或高度 (3) 到 (3’) - 传感器缩放 (3) 到 (4) - CEU 裁剪的左侧或顶部 (4) 到 (4’) - CEU 裁剪的宽度或高度 (5) 到 (5’) - 应用于 CEU 裁剪的宽度或高度的反向传感器缩放 (2) 到 (5) - 应用于 CEU 裁剪的左侧或顶部的反向传感器缩放 (6) 到 (6’) - CEU 缩放 - 用户窗口

9.1.10.3. S_FMT

不要触摸输入矩形 - 它已经是最佳的。

  1. 计算当前传感器缩放

    scale_s = ((2’) - (2)) / ((3’) - (3))

2. 计算“有效”输入裁剪(传感器子窗口)- CEU 裁剪按当前传感器缩放比例缩放回输入窗口 - 这是用户 S_CROP

width_u = (5’) - (5) = ((4’) - (4)) * scale_s

3. 计算从“有效”输入窗口到请求的用户窗口的新组合缩放

scale_comb = width_u / ((6’) - (6))

4. 通过将组合缩放应用于真实输入窗口来计算传感器输出窗口

width_s_out = ((7’) - (7)) = ((2’) - (2)) / scale_comb

  1. 对传感器输出窗口应用迭代传感器 S_FMT。

    subdev->video_ops->s_fmt(.width = width_s_out)

  2. 检索传感器输出窗口 (g_fmt)

  3. 计算新的传感器缩放

    scale_s_new = ((3’)_new - (3)_new) / ((2’) - (2))

8. 计算新的 CEU 裁剪 - 将传感器缩放应用于先前计算的“有效”裁剪

width_ceu = (4’)_new - (4)_new = width_u / scale_s_new left_ceu = (4)_new - (3)_new = ((5) - (2)) / scale_s_new

  1. 使用 CEU 裁剪裁剪到新窗口

    ceu_crop(.width = width_ceu, .left = left_ceu)

  2. 使用 CEU 缩放缩放到请求的用户窗口

    scale_ceu = width_ceu / width

9.1.10.4. S_CROP

V4L2 裁剪 API

“...规范没有定义原点或单位。但是,按照惯例,驱动程序应水平计数相对于 0H 的未缩放样本。”

我们选择遵循该建议并将裁剪单位解释为客户端输入像素。

裁剪按以下 6 个步骤执行

  1. 从传感器请求完全用户矩形。

  2. 如果较小 - 迭代直到获得更大的矩形。 结果:传感器裁剪到 2 : 2’,目标裁剪 5 : 5’,当前输出格式 6’ - 6。

  3. 在上一步中,传感器已尝试尽可能好地保留其输出帧,但它可能已更改。 再次检索它。

  4. 传感器缩放到 3 : 3’。 传感器的缩放是 (2’ - 2) / (3’ - 3)。 计算中间窗口:4’ - 4 = (5’ - 5) * (3’ - 3) / (2’ - 2)

  5. 计算并应用主机缩放 = (6’ - 6) / (4’ - 4)

  6. 计算并应用主机裁剪:6 - 7 = (5 - 2) * (6’ - 6) / (5’ - 5)