Android Camera 打开预览流程分析(二)--CameraService中的打开流程

上篇分析了打开Camera 在FW中SDK部分的流程,这篇分析在CameraService中的流程。
CameraService 分几个部分:

  1. CameraServer定义和初始化 —frameworks/av/camera/cameraserver
  2. libcamera_client 调用库 —frameworks/av/camera/
  3. libcameraservice 服务调用库 — frameworks/av/service/camera/libcameraservice

CameraService的启动

CameraService 是通过cameraserver.rc 启动的

service cameraserver /system/bin/cameraserver
    class main
    user cameraserver
    group audio camera input drmrpc
    ioprio rt 4
    writepid /dev/cpuset/camera-daemon/tasks /dev/stune/foreground/tasks
    rlimit rtprio 10 10
    sp<ProcessState> proc(ProcessState::self());
    sp<IServiceManager> sm = defaultServiceManager();
    ALOGI("ServiceManager: %p", sm.get());
    //实例化了一个CameraService
    CameraService::instantiate();

CameraService 其实就是实例化了一个CameraService 的对象,看下CameraService 实例化过程中都做了哪些事情:

void CameraService::onFirstRef()
{
    ALOGI("CameraService process starting");

    BnCameraService::onFirstRef();
	//枚举所有的Camera信息
    res = enumerateProviders();
    if (res == OK) {
        mInitialized = true;
    }

    mUidPolicy = new UidPolicy(this);
    mUidPolicy->registerSelf();
    mSensorPrivacyPolicy = new SensorPrivacyPolicy(this);
    mSensorPrivacyPolicy->registerSelf();
    sp<HidlCameraService> hcs = HidlCameraService::getInstance(this);
    if (hcs->registerAsService() != android::OK) {
        ALOGE("%s: Failed to register default android.frameworks.cameraservice.service@1.0",
              __FUNCTION__);
    }

    // This needs to be last call in this function, so that it's as close to
    // ServiceManager::addService() as possible.
    CameraService::pingCameraServiceProxy();
    ALOGI("CameraService pinged cameraservice proxy");
}

CameraService 初始化时,枚举出所有的camera设备,camera 设备是什么时候获取到的呢?

status_t CameraService::enumerateProviders() {
    status_t res;

    std::vector<std::string> deviceIds;
    {
        Mutex::Autolock l(mServiceLock);
		//初始化CameraProviderManager
        if (nullptr == mCameraProviderManager.get()) {
            mCameraProviderManager = new CameraProviderManager();
            res = mCameraProviderManager->initialize(this);
            if (res != OK) {
                ALOGE("%s: Unable to initialize camera provider manager: %s (%d)",
                        __FUNCTION__, strerror(-res), res);
                return res;
            }
        }
        mCameraProviderManager->setUpVendorTags();

        if (nullptr == mFlashlight.get()) {
            mFlashlight = new CameraFlashlight(mCameraProviderManager, this);
        }

        res = mFlashlight->findFlashUnits();
        if (res != OK) {
            ALOGE("Failed to enumerate flash units: %s (%d)", strerror(-res), res);
        }
		//获取CameraDeviceIds
        deviceIds = mCameraProviderManager->getCameraDeviceIds();
    }


    for (auto& cameraId : deviceIds) {
        String8 id8 = String8(cameraId.c_str());
        if (getCameraState(id8) == nullptr) {
            //回调Camera的状态,表示camera 已经存在了
            onDeviceStatusChanged(id8, CameraDeviceStatus::PRESENT);
        }
    }

    return OK;
}

这里面主要做了两件事,一个是CameraProviderManager的initialize。另外一个是CameraProviderManager的获取cameradevices的所有id.
那就继续看initialize 做了哪些事?

status_t CameraProviderManager::initialize(wp<CameraProviderManager::StatusListener> listener,
        ServiceInteractionProxy* proxy) {
    std::lock_guard<std::mutex> lock(mInterfaceMutex);
    if (proxy == nullptr) {
        ALOGE("%s: No valid service interaction proxy provided", __FUNCTION__);
        return BAD_VALUE;
    }
    mListener = listener;
    mServiceProxy = proxy;
    mDeviceState = static_cast<hardware::hidl_bitfield<provider::V2_5::DeviceState>>(
        provider::V2_5::DeviceState::NORMAL);

    // Registering will trigger notifications for all already-known providers
    bool success = mServiceProxy->registerForNotifications(
        /* instance name, empty means no filter */ "",
        this);
    //遍历所有的代理服务, 其实也是  provider::V2_4::ICameraProvider 注册服务
    for (const auto& instance : mServiceProxy->listServices()) {
    	//增加实例化的CameraProvider
        this->addProviderLocked(instance);
    }

    IPCThreadState::self()->flushCommands();

    return OK;
}

我们看看CameraProviderManager->addProviderLocked 的实现功能:

status_t CameraProviderManager::addProviderLocked(const std::string& newProvider) {
	......
	//查找指定的CameraProvder
    sp<provider::V2_4::ICameraProvider> interface;
    interface = mServiceProxy->getService(newProvider);
	//对指定的ProviderInfo 进行初始化
    sp<ProviderInfo> providerInfo = new ProviderInfo(newProvider, this);
    status_t res = providerInfo->initialize(interface, mDeviceState);
 
    mProviders.push_back(providerInfo);
    return OK;
}

那就看ProviderInfo 是如何进行初始化的

status_t CameraProviderManager::ProviderInfo::initialize(
        sp<provider::V2_4::ICameraProvider>& interface,
        hardware::hidl_bitfield<provider::V2_5::DeviceState> currentDeviceState) {
        ......
       notifyDeviceStateChange(currentDeviceState);

    	res = setUpVendorTags();
    	    // Get initial list of camera devices, if any
	    std::vector<std::string> devices;
	    hardware::Return<void> ret = interface->getCameraIdList([&status, this, &devices](
	            Status idStatus,
	            const hardware::hidl_vec<hardware::hidl_string>& cameraDeviceNames) {
	        status = idStatus;
	        if (status == Status::OK) {
	            for (auto& name : cameraDeviceNames) {
	                uint16_t major, minor;
	                std::string type, id;
	                status_t res = parseDeviceName(name, &major, &minor, &type, &id);
	                if (res != OK) {
	                    ALOGE("%s: Error parsing deviceName: %s: %d", __FUNCTION__, name.c_str(), res);
	                    status = Status::INTERNAL_ERROR;
	                } else {
	                    devices.push_back(name);
	                    mProviderPublicCameraIds.push_back(id);
	                }
	            }
	        } });
	   ......
	       sp<StatusListener> listener = mManager->getStatusListener();
    for (auto& device : devices) {
        std::string id;
        //
        status_t res = addDevice(device, common::V1_0::CameraDeviceStatus::PRESENT, &id);
        if (res != OK) {
            ALOGE("%s: Unable to enumerate camera device '%s': %s (%d)",
                    __FUNCTION__, device.c_str(), strerror(-res), res);
            continue;
        }
    }

从ProviderInfo的initialize的代码中可以看到,通过ICameraProvider HAL层的接口 getCameraIdList (camera HAL 层已经遍历出来了所有的camera 的id),将cameraDeviceNames 遍历出来给到devices设备,同时把id 添加到mProviderPublicCameraIds中。
到这里就把cameraService 初始化的流程分析完了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值