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¶
不要触摸输入矩形 - 它已经是最佳的。
计算当前传感器缩放
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
对传感器输出窗口应用迭代传感器 S_FMT。
subdev->video_ops->s_fmt(.width = width_s_out)
检索传感器输出窗口 (g_fmt)
计算新的传感器缩放
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
使用 CEU 裁剪裁剪到新窗口
ceu_crop(.width = width_ceu, .left = left_ceu)
使用 CEU 缩放缩放到请求的用户窗口
scale_ceu = width_ceu / width
9.1.10.4. S_CROP¶
“...规范没有定义原点或单位。但是,按照惯例,驱动程序应水平计数相对于 0H 的未缩放样本。”
我们选择遵循该建议并将裁剪单位解释为客户端输入像素。
裁剪按以下 6 个步骤执行
从传感器请求完全用户矩形。
如果较小 - 迭代直到获得更大的矩形。 结果:传感器裁剪到 2 : 2’,目标裁剪 5 : 5’,当前输出格式 6’ - 6。
在上一步中,传感器已尝试尽可能好地保留其输出帧,但它可能已更改。 再次检索它。
传感器缩放到 3 : 3’。 传感器的缩放是 (2’ - 2) / (3’ - 3)。 计算中间窗口:4’ - 4 = (5’ - 5) * (3’ - 3) / (2’ - 2)
计算并应用主机缩放 = (6’ - 6) / (4’ - 4)
计算并应用主机裁剪:6 - 7 = (5 - 2) * (6’ - 6) / (5’ - 5)