1 /*
2 * Copyright (C) 2018 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 #include <android-base/properties.h>
18
19 #include <hidl/AidlCameraDeviceCallbacks.h>
20 #include <hidl/AidlCameraServiceListener.h>
21 #include <hidl/HidlCameraService.h>
22 #include <hidl/HidlCameraDeviceUser.h>
23 #include <hidl/Utils.h>
24 #include <aidl/AidlUtils.h>
25
26 #include <hidl/HidlTransportSupport.h>
27
28 #include <camera/CameraUtils.h>
29 #include <utils/AttributionAndPermissionUtils.h>
30 #include <utils/Utils.h>
31
32 namespace android {
33 namespace frameworks {
34 namespace cameraservice {
35 namespace service {
36 namespace V2_0 {
37 namespace implementation {
38
39 using frameworks::cameraservice::service::V2_0::implementation::HidlCameraService;
40 using hardware::hidl_vec;
41 using hardware::BnCameraService::ROTATION_OVERRIDE_NONE;
42 using hardware::cameraservice::utils::conversion::convertToHidl;
43 using hardware::cameraservice::utils::conversion::B2HStatus;
44 using hardware::Void;
45 using hardware::cameraservice::utils::conversion::aidl::filterVndkKeys;
46
47 using device::V2_0::implementation::H2BCameraDeviceCallbacks;
48 using device::V2_1::implementation::HidlCameraDeviceUser;
49 using service::V2_0::implementation::H2BCameraServiceListener;
50 using HCameraMetadataType = frameworks::cameraservice::common::V2_0::CameraMetadataType;
51 using HVendorTag = frameworks::cameraservice::common::V2_0::VendorTag;
52 using HVendorTagSection = frameworks::cameraservice::common::V2_0::VendorTagSection;
53 using HProviderIdAndVendorTagSections =
54 frameworks::cameraservice::common::V2_0::ProviderIdAndVendorTagSections;
55
56 sp<HidlCameraService> gHidlCameraService;
57
getInstance(android::CameraService * cs)58 sp<HidlCameraService> HidlCameraService::getInstance(android::CameraService *cs) {
59 gHidlCameraService = new HidlCameraService(cs);
60 return gHidlCameraService;
61 }
62
HidlCameraService(android::CameraService * cs)63 HidlCameraService::HidlCameraService(android::CameraService *cs) : mAidlICameraService(cs) {
64 mVndkVersion = getVNDKVersionFromProp(__ANDROID_API_FUTURE__);
65 }
66
67 Return<void>
getCameraCharacteristics(const hidl_string & cameraId,getCameraCharacteristics_cb _hidl_cb)68 HidlCameraService::getCameraCharacteristics(const hidl_string& cameraId,
69 getCameraCharacteristics_cb _hidl_cb) {
70 android::CameraMetadata cameraMetadata;
71 HStatus status = HStatus::NO_ERROR;
72 AttributionSourceState clientAttribution =
73 AttributionAndPermissionUtils::buildAttributionSource(
74 hardware::ICameraService::USE_CALLING_PID,
75 hardware::ICameraService::USE_CALLING_UID,
76 kDefaultDeviceId);
77 binder::Status serviceRet =
78 mAidlICameraService->getCameraCharacteristics(cameraId,
79 /*targetSdkVersion*/__ANDROID_API_FUTURE__, ROTATION_OVERRIDE_NONE,
80 clientAttribution, 0, &cameraMetadata);
81 HCameraMetadata hidlMetadata;
82 if (!serviceRet.isOk()) {
83 switch(serviceRet.serviceSpecificErrorCode()) {
84 // No ERROR_CAMERA_DISCONNECTED since we're in the same process.
85 case hardware::ICameraService::ERROR_ILLEGAL_ARGUMENT:
86 ALOGE("%s: Camera ID %s does not exist!", __FUNCTION__, cameraId.c_str());
87 status = HStatus::ILLEGAL_ARGUMENT;
88 break;
89 default:
90 ALOGE("Get camera characteristics from camera service failed: %s",
91 serviceRet.toString8().c_str());
92 status = B2HStatus(serviceRet);
93 }
94 _hidl_cb(status, hidlMetadata);
95 return Void();
96 }
97 if (filterVndkKeys(mVndkVersion, cameraMetadata) != OK) {
98 ALOGE("%s: Unable to filter vndk metadata keys for version %d", __FUNCTION__, mVndkVersion);
99 _hidl_cb(HStatus::UNKNOWN_ERROR, hidlMetadata);
100 return Void();
101 }
102 const camera_metadata_t *rawMetadata = cameraMetadata.getAndLock();
103 convertToHidl(rawMetadata, &hidlMetadata);
104 _hidl_cb(status, hidlMetadata);
105 cameraMetadata.unlock(rawMetadata);
106 return Void();
107 }
108
connectDevice(const sp<HCameraDeviceCallback> & hCallback,const hidl_string & cameraId,connectDevice_cb _hidl_cb)109 Return<void> HidlCameraService::connectDevice(const sp<HCameraDeviceCallback>& hCallback,
110 const hidl_string& cameraId,
111 connectDevice_cb _hidl_cb) {
112 // Here, we first get ICameraDeviceUser from mAidlICameraService, then save
113 // that interface in the newly created HidlCameraDeviceUser impl class.
114 if (mAidlICameraService == nullptr) {
115 _hidl_cb(HStatus::UNKNOWN_ERROR, nullptr);
116 return Void();
117 }
118 sp<hardware::camera2::ICameraDeviceUser> deviceRemote = nullptr;
119 // Create a hardware::camera2::ICameraDeviceCallback object which internally
120 // calls callback functions passed through hCallback.
121 sp<H2BCameraDeviceCallbacks> hybridCallbacks = new H2BCameraDeviceCallbacks(hCallback);
122 if (!hybridCallbacks->initializeLooper(mVndkVersion)) {
123 ALOGE("Unable to handle callbacks on device, cannot connect");
124 _hidl_cb(HStatus::UNKNOWN_ERROR, nullptr);
125 return Void();
126 }
127 sp<hardware::camera2::ICameraDeviceCallbacks> callbacks = hybridCallbacks;
128 AttributionSourceState clientAttribution =
129 AttributionAndPermissionUtils::buildAttributionSource(
130 hardware::ICameraService::USE_CALLING_PID,
131 hardware::ICameraService::USE_CALLING_UID,
132 kDefaultDeviceId);
133 clientAttribution.packageName = "";
134 clientAttribution.attributionTag = std::nullopt;
135 binder::Status serviceRet = mAidlICameraService->connectDeviceVendor(
136 callbacks, cameraId, 0/*oomScoreOffset*/,
137 /*targetSdkVersion*/__ANDROID_API_FUTURE__, ROTATION_OVERRIDE_NONE,
138 clientAttribution, /*devicePolicy*/0, /*sharedMode*/false, /*out*/&deviceRemote);
139 HStatus status = HStatus::NO_ERROR;
140 if (!serviceRet.isOk()) {
141 ALOGE("%s: Unable to connect to camera device", __FUNCTION__);
142 status = B2HStatus(serviceRet);
143 _hidl_cb(status, nullptr);
144 return Void();
145 }
146 // Now we create a HidlCameraDeviceUser class, store the deviceRemote in it,
147 // and return that back. All calls on that interface will be forwarded to
148 // the AIDL interface.
149 sp<HidlCameraDeviceUser> hDeviceRemote = new HidlCameraDeviceUser(deviceRemote);
150 if (!hDeviceRemote->initStatus()) {
151 ALOGE("%s: Unable to initialize camera device HIDL wrapper", __FUNCTION__);
152 _hidl_cb(HStatus::UNKNOWN_ERROR, nullptr);
153 return Void();
154 }
155 hybridCallbacks->setCaptureResultMetadataQueue(hDeviceRemote->getCaptureResultMetadataQueue());
156 _hidl_cb(status, hDeviceRemote);
157 return Void();
158 }
159
addToListenerCacheLocked(sp<HCameraServiceListener> hListener,sp<hardware::ICameraServiceListener> csListener)160 void HidlCameraService::addToListenerCacheLocked(sp<HCameraServiceListener> hListener,
161 sp<hardware::ICameraServiceListener> csListener) {
162 mListeners.emplace_back(std::make_pair(hListener, csListener));
163 }
164
165 sp<hardware::ICameraServiceListener>
searchListenerCacheLocked(sp<HCameraServiceListener> hListener,bool shouldRemove)166 HidlCameraService::searchListenerCacheLocked(sp<HCameraServiceListener> hListener,
167 bool shouldRemove) {
168 // Go through the mListeners list and compare the listener with the HIDL
169 // listener registered.
170 auto it = mListeners.begin();
171 sp<ICameraServiceListener> csListener = nullptr;
172 for (;it != mListeners.end(); it++) {
173 if (hardware::interfacesEqual(it->first, hListener)) {
174 break;
175 }
176 }
177 if (it != mListeners.end()) {
178 csListener = it->second;
179 if (shouldRemove) {
180 mListeners.erase(it);
181 }
182 }
183 return csListener;
184 }
185
addListener(const sp<HCameraServiceListener> & hCsListener,addListener_cb _hidl_cb)186 Return<void> HidlCameraService::addListener(const sp<HCameraServiceListener>& hCsListener,
187 addListener_cb _hidl_cb) {
188 std::vector<hardware::CameraStatus> cameraStatusAndIds{};
189 HStatus status = addListenerInternal<HCameraServiceListener>(
190 hCsListener, &cameraStatusAndIds);
191 if (status != HStatus::NO_ERROR) {
192 _hidl_cb(status, {});
193 return Void();
194 }
195
196 hidl_vec<HCameraStatusAndId> hCameraStatusAndIds;
197 //Convert cameraStatusAndIds to HIDL and call callback
198 convertToHidl(cameraStatusAndIds, &hCameraStatusAndIds);
199 _hidl_cb(status, hCameraStatusAndIds);
200
201 return Void();
202 }
203
addListener_2_1(const sp<HCameraServiceListener2_1> & hCsListener,addListener_2_1_cb _hidl_cb)204 Return<void> HidlCameraService::addListener_2_1(const sp<HCameraServiceListener2_1>& hCsListener,
205 addListener_2_1_cb _hidl_cb) {
206 std::vector<hardware::CameraStatus> cameraStatusAndIds{};
207 HStatus status = addListenerInternal<HCameraServiceListener2_1>(
208 hCsListener, &cameraStatusAndIds);
209 if (status != HStatus::NO_ERROR) {
210 _hidl_cb(status, {});
211 return Void();
212 }
213
214 hidl_vec<frameworks::cameraservice::service::V2_1::CameraStatusAndId> hCameraStatusAndIds;
215 //Convert cameraStatusAndIds to HIDL and call callback
216 convertToHidl(cameraStatusAndIds, &hCameraStatusAndIds);
217 _hidl_cb(status, hCameraStatusAndIds);
218
219 return Void();
220 }
221
222 template<class T>
addListenerInternal(const sp<T> & hCsListener,std::vector<hardware::CameraStatus> * cameraStatusAndIds)223 HStatus HidlCameraService::addListenerInternal(const sp<T>& hCsListener,
224 std::vector<hardware::CameraStatus>* cameraStatusAndIds) {
225 if (mAidlICameraService == nullptr) {
226 return HStatus::UNKNOWN_ERROR;
227 }
228 if (hCsListener == nullptr || cameraStatusAndIds == nullptr) {
229 ALOGE("%s listener and cameraStatusAndIds must not be NULL", __FUNCTION__);
230 return HStatus::ILLEGAL_ARGUMENT;
231 }
232 sp<hardware::ICameraServiceListener> csListener = nullptr;
233 // Check the cache for previously registered callbacks
234 {
235 Mutex::Autolock l(mListenerListLock);
236 csListener = searchListenerCacheLocked(hCsListener);
237 if (csListener == nullptr) {
238 // Wrap an hCsListener with AidlCameraServiceListener and pass it to
239 // CameraService.
240 csListener = new H2BCameraServiceListener(hCsListener);
241 // Add to cache
242 addToListenerCacheLocked(hCsListener, csListener);
243 } else {
244 ALOGE("%s: Trying to add a listener %p already registered",
245 __FUNCTION__, hCsListener.get());
246 return HStatus::ILLEGAL_ARGUMENT;
247 }
248 }
249 binder::Status serviceRet =
250 mAidlICameraService->addListenerHelper(csListener, cameraStatusAndIds, true);
251 HStatus status = HStatus::NO_ERROR;
252 if (!serviceRet.isOk()) {
253 ALOGE("%s: Unable to add camera device status listener", __FUNCTION__);
254 status = B2HStatus(serviceRet);
255 return status;
256 }
257 cameraStatusAndIds->erase(std::remove_if(cameraStatusAndIds->begin(), cameraStatusAndIds->end(),
258 [this](const hardware::CameraStatus& s) {
259 bool supportsHAL3 = false;
260 binder::Status sRet =
261 mAidlICameraService->supportsCameraApi(s.cameraId,
262 hardware::ICameraService::API_VERSION_2, &supportsHAL3);
263 return !sRet.isOk() || !supportsHAL3;
264 }), cameraStatusAndIds->end());
265
266 return HStatus::NO_ERROR;
267 }
268
removeListener(const sp<HCameraServiceListener> & hCsListener)269 Return<HStatus> HidlCameraService::removeListener(const sp<HCameraServiceListener>& hCsListener) {
270 if (hCsListener == nullptr) {
271 ALOGE("%s listener must not be NULL", __FUNCTION__);
272 return HStatus::ILLEGAL_ARGUMENT;
273 }
274 sp<ICameraServiceListener> csListener = nullptr;
275 {
276 Mutex::Autolock l(mListenerListLock);
277 csListener = searchListenerCacheLocked(hCsListener, /*removeIfFound*/true);
278 }
279 if (csListener != nullptr) {
280 mAidlICameraService->removeListener(csListener);
281 } else {
282 ALOGE("%s Removing unregistered listener %p", __FUNCTION__, hCsListener.get());
283 return HStatus::ILLEGAL_ARGUMENT;
284 }
285 return HStatus::NO_ERROR;
286 }
287
getCameraVendorTagSections(getCameraVendorTagSections_cb _hidl_cb)288 Return<void> HidlCameraService::getCameraVendorTagSections(getCameraVendorTagSections_cb _hidl_cb) {
289 sp<VendorTagDescriptorCache> gCache = VendorTagDescriptorCache::getGlobalVendorTagCache();
290 if (gCache == nullptr) {
291 _hidl_cb(HStatus::UNKNOWN_ERROR, {});
292 return Void();
293 }
294 const std::unordered_map<metadata_vendor_id_t, sp<android::VendorTagDescriptor>>
295 &vendorIdsAndTagDescs = gCache->getVendorIdsAndTagDescriptors();
296 if (vendorIdsAndTagDescs.size() == 0) {
297 _hidl_cb(HStatus::UNKNOWN_ERROR, {});
298 return Void();
299 }
300
301 hidl_vec<HProviderIdAndVendorTagSections> hTagIdsAndVendorTagSections;
302 hTagIdsAndVendorTagSections.resize(vendorIdsAndTagDescs.size());
303 size_t j = 0;
304 for (auto &vendorIdAndTagDescs : vendorIdsAndTagDescs) {
305 hidl_vec<HVendorTagSection> hVendorTagSections;
306 sp<VendorTagDescriptor> desc = vendorIdAndTagDescs.second;
307 const SortedVector<String8>* sectionNames = desc->getAllSectionNames();
308 size_t numSections = sectionNames->size();
309 std::vector<std::vector<HVendorTag>> tagsBySection(numSections);
310 int tagCount = desc->getTagCount();
311 if (tagCount <= 0) {
312 continue;
313 }
314 std::vector<uint32_t> tags(tagCount);
315 desc->getTagArray(tags.data());
316 for (int i = 0; i < tagCount; i++) {
317 HVendorTag vt;
318 vt.tagId = tags[i];
319 vt.tagName = desc->getTagName(tags[i]);
320 vt.tagType = (HCameraMetadataType) desc->getTagType(tags[i]);
321 ssize_t sectionIdx = desc->getSectionIndex(tags[i]);
322 tagsBySection[sectionIdx].push_back(vt);
323 }
324 hVendorTagSections.resize(numSections);
325 for (size_t s = 0; s < numSections; s++) {
326 hVendorTagSections[s].sectionName = (*sectionNames)[s].c_str();
327 hVendorTagSections[s].tags = tagsBySection[s];
328 }
329 HProviderIdAndVendorTagSections &hProviderIdAndVendorTagSections =
330 hTagIdsAndVendorTagSections[j];
331 hProviderIdAndVendorTagSections.providerId = vendorIdAndTagDescs.first;
332 hProviderIdAndVendorTagSections.vendorTagSections = std::move(hVendorTagSections);
333 j++;
334 }
335 _hidl_cb(HStatus::NO_ERROR, hTagIdsAndVendorTagSections);
336 return Void();
337 }
338
339 } // implementation
340 } // V2_0
341 } // service
342 } // cameraservice
343 } // frameworks
344 } // android
345
346