CameraService下是谁对 buffer 做管理?管理 buffer 的数据都有什么,这些数据结构更新的逻辑是什么?
FW 层 buf 依靠 Camera3BufferManager 管理,它有什么关键函数呢?
加入知识星球与更多Camera同学交流
– 星球名称:深入浅出Android Camera
– 星球ID: 17296815
Camera3BufferManager
可以 alloc gralloc buffer,在 client 端申请时它可以把 buffer 交给 (hands out) client(e.g.,Camera3OutputStream) Camera3BufferManager 有若干自己管理的 buf,在 client 申请时,优先分配这些 buf 给 client,当 buf 不足时,需要重新 alloc,在 buffer 过多时,需要 de-alloc。
registerStream
提供 stream info 给 Camera3BufferManager.c3bm 会负责该 stream 的 buffer 分配。
stream 首先要处于 CONFIGUED 状态,然后再注册到 c3bm 中。
c3bm 会通过 getBufferForStream() 函数给 stream 提供 buffer。
提供的 buffer 可以传到 hal 层用于 image output,当 hal 层有输出数据时,这个 buffer 可以 queue 到 ANativeWindow (Surface)中,等地下游 consumer 使用,当下游 consumer 使用完并 release 后,BufferQueueProducer 的 callback 函数 onBufferReleased 会 returnBufferForStream() 函数把这个 buffer 返还给 Camera3BufferManager。
unregisterStream
注销,注销后的 buf 供 Camera3BufferManager 管理。
getBufferForStream
Camera3BuffferManager 从 free buf list 中找到第一个 free 的 buffer,分配给 stream,如果无自己管理的 buf,就 alloc 一个 buffer 给 stream。
onBufferReleased
意味着consumer已经使用完该buffer,但是它并不是直接返回给Camera3BufferManager,而是说这个buffer可以从 stream上dequeue了,表示这么个状态,由于这个函数存在Camera3BufferManager就知道一个stream中有多少个可用的buffer了。
returnBufferForStream
stream 向 Camera3BufferManager 返回一个 buffer。
我们重点关注 registerStream,getBufferForStream、onBufferReleased 函数。