blob: 2740d09fb8311209657dd5f542f03e65789c7878 [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
Austin Borger65e64642024-06-11 15:58:23 -070022#include <android/content/AttributionSourceState.h>
Emilian Peevb12fb5d2017-01-26 13:04:06 -080023#include <binder/ProcessState.h>
24#include <utils/Errors.h>
25#include <utils/Log.h>
26#include <gui/Surface.h>
27#include <gui/SurfaceComposerClient.h>
28#include <camera/CameraParameters.h>
29#include <camera/CameraMetadata.h>
30#include <camera/Camera.h>
Biswarup Pal37a75182024-01-16 15:53:35 +000031#include <camera/CameraUtils.h>
Austin Borger1c1bee02023-06-01 16:51:35 -070032#include <camera/StringUtils.h>
Emilian Peevb12fb5d2017-01-26 13:04:06 -080033#include <android/hardware/ICameraService.h>
34
35using namespace android;
36using namespace android::hardware;
37
38class CameraZSLTests : public ::testing::Test,
39 public ::android::hardware::BnCameraClient {
40protected:
41
42 CameraZSLTests() : numCameras(0), mPreviewBufferCount(0),
43 mAutoFocusMessage(false), mSnapshotNotification(false) {}
44
45 //Gtest interface
46 void SetUp() override;
47 void TearDown() override;
48
49 //CameraClient interface
50 void notifyCallback(int32_t msgType, int32_t, int32_t) override;
51 void dataCallback(int32_t msgType, const sp<IMemory>&,
52 camera_frame_metadata_t *) override;
53 void dataCallbackTimestamp(nsecs_t, int32_t,
54 const sp<IMemory>&) override {};
55 void recordingFrameHandleCallbackTimestamp(nsecs_t,
56 native_handle_t*) override {};
Yin-Chia Yehb5df5472017-03-20 19:32:19 -070057 void recordingFrameHandleCallbackTimestampBatch(
58 const std::vector<nsecs_t>&,
59 const std::vector<native_handle_t*>&) override {};
Emilian Peevb12fb5d2017-01-26 13:04:06 -080060
61 status_t waitForPreviewStart();
62 status_t waitForEvent(Mutex &mutex, Condition &condition, bool &flag);
63
64 mutable Mutex mPreviewLock;
65 mutable Condition mPreviewCondition;
66 mutable Mutex mAutoFocusLock;
67 mutable Condition mAutoFocusCondition;
68 mutable Mutex mSnapshotLock;
69 mutable Condition mSnapshotCondition;
70
71 int32_t numCameras;
72 size_t mPreviewBufferCount;
73 sp<ICameraService> mCameraService;
74 sp<SurfaceComposerClient> mComposerClient;
75 bool mAutoFocusMessage;
76 bool mSnapshotNotification;
77 static const int32_t kPreviewThreshold = 8;
78 static const nsecs_t kPreviewTimeout = 5000000000; // 5 [s.]
79 static const nsecs_t kEventTimeout = 10000000000; // 10 [s.]
80};
81
82void CameraZSLTests::SetUp() {
83 ::android::binder::Status rc;
84 ProcessState::self()->startThreadPool();
85 sp<IServiceManager> sm = defaultServiceManager();
86 sp<IBinder> binder = sm->getService(String16("media.camera"));
87 mCameraService = interface_cast<ICameraService>(binder);
Austin Borger65e64642024-06-11 15:58:23 -070088 AttributionSourceState clientAttribution;
89 clientAttribution.deviceId = kDefaultDeviceId;
Emilian Peevb12fb5d2017-01-26 13:04:06 -080090 rc = mCameraService->getNumberOfCameras(
Austin Borger65e64642024-06-11 15:58:23 -070091 hardware::ICameraService::CAMERA_TYPE_ALL, clientAttribution, /*devicePolicy*/0,
Biswarup Pal37a75182024-01-16 15:53:35 +000092 &numCameras);
Emilian Peevb12fb5d2017-01-26 13:04:06 -080093 EXPECT_TRUE(rc.isOk());
94
95 mComposerClient = new SurfaceComposerClient;
96 ASSERT_EQ(NO_ERROR, mComposerClient->initCheck());
97}
98
99void CameraZSLTests::TearDown() {
100 mCameraService.clear();
101 mComposerClient->dispose();
102}
103
104void CameraZSLTests::notifyCallback(int32_t msgType, int32_t,
105 int32_t) {
106 if (CAMERA_MSG_FOCUS == msgType) {
107 Mutex::Autolock l(mAutoFocusLock);
108 mAutoFocusMessage = true;
109 mAutoFocusCondition.broadcast();
110 } else {
111 ALOGV("%s: msgType: %d", __FUNCTION__, msgType);
112 }
113};
114
115void CameraZSLTests::dataCallback(int32_t msgType, const sp<IMemory>& /*data*/,
116 camera_frame_metadata_t *) {
Emilian Peevb12fb5d2017-01-26 13:04:06 -0800117 switch (msgType) {
118 case CAMERA_MSG_PREVIEW_FRAME: {
119 Mutex::Autolock l(mPreviewLock);
120 mPreviewBufferCount++;
121 mPreviewCondition.broadcast();
122 break;
123 }
124 case CAMERA_MSG_COMPRESSED_IMAGE: {
125 Mutex::Autolock l(mSnapshotLock);
126 mSnapshotNotification = true;
127 //TODO: Add checks on incoming Jpeg
128 mSnapshotCondition.broadcast();
129 break;
130 }
131 default:
132 ALOGV("%s: msgType: %d", __FUNCTION__, msgType);
133 }
Biswarup Pal37a75182024-01-16 15:53:35 +0000134}
Emilian Peevb12fb5d2017-01-26 13:04:06 -0800135
136status_t CameraZSLTests::waitForPreviewStart() {
137 status_t rc = NO_ERROR;
138 Mutex::Autolock l(mPreviewLock);
139 mPreviewBufferCount = 0;
140
141 while (mPreviewBufferCount < kPreviewThreshold) {
142 rc = mPreviewCondition.waitRelative(mPreviewLock,
143 kPreviewTimeout);
144 if (NO_ERROR != rc) {
145 break;
146 }
147 }
148
149 return rc;
150}
151
152status_t CameraZSLTests::waitForEvent(Mutex &mutex,
153 Condition &condition, bool &flag) {
154 status_t rc = NO_ERROR;
155 Mutex::Autolock l(mutex);
156 flag = false;
157
158 while (!flag) {
159 rc = condition.waitRelative(mutex,
160 kEventTimeout);
161 if (NO_ERROR != rc) {
162 break;
163 }
164 }
165
166 return rc;
167}
168
169TEST_F(CameraZSLTests, TestAllPictureSizes) {
170 ::android::binder::Status rc;
171
172 for (int32_t cameraId = 0; cameraId < numCameras; cameraId++) {
173 sp<Surface> previewSurface;
174 sp<SurfaceControl> surfaceControl;
175 sp<ICamera> cameraDevice;
176
Austin Borger1c1bee02023-06-01 16:51:35 -0700177 std::string cameraIdStr = std::to_string(cameraId);
Emilian Peevb12fb5d2017-01-26 13:04:06 -0800178 bool isSupported = false;
179 rc = mCameraService->supportsCameraApi(cameraIdStr,
180 hardware::ICameraService::API_VERSION_1, &isSupported);
181 EXPECT_TRUE(rc.isOk());
182
183 // We only care about camera Camera1 ZSL support.
184 if (!isSupported) {
185 continue;
186 }
187
188 CameraMetadata metadata;
Austin Borger65e64642024-06-11 15:58:23 -0700189 AttributionSourceState clientAttribution;
190 clientAttribution.deviceId = kDefaultDeviceId;
Shuzhen Wangd4abdf72021-05-28 11:22:50 -0700191 rc = mCameraService->getCameraCharacteristics(cameraIdStr,
Austin Borger18b30a72022-10-27 12:20:29 -0700192 /*targetSdkVersion*/__ANDROID_API_FUTURE__, /*overrideToPortrait*/false,
Austin Borger65e64642024-06-11 15:58:23 -0700193 clientAttribution, /*devicePolicy*/0, &metadata);
Emilian Peevb12fb5d2017-01-26 13:04:06 -0800194 if (!rc.isOk()) {
195 // The test is relevant only for cameras with Hal 3.x
196 // support.
197 continue;
198 }
199 EXPECT_FALSE(metadata.isEmpty());
200 camera_metadata_entry_t availableCapabilities =
201 metadata.find(ANDROID_REQUEST_AVAILABLE_CAPABILITIES);
202 EXPECT_TRUE(0 < availableCapabilities.count);
203 bool isReprocessSupported = false;
204 const uint8_t *caps = availableCapabilities.data.u8;
205 for (size_t i = 0; i < availableCapabilities.count; i++) {
206 if (ANDROID_REQUEST_AVAILABLE_CAPABILITIES_PRIVATE_REPROCESSING ==
207 caps[i]) {
208 isReprocessSupported = true;
209 break;
210 }
211 }
212 if (!isReprocessSupported) {
213 // ZSL relies on this feature
214 continue;
215 }
216
Austin Borger65e64642024-06-11 15:58:23 -0700217 clientAttribution.uid = hardware::ICameraService::USE_CALLING_UID;
218 clientAttribution.pid = hardware::ICameraService::USE_CALLING_PID;
Austin Borgerd1ad6c62024-07-01 11:28:31 -0700219 clientAttribution.packageName = "ZSLTest";
Emilian Peevb12fb5d2017-01-26 13:04:06 -0800220 rc = mCameraService->connect(this, cameraId,
Austin Borgerd1ad6c62024-07-01 11:28:31 -0700221 /*targetSdkVersion*/__ANDROID_API_FUTURE__,
Austin Borger65e64642024-06-11 15:58:23 -0700222 /*overrideToPortrait*/false, /*forceSlowJpegMode*/false, clientAttribution,
Biswarup Pal37a75182024-01-16 15:53:35 +0000223 /*devicePolicy*/0, &cameraDevice);
Emilian Peevb12fb5d2017-01-26 13:04:06 -0800224 EXPECT_TRUE(rc.isOk());
225
226 CameraParameters params(cameraDevice->getParameters());
227
228 String8 focusModes(params.get(
229 CameraParameters::KEY_SUPPORTED_FOCUS_MODES));
230 bool isAFSupported = false;
231 const char *focusMode = nullptr;
232 if (focusModes.contains(CameraParameters::FOCUS_MODE_AUTO)) {
233 // If supported 'auto' should be set by default
234 isAFSupported = true;
235 } else if (focusModes.contains(
236 CameraParameters::FOCUS_MODE_CONTINUOUS_PICTURE)) {
237 isAFSupported = true;
238 focusMode = CameraParameters::FOCUS_MODE_CONTINUOUS_PICTURE;
239 } else if (focusModes.contains(
240 CameraParameters::FOCUS_MODE_CONTINUOUS_VIDEO)) {
241 isAFSupported = true;
242 focusMode = CameraParameters::FOCUS_MODE_CONTINUOUS_VIDEO;
243 } else if (focusModes.contains(CameraParameters::FOCUS_MODE_MACRO)) {
244 isAFSupported = true;
245 focusMode = CameraParameters::FOCUS_MODE_MACRO;
246 }
247
248 if (!isAFSupported) {
249 // AF state is needed
250 continue;
251 }
252
253 if (nullptr != focusMode) {
254 params.set(CameraParameters::KEY_FOCUS_MODE, focusMode);
255 ASSERT_EQ(NO_ERROR, cameraDevice->setParameters(params.flatten()));
256 }
257
258 int previewWidth, previewHeight;
259 params.getPreviewSize(&previewWidth, &previewHeight);
260 ASSERT_TRUE((0 < previewWidth) && (0 < previewHeight));
261
262 surfaceControl = mComposerClient->createSurface(
263 String8("Test Surface"),
264 previewWidth, previewHeight,
265 CameraParameters::previewFormatToEnum(
266 params.getPreviewFormat()),
267 GRALLOC_USAGE_HW_RENDER);
268
269 ASSERT_TRUE(nullptr != surfaceControl.get());
270 ASSERT_TRUE(surfaceControl->isValid());
271
Robert Carr116c7922017-08-31 15:58:36 -0700272 SurfaceComposerClient::Transaction{}
273 .setLayer(surfaceControl, 0x7fffffff)
274 .show(surfaceControl)
275 .apply();
Emilian Peevb12fb5d2017-01-26 13:04:06 -0800276
277 previewSurface = surfaceControl->getSurface();
278 ASSERT_TRUE(previewSurface != NULL);
279 ASSERT_EQ(NO_ERROR, cameraDevice->setPreviewTarget(
280 previewSurface->getIGraphicBufferProducer()));
281
282 cameraDevice->setPreviewCallbackFlag(
283 CAMERA_FRAME_CALLBACK_FLAG_CAMCORDER);
284
285 Vector<Size> pictureSizes;
286 params.getSupportedPictureSizes(pictureSizes);
287 for (size_t i = 0; i < pictureSizes.size(); i++) {
288 params.setPictureSize(pictureSizes[i].width,
289 pictureSizes[i].height);
290 ASSERT_EQ(NO_ERROR, cameraDevice->setParameters(params.flatten()));
291 ASSERT_EQ(NO_ERROR, cameraDevice->startPreview());
292 ASSERT_EQ(NO_ERROR, waitForPreviewStart());
293
294 ASSERT_EQ(NO_ERROR, cameraDevice->autoFocus());
295 ASSERT_EQ(NO_ERROR, waitForEvent(mAutoFocusLock,
296 mAutoFocusCondition, mAutoFocusMessage));
297
298 ASSERT_EQ(NO_ERROR,
299 cameraDevice->takePicture(CAMERA_MSG_COMPRESSED_IMAGE));
300 ASSERT_EQ(NO_ERROR, waitForEvent(mSnapshotLock, mSnapshotCondition,
301 mSnapshotNotification));
302 }
303
304 cameraDevice->stopPreview();
305 rc = cameraDevice->disconnect();
306 EXPECT_TRUE(rc.isOk());
307 }
308}