Home | History | Annotate | Download | only in tests
      1 /*
      2  * Copyright (C) 2015 The Android Open Source Project
      3  *
      4  * Licensed under the Apache License, Version 2.0 (the "License");
      5  * you may not use this file except in compliance with the License.
      6  * You may obtain a copy of the License at
      7  *
      8  *      http://www.apache.org/licenses/LICENSE-2.0
      9  *
     10  * Unless required by applicable law or agreed to in writing, software
     11  * distributed under the License is distributed on an "AS IS" BASIS,
     12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
     13  * See the License for the specific language governing permissions and
     14  * limitations under the License.
     15  */
     16 
     17 #define LOG_NDEBUG 0
     18 #define LOG_TAG "CameraBinderTests"
     19 
     20 #include <binder/IInterface.h>
     21 #include <binder/IServiceManager.h>
     22 #include <binder/Parcel.h>
     23 #include <binder/ProcessState.h>
     24 #include <utils/Errors.h>
     25 #include <utils/Log.h>
     26 #include <utils/List.h>
     27 #include <utils/String8.h>
     28 #include <utils/String16.h>
     29 #include <utils/Condition.h>
     30 #include <utils/Mutex.h>
     31 #include <system/graphics.h>
     32 #include <hardware/gralloc.h>
     33 
     34 #include <camera/CameraMetadata.h>
     35 #include <android/hardware/ICameraService.h>
     36 #include <android/hardware/ICameraServiceListener.h>
     37 #include <android/hardware/BnCameraServiceListener.h>
     38 #include <android/hardware/camera2/ICameraDeviceUser.h>
     39 #include <android/hardware/camera2/ICameraDeviceCallbacks.h>
     40 #include <android/hardware/camera2/BnCameraDeviceCallbacks.h>
     41 #include <camera/camera2/CaptureRequest.h>
     42 #include <camera/camera2/OutputConfiguration.h>
     43 #include <camera/camera2/SubmitInfo.h>
     44 
     45 #include <gui/BufferItemConsumer.h>
     46 #include <gui/IGraphicBufferProducer.h>
     47 #include <gui/Surface.h>
     48 
     49 #include <gtest/gtest.h>
     50 #include <unistd.h>
     51 #include <stdint.h>
     52 #include <utility>
     53 #include <vector>
     54 #include <map>
     55 #include <algorithm>
     56 
     57 using namespace android;
     58 
     59 #define ASSERT_NOT_NULL(x) \
     60     ASSERT_TRUE((x) != nullptr)
     61 
     62 #define SETUP_TIMEOUT 2000000000 // ns
     63 #define IDLE_TIMEOUT 2000000000 // ns
     64 
     65 // Stub listener implementation
     66 class TestCameraServiceListener : public hardware::BnCameraServiceListener {
     67     std::map<String16, int32_t> mCameraTorchStatuses;
     68     std::map<String16, int32_t> mCameraStatuses;
     69     mutable Mutex mLock;
     70     mutable Condition mCondition;
     71     mutable Condition mTorchCondition;
     72 public:
     73     virtual ~TestCameraServiceListener() {};
     74 
     75     virtual binder::Status onStatusChanged(int32_t status, const String16& cameraId) {
     76         Mutex::Autolock l(mLock);
     77         mCameraStatuses[cameraId] = status;
     78         mCondition.broadcast();
     79         return binder::Status::ok();
     80     };
     81 
     82     virtual binder::Status onTorchStatusChanged(int32_t status, const String16& cameraId) {
     83         Mutex::Autolock l(mLock);
     84         mCameraTorchStatuses[cameraId] = status;
     85         mTorchCondition.broadcast();
     86         return binder::Status::ok();
     87     };
     88 
     89     bool waitForNumCameras(size_t num) const {
     90         Mutex::Autolock l(mLock);
     91 
     92         if (mCameraStatuses.size() == num) {
     93             return true;
     94         }
     95 
     96         while (mCameraStatuses.size() < num) {
     97             if (mCondition.waitRelative(mLock, SETUP_TIMEOUT) != OK) {
     98                 return false;
     99             }
    100         }
    101         return true;
    102     };
    103 
    104     bool waitForTorchState(int32_t status, int32_t cameraId) const {
    105         Mutex::Autolock l(mLock);
    106 
    107         const auto& iter = mCameraTorchStatuses.find(String16(String8::format("%d", cameraId)));
    108         if (iter != mCameraTorchStatuses.end() && iter->second == status) {
    109             return true;
    110         }
    111 
    112         bool foundStatus = false;
    113         while (!foundStatus) {
    114             if (mTorchCondition.waitRelative(mLock, SETUP_TIMEOUT) != OK) {
    115                 return false;
    116             }
    117             const auto& iter =
    118                     mCameraTorchStatuses.find(String16(String8::format("%d", cameraId)));
    119             foundStatus = (iter != mCameraTorchStatuses.end() && iter->second == status);
    120         }
    121         return true;
    122     };
    123 
    124     int32_t getTorchStatus(int32_t cameraId) const {
    125         Mutex::Autolock l(mLock);
    126         const auto& iter = mCameraTorchStatuses.find(String16(String8::format("%d", cameraId)));
    127         if (iter == mCameraTorchStatuses.end()) {
    128             return hardware::ICameraServiceListener::TORCH_STATUS_UNKNOWN;
    129         }
    130         return iter->second;
    131     };
    132 
    133     int32_t getStatus(const String16& cameraId) const {
    134         Mutex::Autolock l(mLock);
    135         const auto& iter = mCameraStatuses.find(cameraId);
    136         if (iter == mCameraStatuses.end()) {
    137             return hardware::ICameraServiceListener::STATUS_UNKNOWN;
    138         }
    139         return iter->second;
    140     };
    141 };
    142 
    143 // Callback implementation
    144 class TestCameraDeviceCallbacks : public hardware::camera2::BnCameraDeviceCallbacks {
    145 public:
    146     enum Status {
    147         IDLE,
    148         ERROR,
    149         PREPARED,
    150         RUNNING,
    151         SENT_RESULT,
    152         UNINITIALIZED,
    153         REPEATING_REQUEST_ERROR,
    154         REQUEST_QUEUE_EMPTY,
    155     };
    156 
    157 protected:
    158     bool mError;
    159     int32_t mLastStatus;
    160     mutable std::vector<int32_t> mStatusesHit;
    161     mutable Mutex mLock;
    162     mutable Condition mStatusCondition;
    163 public:
    164     TestCameraDeviceCallbacks() : mError(false), mLastStatus(UNINITIALIZED) {}
    165 
    166     virtual ~TestCameraDeviceCallbacks() {}
    167 
    168     virtual binder::Status onDeviceError(int errorCode,
    169             const CaptureResultExtras& resultExtras) {
    170         (void) resultExtras;
    171         ALOGE("%s: onDeviceError occurred with: %d", __FUNCTION__, static_cast<int>(errorCode));
    172         Mutex::Autolock l(mLock);
    173         mError = true;
    174         mLastStatus = ERROR;
    175         mStatusesHit.push_back(mLastStatus);
    176         mStatusCondition.broadcast();
    177         return binder::Status::ok();
    178     }
    179 
    180     virtual binder::Status onDeviceIdle() {
    181         Mutex::Autolock l(mLock);
    182         mLastStatus = IDLE;
    183         mStatusesHit.push_back(mLastStatus);
    184         mStatusCondition.broadcast();
    185         return binder::Status::ok();
    186     }
    187 
    188     virtual binder::Status onCaptureStarted(const CaptureResultExtras& resultExtras,
    189             int64_t timestamp) {
    190         (void) resultExtras;
    191         (void) timestamp;
    192         Mutex::Autolock l(mLock);
    193         mLastStatus = RUNNING;
    194         mStatusesHit.push_back(mLastStatus);
    195         mStatusCondition.broadcast();
    196         return binder::Status::ok();
    197     }
    198 
    199 
    200     virtual binder::Status onResultReceived(const CameraMetadata& metadata,
    201             const CaptureResultExtras& resultExtras,
    202             const std::vector<PhysicalCaptureResultInfo>& physicalResultInfos) {
    203         (void) metadata;
    204         (void) resultExtras;
    205         (void) physicalResultInfos;
    206         Mutex::Autolock l(mLock);
    207         mLastStatus = SENT_RESULT;
    208         mStatusesHit.push_back(mLastStatus);
    209         mStatusCondition.broadcast();
    210         return binder::Status::ok();
    211     }
    212 
    213     virtual binder::Status onPrepared(int streamId) {
    214         (void) streamId;
    215         Mutex::Autolock l(mLock);
    216         mLastStatus = PREPARED;
    217         mStatusesHit.push_back(mLastStatus);
    218         mStatusCondition.broadcast();
    219         return binder::Status::ok();
    220     }
    221 
    222     virtual binder::Status onRepeatingRequestError(
    223             int64_t lastFrameNumber, int32_t stoppedSequenceId) {
    224         (void) lastFrameNumber;
    225         (void) stoppedSequenceId;
    226         Mutex::Autolock l(mLock);
    227         mLastStatus = REPEATING_REQUEST_ERROR;
    228         mStatusesHit.push_back(mLastStatus);
    229         mStatusCondition.broadcast();
    230         return binder::Status::ok();
    231     }
    232 
    233     virtual binder::Status onRequestQueueEmpty() {
    234         Mutex::Autolock l(mLock);
    235         mLastStatus = REQUEST_QUEUE_EMPTY;
    236         mStatusesHit.push_back(mLastStatus);
    237         mStatusCondition.broadcast();
    238         return binder::Status::ok();
    239     }
    240 
    241     // Test helper functions:
    242 
    243     bool hadError() const {
    244         Mutex::Autolock l(mLock);
    245         return mError;
    246     }
    247 
    248     bool waitForStatus(Status status) const {
    249         Mutex::Autolock l(mLock);
    250         if (mLastStatus == status) {
    251             return true;
    252         }
    253 
    254         while (std::find(mStatusesHit.begin(), mStatusesHit.end(), status)
    255                 == mStatusesHit.end()) {
    256 
    257             if (mStatusCondition.waitRelative(mLock, IDLE_TIMEOUT) != OK) {
    258                 mStatusesHit.clear();
    259                 return false;
    260             }
    261         }
    262         mStatusesHit.clear();
    263 
    264         return true;
    265 
    266     }
    267 
    268     void clearStatus() const {
    269         Mutex::Autolock l(mLock);
    270         mStatusesHit.clear();
    271     }
    272 
    273     bool waitForIdle() const {
    274         return waitForStatus(IDLE);
    275     }
    276 
    277 };
    278 
    279 namespace {
    280     Mutex                     gLock;
    281     class DeathNotifier : public IBinder::DeathRecipient
    282     {
    283     public:
    284         DeathNotifier() {}
    285 
    286         virtual void binderDied(const wp<IBinder>& /*who*/) {
    287             ALOGV("binderDied");
    288             Mutex::Autolock _l(gLock);
    289             ALOGW("Camera service died!");
    290         }
    291     };
    292     sp<DeathNotifier>         gDeathNotifier;
    293 }; // anonymous namespace
    294 
    295 // Exercise basic binder calls for the camera service
    296 TEST(CameraServiceBinderTest, CheckBinderCameraService) {
    297     ProcessState::self()->startThreadPool();
    298     sp<IServiceManager> sm = defaultServiceManager();
    299     sp<IBinder> binder = sm->getService(String16("media.camera"));
    300     ASSERT_NOT_NULL(binder);
    301     if (gDeathNotifier == NULL) {
    302         gDeathNotifier = new DeathNotifier();
    303     }
    304     binder->linkToDeath(gDeathNotifier);
    305     sp<hardware::ICameraService> service =
    306             interface_cast<hardware::ICameraService>(binder);
    307 
    308     binder::Status res;
    309 
    310     int32_t numCameras = 0;
    311     res = service->getNumberOfCameras(hardware::ICameraService::CAMERA_TYPE_ALL, &numCameras);
    312     EXPECT_TRUE(res.isOk()) << res;
    313     EXPECT_LE(0, numCameras);
    314 
    315     // Check listener binder calls
    316     sp<TestCameraServiceListener> listener(new TestCameraServiceListener());
    317     std::vector<hardware::CameraStatus> statuses;
    318     res = service->addListener(listener, &statuses);
    319     EXPECT_TRUE(res.isOk()) << res;
    320 
    321     EXPECT_EQ(numCameras, static_cast<const int>(statuses.size()));
    322     for (const auto &it : statuses) {
    323         listener->onStatusChanged(it.status, String16(it.cameraId));
    324     }
    325 
    326     for (int32_t i = 0; i < numCameras; i++) {
    327         String16 cameraId = String16(String8::format("%d", i));
    328         bool isSupported = false;
    329         res = service->supportsCameraApi(cameraId,
    330                 hardware::ICameraService::API_VERSION_2, &isSupported);
    331         EXPECT_TRUE(res.isOk()) << res;
    332 
    333         // We only care about binder calls for the Camera2 API.  Camera1 is deprecated.
    334         if (!isSupported) {
    335             continue;
    336         }
    337 
    338         // Check metadata binder call
    339         CameraMetadata metadata;
    340         res = service->getCameraCharacteristics(cameraId, &metadata);
    341         EXPECT_TRUE(res.isOk()) << res;
    342         EXPECT_FALSE(metadata.isEmpty());
    343 
    344         // Make sure we're available, or skip device tests otherwise
    345         int32_t s = listener->getStatus(cameraId);
    346         EXPECT_EQ(::android::hardware::ICameraServiceListener::STATUS_PRESENT, s);
    347         if (s != ::android::hardware::ICameraServiceListener::STATUS_PRESENT) {
    348             continue;
    349         }
    350 
    351         // Check connect binder calls
    352         sp<TestCameraDeviceCallbacks> callbacks(new TestCameraDeviceCallbacks());
    353         sp<hardware::camera2::ICameraDeviceUser> device;
    354         res = service->connectDevice(callbacks, cameraId, String16("meeeeeeeee!"),
    355                 hardware::ICameraService::USE_CALLING_UID, /*out*/&device);
    356         EXPECT_TRUE(res.isOk()) << res;
    357         ASSERT_NE(nullptr, device.get());
    358         device->disconnect();
    359         EXPECT_FALSE(callbacks->hadError());
    360 
    361         int32_t torchStatus = listener->getTorchStatus(i);
    362         if (torchStatus == hardware::ICameraServiceListener::TORCH_STATUS_AVAILABLE_OFF) {
    363             // Check torch calls
    364             res = service->setTorchMode(cameraId,
    365                     /*enabled*/true, callbacks);
    366             EXPECT_TRUE(res.isOk()) << res;
    367             EXPECT_TRUE(listener->waitForTorchState(
    368                     hardware::ICameraServiceListener::TORCH_STATUS_AVAILABLE_ON, i));
    369             res = service->setTorchMode(cameraId,
    370                     /*enabled*/false, callbacks);
    371             EXPECT_TRUE(res.isOk()) << res;
    372             EXPECT_TRUE(listener->waitForTorchState(
    373                     hardware::ICameraServiceListener::TORCH_STATUS_AVAILABLE_OFF, i));
    374         }
    375     }
    376 
    377     res = service->removeListener(listener);
    378     EXPECT_TRUE(res.isOk()) << res;
    379 }
    380 
    381 // Test fixture for client focused binder tests
    382 class CameraClientBinderTest : public testing::Test {
    383 protected:
    384     sp<hardware::ICameraService> service;
    385     int32_t numCameras;
    386     std::vector<std::pair<sp<TestCameraDeviceCallbacks>, sp<hardware::camera2::ICameraDeviceUser>>>
    387             openDeviceList;
    388     sp<TestCameraServiceListener> serviceListener;
    389 
    390     std::pair<sp<TestCameraDeviceCallbacks>, sp<hardware::camera2::ICameraDeviceUser>>
    391             openNewDevice(const String16& deviceId) {
    392         sp<TestCameraDeviceCallbacks> callbacks(new TestCameraDeviceCallbacks());
    393         sp<hardware::camera2::ICameraDeviceUser> device;
    394         {
    395             SCOPED_TRACE("openNewDevice");
    396             binder::Status res = service->connectDevice(callbacks, deviceId, String16("meeeeeeeee!"),
    397                     hardware::ICameraService::USE_CALLING_UID, /*out*/&device);
    398             EXPECT_TRUE(res.isOk()) << res;
    399         }
    400         auto p = std::make_pair(callbacks, device);
    401         openDeviceList.push_back(p);
    402         return p;
    403     }
    404 
    405     void closeDevice(std::pair<sp<TestCameraDeviceCallbacks>,
    406             sp<hardware::camera2::ICameraDeviceUser>>& p) {
    407         if (p.second.get() != nullptr) {
    408             binder::Status res = p.second->disconnect();
    409             EXPECT_TRUE(res.isOk()) << res;
    410             {
    411                 SCOPED_TRACE("closeDevice");
    412                 EXPECT_FALSE(p.first->hadError());
    413             }
    414         }
    415         auto iter = std::find(openDeviceList.begin(), openDeviceList.end(), p);
    416         if (iter != openDeviceList.end()) {
    417             openDeviceList.erase(iter);
    418         }
    419     }
    420 
    421     virtual void SetUp() {
    422         ProcessState::self()->startThreadPool();
    423         sp<IServiceManager> sm = defaultServiceManager();
    424         sp<IBinder> binder = sm->getService(String16("media.camera"));
    425         service = interface_cast<hardware::ICameraService>(binder);
    426         serviceListener = new TestCameraServiceListener();
    427         std::vector<hardware::CameraStatus> statuses;
    428         service->addListener(serviceListener, &statuses);
    429         for (const auto &it : statuses) {
    430             serviceListener->onStatusChanged(it.status, String16(it.cameraId));
    431         }
    432         service->getNumberOfCameras(hardware::ICameraService::CAMERA_TYPE_BACKWARD_COMPATIBLE,
    433                 &numCameras);
    434     }
    435 
    436     virtual void TearDown() {
    437         service = nullptr;
    438         numCameras = 0;
    439         for (auto& p : openDeviceList) {
    440             closeDevice(p);
    441         }
    442     }
    443 
    444 };
    445 
    446 TEST_F(CameraClientBinderTest, CheckBinderCameraDeviceUser) {
    447     ASSERT_NOT_NULL(service);
    448     EXPECT_TRUE(serviceListener->waitForNumCameras(numCameras));
    449     for (int32_t i = 0; i < numCameras; i++) {
    450         String8 cameraId8 = String8::format("%d", i);
    451         // Make sure we're available, or skip device tests otherwise
    452         String16 cameraId(cameraId8);
    453         int32_t s = serviceListener->getStatus(cameraId);
    454         EXPECT_EQ(hardware::ICameraServiceListener::STATUS_PRESENT, s);
    455         if (s != hardware::ICameraServiceListener::STATUS_PRESENT) {
    456             continue;
    457         }
    458         binder::Status res;
    459         auto p = openNewDevice(cameraId);
    460         sp<TestCameraDeviceCallbacks> callbacks = p.first;
    461         sp<hardware::camera2::ICameraDeviceUser> device = p.second;
    462 
    463         // Setup a buffer queue; I'm just using the vendor opaque format here as that is
    464         // guaranteed to be present
    465         sp<IGraphicBufferProducer> gbProducer;
    466         sp<IGraphicBufferConsumer> gbConsumer;
    467         BufferQueue::createBufferQueue(&gbProducer, &gbConsumer);
    468         sp<BufferItemConsumer> opaqueConsumer = new BufferItemConsumer(gbConsumer,
    469                 GRALLOC_USAGE_SW_READ_NEVER, /*maxImages*/2, /*controlledByApp*/true);
    470         EXPECT_TRUE(opaqueConsumer.get() != nullptr);
    471         opaqueConsumer->setName(String8("nom nom nom"));
    472 
    473         // Set to VGA dimens for default, as that is guaranteed to be present
    474         EXPECT_EQ(OK, gbConsumer->setDefaultBufferSize(640, 480));
    475         EXPECT_EQ(OK, gbConsumer->setDefaultBufferFormat(HAL_PIXEL_FORMAT_IMPLEMENTATION_DEFINED));
    476 
    477         sp<Surface> surface(new Surface(gbProducer, /*controlledByApp*/false));
    478 
    479         OutputConfiguration output(gbProducer, /*rotation*/0);
    480 
    481         // Can we configure?
    482         res = device->beginConfigure();
    483         EXPECT_TRUE(res.isOk()) << res;
    484         status_t streamId;
    485         res = device->createStream(output, &streamId);
    486         EXPECT_TRUE(res.isOk()) << res;
    487         EXPECT_LE(0, streamId);
    488         CameraMetadata sessionParams;
    489         res = device->endConfigure(/*isConstrainedHighSpeed*/ false, sessionParams);
    490         EXPECT_TRUE(res.isOk()) << res;
    491         EXPECT_FALSE(callbacks->hadError());
    492 
    493         // Can we make requests?
    494         CameraMetadata requestTemplate;
    495         res = device->createDefaultRequest(/*preview template*/1,
    496                 /*out*/&requestTemplate);
    497         EXPECT_TRUE(res.isOk()) << res;
    498 
    499         hardware::camera2::CaptureRequest request;
    500         request.mPhysicalCameraSettings.push_back({cameraId8.string(), requestTemplate});
    501         request.mSurfaceList.add(surface);
    502         request.mIsReprocess = false;
    503         int64_t lastFrameNumber = 0;
    504         int64_t lastFrameNumberPrev = 0;
    505         callbacks->clearStatus();
    506 
    507         hardware::camera2::utils::SubmitInfo info;
    508         res = device->submitRequest(request, /*streaming*/true, /*out*/&info);
    509         EXPECT_TRUE(res.isOk()) << res;
    510         EXPECT_TRUE(callbacks->waitForStatus(TestCameraDeviceCallbacks::SENT_RESULT));
    511         EXPECT_LE(0, info.mRequestId);
    512 
    513         // Can we stop requests?
    514         res = device->cancelRequest(info.mRequestId, /*out*/&lastFrameNumber);
    515         EXPECT_TRUE(res.isOk()) << res;
    516         EXPECT_TRUE(callbacks->waitForIdle());
    517         EXPECT_FALSE(callbacks->hadError());
    518 
    519         // Can we do it again?
    520         lastFrameNumberPrev = info.mLastFrameNumber;
    521         lastFrameNumber = 0;
    522         requestTemplate.clear();
    523         res = device->createDefaultRequest(hardware::camera2::ICameraDeviceUser::TEMPLATE_PREVIEW,
    524                 /*out*/&requestTemplate);
    525         EXPECT_TRUE(res.isOk()) << res;
    526         hardware::camera2::CaptureRequest request2;
    527         request2.mPhysicalCameraSettings.push_back({cameraId8.string(), requestTemplate});
    528         request2.mSurfaceList.add(surface);
    529         request2.mIsReprocess = false;
    530         callbacks->clearStatus();
    531         hardware::camera2::utils::SubmitInfo info2;
    532         res = device->submitRequest(request2, /*streaming*/true,
    533                 /*out*/&info2);
    534         EXPECT_TRUE(res.isOk()) << res;
    535         EXPECT_EQ(hardware::camera2::ICameraDeviceUser::NO_IN_FLIGHT_REPEATING_FRAMES,
    536                 info2.mLastFrameNumber);
    537         lastFrameNumber = 0;
    538         EXPECT_TRUE(callbacks->waitForStatus(TestCameraDeviceCallbacks::SENT_RESULT));
    539         EXPECT_LE(0, info2.mRequestId);
    540         res = device->cancelRequest(info2.mRequestId, /*out*/&lastFrameNumber);
    541         EXPECT_TRUE(res.isOk()) << res;
    542         EXPECT_TRUE(callbacks->waitForIdle());
    543         EXPECT_LE(lastFrameNumberPrev, lastFrameNumber);
    544         sleep(/*second*/1); // allow some time for errors to show up, if any
    545         EXPECT_FALSE(callbacks->hadError());
    546 
    547         // Can we do it with a request list?
    548         lastFrameNumberPrev = lastFrameNumber;
    549         lastFrameNumber = 0;
    550         requestTemplate.clear();
    551         CameraMetadata requestTemplate2;
    552         res = device->createDefaultRequest(hardware::camera2::ICameraDeviceUser::TEMPLATE_PREVIEW,
    553                 /*out*/&requestTemplate);
    554         EXPECT_TRUE(res.isOk()) << res;
    555         res = device->createDefaultRequest(hardware::camera2::ICameraDeviceUser::TEMPLATE_PREVIEW,
    556                 /*out*/&requestTemplate2);
    557         EXPECT_TRUE(res.isOk()) << res;
    558         android::hardware::camera2::CaptureRequest request3;
    559         android::hardware::camera2::CaptureRequest request4;
    560         request3.mPhysicalCameraSettings.push_back({cameraId8.string(), requestTemplate});
    561         request3.mSurfaceList.add(surface);
    562         request3.mIsReprocess = false;
    563         request4.mPhysicalCameraSettings.push_back({cameraId8.string(), requestTemplate2});
    564         request4.mSurfaceList.add(surface);
    565         request4.mIsReprocess = false;
    566         std::vector<hardware::camera2::CaptureRequest> requestList;
    567         requestList.push_back(request3);
    568         requestList.push_back(request4);
    569 
    570         callbacks->clearStatus();
    571         hardware::camera2::utils::SubmitInfo info3;
    572         res = device->submitRequestList(requestList, /*streaming*/false,
    573                 /*out*/&info3);
    574         EXPECT_TRUE(res.isOk()) << res;
    575         EXPECT_LE(0, info3.mRequestId);
    576         EXPECT_TRUE(callbacks->waitForStatus(TestCameraDeviceCallbacks::SENT_RESULT));
    577         EXPECT_TRUE(callbacks->waitForIdle());
    578         EXPECT_LE(lastFrameNumberPrev, info3.mLastFrameNumber);
    579         sleep(/*second*/1); // allow some time for errors to show up, if any
    580         EXPECT_FALSE(callbacks->hadError());
    581 
    582         // Can we unconfigure?
    583         res = device->beginConfigure();
    584         EXPECT_TRUE(res.isOk()) << res;
    585         res = device->deleteStream(streamId);
    586         EXPECT_TRUE(res.isOk()) << res;
    587         res = device->endConfigure(/*isConstrainedHighSpeed*/ false, sessionParams);
    588         EXPECT_TRUE(res.isOk()) << res;
    589 
    590         sleep(/*second*/1); // allow some time for errors to show up, if any
    591         EXPECT_FALSE(callbacks->hadError());
    592 
    593         closeDevice(p);
    594     }
    595 
    596 };
    597 
    598 TEST_F(CameraClientBinderTest, CheckBinderCaptureRequest) {
    599     sp<CaptureRequest> requestOriginal, requestParceled;
    600     sp<IGraphicBufferProducer> gbProducer;
    601     sp<IGraphicBufferConsumer> gbConsumer;
    602     BufferQueue::createBufferQueue(&gbProducer, &gbConsumer);
    603     sp<Surface> surface(new Surface(gbProducer, /*controlledByApp*/false));
    604     Vector<sp<Surface>> surfaceList;
    605     surfaceList.push_back(surface);
    606     std::string physicalDeviceId1 = "0";
    607     std::string physicalDeviceId2 = "1";
    608     CameraMetadata physicalDeviceSettings1, physicalDeviceSettings2;
    609     uint8_t intent1 = ANDROID_CONTROL_CAPTURE_INTENT_PREVIEW;
    610     uint8_t intent2 = ANDROID_CONTROL_CAPTURE_INTENT_VIDEO_RECORD;
    611     EXPECT_EQ(OK, physicalDeviceSettings1.update(ANDROID_CONTROL_CAPTURE_INTENT, &intent1, 1));
    612     EXPECT_EQ(OK, physicalDeviceSettings2.update(ANDROID_CONTROL_CAPTURE_INTENT, &intent2, 1));
    613 
    614     requestParceled = new CaptureRequest();
    615     Parcel p;
    616     EXPECT_TRUE(requestParceled->readFromParcel(&p) != OK);
    617     p.writeInt32(0);
    618     p.setDataPosition(0);
    619     EXPECT_TRUE(requestParceled->readFromParcel(&p) != OK);
    620     p.freeData();
    621     p.writeInt32(-1);
    622     p.setDataPosition(0);
    623     EXPECT_TRUE(requestParceled->readFromParcel(&p) != OK);
    624     p.freeData();
    625     p.writeInt32(1);
    626     p.setDataPosition(0);
    627     EXPECT_TRUE(requestParceled->readFromParcel(&p) != OK);
    628 
    629     requestOriginal = new CaptureRequest();
    630     requestOriginal->mPhysicalCameraSettings.push_back({physicalDeviceId1,
    631             physicalDeviceSettings1});
    632     requestOriginal->mPhysicalCameraSettings.push_back({physicalDeviceId2,
    633             physicalDeviceSettings2});
    634     requestOriginal->mSurfaceList.push_back(surface);
    635     requestOriginal->mIsReprocess = false;
    636     requestOriginal->mSurfaceConverted = false;
    637 
    638     p.freeData();
    639     EXPECT_TRUE(requestOriginal->writeToParcel(&p) == OK);
    640     p.setDataPosition(0);
    641     EXPECT_TRUE(requestParceled->readFromParcel(&p) == OK);
    642     EXPECT_EQ(requestParceled->mIsReprocess, false);
    643     EXPECT_FALSE(requestParceled->mSurfaceList.empty());
    644     EXPECT_EQ(2u, requestParceled->mPhysicalCameraSettings.size());
    645     auto it = requestParceled->mPhysicalCameraSettings.begin();
    646     EXPECT_EQ(physicalDeviceId1, it->id);
    647     EXPECT_TRUE(it->settings.exists(ANDROID_CONTROL_CAPTURE_INTENT));
    648     auto entry = it->settings.find(ANDROID_CONTROL_CAPTURE_INTENT);
    649     EXPECT_EQ(entry.data.u8[0], intent1);
    650     it++;
    651     EXPECT_EQ(physicalDeviceId2, it->id);
    652     EXPECT_TRUE(it->settings.exists(ANDROID_CONTROL_CAPTURE_INTENT));
    653     entry = it->settings.find(ANDROID_CONTROL_CAPTURE_INTENT);
    654     EXPECT_EQ(entry.data.u8[0], intent2);
    655 };
    656