ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

Android Camera2架构-RequestThread处理队列中的预览和拍照请求流程Frameworks层到HAL层(1)

2022-01-31 10:58:51  阅读:216  来源: 互联网

标签:const Camera3Device nextRequest RequestThread request Frameworks 层到 requests siz


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

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有