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)