Android Q 之MTK代码分析(五)--Camera Hal3 process_capture_request

码字不易,多谢支持

MTK Camera process_capture_request 流程
《Android Q 之MTK代码分析(一)--Camera Hal3 Service》
《Android Q 之MTK代码分析(二)--Camera Hal3 Search Sensor》
《Android Q 之MTK代码分析(三)--Camera Hal3 Open/Close》
《Android Q 之MTK代码分析(四)--Camera Hal3 configure_Streams》
《Android Q 之MTK代码分析(五)--Camera Hal3 process_capture_request》
《Android Q 之MTK代码分析(六)--Camera Hal3 process_capture_result》
0、前文回顾
 简单看下之前的camera3.h中configureStream的原文:

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层。

The framework allocates gralloc buffers and calls  camera3_device_t->ops->register_stream_buffers() for at least one of the * output streams listed in configure_streams. The same stream is registered * only once  

注册流buffer:

framework分配gralloc buffer和在configure_streams中,调用camera_device方法ops调用camera3_device_ops的register_stream_buffers方法注册stream buffer,camera3_device_t-> ops-> register_stream_buffers()至少有一个输出流。 同一流仅注册一次。没有调用camera3_device_t-> ops-> register_stream_buffers(),并且必须为NULL。

The framework requests default settings for some number of use cases with * calls to camera3_device_t->ops->construct_default_request_settings(). This * may occur any time after step 3.

配置默认请求:

可能在步骤3之后的任何时间发生,framework通过调用camera_device方法ops调用camera3_device_ops的construct_default_request_settings方法配置默认请求,camera3_device_t-> ops-> construct_default_request_settings。

1、camera process_capture_request 流程
    1.1 原文分析
 

The framework constructs and sends the first capture request to the HAL,  with settings based on one of the sets of default settings, and with at  least one output stream, which has been registered earlier by the  framework. This is sent to the HAL with  camera3_device_t->ops->process_capture_request(). The HAL must block the  return of this call until it is ready for the next request to be sent. The buffer_handle_t provided in the camera3_stream_buffer_t array  in the camera3_capture_request_t may be new and never-before-seen  by the HAL on any given new request.

在使用默认设置中的一组设置和至少一个输出流(已由Framework较早注册),framework构造并向HAL发送第一个捕获请求。framework调用 camera_device方法ops调用camera3_device_ops的process_capture_request开始下发request请求,通过camera3_device_t-> ops-> process_capture_request()发送到HAL。 在准备好发送下一个request前,HAL必须返回此调用。 在camera3_capture_request_t的camera3_stream_buffer_t数组中提供的buffer_handle_t可能是新的,而且在任意给的request中,HAL层都没见这个buffer_handle_t。

    1.2 结构体

 

 

 

    1.3 代码分析
      hardware/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)  {undefined
    updateBufferCaches(cachesToRemove);
    for (size_t i = 0; i < requests.size(); i++, numRequestProcessed++) {undefined
        s = processOneCaptureRequest(requests[i]);
}

Status CameraDeviceSession::processOneCaptureRequest(const CaptureRequest& request)  {undefined
...

    ATRACE_ASYNC_BEGIN("frame capture", request.frameNumber);
    ATRACE_BEGIN("camera3->process_capture_request");
    status_t ret = mDevice->ops->process_capture_request(mDevice, &halRequest);
    ATRACE_END();   

...
}

vendor/mediatek/proprietary/hardware/mtkcam/main/hal/device/3.x/device/CameraDevice3SessionImpl.cpp

auto
ThisNamespace::
onProcessCaptureRequest(
    const hidl_vec<V3_4::CaptureRequest>& requests,
    const hidl_vec<BufferCache>& cachesToRemove,
    uint32_t& numRequestProcessed
) -> ::android::status_t
{undefined
    {undefined
        pAppStreamManager->removeBufferCache(cachesToRemove);
        if  ( 0 == ::android_atomic_acquire_load(&mRequestingAllowed) ) {undefined
            MY_LOGW("submitting requests during flushing - requestNo_1st:%u #:%zu", requestNo_1st, requestNum);
            pAppStreamManager->flushRequest(requests);
            numRequestProcessed = requests.size();
            return OK;
        }
        err = pAppStreamManager->submitRequest(requests, appRequests);
    }
   
    return OK;
}

vendor/mediatek/proprietary/hardware/mtkcam/main/hal/device/3.x/app/AppStreamMgr.cpp

auto
AppStreamMgr::
removeBufferCache(
    const hidl_vec<BufferCache>& cachesToRemove
)   -> void
{undefined
    Mutex::Autolock _l(mInterfaceLock);
    for ( auto& cache : cachesToRemove ) {undefined
        mFrameHandler->uncacheBuffer(cache.streamId, cache.bufferId);
    }
}

vendor/mediatek/proprietary/hardware/mtkcam/main/hal/device/3.x/app/AppStreamMgr.cpp

auto
AppStreamMgr::
submitRequest(
    const hidl_vec<V3_4::CaptureRequest>& captureRequests,
    android::Vector<Request>& rRequests
) -> int
{undefined
    Mutex::Autolock _l(mInterfaceLock);
    int err = mRequestHandler->submitRequest(captureRequests, rRequests);
    return err;
}

vendor/mediatek/proprietary/hardware/mtkcam/main/hal/device/3.x/app/AppStreamMgr.RequestHandler.cpp

auto
ThisNamespace::
submitRequest(
    const hidl_vec<V3_4::CaptureRequest>& captureRequests,
    android::Vector<Request>& rRequests
)   -> int
{undefined

    err = createRequests(captureRequests, rRequests);

    err = registerRequests(rRequests);

    return err;
}

后面代码不继续贴了。总之就是处理request的流程的细节,处理完后返回给上层

下面三个分别是构建defaultRequest配置、获取captureRequest/ResultMetaQueue、request流程

图略3连2、log

08-26 11:30:38.566608  4145  4164 D mtkcam-dev3: [0-session::constructDefaultRequestSettings] -> constructDefaultRequestSettings (type:0x1)

08-26 11:30:38.918000  4145  4164 I mtkcam-PipelineModelSession: [submitRequest] <Default/0> requestNo:0 { repeating:0 control.aeTargetFpsRange:5,30 control.captureIntent:1 control.enableZsl:0 control.processRawEn:0 control.mode:1 control.sceneMode:0 control.videoStabilizationMode:0 edge.mode:1 }

08-26 11:30:38.921784  4145  4164 D mtkcam-dev3: [0-session::processCaptureRequest_3_4] -> 1st request - OK

3、request 种类
其中:

constructDefaultRequestSettings 中打印的 type 实际是 Camera3Device 带下来的 RequestTemplate id(用以区分不同的场景):

/frameworks/av/services/camera/libcameraservice/device3/Camera3Device.cpp

RequestTemplate id;
    switch (templateId) {
        case CAMERA3_TEMPLATE_PREVIEW:
            id = RequestTemplate::PREVIEW;
            break;
        case CAMERA3_TEMPLATE_STILL_CAPTURE:
            id = RequestTemplate::STILL_CAPTURE;
            break;
        case CAMERA3_TEMPLATE_VIDEO_RECORD:
            id = RequestTemplate::VIDEO_RECORD;
            break;
        case CAMERA3_TEMPLATE_VIDEO_SNAPSHOT:
            id = RequestTemplate::VIDEO_SNAPSHOT;
            break;
        case CAMERA3_TEMPLATE_ZERO_SHUTTER_LAG:
            id = RequestTemplate::ZERO_SHUTTER_LAG;
            break;
        case CAMERA3_TEMPLATE_MANUAL:
            id = RequestTemplate::MANUAL;
            break;
        default:
            // Unknown template ID, or this HAL is too old to support it
            return BAD_VALUE;
    }

4、结语
代码熟练度还不够溜,MTK Code细节不够火候,还需继续深入。我会不定期分享,以便查漏补缺,相互学习。奥里给!!!

  • 2
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值