diff options
| author | dd3boh <dade.garberi@gmail.com> | 2017-10-27 15:34:35 +0200 | 
|---|---|---|
| committer | dd3boh <dade.garberi@gmail.com> | 2017-10-31 12:34:43 +0100 | 
| commit | 7c5715e7dd99e1a4e8a6c8321648f5bd375d76af (patch) | |
| tree | eec0d2aec9bd7b6c052694c1410dd2ddb0459212 /camera/provider/CameraProvider.cpp | |
| parent | c2fbae38a58c158a15278f0c0dad7ec884f15543 (diff) | |
z2_plus: Switch to stock aosp camera implementation
* With the wrapper this just works good
Signed-off-by: dd3boh <dade.garberi@gmail.com>
Diffstat (limited to 'camera/provider/CameraProvider.cpp')
| -rw-r--r-- | camera/provider/CameraProvider.cpp | 507 | 
1 files changed, 0 insertions, 507 deletions
| diff --git a/camera/provider/CameraProvider.cpp b/camera/provider/CameraProvider.cpp deleted file mode 100644 index e6e03d8..0000000 --- a/camera/provider/CameraProvider.cpp +++ /dev/null @@ -1,507 +0,0 @@ -/* - * Copyright (C) 2016 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - *      http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#define LOG_TAG "CamProvider@2.4-impl.z2_plus" -#include <android/log.h> - -#include "CameraProvider.h" -#include "CameraDevice_1_0.h" -#include "CameraDevice_3_2.h" -#include <string.h> -#include <utils/Trace.h> - - -namespace android { -namespace hardware { -namespace camera { -namespace provider { -namespace V2_4 { -namespace implementation { - -namespace { -const char *kLegacyProviderName = "legacy/0"; -// "device@<version>/legacy/<id>" -const std::regex kDeviceNameRE("device@([0-9]+\\.[0-9]+)/legacy/(.+)"); -const char *kHAL3_2 = "3.2"; -const char *kHAL1_0 = "1.0"; -const int kMaxCameraDeviceNameLen = 128; -const int kMaxCameraIdLen = 16; - -bool matchDeviceName(const hidl_string& deviceName, std::string* deviceVersion, -                     std::string* cameraId) { -    std::string deviceNameStd(deviceName.c_str()); -    std::smatch sm; -    if (std::regex_match(deviceNameStd, sm, kDeviceNameRE)) { -        if (deviceVersion != nullptr) { -            *deviceVersion = sm[1]; -        } -        if (cameraId != nullptr) { -            *cameraId = sm[2]; -        } -        return true; -    } -    return false; -} - -} // anonymous namespace - -using ::android::hardware::camera::common::V1_0::CameraMetadataType; -using ::android::hardware::camera::common::V1_0::Status; - -/** - * static callback forwarding methods from HAL to instance - */ -void CameraProvider::sCameraDeviceStatusChange( -        const struct camera_module_callbacks* callbacks, -        int camera_id, -        int new_status) { -    CameraProvider* cp = const_cast<CameraProvider*>( -            static_cast<const CameraProvider*>(callbacks)); - -    if (cp == nullptr) { -        ALOGE("%s: callback ops is null", __FUNCTION__); -        return; -    } - -    Mutex::Autolock _l(cp->mCbLock); -    char cameraId[kMaxCameraIdLen]; -    snprintf(cameraId, sizeof(cameraId), "%d", camera_id); -    std::string cameraIdStr(cameraId); -    cp->mCameraStatusMap[cameraIdStr] = (camera_device_status_t) new_status; -    if (cp->mCallbacks != nullptr) { -        CameraDeviceStatus status = (CameraDeviceStatus) new_status; -        for (auto const& deviceNamePair : cp->mCameraDeviceNames) { -            if (cameraIdStr.compare(deviceNamePair.first) == 0) { -                cp->mCallbacks->cameraDeviceStatusChange( -                        deviceNamePair.second, status); -            } -        } -    } -} - -void CameraProvider::sTorchModeStatusChange( -        const struct camera_module_callbacks* callbacks, -        const char* camera_id, -        int new_status) { -    CameraProvider* cp = const_cast<CameraProvider*>( -            static_cast<const CameraProvider*>(callbacks)); - -    if (cp == nullptr) { -        ALOGE("%s: callback ops is null", __FUNCTION__); -        return; -    } - -    Mutex::Autolock _l(cp->mCbLock); -    if (cp->mCallbacks != nullptr) { -        std::string cameraIdStr(camera_id); -        TorchModeStatus status = (TorchModeStatus) new_status; -        for (auto const& deviceNamePair : cp->mCameraDeviceNames) { -            if (cameraIdStr.compare(deviceNamePair.first) == 0) { -                cp->mCallbacks->torchModeStatusChange( -                        deviceNamePair.second, status); -            } -        } -    } -} - -Status CameraProvider::getHidlStatus(int status) { -    switch (status) { -        case 0: return Status::OK; -        case -ENODEV: return Status::INTERNAL_ERROR; -        case -EINVAL: return Status::ILLEGAL_ARGUMENT; -        default: -            ALOGE("%s: unknown HAL status code %d", __FUNCTION__, status); -            return Status::INTERNAL_ERROR; -    } -} - -std::string CameraProvider::getLegacyCameraId(const hidl_string& deviceName) { -    std::string cameraId; -    matchDeviceName(deviceName, nullptr, &cameraId); -    return cameraId; -} - -int CameraProvider::getCameraDeviceVersion(const hidl_string& deviceName) { -    std::string deviceVersion; -    bool match = matchDeviceName(deviceName, &deviceVersion, nullptr); -    if (!match) { -        return -1; -    } -    if (deviceVersion == kHAL3_2) { -        // maybe switched to 3.4 or define the hidl version enum later -        return CAMERA_DEVICE_API_VERSION_3_2; -    } else if (deviceVersion == kHAL1_0) { -        return CAMERA_DEVICE_API_VERSION_1_0; -    } -    return 0; -} - -std::string CameraProvider::getHidlDeviceName( -        std::string cameraId, int deviceVersion) { -    // Maybe consider create a version check method and SortedVec to speed up? -    if (deviceVersion != CAMERA_DEVICE_API_VERSION_1_0 && -            deviceVersion != CAMERA_DEVICE_API_VERSION_3_2 && -            deviceVersion != CAMERA_DEVICE_API_VERSION_3_3 && -            deviceVersion != CAMERA_DEVICE_API_VERSION_3_4 ) { -        return hidl_string(""); -    } -    const char* versionStr = (deviceVersion == CAMERA_DEVICE_API_VERSION_1_0) ? kHAL1_0 : kHAL3_2; -    char deviceName[kMaxCameraDeviceNameLen]; -    snprintf(deviceName, sizeof(deviceName), "device@%s/legacy/%s", -            versionStr, cameraId.c_str()); -    return deviceName; -} - -CameraProvider::CameraProvider() : -        camera_module_callbacks_t({sCameraDeviceStatusChange, -                                   sTorchModeStatusChange}) { -    mInitFailed = initialize(); -} - -CameraProvider::~CameraProvider() {} - -bool CameraProvider::initialize() { -    camera_module_t *rawModule; -    int err = hw_get_module(CAMERA_HARDWARE_MODULE_ID, -            (const hw_module_t **)&rawModule); -    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; -    } - -    mNumberOfLegacyCameras = mModule->getNumberOfCameras(); -    for (int i = 0; i < mNumberOfLegacyCameras; i++) { -        struct camera_info info; -        auto rc = mModule->getCameraInfo(i, &info); -        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; -        mCameraIds.add(cameraIdStr); - -        // initialize mCameraDeviceNames and mOpenLegacySupported -        mOpenLegacySupported[cameraIdStr] = false; -        int deviceVersion = mModule->getDeviceVersion(i); -        mCameraDeviceNames.add( -                std::make_pair(cameraIdStr, -                               getHidlDeviceName(cameraIdStr, deviceVersion))); -        if (deviceVersion >= CAMERA_DEVICE_API_VERSION_3_2 && -                mModule->isOpenLegacyDefined()) { -            // try open_legacy to see if it actually works -            struct hw_device_t* halDev = nullptr; -            int ret = mModule->openLegacy(cameraId, CAMERA_DEVICE_API_VERSION_1_0, &halDev); -            if (ret == 0) { -                mOpenLegacySupported[cameraIdStr] = true; -                halDev->close(halDev); -                mCameraDeviceNames.add( -                        std::make_pair(cameraIdStr, -                                getHidlDeviceName(cameraIdStr, CAMERA_DEVICE_API_VERSION_1_0))); -            } else if (ret == -EBUSY || ret == -EUSERS) { -                // Looks like this provider instance is not initialized during -                // system startup and there are other camera users already. -                // Not a good sign but not fatal. -                ALOGW("%s: open_legacy try failed!", __FUNCTION__); -            } -        } -    } - -    return false; // mInitFailed -} - -/** - * Check that the device HAL version is still in supported. - */ -int CameraProvider::checkCameraVersion(int id, camera_info info) { -    if (mModule == nullptr) { -        return NO_INIT; -    } - -    // device_version undefined in CAMERA_MODULE_API_VERSION_1_0, -    // All CAMERA_MODULE_API_VERSION_1_0 devices are backward-compatible -    if (mModule->getModuleApiVersion() >= CAMERA_MODULE_API_VERSION_2_0) { -        // Verify the device version is in the supported range -        switch (info.device_version) { -            case CAMERA_DEVICE_API_VERSION_1_0: -            case CAMERA_DEVICE_API_VERSION_3_2: -            case CAMERA_DEVICE_API_VERSION_3_3: -            case CAMERA_DEVICE_API_VERSION_3_4: -                // in support -                break; -            case CAMERA_DEVICE_API_VERSION_2_0: -            case CAMERA_DEVICE_API_VERSION_2_1: -            case CAMERA_DEVICE_API_VERSION_3_0: -            case CAMERA_DEVICE_API_VERSION_3_1: -                // no longer supported -            default: -                ALOGE("%s: Device %d has HAL version %x, which is not supported", -                        __FUNCTION__, id, info.device_version); -                return NO_INIT; -        } -    } - -    return OK; -} - -bool CameraProvider::setUpVendorTags() { -    ATRACE_CALL(); -    vendor_tag_ops_t vOps = vendor_tag_ops_t(); - -    // Check if vendor operations have been implemented -    if (!mModule->isVendorTagDefined()) { -        ALOGI("%s: No vendor tags defined for this device.", __FUNCTION__); -        return true; -    } - -    mModule->getVendorTagOps(&vOps); - -    // Ensure all vendor operations are present -    if (vOps.get_tag_count == nullptr || vOps.get_all_tags == nullptr || -            vOps.get_section_name == nullptr || vOps.get_tag_name == nullptr || -            vOps.get_tag_type == nullptr) { -        ALOGE("%s: Vendor tag operations not fully defined. Ignoring definitions." -               , __FUNCTION__); -        return false; -    } - -    // Read all vendor tag definitions into a descriptor -    sp<VendorTagDescriptor> desc; -    status_t res; -    if ((res = VendorTagDescriptor::createDescriptorFromOps(&vOps, /*out*/desc)) -            != 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 false; -    } - -    // Set the global descriptor to use with camera metadata -    VendorTagDescriptor::setAsGlobalVendorTagDescriptor(desc); -    const SortedVector<String8>* sectionNames = desc->getAllSectionNames(); -    size_t numSections = sectionNames->size(); -    std::vector<std::vector<VendorTag>> tagsBySection(numSections); -    int tagCount = desc->getTagCount(); -    std::vector<uint32_t> tags(tagCount); -    desc->getTagArray(tags.data()); -    for (int i = 0; i < tagCount; i++) { -        VendorTag vt; -        vt.tagId = tags[i]; -        vt.tagName = desc->getTagName(tags[i]); -        vt.tagType = (CameraMetadataType) desc->getTagType(tags[i]); -        ssize_t sectionIdx = desc->getSectionIndex(tags[i]); -        tagsBySection[sectionIdx].push_back(vt); -    } -    mVendorTagSections.resize(numSections); -    for (size_t s = 0; s < numSections; s++) { -        mVendorTagSections[s].sectionName = (*sectionNames)[s].string(); -        mVendorTagSections[s].tags = tagsBySection[s]; -    } -    return true; -} - -// Methods from ::android::hardware::camera::provider::V2_4::ICameraProvider follow. -Return<Status> CameraProvider::setCallback(const sp<ICameraProviderCallback>& callback)  { -    Mutex::Autolock _l(mCbLock); -    mCallbacks = callback; -    return Status::OK; -} - -Return<void> CameraProvider::getVendorTags(getVendorTags_cb _hidl_cb)  { -    _hidl_cb(Status::OK, mVendorTagSections); -    return Void(); -} - -Return<void> CameraProvider::getCameraIdList(getCameraIdList_cb _hidl_cb)  { -    std::vector<hidl_string> deviceNameList; -    for (auto const& deviceNamePair : mCameraDeviceNames) { -        if (mCameraStatusMap[deviceNamePair.first] == CAMERA_DEVICE_STATUS_PRESENT) { -            deviceNameList.push_back(deviceNamePair.second); -        } -    } -    hidl_vec<hidl_string> hidlDeviceNameList(deviceNameList); -    _hidl_cb(Status::OK, hidlDeviceNameList); -    return Void(); -} - -Return<void> CameraProvider::isSetTorchModeSupported(isSetTorchModeSupported_cb _hidl_cb) { -    bool support = mModule->isSetTorchModeSupported(); -    _hidl_cb (Status::OK, support); -    return Void(); -} - -Return<void> CameraProvider::getCameraDeviceInterface_V1_x( -        const hidl_string& cameraDeviceName, getCameraDeviceInterface_V1_x_cb _hidl_cb)  { -    std::string cameraId, deviceVersion; -    bool match = matchDeviceName(cameraDeviceName, &deviceVersion, &cameraId); -    if (!match) { -        _hidl_cb(Status::ILLEGAL_ARGUMENT, nullptr); -        return Void(); -    } - -    std::string deviceName(cameraDeviceName.c_str()); -    ssize_t index = mCameraDeviceNames.indexOf(std::make_pair(cameraId, deviceName)); -    if (index == NAME_NOT_FOUND) { // Either an illegal name or a device version mismatch -        Status status = Status::OK; -        ssize_t idx = mCameraIds.indexOf(cameraId); -        if (idx == NAME_NOT_FOUND) { -            ALOGE("%s: cannot find camera %s!", __FUNCTION__, cameraId.c_str()); -            status = Status::ILLEGAL_ARGUMENT; -        } else { // invalid version -            ALOGE("%s: camera device %s does not support version %s!", -                    __FUNCTION__, cameraId.c_str(), deviceVersion.c_str()); -            status = Status::OPERATION_NOT_SUPPORTED; -        } -        _hidl_cb(status, nullptr); -        return Void(); -    } - -    if (mCameraStatusMap.count(cameraId) == 0 || -            mCameraStatusMap[cameraId] != CAMERA_DEVICE_STATUS_PRESENT) { -        _hidl_cb(Status::ILLEGAL_ARGUMENT, nullptr); -        return Void(); -    } - -    sp<android::hardware::camera::device::V1_0::implementation::CameraDevice> device = -            new android::hardware::camera::device::V1_0::implementation::CameraDevice( -                    mModule, cameraId, mCameraDeviceNames); - -    if (device == nullptr) { -        ALOGE("%s: cannot allocate camera device for id %s", __FUNCTION__, cameraId.c_str()); -        _hidl_cb(Status::INTERNAL_ERROR, nullptr); -        return Void(); -    } - -    if (device->isInitFailed()) { -        ALOGE("%s: camera device %s init failed!", __FUNCTION__, cameraId.c_str()); -        device = nullptr; -        _hidl_cb(Status::INTERNAL_ERROR, nullptr); -        return Void(); -    } - -    _hidl_cb (Status::OK, device); -    return Void(); -} - -Return<void> CameraProvider::getCameraDeviceInterface_V3_x( -        const hidl_string& cameraDeviceName, getCameraDeviceInterface_V3_x_cb _hidl_cb)  { -    std::string cameraId, deviceVersion; -    bool match = matchDeviceName(cameraDeviceName, &deviceVersion, &cameraId); -    if (!match) { -        _hidl_cb(Status::ILLEGAL_ARGUMENT, nullptr); -        return Void(); -    } - -    std::string deviceName(cameraDeviceName.c_str()); -    ssize_t index = mCameraDeviceNames.indexOf(std::make_pair(cameraId, deviceName)); -    if (index == NAME_NOT_FOUND) { // Either an illegal name or a device version mismatch -        Status status = Status::OK; -        ssize_t idx = mCameraIds.indexOf(cameraId); -        if (idx == NAME_NOT_FOUND) { -            ALOGE("%s: cannot find camera %s!", __FUNCTION__, cameraId.c_str()); -            status = Status::ILLEGAL_ARGUMENT; -        } else { // invalid version -            ALOGE("%s: camera device %s does not support version %s!", -                    __FUNCTION__, cameraId.c_str(), deviceVersion.c_str()); -            status = Status::OPERATION_NOT_SUPPORTED; -        } -        _hidl_cb(status, nullptr); -        return Void(); -    } - -    if (mCameraStatusMap.count(cameraId) == 0 || -            mCameraStatusMap[cameraId] != CAMERA_DEVICE_STATUS_PRESENT) { -        _hidl_cb(Status::ILLEGAL_ARGUMENT, nullptr); -        return Void(); -    } - -    sp<android::hardware::camera::device::V3_2::implementation::CameraDevice> device = -            new android::hardware::camera::device::V3_2::implementation::CameraDevice( -                    mModule, cameraId, mCameraDeviceNames); - -    if (device == nullptr) { -        ALOGE("%s: cannot allocate camera device for id %s", __FUNCTION__, cameraId.c_str()); -        _hidl_cb(Status::INTERNAL_ERROR, nullptr); -        return Void(); -    } - -    if (device->isInitFailed()) { -        ALOGE("%s: camera device %s init failed!", __FUNCTION__, cameraId.c_str()); -        device = nullptr; -        _hidl_cb(Status::INTERNAL_ERROR, nullptr); -        return Void(); -    } - -    _hidl_cb (Status::OK, device); -    return Void(); -} - -ICameraProvider* HIDL_FETCH_ICameraProvider(const char* name) { -    if (strcmp(name, kLegacyProviderName) != 0) { -        return nullptr; -    } -    CameraProvider* provider = new CameraProvider(); -    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; -} - -} // namespace implementation -}  // namespace V2_4 -}  // namespace provider -}  // namespace camera -}  // namespace hardware -}  // namespace android | 
