Android源码Camera2预览流程分析一

更新时间:2023-06-24 12:15:34 阅读: 评论:0

Android源码Camera2预览流程分析⼀
先上⼀段典型的预览代码,梳理⼀下相机预览流程。
1. 从 TextureView 获取到 SurfaceTexture
2. 将 SurfaceTexture 默认缓冲区的⼤⼩配置为相机预览的⼤⼩
3. 新建⼀个 Surface 作为预览输出
4. CaptureRequest.Builder 设置 Surface
5. 创建 CameraCaptureSession ⽤于相机预览
6. 创建成功 CameraCaptureSession 后给 CaptureRequest.Builder 设置⾃动对焦,必要时开启闪光灯
7. 现在可以开始显⽰相机预览了,CameraCaptureSession 设置重复请求预览数据
/**
* Creates a new [CameraCaptureSession] for camera preview.
*/
private fun createCameraPreviewSession(){
try{
val texture = textureView.surfaceTexture
// We configure the size of default buffer to be the size of camera preview we want.
texture.tDefaultBufferSize(previewSize.width, previewSize.height)
// This is the output Surface we need to start preview.
val surface =Surface(texture)
// We t up a CaptureRequest.Builder with the output Surface.
previewRequestBuilder = cameraDevice!!.createCaptureRequest(
CameraDevice.TEMPLATE_PREVIEW
)
图片的英文
previewRequestBuilder.addTarget(surface)
// Here, we create a CameraCaptureSession for camera preview.
cameraDevice?.createCaptureSession(Arrays.asList(surface),
object: CameraCaptureSession.StateCallback(){
override fun onConfigured(cameraCaptureSession: CameraCaptureSession){
// The camera is already clod
if(cameraDevice ==null)return
// When the ssion is ready, we start displaying the preview.
captureSession = cameraCaptureSessionsieg
try{
// Auto focus should be continuous for camera preview.
previewRequestBuilder.t(CaptureRequest.CONTROL_AF_MODE,
CaptureRequest.CONTROL_AF_MODE_CONTINUOUS_PICTURE)
// Flash is automatically enabled when necessary.
tAutoFlash(previewRequestBuilder)
// Finally, we start displaying the camera preview.
previewRequest = previewRequestBuilder.build()
captureSession?.tRepeatingRequest(previewRequest,
captureCallback, backgroundHandler)
}catch(e: CameraAccessException){
Log.e(TAG, e.toString())
}
}
override fun onConfigureFailed(ssion: CameraCaptureSession){
activity.showToast("Failed")
}
},null)
}catch(e: CameraAccessException){
Log.e(TAG, e.toString())
}
}
CameraMetadataNative 类代表 Binder 跨进程通信到 camera rvice 的相机元数据封送的实现。
这⾥⾯涉及了⼀个重点逻辑调⽤了 mRemoteDevice 变量指向的对象的 createDefaultRequest(…) ⽅法。templateType = CameraDevice.TEMPLATE_PREVIEW,其值为 1。然后将输出的 CameraMetadataNative 对象作为 CaptureRequest.Builder ⼊参构造⼀个 CaptureRequest.Builder 对象返回。
frameworks/ba/core/java/android/hardware/camera2/impl/CameraDeviceImpl.java
public class CameraDeviceImpl extends CameraDevice {
......
@Override
public CaptureRequest.Builder createCaptureRequest(int templateType)
throws CameraAccessException {
synchronized(mInterfaceLock){
checkIfCameraClodOrInError();
CameraMetadataNative templatedRequest =new CameraMetadataNative();
try{
}catch(CameraRuntimeException e){
throw e.asChecked();
}catch(RemoteException e){
// impossible
return null;
}
CaptureRequest.Builder builder =new CaptureRequest.Builder(
templatedRequest,/*reprocess*/fal, CameraCaptureSession.SESSION_ID_NONE);
return builder;
}
}noire
......
}
⾸先来确定 mRemoteDevice 是哪⾥赋值的?CameraDeviceImpl 类 tRemoteDevice(…) ⽅法中⼜通过调⽤CameraBinderDecorator 类 newInstance(…) ⽅法创建了实现 ICameraDeviceUr 接⼝的对象。
frameworks/ba/core/java/android/hardware/camera2/impl/CameraDeviceImpl.java
public class CameraDeviceImpl extends CameraDevice {
......
public void tRemoteDevice(ICameraDeviceUr remoteDevice){
synchronized(mInterfaceLock){
// TODO: Move from decorator to direct binder-mediated exceptionsenjoyonelf
// If tRemoteFailure already called, do nothing
if(mInError)return;
mRemoteDevice = wInstance(remoteDevice);
韩国考试mDeviceHandler.post(mCallOnOpened);
mDeviceHandler.post(mCallOnUnconfigured);
}
}
......
}
CameraBinderDecorator 类静态⽅法 newInstance(…) 是个泛型⽅法。实际上其内部实现为调⽤ Decorator 泛型类的newInstance(…) ⽅法。⼊参除了 T 类型的对象,还有⼀个 CameraBinderDecoratorListener 对象。
frameworks/ba/core/java/android/hardware/camera2/utils/CameraBinderDecorator.java
public class CameraBinderDecorator {
......
static class CameraBinderDecoratorListener implements Decorator.DecoratorListener {
@Override
public void onBeforeInvocation(Method m, Object[] args){
}
@Override
public void onAfterInvocation(Method m, Object[] args, Object result){
// int return type => status_t => convert to exception
ReturnType()== Integer.TYPE){
int returnValue =(Integer) result;
throwOnError(returnValue);
}
}
@Override
public boolean onCatchException(Method m, Object[] args, Throwable t){
if(t instanceof DeadObjectException){
throw new CameraRuntimeException(CAMERA_DISCONNECTED,
"Process hosting the camera rvice has died unexpectedly",
t);
}el if(t instanceof RemoteException){
throw new UnsupportedOperationException("An unknown RemoteException was thrown"+
" which should never happen.", t);
}
return fal;
}
@Override
public void onFinally(Method m, Object[] args){
}
}
.
.....
public static<T> T newInstance(T obj){
return Decorator.<T>newInstance(obj,new CameraBinderDecoratorListener());
}
}
代码跟到这个位置就很清晰了,这⾥使⽤了 Java 的动态代理机制。也就是说最后返回的实现 ICameraDeviceUr 接⼝的对象实际上是动态代理到 remoteDevice 引⽤对象的对象。为什么需要绕⼀个⼤弯⼦?使⽤动态代理机制可以在不改变原有对象实现⽅法的基础上完成⼀些额外功能。
frameworks/ba/core/java/android/hardware/camera2/utils/Decorator.java
public class Decorator<T>implements InvocationHandler {
......
@SuppressWarnings("unchecked")
public static<T> T newInstance(T obj, DecoratorListener listener){
return(T)wProxyInstance(
new Decorator<T>(obj, listener));
}
......
}
恋恋笔记本台词
继续分析 CameraDeviceImpl 类 tRemoteDevice(…) 何时被调⽤?如果对 openCamera(…) 流程还有印象,就知道其赋值是在CameraManager 类 openCameraDeviceUrAsync(…) ⽅法中。分析可知 mRemoteDevice 对象实际指向⼀个ICameraDeviceUr.Stub.Proxy 类型的对象。
现在可以继续分析 createDefaultRequest(…) ⽅法调⽤流程了。ICameraDeviceUr.Stub 和 ICamer
aDeviceUr.Stub.Proxy 是编译 ICameraDeviceUr.aidl ⽣成的。最终会调⽤ BpCameraDeviceUr 类 createDefaultRequest(…) ⽅法。
frameworks/av/camera/camera2/ICameraDeviceUr.cpp
class BpCameraDeviceUr :public BpInterface<ICameraDeviceUr>
{
public:
......
// 从模板创建请求对象
virtual status_t createDefaultRequest(int templateId,
/*out*/
CameraMetadata* request)
{
Parcel data, reply;
data.writeInterfaceToken(ICameraDeviceUr::getInterfaceDescriptor());
data.writeInt32(templateId);
remote()->transact(CREATE_DEFAULT_REQUEST, data,&reply);
status_t result = adInt32();
CameraMetadata out;
adInt32()!=0){
}
培训美甲化妆
if(request !=NULL){
request->swap(out);
}
return result;
}
delicious}
BpCameraDeviceUr 类 createDefaultRequest(…) ⽅法会调⽤到 BnCameraDeviceUr 同名⽅法。
frameworks/av/include/camera/camera2/ICameraDeviceUr.h
class BnCameraDeviceUr:public BnInterface<ICameraDeviceUr>
{
public:暂时英文
virtual status_t    onTransact(uint32_t code,
const Parcel& data,
Parcel* reply,
uint32_t flags =0);
国字脸男生适合什么发型};
BnCameraDeviceUr::onTransact(…) 接收到 CREATE_DEFAULT_REQUEST 类型的消息,并调⽤ createDefaultRequest(…) ⽅法处理,实际是 BnCameraDeviceUr 的⼦类。
frameworks/av/camera/camera2/ICameraDeviceUr.cpp

本文发布于:2023-06-24 12:15:34,感谢您对本站的认可!

本文链接:https://www.wtabcd.cn/fanwen/fan/90/155967.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

标签:对象   预览   实现   流程   分析   重点   请求
相关文章
留言与评论(共有 0 条评论)
   
验证码:
Copyright ©2019-2022 Comsenz Inc.Powered by © 专利检索| 网站地图