Camera APP 问题集锦

简介: Camera APP 问题集锦

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所示。


gAfneg.png

gAfUw4.png


这是一个经常被问到的问题,其实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.

目录
相关文章
|
8月前
|
Web App开发 数据安全/隐私保护 iOS开发
app优化ios,iOS app上架流程问题集锦,ASO新手小白必看(上)
app优化ios,iOS app上架流程问题集锦,ASO新手小白必看(上)
|
1月前
|
网络协议 算法 Android开发
安卓逆向 -- 实战某峰窝APP(动态分析)
安卓逆向 -- 实战某峰窝APP(动态分析)
66 4
|
1月前
|
算法 安全 数据安全/隐私保护
某影视APP算法逆向分析
某影视APP算法逆向分析
28 0
|
1月前
|
XML vr&ar Android开发
【Android App】实战项目之虚拟现实(VR)的全景相册(附源码和演示视频 可用于学习和大作业)
【Android App】实战项目之虚拟现实(VR)的全景相册(附源码和演示视频 可用于学习和大作业)
193 2
|
1月前
|
传感器 物联网 Android开发
【Android App】物联网中指南针、计步器、感光器、陀螺仪的讲解及实战演示(附源码 超详细必看)
【Android App】物联网中指南针、计步器、感光器、陀螺仪的讲解及实战演示(附源码 超详细必看)
94 1
|
1月前
|
搜索推荐
App Inventor 2 打造个性化酷炫的底部导航条
虽说 App Inventor 2 是简单的积木式开发手机 App,但是通过众多拓展它也能实现很多酷炫的功能,比如本文介绍的一款酷炫导航条,函数代码块用法超级简单,效果不错。当然还有更复杂更个性化的导航条后续再分享。
97 0
|
9月前
|
算法 数据安全/隐私保护
App逆向百例|17|某音乐App分析
App逆向百例|17|某音乐App分析
187 0
|
API Android开发
Android 天气APP(九)细节优化、必应每日一图
Android 天气APP(九)细节优化、必应每日一图
Android 天气APP(九)细节优化、必应每日一图
|
算法 安全 Java
某种草电商App shield 签名算法解析(一)
某种草电商App shield 签名算法解析(一)
某种草电商App shield 签名算法解析(一)
|
缓存 JSON 前端开发
APICloud AVM框架 开发视频会议APP
1.创建会议,确认会议时间、参会人员、会议主题、确定会议主持人(默认为发起人)可开启会议;同时会通过应用消息和短信通知参会人员。2.加入会议,可通过会议大厅找的会议列表直接加入,也可通过输入会议编号加入会议;加入会议的前提是会议已在进行中。3.快速会议,可直接确认会议人员然后发起实时视频会议,参会人员实时接收应用消息或短信,快速进入会议。3.历史会议,分为我主持的会议、我参与的会议。4.会议大厅,列表显示今天需要参加的会议。
APICloud AVM框架 开发视频会议APP