CameraAppFramework流程之CreateCaptureRequest

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 底层如何处理某一帧数据,包括两部分内容

  1. Settings

    • 硬件相关的参数:sensor、lens、flash等

    • ISP Procssing Pipeline 相关参数

    • 3A相关参数(AE、AF、AWB)

    //设置AE
    mCaptureRequestBuilder.set(CaptureRequest.CONTROL_AE_EXPOSURE_COMPENSATION, 0);
  2. 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版权协议,转载请附上原文出处链接和本声明。