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; 68f51fca277eb5b86bd0b2e3fc90ecb2b63089de29Eino-Ville Talvala std::map<String16, 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 75f51fca277eb5b86bd0b2e3fc90ecb2b63089de29Eino-Ville Talvala virtual binder::Status onStatusChanged(int32_t status, const String16& 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 133f51fca277eb5b86bd0b2e3fc90ecb2b63089de29Eino-Ville Talvala int32_t getStatus(const String16& 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, 1549d06601e54848f076b7472a376c672215cd70c46Shuzhen Wang REQUEST_QUEUE_EMPTY, 1553450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk }; 1563450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk 1573450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunkprotected: 1583450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk bool mError; 159d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala int32_t mLastStatus; 160d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala mutable std::vector<int32_t> mStatusesHit; 1613450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk mutable Mutex mLock; 1623450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk mutable Condition mStatusCondition; 1633450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunkpublic: 1643450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk TestCameraDeviceCallbacks() : mError(false), mLastStatus(UNINITIALIZED) {} 1653450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk 1663450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk virtual ~TestCameraDeviceCallbacks() {} 1673450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk 168d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala virtual binder::Status onDeviceError(int errorCode, 1693450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk const CaptureResultExtras& resultExtras) { 170d309fb9c8a2c4564d88fffba19c4e3688e4b862bEino-Ville Talvala (void) resultExtras; 1713450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk ALOGE("%s: onDeviceError occurred with: %d", __FUNCTION__, static_cast<int>(errorCode)); 1723450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk Mutex::Autolock l(mLock); 1733450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk mError = true; 1743450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk mLastStatus = ERROR; 1753450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk mStatusesHit.push_back(mLastStatus); 1763450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk mStatusCondition.broadcast(); 177d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala return binder::Status::ok(); 1783450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk } 1793450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk 180d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala virtual binder::Status onDeviceIdle() { 1813450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk Mutex::Autolock l(mLock); 1823450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk mLastStatus = IDLE; 1833450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk mStatusesHit.push_back(mLastStatus); 1843450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk mStatusCondition.broadcast(); 185d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala return binder::Status::ok(); 1863450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk } 1873450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk 188d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala virtual binder::Status onCaptureStarted(const CaptureResultExtras& resultExtras, 1893450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk int64_t timestamp) { 190d309fb9c8a2c4564d88fffba19c4e3688e4b862bEino-Ville Talvala (void) resultExtras; 191d309fb9c8a2c4564d88fffba19c4e3688e4b862bEino-Ville Talvala (void) timestamp; 1923450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk Mutex::Autolock l(mLock); 1933450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk mLastStatus = RUNNING; 1943450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk mStatusesHit.push_back(mLastStatus); 1953450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk mStatusCondition.broadcast(); 196d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala return binder::Status::ok(); 1973450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk } 1983450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk 1993450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk 200d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala virtual binder::Status onResultReceived(const CameraMetadata& metadata, 2015c22c15ed8c593189ed9bb8fcbccace2ca63b82aShuzhen Wang const CaptureResultExtras& resultExtras, 2025c22c15ed8c593189ed9bb8fcbccace2ca63b82aShuzhen Wang const std::vector<PhysicalCaptureResultInfo>& physicalResultInfos) { 203d309fb9c8a2c4564d88fffba19c4e3688e4b862bEino-Ville Talvala (void) metadata; 204d309fb9c8a2c4564d88fffba19c4e3688e4b862bEino-Ville Talvala (void) resultExtras; 2055c22c15ed8c593189ed9bb8fcbccace2ca63b82aShuzhen Wang (void) physicalResultInfos; 2063450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk Mutex::Autolock l(mLock); 2073450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk mLastStatus = SENT_RESULT; 2083450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk mStatusesHit.push_back(mLastStatus); 2093450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk mStatusCondition.broadcast(); 210d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala return binder::Status::ok(); 2113450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk } 2123450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk 213d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala virtual binder::Status onPrepared(int streamId) { 214d309fb9c8a2c4564d88fffba19c4e3688e4b862bEino-Ville Talvala (void) streamId; 2153450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk Mutex::Autolock l(mLock); 2163450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk mLastStatus = PREPARED; 2173450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk mStatusesHit.push_back(mLastStatus); 2183450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk mStatusCondition.broadcast(); 219d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala return binder::Status::ok(); 2203450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk } 2213450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk 2228ca23dca1cd450b4d93e8da1c8bd6f6ee61e2f5fYin-Chia Yeh virtual binder::Status onRepeatingRequestError( 2238ca23dca1cd450b4d93e8da1c8bd6f6ee61e2f5fYin-Chia Yeh int64_t lastFrameNumber, int32_t stoppedSequenceId) { 224e8c535e833ed135895e99ca81aa3b85d80d7cf3cChien-Yu Chen (void) lastFrameNumber; 2258ca23dca1cd450b4d93e8da1c8bd6f6ee61e2f5fYin-Chia Yeh (void) stoppedSequenceId; 226e8c535e833ed135895e99ca81aa3b85d80d7cf3cChien-Yu Chen Mutex::Autolock l(mLock); 227e8c535e833ed135895e99ca81aa3b85d80d7cf3cChien-Yu Chen mLastStatus = REPEATING_REQUEST_ERROR; 228e8c535e833ed135895e99ca81aa3b85d80d7cf3cChien-Yu Chen mStatusesHit.push_back(mLastStatus); 229e8c535e833ed135895e99ca81aa3b85d80d7cf3cChien-Yu Chen mStatusCondition.broadcast(); 230e8c535e833ed135895e99ca81aa3b85d80d7cf3cChien-Yu Chen return binder::Status::ok(); 231e8c535e833ed135895e99ca81aa3b85d80d7cf3cChien-Yu Chen } 232e8c535e833ed135895e99ca81aa3b85d80d7cf3cChien-Yu Chen 2339d06601e54848f076b7472a376c672215cd70c46Shuzhen Wang virtual binder::Status onRequestQueueEmpty() { 2349d06601e54848f076b7472a376c672215cd70c46Shuzhen Wang Mutex::Autolock l(mLock); 2359d06601e54848f076b7472a376c672215cd70c46Shuzhen Wang mLastStatus = REQUEST_QUEUE_EMPTY; 2369d06601e54848f076b7472a376c672215cd70c46Shuzhen Wang mStatusesHit.push_back(mLastStatus); 2379d06601e54848f076b7472a376c672215cd70c46Shuzhen Wang mStatusCondition.broadcast(); 2389d06601e54848f076b7472a376c672215cd70c46Shuzhen Wang return binder::Status::ok(); 2399d06601e54848f076b7472a376c672215cd70c46Shuzhen Wang } 2409d06601e54848f076b7472a376c672215cd70c46Shuzhen Wang 2413450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk // Test helper functions: 2423450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk 2433450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk bool hadError() const { 2443450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk Mutex::Autolock l(mLock); 2453450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk return mError; 2463450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk } 2473450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk 2483450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk bool waitForStatus(Status status) const { 2493450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk Mutex::Autolock l(mLock); 2503450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk if (mLastStatus == status) { 2513450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk return true; 2523450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk } 2533450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk 2543450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk while (std::find(mStatusesHit.begin(), mStatusesHit.end(), status) 2553450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk == mStatusesHit.end()) { 2563450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk 2573450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk if (mStatusCondition.waitRelative(mLock, IDLE_TIMEOUT) != OK) { 2583450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk mStatusesHit.clear(); 2593450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk return false; 2603450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk } 2613450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk } 2623450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk mStatusesHit.clear(); 2633450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk 2643450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk return true; 2653450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk 2663450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk } 2673450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk 2683450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk void clearStatus() const { 2693450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk Mutex::Autolock l(mLock); 2703450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk mStatusesHit.clear(); 2713450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk } 2723450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk 2733450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk bool waitForIdle() const { 2743450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk return waitForStatus(IDLE); 2753450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk } 2763450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk 2773450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk}; 2783450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk 2790dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yehnamespace { 2800dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh Mutex gLock; 2810dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh class DeathNotifier : public IBinder::DeathRecipient 2820dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh { 2830dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh public: 2840dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh DeathNotifier() {} 2850dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh 2860dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh virtual void binderDied(const wp<IBinder>& /*who*/) { 2870dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh ALOGV("binderDied"); 2880dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh Mutex::Autolock _l(gLock); 2890dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh ALOGW("Camera service died!"); 2900dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh } 2910dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh }; 2920dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh sp<DeathNotifier> gDeathNotifier; 2930dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh}; // anonymous namespace 2940dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh 2953450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk// Exercise basic binder calls for the camera service 2963450ba7879be6522ea46a56c5e66e5382f5dd5baRuben BrunkTEST(CameraServiceBinderTest, CheckBinderCameraService) { 2973450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk ProcessState::self()->startThreadPool(); 2983450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk sp<IServiceManager> sm = defaultServiceManager(); 2993450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk sp<IBinder> binder = sm->getService(String16("media.camera")); 3003450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk ASSERT_NOT_NULL(binder); 3010dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh if (gDeathNotifier == NULL) { 3020dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh gDeathNotifier = new DeathNotifier(); 3030dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh } 3040dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh binder->linkToDeath(gDeathNotifier); 305d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala sp<hardware::ICameraService> service = 306d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala interface_cast<hardware::ICameraService>(binder); 3073450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk 308d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala binder::Status res; 3093450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk 310d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala int32_t numCameras = 0; 311d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala res = service->getNumberOfCameras(hardware::ICameraService::CAMERA_TYPE_ALL, &numCameras); 312d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala EXPECT_TRUE(res.isOk()) << res; 3133450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk EXPECT_LE(0, numCameras); 3143450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk 3153450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk // Check listener binder calls 3163450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk sp<TestCameraServiceListener> listener(new TestCameraServiceListener()); 317f51fca277eb5b86bd0b2e3fc90ecb2b63089de29Eino-Ville Talvala std::vector<hardware::CameraStatus> statuses; 318f51fca277eb5b86bd0b2e3fc90ecb2b63089de29Eino-Ville Talvala res = service->addListener(listener, &statuses); 319d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala EXPECT_TRUE(res.isOk()) << res; 3203450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk 321f51fca277eb5b86bd0b2e3fc90ecb2b63089de29Eino-Ville Talvala EXPECT_EQ(numCameras, static_cast<const int>(statuses.size())); 322aebbe41461c597cdcb4be35edb5484410b9b2dffEmilian Peev for (const auto &it : statuses) { 323aebbe41461c597cdcb4be35edb5484410b9b2dffEmilian Peev listener->onStatusChanged(it.status, String16(it.cameraId)); 324aebbe41461c597cdcb4be35edb5484410b9b2dffEmilian Peev } 3253450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk 3263450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk for (int32_t i = 0; i < numCameras; i++) { 327f51fca277eb5b86bd0b2e3fc90ecb2b63089de29Eino-Ville Talvala String16 cameraId = String16(String8::format("%d", i)); 328d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala bool isSupported = false; 329f51fca277eb5b86bd0b2e3fc90ecb2b63089de29Eino-Ville Talvala res = service->supportsCameraApi(cameraId, 330d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala hardware::ICameraService::API_VERSION_2, &isSupported); 331d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala EXPECT_TRUE(res.isOk()) << res; 332d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala 3333450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk // We only care about binder calls for the Camera2 API. Camera1 is deprecated. 334d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala if (!isSupported) { 3353450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk continue; 3363450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk } 3373450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk 3383450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk // Check metadata binder call 3393450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk CameraMetadata metadata; 340f51fca277eb5b86bd0b2e3fc90ecb2b63089de29Eino-Ville Talvala res = service->getCameraCharacteristics(cameraId, &metadata); 341d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala EXPECT_TRUE(res.isOk()) << res; 3423450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk EXPECT_FALSE(metadata.isEmpty()); 3433450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk 3443450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk // Make sure we're available, or skip device tests otherwise 345f51fca277eb5b86bd0b2e3fc90ecb2b63089de29Eino-Ville Talvala int32_t s = listener->getStatus(cameraId); 346d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala EXPECT_EQ(::android::hardware::ICameraServiceListener::STATUS_PRESENT, s); 347d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala if (s != ::android::hardware::ICameraServiceListener::STATUS_PRESENT) { 3483450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk continue; 3493450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk } 3503450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk 3513450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk // Check connect binder calls 3523450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk sp<TestCameraDeviceCallbacks> callbacks(new TestCameraDeviceCallbacks()); 353d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala sp<hardware::camera2::ICameraDeviceUser> device; 354f51fca277eb5b86bd0b2e3fc90ecb2b63089de29Eino-Ville Talvala res = service->connectDevice(callbacks, cameraId, String16("meeeeeeeee!"), 355d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala hardware::ICameraService::USE_CALLING_UID, /*out*/&device); 356d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala EXPECT_TRUE(res.isOk()) << res; 3573450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk ASSERT_NE(nullptr, device.get()); 3583450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk device->disconnect(); 3593450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk EXPECT_FALSE(callbacks->hadError()); 3603450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk 361d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala int32_t torchStatus = listener->getTorchStatus(i); 362d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala if (torchStatus == hardware::ICameraServiceListener::TORCH_STATUS_AVAILABLE_OFF) { 3633450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk // Check torch calls 364f51fca277eb5b86bd0b2e3fc90ecb2b63089de29Eino-Ville Talvala res = service->setTorchMode(cameraId, 365d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala /*enabled*/true, callbacks); 366d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala EXPECT_TRUE(res.isOk()) << res; 3673450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk EXPECT_TRUE(listener->waitForTorchState( 368d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala hardware::ICameraServiceListener::TORCH_STATUS_AVAILABLE_ON, i)); 369f51fca277eb5b86bd0b2e3fc90ecb2b63089de29Eino-Ville Talvala res = service->setTorchMode(cameraId, 370d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala /*enabled*/false, callbacks); 371d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala EXPECT_TRUE(res.isOk()) << res; 3723450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk EXPECT_TRUE(listener->waitForTorchState( 373d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala hardware::ICameraServiceListener::TORCH_STATUS_AVAILABLE_OFF, i)); 3743450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk } 3753450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk } 3763450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk 377d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala res = service->removeListener(listener); 378d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala EXPECT_TRUE(res.isOk()) << res; 3793450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk} 3803450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk 3813450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk// Test fixture for client focused binder tests 3823450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunkclass CameraClientBinderTest : public testing::Test { 3833450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunkprotected: 384d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala sp<hardware::ICameraService> service; 3853450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk int32_t numCameras; 386d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala std::vector<std::pair<sp<TestCameraDeviceCallbacks>, sp<hardware::camera2::ICameraDeviceUser>>> 387d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala openDeviceList; 3883450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk sp<TestCameraServiceListener> serviceListener; 3893450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk 390d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala std::pair<sp<TestCameraDeviceCallbacks>, sp<hardware::camera2::ICameraDeviceUser>> 391f51fca277eb5b86bd0b2e3fc90ecb2b63089de29Eino-Ville Talvala openNewDevice(const String16& deviceId) { 3923450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk sp<TestCameraDeviceCallbacks> callbacks(new TestCameraDeviceCallbacks()); 393d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala sp<hardware::camera2::ICameraDeviceUser> device; 3943450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk { 3953450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk SCOPED_TRACE("openNewDevice"); 396d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala binder::Status res = service->connectDevice(callbacks, deviceId, String16("meeeeeeeee!"), 397d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala hardware::ICameraService::USE_CALLING_UID, /*out*/&device); 398d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala EXPECT_TRUE(res.isOk()) << res; 3993450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk } 4003450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk auto p = std::make_pair(callbacks, device); 4013450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk openDeviceList.push_back(p); 4023450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk return p; 4033450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk } 4043450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk 405d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala void closeDevice(std::pair<sp<TestCameraDeviceCallbacks>, 406d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala sp<hardware::camera2::ICameraDeviceUser>>& p) { 4073450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk if (p.second.get() != nullptr) { 408d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala binder::Status res = p.second->disconnect(); 409d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala EXPECT_TRUE(res.isOk()) << res; 4103450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk { 4113450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk SCOPED_TRACE("closeDevice"); 4123450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk EXPECT_FALSE(p.first->hadError()); 4133450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk } 4143450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk } 4153450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk auto iter = std::find(openDeviceList.begin(), openDeviceList.end(), p); 4163450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk if (iter != openDeviceList.end()) { 4173450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk openDeviceList.erase(iter); 4183450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk } 4193450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk } 4203450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk 4213450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk virtual void SetUp() { 4223450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk ProcessState::self()->startThreadPool(); 4233450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk sp<IServiceManager> sm = defaultServiceManager(); 4243450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk sp<IBinder> binder = sm->getService(String16("media.camera")); 425d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala service = interface_cast<hardware::ICameraService>(binder); 4263450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk serviceListener = new TestCameraServiceListener(); 427f51fca277eb5b86bd0b2e3fc90ecb2b63089de29Eino-Ville Talvala std::vector<hardware::CameraStatus> statuses; 428f51fca277eb5b86bd0b2e3fc90ecb2b63089de29Eino-Ville Talvala service->addListener(serviceListener, &statuses); 429aebbe41461c597cdcb4be35edb5484410b9b2dffEmilian Peev for (const auto &it : statuses) { 430aebbe41461c597cdcb4be35edb5484410b9b2dffEmilian Peev serviceListener->onStatusChanged(it.status, String16(it.cameraId)); 431aebbe41461c597cdcb4be35edb5484410b9b2dffEmilian Peev } 432d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala service->getNumberOfCameras(hardware::ICameraService::CAMERA_TYPE_BACKWARD_COMPATIBLE, 433d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala &numCameras); 4343450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk } 4353450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk 4363450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk virtual void TearDown() { 4373450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk service = nullptr; 4383450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk numCameras = 0; 4393450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk for (auto& p : openDeviceList) { 4403450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk closeDevice(p); 4413450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk } 4423450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk } 4433450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk 4443450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk}; 4453450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk 4463450ba7879be6522ea46a56c5e66e5382f5dd5baRuben BrunkTEST_F(CameraClientBinderTest, CheckBinderCameraDeviceUser) { 4473450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk ASSERT_NOT_NULL(service); 4483450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk EXPECT_TRUE(serviceListener->waitForNumCameras(numCameras)); 4493450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk for (int32_t i = 0; i < numCameras; i++) { 450aebbe41461c597cdcb4be35edb5484410b9b2dffEmilian Peev String8 cameraId8 = String8::format("%d", i); 4513450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk // Make sure we're available, or skip device tests otherwise 452aebbe41461c597cdcb4be35edb5484410b9b2dffEmilian Peev String16 cameraId(cameraId8); 453f51fca277eb5b86bd0b2e3fc90ecb2b63089de29Eino-Ville Talvala int32_t s = serviceListener->getStatus(cameraId); 454d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala EXPECT_EQ(hardware::ICameraServiceListener::STATUS_PRESENT, s); 455d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala if (s != hardware::ICameraServiceListener::STATUS_PRESENT) { 4563450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk continue; 4573450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk } 458d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala binder::Status res; 459f51fca277eb5b86bd0b2e3fc90ecb2b63089de29Eino-Ville Talvala auto p = openNewDevice(cameraId); 4603450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk sp<TestCameraDeviceCallbacks> callbacks = p.first; 461d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala sp<hardware::camera2::ICameraDeviceUser> device = p.second; 4623450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk 4633450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk // Setup a buffer queue; I'm just using the vendor opaque format here as that is 4643450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk // guaranteed to be present 4653450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk sp<IGraphicBufferProducer> gbProducer; 4663450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk sp<IGraphicBufferConsumer> gbConsumer; 4673450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk BufferQueue::createBufferQueue(&gbProducer, &gbConsumer); 4683450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk sp<BufferItemConsumer> opaqueConsumer = new BufferItemConsumer(gbConsumer, 4693450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk GRALLOC_USAGE_SW_READ_NEVER, /*maxImages*/2, /*controlledByApp*/true); 4703450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk EXPECT_TRUE(opaqueConsumer.get() != nullptr); 4713450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk opaqueConsumer->setName(String8("nom nom nom")); 4723450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk 4733450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk // Set to VGA dimens for default, as that is guaranteed to be present 4743450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk EXPECT_EQ(OK, gbConsumer->setDefaultBufferSize(640, 480)); 4753450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk EXPECT_EQ(OK, gbConsumer->setDefaultBufferFormat(HAL_PIXEL_FORMAT_IMPLEMENTATION_DEFINED)); 4763450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk 4773450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk sp<Surface> surface(new Surface(gbProducer, /*controlledByApp*/false)); 4783450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk 4793450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk OutputConfiguration output(gbProducer, /*rotation*/0); 4803450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk 4813450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk // Can we configure? 482d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala res = device->beginConfigure(); 483d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala EXPECT_TRUE(res.isOk()) << res; 484d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala status_t streamId; 485d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala res = device->createStream(output, &streamId); 486d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala EXPECT_TRUE(res.isOk()) << res; 4873450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk EXPECT_LE(0, streamId); 4885fbe0ba24d88910e68610add74fd1e1b94d282b5Emilian Peev CameraMetadata sessionParams; 4895fbe0ba24d88910e68610add74fd1e1b94d282b5Emilian Peev res = device->endConfigure(/*isConstrainedHighSpeed*/ false, sessionParams); 490d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala EXPECT_TRUE(res.isOk()) << res; 4913450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk EXPECT_FALSE(callbacks->hadError()); 4923450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk 4933450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk // Can we make requests? 4943450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk CameraMetadata requestTemplate; 495d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala res = device->createDefaultRequest(/*preview template*/1, 496d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala /*out*/&requestTemplate); 497d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala EXPECT_TRUE(res.isOk()) << res; 498d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala 499d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala hardware::camera2::CaptureRequest request; 500aebbe41461c597cdcb4be35edb5484410b9b2dffEmilian Peev request.mPhysicalCameraSettings.push_back({cameraId8.string(), requestTemplate}); 501d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala request.mSurfaceList.add(surface); 502d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala request.mIsReprocess = false; 5033450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk int64_t lastFrameNumber = 0; 5043450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk int64_t lastFrameNumberPrev = 0; 5053450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk callbacks->clearStatus(); 506d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala 507d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala hardware::camera2::utils::SubmitInfo info; 508d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala res = device->submitRequest(request, /*streaming*/true, /*out*/&info); 509d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala EXPECT_TRUE(res.isOk()) << res; 5103450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk EXPECT_TRUE(callbacks->waitForStatus(TestCameraDeviceCallbacks::SENT_RESULT)); 511d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala EXPECT_LE(0, info.mRequestId); 5123450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk 5133450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk // Can we stop requests? 514d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala res = device->cancelRequest(info.mRequestId, /*out*/&lastFrameNumber); 515d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala EXPECT_TRUE(res.isOk()) << res; 5163450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk EXPECT_TRUE(callbacks->waitForIdle()); 5173450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk EXPECT_FALSE(callbacks->hadError()); 5183450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk 5193450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk // Can we do it again? 520d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala lastFrameNumberPrev = info.mLastFrameNumber; 5213450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk lastFrameNumber = 0; 5223450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk requestTemplate.clear(); 523d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala res = device->createDefaultRequest(hardware::camera2::ICameraDeviceUser::TEMPLATE_PREVIEW, 524d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala /*out*/&requestTemplate); 525d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala EXPECT_TRUE(res.isOk()) << res; 526d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala hardware::camera2::CaptureRequest request2; 527aebbe41461c597cdcb4be35edb5484410b9b2dffEmilian Peev request2.mPhysicalCameraSettings.push_back({cameraId8.string(), requestTemplate}); 528d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala request2.mSurfaceList.add(surface); 529d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala request2.mIsReprocess = false; 5303450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk callbacks->clearStatus(); 531d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala hardware::camera2::utils::SubmitInfo info2; 532d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala res = device->submitRequest(request2, /*streaming*/true, 533d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala /*out*/&info2); 534d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala EXPECT_TRUE(res.isOk()) << res; 535d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala EXPECT_EQ(hardware::camera2::ICameraDeviceUser::NO_IN_FLIGHT_REPEATING_FRAMES, 536d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala info2.mLastFrameNumber); 5373450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk lastFrameNumber = 0; 5383450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk EXPECT_TRUE(callbacks->waitForStatus(TestCameraDeviceCallbacks::SENT_RESULT)); 539d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala EXPECT_LE(0, info2.mRequestId); 540d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala res = device->cancelRequest(info2.mRequestId, /*out*/&lastFrameNumber); 541d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala EXPECT_TRUE(res.isOk()) << res; 5423450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk EXPECT_TRUE(callbacks->waitForIdle()); 5433450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk EXPECT_LE(lastFrameNumberPrev, lastFrameNumber); 5443450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk sleep(/*second*/1); // allow some time for errors to show up, if any 5453450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk EXPECT_FALSE(callbacks->hadError()); 5463450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk 5473450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk // Can we do it with a request list? 5483450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk lastFrameNumberPrev = lastFrameNumber; 5493450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk lastFrameNumber = 0; 5503450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk requestTemplate.clear(); 5513450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk CameraMetadata requestTemplate2; 552d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala res = device->createDefaultRequest(hardware::camera2::ICameraDeviceUser::TEMPLATE_PREVIEW, 553d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala /*out*/&requestTemplate); 554d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala EXPECT_TRUE(res.isOk()) << res; 555d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala res = device->createDefaultRequest(hardware::camera2::ICameraDeviceUser::TEMPLATE_PREVIEW, 556d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala /*out*/&requestTemplate2); 557d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala EXPECT_TRUE(res.isOk()) << res; 558d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala android::hardware::camera2::CaptureRequest request3; 559d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala android::hardware::camera2::CaptureRequest request4; 560aebbe41461c597cdcb4be35edb5484410b9b2dffEmilian Peev request3.mPhysicalCameraSettings.push_back({cameraId8.string(), requestTemplate}); 561d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala request3.mSurfaceList.add(surface); 562d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala request3.mIsReprocess = false; 563aebbe41461c597cdcb4be35edb5484410b9b2dffEmilian Peev request4.mPhysicalCameraSettings.push_back({cameraId8.string(), requestTemplate2}); 564d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala request4.mSurfaceList.add(surface); 565d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala request4.mIsReprocess = false; 566d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala std::vector<hardware::camera2::CaptureRequest> requestList; 5673450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk requestList.push_back(request3); 5683450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk requestList.push_back(request4); 5693450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk 5703450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk callbacks->clearStatus(); 571d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala hardware::camera2::utils::SubmitInfo info3; 572d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala res = device->submitRequestList(requestList, /*streaming*/false, 573d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala /*out*/&info3); 574d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala EXPECT_TRUE(res.isOk()) << res; 575d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala EXPECT_LE(0, info3.mRequestId); 5763450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk EXPECT_TRUE(callbacks->waitForStatus(TestCameraDeviceCallbacks::SENT_RESULT)); 5773450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk EXPECT_TRUE(callbacks->waitForIdle()); 578d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala EXPECT_LE(lastFrameNumberPrev, info3.mLastFrameNumber); 5793450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk sleep(/*second*/1); // allow some time for errors to show up, if any 5803450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk EXPECT_FALSE(callbacks->hadError()); 5813450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk 5823450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk // Can we unconfigure? 583d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala res = device->beginConfigure(); 584d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala EXPECT_TRUE(res.isOk()) << res; 585d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala res = device->deleteStream(streamId); 586d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala EXPECT_TRUE(res.isOk()) << res; 5875fbe0ba24d88910e68610add74fd1e1b94d282b5Emilian Peev res = device->endConfigure(/*isConstrainedHighSpeed*/ false, sessionParams); 588d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala EXPECT_TRUE(res.isOk()) << res; 589d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala 5903450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk sleep(/*second*/1); // allow some time for errors to show up, if any 5913450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk EXPECT_FALSE(callbacks->hadError()); 5923450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk 5933450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk closeDevice(p); 5943450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk } 5953450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk 5963450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk}; 597aebbe41461c597cdcb4be35edb5484410b9b2dffEmilian Peev 598aebbe41461c597cdcb4be35edb5484410b9b2dffEmilian PeevTEST_F(CameraClientBinderTest, CheckBinderCaptureRequest) { 599aebbe41461c597cdcb4be35edb5484410b9b2dffEmilian Peev sp<CaptureRequest> requestOriginal, requestParceled; 600aebbe41461c597cdcb4be35edb5484410b9b2dffEmilian Peev sp<IGraphicBufferProducer> gbProducer; 601aebbe41461c597cdcb4be35edb5484410b9b2dffEmilian Peev sp<IGraphicBufferConsumer> gbConsumer; 602aebbe41461c597cdcb4be35edb5484410b9b2dffEmilian Peev BufferQueue::createBufferQueue(&gbProducer, &gbConsumer); 603aebbe41461c597cdcb4be35edb5484410b9b2dffEmilian Peev sp<Surface> surface(new Surface(gbProducer, /*controlledByApp*/false)); 604aebbe41461c597cdcb4be35edb5484410b9b2dffEmilian Peev Vector<sp<Surface>> surfaceList; 605aebbe41461c597cdcb4be35edb5484410b9b2dffEmilian Peev surfaceList.push_back(surface); 606aebbe41461c597cdcb4be35edb5484410b9b2dffEmilian Peev std::string physicalDeviceId1 = "0"; 607aebbe41461c597cdcb4be35edb5484410b9b2dffEmilian Peev std::string physicalDeviceId2 = "1"; 608aebbe41461c597cdcb4be35edb5484410b9b2dffEmilian Peev CameraMetadata physicalDeviceSettings1, physicalDeviceSettings2; 609aebbe41461c597cdcb4be35edb5484410b9b2dffEmilian Peev uint8_t intent1 = ANDROID_CONTROL_CAPTURE_INTENT_PREVIEW; 610aebbe41461c597cdcb4be35edb5484410b9b2dffEmilian Peev uint8_t intent2 = ANDROID_CONTROL_CAPTURE_INTENT_VIDEO_RECORD; 611aebbe41461c597cdcb4be35edb5484410b9b2dffEmilian Peev EXPECT_EQ(OK, physicalDeviceSettings1.update(ANDROID_CONTROL_CAPTURE_INTENT, &intent1, 1)); 612aebbe41461c597cdcb4be35edb5484410b9b2dffEmilian Peev EXPECT_EQ(OK, physicalDeviceSettings2.update(ANDROID_CONTROL_CAPTURE_INTENT, &intent2, 1)); 613aebbe41461c597cdcb4be35edb5484410b9b2dffEmilian Peev 614aebbe41461c597cdcb4be35edb5484410b9b2dffEmilian Peev requestParceled = new CaptureRequest(); 615aebbe41461c597cdcb4be35edb5484410b9b2dffEmilian Peev Parcel p; 616aebbe41461c597cdcb4be35edb5484410b9b2dffEmilian Peev EXPECT_TRUE(requestParceled->readFromParcel(&p) != OK); 617aebbe41461c597cdcb4be35edb5484410b9b2dffEmilian Peev p.writeInt32(0); 618aebbe41461c597cdcb4be35edb5484410b9b2dffEmilian Peev p.setDataPosition(0); 619aebbe41461c597cdcb4be35edb5484410b9b2dffEmilian Peev EXPECT_TRUE(requestParceled->readFromParcel(&p) != OK); 620aebbe41461c597cdcb4be35edb5484410b9b2dffEmilian Peev p.freeData(); 621aebbe41461c597cdcb4be35edb5484410b9b2dffEmilian Peev p.writeInt32(-1); 622aebbe41461c597cdcb4be35edb5484410b9b2dffEmilian Peev p.setDataPosition(0); 623aebbe41461c597cdcb4be35edb5484410b9b2dffEmilian Peev EXPECT_TRUE(requestParceled->readFromParcel(&p) != OK); 624aebbe41461c597cdcb4be35edb5484410b9b2dffEmilian Peev p.freeData(); 625aebbe41461c597cdcb4be35edb5484410b9b2dffEmilian Peev p.writeInt32(1); 626aebbe41461c597cdcb4be35edb5484410b9b2dffEmilian Peev p.setDataPosition(0); 627aebbe41461c597cdcb4be35edb5484410b9b2dffEmilian Peev EXPECT_TRUE(requestParceled->readFromParcel(&p) != OK); 628aebbe41461c597cdcb4be35edb5484410b9b2dffEmilian Peev 629aebbe41461c597cdcb4be35edb5484410b9b2dffEmilian Peev requestOriginal = new CaptureRequest(); 630aebbe41461c597cdcb4be35edb5484410b9b2dffEmilian Peev requestOriginal->mPhysicalCameraSettings.push_back({physicalDeviceId1, 631aebbe41461c597cdcb4be35edb5484410b9b2dffEmilian Peev physicalDeviceSettings1}); 632aebbe41461c597cdcb4be35edb5484410b9b2dffEmilian Peev requestOriginal->mPhysicalCameraSettings.push_back({physicalDeviceId2, 633aebbe41461c597cdcb4be35edb5484410b9b2dffEmilian Peev physicalDeviceSettings2}); 634aebbe41461c597cdcb4be35edb5484410b9b2dffEmilian Peev requestOriginal->mSurfaceList.push_back(surface); 635aebbe41461c597cdcb4be35edb5484410b9b2dffEmilian Peev requestOriginal->mIsReprocess = false; 636aebbe41461c597cdcb4be35edb5484410b9b2dffEmilian Peev requestOriginal->mSurfaceConverted = false; 637aebbe41461c597cdcb4be35edb5484410b9b2dffEmilian Peev 638aebbe41461c597cdcb4be35edb5484410b9b2dffEmilian Peev p.freeData(); 639aebbe41461c597cdcb4be35edb5484410b9b2dffEmilian Peev EXPECT_TRUE(requestOriginal->writeToParcel(&p) == OK); 640aebbe41461c597cdcb4be35edb5484410b9b2dffEmilian Peev p.setDataPosition(0); 641aebbe41461c597cdcb4be35edb5484410b9b2dffEmilian Peev EXPECT_TRUE(requestParceled->readFromParcel(&p) == OK); 642aebbe41461c597cdcb4be35edb5484410b9b2dffEmilian Peev EXPECT_EQ(requestParceled->mIsReprocess, false); 643aebbe41461c597cdcb4be35edb5484410b9b2dffEmilian Peev EXPECT_FALSE(requestParceled->mSurfaceList.empty()); 644aebbe41461c597cdcb4be35edb5484410b9b2dffEmilian Peev EXPECT_EQ(2u, requestParceled->mPhysicalCameraSettings.size()); 645aebbe41461c597cdcb4be35edb5484410b9b2dffEmilian Peev auto it = requestParceled->mPhysicalCameraSettings.begin(); 646aebbe41461c597cdcb4be35edb5484410b9b2dffEmilian Peev EXPECT_EQ(physicalDeviceId1, it->id); 647aebbe41461c597cdcb4be35edb5484410b9b2dffEmilian Peev EXPECT_TRUE(it->settings.exists(ANDROID_CONTROL_CAPTURE_INTENT)); 648aebbe41461c597cdcb4be35edb5484410b9b2dffEmilian Peev auto entry = it->settings.find(ANDROID_CONTROL_CAPTURE_INTENT); 649aebbe41461c597cdcb4be35edb5484410b9b2dffEmilian Peev EXPECT_EQ(entry.data.u8[0], intent1); 650aebbe41461c597cdcb4be35edb5484410b9b2dffEmilian Peev it++; 651aebbe41461c597cdcb4be35edb5484410b9b2dffEmilian Peev EXPECT_EQ(physicalDeviceId2, it->id); 652aebbe41461c597cdcb4be35edb5484410b9b2dffEmilian Peev EXPECT_TRUE(it->settings.exists(ANDROID_CONTROL_CAPTURE_INTENT)); 653aebbe41461c597cdcb4be35edb5484410b9b2dffEmilian Peev entry = it->settings.find(ANDROID_CONTROL_CAPTURE_INTENT); 654aebbe41461c597cdcb4be35edb5484410b9b2dffEmilian Peev EXPECT_EQ(entry.data.u8[0], intent2); 655aebbe41461c597cdcb4be35edb5484410b9b2dffEmilian Peev}; 656