Android Camera2架构-Frameworks下发预览和拍照请求流程Frameworks层到HAL层(1)

Frameworks处理请求参考

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

 

Frameworks下发请求流程


/frameworks/base/core/java/android/hardware/camera2/impl/CameraDeviceImpl.java
mCaptureRequestBuilder = mCameraDevice.createCaptureRequest(CameraDevice.TEMPLATE_PREVIEW);
public CaptureRequest.Builder createCaptureRequest(int templateType,Set<String> physicalCameraIdSet)
	templatedRequest = mRemoteDevice.createDefaultRequest(templateType);
	CaptureRequest.Builder builder = new CaptureRequest.Builder(templatedRequest, /*reprocess*/false, CameraCaptureSession.SESSION_ID_NONE,getId(), physicalCameraIdSet);
	return builder;	
	
	
mCameraDevice.createCaptureSession(Arrays.asList(previewSurface, mImageReader.getSurface()), new CameraCaptureSession.StateCallback() {
public void createCaptureSession(List<Surface> outputs,CameraCaptureSession.StateCallback callback, Handler handler)
	List<OutputConfiguration> outConfigurations = new ArrayList<>(outputs.size());
	for (Surface surface : outputs) {
		outConfigurations.add(new OutputConfiguration(surface));
	}
	createCaptureSessionInternal(null, outConfigurations, callback,checkAndWrapHandler(handler), /*operatingMode*/ICameraDeviceUser.NORMAL_MODE,/*sessionParams*/ null);
		    private void createCaptureSessionInternal(InputConfiguration inputConfig,List<OutputConfiguration> outputConfigurations,
            CameraCaptureSession.StateCallback callback, Executor executor,
            int operatingMode, CaptureRequest sessionParams)
				/*configure streams and then block until IDLE 这里就是配流*/
				configureSuccess = configureStreamsChecked(inputConfig, outputConfigurations,operatingMode, sessionParams);
					public boolean configureStreamsChecked(InputConfiguration inputConfig,List<OutputConfiguration> outputs, int operatingMode, CaptureRequest sessionParams)
					/*前面一堆很多,看最主要的 Add all new streams*/
					for (OutputConfiguration outConfig : outputs)
						if (addSet.contains(outConfig)) 
							int streamId = mRemoteDevice.createStream(outConfig);/*通过IPC这里就是CameraDeviceClient.cpp*/
							mConfiguredOutputs.put(streamId, outConfig);
						mRemoteDevice.endConfigure(operatingMode, sessionParams.getNativeCopy());/*上面创建完成configurestream后需要执行end*/
						/*最终会到HAL的配流*/
					return success;
				newSession = new CameraCaptureSessionImpl(mNextSessionId++, input,callback, executor, this, mDeviceExecutor, configureSuccess);
				mCurrentSession = newSession;
				
CameraCaptureSessionImpl构造函数
CameraCaptureSessionImpl(int id, Surface input,CameraCaptureSession.StateCallback callback, Executor stateExecutor,
                        android.hardware.camera2.impl.CameraDeviceImpl deviceImpl,Executor deviceStateExecutor, boolean configureSuccess)
	mStateCallback = createUserStateCallbackProxy(mStateExecutor, callback);
	/**********************************************************************************
		这里会执行一个配流完成的回调 this是当前对象CameraCaptureSessionImpl
		用来执行CameraCaptureSessionImpl->setRepeatingRequest
	************************************************************************************/
	mStateCallback.onConfigured(this);



				
/frameworks/base/core/java/android/hardware/camera2/impl/CameraCaptureSessionImpl.java
mCameraCaptureSession.setRepeatingRequest(mCaptureRequest, null, mCameraHandler);
public int setRepeatingRequest(CaptureRequest request, CaptureCallback callback,Handler handler)
	return addPendingSequence(mDeviceImpl.setRepeatingRequest(request,createCaptureCallbackProxy(handler, callback), mDeviceExecutor));
		/*Notify the session that a pending capture sequence has just been queued.*/
		private int addPendingSequence(int sequenceId)

/*拍照*/
/frameworks/base/core/java/android/hardware/camera2/impl/CameraDeviceImpl.java	
public int capture(CaptureRequest request, CaptureCallback callback,Handler handler)
	return addPendingSequence(mDeviceImpl.capture(request,createCaptureCallbackProxy(handler, callback), mDeviceExecutor));
		private int addPendingSequence(int sequenceId) {
			mSequenceDrainer.taskStarted(sequenceId);
			return sequenceId;
		}
		
/*/frameworks/base/core/java/android/hardware/camera2/impl/CameraDeviceImpl.java*/
mDeviceImpl.capture(request,createCaptureCallbackProxy(handler, callback)
public int capture(CaptureRequest request, CaptureCallback callback, Executor executor)
	List<CaptureRequest> requestList = new ArrayList<CaptureRequest>();
	requestList.add(request);
	return submitCaptureRequest(requestList, callback, executor, /*streaming*/false);/*拍照和预览都会调用该方法差别在最后一个参数*/
	


/*预览*/		
/frameworks/base/core/java/android/hardware/camera2/impl/CameraDeviceImpl.java		
public int setRepeatingRequest(CaptureRequest request, CaptureCallback callback,Executor executor)
	return submitCaptureRequest(requestList, callback, executor, /*streaming*/true);/*streaming 这个参数拍照的时候是false,但不是这个方法*/
		private int submitCaptureRequest(List<CaptureRequest> requestList, CaptureCallback callback,Executor executor, boolean repeating)
			requestInfo = mRemoteDevice.submitRequestList(requestArray, repeating);
				binder::Status CameraDeviceClient::submitRequestList(/*/frameworks/av/services/camera/libcameraservice/api2/CameraDeviceClient.cpp*/
				const std::vector<hardware::camera2::CaptureRequest>& requests,
				bool streaming,/*out*/hardware::camera2::utils::SubmitInfo *submitInfo)
					binder::Status CameraDeviceClient::submitRequestList(const std::vector<hardware::camera2::CaptureRequest>& requests,
						bool streaming,/*out*/hardware::camera2::utils::SubmitInfo *submitInfo)
					/*这个方法很多只看最后*/
					if (streaming) {/*拍照和预览都会走这里 streaming 这个参数拍照的时候是false*/
						err = mDevice->setStreamingRequestList(metadataRequestList, surfaceMapList,&(submitInfo->mLastFrameNumber));
						if (err != OK) {
							String8 msg = String8::format(
							"Camera %s:  Got error %s (%d) after trying to set streaming request",
							mCameraIdStr.string(), strerror(-err), err);
							ALOGE("%s: %s", __FUNCTION__, msg.string());
							res = STATUS_ERROR(CameraService::ERROR_INVALID_OPERATION,msg.string());
						} else {
							Mutex::Autolock idLock(mStreamingRequestIdLock);
							mStreamingRequestId = submitInfo->mRequestId;
						}
					} else {/*streaming == false 这里就是拍照流程*/
						err = mDevice->captureList(metadataRequestList, surfaceMapList,	&(submitInfo->mLastFrameNumber));
						if (err != OK) {
							String8 msg = String8::format(
							"Camera %s: Got error %s (%d) after trying to submit capture request",
							mCameraIdStr.string(), strerror(-err), err);
							ALOGE("%s: %s", __FUNCTION__, msg.string());
							res = STATUS_ERROR(CameraService::ERROR_INVALID_OPERATION,
							msg.string());
						}
						ALOGV("%s: requestId = %d ", __FUNCTION__, submitInfo->mRequestId);
					}
	

/frameworks/av/services/camera/libcameraservice/device3/Camera3Device.cpp	
/*预览流程*/
err = mDevice->setStreamingRequestList(metadataRequestList, surfaceMapList,&(submitInfo->mLastFrameNumber));
	status_t Camera3Device::setStreamingRequestList(const List<const PhysicalCameraSettingsList> &requestsList,const std::list<const SurfaceMap> &surfaceMaps, int64_t *lastFrameNumber)
		return submitRequestsHelper(requestsList, surfaceMaps, /*repeating*/true, lastFrameNumber);
		
/*拍照流程*/
err = mDevice->captureList(metadataRequestList, surfaceMapList,	&(submitInfo->mLastFrameNumber));
	status_t Camera3Device::captureList(const List<const PhysicalCameraSettingsList> &requestsList,const std::list<const SurfaceMap> &surfaceMaps,int64_t *lastFrameNumber)
		return submitRequestsHelper(requestsList, surfaceMaps, /*repeating*/false, lastFrameNumber);


/*预览和拍照都会走*/
status_t Camera3Device::submitRequestsHelper(const List<const PhysicalCameraSettingsList> &requests,
	const std::list<const SurfaceMap> &surfaceMaps,
	bool repeating,/*out*/int64_t *lastFrameNumber)
		if (repeating) {
			res = mRequestThread->setRepeatingRequests(requestList, lastFrameNumber);
				status_t Camera3Device::RequestThread::setRepeatingRequests(const RequestList &requests,/*out*/int64_t *lastFrameNumber)
					mRepeatingRequests.insert(mRepeatingRequests.begin(),requests.begin(), requests.end());				
		} else {
			res = mRequestThread->queueRequestList(requestList, lastFrameNumber);
				Camera3Device::RequestThread::queueRequestList(List<sp<CaptureRequest> > &requests,/*out*/int64_t *lastFrameNumber)
					for (List<sp<CaptureRequest> >::iterator it = requests.begin(); it != requests.end();++it) {
						mRequestQueue.push_back(*it);/*这里就是体现了拍照请求的优先级将当前的请求都放到拍照请求之后*/
					}
		}

		
	
		

至此就交给Frameworks中的请求处理线程执行,可以得出一个结论就是拍照请求需要APP下发一次,但是预览请求APP下发一次后Frameworks会连续循环下发请求

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值