安卓相机frameworks里面经常出现requestId和frameId,最近简单看了一下代码,发现相关流程还是很复杂的,总结来看requestId 就是上层(java)发送的repeating(capture)请求的id,是从0开始递增的。
这是CameraDeviceImpl.java里面下发请求的代码,调用到cameraserver里的submitRequestList
到CameraDeviceClient.cpp里面,mRequestIdCounter是随着应用层下发request递增的
省略部分代码。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。
虽然这里的requestId会通过ANDROID_REQUEST_ID这个TAG设置到Hal层,但是其实HAL并不太需要真个id,此时还看不出这个requestId有啥作用,接下来看result返回的时候怎么使用的。
capture result 返回最终会到这里的insertResultLocked,mResultExtras.requestId会设置给result metadata传到应用层
再回到CameraDeviceImpl,就是通过requestId到 mCaptureCallbackMap里面去找对应的回调接口回调给上层
所以综上看 requestId就是一个标记上层下发request的作用,回调metadta的时候方便找到对应的回调接口,所以requestId的作用仅仅是联系APP和FW的,对于HAL来说没有作用。
frameId是每帧都加一的。
到CameramanOutputUtils.cpp里面看到requestId就是在InFlightMap里面存着,而InFlightMap就是记录request信息的,通过frameNumber找到对应的request
这里的frameNumber就是Camera3Device.cpp里面threadLoop不断递增的frameId,每下发一次request就不断地递增的。