idh.code\vendor\sprd\interfaces\camera\device\3.2\default\CameraDeviceSession.cpp
Return<void> CameraDeviceSession::processCaptureRequest(
const hidl_vec<CaptureRequest>& requests,
const hidl_vec<BufferCache>& cachesToRemove,
ICameraDeviceSession::processCaptureRequest_cb _hidl_cb) {
updateBufferCaches(cachesToRemove);
uint32_t numRequestProcessed = 0;
Status s = Status::OK;
for (size_t i = 0; i < requests.size(); i++, numRequestProcessed++) {
s = processOneCaptureRequest(requests[i]);
if (s != Status::OK) {
break;
}
}
if (s == Status::OK && requests.size() > 1) {
mResultBatcher.registerBatch(requests[0].frameNumber, requests.size());
}
_hidl_cb(s, numRequestProcessed);
return Void();
}
Status CameraDeviceSession::processOneCaptureRequest(const CaptureRequest& request) {
status_t ret = mDevice->ops->process_capture_request(mDevice, &halRequest);
return Status::OK;
}
这个mDevice是 open 的时候,创建 SprdCamera3HWI 对象生成的
mCameraDevice.ops = &mCameraOps;
camera3_device_ops_t SprdCamera3HWI::mCameraOps = {
.initialize = SprdCamera3HWI::initialize,
.configure_streams = SprdCamera3HWI::configure_streams,
.register_stream_buffers = NULL, // SprdCamera3HWI::register_stream_buffers,
.construct_default_request_settings =
SprdCamera3HWI::construct_default_request_settings,
.process_capture_request = SprdCamera3HWI::process_capture_request,
.get_metadata_vendor_tag_ops =
NULL, // SprdCamera3HWI::get_metadata_vendor_tag_ops,
.dump = SprdCamera3HWI::dump,
.flush = SprdCamera3HWI::flush,
.reserved = {0},
};
继续看process_capture_request
int SprdCamera3HWI::process_capture_request(
const struct camera3_device *device, camera3_capture_request_t *request) {
...
int ret = hw->processCaptureRequest(request);
...
}
继续看processCaptureRequest
int SprdCamera3HWI::processCaptureRequest(camera3_capture_request_t *request) {
meta = request->settings;
mMetadataChannel->request(meta);
mMetadataChannel->start(mFrameNum);
//上半部的代码包括删除的部分主要是设置参数
//这里开流这个开始只要设置一次就可以了
if (mFirstRegularRequest == 1) {
ret = mRegularChan->start(mFrameNum);
mFirstRegularRequest = 0;
}
//这里时把数据的buff。推送到一个队列里面。后面设置帧数据地址时,再拿出来使用
{
for (i = 0; i < request->num_output_buffers; i++) {
const camera3_stream_buffer_t &output = request->output_buffers[i];
camera3_stream_t *stream = output.stream;
Requ