Camera APP 问题集锦
发布日期:2021-06-29 13:07:46 浏览次数:2 分类:技术文章

本文共 10108 字,大约阅读时间需要 33 分钟。

1、AE trigger & AF trigger同一帧下,precapture在flashback后导致打闪拍照过曝

[DESCRIPTION]

AE trigger & AF trigger同一帧下,task precapture在task flashback之后执行,
因为CCU 的关系导致打闪过曝

Key log

193614 01-02 08:16:16.754380  4749  8746 D HwIRQ3A : [wait] VSIrq193711 01-02 08:16:16.755157  4749  4749 W Hal3Av3 : [parseMeta] MTK_CONTROL_AE_PRECAPTURE_TRIGGER(0 -> 1)193713 01-02 08:16:16.755172  4749  4749 W Hal3Av3 : [parseMeta] MTK_CONTROL_AF_TRIGGER(0 -> 1)195209 01-02 08:16:16.800254  4749  8746 D Task3AFlashFront: [run] Cam 1 : Req(#83)/Stt(#80)/i4Opt(4)/FlashOnOff(0) Lv(47)/ISO(661)/RGB(928,512,777) isMvHDREnable(0)196698 01-02 08:16:16.822016  4749  8746 D HwIRQ3A : [wait] VSIrq196809 01-02 08:16:16.826421  4749  8746 D Task3AFlashFront: [run] Cam 1 : Req(#84)/Stt(#81)/i4Opt(4)/FlashOnOff(0) Lv(47)/ISO(661)/RGB(928,512,777) isMvHDREnable(0)196879 01-02 08:16:16.827893  4749  8884 I FlashHal: setOnOff(): type(1), enable(1), scenario(3).198486 01-02 08:16:16.858199  4749  8746 D HwIRQ3A : [wait] VSIrq198587 01-02 08:16:16.861808  4749  8746 D Task3AFlashFront: [run] Cam 1 : Req(#85)/Stt(#82)/i4Opt(4)/FlashOnOff(0) Lv(49)/ISO(661)/RGB(928,512,777) isMvHDREnable(0)198591 01-02 08:16:16.861837  4749  8746 W Task3AFlashFront: [destroy] +198594 01-02 08:16:16.861852  4749  8746 W Task3AFlashFront: [destroy] -......209792 01-02 08:16:17.261165  4749  8746 D HwIRQ3A : [wait] VSIrq210148 01-02 08:16:17.266840  4749  8746 D Task3AFlashBack: [run] Cam 1 : Req(#97)/Stt(#94)/i4Opt(0)/FlashOnOff(0) Lv(52)/ISO(658)/RGB(928,512,777)210237 01-02 08:16:17.272179  4749  8746 W Task3AFlashBack: [destroy] +210240 01-02 08:16:17.272206  4749  8746 W Task3AFlashBack: [destroy] -211164 01-02 08:16:17.294890  4749  8746 D HwIRQ3A : [wait] VSIrq211475 01-02 08:16:17.298533  4749  8746 D Task3APrecap: [run] Frame Count(1) - doPrecapAE211489 01-02 08:16:17.298741  4749  8746 D Task3APrecap: [run] Cam 1 : Req(#98)/Stt(#95)/i4Opt(4)/FlashOnOff(0) Lv(46)/ISO(658)/RGB(928,512,777) Exist(0)

正常的flow预期应该是:task3APrecap -->task3Aflashfront–>task3atouch—>task3aflashback,

目前flow 中因为需要处理部分三方APK下发 trigger 时序异常导致 task 执行异常的问题,针对 AE trigger 和 AFtrigger 创建的预闪的 flow 做了对应的处理。
而在同一帧下AE/AF trigger 不应该改变 task 执行的顺序

[SOLUTION]

针对开启了CCU的平台 ,这类问题解法方案如下

diff --git a/aaa/source/common/hal3a/v1.0/Hal3AAdapter3.cpp b/aaa/source/common/hal3a/v1.0/Hal3AAdapter3.cpp

--- a/aaa/source/common/hal3a/v1.0/Hal3AAdapter3.cpp+++ b/aaa/source/common/hal3a/v1.0/Hal3AAdapter3.cpp@@ -2708,19 +2708,6 @@ setNormal(const vector
& requestQ)mpHal3aObj->send3ACtrl(E3ACtrl_SetHalHdr, MFALSE, NULL);}- AAA_TRACE_HAL(AF_trigger);- // AF trigger start- if (mAfParams.u1AfTrig == MTK_CONTROL_AF_TRIGGER_START || mAfParams.u1AfTrigStart)- {
- mpHal3aObj->autoFocus();- }- // AF trigger cancel- else if (mAfParams.u1AfTrig == MTK_CONTROL_AF_TRIGGER_CANCEL)- {
- mpHal3aObj->cancelAutoFocus();- }- AAA_TRACE_END_HAL;-if ( (mParams.u1PrecapTrig == MTK_CONTROL_AE_PRECAPTURE_TRIGGER_START &&mParams.u4AeMode != MTK_CONTROL_AE_MODE_OFF) || mParams.u1PreCapStart){
@@ -2735,6 +2722,19 @@ setNormal(const vector
& requestQ)mpHal3aObj->sendCommand(NS3Av3::ECmd_PrecaptureEnd);}+ AAA_TRACE_HAL(AF_trigger);+ // AF trigger start+ if (mAfParams.u1AfTrig == MTK_CONTROL_AF_TRIGGER_START || mAfParams.u1AfTrigStart)+ {
+ mpHal3aObj->autoFocus();+ }+ // AF trigger cancel+ else if (mAfParams.u1AfTrig == MTK_CONTROL_AF_TRIGGER_CANCEL)+ {
+ mpHal3aObj->cancelAutoFocus();+ }+ AAA_TRACE_END_HAL;+mpHal3aObj->sendCommand(NS3Av3::ECmd_Update, reinterpret_cast
(&_3AProf));

diff --git a/aaa/source/common/hal3a/v1.0/Thread3AImp.cpp b/aaa/source/common/hal3a/v1.0/Thread3AImp.cpp

--- a/aaa/source/common/hal3a/v1.0/Thread3AImp.cpp+++ b/aaa/source/common/hal3a/v1.0/Thread3AImp.cpp@@ -424,6 +424,7 @@ MBOOLThread3AImp::sendCommand(ECmd_T const r3ACmd, MUINTPTR const i4Arg){
MBOOL bRet = MTRUE;+ CmdQ_T rCmd(ECmd_Update, ParamIspProfile_T());//sendCommandDerived(r3ACmd, i4Arg);@@ -471,9 +472,10 @@ Thread3AImp::sendCommand(ECmd_T const r3ACmd, MUINTPTR const i4Arg)case ECmd_PrecaptureStart: //from type1 to type3, avoid capture delaycase ECmd_PrecaptureEnd:- if (mbSetFromP1)- clearCommandQ(); //from type1 to type3, avoid capture delay- addCommandQ(r3ACmd);+ //if (mbSetFromP1)+ // clearCommandQ(); //from type1 to type3, avoid capture delay+ // addCommandQ(r3ACmd);+ bRet = mpHal3A->postCommand(r3ACmd, &rCmd.rParamIspProfile);break;//type 4: run current command directly by caller thread

2、Camera 2 解决录制视频时无法自动对焦的问题

[DESCRIPTION]

在Camera2中,启动录像后,可以点击屏幕进行手动对焦,但切换场景,不能触发自动对焦(连续对焦)

[SOLUTION]

/vendor/mediatek/proprietary/packages/apps/Camera2/common/src/com/mediatek/camera/common/mode/video/VideoRestriction.java

74    static {
75 sRecordingRelationGroupForMode.setHeaderKey(VIDEO_MODE_KEY);76 sRecordingRelationGroupForMode.setBodyKeys("key_focus");//delete下面这段code -- begin//77 if (SystemProperties.getInt("mtk.camera.app.fd.video", 0) == 0) {
//78 sRecordingRelationGroupForMode.addRelation(//79 new Relation.Builder(VIDEO_MODE_KEY, "recording")//80 .addBody("key_focus", "auto", "auto")//81 .build());//82 }//delete -- end83 sRecordingRelationGroupForMode.addRelation(84 new Relation.Builder(VIDEO_MODE_KEY, "stop-recording")85 .addBody("key_focus", "continuous-video", "continuous-video,auto")86 .build());87 }

3、刷机后第一次开机检测Sensor不成功,后续launch界面相机图标一直就不会显示

[DESCRIPTION]

此问题是由于Google在Android4.1之后(即JB版本后)的一个设计,Camera App会在第一次开机时侦测是否有Camera sensor,

如没检测到则不会show Camera图标。具体是在download完成第一次开机后,侦测当前是否有Camera Sensor,

如果没有就将所有的Camera Activity进行disable掉,因此相机图标就“消失”不见了。

注:此行为只会在Download开机第一次执行,之后便不会侦测。因为在Receive到BOOT_COMPLETED intent后,

Receiver之后运行一次,然后就会disable掉自己。所以,后续即便侦测到sensor,Camera图标一样不会出现,只能恢复出厂设置。

[SOLUTION]

在/vendor/mediatek/proprietary/packages/apps/Camera/src/com/android/camera/DisableCameraReceiver.java

public void onReceive(Context context, Intent intent) {
/* // Disable camera-related activities if there is no camera. boolean needCameraActivity = CHECK_BACK_CAMERA_ONLY ? hasBackCamera() : hasCamera(); if (!needCameraActivity) { Log.i(TAG, "disable all camera activities"); for (int i = 0; i < ACTIVITIES.length; i++) { disableComponent(context, ACTIVITIES[i]); } } // Disable this receiver so it won't run again. disableComponent(context, "com.android.camera.DisableCameraReceiver"); */ }

4、Camera APP 前置摄像头录像时无法拍照

[DESCRIPTION]

前置摄像头录像时无法拍照,没有打开VSS功能。

[SOLUTION]

mtkcamera 内部默认 design 是不 support 前置摄像头的 VSS 功能,但是底层是可以 support 的,所以

如果客户有需求support 前摄的VSS功能的话请按照如下修改:

在VideoMode.java做如下修改:

protected void initializeShutterStatus() {
if (mIsModeReleased) {
Log.i(TAG, "[initializeShutterStatus] mode is closed,so return"); return; } if (CameraInfo.CAMERA_FACING_FRONT == mICameraDeviceManager .getCameraInfo(mICameraDeviceManager.getCurrentCameraId()).facing // 去掉对front camera的if判断 || "on".equals(mISettingCtrl.getSettingValue(SettingConstants.KEY_SLOW_MOTION))) {
mICameraAppUi.setPhotoShutterEnabled(false); } else {
mICameraAppUi.setPhotoShutterEnabled(isVssSupported()); } }

5、由于Sensor安装不是长边对长边导致Preview预览界面无法全屏

[DESCRIPTION]

Camera Sensor安装一般要求sensor长边对LCM长边,也就是Sensor的扫描方向与LCD的物理长边方向平行,

如图1所示。但如果Sensor安装角度有偏差90度或270度,如图2所示,则preview会发生异常,如图3所示。

gAfneg.png 图1 Sensor Angle Normal
gAfUw4.png 图2 Sensor Angle Abnormal

这是一个经常被问到的问题,其实Camera不管怎么摆,其输出的图像的比例都是不会改变,改变的只是取景的内容。

这里以 480x640(VGA) 的Sensor安装角度为270为例,如果横屏项目320x240的 LCD 竖拍时需要全屏显示会有什么影响,

gA44QP.png

因为两者比例不一致,所以实际情况如图4所示:红框的大小加Sensor输出的大小:480x640(3:4),

蓝框的大小为显示到LCD上看到的大小:480x360(4:3),然后再经由Resizer Resize成320x240(4:3)的大小,

即蓝色框外的画面都是看不到的。所以这个Sensor实际的使用率只有56% = 480x360 / 480x640,即只能看到一半左右的画面,

就像100块钱只能当50块钱使用,很不经济!另外,由于是从Sensor截取了一部分用于显示,Camera的视角会变小。

[SOLUTION]

如果出现这种情况必须重新打样模组,将Camera模组转90度打样,让Sensor与LCD长边对长边。

6、第三方camera预览倒立,自带camera正常

[DESCRIPTION]

使用一些三方camera ,会发现有preview画面倒立的情况,但是自带的camera预览正常。

[Analysis]

一般来说,在camera preview的时候,会通过setDisplayOrientation(int degrees)设置需要旋转的角度给surfaceflinger。

degrees是根据sensor的安装角度以及当前activity的方向来确定。

具体请参考alps\framework\base\core\java\hardware\camera.java

public static void setCameraDisplayOrientation(Activity activity,              int cameraId, android.hardware.Camera camera) {
android.hardware.Camera.CameraInfo info = new android.hardware.Camera.CameraInfo(); android.hardware.Camera.getCameraInfo(cameraId, info); int rotation = activity.getWindowManager().getDefaultDisplay() .getRotation(); int degrees = 0; switch (rotation) {
case Surface.ROTATION_0: degrees = 0; break; case Surface.ROTATION_90: degrees = 90; break; case Surface.ROTATION_180: degrees = 180; break; case Surface.ROTATION_270: degrees = 270; break; } int result; if (info.facing == Camera.CameraInfo.CAMERA_FACING_FRONT) {
result = (info.orientation + degrees) % 360; result = (360 - result) % 360; // compensate the mirror } else {
// back-facing result = (info.orientation - degrees + 360) % 360; } camera.setDisplayOrientation(result); }

其中 info.orientation,是从 cfg_setting_imgsensor.cpp 中获取的 sensor的安装角度。

如果所有的三方camera 都遵循此规则去设置preview的旋转角度,一般来说无论sensor安装多少度,都不会有preview倒立的情况,

但是很多三方apk并不会去query sensor的实际安装角度,而是吃固定的角度,

所以当sensor的实际安装角度跟三方camera apk吃的角度不一样时,就会有preview 倒立旋转的情况。

[SOLUTION]

目前来说很多三方camera,针对竖屏项目,一般前置固定吃270度;后置摄像头固定吃90度(也不排除少数camea apk 吃其他的角度)。

所以当前置安装90度或者后置安装270度时,就会发现一些三方camera进前置或者后置预览倒立的情况。

针对此种case,可以如下修改:

第一步,在sensor driver 做flip+mirror 旋转180.

第二步,修改cfg_setting_imgsensor.cpp,将degree 1或者degree 0(取决于是前置还是后置预览有倒立)在原先的基础上加上180或者减去180。

注意:

1.做如上修改之前,先确保自带的camera apk预览正常。如果自带的camera apk预览也有旋转,

请先调整cfg_setting_imgsensor.cpp中degree 1或者degree 0的值,保证自带camera 预览正常。

2.按照上面的方式修改之后,只能保证大部分的camera apk预览正常,少数camera apk还是会有倒立情况,

因为并不是所有的三方camera apk都是前置固定吃270,后置固定吃90.

转载地址:https://cczheng.blog.csdn.net/article/details/116302932 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!

上一篇:FdSanitizer 简介
下一篇:MTK 9.0平台调试 gsensor

发表评论

最新留言

哈哈,博客排版真的漂亮呢~
[***.90.31.176]2024年04月06日 04时11分19秒