13450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk/* 23450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk * Copyright (C) 2015 The Android Open Source Project 33450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk * 43450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk * Licensed under the Apache License, Version 2.0 (the "License"); 53450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk * you may not use this file except in compliance with the License. 63450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk * You may obtain a copy of the License at 73450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk * 83450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk * http://www.apache.org/licenses/LICENSE-2.0 93450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk * 103450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk * Unless required by applicable law or agreed to in writing, software 113450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk * distributed under the License is distributed on an "AS IS" BASIS, 123450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 133450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk * See the License for the specific language governing permissions and 143450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk * limitations under the License. 153450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk */ 163450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk 173450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk#define LOG_NDEBUG 0 183450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk#define LOG_TAG "CameraBinderTests" 193450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk 203450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk#include <binder/IInterface.h> 213450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk#include <binder/IServiceManager.h> 223450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk#include <binder/Parcel.h> 233450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk#include <binder/ProcessState.h> 243450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk#include <utils/Errors.h> 253450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk#include <utils/Log.h> 263450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk#include <utils/List.h> 273450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk#include <utils/String8.h> 283450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk#include <utils/String16.h> 293450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk#include <utils/Condition.h> 303450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk#include <utils/Mutex.h> 313450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk#include <system/graphics.h> 323450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk#include <hardware/gralloc.h> 333450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk 343450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk#include <camera/CameraMetadata.h> 35d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala#include <android/hardware/ICameraService.h> 36d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala#include <android/hardware/ICameraServiceListener.h> 37d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala#include <android/hardware/BnCameraServiceListener.h> 38d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala#include <android/hardware/camera2/ICameraDeviceUser.h> 39d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala#include <android/hardware/camera2/ICameraDeviceCallbacks.h> 40d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala#include <android/hardware/camera2/BnCameraDeviceCallbacks.h> 413450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk#include <camera/camera2/CaptureRequest.h> 423450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk#include <camera/camera2/OutputConfiguration.h> 43d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala#include <camera/camera2/SubmitInfo.h> 443450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk 453450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk#include <gui/BufferItemConsumer.h> 463450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk#include <gui/IGraphicBufferProducer.h> 473450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk#include <gui/Surface.h> 483450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk 493450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk#include <gtest/gtest.h> 503450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk#include <unistd.h> 513450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk#include <stdint.h> 523450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk#include <utility> 533450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk#include <vector> 543450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk#include <map> 553450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk#include <algorithm> 563450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk 573450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunkusing namespace android; 583450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk 593450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk#define ASSERT_NOT_NULL(x) \ 603450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk ASSERT_TRUE((x) != nullptr) 613450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk 623450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk#define SETUP_TIMEOUT 2000000000 // ns 633450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk#define IDLE_TIMEOUT 2000000000 // ns 643450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk 653450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk// Stub listener implementation 66d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvalaclass TestCameraServiceListener : public hardware::BnCameraServiceListener { 67d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala std::map<String16, int32_t> mCameraTorchStatuses; 68d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala std::map<int32_t, int32_t> mCameraStatuses; 693450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk mutable Mutex mLock; 703450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk mutable Condition mCondition; 713450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk mutable Condition mTorchCondition; 723450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunkpublic: 733450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk virtual ~TestCameraServiceListener() {}; 743450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk 75d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala virtual binder::Status onStatusChanged(int32_t status, int32_t cameraId) { 763450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk Mutex::Autolock l(mLock); 773450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk mCameraStatuses[cameraId] = status; 783450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk mCondition.broadcast(); 79d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala return binder::Status::ok(); 803450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk }; 813450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk 82d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala virtual binder::Status onTorchStatusChanged(int32_t status, const String16& cameraId) { 833450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk Mutex::Autolock l(mLock); 843450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk mCameraTorchStatuses[cameraId] = status; 853450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk mTorchCondition.broadcast(); 86d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala return binder::Status::ok(); 873450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk }; 883450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk 893450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk bool waitForNumCameras(size_t num) const { 903450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk Mutex::Autolock l(mLock); 913450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk 923450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk if (mCameraStatuses.size() == num) { 933450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk return true; 943450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk } 953450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk 963450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk while (mCameraStatuses.size() < num) { 973450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk if (mCondition.waitRelative(mLock, SETUP_TIMEOUT) != OK) { 983450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk return false; 993450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk } 1003450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk } 1013450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk return true; 1023450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk }; 1033450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk 104d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala bool waitForTorchState(int32_t status, int32_t cameraId) const { 1053450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk Mutex::Autolock l(mLock); 1063450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk 1073450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk const auto& iter = mCameraTorchStatuses.find(String16(String8::format("%d", cameraId))); 1083450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk if (iter != mCameraTorchStatuses.end() && iter->second == status) { 1093450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk return true; 1103450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk } 1113450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk 1123450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk bool foundStatus = false; 1133450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk while (!foundStatus) { 1143450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk if (mTorchCondition.waitRelative(mLock, SETUP_TIMEOUT) != OK) { 1153450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk return false; 1163450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk } 1173450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk const auto& iter = 1183450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk mCameraTorchStatuses.find(String16(String8::format("%d", cameraId))); 1193450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk foundStatus = (iter != mCameraTorchStatuses.end() && iter->second == status); 1203450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk } 1213450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk return true; 1223450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk }; 1233450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk 124d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala int32_t getTorchStatus(int32_t cameraId) const { 1253450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk Mutex::Autolock l(mLock); 1263450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk const auto& iter = mCameraTorchStatuses.find(String16(String8::format("%d", cameraId))); 1273450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk if (iter == mCameraTorchStatuses.end()) { 128d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala return hardware::ICameraServiceListener::TORCH_STATUS_UNKNOWN; 1293450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk } 1303450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk return iter->second; 1313450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk }; 1323450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk 133d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala int32_t getStatus(int32_t cameraId) const { 1343450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk Mutex::Autolock l(mLock); 1353450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk const auto& iter = mCameraStatuses.find(cameraId); 1363450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk if (iter == mCameraStatuses.end()) { 137d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala return hardware::ICameraServiceListener::STATUS_UNKNOWN; 1383450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk } 1393450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk return iter->second; 1403450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk }; 1413450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk}; 1423450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk 1433450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk// Callback implementation 144d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvalaclass TestCameraDeviceCallbacks : public hardware::camera2::BnCameraDeviceCallbacks { 1453450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunkpublic: 1463450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk enum Status { 1473450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk IDLE, 1483450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk ERROR, 1493450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk PREPARED, 1503450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk RUNNING, 1513450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk SENT_RESULT, 152e8c535e833ed135895e99ca81aa3b85d80d7cf3cChien-Yu Chen UNINITIALIZED, 153e8c535e833ed135895e99ca81aa3b85d80d7cf3cChien-Yu Chen REPEATING_REQUEST_ERROR, 1543450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk }; 1553450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk 1563450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunkprotected: 1573450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk bool mError; 158d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala int32_t mLastStatus; 159d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala mutable std::vector<int32_t> mStatusesHit; 1603450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk mutable Mutex mLock; 1613450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk mutable Condition mStatusCondition; 1623450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunkpublic: 1633450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk TestCameraDeviceCallbacks() : mError(false), mLastStatus(UNINITIALIZED) {} 1643450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk 1653450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk virtual ~TestCameraDeviceCallbacks() {} 1663450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk 167d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala virtual binder::Status onDeviceError(int errorCode, 1683450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk const CaptureResultExtras& resultExtras) { 169d309fb9c8a2c4564d88fffba19c4e3688e4b862bEino-Ville Talvala (void) resultExtras; 1703450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk ALOGE("%s: onDeviceError occurred with: %d", __FUNCTION__, static_cast<int>(errorCode)); 1713450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk Mutex::Autolock l(mLock); 1723450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk mError = true; 1733450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk mLastStatus = ERROR; 1743450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk mStatusesHit.push_back(mLastStatus); 1753450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk mStatusCondition.broadcast(); 176d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala return binder::Status::ok(); 1773450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk } 1783450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk 179d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala virtual binder::Status onDeviceIdle() { 1803450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk Mutex::Autolock l(mLock); 1813450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk mLastStatus = IDLE; 1823450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk mStatusesHit.push_back(mLastStatus); 1833450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk mStatusCondition.broadcast(); 184d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala return binder::Status::ok(); 1853450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk } 1863450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk 187d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala virtual binder::Status onCaptureStarted(const CaptureResultExtras& resultExtras, 1883450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk int64_t timestamp) { 189d309fb9c8a2c4564d88fffba19c4e3688e4b862bEino-Ville Talvala (void) resultExtras; 190d309fb9c8a2c4564d88fffba19c4e3688e4b862bEino-Ville Talvala (void) timestamp; 1913450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk Mutex::Autolock l(mLock); 1923450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk mLastStatus = RUNNING; 1933450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk mStatusesHit.push_back(mLastStatus); 1943450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk mStatusCondition.broadcast(); 195d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala return binder::Status::ok(); 1963450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk } 1973450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk 1983450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk 199d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala virtual binder::Status onResultReceived(const CameraMetadata& metadata, 2003450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk const CaptureResultExtras& resultExtras) { 201d309fb9c8a2c4564d88fffba19c4e3688e4b862bEino-Ville Talvala (void) metadata; 202d309fb9c8a2c4564d88fffba19c4e3688e4b862bEino-Ville Talvala (void) resultExtras; 2033450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk Mutex::Autolock l(mLock); 2043450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk mLastStatus = SENT_RESULT; 2053450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk mStatusesHit.push_back(mLastStatus); 2063450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk mStatusCondition.broadcast(); 207d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala return binder::Status::ok(); 2083450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk } 2093450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk 210d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala virtual binder::Status onPrepared(int streamId) { 211d309fb9c8a2c4564d88fffba19c4e3688e4b862bEino-Ville Talvala (void) streamId; 2123450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk Mutex::Autolock l(mLock); 2133450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk mLastStatus = PREPARED; 2143450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk mStatusesHit.push_back(mLastStatus); 2153450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk mStatusCondition.broadcast(); 216d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala return binder::Status::ok(); 2173450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk } 2183450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk 219e8c535e833ed135895e99ca81aa3b85d80d7cf3cChien-Yu Chen virtual binder::Status onRepeatingRequestError(int64_t lastFrameNumber) { 220e8c535e833ed135895e99ca81aa3b85d80d7cf3cChien-Yu Chen (void) lastFrameNumber; 221e8c535e833ed135895e99ca81aa3b85d80d7cf3cChien-Yu Chen Mutex::Autolock l(mLock); 222e8c535e833ed135895e99ca81aa3b85d80d7cf3cChien-Yu Chen mLastStatus = REPEATING_REQUEST_ERROR; 223e8c535e833ed135895e99ca81aa3b85d80d7cf3cChien-Yu Chen mStatusesHit.push_back(mLastStatus); 224e8c535e833ed135895e99ca81aa3b85d80d7cf3cChien-Yu Chen mStatusCondition.broadcast(); 225e8c535e833ed135895e99ca81aa3b85d80d7cf3cChien-Yu Chen return binder::Status::ok(); 226e8c535e833ed135895e99ca81aa3b85d80d7cf3cChien-Yu Chen } 227e8c535e833ed135895e99ca81aa3b85d80d7cf3cChien-Yu Chen 2283450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk // Test helper functions: 2293450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk 2303450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk bool hadError() const { 2313450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk Mutex::Autolock l(mLock); 2323450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk return mError; 2333450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk } 2343450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk 2353450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk bool waitForStatus(Status status) const { 2363450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk Mutex::Autolock l(mLock); 2373450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk if (mLastStatus == status) { 2383450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk return true; 2393450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk } 2403450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk 2413450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk while (std::find(mStatusesHit.begin(), mStatusesHit.end(), status) 2423450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk == mStatusesHit.end()) { 2433450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk 2443450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk if (mStatusCondition.waitRelative(mLock, IDLE_TIMEOUT) != OK) { 2453450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk mStatusesHit.clear(); 2463450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk return false; 2473450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk } 2483450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk } 2493450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk mStatusesHit.clear(); 2503450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk 2513450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk return true; 2523450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk 2533450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk } 2543450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk 2553450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk void clearStatus() const { 2563450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk Mutex::Autolock l(mLock); 2573450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk mStatusesHit.clear(); 2583450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk } 2593450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk 2603450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk bool waitForIdle() const { 2613450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk return waitForStatus(IDLE); 2623450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk } 2633450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk 2643450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk}; 2653450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk 2660dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yehnamespace { 2670dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh Mutex gLock; 2680dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh class DeathNotifier : public IBinder::DeathRecipient 2690dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh { 2700dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh public: 2710dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh DeathNotifier() {} 2720dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh 2730dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh virtual void binderDied(const wp<IBinder>& /*who*/) { 2740dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh ALOGV("binderDied"); 2750dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh Mutex::Autolock _l(gLock); 2760dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh ALOGW("Camera service died!"); 2770dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh } 2780dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh }; 2790dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh sp<DeathNotifier> gDeathNotifier; 2800dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh}; // anonymous namespace 2810dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh 2823450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk// Exercise basic binder calls for the camera service 2833450ba7879be6522ea46a56c5e66e5382f5dd5baRuben BrunkTEST(CameraServiceBinderTest, CheckBinderCameraService) { 2843450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk ProcessState::self()->startThreadPool(); 2853450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk sp<IServiceManager> sm = defaultServiceManager(); 2863450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk sp<IBinder> binder = sm->getService(String16("media.camera")); 2873450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk ASSERT_NOT_NULL(binder); 2880dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh if (gDeathNotifier == NULL) { 2890dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh gDeathNotifier = new DeathNotifier(); 2900dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh } 2910dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh binder->linkToDeath(gDeathNotifier); 292d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala sp<hardware::ICameraService> service = 293d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala interface_cast<hardware::ICameraService>(binder); 2943450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk 295d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala binder::Status res; 2963450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk 297d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala int32_t numCameras = 0; 298d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala res = service->getNumberOfCameras(hardware::ICameraService::CAMERA_TYPE_ALL, &numCameras); 299d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala EXPECT_TRUE(res.isOk()) << res; 3003450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk EXPECT_LE(0, numCameras); 3013450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk 3023450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk // Check listener binder calls 3033450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk sp<TestCameraServiceListener> listener(new TestCameraServiceListener()); 304d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala res = service->addListener(listener); 305d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala EXPECT_TRUE(res.isOk()) << res; 3063450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk 3073450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk EXPECT_TRUE(listener->waitForNumCameras(numCameras)); 3083450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk 3093450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk for (int32_t i = 0; i < numCameras; i++) { 310d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala bool isSupported = false; 311d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala res = service->supportsCameraApi(i, 312d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala hardware::ICameraService::API_VERSION_2, &isSupported); 313d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala EXPECT_TRUE(res.isOk()) << res; 314d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala 3153450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk // We only care about binder calls for the Camera2 API. Camera1 is deprecated. 316d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala if (!isSupported) { 3173450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk continue; 3183450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk } 3193450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk 3203450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk // Check metadata binder call 3213450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk CameraMetadata metadata; 322d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala res = service->getCameraCharacteristics(i, &metadata); 323d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala EXPECT_TRUE(res.isOk()) << res; 3243450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk EXPECT_FALSE(metadata.isEmpty()); 3253450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk 3263450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk // Make sure we're available, or skip device tests otherwise 327d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala int32_t s = listener->getStatus(i); 328d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala EXPECT_EQ(::android::hardware::ICameraServiceListener::STATUS_PRESENT, s); 329d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala if (s != ::android::hardware::ICameraServiceListener::STATUS_PRESENT) { 3303450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk continue; 3313450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk } 3323450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk 3333450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk // Check connect binder calls 3343450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk sp<TestCameraDeviceCallbacks> callbacks(new TestCameraDeviceCallbacks()); 335d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala sp<hardware::camera2::ICameraDeviceUser> device; 336d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala res = service->connectDevice(callbacks, i, String16("meeeeeeeee!"), 337d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala hardware::ICameraService::USE_CALLING_UID, /*out*/&device); 338d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala EXPECT_TRUE(res.isOk()) << res; 3393450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk ASSERT_NE(nullptr, device.get()); 3403450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk device->disconnect(); 3413450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk EXPECT_FALSE(callbacks->hadError()); 3423450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk 343d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala int32_t torchStatus = listener->getTorchStatus(i); 344d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala if (torchStatus == hardware::ICameraServiceListener::TORCH_STATUS_AVAILABLE_OFF) { 3453450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk // Check torch calls 346d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala res = service->setTorchMode(String16(String8::format("%d", i)), 347d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala /*enabled*/true, callbacks); 348d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala EXPECT_TRUE(res.isOk()) << res; 3493450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk EXPECT_TRUE(listener->waitForTorchState( 350d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala hardware::ICameraServiceListener::TORCH_STATUS_AVAILABLE_ON, i)); 351d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala res = service->setTorchMode(String16(String8::format("%d", i)), 352d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala /*enabled*/false, callbacks); 353d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala EXPECT_TRUE(res.isOk()) << res; 3543450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk EXPECT_TRUE(listener->waitForTorchState( 355d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala hardware::ICameraServiceListener::TORCH_STATUS_AVAILABLE_OFF, i)); 3563450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk } 3573450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk } 3583450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk 359d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala res = service->removeListener(listener); 360d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala EXPECT_TRUE(res.isOk()) << res; 3613450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk} 3623450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk 3633450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk// Test fixture for client focused binder tests 3643450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunkclass CameraClientBinderTest : public testing::Test { 3653450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunkprotected: 366d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala sp<hardware::ICameraService> service; 3673450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk int32_t numCameras; 368d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala std::vector<std::pair<sp<TestCameraDeviceCallbacks>, sp<hardware::camera2::ICameraDeviceUser>>> 369d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala openDeviceList; 3703450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk sp<TestCameraServiceListener> serviceListener; 3713450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk 372d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala std::pair<sp<TestCameraDeviceCallbacks>, sp<hardware::camera2::ICameraDeviceUser>> 373d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala openNewDevice(int deviceId) { 3743450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk sp<TestCameraDeviceCallbacks> callbacks(new TestCameraDeviceCallbacks()); 375d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala sp<hardware::camera2::ICameraDeviceUser> device; 3763450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk { 3773450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk SCOPED_TRACE("openNewDevice"); 378d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala binder::Status res = service->connectDevice(callbacks, deviceId, String16("meeeeeeeee!"), 379d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala hardware::ICameraService::USE_CALLING_UID, /*out*/&device); 380d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala EXPECT_TRUE(res.isOk()) << res; 3813450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk } 3823450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk auto p = std::make_pair(callbacks, device); 3833450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk openDeviceList.push_back(p); 3843450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk return p; 3853450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk } 3863450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk 387d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala void closeDevice(std::pair<sp<TestCameraDeviceCallbacks>, 388d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala sp<hardware::camera2::ICameraDeviceUser>>& p) { 3893450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk if (p.second.get() != nullptr) { 390d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala binder::Status res = p.second->disconnect(); 391d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala EXPECT_TRUE(res.isOk()) << res; 3923450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk { 3933450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk SCOPED_TRACE("closeDevice"); 3943450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk EXPECT_FALSE(p.first->hadError()); 3953450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk } 3963450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk } 3973450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk auto iter = std::find(openDeviceList.begin(), openDeviceList.end(), p); 3983450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk if (iter != openDeviceList.end()) { 3993450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk openDeviceList.erase(iter); 4003450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk } 4013450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk } 4023450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk 4033450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk virtual void SetUp() { 4043450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk ProcessState::self()->startThreadPool(); 4053450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk sp<IServiceManager> sm = defaultServiceManager(); 4063450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk sp<IBinder> binder = sm->getService(String16("media.camera")); 407d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala service = interface_cast<hardware::ICameraService>(binder); 4083450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk serviceListener = new TestCameraServiceListener(); 4093450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk service->addListener(serviceListener); 410d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala service->getNumberOfCameras(hardware::ICameraService::CAMERA_TYPE_BACKWARD_COMPATIBLE, 411d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala &numCameras); 4123450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk } 4133450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk 4143450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk virtual void TearDown() { 4153450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk service = nullptr; 4163450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk numCameras = 0; 4173450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk for (auto& p : openDeviceList) { 4183450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk closeDevice(p); 4193450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk } 4203450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk } 4213450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk 4223450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk}; 4233450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk 4243450ba7879be6522ea46a56c5e66e5382f5dd5baRuben BrunkTEST_F(CameraClientBinderTest, CheckBinderCameraDeviceUser) { 4253450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk ASSERT_NOT_NULL(service); 4263450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk EXPECT_TRUE(serviceListener->waitForNumCameras(numCameras)); 4273450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk for (int32_t i = 0; i < numCameras; i++) { 4283450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk // Make sure we're available, or skip device tests otherwise 429d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala int32_t s = serviceListener->getStatus(i); 430d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala EXPECT_EQ(hardware::ICameraServiceListener::STATUS_PRESENT, s); 431d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala if (s != hardware::ICameraServiceListener::STATUS_PRESENT) { 4323450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk continue; 4333450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk } 434d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala binder::Status res; 4353450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk 4363450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk auto p = openNewDevice(i); 4373450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk sp<TestCameraDeviceCallbacks> callbacks = p.first; 438d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala sp<hardware::camera2::ICameraDeviceUser> device = p.second; 4393450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk 4403450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk // Setup a buffer queue; I'm just using the vendor opaque format here as that is 4413450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk // guaranteed to be present 4423450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk sp<IGraphicBufferProducer> gbProducer; 4433450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk sp<IGraphicBufferConsumer> gbConsumer; 4443450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk BufferQueue::createBufferQueue(&gbProducer, &gbConsumer); 4453450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk sp<BufferItemConsumer> opaqueConsumer = new BufferItemConsumer(gbConsumer, 4463450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk GRALLOC_USAGE_SW_READ_NEVER, /*maxImages*/2, /*controlledByApp*/true); 4473450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk EXPECT_TRUE(opaqueConsumer.get() != nullptr); 4483450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk opaqueConsumer->setName(String8("nom nom nom")); 4493450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk 4503450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk // Set to VGA dimens for default, as that is guaranteed to be present 4513450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk EXPECT_EQ(OK, gbConsumer->setDefaultBufferSize(640, 480)); 4523450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk EXPECT_EQ(OK, gbConsumer->setDefaultBufferFormat(HAL_PIXEL_FORMAT_IMPLEMENTATION_DEFINED)); 4533450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk 4543450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk sp<Surface> surface(new Surface(gbProducer, /*controlledByApp*/false)); 4553450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk 4563450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk OutputConfiguration output(gbProducer, /*rotation*/0); 4573450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk 4583450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk // Can we configure? 459d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala res = device->beginConfigure(); 460d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala EXPECT_TRUE(res.isOk()) << res; 461d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala status_t streamId; 462d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala res = device->createStream(output, &streamId); 463d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala EXPECT_TRUE(res.isOk()) << res; 4643450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk EXPECT_LE(0, streamId); 465d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala res = device->endConfigure(/*isConstrainedHighSpeed*/ false); 466d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala EXPECT_TRUE(res.isOk()) << res; 4673450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk EXPECT_FALSE(callbacks->hadError()); 4683450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk 4693450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk // Can we make requests? 4703450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk CameraMetadata requestTemplate; 471d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala res = device->createDefaultRequest(/*preview template*/1, 472d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala /*out*/&requestTemplate); 473d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala EXPECT_TRUE(res.isOk()) << res; 474d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala 475d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala hardware::camera2::CaptureRequest request; 476d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala request.mMetadata = requestTemplate; 477d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala request.mSurfaceList.add(surface); 478d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala request.mIsReprocess = false; 4793450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk int64_t lastFrameNumber = 0; 4803450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk int64_t lastFrameNumberPrev = 0; 4813450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk callbacks->clearStatus(); 482d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala 483d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala hardware::camera2::utils::SubmitInfo info; 484d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala res = device->submitRequest(request, /*streaming*/true, /*out*/&info); 485d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala EXPECT_TRUE(res.isOk()) << res; 4863450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk EXPECT_TRUE(callbacks->waitForStatus(TestCameraDeviceCallbacks::SENT_RESULT)); 487d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala EXPECT_LE(0, info.mRequestId); 4883450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk 4893450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk // Can we stop requests? 490d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala res = device->cancelRequest(info.mRequestId, /*out*/&lastFrameNumber); 491d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala EXPECT_TRUE(res.isOk()) << res; 4923450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk EXPECT_TRUE(callbacks->waitForIdle()); 4933450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk EXPECT_FALSE(callbacks->hadError()); 4943450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk 4953450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk // Can we do it again? 496d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala lastFrameNumberPrev = info.mLastFrameNumber; 4973450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk lastFrameNumber = 0; 4983450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk requestTemplate.clear(); 499d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala res = device->createDefaultRequest(hardware::camera2::ICameraDeviceUser::TEMPLATE_PREVIEW, 500d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala /*out*/&requestTemplate); 501d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala EXPECT_TRUE(res.isOk()) << res; 502d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala hardware::camera2::CaptureRequest request2; 503d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala request2.mMetadata = requestTemplate; 504d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala request2.mSurfaceList.add(surface); 505d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala request2.mIsReprocess = false; 5063450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk callbacks->clearStatus(); 507d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala hardware::camera2::utils::SubmitInfo info2; 508d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala res = device->submitRequest(request2, /*streaming*/true, 509d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala /*out*/&info2); 510d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala EXPECT_TRUE(res.isOk()) << res; 511d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala EXPECT_EQ(hardware::camera2::ICameraDeviceUser::NO_IN_FLIGHT_REPEATING_FRAMES, 512d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala info2.mLastFrameNumber); 5133450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk lastFrameNumber = 0; 5143450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk EXPECT_TRUE(callbacks->waitForStatus(TestCameraDeviceCallbacks::SENT_RESULT)); 515d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala EXPECT_LE(0, info2.mRequestId); 516d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala res = device->cancelRequest(info2.mRequestId, /*out*/&lastFrameNumber); 517d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala EXPECT_TRUE(res.isOk()) << res; 5183450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk EXPECT_TRUE(callbacks->waitForIdle()); 5193450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk EXPECT_LE(lastFrameNumberPrev, lastFrameNumber); 5203450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk sleep(/*second*/1); // allow some time for errors to show up, if any 5213450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk EXPECT_FALSE(callbacks->hadError()); 5223450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk 5233450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk // Can we do it with a request list? 5243450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk lastFrameNumberPrev = lastFrameNumber; 5253450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk lastFrameNumber = 0; 5263450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk requestTemplate.clear(); 5273450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk CameraMetadata requestTemplate2; 528d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala res = device->createDefaultRequest(hardware::camera2::ICameraDeviceUser::TEMPLATE_PREVIEW, 529d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala /*out*/&requestTemplate); 530d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala EXPECT_TRUE(res.isOk()) << res; 531d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala res = device->createDefaultRequest(hardware::camera2::ICameraDeviceUser::TEMPLATE_PREVIEW, 532d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala /*out*/&requestTemplate2); 533d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala EXPECT_TRUE(res.isOk()) << res; 534d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala android::hardware::camera2::CaptureRequest request3; 535d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala android::hardware::camera2::CaptureRequest request4; 536d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala request3.mMetadata = requestTemplate; 537d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala request3.mSurfaceList.add(surface); 538d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala request3.mIsReprocess = false; 539d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala request4.mMetadata = requestTemplate2; 540d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala request4.mSurfaceList.add(surface); 541d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala request4.mIsReprocess = false; 542d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala std::vector<hardware::camera2::CaptureRequest> requestList; 5433450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk requestList.push_back(request3); 5443450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk requestList.push_back(request4); 5453450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk 5463450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk callbacks->clearStatus(); 547d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala hardware::camera2::utils::SubmitInfo info3; 548d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala res = device->submitRequestList(requestList, /*streaming*/false, 549d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala /*out*/&info3); 550d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala EXPECT_TRUE(res.isOk()) << res; 551d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala EXPECT_LE(0, info3.mRequestId); 5523450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk EXPECT_TRUE(callbacks->waitForStatus(TestCameraDeviceCallbacks::SENT_RESULT)); 5533450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk EXPECT_TRUE(callbacks->waitForIdle()); 554d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala EXPECT_LE(lastFrameNumberPrev, info3.mLastFrameNumber); 5553450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk sleep(/*second*/1); // allow some time for errors to show up, if any 5563450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk EXPECT_FALSE(callbacks->hadError()); 5573450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk 5583450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk // Can we unconfigure? 559d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala res = device->beginConfigure(); 560d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala EXPECT_TRUE(res.isOk()) << res; 561d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala res = device->deleteStream(streamId); 562d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala EXPECT_TRUE(res.isOk()) << res; 563d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala res = device->endConfigure(/*isConstrainedHighSpeed*/ false); 564d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala EXPECT_TRUE(res.isOk()) << res; 565d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala 5663450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk sleep(/*second*/1); // allow some time for errors to show up, if any 5673450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk EXPECT_FALSE(callbacks->hadError()); 5683450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk 5693450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk closeDevice(p); 5703450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk } 5713450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk 5723450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk}; 573