OSDN Git Service

Camera: call setCallback before open_legacy
authorYin-Chia Yeh <yinchiayeh@google.com>
Wed, 1 Feb 2017 00:00:20 +0000 (16:00 -0800)
committerYin-Chia Yeh <yinchiayeh@google.com>
Wed, 1 Feb 2017 01:40:23 +0000 (17:40 -0800)
Some open_legacy implementations require a valid callback.

Test: the failing open_legacy call succeeds
Bug: 34854786
Change-Id: I461c7622bdf46a7cb7febfb7eeeb083288b4af03

camera/common/1.0/default/CameraModule.cpp
camera/provider/2.4/default/CameraProvider.cpp

index 5d9ae4d..3a4bc9c 100644 (file)
@@ -369,9 +369,11 @@ int CameraModule::getNumberOfCameras() {
 }
 
 int CameraModule::setCallbacks(const camera_module_callbacks_t *callbacks) {
-    int res;
+    int res = OK;
     ATRACE_BEGIN("camera_module->set_callbacks");
-    res = mModule->set_callbacks(callbacks);
+    if (getModuleApiVersion() >= CAMERA_MODULE_API_VERSION_2_1) {
+        res = mModule->set_callbacks(callbacks);
+    }
     ATRACE_END();
     return res;
 }
index 1a34aa6..d045e06 100644 (file)
@@ -184,13 +184,20 @@ bool CameraProvider::initialize() {
     mModule = new CameraModule(rawModule);
     err = mModule->init();
     if (err != OK) {
-        ALOGE("Could not initialize camera HAL module: %d (%s)", err,
-            strerror(-err));
+        ALOGE("Could not initialize camera HAL module: %d (%s)", err, strerror(-err));
         mModule.clear();
         return true;
     }
     ALOGI("Loaded \"%s\" camera module", mModule->getModuleName());
 
+    // 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++) {
         char cameraId[kMaxCameraIdLen];
@@ -289,11 +296,9 @@ bool CameraProvider::setUpVendorTags() {
 
 // Methods from ::android::hardware::camera::provider::V2_4::ICameraProvider follow.
 Return<Status> CameraProvider::setCallback(const sp<ICameraProviderCallback>& callback)  {
-    {
-        Mutex::Autolock _l(mCbLock);
-        mCallbacks = callback;
-    } // release lock here because HAL might send callbacks in setCallbacks call
-    return getHidlStatus(mModule->setCallbacks(this));
+    Mutex::Autolock _l(mCbLock);
+    mCallbacks = callback;
+    return Status::OK;
 }
 
 Return<void> CameraProvider::getVendorTags(getVendorTags_cb _hidl_cb)  {