xref: /aosp_15_r20/cts/tests/tests/graphics/jni/CameraTestHelpers.cpp (revision b7c941bb3fa97aba169d73cee0bed2de8ac964bf)
1*b7c941bbSAndroid Build Coastguard Worker /*
2*b7c941bbSAndroid Build Coastguard Worker  * Copyright 2018 The Android Open Source Project
3*b7c941bbSAndroid Build Coastguard Worker  *
4*b7c941bbSAndroid Build Coastguard Worker  * Licensed under the Apache License, Version 2.0 (the "License");
5*b7c941bbSAndroid Build Coastguard Worker  * you may not use this file except in compliance with the License.
6*b7c941bbSAndroid Build Coastguard Worker  * You may obtain a copy of the License at
7*b7c941bbSAndroid Build Coastguard Worker  *
8*b7c941bbSAndroid Build Coastguard Worker  *      http://www.apache.org/licenses/LICENSE-2.0
9*b7c941bbSAndroid Build Coastguard Worker  *
10*b7c941bbSAndroid Build Coastguard Worker  * Unless required by applicable law or agreed to in writing, software
11*b7c941bbSAndroid Build Coastguard Worker  * distributed under the License is distributed on an "AS IS" BASIS,
12*b7c941bbSAndroid Build Coastguard Worker  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13*b7c941bbSAndroid Build Coastguard Worker  * See the License for the specific language governing permissions and
14*b7c941bbSAndroid Build Coastguard Worker  * limitations under the License.
15*b7c941bbSAndroid Build Coastguard Worker  *
16*b7c941bbSAndroid Build Coastguard Worker  */
17*b7c941bbSAndroid Build Coastguard Worker 
18*b7c941bbSAndroid Build Coastguard Worker #define LOG_TAG "CameraTestHelpers"
19*b7c941bbSAndroid Build Coastguard Worker 
20*b7c941bbSAndroid Build Coastguard Worker #include "CameraTestHelpers.h"
21*b7c941bbSAndroid Build Coastguard Worker 
22*b7c941bbSAndroid Build Coastguard Worker #include <android/log.h>
23*b7c941bbSAndroid Build Coastguard Worker 
24*b7c941bbSAndroid Build Coastguard Worker #define ALOGI(...) __android_log_print(ANDROID_LOG_INFO, LOG_TAG, __VA_ARGS__)
25*b7c941bbSAndroid Build Coastguard Worker #define ALOGW(...) __android_log_print(ANDROID_LOG_WARN, LOG_TAG, __VA_ARGS__)
26*b7c941bbSAndroid Build Coastguard Worker #define ALOGE(...) __android_log_print(ANDROID_LOG_ERROR, LOG_TAG, __VA_ARGS__)
27*b7c941bbSAndroid Build Coastguard Worker 
~CameraHelper()28*b7c941bbSAndroid Build Coastguard Worker CameraHelper::~CameraHelper() { closeCamera(); }
29*b7c941bbSAndroid Build Coastguard Worker 
initCamera(ANativeWindow * imgReaderAnw)30*b7c941bbSAndroid Build Coastguard Worker int CameraHelper::initCamera(ANativeWindow *imgReaderAnw) {
31*b7c941bbSAndroid Build Coastguard Worker   if (imgReaderAnw == nullptr) {
32*b7c941bbSAndroid Build Coastguard Worker     ALOGE("Cannot initialize camera before image reader get initialized.");
33*b7c941bbSAndroid Build Coastguard Worker     return -1;
34*b7c941bbSAndroid Build Coastguard Worker   }
35*b7c941bbSAndroid Build Coastguard Worker 
36*b7c941bbSAndroid Build Coastguard Worker   mImgReaderAnw = imgReaderAnw;
37*b7c941bbSAndroid Build Coastguard Worker   mCameraManager = ACameraManager_create();
38*b7c941bbSAndroid Build Coastguard Worker   if (mCameraManager == nullptr) {
39*b7c941bbSAndroid Build Coastguard Worker     ALOGE("Failed to create ACameraManager.");
40*b7c941bbSAndroid Build Coastguard Worker     return -1;
41*b7c941bbSAndroid Build Coastguard Worker   }
42*b7c941bbSAndroid Build Coastguard Worker 
43*b7c941bbSAndroid Build Coastguard Worker   int ret = ACameraManager_getCameraIdList(mCameraManager, &mCameraIdList);
44*b7c941bbSAndroid Build Coastguard Worker   if (ret != AMEDIA_OK) {
45*b7c941bbSAndroid Build Coastguard Worker     ALOGE("Failed to get cameraIdList: ret=%d", ret);
46*b7c941bbSAndroid Build Coastguard Worker     return ret;
47*b7c941bbSAndroid Build Coastguard Worker   }
48*b7c941bbSAndroid Build Coastguard Worker   if (mCameraIdList->numCameras < 1) {
49*b7c941bbSAndroid Build Coastguard Worker     ALOGW("Device has no NDK compatible camera.");
50*b7c941bbSAndroid Build Coastguard Worker     return 0;
51*b7c941bbSAndroid Build Coastguard Worker   }
52*b7c941bbSAndroid Build Coastguard Worker   ALOGI("Found %d camera(s).", mCameraIdList->numCameras);
53*b7c941bbSAndroid Build Coastguard Worker 
54*b7c941bbSAndroid Build Coastguard Worker   // We always use the first camera.
55*b7c941bbSAndroid Build Coastguard Worker   mCameraId = mCameraIdList->cameraIds[0];
56*b7c941bbSAndroid Build Coastguard Worker   if (mCameraId == nullptr) {
57*b7c941bbSAndroid Build Coastguard Worker     ALOGE("Failed to get cameraId.");
58*b7c941bbSAndroid Build Coastguard Worker     return -1;
59*b7c941bbSAndroid Build Coastguard Worker   }
60*b7c941bbSAndroid Build Coastguard Worker 
61*b7c941bbSAndroid Build Coastguard Worker   ret = ACameraManager_openCamera(mCameraManager, mCameraId, &mDeviceCb,
62*b7c941bbSAndroid Build Coastguard Worker                                   &mDevice);
63*b7c941bbSAndroid Build Coastguard Worker   if (ret != AMEDIA_OK || mDevice == nullptr) {
64*b7c941bbSAndroid Build Coastguard Worker     ALOGE("Failed to open camera, ret=%d, mDevice=%p.", ret, mDevice);
65*b7c941bbSAndroid Build Coastguard Worker     return -1;
66*b7c941bbSAndroid Build Coastguard Worker   }
67*b7c941bbSAndroid Build Coastguard Worker 
68*b7c941bbSAndroid Build Coastguard Worker   ret = ACameraManager_getCameraCharacteristics(mCameraManager, mCameraId,
69*b7c941bbSAndroid Build Coastguard Worker                                                 &mCameraMetadata);
70*b7c941bbSAndroid Build Coastguard Worker   if (ret != ACAMERA_OK || mCameraMetadata == nullptr) {
71*b7c941bbSAndroid Build Coastguard Worker     ALOGE("Get camera %s characteristics failure. ret %d, metadata %p",
72*b7c941bbSAndroid Build Coastguard Worker           mCameraId, ret, mCameraMetadata);
73*b7c941bbSAndroid Build Coastguard Worker     return -1;
74*b7c941bbSAndroid Build Coastguard Worker   }
75*b7c941bbSAndroid Build Coastguard Worker 
76*b7c941bbSAndroid Build Coastguard Worker   if (!isCapabilitySupported(
77*b7c941bbSAndroid Build Coastguard Worker           ACAMERA_REQUEST_AVAILABLE_CAPABILITIES_BACKWARD_COMPATIBLE)) {
78*b7c941bbSAndroid Build Coastguard Worker     ALOGW("Camera does not support BACKWARD_COMPATIBLE.");
79*b7c941bbSAndroid Build Coastguard Worker     return 0;
80*b7c941bbSAndroid Build Coastguard Worker   }
81*b7c941bbSAndroid Build Coastguard Worker 
82*b7c941bbSAndroid Build Coastguard Worker   // Create capture session
83*b7c941bbSAndroid Build Coastguard Worker   ret = ACaptureSessionOutputContainer_create(&mOutputs);
84*b7c941bbSAndroid Build Coastguard Worker   if (ret != AMEDIA_OK) {
85*b7c941bbSAndroid Build Coastguard Worker     ALOGE("ACaptureSessionOutputContainer_create failed, ret=%d", ret);
86*b7c941bbSAndroid Build Coastguard Worker     return ret;
87*b7c941bbSAndroid Build Coastguard Worker   }
88*b7c941bbSAndroid Build Coastguard Worker   ret = ACaptureSessionOutput_create(mImgReaderAnw, &mImgReaderOutput);
89*b7c941bbSAndroid Build Coastguard Worker   if (ret != AMEDIA_OK) {
90*b7c941bbSAndroid Build Coastguard Worker     ALOGE("ACaptureSessionOutput_create failed, ret=%d", ret);
91*b7c941bbSAndroid Build Coastguard Worker     return ret;
92*b7c941bbSAndroid Build Coastguard Worker   }
93*b7c941bbSAndroid Build Coastguard Worker   ret = ACaptureSessionOutputContainer_add(mOutputs, mImgReaderOutput);
94*b7c941bbSAndroid Build Coastguard Worker   if (ret != AMEDIA_OK) {
95*b7c941bbSAndroid Build Coastguard Worker     ALOGE("ACaptureSessionOutputContainer_add failed, ret=%d", ret);
96*b7c941bbSAndroid Build Coastguard Worker     return ret;
97*b7c941bbSAndroid Build Coastguard Worker   }
98*b7c941bbSAndroid Build Coastguard Worker   ret = ACameraDevice_createCaptureSession(mDevice, mOutputs, &mSessionCb,
99*b7c941bbSAndroid Build Coastguard Worker                                            &mSession);
100*b7c941bbSAndroid Build Coastguard Worker   if (ret != AMEDIA_OK) {
101*b7c941bbSAndroid Build Coastguard Worker     ALOGE("ACameraDevice_createCaptureSession failed, ret=%d", ret);
102*b7c941bbSAndroid Build Coastguard Worker     return ret;
103*b7c941bbSAndroid Build Coastguard Worker   }
104*b7c941bbSAndroid Build Coastguard Worker 
105*b7c941bbSAndroid Build Coastguard Worker   // Create capture request
106*b7c941bbSAndroid Build Coastguard Worker   ret = ACameraDevice_createCaptureRequest(mDevice, TEMPLATE_RECORD,
107*b7c941bbSAndroid Build Coastguard Worker                                            &mCaptureRequest);
108*b7c941bbSAndroid Build Coastguard Worker   if (ret != AMEDIA_OK) {
109*b7c941bbSAndroid Build Coastguard Worker     ALOGE("ACameraDevice_createCaptureRequest failed, ret=%d", ret);
110*b7c941bbSAndroid Build Coastguard Worker     return ret;
111*b7c941bbSAndroid Build Coastguard Worker   }
112*b7c941bbSAndroid Build Coastguard Worker   ret = ACameraOutputTarget_create(mImgReaderAnw, &mReqImgReaderOutput);
113*b7c941bbSAndroid Build Coastguard Worker   if (ret != AMEDIA_OK) {
114*b7c941bbSAndroid Build Coastguard Worker     ALOGE("ACameraOutputTarget_create failed, ret=%d", ret);
115*b7c941bbSAndroid Build Coastguard Worker     return ret;
116*b7c941bbSAndroid Build Coastguard Worker   }
117*b7c941bbSAndroid Build Coastguard Worker   ret = ACaptureRequest_addTarget(mCaptureRequest, mReqImgReaderOutput);
118*b7c941bbSAndroid Build Coastguard Worker   if (ret != AMEDIA_OK) {
119*b7c941bbSAndroid Build Coastguard Worker     ALOGE("ACaptureRequest_addTarget failed, ret=%d", ret);
120*b7c941bbSAndroid Build Coastguard Worker     return ret;
121*b7c941bbSAndroid Build Coastguard Worker   }
122*b7c941bbSAndroid Build Coastguard Worker 
123*b7c941bbSAndroid Build Coastguard Worker   mIsCameraReady = true;
124*b7c941bbSAndroid Build Coastguard Worker   return 0;
125*b7c941bbSAndroid Build Coastguard Worker }
126*b7c941bbSAndroid Build Coastguard Worker 
isCapabilitySupported(acamera_metadata_enum_android_request_available_capabilities_t cap)127*b7c941bbSAndroid Build Coastguard Worker bool CameraHelper::isCapabilitySupported(
128*b7c941bbSAndroid Build Coastguard Worker     acamera_metadata_enum_android_request_available_capabilities_t cap) {
129*b7c941bbSAndroid Build Coastguard Worker   ACameraMetadata_const_entry entry;
130*b7c941bbSAndroid Build Coastguard Worker   ACameraMetadata_getConstEntry(mCameraMetadata,
131*b7c941bbSAndroid Build Coastguard Worker                                 ACAMERA_REQUEST_AVAILABLE_CAPABILITIES, &entry);
132*b7c941bbSAndroid Build Coastguard Worker   for (uint32_t i = 0; i < entry.count; i++) {
133*b7c941bbSAndroid Build Coastguard Worker     if (entry.data.u8[i] == cap) {
134*b7c941bbSAndroid Build Coastguard Worker       return true;
135*b7c941bbSAndroid Build Coastguard Worker     }
136*b7c941bbSAndroid Build Coastguard Worker   }
137*b7c941bbSAndroid Build Coastguard Worker   return false;
138*b7c941bbSAndroid Build Coastguard Worker }
139*b7c941bbSAndroid Build Coastguard Worker 
closeCamera()140*b7c941bbSAndroid Build Coastguard Worker void CameraHelper::closeCamera() {
141*b7c941bbSAndroid Build Coastguard Worker   // Destroy capture request
142*b7c941bbSAndroid Build Coastguard Worker   if (mReqImgReaderOutput) {
143*b7c941bbSAndroid Build Coastguard Worker     ACameraOutputTarget_free(mReqImgReaderOutput);
144*b7c941bbSAndroid Build Coastguard Worker     mReqImgReaderOutput = nullptr;
145*b7c941bbSAndroid Build Coastguard Worker   }
146*b7c941bbSAndroid Build Coastguard Worker   if (mCaptureRequest) {
147*b7c941bbSAndroid Build Coastguard Worker     ACaptureRequest_free(mCaptureRequest);
148*b7c941bbSAndroid Build Coastguard Worker     mCaptureRequest = nullptr;
149*b7c941bbSAndroid Build Coastguard Worker   }
150*b7c941bbSAndroid Build Coastguard Worker   // Destroy capture session
151*b7c941bbSAndroid Build Coastguard Worker   if (mSession != nullptr) {
152*b7c941bbSAndroid Build Coastguard Worker     ACameraCaptureSession_close(mSession);
153*b7c941bbSAndroid Build Coastguard Worker     mSession = nullptr;
154*b7c941bbSAndroid Build Coastguard Worker   }
155*b7c941bbSAndroid Build Coastguard Worker   if (mImgReaderOutput) {
156*b7c941bbSAndroid Build Coastguard Worker     ACaptureSessionOutput_free(mImgReaderOutput);
157*b7c941bbSAndroid Build Coastguard Worker     mImgReaderOutput = nullptr;
158*b7c941bbSAndroid Build Coastguard Worker   }
159*b7c941bbSAndroid Build Coastguard Worker   if (mOutputs) {
160*b7c941bbSAndroid Build Coastguard Worker     ACaptureSessionOutputContainer_free(mOutputs);
161*b7c941bbSAndroid Build Coastguard Worker     mOutputs = nullptr;
162*b7c941bbSAndroid Build Coastguard Worker   }
163*b7c941bbSAndroid Build Coastguard Worker   // Destroy camera device
164*b7c941bbSAndroid Build Coastguard Worker   if (mDevice) {
165*b7c941bbSAndroid Build Coastguard Worker     ACameraDevice_close(mDevice);
166*b7c941bbSAndroid Build Coastguard Worker     mDevice = nullptr;
167*b7c941bbSAndroid Build Coastguard Worker   }
168*b7c941bbSAndroid Build Coastguard Worker   if (mCameraMetadata) {
169*b7c941bbSAndroid Build Coastguard Worker     ACameraMetadata_free(mCameraMetadata);
170*b7c941bbSAndroid Build Coastguard Worker     mCameraMetadata = nullptr;
171*b7c941bbSAndroid Build Coastguard Worker   }
172*b7c941bbSAndroid Build Coastguard Worker   // Destroy camera manager
173*b7c941bbSAndroid Build Coastguard Worker   if (mCameraIdList) {
174*b7c941bbSAndroid Build Coastguard Worker     ACameraManager_deleteCameraIdList(mCameraIdList);
175*b7c941bbSAndroid Build Coastguard Worker     mCameraIdList = nullptr;
176*b7c941bbSAndroid Build Coastguard Worker   }
177*b7c941bbSAndroid Build Coastguard Worker   if (mCameraManager) {
178*b7c941bbSAndroid Build Coastguard Worker     ACameraManager_delete(mCameraManager);
179*b7c941bbSAndroid Build Coastguard Worker     mCameraManager = nullptr;
180*b7c941bbSAndroid Build Coastguard Worker   }
181*b7c941bbSAndroid Build Coastguard Worker   mIsCameraReady = false;
182*b7c941bbSAndroid Build Coastguard Worker }
183*b7c941bbSAndroid Build Coastguard Worker 
takePicture()184*b7c941bbSAndroid Build Coastguard Worker int CameraHelper::takePicture() {
185*b7c941bbSAndroid Build Coastguard Worker   return ACameraCaptureSession_capture(mSession, nullptr, 1, &mCaptureRequest,
186*b7c941bbSAndroid Build Coastguard Worker                                        nullptr);
187*b7c941bbSAndroid Build Coastguard Worker }
188