camera 旋转的故事

来源:互联网 发布:中国人工智能产品展会 编辑:程序博客网 时间:2024/05/16 08:45

不断总结中

实践+经验,总结,非纯理论性总结。只是对最近工作的经验型总结。

经过三天连续的camera第三方旋转,头大,眼花。还把李龙会搞疯了。嗯 我表示很满足。OK,开始正题。

根据这几天的测试结果。我得到如下结论。

1, 首先

修改这里,会导致收驱动层就是sensor中的  XXX_v4l2.c文件 

这里面是真正的驱动,这里改寄存器的地址,做到真正的旋转。这里一改。所有的都转了。由于目前的测试还不够,只知道这里改变预览是一定影响,从咱们自己的camera到第三方的camera都会旋转。

然后是kernel中的arch/arm/mach-msm/board-msm7627a-camera.c 姑且认为这里是假的驱动层

剩余问题

2, 照片会不会旋转,有待于测试。

3, 学习驱动。

1, 咱们自己的camera,无论是预览,还是照片,录像,都倒置。

2, skype倒置,(看到这里的时候我突然想起来陈梅是如何 一下子就将咱们自己的cameraskype都弄好了 因为这里对于咱们自己的cameraskype的影响是相同的)

3, gtalk倒置

4, QQtango,等一些第三方的照相机 没有变化 

改变代码如下

这个是改变的 802 的前置摄像头 0339

这里的这个mount_angle 的值,根据经验和分析,知道这个值是将来的CameraInfo里面的ortation 方向值,根据google官方的方法,最后setdisplaypreview(degree) 这里的这个degree是用来填补,屏幕和摄像头的差值的。

google 通过该统一方法来实现 camera的旋转方向。result 则为 屏幕和摄像头之间的差值。

以我的分析 这里的组模 就是该值。很ok 没有问题

自然会有人问 为什么这里更改了 有的应用摄像头反了,有的没有饭。很简单,因为有些应用不用该值。那有人问了,那那些不改变的是如何得到的这个result

这个有待于进一步研究。

我猜测:他们是直接通过hal层读取驱动的数据,经过jpegdata流分析数据,虽然看起来撤但是一点也不撤。

咱们自己的camera中,在camera.java中有一个方法类专门用于分析data的方向,然后根据这个方法类得到的放向值,存储照片。

虽然猜测不一定对,但是这真的是一种方法。

最简单弥补这个差值的方法是 读取 驱动里面的方向,然后读取屏幕的方向,然后直接填补。

你看是否就很OK了 。当然这只是我个人的猜测。

问我 如何读取驱动的值?算了 我还是洗洗睡吧。

咱们自己的camera是通过官方框架的那个方法读取的,也就是那个camerainfo很重要

然后下一步就是hardware层了

其实我很怀疑 李龙会 告诉我这里是hal层能改变 camera预览 我觉得不会

因为有很明显的证据

也有可能是她模糊性的告诉我这一带而我理解成了,这能改变。(对于她我还是很感激的)

目录hardware/qcom/camera/QCameraHWI_Parm.cpp

该类是控制jpeg编码方向的一个文件。 经过我多次反复的测试和实验。

再加上代码的分析得到以上结果。

请看

方法的目的很明确么,设置一个方向值,方向值哪里来的,显然是这个CameraParameters

你连接camera的时候 camera的所有参数都有个默认值,如果你不更改这个默认值当然不会改变。

问我为什么这么分析,两点。

1, google官方介绍 关于Parameters.setRotation 

If applications want to rotate the picture to match the orientation of what users see, apps should use OrientationEventListener and Camera.CameraInfo. The value from OrientationEventListener is relative to the natural orientation of the device. CameraInfo.orientation is the angle between camera orientation and natural device orientation. The sum of the two is the rotation angle for back-facing camera. The difference of the two is the rotation angle for front-facing camera. Note that the JPEG pictures of front-facing cameras are not mirrored as in preview display.

2, 继续看下面的代码

2791行 哪明显应该是调用驱动 根据名字判断 编码方向

下面是获取方向的方法 你问我这个 mRotation 是哪里来的,很简单就是我介绍的这个hardware文件方法获取的 就是那个

至此我只调整了这几处,就将camera完全调整好。当然 framework里面的高通补丁也绝对给力,高通很给力,也很不给力,改好skype的同时不考虑其他问题。

主要调整的 就是 kernel里面的东西。

这里是一个initdefault方法 给予一些默认值

并且这里发现了一个 setNoDisplayMode方法 是否是那种不开预览 然后可以调用照相机呢?也就是传说中的屏幕不显示,而可以进行偷拍。如果是的话,手机跟踪里面这个功能貌似可以用。

然后看frameworks中的代码 我看到更改的只有这一处。

CameraService.cpp文件

这个类是一个客户端类 具体用法我就不说了,我只说更改和分析。

很明显看到 高通代码 其实没有更改,只是对这里的值做了一个优化

这个是在client构造函数里面执行的很明显 如果根据判断是给予值

这个方法代码如下

如果是前置摄像头 就走else 后置摄像头走if 不多解释

这里 我只说 else 路线

这里的HAL_TRANSF0RM_FLIP_H/V FLIP是反转的意思不多解释

这里是对称 根据已得到的位置然后进行对称。我曾经把这些换成了与上面相同的情况 结果

得到了非镜像照片OK不解释了。

现在是camera的应用层 我看了好久的代码这里稍微分析一下主要的旋转方法。

关于Camera/VideoCamera的旋转 在方法类里面

文件名 Util.java 如果是预览反了请看这里。

Camera.java/还有VideoCamera.java中 有如下两个地方

Camera.java

VideoCamera

Util.getDisplayRotation(this) 这个方法很重要

上面的方法获取 当前屏幕的角度值

下面根据 CameraInfo得到result 然后最后设置 

这里是预览的设置

关于图片的存储方向 也有一个方法 但是这个方法有一定的问题,在我测试的过程中,出现改变该值可以保存,但是gallery中访问该照片的时候gallery挂掉

该地方为存储照片的代码

Camera.javastoreImage方法中

其中有个orientation 这个是控制照片的存储方向

它的得来 如下

data是 camera调用 takepicture 方法 返回来的照片数据 类型为 byte[]

注,如果在这里改,有问题。照出来的照片gallery预览导致gallery崩掉。

下面是 VideoCamera.java 录像结果旋转 方向是

其中的mOrientation 是方向监听器获取的 如此才能保证无论你什么方向拿手机摄像出来都是正方向的界面。

至于 全景 和照相机情况OK

介绍到这。

以上是对这段时间对于自己camera 第三方应用camera 的总结。

请斧正。

沈文健

2012-11-22

前置摄像头 手机旋转90° 图像旋转180 °

先改这个地方,0x20 0x21, 0x22, 0x23四种,等图像方向正了,可能会出现颜色不对

再修改CAMIF_BAYER_G_RCAMIF_BAYER_R_GCAMIF_BAYER_G_BCAMIF_BAYER_B_R

标题 后置摄像头  手机旋转90° 图像旋转180° 

gc2035.h

这里的寄存器值 还能 只让图像翻转 不具有标题功能

原创粉丝点击