camera hal3 数据流

本文主要梳理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 *releaseFenceOut) //check buffer是否有效


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

 

 

 

 

 

你可能感兴趣的:(android_camera)