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