本文主要梳理qcom camera hal3 callback 数据流
在文件hardware\qcom\camera\QCamera2\HAL3\QCamera3HWI.cpp中,
当new一个channel 的时候,就会启动一个对应的captureResultCb 用于接受对应的request的callback
例如:
pChannel = new QCamera3ReprocessChannel(mCameraHandle->camera_handle,
mChannelHandle, mCameraHandle->ops, captureResultCb, setBufferErrorStatus,
config.padding, CAM_QCOM_FEATURE_NONE, this, inputChHandle);
captureResultCb原函数:
void QCamera3HardwareInterface::captureResultCb(mm_camera_super_buf_t *metadata_buf,
camera3_stream_buffer_t *buffer, uint32_t frame_number, bool isInputBuffer) //所有的callback都要经过这个函数处理 Callback handler for all capture result (streams, as well as metadata)
这里会进行判断,如果是metadata就会调用handleMetadataWithLock
否则调用handleBufferWithLock
原函数:
void QCamera3HardwareInterface::handleBufferWithLock(
camera3_stream_buffer_t *buffer, uint32_t frame_number) //该函数用于处理image buffer Handles image buffer callback with mMutex lock held
通过调用
orchestrateNotify(¬ify_msg);
orchestrateResult(&result);
向framworks发送消息,这里通过mCallbackOps里发送时间,mCallbackOps定义在文件frameworks/av/services/camera/libcameraservice/device3/Camera3Device.cpp
camera3_callback_ops::notify = &sNotify;
camera3_callback_ops::process_capture_result = &sProcessCaptureResult;
其中orchestrateResult(&result);是发送数据的
void QCamera3HardwareInterface::orchestrateResult(
camera3_capture_result_t *result)
通过mCallbackOps->process_capture_result(mCallbackOps, result); 传递到frameworks
在frameworks中,文件frameworks/av/services/camera/libcameraservice/device3/Camera3Device.cpp
void Camera3Device::processCaptureResult(const camera3_capture_result *result)对接hal的数据
调用returnOutputBuffers(result->output_buffers,
result->num_output_buffers, shutterTimestamp);
void Camera3Device::returnOutputBuffers(
const camera3_stream_buffer_t *outputBuffers, size_t numBuffers,
nsecs_t timestamp)
调用res = stream->returnBuffer(outputBuffers[i], timestamp);
原函数在文件frameworks/av/services/camera/libcameraservice/device3/Camera3Stream.cpp中定义
status_t Camera3Stream::returnBuffer(const camera3_stream_buffer &buffer,
nsecs_t timestamp)
调用:res = returnBufferLocked(buffer, timestamp);
frameworks/av/services/camera/libcameraservice/device3/device3/Camera3OutputStream.cpp
status_t Camera3OutputStream::returnBufferLocked(
const camera3_stream_buffer &buffer,
nsecs_t timestamp)
调用res = returnAnyBufferLocked(buffer, timestamp, /*output*/true);
frameworks/av/services/camera/libcameraservice/device3/Camera3IOStreamBase.cpp
status_t Camera3IOStreamBase::returnAnyBufferLocked(
const camera3_stream_buffer &buffer,
nsecs_t timestamp,
bool output)
回调到文件Camera3OutputStream.cpp
status_t Camera3OutputStream::returnBufferCheckedLocked(
const camera3_stream_buffer &buffer,
nsecs_t timestamp,
bool output,
/*out*/
sp
res = queueBufferToConsumer(currentConsumer, anwBuffer, anwReleaseFence); //传给consumer
在hal3中,通过
process_capture_request函数从framworks发送request到hal。定义在QCamera3HWI.h
mCallbackOps->process_capture_result
mCallbackOps->notify
回调callback从hal到framworks
定义在Camera3Device.cpp