CTS测试中testCameraToSurfaceTextureMetadata项
(1)测试项源码简单梳理
//cts/tests/camera/src/android/hardware/cts/CameraGLTest.java——testCameraToSurfaceTextureMetadata@Test(timeout=60*60*1000) // timeout = 60 mins for long running testspublic void testCameraToSurfaceTextureMetadata() throws Exception {public void run(int cameraId) throws Exception {// Number of frames to test overint kLoopCount = 100;// Number of frames that can be out of bounds before calling this a failureint kMaxOutOfBoundsFrames = kLoopCount / 25; // 4% of framesParameters parameters = mCamera.getParameters();//对平台支持的Preview Size列表 + FpsRange进行测试,查看是否满足条件for (Size size: parameters.getSupportedPreviewSizes()) {for (int[] fps: parameters.getSupportedPreviewFpsRange()) {if (LOGV) {Log.v(TAG, "Testing camera #" + cameraId +", preview size:" + size.width + "x" + size.height +", frame rate range: [" +(fps[Parameters.PREVIEW_FPS_MIN_INDEX] / 1000.) + "," +(fps[Parameters.PREVIEW_FPS_MAX_INDEX] / 1000.) + "]");}parameters.setPreviewSize(size.width, size.height);parameters.setPreviewFpsRange(fps[Parameters.PREVIEW_FPS_MIN_INDEX],fps[Parameters.PREVIEW_FPS_MAX_INDEX]);mCamera.setParameters(parameters);assertEquals(size, mCamera.getParameters().getPreviewSize());//...int oobThreshold = mIsExternalCamera ?kExtCamMaxOutOfBoundsFrames : kMaxOutOfBoundsFrames;//前后摄每个Preview size需要测试100帧,当有超过4帧不满足条件时,此项就会Fail。assertTrue("Too many frame intervals out of frame rate bounds: "+ outOfBoundsCount +", limit " + oobThreshold,outOfBoundsCount <= oobThreshold);}}};
此项是测试Ap下的帧率通过Sensor Drv出图是否能满足条件,当出图不稳定就会出现Fail。
(2)Sensor Drv检查点
(A)确认哪一项失败后,通过查看Log确认帧率是否有正确下到driver里面(MTK平台)
- 对于RAW sensor会通过aaa_sensor_mgr.cpp的setPreviewMaxFrameRate()函数将帧率设置到camera sensor driver中;
- 对于YUV sensor则通过HalSensor.control.cpp文件中的senCommand()函数;
如果帧率有正确设置到sensor driver中,则检查sensor driver对于的函数接口为什么没有实现ap要求的帧率;如果帧率没有正确的设置下来,则检查flow ,检查帧率设置flow哪里被修改了!
(B)检查Sensor Drv可通过如下两方面入手
(a)请检查sensor driver(**mipi_sensor.c)中,set_max_framerate_by_scenario函数中,是否在每个case中含有语句:set_dummy();
static kal_uint32 set_max_framerate_by_scenario(enum MSDK_SCENARIO_ID_ENUM scenario_id, MUINT32 framerate)
{kal_uint32 frame_length;LOG_INF("scenario_id = %d, framerate = %d\n", scenario_id, framerate);switch (scenario_id) {case MSDK_SCENARIO_ID_CAMERA_PREVIEW:frame_length = imgsensor_info.pre.pclk / framerate * 10 / imgsensor_info.pre.linelength;spin_lock(&imgsensor_drv_lock);imgsensor.dummy_line = (frame_length > imgsensor_info.pre.framelength) ?(frame_length - imgsensor_info.pre.framelength) : 0;imgsensor.frame_length = imgsensor_info.pre.framelength + imgsensor.dummy_line;imgsensor.min_frame_length = imgsensor.frame_length;spin_unlock(&imgsensor_drv_lock);if(imgsensor.frame_length > imgsensor.shutter){set_dummy();}break;case MSDK_SCENARIO_ID_VIDEO_PREVIEW:if (framerate == 0)return ERROR_NONE;frame_length = imgsensor_info.normal_video.pclk / framerate * 10 /imgsensor_info.normal_video.linelength;spin_lock(&imgsensor_drv_lock);imgsensor.dummy_line = (frame_length > imgsensor_info.normal_video.framelength) ?(frame_length - imgsensor_info.normal_video.framelength) : 0;imgsensor.frame_length = imgsensor_info.normal_video.framelength + imgsensor.dummy_line;imgsensor.min_frame_length = imgsensor.frame_length;spin_unlock(&imgsensor_drv_lock);if(imgsensor.frame_length > imgsensor.shutter){set_dummy();}//...break;
(b)作为参考,没有实际使用
- 打开系统相机,查看前摄的帧率在室内光/打灯条件下是不是正常,能不能达到30fps。结果:前摄帧率最大只跑到了15fps,这显然是一个异常状态;
- 强制固定帧率为30fps,查看如何;
- 直接看内核驱动代码,看实际设置的shutter/framelength的值是多少,这里有两个个计算公式:
(1)实时帧率 = pclk/linelength/framelength; //pclk与linelength来自于驱动中配置的imgsensor info;
(2)frame_length = imgsensor_info.pre.pclk / framerate * 10 / imgsensor_info.pre.linelength;
可尝试修改preview的linelength和framelength:
static struct imgsensor_info_struct imgsensor_info = {.sensor_id = GC8034_SENSOR_ID, /*record sensor id defined in Kd_imgsensor.h*/.checksum_value = 0x1b375588, //0xa11f4e23, /*checksum value for Camera Auto Test*/.pre = {.pclk = 320000000, /*record different mode's pclk*/.linelength = 4272, /*record different mode's linelength*/.framelength = 2500,.startx = 0,.starty = 0,.grabwindow_width = 3264,.grabwindow_height = 2448,.mipi_data_lp2hs_settle_dc = 85, /*unit, ns*/.mipi_pixel_rate = 268800000, //672000000,.max_framerate = 300,},
(3)在Framework来对此项测试进行规避(Android 11)
此项测试的应用包名和类名如下:
String GLSurfaceViewCtsCamera = "android.camera.cts/android.hardware.cts.GLSurfaceViewCtsActivity";
(A)Activity启动时记录状态。
//frameworks/base/services/core/java/com/android/server/wm/ActivityRecord.javaActivityRecord(ActivityTaskManagerService _service, WindowProcessController _caller,int _launchedFromPid, int _launchedFromUid, String _launchedFromPackage,@Nullable String _launchedFromFeature, Intent _intent, String _resolvedType,ActivityInfo aInfo, Configuration _configuration, ActivityRecord _resultTo,String _resultWho, int _reqCode, boolean _componentSpecified,boolean _rootVoiceInteraction, ActivityStackSupervisor supervisor,ActivityOptions options, ActivityRecord sourceRecord) {super(_service.mWindowManager, new Token(_intent).asBinder(), TYPE_APPLICATION, true,null /* displayContent */, false /* ownerCanManageAppTokens */);mAtmService = _service;appToken = (Token) token;info = aInfo;mUserId = UserHandle.getUserId(info.applicationInfo.uid);packageName = info.applicationInfo.packageName;intent = _intent;// If the class name in the intent doesn't match that of the target, this is probably an// alias. We have to create a new ComponentName object to keep track of the real activity// name, so that FLAG_ACTIVITY_CLEAR_TOP is handled properly.if (info.targetActivity == null|| (info.targetActivity.equals(intent.getComponent().getClassName())&& (info.launchMode == LAUNCH_MULTIPLE|| info.launchMode == LAUNCH_SINGLE_TOP))) {mActivityComponent = intent.getComponent();} else {mActivityComponent =new ComponentName(info.packageName, info.targetActivity);}//add startString str = intent.getComponent().getClassName();if (str.contains("android.hardware.cts.GLSurfaceViewCtsActivity")){SystemProperties.set("sys.cts.cameraGLSurfaceView","1");}else{SystemProperties.set("sys.cts.cameraGLSurfaceView","0");}//add end
//...
(B)在Camera中的帧率使用时进行条件判断。
//frameworks/base/core/java/android/hardware/Camera.javapublic List<int[]> getSupportedPreviewFpsRange() {String str = get(KEY_PREVIEW_FPS_RANGE + SUPPORTED_VALUES_SUFFIX);//add startif("1".equals(SystemProperties.get("sys.cts.cameraGLSurfaceView","0"))) {str = "(5000,30000)";}//add endreturn splitRange(str);}
备注:附上Intent获取应用类名+包名方法。
//frameworks/base/core/java/android/content/Intent.javapublic @Nullable ComponentName getComponent() {return mComponent;}//frameworks/base/core/java/android/content/ComponentName.javapublic @NonNull String getPackageName() {return mPackage;}public @NonNull String getClassName() {return mClass;}//可以如下获取:
intent.getComponent().getClassName();
intent.getComponent().getPackageName();
本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!
