CreateCaptureRequest
创建一个 CaptureRequest 请求,表示一次图像请求,并将一些设置参数添加到这个request中,并通过 CreateCaptureSession 的时候下发给相机系统中
CaptureRequest.Builder mCaptureRequestBuilder = CameraDevice.createCaptureRequset(templateType)
//CameraDevice.java
public abstract CaptureRequest.Builder createCaptureRequest(int templateType)
//CameraDeviceImpl.java
public CaptureRequest.Builder createCaptureRequest(int templateType) throws CameraAccessException{
...
CameraMetadataNative templatedRequest = null;
//会调用到 ICameraDeviceUser.createDefaultRequest(templateType),已到达HAL
templatedRequest = mRemoteDevice.createDefaultRequest(templateType);
// If app target SDK is older than O, or it's not a still capture template, enableZsl
// must be false in the default request.
if (mAppTargetSdkVersion < Build.VERSION_CODES.O ||
templateType != TEMPLATE_STILL_CAPTURE) {
overrideEnableZsl(templatedRequest, false);
}
CaptureRequest.Builder builder = new CaptureRequest.Builder(
templatedRequest, /*reprocess*/false, CameraCaptureSession.SESSION_ID_NONE,getId(), /*physicalCameraIdSet*/ null);
return builder;()
}
//CaptureRequest.java
public Builder(CameraMetadataNative template, boolean reprocess, int reprocessableSessionId, String logicalCameraId, Set<String> physicalCameraIdSet){
mRequest = new CaptureRequest(template, reprocess, reprocessableSessionId, logicalCameraId, physicalCameraIdSet);
}
public CaptureRequest(CameraMetadataNative settings, boolean isReprocess, int reprocessableSessionId, String logicalCameraId, Set<String> physicalCameraIdSet){
...
//拿到一个 CameraMetadataNative 对象
mLogicalCameraSettings = CameraMetadataNative.move(settings);
...
}
//CameraMetadataNative.java
public static CameraMetadataNative move(CameraMetadataNative other){
CameraMetadataNative newObject = new CameraMetadataNative();
newObject.swap(other);
return newObject;
}CaptureRequest 可以理解为告诉 Camera 底层如何处理某一帧数据,包括两部分内容
Settings
硬件相关的参数:sensor、lens、flash等
ISP Procssing Pipeline 相关参数
3A相关参数(AE、AF、AWB)
//设置AE mCaptureRequestBuilder.set(CaptureRequest.CONTROL_AE_EXPOSURE_COMPENSATION, 0);Output Surfaces
CaptureRequest 中带的 Surfaces 必须在创建 Session 时使用 Surface List 的子集
mCaptureRequest.addTarget(mSurface); mCameraDevice.createCaptureSession(Arrays.asList(mSurface, mImageReader.getSurface()), mSessionStateCallback, mChildHandler);
版权声明:本文为qq_29639599原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。