2.6camera session创建过程

如第一章所述,得到CameraDevice对象后就可以创建session了,还是以createCaptureSession为例,这是一个抽象方法,我们已经介绍过,它的实现在CameraDeviceImpl中。

方法首先将传入的Surface构建OutputConfiguration,OutputConfiguration是输出的Surface的配置,包含一些基本的配置信息。

随后调用createCaptureSessionInternal方法,如同Camera open时最终都是调用openCameraDeviceUserAsync方法一样,create session最终也都是调用这个方法。

首先判断异常情况,包括相机已经关闭、相机出错以及high speed限制。判断session是否为空,如果不为空就调用CameraCaptureSessionCore的

replaceSessionClose方法。

CameraCaptureSessionCore是一个接口,它的实现是CameraCaptureSessionImpl。

  1. replaceSessionClose方法调用了 close方法;
  2. 调用CameraDeviceImpl的stopRepeating方法;
  3. 调用ICameraDeviceUser的cancelRequest();
  4. 在Camera open的地方我们已经知道,在AIDL的另一头的实现是CameraDeviceClient,所以调用它的cancelRequest();
  5. 调用Camera3Device的clearStreamingRequest()方法,最终调用clear方法;clear方法会清空RepeatingRequests list,然后遍历并清空队列中的buffer。

完成这些操作,当前正在运行的session就close了。

接下来调用configureStreamsChecked方法,这个方法的作用是create stream。

首先检查outputConfiguration和inputConfiguration,确保配置正确。

接着检查Camera的状态,如果有异常则关闭camera,抛出异常。

 

遍历outputConfigurations,确定哪些config需要创建steam和需要删除。

mCallOnBusy内部有一个同步锁mInterfaceLock,configureStreamsChecked方法也有这个锁,所以它会等configureStreamsChecked方法执行完才执行run方法。StateCallbackKK是CameraDeviceImpl的一个内部静态抽象类,包含了session的一些状态,与CameraCaptureSession.StateCallback是不同的。

接下来调用waitUntilIdle方法,我们可以直接到CameraDeviceClient中找到相应的方法,在经过了多个状态判断之后,调用的核心代码是mDevice的waitUntilDrained方法,我们已经知道mDevice是Camera3Device,直接去查看。跳过中间步骤,最终的核心代码是一个do…while循环。如果status是active就结束。

 

Create steam

接下来就正式开始创建steam。

由于inputConfiguration通常是null所以直接看createSteam方法。

方法首先进行了大量状态判断,

然后遍历bufferProducers,这部分是android的surface机制相关的内容,我们也暂时不管。

 

接下来这段就是核心方法,调用Camera3Device的createSteam方法。

同样做了多个判断。在switch中判断mStatus的状态,在初次创建Camera3Device的时候,initialize方法调用initializeCommonLocked方法,调用internalUpdateStatusLocked方法时,mStatus赋值为STATUS_UNCONFIGURED,

所以在上面的代码中直接执行了break语句,跳出来switch。

在判断都没有异常的情况下,就进入流的创建。根据流的类型不同,调用不同的构造方法。

创建完steam之后,就steam设置id,

Id是在已有的基础上+1,所以如果有多个流,id就是连续的数字,至此一个steam就创建完成了。回到CameraDeviceImpl中,for循环遍历outconfig,也就是遍历surfaces,创建多个steam。

方法的最后调用endConfigure方法,我们依然到CameraDeviceClient中查看endConfigure方法的源码,可以看到核心的代码是调用Camera3Device中的configureStreams方法,直接查看源码。

-> filterParamsAndConfigureLocked方法-> configureStreamsLocked方法

这个方法的主要行为是给已经创建的steam添加buffersize、执行HAL配置、结束配置。

配置成功就调用outputStream的finishConfiguration方法。这个方法在Camera3Stream中实现,并调用子类Camera3OutputStream的configureQueueLocked的方法。在这个方法里最重要的是

这句话。

前面提到mConsumer就是surface,执行surface的connect方法。

这里是我们第二次遇到Surface机制的内容。

当遇到Camera的preview黑屏无法显示的问题,如果出现了与Surface相关的异常,那么就是可能是这两个地方存在问题。一是GraphicBufferProducer构建出现问题,传入的gbp是null,二是当前surface的GraphicBufferProducer有其他链接。

之后就是根据connect返回的状态进行处理,计算mTotalBufferCount等操作。

至此steam的创建就全部完成了。

Create Session

Steam创建成功只有,就做好了创建session的全部准备工作了。

创建CameraCaptureSessionImpl对象,它是CameraCaptureSession的子类。

这个构造方法里,除去直接构建的全局变量,主要就是构建StateCallback的createUserStateCallbackProxy方法,方法创建了一个SessionStateCallbackProxy对象,这个类是CameraCaptureSession.StateCallback的子类,并且内部持有一个StateCallback的对象,也就是APP创建并传下来的callback。

CameraCaptureSessionImpl的构造函数的最后,如果一切配置正常就调用StateCallback的onConfiged方法,APP就会在会调用执行应用定义的行为,一般就是构建CaptureRequest。

至此Session就全部创建完成了。

总结

通过上面代码的分析,我们可以看到创建session主要有三个步骤

  1. 创建outputConfiguration;
  2. 创建Steam;
  3. 创建Session,调用Callback;
©️2020 CSDN 皮肤主题: 大白 设计师: CSDN官方博客 返回首页
实付0元
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。

余额充值