一、前言
createCaptureSession就是Camera配流的过程,一般配置的是outputConfigurations,output是相对于Camera hal来说。配流可以配置不同的流类型,主要包括预览流、拍照流、录像流等,不同的流配置不同的surface类型,surface就是承载流的buffer的容器。预览流的surface一般是使用surfaceview或者TextureView构造的surface;拍照流使用imageReader创建的surface;录像使用mediaRecorder创建的surface。
二、createCaptureSession流程分解
![](https://img-blog.csdnimg.cn/4dc69f3b0c604a34a7d10a45b76da50f.png)
2.1 CameraDeviceImpl
path:xref: /frameworks/base/core/java/android/hardware/camera2/impl/CameraDeviceImpl.java
CameraDeviceImpl是Camera API2的接口类。
相关流程:createCaptureSession
createCaptureSessionInternal
configureStreamsChecked
mRemoteDevice.createStream
createCaptureSession
552 @Override
553 public void createCaptureSession(List<Surface> outputs,
554 CameraCaptureSession.StateCallback callback, Handler handler)
555 throws CameraAccessException {
//定义OutputConfiguration
556 List<OutputConfiguration> outConfigurations = new ArrayList<>(outputs.size());
//将app配置的surface添加到OutputConfiguration
557 for (Surface surface : outputs) {
558 outConfigurations.add(new OutputConfiguration(surface));
559 }
//调用createCaptureSessionInternal
560 createCaptureSessionInternal(null, outConfigurations, callback,
561 checkAndWrapHandler(handler), /*operatingMode*/ICameraDeviceUser.NORMAL_MODE,
562 /*sessionParams*/ null);
563 }
createCaptureSessionInternal
682 private void createCaptureSessionInternal(InputConfiguration inputConfig,
683 List<OutputConfiguration> outputConfigurations,
684 CameraCaptureSession.StateCallback callback, Executor executor,
685 int operatingMode, CaptureRequest sessionParams) throws CameraAccessException {
686 long createSessionStartTime = SystemClock.uptimeMillis();
......
721 try {
722 // configure streams and then block until IDLE
723 configureSuccess = configureStreamsChecked(inputConfig, outputConfigurations,
724 operatingMode, sessionParams, createSessionStartTime);
configureStreamsChecked
432 public boolean configureStreamsChecked(InputConfiguration inputConfig,
433 List<OutputConfiguration> outputs, int operatingMode, CaptureRequest sessionParams,
434 long createSessionStartTime)
435 throws CameraAccessException {
......
//配流前停预览
472 stopRepeating();
473
474 try {
475 waitUntilIdle();
476 //开始配流标志,mRemoteDevice是ICameraDeviceUserWrapper
477 mRemoteDevice.beginConfigure();
478
......
497 // Delete all streams first (to free up HW resources)
498 for (Integer streamId : deleteList) {
//配流前先deleteStream
499 mRemoteDevice.deleteStream(streamId);
500 mConfiguredOutputs.delete(streamId);
501 }
502
503 // Add all new streams
504 for (OutputConfiguration outConfig : outputs) {
505 if (addSet.contains(outConfig)) {
//配置surface列表
506 int streamId = mRemoteDevice.createStream(outConfig);
507 mConfiguredOutputs.put(streamId, outConfig);
508 }
509 }
510
511 int offlineStreamIds[];
//endConfigure
512 if (sessionParams != null) {
513 offlineStreamIds = mRemoteDevice.endConfigure(operatingMode,
514 sessionParams.getNativeCopy(), createSessionStartTime);
515 } else {
516 offlineStreamIds = mRemoteDevice.endConfigure(operatingMode, null,
517 createSessionStartTime);
518 }
......
548
549 return success;
550 }
这里的mRemoteDevice = new IC