camera1 api调用流程

一、Camera1 api调用流程与参数设置获取分析

framework 代码

/frameworks/base/core/java/android/hardware/Camera.java

    //开启摄像头并获取对应cameraid的句柄
    public static Camera open(int cameraId) {
        String disable = SystemProperties.get("sys.verifone.camera.disable","false");
        if(disable.equals("true")){
           Log.e(TAG, "Error verifone  disable  camera");
           return null;
        }    
        return new Camera(cameraId);                                                                                                                                   
    } 
    
    //通过camera句柄获得native取得的参数并设置到key列表其中
    public Parameters getParameters() {                                                                                                                                
        Parameters p = new Parameters();
        String s = native_getParameters();
        p.unflatten(s);//设置到key列表。比如KEY_PREVIEW_SIZE
        return p;
    }
    
    public void unflatten(String flattened) {                                                                                                                      
            mMap.clear();

            TextUtils.StringSplitter splitter = new TextUtils.SimpleStringSplitter(';');
            splitter.setString(flattened);
            for (String kv : splitter) {
                int pos = kv.indexOf('=');
                if (pos == -1) {
                    continue;
                }
                String k = kv.substring(0, pos);
                String v = kv.substring(pos + 1);
                mMap.put(k, v);
            }
        }
    //例如获取这个支持列表
        public List<Size> getSupportedPreviewSizes() {
            String str = get(KEY_PREVIEW_SIZE + SUPPORTED_VALUES_SUFFIX);                                                                                              
            return splitSize(str);
        }
frameworks/base/core/jni/android_hardware_Camera.cpp
static jstring android_hardware_Camera_getParameters(JNIEnv *env, jobject thiz)                                                                                        
{
    ALOGV("getParameters");
    sp<Camera> camera = get_native_camera(env, thiz, NULL);
    if (camera == 0) return 0;

    String8 params8 = camera->getParameters();//获取参数
    if (params8.isEmpty()) {
        jniThrowRuntimeException(env, "getParameters failed (empty parameters)");
        return 0;
    }    
    return env->NewStringUTF(params8.string());
}

camera->getParameters()调用到

frameworks/av/services/camera/libcameraservice/api1/Camera2Client.cpp 

String8 Camera2Client::getParameters() const {                                                                                                                         
    ATRACE_CALL();
    ALOGV("%s: Camera %d", __FUNCTION__, mCameraId);
    Mutex::Autolock icl(mBinderSerializationLock);
    // The camera service can unconditionally get the parameters at all times
    if (CameraThreadState::getCallingPid() != mServicePid && checkPid(__FUNCTION__) != OK) return String8();

    SharedParameters::ReadLock l(mParameters);

    return l.mParameters.get();
}
调用到服务端基本都在这个目录例如参数处理的代码路径

实际paramaters初始化赋值的位置
frameworks/av/services/camera/libcameraservice/api1/Camera2Client.cpp

tatus_t Camera2Client::initializeImpl(TProviderPtr providerPtr, const String8& monitorTags)
{
    ATRACE_CALL();
    ALOGV("%s: Initializing client for camera %d", __FUNCTION__, mCameraId);
    status_t res;

    res = Camera2ClientBase::initialize(providerPtr, monitorTags);
    if (res != OK) {
        return res;
    }

    {
        SharedParameters::Lock l(mParameters);

        res = l.mParameters.initialize(mDevice.get(), mDeviceVersion);//初始化位置
        if (res != OK) {
            ALOGE("%s: Camera %d: unable to build defaults: %s (%d)",
                    __FUNCTION__, mCameraId, strerror(-res), res);
            return NO_INIT;
        }

        l.mParameters.isDeviceZslSupported = isZslEnabledInStillTemplate();
    }
调用到
frameworks/av/services/camera/libcameraservice/api1/client2/Parameters.cpp
status_t Parameters::initialize(CameraDeviceBase *device, int deviceVersion) {
    status_t res; 
    if (device == nullptr) {
        ALOGE("%s: device is null!", __FUNCTION__);
        return BAD_VALUE;
    }    

    const CameraMetadata& info = device->info();
    if (info.entryCount() == 0) { 
        ALOGE("%s: No static information provided!", __FUNCTION__);
        return BAD_VALUE;
    }    
    Parameters::info = &info;
    mDeviceVersion = deviceVersion;

    res = buildFastInfo(device);
    if (res != OK) return res; 

    res = buildQuirks();
    if (res != OK) return res; 

#ifdef SPRD_FRAMEWORKS_CAMERA_EX
    // SPRD some chips can't support to 1920x1920 preview size
    // 预览赋值
    Size maxPreviewSize = { MAX_PREVIEW_WIDTH, MAX_PREVIEW_HEIGHT };
    camera_metadata_ro_entry_t previewSize =
        staticInfo(ANDROID_SPRD_MAX_PREVIEW_SIZE, 2);
    if (previewSize.count) {
        ALOGV("maxPreviewSize w=%d, h=%d", previewSize.data.i32[0],
            previewSize.data.i32[1]);
        if (previewSize.data.i32[0] > 0 && 
                previewSize.data.i32[1] > 0 && 
                previewSize.data.i32[0] <= maxPreviewSize.width &&
                previewSize.data.i32[1] <= maxPreviewSize.height) {
            maxPreviewSize.width = previewSize.data.i32[0];
            maxPreviewSize.height = previewSize.data.i32[1];
        }    
    }    
#else
    const Size maxPreviewSize = { MAX_PREVIEW_WIDTH, MAX_PREVIEW_HEIGHT };
#endif
//省略………………   参数初始化设置paramas.setxxxx

    params.setFloat(CameraParameters::KEY_HORIZONTAL_VIEW_ANGLE, horizFov);
    params.setFloat(CameraParameters::KEY_VERTICAL_VIEW_ANGLE, vertFov);

    exposureCompensation = 0;
    params.set(CameraParameters::KEY_EXPOSURE_COMPENSATION,
                exposureCompensation);

    camera_metadata_ro_entry_t exposureCompensationRange =
        staticInfo(ANDROID_CONTROL_AE_COMPENSATION_RANGE, 2, 2);
    if (!exposureCompensationRange.count) return NO_INIT;

    params.set(CameraParameters::KEY_MAX_EXPOSURE_COMPENSATION,
            exposureCompensationRange.data.i32[1]);
    params.set(CameraParameters::KEY_MIN_EXPOSURE_COMPENSATION,
            exposureCompensationRange.data.i32[0]);

    camera_metadata_ro_entry_t exposureCompensationStep =
        staticInfo(ANDROID_CONTROL_AE_COMPENSATION_STEP, 1, 1);
    if (!exposureCompensationStep.count) return NO_INIT;

    params.setFloat(CameraParameters::KEY_EXPOSURE_COMPENSATION_STEP,
            (float)exposureCompensationStep.data.r[0].numerator /
            exposureCompensationStep.data.r[0].denominator);

    autoExposureLock = false;
    autoExposureLockAvailable = false;
    camera_metadata_ro_entry_t exposureLockAvailable =
        staticInfo(ANDROID_CONTROL_AE_LOCK_AVAILABLE, 1, 1);
    if ((0 < exposureLockAvailable.count) &&
            (ANDROID_CONTROL_AE_LOCK_AVAILABLE_TRUE ==
                    exposureLockAvailable.data.u8[0])) {
        params.set(CameraParameters::KEY_AUTO_EXPOSURE_LOCK,
                CameraParameters::FALSE);
        params.set(CameraParameters::KEY_AUTO_EXPOSURE_LOCK_SUPPORTED,
                   CameraParameters::TRUE);
        autoExposureLockAvailable = true;
    } else {
        params.set(CameraParameters::KEY_AUTO_EXPOSURE_LOCK_SUPPORTED,
                   CameraParameters::FALSE);
    }

//省略………………


    paramsFlattened = params.flatten();

    return OK;
}

分析到这里是不是还没发现preview的分辨率的key哪里设置的?

frameworks/av/services/camera/libcameraservice/CameraService.cpp 

onFirstRef()


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

    BnCameraService::onFirstRef();

    // Update battery life tracking if service is restarting
    BatteryNotifier& notifier(BatteryNotifier::getInstance());
    notifier.noteResetCamera();
    notifier.noteResetFlashlight();

    status_t res = INVALID_OPERATION;
                                                                                                                                                                       
    res = enumerateProviders();//关键调用
    if (res == OK) {
        mInitialized = true;
    }    

    CameraService::pingCameraServiceProxy();

    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__);
    }    
}

enumerateProviders()

status_t CameraService::enumerateProviders() {                                                                                                                         
    status_t res;

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

        if (nullptr == mCameraProviderManager.get()) { //provider中去取get_hw_module取代旧版本的get
            mCameraProviderManager = new CameraProviderManager();
            res = mCameraProviderManager->initialize(this);//初始化provider,取get_hw_module
            if (res != OK) {
                ALOGE("%s: Unable to initialize camera provider manager: %s (%d)",
                        __FUNCTION__, strerror(-res), res);
                return res;
            }
        }


        // 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);
        }
    }

    return OK;
}

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

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);
    if (!success) {
        ALOGE("%s: Unable to register with hardware service manager for notifications "
                "about camera providers", __FUNCTION__);
        return INVALID_OPERATION;
    }    

    // See if there's a passthrough HAL, but let's not complain if there's not
    addProviderLocked(kLegacyProviderName, /*expected*/ false);//关键调用                                                                                                        
    addProviderLocked(kExternalProviderName, /*expected*/ false);

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

    return OK;
}

addProviderLocked

status_t CameraProviderManager::addProviderLocked(const std::string& newProvider, bool expected) {
    for (const auto& providerInfo : mProviders) {
        if (providerInfo->mProviderName == newProvider) {
            ALOGW("%s: Camera provider HAL with name '%s' already registered", __FUNCTION__,
                    newProvider.c_str());
            return ALREADY_EXISTS;
        }
    }

    sp<provider::V2_4::ICameraProvider> interface;
    interface = mServiceProxy->getService(newProvider);//取到provider接口

    if (interface == nullptr) {
        if (expected) {
            ALOGE("%s: Camera provider HAL '%s' is not actually available", __FUNCTION__,
                    newProvider.c_str());
            return BAD_VALUE;
        } else {
            return OK;
        }
    }

    sp<ProviderInfo> providerInfo = new ProviderInfo(newProvider, this);
    status_t res = providerInfo->initialize(interface, mDeviceState);//初始化providerinfo
    if (res != OK) {
        return res;
    }

    mProviders.push_back(providerInfo);

    return OK;
} 

分析至此应该看看providermanager的初始化流程了。参考博文。

Android Camera(一) Provider启动流程 (androidP)(HIDL)_android provider启动_liujun3512159的博客-CSDN博客我们的目的是找到预览参数设置的位置。

最终调用到

hardware/interfaces/camera/provider/2.4/default/CameraProvider_2_4.cpp

CameraProvider<IMPL>* getProviderImpl() {                                                                                                                              
    CameraProvider<IMPL> *provider = new CameraProvider<IMPL>();//new创建provider
    if (provider == nullptr) {
        ALOGE("%s: cannot allocate camera provider!", __FUNCTION__);
        return nullptr;
    }   
    if (provider->isInitFailed()) {
        ALOGE("%s: camera provider init failed!", __FUNCTION__);
        delete provider;
        return nullptr;
    }   
    return provider;
}
//由引用文章可知HIDL调用到此处  
ICameraProvider* HIDL_FETCH_ICameraProvider(const char* name) {
    using namespace android::hardware::camera::provider::V2_4::implementation;
    ICameraProvider* provider = nullptr;
    if (strcmp(name, kLegacyProviderName) == 0) {
        provider = getProviderImpl<LegacyCameraProviderImpl_2_4>();//legacy参数
    } else if (strcmp(name, kExternalProviderName) == 0) {
        provider = getProviderImpl<ExternalCameraProviderImpl_2_4>();
    } else {
        ALOGE("%s: unknown instance name: %s", __FUNCTION__, name);
    }   

    return provider;
}

由传参可知

hardware/interfaces/camera/provider/2.4/default/LegacyCameraProviderImpl_2_4.cpp

LegacyCameraProviderImpl_2_4::LegacyCameraProviderImpl_2_4() :
        camera_module_callbacks_t({sCameraDeviceStatusChange,
                                   sTorchModeStatusChange}) {
    mInitFailed = initialize();//初始化
}

bool LegacyCameraProviderImpl_2_4::initialize() {
    camera_module_t *rawModule;
    int err = hw_get_module(CAMERA_HARDWARE_MODULE_ID,
            (const hw_module_t **)&rawModule);//旧安卓的hw_module_t结构。
    if (err < 0) {
        ALOGE("Could not load camera HAL module: %d (%s)", err, strerror(-err));
        return true;
    }

    mModule = new CameraModule(rawModule);
    err = mModule->init();
    if (err != OK) {
        ALOGE("Could not initialize camera HAL module: %d (%s)", err, strerror(-err));
        mModule.clear();
        return true;
    }
    ALOGI("Loaded \"%s\" camera module", mModule->getModuleName());

    // Setup vendor tags here so HAL can setup vendor keys in camera characteristics
    VendorTagDescriptor::clearGlobalVendorTagDescriptor();
    if (!setUpVendorTags()) {
        ALOGE("%s: Vendor tag setup failed, will not be available.", __FUNCTION__);
    }

    // Setup callback now because we are going to try openLegacy next
    err = mModule->setCallbacks(this);
    if (err != OK) {
        ALOGE("Could not set camera module callback: %d (%s)", err, strerror(-err));
        mModule.clear();
        return true;
    }

    mPreferredHal3MinorVersion =
        property_get_int32("ro.vendor.camera.wrapper.hal3TrebleMinorVersion", 3);
    ALOGV("Preferred HAL 3 minor version is %d", mPreferredHal3MinorVersion);
    switch(mPreferredHal3MinorVersion) {
        case 2:
        case 3:
            // OK
            break;
        default:
            ALOGW("Unknown minor camera device HAL version %d in property "
                    "'camera.wrapper.hal3TrebleMinorVersion', defaulting to 3",
                    mPreferredHal3MinorVersion);
            mPreferredHal3MinorVersion = 3;
    }
    mNumberOfLegacyCameras = mModule->getNumberOfCameras();
    for (int i = 0; i < mNumberOfLegacyCameras; i++) {
        struct camera_info info;
        auto rc = mModule->getCameraInfo(i, &info);//调用到HAL层getCameraInfo
        if (rc != NO_ERROR) {
            ALOGE("%s: Camera info query failed!", __func__);
            mModule.clear();
            return true;
        }

        if (checkCameraVersion(i, info) != OK) {
            ALOGE("%s: Camera version check failed!", __func__);
            mModule.clear();
            return true;
        }

        char cameraId[kMaxCameraIdLen];
        snprintf(cameraId, sizeof(cameraId), "%d", i);
        std::string cameraIdStr(cameraId);
        mCameraStatusMap[cameraIdStr] = CAMERA_DEVICE_STATUS_PRESENT;

        addDeviceNames(i);
    }

    return false; // mInitFailed
} 

getcamerainfo方法走到SprdCamera3Hal.cpp 

SprdCamera3Factory.cpp中调用

int SprdCamera3Factory::getCameraInfo(int camera_id, struct camera_info *info) {
    int rc; 
    struct camera_device_manager *devPtr = NULL;//mantis-63893 Added for dynamic camera by wuchenglin on 2020-12-14
    Mutex::Autolock l(mLock);

    HAL_LOGI("E, camera_id = %d", camera_id);

    if (!mNumOfCameras || camera_id >= mNumOfCameras || !info ||
        (camera_id < 0)) {
        return -ENODEV;
    }   

    //+Begin mantis-63893 Added for dynamic camera by wuchenglin on 2020-12-14
    devPtr =
        (struct camera_device_manager *)SprdCamera3Setting::getCameraIdentifyState();
    for (int m = 0; m < mNumOfCameras; m++) {
        HAL_LOGV("factory identify_state[%d]=%d", m, devPtr->identify_state[m]);
        if (gSprdCamera3Factory.mCameraCallbacks != NULL) {
            gSprdCamera3Factory.mCameraCallbacks->camera_device_status_change(
                gSprdCamera3Factory.mCameraCallbacks,
                m, devPtr->identify_state[m]);
        }   
    }   
    //-End mantis-63893 Added for dynamic camera by wuchenglin on 2020-12-14

    SprdCamera3Setting::getSensorStaticInfo(camera_id);//实际获取信息。

    SprdCamera3Setting::initDefaultParameters(camera_id);

    rc = SprdCamera3Setting::getStaticMetadata(camera_id, &mStaticMetadata);
    if (rc < 0) {
        return rc; 
    }   

    SprdCamera3Setting::getCameraInfo(camera_id, info);

    info->device_version =
        CAMERA_DEVICE_API_VERSION_3_2; // CAMERA_DEVICE_API_VERSION_3_0;
    info->static_camera_characteristics = mStaticMetadata;
    info->conflicting_devices_length = 0;

    HAL_LOGV("X");
    return rc;                                                                                                                                                         
}

SprdCamera3Setting::getSensorStaticInfo(xxx,xxx);走到

SprdCamera3Setting.cpp

int SprdCamera3Setting::getSensorStaticInfo(int32_t cameraId) {
    struct phySensorInfo *phyPtr = NULL;
    int ret = 0; 

    // just for camera developer debug
    char value[PROPERTY_VALUE_MAX];
    property_get("persist.vendor.cam.auto.detect.sensor", value, "on");
    if (!strcmp(value, "off")) {
        HAL_LOGI("turn off auto detect sensor, just for debug");
        setLargestSensorSize(cameraId, default_sensor_max_sizes[cameraId].width,
                             default_sensor_max_sizes[cameraId].height);
        return 0;
    }    

    if (alreadyGetSensorStaticInfo[cameraId] != 0) { 
        HAL_LOGD("already get sensor info");
        return 0;
    }    

    HAL_LOGI("E");

    phyPtr = sensorGetPhysicalSnsInfo(cameraId);//从driver中获取分辨率

    if (phyPtr == NULL) {
        HAL_LOGE("open camera (%d) failed, can't get sensor info", cameraId);
        goto exit;
    }
    //……………………省略    
}

sensorGetPhysicalSnsInfo 中实际获取driver配置的分辨率等。。。

通篇从api调用到获取到provider操作。再去查看provider如何初始化。最终找到了preview分辨率等参数的实际获取地方。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值