最近负责一个项目(手机)上camera的功能,其中有要求做zoom这个功能(项目上要求对所有的分辨率都可以支持4X的zoom),所以把这个部分比较全面的学习了一下,本文对高通在android平台上zoom的实现原理做一个深入的分析,包括的部分主要有zoom功能所涉及高通HW模块的原理架构、高通在android软件中digital

zoom的实现流程以及具体的相关接口参数介绍,旨在让读者能够对高通android平台下digital

zoom的实现原理及架构有一个清楚的了解。

1. Digital zoom

原理介绍

这里提到的digital

zoom,即数码变焦,是相机变焦的一种;另外一种为光学变焦,主要是在数码相机中有所应用,它通过相机镜头的移动来放大与缩小需要拍摄的景物,光学变焦倍数越大,能拍摄的景物就越远,而且不会影响画质。本章节重点介绍数码变焦部分,这种变焦在手机中应该较为广泛。

手机上的数码变焦是通过手机内的处理器,把图片内的每个象素面积增大,从而达到放大目的。这种手法如同用图像处理软件把图片的面积改大,不过程序在手机内进行,把原来sensor上的一部份像素使用"插值"处理手段做放大,将sensor上的像素用插值算法将画面放大到整个画面。通过数码变焦,拍摄的景物放大了,但它的清晰度会有一定程度的下降,所以数码变焦并没有太大的实际意义。

下图是数码变焦和光学变焦的效果对比,一目了然。

数码变焦一般分为分为2个步骤,crop和插值放大。另外,数码变焦有2种状况:一种是用户需要拍照画面的尺寸和sensor输出画面的尺寸是一致的;另一种则是用户需要拍照画面的尺寸×zoom等级

后比sensor输出画面的尺寸小。在第二种情况下只需要crop就可以了(具体要根据zoom等级计算)

关于zoom的等级,倍数越高,crop的像素就越少,以拍照3M(2048×1536,sensor输出的原始照片为3M)的照片为例,如果做2X的zoom,那么需要从原始照片中crop出1024×768的画面,然后再插值放大成2048×1536;如果是4X的zoom,那么需要从原始照片中crop出512×384的画面,然后再插值放大成2048×1536,以此类推。倍数是指宽和高的倍数,而非面积。

下面结合图片来说明一下数码变焦的原理:

1、当用户需要拍照画面的尺寸和sensor输出画面的尺寸一致

原始照片,红色部分为zoom后需要crop的部分

Zoom后的照片,crop后并插值放大

可以发现,zoom前后照片大小是一致的,但照片的范围变小了,感觉是镜头拉近了,其实就是通过crop后再插值放大来完成,zoom的倍数越高,需要插值的像素就越多,zoom后的照片就会越模糊。

Note:这里的插值放大是指软件算法,和图像处理软件中那种线性放大是不同的,关于算法的实现这里不多介绍了。

2、用户需要拍照画面的尺寸×zoom等级后比sensor输出画面的尺寸小

下图是sensor输出的原始照片,1600×1200。需要拍照的分辨率为800×600,即可以作2X

的digital

zoom

1600×1200原始照片

下图是通过crop完成的2X

zoom

2X zoom后的照片,大小为800×600

在这种状况下是不需要插值放大的,图片的质量并没有降低;但如果zoom的等级比较大,比如要4x的zoom,那么光靠crop是不行的,还是得再通过插值放大来完成。通常说来,如果拍照的分辨率比较小,zoom大都可以只通过crop的方式来完成。在上章节中介绍了digital

zoom的效果以及基本的实现原理,本章将着重介绍高通平台上实现digital

zoom所涉及的相关模块架构,因为digital

zoom是camera中的一个feature,分别需要在preview和snapshot中完成,

所涉及的相关模块也都是和camera相关的,如下所示:

上图是preview的时候,digital

zoom所涉及的相关模块,各个模块的用途如下(这里主要介绍sensor、VFE和MDP):

1、Sensor

虽然本身也有zoom的功能,但在这里并未使用。Preview时如果做digital

zoom,只是正常的输出frame而已,比如输出30fps的VGA

数据(YUV)。

2、VFE

DSP的一部分,功能主要都是和图像处理相关,在zoom的时候,它的用途主要就是Crop(剪裁),它会把sensor输出的VGA数据crop成preview时所需要大小的数据,如CIF(352×288),这样的话相当于已经做了一部分zoom(640/352),大概是1.8X,如果不够,剩余的zoom将由后面的MDP来完成。

Note:VFE只有crop的功能,没有up

scale(放大)的能力,所以VFE最多只能完成有限的zoom。

3、MDP

这是一个专门处理显示数据的处理器,功能比较齐全,在zoom的时候主要的用处就是crop+up

scale。因为VFE的zoom能力有限,所以当VFE不能满足要求的时候,MDP则继续完成剩余的zoom,比如:如果要求preview画面的大小为QVGA,现在要做4X的zoom,那么VFE会从原始的VGA数据中crop出QVGA大小的数据,相当于已经做了2X的zoom,那么剩下的2X

zoom怎么做呢?MDP会从VFE输出的QVGA(320×240)数据中crop出160×120大小的数据(从中间截取),然后再upscale成QVGA大小的数据送到LCD显示,这样相当于又做了2X的zoom,所以加起来一共做了4X的zoom。

Note:MDP最大可以进行4X的upscale。

上面介绍了preview时zoom的实现,下面来看一下拍照时zoom是如何实现的?

Note:为了满足所拍为所看,即拍下来照片的景物范围和preview时所看到的景物范围要保持一致,preview时和snapshot时的zoom

level必须保持一致。

下面介绍一下snapshot时各个模块对于zoom的用途:

1、

Sensor

输出拍照需要的原始数据。在当前应用中,不管设置的拍照分辨率是多少,我们要求sensor输出的拍照数据是固定的,即最大3M(2048*1536,以ICE为例)。

2、

VFE

功能和preview时候是一致的,只不过在拍照的时候,VFE会根据zoom的等级以及需要拍照的分辨率来自动crop出合适大小的数据。

例如选择拍照的分辨率为2048×1536,zoom的level为4X,那么VFE将从原始的2048×1536的数据中crop出512×384大小的数据,后面的zoom由Video

core中的jpeg

encoder完成。

还有一种状况,如果拍照的分辨率较小,那么有可能只通过VFE的crop就可以完成zoom功能,比如拍照的分辨率为1024×768,这个时候如果做2X的zoom,那么VFE只需要从原始的2048×1536的数据中间直接crop出1024×768的数据即可,后面就不需要再用jpeg

encoder来zoom了。但如果zoom的等级比较高,后面的2X

zoom还是要通过jpeg

encoder来做了。

3、

Video core

负责把VFE输出的数据encoder成jpeg文件,这里的jpeg

encoder还有一个比较重要的功能,那就是upscale,通过这个功能,再搭配之前VFE的crop功能,zoom就可以完成了。

Note:Jpeg encoder的upscale功能是有限的,最大可以进行4X的放大,目前可以满足ICE上的需求。

可以看出,从HW架构来说,preview和snapshot只是在后面的upscale部分有所区别,前者是通过MDP来完成,后者则是通过jpeg

encoder(DSP)来完成。

3.

高通 Android平台软件架构分析(digital

zoom相关)

本章将从软件角度来分析一下高通Android平台下digital

zoom的架构以及实现流程,下面先来看一下Android中camera部分的软件架构。

Note:目前以Android

donut版本为例,高通在android

éclair版本上还没有导入

上图中粉色阴影部分是preview时所涉及到的部分,蓝色阴影部分为snapshot时所涉及的部分;其他为公共部分。

先来看一下Preview的流程:

1、VFE

driver会把从sensor传送来的frame数据crop成上层需要的大小(具体如果crop要根据zoom的level),然后连同crop信息一起把数据传送到HAL。

2、HAL层不会对preview数据做任何处理,它会这些数据原封不动的callback到camera service,同样包含crop

info(下章节会详细介绍crop info)。

3、Camera service在一开始的时候会在surfaceflinger中创建一个surface。当camera

service收到preview数据的时候,2个主要接口会被调用:

1) zoomUpScale_callback

通过调用mSurface->updateCropRect接口把crop相关信息通知给surfaceflinger

2) previewCallback

通过调用mSurface->postBuffer接口把preview的数据传递给surfaceflinger。

4、Surfaceflinger收到数据和crop信息后会调用copybit的接口来驱动MDP去做相关的动作(crop&upscale),然后就去画屏了。再来看一下snapshot时的流程:

1、VFE

driver把从sensor传递来的原始拍照数据(最大分辨率:2048×1536)crop成zoom需要大小的数据,连同crop信息一起传递给HAL。

2、HAL层收到snapshot的数据后会先去检查crop info,判断是否需要jpeg

encoder去做upscale的动作。如果不需要就直接encode成jpeg数据;如果需要,填好upscale的参数再做encode。

3、Jpeg encoder后的数据会从HAL callback到camera service,camera

service会在通知上层去把数据写成文件。

由此可见,在snapshot的时候,整个zoom在HAL就可以完成了,而不像preview的时候,需要在surfaceflinger中配置MDP协助完成。具体的原理在第二章节中有详细的叙述,这里就不重复了。

4.

Zoom相关接口及参数介绍

本章将从代码的层次来分析一下zoom的实现原理及流程。

Note:基于高通5110 release的code

首先来看一些配置参数(基于HAL):

#define MAX_ZOOM_LEVEL

5//对于user来说可以zoom的等级

static const int ZOOM_STEP =

6;//每次zoom时的幅度,可以修改

另外需要说明高通VFE中zoom的最大值为60(和分辨率无关)。所在在ICE上我们应该让MAX_ZOOM_LEVEL×ZOOM_STEP=60。要么增大MAX_ZOOM_LEVEL,要么增大ZOOM_STEP。

下面再来看一下zoom等级的对应关系(高通可以做到最大的就是zoom

4X,这个是HW(MDP和jpeg

encoder)的限制):

下面看一下HAL层zoom的接口

HAL层的接口比较简单,就是setZoom,上层传递一个zoom的level即可,执行时会判断参数,如果没有超出则通知VFE进行crop,如下:

Note:Éclair版本上还没有ready,上述code是参考donut版本

所以surfaceflinger在更新画面的时候就会根据这些参数来配置MDP,完成后续的操作了。

拍照的时候同样也是这样的原理,差别在于crop中的信息不需要传递给上层,而是直接传递给jpeg

encoder即可(写到mDimension这个结构体中),如下(HAL中的receiveRawPicture函数):

Jpeg

encoder完成后,HAL只需要把zoom好的jpeg

data callback给上层就OK了,所以拍照部分的zoom不需要上层额外的处理。

下面看看Camera service里面是怎么处理的?

Camera

service收到callback后会把crop相关信息及标志更新到preview所申请的surface中,如下:

下面看一下VFE输出数据的格式:

在Preview的时候,通过MSM_CAM_IOCTL_GETFRAME系统命令从底层得到preview的数据,格式如下:

buffer为数据地址,y_off和cbcr_off分辨为Y的偏移和CBCR的偏移,通过y_off=0,cbcr_off=w*h,这里和zoom相关的是cropinfo,比较重要,如下:

可以看出有2个buffer的参数,其中1是preview的,2是snapshot的。如果没有开启zoom功能,这些参数都是空的;如果zoom的level比较低,VFE足以处理,那么这些参数也是空的。

只有当VFE不足以处理所需要的zoom level时,这些参数的值才有意义。具体含义如下:

out的值代表上层需要数据的宽和高,比如说上层设置的preview大小为480×320,那么out1_w=480;out1_h=320;而in的值则代表后端的MDP或是jpeg

encoder需要crop的大小,举例来说明:

Sensor输出VGA

preview画面,MMI设置HVGA

preview大小,如果要做2X的zoom,VFE能力有限,只能做640/480=1.3X,这个时候VFE输出数据是crop后的HVGA数据,crop信息中的in1_w=320;out1_w=216,意思是后面的MDP需要从HVGA的数据中crop出320×216大小的数据,然后在scale成HVGA,这样整体算起来就是zoom

2X了。

所以HAL只需要将preview数据以及crop info传递给上层即可,这里是通过callback进行的,如下:

android原理分析博客,高通Android平台下zoom4X实验原理分析(一)相关推荐

  1. 高通Android平台下zoom4X实验原理分析

    最近负责一个项目(手机)上camera的功能,其中有要求做zoom这个功能(项目上要求对所有的分辨率都可以支持4X的zoom),所以把这个部分比较全面的学习了一下,本文对高通在android平台上zo ...

  2. 高通sxr2130平台下(aarch64系统),死机问题分析

    高通sxr2130平台下(aarch64系统),死机问题分析 举例 二级目录 三级目录 正文 通过qcap解析得到结果如下(参看附件中的QCAP 3.0 Report.html): 61.586598 ...

  3. android加载efi分区,高通Android UEFI XBL 代码流程分析

    高通Android UEFI XBL 代码流程分析 背景 之前学习的lk阶段点亮LCD的流程算是比较经典,但是高通已经推出了很多种基于UEFI方案的启动架构. 所以需要对这块比较新的技术进行学习.在学 ...

  4. android 副屏驱动_高通 android平台LCD驱动分析

    目前手机芯片厂家提供的源码里包含整个LCD驱动框架,一般厂家会定义一个xxx_fb.c的源文件,注册一个平台设备和平台驱动,在驱动的probe函数中来调用register_framebuffer(), ...

  5. android wifi热点项目总结,高通Android wifi移植和wifi热点问题总结

    由于开发环境和系统的差异,wifi移植,包括wifi热点开启时有时还会出现其他问题,我这里先总结下: 1.netd问题 Netd 就是Network Daemon 的缩写,表示Network守护进程​ ...

  6. 高通Android智能平台环境搭建_编译流程分析

    高通Android智能平台环境搭建_编译流程分析 高通平台环境搭建,编译,系统引导流程分析 TOC \o \h \z \u 1. 高通平台android开发总结. 7 1.1 搭建高通平台环境开发环境 ...

  7. 高通Android display架构分析

    目录(?)[-] Kernel Space Display架构介绍 函数和数据结构介绍 函数和数据结构介绍 函数和数据结构介绍 数据流分析 初始化过程分析 User Space display接口 K ...

  8. 高通android智能平台环境搭建_编译流程分析,高通平台环境搭建,编译,系统引导流程分析参考...

    高通有两个cpu,他们分别跑不同的系统,应用程序(ap)端是android系统,modem 端是高通自己的系统. 要编译出可供烧写使用的镜像文件需要三部分代码: 1) 获取经过高通打补丁的 andro ...

  9. 高通Android智能平台开发总结

    高通Android智能平台开发总结 1. 高通平台android开发总结. 7 1.1 搭建高通平台环境开发环境. 7 1.2 搭建高通平台环境开发环境. 7 1.2.1 高通android智能平台概 ...

最新文章

  1. 错误: 编码 GBK 的不可映射字符 (0x80)
  2. Golang 微框架 Gin 简介
  3. 在大数据里:Hadoop可能是你的救命稻草
  4. linux刷新磁盘_Linux内核Page Cache和Buffer Cache关系及演化历史
  5. jvm高并发_JVM上的高并发HTTP客户端
  6. 【NC30】缺失的第一个正整数
  7. Element ui 中的Upload用法
  8. mysql的事务日志_MySQL 事务日志
  9. android 使用shell模拟触屏_Appium常用操作之「微信滑屏、触屏操作」
  10. python pandas教程pdf_学习python中的pandas有没有好的教程推荐?
  11. Photoshop怎么实现图片局部马赛克
  12. idle运行python_python中的idle是如何运行的
  13. Webview 非http或者https的网络请求拦截
  14. html渐变色原理,CSS渐变色效果的实现方法与效果演示
  15. %appdata% 代表什么?
  16. google 浏览器下载历史版本的方法
  17. 织梦后台模块管理空白不显示的解决方法
  18. 兰德公司:零日漏洞平均生存期为6.9年
  19. jq input输入框失焦、聚焦
  20. 大明最不该被遗忘的英烈——李定国

热门文章

  1. 成才之路(6):名利观
  2. vue日期时间转换为年月日格式
  3. Wework考虑出售旗下公司,特斯拉能看电影和唱K!|每周硅谷热闻 ​
  4. git常见问题解决方法总结
  5. MaNGOS-Zero源码学习之realmd认证登录服务器(一):认证登录基本流程
  6. libgdx 3D 渲染优化
  7. 【c++】简单了解并行计算库PPL
  8. Activity生命周期学习总结2
  9. 不写脚本,也可以拍摄、剪辑好视频,教你一个快速有效的方法
  10. 频率传感器信号采集隔离转换电压或电流信号隔离变送器