福州瑞芯微电子有限公司
密级状态: 绝密() 秘密() 内部资料() 公开(√ )
视频通话 APK 之 camera 方向问题说明手册
文件状态:
[ ] 草稿
[ ] 正式发布
[√] 正在修改
文件标识:
当前版本:
作 者:
完成日期:
1.0
张云龙
2015-05-21
本文档为瑞芯微电子成员撰写及提供,不得用于工作之外的使用及交流。
福州瑞芯微电子有限公司
1 适用平台
本文档适用于 RK3066,RK3188,RK312x, RK3288,RK3368。
2 概述
camera 是有方向的,从模组规格书中可知 camera 的原始方向。装 camera 时,
camera 原始方向与 LCD 长边方向只能是 0 度或者 180 度,如果装错 90 度,软件上是
无法修复的。
Camera sensor 送出来的都是横屏分辨率的数据(宽大于高,比如 800x600,不会
送出 600x800),不管屏幕怎么转动都是一样的。sensor 只有一个正方向,转动 sensor
(或者说机器)时,sensor 出来的图像实际上相当于 sensor 不动,外部景象进行反向
旋转。
不管机器旋转到哪个方向,屏幕都能正常显示图像是因为系统根据配置的 camera
角度,系统方向及 gsensor 角度等,对要显示的图像做了必要的旋转。
图 1 LCD 方向和 Sensor 方向
本文档为瑞芯微电子成员撰写及提供,不得用于工作之外的使用及交流。
福州瑞芯微电子有限公司
3 术语解释
3.1 mirror 和 flip
图 2 mirror and flip
4 确定 APK 获取数据的方式
视频 APK 取得帧数据有两种方式,一种通过设置 preview data callback,另一种从显示 buffer 中获
取。
RK312x/3288/3368 平台:
在hardware\rockchip(4.4中是rk29)\camera\CameraHal\ AppMsgNotifier.cpp中的processPreviewData
Cb函数中加打印信息,如果视频通话时有打印你加的信息说明走的是datacallbak方式,否则就是
从显示buf中取数据。更彻底的判断方法是:
图 3
RK3066/3188 平台:
hardware\rk29 \ camera\ CameraHal.cpp
本文档为瑞芯微电子成员撰写及提供,不得用于工作之外的使用及交流。
福州瑞芯微电子有限公司
加上图中框中的一行代码。
如果视频通话时显示绿色,说明走的是 datacallback。如果本地端画面及传给对方的画面都是绿色,
说明两者取得帧数据的方式一样。已知 QQ 和微信都是这种方式。
5. camera 的相关方向
5.1 配置 camerainfo 中的方向。
hardware\rockchip\camera\CameraHal\CameraHal_Module.cpp 中 camera_get_camera_info 函数中
图 4
这里是将 camera 的角度信息上报给 service 层,
这些宏可以在 hardware\rockchip\camera\CameraHal\CameraHal.h 中设置:
本文档为瑞芯微电子成员撰写及提供,不得用于工作之外的使用及交流。
福州瑞芯微电子有限公司
图 5
其中:
CONFIG_CAMERA_ORIENTATION_SKYPE 是宏开关,若要开启,设为 1
CONFIG_CAMERA_BACK_ORIENTATION_SKYPE 是后置摄像头的角度信息,可以设为 0、90、180、
270。
CONFIG_CAMERA_FRONT_ORIENTATION_SKYPE 是前置摄像头的角度信息,可以设为 0、90、180、
270。
另外,需要加上调用者进程名的判断,调用者进程名可以直接将图 3 中的 process_name 打印出来,
或者查看进入 APK(如 QQ)视频通话时 logcat 打印信息中有:Calling process is:xxxxxx。
注意:一定要打印进程名,不要臆想,如QQ 视频通话的进程名是com.tencent.mobileqq:video 而不
是com.tencent.mobileqq。
5.2 对帧数据进行 mirror 和 flip
hardware\rockchip\camera\CameraHal\CameraHal.h 中两个宏:
图 6
CONFIG_CAMERA_FRONT_MIRROR_MDATACB_APK 左右镜像
CONFIG_CAMERA_FRONT_FLIP_MDATACB_APK 上下翻转
(3188 和 3066 平台代码中只有 CONFIG_CAMERA_FRONT_MIRROR_MDATACB_APK 宏)
这两个宏就是分别对通过 datacallback 获取的帧数据进行 mirror 或 flip。
在宏里追加上你要处理的 APK 进程名即可,进程名的获取方式参见 5.1。
如果当前已经是左右镜像或者上下翻转了,且相应宏中有该 APK 进程名,则去掉之。
注意,这两个宏默认只对前置摄像头有效果,如果要对后置摄像头处理,可自行参考实现。
5.3 sensor 寄存器中的 mirror 和 flip
一般 sensor 寄存器都可配置 mirror 和 flip(有的叫 updown),使得 sensor 输出的图像就是镜像或翻
转的。
本文档为瑞芯微电子成员撰写及提供,不得用于工作之外的使用及交流。
福州瑞芯微电子有限公司
图 7
5.4 系统方向参数
系统方向直接影响 camera 画面的显示方向。
root@rk3288:/ # getprop | grep rotation
[ro.sf.fakerotation]: [true]
[ro.sf.hwrotation]: [270]
这两个决定了横竖屏方向,一般来说,需要同时设置,具体如何使用也没搞得很懂,只有尝试着
调。
配置文件为/system/build.prop,修改该文件中的 ro.sf.fakerotation 和 ro.sf.hwrotation 的值后,push
到/system/下,要 chmod 755 改一下权限,否则可能导致重启后无法进入系统。
这两个属性的值修改后,需要配合修改 gsensor 的方向,使得系统方向正确。
6 常见问题分析
视频通话 APK 的方向调节,就是通过上面章节 5 中的几种方式来调节的,有的只需其中一种方式
调节,有的需要几种方式配合调节,一般情况下可以调节过来,如果无论如何也调不过来(如模组
真的装错了方向?),那么很抱歉,我们也没有办法。如果本地端与送给对方的画面始终都不能调
正确,那么先保证本地端的方向正确。有的视频通话 APK 本身有旋转方向的功能,既然有这个功能,
应该也考虑到确实存在方向的问题吧。
本文档为瑞芯微电子成员撰写及提供,不得用于工作之外的使用及交流。
福州瑞芯微电子有限公司
案例 1
图 8 平板端 图 9 电脑端
如上图中的 QQ 视频,机器 A 的本地预览画面 A2 方向正确,但对方传过来的画面 A1 却是显
示旋转了 270 度(逆时针 90 度);机器 B 同样,本地端 B2 正确,对方传过来的画面 B1 显示旋转了
270 度(逆时针 90 度)。而 B 是电脑端,数据方向应该是没错,那么方向问题就出在平板端。
初步分析,机器 A 显示对方传过来的画面(这个数据是通过网络传输到 QQ,QQ 直接显示,
不经过我们处理)倒了 270 度,并且送去对方的数据也倒了 270 度,可以认为是系统方向没调好,
因为电脑端 B 送来的画面肯定是正确的,QQ 只是根据系统设定的方向进行了调整,QQ 认为倒 270
度是正确的方向,所以就倒 270 度的显示出来了。实验证明,使用 5.1 和 5.2 的调节方式确实都
无法将本地及送给对方的同时调正确。
查看机器的系统方向参数:
ro.sf.fakerotation=false
ro.sf.hwrotation=0
改成这样:
ro.sf.fakerotation=true
ro.sf.hwrotation=270
机器转屏就会差 270, 而这时的 gesene 差 90 度,好像镜像一样(两轴 gsensor),最后把 gsensor 的 x y
对调,调好 gsensor 之后,QQ 视频画面就显示正确了。
本文档为瑞芯微电子成员撰写及提供,不得用于工作之外的使用及交流。
福州瑞芯微电子有限公司
案例 2
现象:视频通话中,竖屏时前置摄像头本地显示方向正确,送给对方的也显示正确,转为横屏时,
前置摄像头本地显示倒立,送给对方的也显示倒立。
首先确认,竖屏时前置摄像头显示效果是不是跟照镜子类似,可左右移动一下头部看看。如
果不是跟照镜子一样,那么按照 5.2 中方式进行 mirror 处理,应该就可以调正确。
如果前置摄像头显示效果已经跟照镜子效果一样,那就是其他原因了,尝试结合 5 章节中的
几种方式进行调节。
案例 3
现象:视频通话中,本地端显示倒立,送给对方的也显示倒立。
可以通过 5.2 中的 flip 方式进行调节,如果 flip 宏中有该进程名则去掉,没有则追加上。3188 和
3066 平台代码没有 flip 宏,可尝试通过 5.1 中的方式对后置摄像头旋转 180 度调节。
本文档为瑞芯微电子成员撰写及提供,不得用于工作之外的使用及交流。