Android Camera2架构-RequestThread处理队列中的预览和拍照请求流程Frameworks层到HAL层(1)
作者:互联网
Frameworks处理请求参考
从代码的逻辑来看FrameWork层初始化Camera3Device时候就会启动一个请求线程,这个线程是专门处理上层下发的。
frameworks\av\services\camera \libcameraservice\device3\Camera3Device.cpp
status_t Camera3Device::initialize(sp<CameraProviderManager> manager, const String8& monitorTags)
status_t res = manager->openSession(mId.string(), this,/*out*/ &session);
manager->getCameraCharacteristics(mId.string(), &mDeviceInfo);
auto requestQueueRet = session->getCaptureRequestMetadataQueue([&queue](const auto& descriptor)
auto resultQueueRet = session->getCaptureResultMetadataQueue([&resQueue](const auto& descriptor)
mVendorTagId = manager->getProviderTagIdLocked(mId.string());
mInterface = new HalInterface(session, queue);
return initializeCommonLocked();
status_t Camera3Device::initializeCommonLocked()
/** Create buffer manager */
mBufferManager = new Camera3BufferManager();
mRequestThread = new RequestThread(this, mStatusTracker, mInterface);
res = mRequestThread->run(String8::format("C3Dev-%s-ReqQueue", mId.string()).string());
bool Camera3Device::RequestThread::threadLoop()
// Wait for the next batch of requests.
waitForNextRequestBatch();
void Camera3Device::RequestThread::waitForNextRequestBatch()
nextRequest.captureRequest = waitForNextRequestLocked();
sp<Camera3Device::CaptureRequest> Camera3Device::RequestThread::waitForNextRequestLocked()
sp<CaptureRequest> nextRequest;
while (mRequestQueue.empty())/*mRequestQueue 这个队列是拍照请求的队列,也就是说拍照请求为空则直接跳过处理预览请求*/
if (!mRepeatingRequests.empty())/*预览请求不为空的时候加入拍照请求,并且是优先处理*/
/***************************************************************
原文注释:
Always atomically enqueue all requests in a repeating request
list. Guarantees a complete in-sequence set of captures to
application.
****************************************************************/
const RequestList &requests = mRepeatingRequests;
RequestList::const_iterator firstRequest = requests.begin();
nextRequest = *firstRequest;
mRequestQueue.insert(mRequestQueue.end(),++firstRequest,requests.end());
// No need to wait any longer
mRepeatingLastFrameNumber = mFrameNumber + requests.size() - 1;
break;
if (nextRequest == NULL)/*还有一种情况就是预览请求也是空的*/
/***********************************************************
原文注释:
Don't have a repeating request already in hand, so queue must have an entry now.
************************************************************/
RequestList::iterator firstRequest = mRequestQueue.begin();
nextRequest = *firstRequest;
mRequestQueue.erase(firstRequest);
if (mRequestQueue.empty() && !nextRequest->mRepeating) {
sp<NotificationListener> listener = mListener.promote();
if (listener != NULL) {
listener->notifyRequestQueueEmpty();
}
}
// Wait for additional requests,附加的一般不会走暂时不看
const size_t batchSize = nextRequest.captureRequest->mBatchSize;
// Get the latest request ID, if any
requestIdEntry = mNextRequests[mNextRequests.size() - 1].captureRequest->mSettingsList.begin()->metadata.find(ANDROID_REQUEST_ID);
latestRequestId = requestIdEntry.data.i32[0];
/*原文注释:Prepare a batch of HAL requests and output buffers. */
res = prepareHalRequests();
status_t Camera3Device::RequestThread::prepareHalRequests()
for (size_t i = 0; i < mNextRequests.size(); i++)
// Prepare a request to HAL
// Insert any queued triggers (before metadata is locked)
submitRequestSuccess = sendRequestsOneByOne();
bool Camera3Device::RequestThread::sendRequestsOneByOne()
for (auto& nextRequest : mNextRequests)
// Submit request and block until ready for next one
res = mInterface->processCaptureRequest(&nextRequest.halRequest);/*mInterface 在初始化的时候就已经被实例化*/
status_t Camera3Device::HalInterface::processCaptureRequest()
std::vector<camera3_capture_request_t*> requests(1);
res = processBatchCaptureRequests(requests, &numRequestProcessed);
status_t Camera3Device::HalInterface::processBatchCaptureRequests(std::vector<camera3_capture_request_t*>& requests,/*out*/uint32_t* numRequestProcessed)
sp<device::V3_4::ICameraDeviceSession> hidlSession_3_4;
auto castResult_3_4 = device::V3_4::ICameraDeviceSession::castFrom(mHidlSession);
/*这里有两个:3.2和3.4目前只看3.2*/
hardware::hidl_vec<device::V3_2::CaptureRequest> captureRequests;
hardware::hidl_vec<device::V3_4::CaptureRequest> captureRequests_3_4;
// Write metadata to FMQ.
for (size_t i = 0; i < batchSize; i++)
device::V3_2::CaptureRequest* captureRequest;
if (hidlSession_3_4 != nullptr) {
captureRequest = &captureRequests_3_4[i].v3_2;
} else {
captureRequest = &captureRequests[i];
}
if (mRequestMetadataQueue != nullptr && mRequestMetadataQueue->write(reinterpret_cast<const uint8_t*>(request->settings), settingsSize))
mHidlSession->processCaptureRequest(captureRequests, cachesToRemove,[&status, &numRequestProcessed] (auto s, uint32_t n)
/*ICameraDeviceSession mHidlSession 在Camera3Device::initialize 由CameraManaage创建 */
Return<void> CameraDeviceSession::processCaptureRequest(const hidl_vec<CaptureRequest>& requests,const hidl_vec<BufferCache>& cachesToRemove,ICameraDeviceSession::processCaptureRequest_cb _hidl_cb)
for (size_t i = 0; i < requests.size(); i++, numRequestProcessed++)
processOneCaptureRequest(requests[i])
Status CameraDeviceSession::processOneCaptureRequest(const CaptureRequest& request)
status_t ret = mDevice->ops->process_capture_request(mDevice, &halRequest);
/*至此进入HAL3处理请求接口方法中*/
QCamera3HardwareInterface::process_capture_request(const struct camera3_device *device,camera3_capture_request_t *request)
QCamera3HardwareInterface *hw = reinterpret_cast<QCamera3HardwareInterface *>(device->priv);
标签:const,Camera3Device,nextRequest,RequestThread,request,Frameworks,层到,requests,siz 来源: https://blog.csdn.net/liujun3512159/article/details/122758605