1b12fb5d4642ee1651ae4432d3bebc4b0a33469e9Emilian Peev/* 2b12fb5d4642ee1651ae4432d3bebc4b0a33469e9Emilian Peev * Copyright (C) 2017 The Android Open Source Project 3b12fb5d4642ee1651ae4432d3bebc4b0a33469e9Emilian Peev * 4b12fb5d4642ee1651ae4432d3bebc4b0a33469e9Emilian Peev * Licensed under the Apache License, Version 2.0 (the "License"); 5b12fb5d4642ee1651ae4432d3bebc4b0a33469e9Emilian Peev * you may not use this file except in compliance with the License. 6b12fb5d4642ee1651ae4432d3bebc4b0a33469e9Emilian Peev * You may obtain a copy of the License at 7b12fb5d4642ee1651ae4432d3bebc4b0a33469e9Emilian Peev * 8b12fb5d4642ee1651ae4432d3bebc4b0a33469e9Emilian Peev * http://www.apache.org/licenses/LICENSE-2.0 9b12fb5d4642ee1651ae4432d3bebc4b0a33469e9Emilian Peev * 10b12fb5d4642ee1651ae4432d3bebc4b0a33469e9Emilian Peev * Unless required by applicable law or agreed to in writing, software 11b12fb5d4642ee1651ae4432d3bebc4b0a33469e9Emilian Peev * distributed under the License is distributed on an "AS IS" BASIS, 12b12fb5d4642ee1651ae4432d3bebc4b0a33469e9Emilian Peev * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13b12fb5d4642ee1651ae4432d3bebc4b0a33469e9Emilian Peev * See the License for the specific language governing permissions and 14b12fb5d4642ee1651ae4432d3bebc4b0a33469e9Emilian Peev * limitations under the License. 15b12fb5d4642ee1651ae4432d3bebc4b0a33469e9Emilian Peev */ 16b12fb5d4642ee1651ae4432d3bebc4b0a33469e9Emilian Peev 17b12fb5d4642ee1651ae4432d3bebc4b0a33469e9Emilian Peev#define LOG_NDEBUG 0 18b12fb5d4642ee1651ae4432d3bebc4b0a33469e9Emilian Peev#define LOG_TAG "CameraZSLTests" 19b12fb5d4642ee1651ae4432d3bebc4b0a33469e9Emilian Peev 20b12fb5d4642ee1651ae4432d3bebc4b0a33469e9Emilian Peev#include <gtest/gtest.h> 21b12fb5d4642ee1651ae4432d3bebc4b0a33469e9Emilian Peev 22b12fb5d4642ee1651ae4432d3bebc4b0a33469e9Emilian Peev#include <binder/ProcessState.h> 23b12fb5d4642ee1651ae4432d3bebc4b0a33469e9Emilian Peev#include <utils/Errors.h> 24b12fb5d4642ee1651ae4432d3bebc4b0a33469e9Emilian Peev#include <utils/Log.h> 25b12fb5d4642ee1651ae4432d3bebc4b0a33469e9Emilian Peev#include <gui/Surface.h> 26b12fb5d4642ee1651ae4432d3bebc4b0a33469e9Emilian Peev#include <gui/SurfaceComposerClient.h> 27b12fb5d4642ee1651ae4432d3bebc4b0a33469e9Emilian Peev#include <camera/CameraParameters.h> 28b12fb5d4642ee1651ae4432d3bebc4b0a33469e9Emilian Peev#include <camera/CameraMetadata.h> 29b12fb5d4642ee1651ae4432d3bebc4b0a33469e9Emilian Peev#include <camera/Camera.h> 30b12fb5d4642ee1651ae4432d3bebc4b0a33469e9Emilian Peev#include <android/hardware/ICameraService.h> 31b12fb5d4642ee1651ae4432d3bebc4b0a33469e9Emilian Peev 32b12fb5d4642ee1651ae4432d3bebc4b0a33469e9Emilian Peevusing namespace android; 33b12fb5d4642ee1651ae4432d3bebc4b0a33469e9Emilian Peevusing namespace android::hardware; 34b12fb5d4642ee1651ae4432d3bebc4b0a33469e9Emilian Peev 35b12fb5d4642ee1651ae4432d3bebc4b0a33469e9Emilian Peevclass CameraZSLTests : public ::testing::Test, 36b12fb5d4642ee1651ae4432d3bebc4b0a33469e9Emilian Peev public ::android::hardware::BnCameraClient { 37b12fb5d4642ee1651ae4432d3bebc4b0a33469e9Emilian Peevprotected: 38b12fb5d4642ee1651ae4432d3bebc4b0a33469e9Emilian Peev 39b12fb5d4642ee1651ae4432d3bebc4b0a33469e9Emilian Peev CameraZSLTests() : numCameras(0), mPreviewBufferCount(0), 40b12fb5d4642ee1651ae4432d3bebc4b0a33469e9Emilian Peev mAutoFocusMessage(false), mSnapshotNotification(false) {} 41b12fb5d4642ee1651ae4432d3bebc4b0a33469e9Emilian Peev 42b12fb5d4642ee1651ae4432d3bebc4b0a33469e9Emilian Peev //Gtest interface 43b12fb5d4642ee1651ae4432d3bebc4b0a33469e9Emilian Peev void SetUp() override; 44b12fb5d4642ee1651ae4432d3bebc4b0a33469e9Emilian Peev void TearDown() override; 45b12fb5d4642ee1651ae4432d3bebc4b0a33469e9Emilian Peev 46b12fb5d4642ee1651ae4432d3bebc4b0a33469e9Emilian Peev //CameraClient interface 47b12fb5d4642ee1651ae4432d3bebc4b0a33469e9Emilian Peev void notifyCallback(int32_t msgType, int32_t, int32_t) override; 48b12fb5d4642ee1651ae4432d3bebc4b0a33469e9Emilian Peev void dataCallback(int32_t msgType, const sp<IMemory>&, 49b12fb5d4642ee1651ae4432d3bebc4b0a33469e9Emilian Peev camera_frame_metadata_t *) override; 50b12fb5d4642ee1651ae4432d3bebc4b0a33469e9Emilian Peev void dataCallbackTimestamp(nsecs_t, int32_t, 51b12fb5d4642ee1651ae4432d3bebc4b0a33469e9Emilian Peev const sp<IMemory>&) override {}; 52b12fb5d4642ee1651ae4432d3bebc4b0a33469e9Emilian Peev void recordingFrameHandleCallbackTimestamp(nsecs_t, 53b12fb5d4642ee1651ae4432d3bebc4b0a33469e9Emilian Peev native_handle_t*) override {}; 54b5df547bce900fa5764d735bee304e79c001d60dYin-Chia Yeh void recordingFrameHandleCallbackTimestampBatch( 55b5df547bce900fa5764d735bee304e79c001d60dYin-Chia Yeh const std::vector<nsecs_t>&, 56b5df547bce900fa5764d735bee304e79c001d60dYin-Chia Yeh const std::vector<native_handle_t*>&) override {}; 57b12fb5d4642ee1651ae4432d3bebc4b0a33469e9Emilian Peev 58b12fb5d4642ee1651ae4432d3bebc4b0a33469e9Emilian Peev status_t waitForPreviewStart(); 59b12fb5d4642ee1651ae4432d3bebc4b0a33469e9Emilian Peev status_t waitForEvent(Mutex &mutex, Condition &condition, bool &flag); 60b12fb5d4642ee1651ae4432d3bebc4b0a33469e9Emilian Peev 61b12fb5d4642ee1651ae4432d3bebc4b0a33469e9Emilian Peev mutable Mutex mPreviewLock; 62b12fb5d4642ee1651ae4432d3bebc4b0a33469e9Emilian Peev mutable Condition mPreviewCondition; 63b12fb5d4642ee1651ae4432d3bebc4b0a33469e9Emilian Peev mutable Mutex mAutoFocusLock; 64b12fb5d4642ee1651ae4432d3bebc4b0a33469e9Emilian Peev mutable Condition mAutoFocusCondition; 65b12fb5d4642ee1651ae4432d3bebc4b0a33469e9Emilian Peev mutable Mutex mSnapshotLock; 66b12fb5d4642ee1651ae4432d3bebc4b0a33469e9Emilian Peev mutable Condition mSnapshotCondition; 67b12fb5d4642ee1651ae4432d3bebc4b0a33469e9Emilian Peev 68b12fb5d4642ee1651ae4432d3bebc4b0a33469e9Emilian Peev int32_t numCameras; 69b12fb5d4642ee1651ae4432d3bebc4b0a33469e9Emilian Peev size_t mPreviewBufferCount; 70b12fb5d4642ee1651ae4432d3bebc4b0a33469e9Emilian Peev sp<ICameraService> mCameraService; 71b12fb5d4642ee1651ae4432d3bebc4b0a33469e9Emilian Peev sp<SurfaceComposerClient> mComposerClient; 72b12fb5d4642ee1651ae4432d3bebc4b0a33469e9Emilian Peev bool mAutoFocusMessage; 73b12fb5d4642ee1651ae4432d3bebc4b0a33469e9Emilian Peev bool mSnapshotNotification; 74b12fb5d4642ee1651ae4432d3bebc4b0a33469e9Emilian Peev static const int32_t kPreviewThreshold = 8; 75b12fb5d4642ee1651ae4432d3bebc4b0a33469e9Emilian Peev static const nsecs_t kPreviewTimeout = 5000000000; // 5 [s.] 76b12fb5d4642ee1651ae4432d3bebc4b0a33469e9Emilian Peev static const nsecs_t kEventTimeout = 10000000000; // 10 [s.] 77b12fb5d4642ee1651ae4432d3bebc4b0a33469e9Emilian Peev}; 78b12fb5d4642ee1651ae4432d3bebc4b0a33469e9Emilian Peev 79b12fb5d4642ee1651ae4432d3bebc4b0a33469e9Emilian Peevvoid CameraZSLTests::SetUp() { 80b12fb5d4642ee1651ae4432d3bebc4b0a33469e9Emilian Peev ::android::binder::Status rc; 81b12fb5d4642ee1651ae4432d3bebc4b0a33469e9Emilian Peev ProcessState::self()->startThreadPool(); 82b12fb5d4642ee1651ae4432d3bebc4b0a33469e9Emilian Peev sp<IServiceManager> sm = defaultServiceManager(); 83b12fb5d4642ee1651ae4432d3bebc4b0a33469e9Emilian Peev sp<IBinder> binder = sm->getService(String16("media.camera")); 84b12fb5d4642ee1651ae4432d3bebc4b0a33469e9Emilian Peev mCameraService = interface_cast<ICameraService>(binder); 85b12fb5d4642ee1651ae4432d3bebc4b0a33469e9Emilian Peev rc = mCameraService->getNumberOfCameras( 86b12fb5d4642ee1651ae4432d3bebc4b0a33469e9Emilian Peev hardware::ICameraService::CAMERA_TYPE_ALL, &numCameras); 87b12fb5d4642ee1651ae4432d3bebc4b0a33469e9Emilian Peev EXPECT_TRUE(rc.isOk()); 88b12fb5d4642ee1651ae4432d3bebc4b0a33469e9Emilian Peev 89b12fb5d4642ee1651ae4432d3bebc4b0a33469e9Emilian Peev mComposerClient = new SurfaceComposerClient; 90b12fb5d4642ee1651ae4432d3bebc4b0a33469e9Emilian Peev ASSERT_EQ(NO_ERROR, mComposerClient->initCheck()); 91b12fb5d4642ee1651ae4432d3bebc4b0a33469e9Emilian Peev} 92b12fb5d4642ee1651ae4432d3bebc4b0a33469e9Emilian Peev 93b12fb5d4642ee1651ae4432d3bebc4b0a33469e9Emilian Peevvoid CameraZSLTests::TearDown() { 94b12fb5d4642ee1651ae4432d3bebc4b0a33469e9Emilian Peev mCameraService.clear(); 95b12fb5d4642ee1651ae4432d3bebc4b0a33469e9Emilian Peev mComposerClient->dispose(); 96b12fb5d4642ee1651ae4432d3bebc4b0a33469e9Emilian Peev} 97b12fb5d4642ee1651ae4432d3bebc4b0a33469e9Emilian Peev 98b12fb5d4642ee1651ae4432d3bebc4b0a33469e9Emilian Peevvoid CameraZSLTests::notifyCallback(int32_t msgType, int32_t, 99b12fb5d4642ee1651ae4432d3bebc4b0a33469e9Emilian Peev int32_t) { 100b12fb5d4642ee1651ae4432d3bebc4b0a33469e9Emilian Peev if (CAMERA_MSG_FOCUS == msgType) { 101b12fb5d4642ee1651ae4432d3bebc4b0a33469e9Emilian Peev Mutex::Autolock l(mAutoFocusLock); 102b12fb5d4642ee1651ae4432d3bebc4b0a33469e9Emilian Peev mAutoFocusMessage = true; 103b12fb5d4642ee1651ae4432d3bebc4b0a33469e9Emilian Peev mAutoFocusCondition.broadcast(); 104b12fb5d4642ee1651ae4432d3bebc4b0a33469e9Emilian Peev } else { 105b12fb5d4642ee1651ae4432d3bebc4b0a33469e9Emilian Peev ALOGV("%s: msgType: %d", __FUNCTION__, msgType); 106b12fb5d4642ee1651ae4432d3bebc4b0a33469e9Emilian Peev } 107b12fb5d4642ee1651ae4432d3bebc4b0a33469e9Emilian Peev}; 108b12fb5d4642ee1651ae4432d3bebc4b0a33469e9Emilian Peev 109b12fb5d4642ee1651ae4432d3bebc4b0a33469e9Emilian Peevvoid CameraZSLTests::dataCallback(int32_t msgType, const sp<IMemory>& /*data*/, 110b12fb5d4642ee1651ae4432d3bebc4b0a33469e9Emilian Peev camera_frame_metadata_t *) { 111b12fb5d4642ee1651ae4432d3bebc4b0a33469e9Emilian Peev 112b12fb5d4642ee1651ae4432d3bebc4b0a33469e9Emilian Peev switch (msgType) { 113b12fb5d4642ee1651ae4432d3bebc4b0a33469e9Emilian Peev case CAMERA_MSG_PREVIEW_FRAME: { 114b12fb5d4642ee1651ae4432d3bebc4b0a33469e9Emilian Peev Mutex::Autolock l(mPreviewLock); 115b12fb5d4642ee1651ae4432d3bebc4b0a33469e9Emilian Peev mPreviewBufferCount++; 116b12fb5d4642ee1651ae4432d3bebc4b0a33469e9Emilian Peev mPreviewCondition.broadcast(); 117b12fb5d4642ee1651ae4432d3bebc4b0a33469e9Emilian Peev break; 118b12fb5d4642ee1651ae4432d3bebc4b0a33469e9Emilian Peev } 119b12fb5d4642ee1651ae4432d3bebc4b0a33469e9Emilian Peev case CAMERA_MSG_COMPRESSED_IMAGE: { 120b12fb5d4642ee1651ae4432d3bebc4b0a33469e9Emilian Peev Mutex::Autolock l(mSnapshotLock); 121b12fb5d4642ee1651ae4432d3bebc4b0a33469e9Emilian Peev mSnapshotNotification = true; 122b12fb5d4642ee1651ae4432d3bebc4b0a33469e9Emilian Peev //TODO: Add checks on incoming Jpeg 123b12fb5d4642ee1651ae4432d3bebc4b0a33469e9Emilian Peev mSnapshotCondition.broadcast(); 124b12fb5d4642ee1651ae4432d3bebc4b0a33469e9Emilian Peev break; 125b12fb5d4642ee1651ae4432d3bebc4b0a33469e9Emilian Peev } 126b12fb5d4642ee1651ae4432d3bebc4b0a33469e9Emilian Peev default: 127b12fb5d4642ee1651ae4432d3bebc4b0a33469e9Emilian Peev ALOGV("%s: msgType: %d", __FUNCTION__, msgType); 128b12fb5d4642ee1651ae4432d3bebc4b0a33469e9Emilian Peev } 129b12fb5d4642ee1651ae4432d3bebc4b0a33469e9Emilian Peev}; 130b12fb5d4642ee1651ae4432d3bebc4b0a33469e9Emilian Peev 131b12fb5d4642ee1651ae4432d3bebc4b0a33469e9Emilian Peevstatus_t CameraZSLTests::waitForPreviewStart() { 132b12fb5d4642ee1651ae4432d3bebc4b0a33469e9Emilian Peev status_t rc = NO_ERROR; 133b12fb5d4642ee1651ae4432d3bebc4b0a33469e9Emilian Peev Mutex::Autolock l(mPreviewLock); 134b12fb5d4642ee1651ae4432d3bebc4b0a33469e9Emilian Peev mPreviewBufferCount = 0; 135b12fb5d4642ee1651ae4432d3bebc4b0a33469e9Emilian Peev 136b12fb5d4642ee1651ae4432d3bebc4b0a33469e9Emilian Peev while (mPreviewBufferCount < kPreviewThreshold) { 137b12fb5d4642ee1651ae4432d3bebc4b0a33469e9Emilian Peev rc = mPreviewCondition.waitRelative(mPreviewLock, 138b12fb5d4642ee1651ae4432d3bebc4b0a33469e9Emilian Peev kPreviewTimeout); 139b12fb5d4642ee1651ae4432d3bebc4b0a33469e9Emilian Peev if (NO_ERROR != rc) { 140b12fb5d4642ee1651ae4432d3bebc4b0a33469e9Emilian Peev break; 141b12fb5d4642ee1651ae4432d3bebc4b0a33469e9Emilian Peev } 142b12fb5d4642ee1651ae4432d3bebc4b0a33469e9Emilian Peev } 143b12fb5d4642ee1651ae4432d3bebc4b0a33469e9Emilian Peev 144b12fb5d4642ee1651ae4432d3bebc4b0a33469e9Emilian Peev return rc; 145b12fb5d4642ee1651ae4432d3bebc4b0a33469e9Emilian Peev} 146b12fb5d4642ee1651ae4432d3bebc4b0a33469e9Emilian Peev 147b12fb5d4642ee1651ae4432d3bebc4b0a33469e9Emilian Peevstatus_t CameraZSLTests::waitForEvent(Mutex &mutex, 148b12fb5d4642ee1651ae4432d3bebc4b0a33469e9Emilian Peev Condition &condition, bool &flag) { 149b12fb5d4642ee1651ae4432d3bebc4b0a33469e9Emilian Peev status_t rc = NO_ERROR; 150b12fb5d4642ee1651ae4432d3bebc4b0a33469e9Emilian Peev Mutex::Autolock l(mutex); 151b12fb5d4642ee1651ae4432d3bebc4b0a33469e9Emilian Peev flag = false; 152b12fb5d4642ee1651ae4432d3bebc4b0a33469e9Emilian Peev 153b12fb5d4642ee1651ae4432d3bebc4b0a33469e9Emilian Peev while (!flag) { 154b12fb5d4642ee1651ae4432d3bebc4b0a33469e9Emilian Peev rc = condition.waitRelative(mutex, 155b12fb5d4642ee1651ae4432d3bebc4b0a33469e9Emilian Peev kEventTimeout); 156b12fb5d4642ee1651ae4432d3bebc4b0a33469e9Emilian Peev if (NO_ERROR != rc) { 157b12fb5d4642ee1651ae4432d3bebc4b0a33469e9Emilian Peev break; 158b12fb5d4642ee1651ae4432d3bebc4b0a33469e9Emilian Peev } 159b12fb5d4642ee1651ae4432d3bebc4b0a33469e9Emilian Peev } 160b12fb5d4642ee1651ae4432d3bebc4b0a33469e9Emilian Peev 161b12fb5d4642ee1651ae4432d3bebc4b0a33469e9Emilian Peev return rc; 162b12fb5d4642ee1651ae4432d3bebc4b0a33469e9Emilian Peev} 163b12fb5d4642ee1651ae4432d3bebc4b0a33469e9Emilian Peev 164b12fb5d4642ee1651ae4432d3bebc4b0a33469e9Emilian PeevTEST_F(CameraZSLTests, TestAllPictureSizes) { 165b12fb5d4642ee1651ae4432d3bebc4b0a33469e9Emilian Peev ::android::binder::Status rc; 166b12fb5d4642ee1651ae4432d3bebc4b0a33469e9Emilian Peev 167b12fb5d4642ee1651ae4432d3bebc4b0a33469e9Emilian Peev for (int32_t cameraId = 0; cameraId < numCameras; cameraId++) { 168b12fb5d4642ee1651ae4432d3bebc4b0a33469e9Emilian Peev sp<Surface> previewSurface; 169b12fb5d4642ee1651ae4432d3bebc4b0a33469e9Emilian Peev sp<SurfaceControl> surfaceControl; 170b12fb5d4642ee1651ae4432d3bebc4b0a33469e9Emilian Peev sp<ICamera> cameraDevice; 171b12fb5d4642ee1651ae4432d3bebc4b0a33469e9Emilian Peev 172b12fb5d4642ee1651ae4432d3bebc4b0a33469e9Emilian Peev String16 cameraIdStr = String16(String8::format("%d", cameraId)); 173b12fb5d4642ee1651ae4432d3bebc4b0a33469e9Emilian Peev bool isSupported = false; 174b12fb5d4642ee1651ae4432d3bebc4b0a33469e9Emilian Peev rc = mCameraService->supportsCameraApi(cameraIdStr, 175b12fb5d4642ee1651ae4432d3bebc4b0a33469e9Emilian Peev hardware::ICameraService::API_VERSION_1, &isSupported); 176b12fb5d4642ee1651ae4432d3bebc4b0a33469e9Emilian Peev EXPECT_TRUE(rc.isOk()); 177b12fb5d4642ee1651ae4432d3bebc4b0a33469e9Emilian Peev 178b12fb5d4642ee1651ae4432d3bebc4b0a33469e9Emilian Peev // We only care about camera Camera1 ZSL support. 179b12fb5d4642ee1651ae4432d3bebc4b0a33469e9Emilian Peev if (!isSupported) { 180b12fb5d4642ee1651ae4432d3bebc4b0a33469e9Emilian Peev continue; 181b12fb5d4642ee1651ae4432d3bebc4b0a33469e9Emilian Peev } 182b12fb5d4642ee1651ae4432d3bebc4b0a33469e9Emilian Peev 183b12fb5d4642ee1651ae4432d3bebc4b0a33469e9Emilian Peev CameraMetadata metadata; 184b12fb5d4642ee1651ae4432d3bebc4b0a33469e9Emilian Peev rc = mCameraService->getCameraCharacteristics(cameraIdStr, &metadata); 185b12fb5d4642ee1651ae4432d3bebc4b0a33469e9Emilian Peev if (!rc.isOk()) { 186b12fb5d4642ee1651ae4432d3bebc4b0a33469e9Emilian Peev // The test is relevant only for cameras with Hal 3.x 187b12fb5d4642ee1651ae4432d3bebc4b0a33469e9Emilian Peev // support. 188b12fb5d4642ee1651ae4432d3bebc4b0a33469e9Emilian Peev continue; 189b12fb5d4642ee1651ae4432d3bebc4b0a33469e9Emilian Peev } 190b12fb5d4642ee1651ae4432d3bebc4b0a33469e9Emilian Peev EXPECT_FALSE(metadata.isEmpty()); 191b12fb5d4642ee1651ae4432d3bebc4b0a33469e9Emilian Peev camera_metadata_entry_t availableCapabilities = 192b12fb5d4642ee1651ae4432d3bebc4b0a33469e9Emilian Peev metadata.find(ANDROID_REQUEST_AVAILABLE_CAPABILITIES); 193b12fb5d4642ee1651ae4432d3bebc4b0a33469e9Emilian Peev EXPECT_TRUE(0 < availableCapabilities.count); 194b12fb5d4642ee1651ae4432d3bebc4b0a33469e9Emilian Peev bool isReprocessSupported = false; 195b12fb5d4642ee1651ae4432d3bebc4b0a33469e9Emilian Peev const uint8_t *caps = availableCapabilities.data.u8; 196b12fb5d4642ee1651ae4432d3bebc4b0a33469e9Emilian Peev for (size_t i = 0; i < availableCapabilities.count; i++) { 197b12fb5d4642ee1651ae4432d3bebc4b0a33469e9Emilian Peev if (ANDROID_REQUEST_AVAILABLE_CAPABILITIES_PRIVATE_REPROCESSING == 198b12fb5d4642ee1651ae4432d3bebc4b0a33469e9Emilian Peev caps[i]) { 199b12fb5d4642ee1651ae4432d3bebc4b0a33469e9Emilian Peev isReprocessSupported = true; 200b12fb5d4642ee1651ae4432d3bebc4b0a33469e9Emilian Peev break; 201b12fb5d4642ee1651ae4432d3bebc4b0a33469e9Emilian Peev } 202b12fb5d4642ee1651ae4432d3bebc4b0a33469e9Emilian Peev } 203b12fb5d4642ee1651ae4432d3bebc4b0a33469e9Emilian Peev if (!isReprocessSupported) { 204b12fb5d4642ee1651ae4432d3bebc4b0a33469e9Emilian Peev // ZSL relies on this feature 205b12fb5d4642ee1651ae4432d3bebc4b0a33469e9Emilian Peev continue; 206b12fb5d4642ee1651ae4432d3bebc4b0a33469e9Emilian Peev } 207b12fb5d4642ee1651ae4432d3bebc4b0a33469e9Emilian Peev 208b12fb5d4642ee1651ae4432d3bebc4b0a33469e9Emilian Peev rc = mCameraService->connect(this, cameraId, 209b12fb5d4642ee1651ae4432d3bebc4b0a33469e9Emilian Peev String16("ZSLTest"), hardware::ICameraService::USE_CALLING_UID, 210b12fb5d4642ee1651ae4432d3bebc4b0a33469e9Emilian Peev hardware::ICameraService::USE_CALLING_PID, &cameraDevice); 211b12fb5d4642ee1651ae4432d3bebc4b0a33469e9Emilian Peev EXPECT_TRUE(rc.isOk()); 212b12fb5d4642ee1651ae4432d3bebc4b0a33469e9Emilian Peev 213b12fb5d4642ee1651ae4432d3bebc4b0a33469e9Emilian Peev CameraParameters params(cameraDevice->getParameters()); 214b12fb5d4642ee1651ae4432d3bebc4b0a33469e9Emilian Peev 215b12fb5d4642ee1651ae4432d3bebc4b0a33469e9Emilian Peev String8 focusModes(params.get( 216b12fb5d4642ee1651ae4432d3bebc4b0a33469e9Emilian Peev CameraParameters::KEY_SUPPORTED_FOCUS_MODES)); 217b12fb5d4642ee1651ae4432d3bebc4b0a33469e9Emilian Peev bool isAFSupported = false; 218b12fb5d4642ee1651ae4432d3bebc4b0a33469e9Emilian Peev const char *focusMode = nullptr; 219b12fb5d4642ee1651ae4432d3bebc4b0a33469e9Emilian Peev if (focusModes.contains(CameraParameters::FOCUS_MODE_AUTO)) { 220b12fb5d4642ee1651ae4432d3bebc4b0a33469e9Emilian Peev // If supported 'auto' should be set by default 221b12fb5d4642ee1651ae4432d3bebc4b0a33469e9Emilian Peev isAFSupported = true; 222b12fb5d4642ee1651ae4432d3bebc4b0a33469e9Emilian Peev } else if (focusModes.contains( 223b12fb5d4642ee1651ae4432d3bebc4b0a33469e9Emilian Peev CameraParameters::FOCUS_MODE_CONTINUOUS_PICTURE)) { 224b12fb5d4642ee1651ae4432d3bebc4b0a33469e9Emilian Peev isAFSupported = true; 225b12fb5d4642ee1651ae4432d3bebc4b0a33469e9Emilian Peev focusMode = CameraParameters::FOCUS_MODE_CONTINUOUS_PICTURE; 226b12fb5d4642ee1651ae4432d3bebc4b0a33469e9Emilian Peev } else if (focusModes.contains( 227b12fb5d4642ee1651ae4432d3bebc4b0a33469e9Emilian Peev CameraParameters::FOCUS_MODE_CONTINUOUS_VIDEO)) { 228b12fb5d4642ee1651ae4432d3bebc4b0a33469e9Emilian Peev isAFSupported = true; 229b12fb5d4642ee1651ae4432d3bebc4b0a33469e9Emilian Peev focusMode = CameraParameters::FOCUS_MODE_CONTINUOUS_VIDEO; 230b12fb5d4642ee1651ae4432d3bebc4b0a33469e9Emilian Peev } else if (focusModes.contains(CameraParameters::FOCUS_MODE_MACRO)) { 231b12fb5d4642ee1651ae4432d3bebc4b0a33469e9Emilian Peev isAFSupported = true; 232b12fb5d4642ee1651ae4432d3bebc4b0a33469e9Emilian Peev focusMode = CameraParameters::FOCUS_MODE_MACRO; 233b12fb5d4642ee1651ae4432d3bebc4b0a33469e9Emilian Peev } 234b12fb5d4642ee1651ae4432d3bebc4b0a33469e9Emilian Peev 235b12fb5d4642ee1651ae4432d3bebc4b0a33469e9Emilian Peev if (!isAFSupported) { 236b12fb5d4642ee1651ae4432d3bebc4b0a33469e9Emilian Peev // AF state is needed 237b12fb5d4642ee1651ae4432d3bebc4b0a33469e9Emilian Peev continue; 238b12fb5d4642ee1651ae4432d3bebc4b0a33469e9Emilian Peev } 239b12fb5d4642ee1651ae4432d3bebc4b0a33469e9Emilian Peev 240b12fb5d4642ee1651ae4432d3bebc4b0a33469e9Emilian Peev if (nullptr != focusMode) { 241b12fb5d4642ee1651ae4432d3bebc4b0a33469e9Emilian Peev params.set(CameraParameters::KEY_FOCUS_MODE, focusMode); 242b12fb5d4642ee1651ae4432d3bebc4b0a33469e9Emilian Peev ASSERT_EQ(NO_ERROR, cameraDevice->setParameters(params.flatten())); 243b12fb5d4642ee1651ae4432d3bebc4b0a33469e9Emilian Peev } 244b12fb5d4642ee1651ae4432d3bebc4b0a33469e9Emilian Peev 245b12fb5d4642ee1651ae4432d3bebc4b0a33469e9Emilian Peev int previewWidth, previewHeight; 246b12fb5d4642ee1651ae4432d3bebc4b0a33469e9Emilian Peev params.getPreviewSize(&previewWidth, &previewHeight); 247b12fb5d4642ee1651ae4432d3bebc4b0a33469e9Emilian Peev ASSERT_TRUE((0 < previewWidth) && (0 < previewHeight)); 248b12fb5d4642ee1651ae4432d3bebc4b0a33469e9Emilian Peev 249b12fb5d4642ee1651ae4432d3bebc4b0a33469e9Emilian Peev surfaceControl = mComposerClient->createSurface( 250b12fb5d4642ee1651ae4432d3bebc4b0a33469e9Emilian Peev String8("Test Surface"), 251b12fb5d4642ee1651ae4432d3bebc4b0a33469e9Emilian Peev previewWidth, previewHeight, 252b12fb5d4642ee1651ae4432d3bebc4b0a33469e9Emilian Peev CameraParameters::previewFormatToEnum( 253b12fb5d4642ee1651ae4432d3bebc4b0a33469e9Emilian Peev params.getPreviewFormat()), 254b12fb5d4642ee1651ae4432d3bebc4b0a33469e9Emilian Peev GRALLOC_USAGE_HW_RENDER); 255b12fb5d4642ee1651ae4432d3bebc4b0a33469e9Emilian Peev 256b12fb5d4642ee1651ae4432d3bebc4b0a33469e9Emilian Peev ASSERT_TRUE(nullptr != surfaceControl.get()); 257b12fb5d4642ee1651ae4432d3bebc4b0a33469e9Emilian Peev ASSERT_TRUE(surfaceControl->isValid()); 258b12fb5d4642ee1651ae4432d3bebc4b0a33469e9Emilian Peev 259116c7922f7d595fe0ad9d8a6a313ee206c0117f5Robert Carr SurfaceComposerClient::Transaction{} 260116c7922f7d595fe0ad9d8a6a313ee206c0117f5Robert Carr .setLayer(surfaceControl, 0x7fffffff) 261116c7922f7d595fe0ad9d8a6a313ee206c0117f5Robert Carr .show(surfaceControl) 262116c7922f7d595fe0ad9d8a6a313ee206c0117f5Robert Carr .apply(); 263b12fb5d4642ee1651ae4432d3bebc4b0a33469e9Emilian Peev 264b12fb5d4642ee1651ae4432d3bebc4b0a33469e9Emilian Peev previewSurface = surfaceControl->getSurface(); 265b12fb5d4642ee1651ae4432d3bebc4b0a33469e9Emilian Peev ASSERT_TRUE(previewSurface != NULL); 266b12fb5d4642ee1651ae4432d3bebc4b0a33469e9Emilian Peev ASSERT_EQ(NO_ERROR, cameraDevice->setPreviewTarget( 267b12fb5d4642ee1651ae4432d3bebc4b0a33469e9Emilian Peev previewSurface->getIGraphicBufferProducer())); 268b12fb5d4642ee1651ae4432d3bebc4b0a33469e9Emilian Peev 269b12fb5d4642ee1651ae4432d3bebc4b0a33469e9Emilian Peev cameraDevice->setPreviewCallbackFlag( 270b12fb5d4642ee1651ae4432d3bebc4b0a33469e9Emilian Peev CAMERA_FRAME_CALLBACK_FLAG_CAMCORDER); 271b12fb5d4642ee1651ae4432d3bebc4b0a33469e9Emilian Peev 272b12fb5d4642ee1651ae4432d3bebc4b0a33469e9Emilian Peev Vector<Size> pictureSizes; 273b12fb5d4642ee1651ae4432d3bebc4b0a33469e9Emilian Peev params.getSupportedPictureSizes(pictureSizes); 274b12fb5d4642ee1651ae4432d3bebc4b0a33469e9Emilian Peev for (size_t i = 0; i < pictureSizes.size(); i++) { 275b12fb5d4642ee1651ae4432d3bebc4b0a33469e9Emilian Peev params.setPictureSize(pictureSizes[i].width, 276b12fb5d4642ee1651ae4432d3bebc4b0a33469e9Emilian Peev pictureSizes[i].height); 277b12fb5d4642ee1651ae4432d3bebc4b0a33469e9Emilian Peev ASSERT_EQ(NO_ERROR, cameraDevice->setParameters(params.flatten())); 278b12fb5d4642ee1651ae4432d3bebc4b0a33469e9Emilian Peev ASSERT_EQ(NO_ERROR, cameraDevice->startPreview()); 279b12fb5d4642ee1651ae4432d3bebc4b0a33469e9Emilian Peev ASSERT_EQ(NO_ERROR, waitForPreviewStart()); 280b12fb5d4642ee1651ae4432d3bebc4b0a33469e9Emilian Peev 281b12fb5d4642ee1651ae4432d3bebc4b0a33469e9Emilian Peev ASSERT_EQ(NO_ERROR, cameraDevice->autoFocus()); 282b12fb5d4642ee1651ae4432d3bebc4b0a33469e9Emilian Peev ASSERT_EQ(NO_ERROR, waitForEvent(mAutoFocusLock, 283b12fb5d4642ee1651ae4432d3bebc4b0a33469e9Emilian Peev mAutoFocusCondition, mAutoFocusMessage)); 284b12fb5d4642ee1651ae4432d3bebc4b0a33469e9Emilian Peev 285b12fb5d4642ee1651ae4432d3bebc4b0a33469e9Emilian Peev ASSERT_EQ(NO_ERROR, 286b12fb5d4642ee1651ae4432d3bebc4b0a33469e9Emilian Peev cameraDevice->takePicture(CAMERA_MSG_COMPRESSED_IMAGE)); 287b12fb5d4642ee1651ae4432d3bebc4b0a33469e9Emilian Peev ASSERT_EQ(NO_ERROR, waitForEvent(mSnapshotLock, mSnapshotCondition, 288b12fb5d4642ee1651ae4432d3bebc4b0a33469e9Emilian Peev mSnapshotNotification)); 289b12fb5d4642ee1651ae4432d3bebc4b0a33469e9Emilian Peev } 290b12fb5d4642ee1651ae4432d3bebc4b0a33469e9Emilian Peev 291b12fb5d4642ee1651ae4432d3bebc4b0a33469e9Emilian Peev cameraDevice->stopPreview(); 292b12fb5d4642ee1651ae4432d3bebc4b0a33469e9Emilian Peev rc = cameraDevice->disconnect(); 293b12fb5d4642ee1651ae4432d3bebc4b0a33469e9Emilian Peev EXPECT_TRUE(rc.isOk()); 294b12fb5d4642ee1651ae4432d3bebc4b0a33469e9Emilian Peev } 295b12fb5d4642ee1651ae4432d3bebc4b0a33469e9Emilian Peev} 296