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