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