第17讲 初始化VendorTags, Flashlight和PerfClass - Android Camera Native Framework

在这里插入图片描述frameworks/av/services/camera/libcameraservice/CameraService.cpp


status_t CameraService::enumerateProviders() {
    status_t res;

    std::vector<std::string> deviceIds;
    {
        Mutex::Autolock l(mServiceLock);

        // 1. 初始化 provider 和 device 代码略

        // 2. 初始化 vendortags
        // Setup vendor tags before we call get_camera_info the first time
        // because HAL might need to setup static vendor keys in get_camera_info
        // TODO: maybe put this into CameraProviderManager::initialize()?
        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);
        }

        deviceIds = mCameraProviderManager->getCameraDeviceIds();
    }


    for (auto& cameraId : deviceIds) {
        String8 id8 = String8(cameraId.c_str());
        if (getCameraState(id8) == nullptr) {
            onDeviceStatusChanged(id8, CameraDeviceStatus::PRESENT);
        }
    }

    // Derive primary rear/front cameras, and filter their charactierstics.
    // This needs to be done after all cameras are enumerated and camera ids are sorted.
    if (SessionConfigurationUtils::IS_PERF_CLASS) {
        // Assume internal cameras are advertised from the same
        // provider. If multiple providers are registered at different time,
        // and each provider contains multiple internal color cameras, the current
        // logic may filter the characteristics of more than one front/rear color
        // cameras.
        Mutex::Autolock l(mServiceLock);
        filterSPerfClassCharacteristicsLocked();
    }

    return OK;
}

创建VendorTagDescriptorCache

vendor 厂商自定义的 metadata

VendorTagDescriptorCache是一个Manager,管理不同Provider里面的Vendor Tag Descriptor,VendorTagDescriptor维护管理所有Vendor Tags的Section、Name、Type,ID之间的关系。

在这里插入图片描述

frameworks/av/services/camera/libcameraservice/common/CameraProviderManager.cpp

status_t CameraProviderManager::setUpVendorTags() {
    sp<VendorTagDescriptorCache> tagCache = new VendorTagDescriptorCache();

    for (auto& provider : mProviders) {
        tagCache->addVendorDescriptor(provider->mProviderTagid, provider->mVendorTagDescriptor);
    }

    VendorTagDescriptorCache::setAsGlobalVendorTagCache(tagCache);

    return OK;
}

vendor tag id 的生成

CameraProviderManager::ProviderInfo::ProviderInfo(
        const std::string &providerName,
        const std::string &providerInstance,
        CameraProviderManager *manager) :
        mProviderName(providerName),
        mProviderInstance(providerInstance),
        // 构造的时候自动产生,会根据字符串产生一个hash值
        mProviderTagid(generateVendorTagId(providerName)),
        mUniqueDeviceCount(0),
        mManager(manager) {
    (void) mManager;
}

vendor tag discripter 的生成, 将vendor tag 转花为discripter

status_t HidlProviderInfo::setUpVendorTags() {
  if (mVendorTagDescriptor != nullptr)
      return OK;

  hardware::hidl_vec<VendorTagSection> vts;
  Status status;
  hardware::Return<void> ret;
  const sp<hardware::camera::provider::V2_4::ICameraProvider> interface =
          startProviderInterface();
  if (interface == nullptr) {
      return DEAD_OBJECT;
  }
  ret = interface->getVendorTags(
      [&](auto s, const auto& vendorTagSecs) {
          status = s;
          if (s == Status::OK) {
              vts = vendorTagSecs;
          }
  });
  if (!ret.isOk()) {
      ALOGE("%s: Transaction error getting vendor tags from provider '%s': %s",
              __FUNCTION__, mProviderName.c_str(), ret.description().c_str());
      return DEAD_OBJECT;
  }
  if (status != Status::OK) {
      return mapToStatusT(status);
  }

  // Read all vendor tag definitions into a descriptor
  status_t res;
  // 转化
  if ((res = IdlVendorTagDescriptor::createDescriptorFromIdl<
              hardware::hidl_vec<hardware::camera::common::V1_0::VendorTagSection>,
                      hardware::camera::common::V1_0::VendorTagSection>(vts,
                              /*out*/mVendorTagDescriptor))
          != OK) {
      ALOGE("%s: Could not generate descriptor from vendor tag operations,"
              "received error %s (%d). Camera clients will not be able to use"
              "vendor tags", __FUNCTION__, strerror(res), res);
      return res;
  }

  return OK;
}

Flashlight初始化

通过类来管理闪光灯

CameraServer通过CameraFlashlight来管理各CameraDevice的Flashlight,类图如下:
在这里插入图片描述
通过CameraFlashlight::findFlashUnits完成Flashlight的初始化,流程如下:
在这里插入图片描述

status_t CameraService::enumerateProviders() {
    status_t res;

    std::vector<std::string> deviceIds;
    {
        // 如果没有先创建 CameraFlashlight
        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);
        }
    }


    return OK;
}

findFlashUnits 层层调用

status_t CameraFlashlight::findFlashUnits() {
    Mutex::Autolock l(mLock);
    status_t res;

    std::vector<String8> cameraIds;
    // 1. 拿到所有的camera id
    std::vector<std::string> ids = mProviderManager->getCameraDeviceIds();
    int numberOfCameras = static_cast<int>(ids.size());
    cameraIds.resize(numberOfCameras);
    // No module, must be provider
    for (size_t i = 0; i < cameraIds.size(); i++) {
        cameraIds[i] = String8(ids[i].c_str());
    }

    //2. 释放 flash control
    mFlashControl.clear();

    //3. 遍历每个camera, 检测 camera id 是否存在于 mHasFlashlightMap
    // 如果不存在,创建一个FlashlightControl 
    for (auto &id : cameraIds) {
        ssize_t index = mHasFlashlightMap.indexOfKey(id);
        if (0 <= index) {
            continue;
        }

        bool hasFlash = false;
        res = createFlashlightControl(id);
        if (res) {
            ALOGE("%s: failed to create flash control for %s", __FUNCTION__,
                    id.string());
        } else {
            // hasFlashUnit 调用链 service -- providerMgnager -- device info  
            res = mFlashControl->hasFlashUnit(id, &hasFlash);
            if (res == -EUSERS || res == -EBUSY) {
                ALOGE("%s: failed to check if camera %s has a flash unit. Some "
                        "camera devices may be opened", __FUNCTION__,
                        id.string());
                return res;
            } else if (res) {
                ALOGE("%s: failed to check if camera %s has a flash unit. %s"
                        " (%d)", __FUNCTION__, id.string(), strerror(-res),
                        res);
            }

            mFlashControl.clear();
        }
        mHasFlashlightMap.add(id, hasFlash);
    }

    mFlashlightMapInitialized = true;
    return OK;
}

为SPerfClass过滤Characteristics

针对主后置和主前置,过滤掉<1080p的JPEG尺寸

status_t CameraService::enumerateProviders() {

    //
    if (SessionConfigurationUtils::IS_PERF_CLASS) {
        // Assume internal cameras are advertised from the same
        // provider. If multiple providers are registered at different time,
        // and each provider contains multiple internal color cameras, the current
        // logic may filter the characteristics of more than one front/rear color
        // cameras.
        Mutex::Autolock l(mServiceLock);
        filterSPerfClassCharacteristicsLocked();
    }

    return OK;
}

执行条件:

peformance class 是anfroid s 加入的

ro.odm.build.media_performance_class >= 31

执行动作:

针对主后置和主前置,过滤掉<1080p的JPEG尺寸

CTS(SPerfClassTest.java)

testSPerfClassJpegSizesByCamera

流程

在这里插入图片描述



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值