camera frame work v3 note
1 android_atomic_write(level, &gLogLevel);
原子写操作。
2 构造函数和onFirstRef
onFirstRef 会在构造函数运行后执行,这个是在mediaserver 这个进程启动时运行的,具体为何可查看代码。
3 ICameraServiceListener
class ICameraServiceListener : public IInterface
定义了接口,一定会有构建bp和bn,形成进程间通讯。
bn 是具体的实现, bp 则是通过binder 调用bn实现功能。
这个实现就是
onStatusChanged(Status status, int32_t cameraId)=0
BpCameraServiceListener 实现了onStatusChanged,而BnCameraServiceListener 没有实现,所以,所有从BnCameraServiceListener继承的累都必须
实现这个函数。也就是说,我们调用的一直是bp,但好像bn在执行。一般这样的调用都有一个明显的特征
如
listener->onStatusChanged(mStatusList[i], i); 而lisrener 是 const sp<ICameraServiceListener>& listener
这样调用的是bp,那么就得找到bn,来看这个函数。一般是到ICameraServiceListener.c 中找BnCameraServiceListener 然后找到谁继承BnCameraServiceListener,在这里找到onStatusChanged。
4 连接到camera
android_hardware_Camera_native_setup----> sp<Camera> camera = Camera::connect(cameraId, clientName, Camera::USE_CALLING_UID);
调用到cameraserver的conect
status_t CameraService::connect( const sp<ICameraClient>& cameraClient, int cameraId, const String16& clientPackageName, int clientUid, /*out*/ sp<ICamera>& device)
比较有意思的是第一个和最后一个参数。
第一个参数是回调函数的bp, 最后一个函数竟然是camera的bp
连接的主要工作就是
client = new Camera2Client(this, cameraClient,
clientPackageName, cameraId,
facing, callingPid, clientUid, getpid(),
deviceVersion);
mClient[cameraId] = client;
client->initialize(mModule)
构造时调函数的bp会被保存。
这样camera 就连接上了,并返回了camera cloass obj。
camera.cpp 是icamera的一个bp,同时也是回调的bn
Camera2Client.cpp 是icamera的bn,是回调的bp。
5 设备的创建
CameraDeviceFactory::createDevice Camera2Client 构造中调用
根据设备api的不同,有Camera3Device Camera2Device
camera 设备构造时camera3_callback_ops 被赋值,之后会交给hal 用的。
这个结构有连个操作,一个是通知,用于error 和 shutter ,另一个是返回请求结果 sProcessCaptureResult
6 设备的初始化
Camera2Client::initialize --------->
Camera2ClientBase::initialize --->mDevice->initialize
然后
mStatusTracker = new StatusTracker(this);
mRequestThread = new RequestThread(this, mStatusTracker, device);
这是两个线程。
Camera2Client::initialize 里启动了
mStreamingProcessor
mFrameProcessor
mCaptureSequencer
mJpegProcessor
mZslProcessorThread
mCallbackProcessor
线程