和你一起终身学习,这里是程序员Android
经典好文推荐,通过阅读本文,您将收获以下知识点:
一、camera configureStreams 流程
二、Log 分析
一、camera configureStreams 流程
1.1 相机api简述
as we all know Android Camera API的 步骤
(1)、监听和枚举相机设备
get_number_of_cameras、get_camera_characteristic
(2)、打开设备并连接监听器
connect、open
(3)、配置目标使用情形的输出(如static 、capture、video等)
configure_stream
(4)、为目标使用情形创建请求 (5)捕获/重复请求和连拍
process_capture_request
(6) 、接受结果metadata和图片数据
proces_capture_result
(7)、切换使用情形时,返回第三步
1.2 原文阅读
The framework calls camera3_device_t->ops->configure_streams() with a list * of input/output streams to the HAL device.
简单翻译-->
framework调用结构体camera_device方法ops调用结构体camera3_device_ops的configure_streams方法配流,camera3_device_t-> ops-> configure_streams(),并把input stream&output stream 的列表作为参数送到Hal层。
1.3 结构体
hardware/libhardware/include/hardware/camera3.h
camera3_device_ops_t 映射函数指针操作: hardware/libhardware/modules/camera/3_0/Camera.cpp
1.4 代码流程
hardware/interfaces/camera/device/3.2/default/CameraDeviceSession.cpp
Return<void> CameraDeviceSession::configureStreams(
const StreamConfiguration& requestedConfiguration,
ICameraDeviceSession::configureStreams_cb _hidl_cb) {
Status status = initStatus();
HalStreamConfiguration outStreams;
ATRACE_BEGIN("camera3->configure_streams");
status_t ret = mDevice->ops->configure_streams(mDevice, &stream_list);
ATRACE_END();
}
frameworks/av/services/camera/libcameraservice/device3/Camera3Device.cpp
status_t Camera3Device::configureStreamsLocked(int operatingMode,
const CameraMetadata& sessionParams, bool notifyRequestThread) {
//配流开始log
ALOGV("%s: Camera %s: Starting stream configuration", __FUNCTION__, mId.string());
略...
//创建buffer
const camera_metadata_t *sessionBuffer = sessionParams.getAndLock();
res = mInterface->configureStreams(sessionBuffer, &config, bufferSizes);
//这里还有重新配流的代码,省略
// Update device state
const camera_metadata_t *newSessionParams = sessionParams.getAndLock();
省略部分代码
ALOGV("%s: Camera %s: Stream configuration complete", __FUNCTION__, mId.string());
// tear down the deleted streams after configure streams.
mDeletedStreams.clear();
return OK;
}
status_t Camera3Device::HalInterface::configureStreams(const camera_metadata_t *sessionParams,
camera3_stream_configuration *config, const std::vector<uint32_t>& bufferSizes) {
ATRACE_NAME("CameraHal::confi