Camera 初始化(Preview) 一(Framework->HAL3)

以下代码流程是API1+HAL3

Preview :
1. StreamingProcessor中的Camera3Device创建Stream(至少包含1条preview的stream,如果APP使能了callback,则还包含一条callback的stream,还有一条Jpeg的stream)

2. StreamingProcessor中的Camera3Device创建一个Preview的request,需要留心的是这个request是由底层的HAL完成的default构建。这个request的类型是CameraMetadata。(每条Stream都有自己的request)


3. 框架层更新CameraMetadata的PreviewRequest

4. StreamingProcessor开启startStream,调用Camera3Device的setStreamingRequest(request);

5. 将CameraMetadata的request转换为CaptureRequest的类型

6. Camera3Device的RequestThread->setRepeatingRequests重复的发送request

7. 唤醒RequestThread线程这个线程是在Open的时候初始化的

8. waitForNextRequestBatch得以执行下去
    NextRequest nextRequest;
    //这里会阻塞
    nextRequest.captureRequest = waitForNextRequestLocked();

    nextRequest.halRequest = camera3_capture_request_t();
    nextRequest.submitted = false;
    mNextRequests.add(nextRequest);
    
9. prepareHalRequests()准备output的buffer

10. sendRequestsBatch()/sendRequestsOneByOne()发送到HAL

frameworks\av\services\camera\libcameraservice\api1\Camera2Client.cpp

startPreview->startPreviewL

status_t Camera2Client::startPreviewL(Parameters &params, bool restart) {
{
	...
	//在Camera3Device中创建了Preview的Camera3OutputStream
	res = mStreamingProcessor->updatePreviewStream(params);
	...
	if (params.slowJpegMode) {
		...
	}else{
	    ...
	    //创建Jpeg的stream
    	res = updateProcessorStream(mJpegProcessor, params);
	}
	...
	if (callbacksEnabled) {
		...
		//如果应用使能了callback,那么还会创建一条callback的Stream
		res = mCallbackProcessor->updateStream(params);
	}
	if (!params.recordingHint) {
		if (!restart) {
            res = mStreamingProcessor->updatePreviewRequest(params);
            if (res != OK) {
                ALOGE("%s: Camera %d: Can't set up preview request: "
                        "%s (%d)", __FUNCTION__, mCameraId,
                        strerror(-res), res);
                return res;
            }
        }
        //开启这条Stream
        res = mStreamingProcessor->startStream(StreamingProcessor::PREVIEW,
                outputStreams);
    } else {
    	...
    }
    //设置Camera的状态为PREVIEW
    params.state = Parameters::PREVIEW;  
}

1. Preview的Stream创建过程

我们当前仅看Preview的这条Stream的创建过程

frameworks\av\services\camera\libcameraservice\api1\client2\StreamingProcessor.cpp

status_t StreamingProcessor::updatePreviewStream(const Parameters &params) {
	sp<CameraDeviceBase> device = mDevice.promote();
	...
	//第一次创建的时候mPreviewStreamId 为空
    if (mPreviewStreamId == NO_STREAM) {
    	//调用Camera3Device的createStream
        res = device->createStream(mPreviewWindow,
                params.previewWidth, params.previewHeight,
                CAMERA2_HAL_PIXEL_FORMAT_OPAQUE, HAL_DATASPACE_UNKNOWN,
                CAMERA3_STREAM_ROTATION_0, &mPreviewStreamId, String8());

    }
    //开启预览的Stream
    res = device->setStreamTransform(mPreviewStreamId,
            params.previewTransform);
}

继续

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

status_t Camera3Device::createStream(...) {
	...
	if (format == HAL_PIXEL_FORMAT_BLOB) {
	...
	}else{
		//创建Stream
		newStream = new Camera3OutputStream(mNextStreamId, consumers[0],
                width, height, format, dataSpace, rotation,
                mTimestampOffset, physicalCameraId, streamSetId);
	}
	newStream->setStatusTracker(mStatusTracker);
	newStream->setBufferManager(mBufferManager);
	//保存这条Stream到mOutputStreams中
	res = mOutputStreams.add(mNextStreamId, newStream);
	//会调用到HAL3的configureStreams
	res = configureStreamsLocked(mOperatingMode, mSessionParams);
	...
}

2.创建Preview的Request请求

frameworks\av\services\camera\libcameraservice\api1\client2\StreamingProcessor.cpp

status_t StreamingProcessor::updatePreviewRequest(const Parameters &params) {
	sp<CameraDeviceBase> device = mDevice.promote();
	...
	res = device->createDefaultRequest(CAMERA3_TEMPLATE_PREVIEW,
                    &mPreviewRequest);
	...
	//这里更新Preview的Request
	res = mPreviewRequest.update(ANDROID_REQUEST_ID,
            &mPreviewRequestId, 1);	
}

这里说明下createDefaultRequest会调用到QCamera3HardwareInterface->construct_default_request_settings的默认构建

3.开启预览的Stream

frameworks\av\services\camera\libcameraservice\api1\client2\StreamingProcessor.cpp

status_t StreamingProcessor::startStream(StreamType type,
        const Vector<int32_t> &outputStreams) {
    //获取Camera3Device
	sp<CameraDeviceBase> device = mDevice.promote();
	//获取request的类型是预览还是录像
	CameraMetadata &request = (type == PREVIEW) ?
            mPreviewRequest : mRecordingRequest;
    //更新Preview的Request
    res = request.update(
        ANDROID_REQUEST_OUTPUT_STREAMS,
        outputStreams);
    //向HAL3下发request
    res = device->setStreamingRequest(request);
}

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

Camera3Device->setStreamingRequest
	//将CameraMetadata转换为PhysicalCameraSettingsList
	Camera3Device->setStreamingRequestList
		Camera3Device->submitRequestsHelper
status_t Camera3Device::submitRequestsHelper(
        const List<const PhysicalCameraSettingsList> &requests,
        const std::list<const SurfaceMap> &surfaceMaps,
        bool repeating,
        /*out*/
        int64_t *lastFrameNumber) {
        //将CameraMetadata的preview request最终转换为CaptureRequest,并保存在requestList的list中
        res = convertMetadataListToRequestListLocked(requests, surfaceMaps,
            repeating, /*out*/&requestList);
        
	    if (repeating) {
	    	//持续预览类型,唤醒RequestThread线程
	        res = mRequestThread->setRepeatingRequests(requestList, lastFrameNumber);
	    } else {
	        res = mRequestThread->queueRequestList(requestList, lastFrameNumber);
	    }            
}

唤醒RequestThread线程

status_t Camera3Device::RequestThread::setRepeatingRequests(
        const RequestList &requests,
        /*out*/
        int64_t *lastFrameNumber) {
    ATRACE_CALL();
    Mutex::Autolock l(mRequestLock);
    if (lastFrameNumber != NULL) {
        *lastFrameNumber = mRepeatingLastFrameNumber;
    }
    //先清空mRepeatingRequests
    mRepeatingRequests.clear();
    //将CaptureRequest的请求插入到mRepeatingRequests中
    mRepeatingRequests.insert(mRepeatingRequests.begin(),
            requests.begin(), requests.end());
	//通过mRequestSignal.signal()唤醒RequestThread线程
    unpauseForNewRequests();

    mRepeatingLastFrameNumber = hardware::camera2::ICameraDeviceUser::NO_IN_FLIGHT_REPEATING_FRAMES;
    return OK;
}

4.RequestThread线程的处理

bool Camera3Device::RequestThread::threadLoop() {
    // Wait for the next batch of requests.
    //这里会阻塞等待requeset的到来
    waitForNextRequestBatch();


    // Prepare a batch of HAL requests and output buffers.
    //主要完成Buffer的分配
    res = prepareHalRequests();


    // Inform waitUntilRequestProcessed thread of a new request ID
    {
        Mutex::Autolock al(mLatestRequestMutex);

        mLatestRequestId = latestRequestId;
        mLatestRequestSignal.signal();
    }

    nsecs_t tRequestStart = systemTime(SYSTEM_TIME_MONOTONIC);
    if (mInterface->supportBatchRequest()) {
    	//向HAL3下发requeset
        submitRequestSuccess = sendRequestsBatch();
    } else {
    	//向HAL3下发requeset
        submitRequestSuccess = sendRequestsOneByOne();
    }
    nsecs_t tRequestEnd = systemTime(SYSTEM_TIME_MONOTONIC);
    mRequestLatency.add(tRequestStart, tRequestEnd);
}

一个一个看waitForNextRequestBatch,这个函数会阻塞,等待request到来,并准备发送到HAL的Request

void Camera3Device::RequestThread::waitForNextRequestBatch() {
    ATRACE_CALL();
    // Optimized a bit for the simple steady-state case (single repeating
    // request), to avoid putting that request in the queue temporarily.
    Mutex::Autolock l(mRequestLock);

    assert(mNextRequests.empty());

    NextRequest nextRequest;
    //阻塞
    nextRequest.captureRequest = waitForNextRequestLocked();
    if (nextRequest.captureRequest == nullptr) {
        return;
    }

    nextRequest.halRequest = camera3_capture_request_t();
    nextRequest.submitted = false;
    mNextRequests.add(nextRequest);
}

最后Camera3Device通过HIDL下发processCaptureRequest的请求到HAL3

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值