定的,高通平台下定义的camera3_stream::max_buffer数为7个,而maxConsumerBuffers指的是在所有buffer被dequeue时还应该保留的处于queue操作的buffer个数,即全dequeue时至少有maxConsumerBuffers个buffer是处于queue状态在被Consumer使用的。通过query NATIVE_WINDOW_MIN_UNDEQUEUED_BUFFERS来完成,一般默认是1个,即每个stream可以认为需要由8个buffer缓存块组成,实际可dequeue的为8个。
比如native_window_set_buffers_transform一般是指定buffer的Consumer,即当前buffer显示的90/180/270°角度。
该过程本质是结合HAL3的底层buffer配置需求,反过来请求Buffer的Consumer端BufferQueueConsumer来设置相关的buffer属性。
registerBuffersLocked是一个比较重要的处理过程:
status_t Camera3Stream::registerBuffersLocked(camera3_device *hal3Device) {
ATRACE_CALL();
/**
* >= CAMERA_DEVICE_API_VERSION_3_2:
*
* camera3_device_t->ops->register_stream_buffers() is not called and must
* be NULL.
*/
if (hal3Device->common.version >= CAMERA_DEVICE_API_VERSION_3_2) {
ALOGV(%s: register_stream_buffers unused as of HAL3.2, __FUNCTION__);
if (hal3Device->ops->register_stream_buffers != NULL) {
ALOGE(%s: register_stream_buffers is deprecated in HAL3.2;
must be set to NULL in camera3_device::ops, __FUNCTION__);
return INVALID_OPERATION;
} else {
ALOGD(%s: Skipping NULL check for deprecated register_stream_buffers, __FUNCTION__);
}
return OK;
} else {
ALOGV(%s: register_stream_buffers using deprecated code path, __FUNCTION__);
}
status_t res;
size_t bufferCount = getBufferCountLocked();//获取buffer的数量,mTotalBufferCount,最少2个buffer
Vector
buffers;
buffers.insertAt(/*prototype_item*/NULL, /*index*/0, bufferCount);
camera3_stream_buffer_set bufferSet = camera3_stream_buffer_set();
bufferSet.stream = this;//新的bufferset指向camera3_stream_t
bufferSet.num_buffers = bufferCount;//当前stream下的buffer数
bufferSet.buffers = buffers.editArray();
Vector
streamBuffers; streamBuffers.insertAt(camera3_stream_buffer_t(), /*index*/0, bufferCount); // Register all buffers with the HAL. This means getting all the buffers // from the stream, providing them to the HAL with the // register_stream_buffers() method, and then returning them back to the // stream in the error state, since they won't have valid data. // // Only registered buffers can be sent to the HAL. uint32_t bufferIdx = 0; for (; bufferIdx < bufferCount; bufferIdx++) { res = getBufferLocked( &streamBuffers.editItemAt(bufferIdx) );//返回dequeue buffer出来的所有buffer if (res != OK) { ALOGE(%s: Unable to get buffer %d for registration with HAL, __FUNCTION__, bufferIdx); // Skip registering, go straight to cleanup break; } sp
fence = new Fence(streamBuffers[bufferIdx].acquire_fence); fence->waitForever(Camera3Stream::registerBuffers);//等待可写 buffers.editItemAt(bufferIdx) = streamBuffers[bufferIdx].buffer;//dequeue buffer出来的buffer handle } if (bufferIdx == bufferCount) { // Got all buffers, register with HAL ALOGV(%s: Registering %zu buffers with camera HAL, __FUNCTION__, bufferCount); ATRACE_BEGIN(camera3->register_stream_buffers); res = hal3Device->ops->register_stream_buffers(hal3Device, &bufferSet);//buffer绑定并register到hal层 ATRACE_END(); } // Return all valid buffers to stream, in ERROR state to indicate // they weren't filled. for (size_t i = 0; i < bufferIdx; i++) { streamBuffers.editItemAt(i).release_fence = -1; streamBuffers.editItemAt(i).status = CAMERA3_BUFFER_STATUS_ERROR; returnBufferLocked(streamBuffers[i], 0);//register后进行queue buffer } return res; }
a 可以明确看到CAMERA_DEVICE_API_VERSION_3_2的版本才支持这个Device ops接口
b getBufferCountLocked
获取当前stream下的允许的buffer总数
c camera3_stream_buffer_t、camera3_stream_buffer_set和buffer_handle_t
首先需要关注的结构是camera3_stream_buffer_t,用于描述每一个stream下的buffer自身的特性值,其中关键结构是buffer_handle_t值是每一个buffer在不同进程间共享的handle,此外acquire_fence和release_fence用来不同硬件模块对buffer读写时的同步。
camera3_stream_buffer_set是封装了当前stream下所有的buffer的信息:
typedef struct camera3_stream