以下代码流程是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 ¶ms, 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 ¶ms) {
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 ¶ms) {
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