Android Camera之createCaptureSession()中Deferred Surface

前言
在前面有跳过关于Deferred surface的介绍,在这一节里单独拎出来介绍一下,在CameraDeviceClient::createStream()中,当发现上面传下来的这个OutputConfiguration有设置deferred,并且没有任何BufferProducer时,就会走进createDeferredSurfaceStreamLocked(),并直接返回,下面就简单地介绍一下子。

目的:
Deferred Suface即延迟创建Surface,目的是优化Camera的启动性能。因为以前在创建Session时,Surface必须要事先全部准备好才可以去创建Session,但是像预览surface一般来自SurfaceView,TextureView等UI控件,只有在UI layout完成后,预览surface才ready,这样子就会延长camera的启动时间;
但是在创建stream的过程中Hal其实只需要知道这个surface的size、format、usage等一些信息就可以了,而不会去操作surface,所以创建Session和创建surface这两件事情其实可以并行化,而不用串行化,这样就可以进一步优化启动性能了。

限制
只有SurfaceView、SurfaceTexture这种类型的surface才可以使用deferred surface,因为其他方式创建的surface可以立即获取到。

流程
一、createStream和endConfigure
在前面的createCaptureSession()里有讲过,大体分为createStream()和configStreams()两部分,其实对于Deferred Surface来说,也是这两个过程,只不过两部分会存在差异,接下来就不详细叙述,只对比差异部分。

CameraDeviceClient::createStream()
-------->CameraDeviceClient::createDeferredSurfaceStreamLocked(
outputConfiguration, isShared, newStreamId);

-------->
mDevice->createStream(noSurface,/hasDeferredConsumer/true,…)
------->Camera3Device::creatStreams()

这里同样会先创建Camera3OutputStream(),但是Consumer为nullptr,因为在APP在调用创建Seesion的接口时,surface还没有ready,所以没有GraphicBufferProducer带下来,所以在ceateStream这一步创建的是一个暂时没有consumer的Camera3OutputStream。

CameraDeviceClient::endConfigure()
即使surface还未准备好,但是Hal只需要知道这路Stream的size、format、usage等这些资讯,照样可以开启底层的配置。所以对于Deferred surface是不会影响到底层的配置的,但是在Hal层配置完这路对应stream后,不会去finishConfiguration(),关于finishConfiguration的作用在前面也有讲过,不会去**finishConfiguration()**是因为前面创建的Camera3OutputStream里的consumer为nullptr。

二、finalizeOutputConfiguration()
但是目前还没有把Buffer的Producer设置给CameraService,那么当surface准备好了之后,还需要走一遍将finishConfiguration(),具体来说:

1、当surface已经准备好后,App需要OutputConfiguration::addSurface()将surface添加进这路Stream的OutputConfiguration中

2、调用finalizeOutputConfiguration(OutputConfiguration),对这路stream进行finalize,其大致的流程图如下所示
在这里插入图片描述
可以看到,当这个流程里也是会拿到Java surface带下来的GraphicBufferProducer,创建Native surface;
由于这路stream Hal层已经配置完,然后就直接走finishConfiguration()的流程了,这个方法做的事情见Android Camera之createCaptureSession()所解释。到这里,这路Stream也就算完全地配置完了。

p.s 要说明一点的是:App在向给底层送CaptureRequest处理时,如果Deferrd Surface还没有准备好,是不能带进CameraRequest里的,因为他还没有经过finishConfiguration()。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值