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] VSIrq 193711 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] VSIrq 196809 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] VSIrq 198587 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] VSIrq 210148 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] VSIrq 211475 01-02 08:16:17.298533 4749 8746 D Task3APrecap: [run] Frame Count(1) - doPrecapAE 211489 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<MetaSet_T*>& 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<MetaSet_T*>& 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<MUINTPTR>(&_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 @@ MBOOL Thread3AImp::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 delay case 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 -- end 83 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所示。
这是一个经常被问到的问题,其实Camera不管怎么摆,其输出的图像的比例都是不会改变,改变的只是取景的内容。
这里以 480x640(VGA) 的Sensor安装角度为270为例,如果横屏项目320x240的 LCD 竖拍时需要全屏显示会有什么影响,
因为两者比例不一致,所以实际情况如图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.