CameraProvider.cpp revision 0fb4577a35832653e009f1ba92a7b735e381c421
1/*
2 * Copyright (C) 2016 The Android Open Source Project
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 *      http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16
17#define LOG_TAG "CamProvider@2.4-impl"
18//#define LOG_NDEBUG 0
19#include <android/log.h>
20
21#include "CameraProvider.h"
22#include "ExternalCameraProvider.h"
23#include "CameraDevice_1_0.h"
24#include "CameraDevice_3_3.h"
25#include "CameraDevice_3_4.h"
26#include <cutils/properties.h>
27#include <string.h>
28#include <utils/Trace.h>
29
30
31namespace android {
32namespace hardware {
33namespace camera {
34namespace provider {
35namespace V2_4 {
36namespace implementation {
37
38namespace {
39const char *kLegacyProviderName = "legacy/0";
40const char *kExternalProviderName = "external/0";
41// "device@<version>/legacy/<id>"
42const std::regex kDeviceNameRE("device@([0-9]+\\.[0-9]+)/legacy/(.+)");
43const char *kHAL3_2 = "3.2";
44const char *kHAL3_3 = "3.3";
45const char *kHAL3_4 = "3.4";
46const char *kHAL1_0 = "1.0";
47const int kMaxCameraDeviceNameLen = 128;
48const int kMaxCameraIdLen = 16;
49
50bool matchDeviceName(const hidl_string& deviceName, std::string* deviceVersion,
51                     std::string* cameraId) {
52    std::string deviceNameStd(deviceName.c_str());
53    std::smatch sm;
54    if (std::regex_match(deviceNameStd, sm, kDeviceNameRE)) {
55        if (deviceVersion != nullptr) {
56            *deviceVersion = sm[1];
57        }
58        if (cameraId != nullptr) {
59            *cameraId = sm[2];
60        }
61        return true;
62    }
63    return false;
64}
65
66} // anonymous namespace
67
68using ::android::hardware::camera::common::V1_0::CameraMetadataType;
69using ::android::hardware::camera::common::V1_0::Status;
70
71void CameraProvider::addDeviceNames(int camera_id, CameraDeviceStatus status, bool cam_new)
72{
73    char cameraId[kMaxCameraIdLen];
74    snprintf(cameraId, sizeof(cameraId), "%d", camera_id);
75    std::string cameraIdStr(cameraId);
76
77    mCameraIds.add(cameraIdStr);
78
79    // initialize mCameraDeviceNames and mOpenLegacySupported
80    mOpenLegacySupported[cameraIdStr] = false;
81    int deviceVersion = mModule->getDeviceVersion(camera_id);
82    auto deviceNamePair = std::make_pair(cameraIdStr,
83                                         getHidlDeviceName(cameraIdStr, deviceVersion));
84    mCameraDeviceNames.add(deviceNamePair);
85    if (cam_new) {
86        mCallbacks->cameraDeviceStatusChange(deviceNamePair.second, status);
87    }
88    if (deviceVersion >= CAMERA_DEVICE_API_VERSION_3_2 &&
89            mModule->isOpenLegacyDefined()) {
90        // try open_legacy to see if it actually works
91        struct hw_device_t* halDev = nullptr;
92        int ret = mModule->openLegacy(cameraId, CAMERA_DEVICE_API_VERSION_1_0, &halDev);
93        if (ret == 0) {
94            mOpenLegacySupported[cameraIdStr] = true;
95            halDev->close(halDev);
96            deviceNamePair = std::make_pair(cameraIdStr,
97                            getHidlDeviceName(cameraIdStr, CAMERA_DEVICE_API_VERSION_1_0));
98            mCameraDeviceNames.add(deviceNamePair);
99            if (cam_new) {
100                mCallbacks->cameraDeviceStatusChange(deviceNamePair.second, status);
101            }
102        } else if (ret == -EBUSY || ret == -EUSERS) {
103            // Looks like this provider instance is not initialized during
104            // system startup and there are other camera users already.
105            // Not a good sign but not fatal.
106            ALOGW("%s: open_legacy try failed!", __FUNCTION__);
107        }
108    }
109}
110
111void CameraProvider::removeDeviceNames(int camera_id)
112{
113    std::string cameraIdStr = std::to_string(camera_id);
114
115    mCameraIds.remove(cameraIdStr);
116
117    int deviceVersion = mModule->getDeviceVersion(camera_id);
118    auto deviceNamePair = std::make_pair(cameraIdStr,
119                                         getHidlDeviceName(cameraIdStr, deviceVersion));
120    mCameraDeviceNames.remove(deviceNamePair);
121    mCallbacks->cameraDeviceStatusChange(deviceNamePair.second, CameraDeviceStatus::NOT_PRESENT);
122    if (deviceVersion >= CAMERA_DEVICE_API_VERSION_3_2 &&
123        mModule->isOpenLegacyDefined() && mOpenLegacySupported[cameraIdStr]) {
124
125        deviceNamePair = std::make_pair(cameraIdStr,
126                            getHidlDeviceName(cameraIdStr, CAMERA_DEVICE_API_VERSION_1_0));
127        mCameraDeviceNames.remove(deviceNamePair);
128        mCallbacks->cameraDeviceStatusChange(deviceNamePair.second,
129                                             CameraDeviceStatus::NOT_PRESENT);
130    }
131
132    mModule->removeCamera(camera_id);
133}
134
135/**
136 * static callback forwarding methods from HAL to instance
137 */
138void CameraProvider::sCameraDeviceStatusChange(
139        const struct camera_module_callbacks* callbacks,
140        int camera_id,
141        int new_status) {
142    CameraProvider* cp = const_cast<CameraProvider*>(
143            static_cast<const CameraProvider*>(callbacks));
144    bool found = false;
145
146    if (cp == nullptr) {
147        ALOGE("%s: callback ops is null", __FUNCTION__);
148        return;
149    }
150
151    Mutex::Autolock _l(cp->mCbLock);
152    char cameraId[kMaxCameraIdLen];
153    snprintf(cameraId, sizeof(cameraId), "%d", camera_id);
154    std::string cameraIdStr(cameraId);
155    cp->mCameraStatusMap[cameraIdStr] = (camera_device_status_t) new_status;
156    if (cp->mCallbacks != nullptr) {
157        CameraDeviceStatus status = (CameraDeviceStatus) new_status;
158        for (auto const& deviceNamePair : cp->mCameraDeviceNames) {
159            if (cameraIdStr.compare(deviceNamePair.first) == 0) {
160                cp->mCallbacks->cameraDeviceStatusChange(
161                        deviceNamePair.second, status);
162                found = true;
163            }
164        }
165
166        switch (status) {
167        case CameraDeviceStatus::PRESENT:
168        case CameraDeviceStatus::ENUMERATING:
169            if (!found) {
170                cp->addDeviceNames(camera_id, status, true);
171            }
172            break;
173        case CameraDeviceStatus::NOT_PRESENT:
174            if (found) {
175                cp->removeDeviceNames(camera_id);
176            }
177        }
178    }
179}
180
181void CameraProvider::sTorchModeStatusChange(
182        const struct camera_module_callbacks* callbacks,
183        const char* camera_id,
184        int new_status) {
185    CameraProvider* cp = const_cast<CameraProvider*>(
186            static_cast<const CameraProvider*>(callbacks));
187
188    if (cp == nullptr) {
189        ALOGE("%s: callback ops is null", __FUNCTION__);
190        return;
191    }
192
193    Mutex::Autolock _l(cp->mCbLock);
194    if (cp->mCallbacks != nullptr) {
195        std::string cameraIdStr(camera_id);
196        TorchModeStatus status = (TorchModeStatus) new_status;
197        for (auto const& deviceNamePair : cp->mCameraDeviceNames) {
198            if (cameraIdStr.compare(deviceNamePair.first) == 0) {
199                cp->mCallbacks->torchModeStatusChange(
200                        deviceNamePair.second, status);
201            }
202        }
203    }
204}
205
206Status CameraProvider::getHidlStatus(int status) {
207    switch (status) {
208        case 0: return Status::OK;
209        case -ENODEV: return Status::INTERNAL_ERROR;
210        case -EINVAL: return Status::ILLEGAL_ARGUMENT;
211        default:
212            ALOGE("%s: unknown HAL status code %d", __FUNCTION__, status);
213            return Status::INTERNAL_ERROR;
214    }
215}
216
217std::string CameraProvider::getLegacyCameraId(const hidl_string& deviceName) {
218    std::string cameraId;
219    matchDeviceName(deviceName, nullptr, &cameraId);
220    return cameraId;
221}
222
223int CameraProvider::getCameraDeviceVersion(const hidl_string& deviceName) {
224    std::string deviceVersion;
225    bool match = matchDeviceName(deviceName, &deviceVersion, nullptr);
226    if (!match) {
227        return -1;
228    }
229    if (deviceVersion == kHAL3_3) {
230        return CAMERA_DEVICE_API_VERSION_3_3;
231    } else if (deviceVersion == kHAL3_2) {
232        return CAMERA_DEVICE_API_VERSION_3_2;
233    } else if (deviceVersion == kHAL1_0) {
234        return CAMERA_DEVICE_API_VERSION_1_0;
235    }
236    return 0;
237}
238
239std::string CameraProvider::getHidlDeviceName(
240        std::string cameraId, int deviceVersion) {
241    // Maybe consider create a version check method and SortedVec to speed up?
242    if (deviceVersion != CAMERA_DEVICE_API_VERSION_1_0 &&
243            deviceVersion != CAMERA_DEVICE_API_VERSION_3_2 &&
244            deviceVersion != CAMERA_DEVICE_API_VERSION_3_3 &&
245            deviceVersion != CAMERA_DEVICE_API_VERSION_3_4 &&
246            deviceVersion != CAMERA_DEVICE_API_VERSION_3_5) {
247        return hidl_string("");
248    }
249    bool isV1 = deviceVersion == CAMERA_DEVICE_API_VERSION_1_0;
250    int versionMajor = isV1 ? 1 : 3;
251    int versionMinor = isV1 ? 0 : mPreferredHal3MinorVersion;
252    if (deviceVersion == CAMERA_DEVICE_API_VERSION_3_5) {
253        versionMinor = 4;
254    }
255    char deviceName[kMaxCameraDeviceNameLen];
256    snprintf(deviceName, sizeof(deviceName), "device@%d.%d/legacy/%s",
257            versionMajor, versionMinor, cameraId.c_str());
258    return deviceName;
259}
260
261CameraProvider::CameraProvider() :
262        camera_module_callbacks_t({sCameraDeviceStatusChange,
263                                   sTorchModeStatusChange}) {
264    mInitFailed = initialize();
265}
266
267CameraProvider::~CameraProvider() {}
268
269bool CameraProvider::initialize() {
270    camera_module_t *rawModule;
271    int err = hw_get_module(CAMERA_HARDWARE_MODULE_ID,
272            (const hw_module_t **)&rawModule);
273    if (err < 0) {
274        ALOGE("Could not load camera HAL module: %d (%s)", err, strerror(-err));
275        return true;
276    }
277
278    mModule = new CameraModule(rawModule);
279    err = mModule->init();
280    if (err != OK) {
281        ALOGE("Could not initialize camera HAL module: %d (%s)", err, strerror(-err));
282        mModule.clear();
283        return true;
284    }
285    ALOGI("Loaded \"%s\" camera module", mModule->getModuleName());
286
287    // Setup vendor tags here so HAL can setup vendor keys in camera characteristics
288    VendorTagDescriptor::clearGlobalVendorTagDescriptor();
289    if (!setUpVendorTags()) {
290        ALOGE("%s: Vendor tag setup failed, will not be available.", __FUNCTION__);
291    }
292
293    // Setup callback now because we are going to try openLegacy next
294    err = mModule->setCallbacks(this);
295    if (err != OK) {
296        ALOGE("Could not set camera module callback: %d (%s)", err, strerror(-err));
297        mModule.clear();
298        return true;
299    }
300
301    mPreferredHal3MinorVersion =
302        property_get_int32("ro.vendor.camera.wrapper.hal3TrebleMinorVersion", 3);
303    ALOGV("Preferred HAL 3 minor version is %d", mPreferredHal3MinorVersion);
304    switch(mPreferredHal3MinorVersion) {
305        case 2:
306        case 3:
307            // OK
308            break;
309        default:
310            ALOGW("Unknown minor camera device HAL version %d in property "
311                    "'camera.wrapper.hal3TrebleMinorVersion', defaulting to 3",
312                    mPreferredHal3MinorVersion);
313            mPreferredHal3MinorVersion = 3;
314    }
315
316    mNumberOfLegacyCameras = mModule->getNumberOfCameras();
317    for (int i = 0; i < mNumberOfLegacyCameras; i++) {
318        struct camera_info info;
319        auto rc = mModule->getCameraInfo(i, &info);
320        if (rc != NO_ERROR) {
321            ALOGE("%s: Camera info query failed!", __func__);
322            mModule.clear();
323            return true;
324        }
325
326        if (checkCameraVersion(i, info) != OK) {
327            ALOGE("%s: Camera version check failed!", __func__);
328            mModule.clear();
329            return true;
330        }
331
332        char cameraId[kMaxCameraIdLen];
333        snprintf(cameraId, sizeof(cameraId), "%d", i);
334        std::string cameraIdStr(cameraId);
335        mCameraStatusMap[cameraIdStr] = CAMERA_DEVICE_STATUS_PRESENT;
336
337        addDeviceNames(i);
338    }
339
340    return false; // mInitFailed
341}
342
343/**
344 * Check that the device HAL version is still in supported.
345 */
346int CameraProvider::checkCameraVersion(int id, camera_info info) {
347    if (mModule == nullptr) {
348        return NO_INIT;
349    }
350
351    // device_version undefined in CAMERA_MODULE_API_VERSION_1_0,
352    // All CAMERA_MODULE_API_VERSION_1_0 devices are backward-compatible
353    if (mModule->getModuleApiVersion() >= CAMERA_MODULE_API_VERSION_2_0) {
354        // Verify the device version is in the supported range
355        switch (info.device_version) {
356            case CAMERA_DEVICE_API_VERSION_1_0:
357            case CAMERA_DEVICE_API_VERSION_3_2:
358            case CAMERA_DEVICE_API_VERSION_3_3:
359            case CAMERA_DEVICE_API_VERSION_3_4:
360            case CAMERA_DEVICE_API_VERSION_3_5:
361                // in support
362                break;
363            case CAMERA_DEVICE_API_VERSION_2_0:
364            case CAMERA_DEVICE_API_VERSION_2_1:
365            case CAMERA_DEVICE_API_VERSION_3_0:
366            case CAMERA_DEVICE_API_VERSION_3_1:
367                // no longer supported
368            default:
369                ALOGE("%s: Device %d has HAL version %x, which is not supported",
370                        __FUNCTION__, id, info.device_version);
371                return NO_INIT;
372        }
373    }
374
375    return OK;
376}
377
378bool CameraProvider::setUpVendorTags() {
379    ATRACE_CALL();
380    vendor_tag_ops_t vOps = vendor_tag_ops_t();
381
382    // Check if vendor operations have been implemented
383    if (!mModule->isVendorTagDefined()) {
384        ALOGI("%s: No vendor tags defined for this device.", __FUNCTION__);
385        return true;
386    }
387
388    mModule->getVendorTagOps(&vOps);
389
390    // Ensure all vendor operations are present
391    if (vOps.get_tag_count == nullptr || vOps.get_all_tags == nullptr ||
392            vOps.get_section_name == nullptr || vOps.get_tag_name == nullptr ||
393            vOps.get_tag_type == nullptr) {
394        ALOGE("%s: Vendor tag operations not fully defined. Ignoring definitions."
395               , __FUNCTION__);
396        return false;
397    }
398
399    // Read all vendor tag definitions into a descriptor
400    sp<VendorTagDescriptor> desc;
401    status_t res;
402    if ((res = VendorTagDescriptor::createDescriptorFromOps(&vOps, /*out*/desc))
403            != OK) {
404        ALOGE("%s: Could not generate descriptor from vendor tag operations,"
405              "received error %s (%d). Camera clients will not be able to use"
406              "vendor tags", __FUNCTION__, strerror(res), res);
407        return false;
408    }
409
410    // Set the global descriptor to use with camera metadata
411    VendorTagDescriptor::setAsGlobalVendorTagDescriptor(desc);
412    const SortedVector<String8>* sectionNames = desc->getAllSectionNames();
413    size_t numSections = sectionNames->size();
414    std::vector<std::vector<VendorTag>> tagsBySection(numSections);
415    int tagCount = desc->getTagCount();
416    std::vector<uint32_t> tags(tagCount);
417    desc->getTagArray(tags.data());
418    for (int i = 0; i < tagCount; i++) {
419        VendorTag vt;
420        vt.tagId = tags[i];
421        vt.tagName = desc->getTagName(tags[i]);
422        vt.tagType = (CameraMetadataType) desc->getTagType(tags[i]);
423        ssize_t sectionIdx = desc->getSectionIndex(tags[i]);
424        tagsBySection[sectionIdx].push_back(vt);
425    }
426    mVendorTagSections.resize(numSections);
427    for (size_t s = 0; s < numSections; s++) {
428        mVendorTagSections[s].sectionName = (*sectionNames)[s].string();
429        mVendorTagSections[s].tags = tagsBySection[s];
430    }
431    return true;
432}
433
434// Methods from ::android::hardware::camera::provider::V2_4::ICameraProvider follow.
435Return<Status> CameraProvider::setCallback(const sp<ICameraProviderCallback>& callback)  {
436    Mutex::Autolock _l(mCbLock);
437    mCallbacks = callback;
438    return Status::OK;
439}
440
441Return<void> CameraProvider::getVendorTags(getVendorTags_cb _hidl_cb)  {
442    _hidl_cb(Status::OK, mVendorTagSections);
443    return Void();
444}
445
446Return<void> CameraProvider::getCameraIdList(getCameraIdList_cb _hidl_cb)  {
447    std::vector<hidl_string> deviceNameList;
448    for (auto const& deviceNamePair : mCameraDeviceNames) {
449        if (mCameraStatusMap[deviceNamePair.first] == CAMERA_DEVICE_STATUS_PRESENT) {
450            deviceNameList.push_back(deviceNamePair.second);
451        }
452    }
453    hidl_vec<hidl_string> hidlDeviceNameList(deviceNameList);
454    _hidl_cb(Status::OK, hidlDeviceNameList);
455    return Void();
456}
457
458Return<void> CameraProvider::isSetTorchModeSupported(isSetTorchModeSupported_cb _hidl_cb) {
459    bool support = mModule->isSetTorchModeSupported();
460    _hidl_cb (Status::OK, support);
461    return Void();
462}
463
464Return<void> CameraProvider::getCameraDeviceInterface_V1_x(
465        const hidl_string& cameraDeviceName, getCameraDeviceInterface_V1_x_cb _hidl_cb)  {
466    std::string cameraId, deviceVersion;
467    bool match = matchDeviceName(cameraDeviceName, &deviceVersion, &cameraId);
468    if (!match) {
469        _hidl_cb(Status::ILLEGAL_ARGUMENT, nullptr);
470        return Void();
471    }
472
473    std::string deviceName(cameraDeviceName.c_str());
474    ssize_t index = mCameraDeviceNames.indexOf(std::make_pair(cameraId, deviceName));
475    if (index == NAME_NOT_FOUND) { // Either an illegal name or a device version mismatch
476        Status status = Status::OK;
477        ssize_t idx = mCameraIds.indexOf(cameraId);
478        if (idx == NAME_NOT_FOUND) {
479            ALOGE("%s: cannot find camera %s!", __FUNCTION__, cameraId.c_str());
480            status = Status::ILLEGAL_ARGUMENT;
481        } else { // invalid version
482            ALOGE("%s: camera device %s does not support version %s!",
483                    __FUNCTION__, cameraId.c_str(), deviceVersion.c_str());
484            status = Status::OPERATION_NOT_SUPPORTED;
485        }
486        _hidl_cb(status, nullptr);
487        return Void();
488    }
489
490    if (mCameraStatusMap.count(cameraId) == 0 ||
491            mCameraStatusMap[cameraId] != CAMERA_DEVICE_STATUS_PRESENT) {
492        _hidl_cb(Status::ILLEGAL_ARGUMENT, nullptr);
493        return Void();
494    }
495
496    sp<android::hardware::camera::device::V1_0::implementation::CameraDevice> device =
497            new android::hardware::camera::device::V1_0::implementation::CameraDevice(
498                    mModule, cameraId, mCameraDeviceNames);
499
500    if (device == nullptr) {
501        ALOGE("%s: cannot allocate camera device for id %s", __FUNCTION__, cameraId.c_str());
502        _hidl_cb(Status::INTERNAL_ERROR, nullptr);
503        return Void();
504    }
505
506    if (device->isInitFailed()) {
507        ALOGE("%s: camera device %s init failed!", __FUNCTION__, cameraId.c_str());
508        device = nullptr;
509        _hidl_cb(Status::INTERNAL_ERROR, nullptr);
510        return Void();
511    }
512
513    _hidl_cb (Status::OK, device);
514    return Void();
515}
516
517Return<void> CameraProvider::getCameraDeviceInterface_V3_x(
518        const hidl_string& cameraDeviceName, getCameraDeviceInterface_V3_x_cb _hidl_cb)  {
519    std::string cameraId, deviceVersion;
520    bool match = matchDeviceName(cameraDeviceName, &deviceVersion, &cameraId);
521    if (!match) {
522        _hidl_cb(Status::ILLEGAL_ARGUMENT, nullptr);
523        return Void();
524    }
525
526    std::string deviceName(cameraDeviceName.c_str());
527    ssize_t index = mCameraDeviceNames.indexOf(std::make_pair(cameraId, deviceName));
528    if (index == NAME_NOT_FOUND) { // Either an illegal name or a device version mismatch
529        Status status = Status::OK;
530        ssize_t idx = mCameraIds.indexOf(cameraId);
531        if (idx == NAME_NOT_FOUND) {
532            ALOGE("%s: cannot find camera %s!", __FUNCTION__, cameraId.c_str());
533            status = Status::ILLEGAL_ARGUMENT;
534        } else { // invalid version
535            ALOGE("%s: camera device %s does not support version %s!",
536                    __FUNCTION__, cameraId.c_str(), deviceVersion.c_str());
537            status = Status::OPERATION_NOT_SUPPORTED;
538        }
539        _hidl_cb(status, nullptr);
540        return Void();
541    }
542
543    if (mCameraStatusMap.count(cameraId) == 0 ||
544            mCameraStatusMap[cameraId] != CAMERA_DEVICE_STATUS_PRESENT) {
545        _hidl_cb(Status::ILLEGAL_ARGUMENT, nullptr);
546        return Void();
547    }
548
549    sp<android::hardware::camera::device::V3_2::ICameraDevice> device;
550    if (deviceVersion == kHAL3_4) {
551        ALOGV("Constructing v3.4 camera device");
552        sp<android::hardware::camera::device::V3_2::implementation::CameraDevice> deviceImpl =
553            new android::hardware::camera::device::V3_4::implementation::CameraDevice(
554                    mModule, cameraId, mCameraDeviceNames);
555        if (deviceImpl == nullptr || deviceImpl->isInitFailed()) {
556            ALOGE("%s: camera device %s init failed!", __FUNCTION__, cameraId.c_str());
557            device = nullptr;
558            _hidl_cb(Status::INTERNAL_ERROR, nullptr);
559            return Void();
560        }
561
562        device = deviceImpl;
563        _hidl_cb (Status::OK, device);
564        return Void();
565    }
566
567    // Since some Treble HAL revisions can map to the same legacy HAL version(s), we default
568    // to the newest possible Treble HAL revision, but allow for override if needed via
569    // system property.
570    switch (mPreferredHal3MinorVersion) {
571        case 2: { // Map legacy camera device v3 HAL to Treble camera device HAL v3.2
572            ALOGV("Constructing v3.2 camera device");
573            sp<android::hardware::camera::device::V3_2::implementation::CameraDevice> deviceImpl =
574                    new android::hardware::camera::device::V3_2::implementation::CameraDevice(
575                    mModule, cameraId, mCameraDeviceNames);
576            if (deviceImpl == nullptr || deviceImpl->isInitFailed()) {
577                ALOGE("%s: camera device %s init failed!", __FUNCTION__, cameraId.c_str());
578                device = nullptr;
579                _hidl_cb(Status::INTERNAL_ERROR, nullptr);
580                return Void();
581            }
582            device = deviceImpl;
583            break;
584        }
585        case 3: { // Map legacy camera device v3 HAL to Treble camera device HAL v3.3
586            ALOGV("Constructing v3.3 camera device");
587            sp<android::hardware::camera::device::V3_2::implementation::CameraDevice> deviceImpl =
588                    new android::hardware::camera::device::V3_3::implementation::CameraDevice(
589                    mModule, cameraId, mCameraDeviceNames);
590            if (deviceImpl == nullptr || deviceImpl->isInitFailed()) {
591                ALOGE("%s: camera device %s init failed!", __FUNCTION__, cameraId.c_str());
592                device = nullptr;
593                _hidl_cb(Status::INTERNAL_ERROR, nullptr);
594                return Void();
595            }
596            device = deviceImpl;
597            break;
598        }
599        default:
600            ALOGE("%s: Unknown HAL minor version %d!", __FUNCTION__, mPreferredHal3MinorVersion);
601            device = nullptr;
602            _hidl_cb(Status::INTERNAL_ERROR, nullptr);
603            return Void();
604    }
605    _hidl_cb (Status::OK, device);
606    return Void();
607}
608
609ICameraProvider* HIDL_FETCH_ICameraProvider(const char* name) {
610    if (strcmp(name, kLegacyProviderName) == 0) {
611        CameraProvider* provider = new CameraProvider();
612        if (provider == nullptr) {
613            ALOGE("%s: cannot allocate camera provider!", __FUNCTION__);
614            return nullptr;
615        }
616        if (provider->isInitFailed()) {
617            ALOGE("%s: camera provider init failed!", __FUNCTION__);
618            delete provider;
619            return nullptr;
620        }
621        return provider;
622    } else if (strcmp(name, kExternalProviderName) == 0) {
623        ExternalCameraProvider* provider = new ExternalCameraProvider();
624        return provider;
625    }
626    ALOGE("%s: unknown instance name: %s", __FUNCTION__, name);
627    return nullptr;
628}
629
630} // namespace implementation
631}  // namespace V2_4
632}  // namespace provider
633}  // namespace camera
634}  // namespace hardware
635}  // namespace android
636