Merge "cameraserver: Allow cameraserver HIDL interface to get provider ids with VendorTagSections."

gugelfrei
Jayant Chowdhary 6 years ago committed by Android (Google) Code Review
commit db0532ba88

@ -411,6 +411,11 @@ status_t VendorTagDescriptorCache::readFromParcel(const Parcel* parcel) {
return res; return res;
} }
const std::unordered_map<metadata_vendor_id_t, sp<android::VendorTagDescriptor>> &
VendorTagDescriptorCache::getVendorIdsAndTagDescriptors() {
return mVendorMap;
}
int VendorTagDescriptorCache::getTagCount(metadata_vendor_id_t id) const { int VendorTagDescriptorCache::getTagCount(metadata_vendor_id_t id) const {
int ret = 0; int ret = 0;
auto desc = mVendorMap.find(id); auto desc = mVendorMap.find(id);

@ -211,6 +211,9 @@ class VendorTagDescriptorCache : public Parcelable {
*/ */
void dump(int fd, int verbosity, int indentation) const; void dump(int fd, int verbosity, int indentation) const;
const std::unordered_map<metadata_vendor_id_t, sp<android::VendorTagDescriptor>> &
getVendorIdsAndTagDescriptors();
protected: protected:
std::unordered_map<metadata_vendor_id_t, sp<android::VendorTagDescriptor>> mVendorMap; std::unordered_map<metadata_vendor_id_t, sp<android::VendorTagDescriptor>> mVendorMap;
struct vendor_tag_cache_ops mVendorCacheOps; struct vendor_tag_cache_ops mVendorCacheOps;

@ -40,9 +40,11 @@ using hardware::Void;
using device::V2_0::implementation::H2BCameraDeviceCallbacks; using device::V2_0::implementation::H2BCameraDeviceCallbacks;
using device::V2_0::implementation::HidlCameraDeviceUser; using device::V2_0::implementation::HidlCameraDeviceUser;
using service::V2_0::implementation::H2BCameraServiceListener; using service::V2_0::implementation::H2BCameraServiceListener;
using HCameraMetadataType = android::frameworks::cameraservice::common::V2_0::CameraMetadataType; using HCameraMetadataType = frameworks::cameraservice::common::V2_0::CameraMetadataType;
using HVendorTag = android::frameworks::cameraservice::common::V2_0::VendorTag; using HVendorTag = frameworks::cameraservice::common::V2_0::VendorTag;
using HVendorTagSection = android::frameworks::cameraservice::common::V2_0::VendorTagSection; using HVendorTagSection = frameworks::cameraservice::common::V2_0::VendorTagSection;
using HProviderIdAndVendorTagSections =
frameworks::cameraservice::common::V2_0::ProviderIdAndVendorTagSections;
sp<HidlCameraService> gHidlCameraService; sp<HidlCameraService> gHidlCameraService;
@ -215,39 +217,50 @@ Return<HStatus> HidlCameraService::removeListener(const sp<HCameraServiceListene
} }
Return<void> HidlCameraService::getCameraVendorTagSections(getCameraVendorTagSections_cb _hidl_cb) { Return<void> HidlCameraService::getCameraVendorTagSections(getCameraVendorTagSections_cb _hidl_cb) {
hidl_vec<HVendorTagSection> hVendorTagSections; sp<VendorTagDescriptorCache> gCache = VendorTagDescriptorCache::getGlobalVendorTagCache();
// TODO: Could this be just created on the stack since we don't set it to if (gCache == nullptr) {
// global cache or anything ? _hidl_cb(HStatus::UNKNOWN_ERROR, {});
HStatus hStatus = HStatus::NO_ERROR;
sp<VendorTagDescriptor> desc = new VendorTagDescriptor();
binder::Status serviceRet = mAidlICameraService->getCameraVendorTagDescriptor(desc.get());
if (!serviceRet.isOk()) {
ALOGE("%s: Failed to get VendorTagDescriptor", __FUNCTION__);
_hidl_cb(B2HStatus(serviceRet), hVendorTagSections);
return Void(); return Void();
} }
const std::unordered_map<metadata_vendor_id_t, sp<android::VendorTagDescriptor>>
const SortedVector<String8>* sectionNames = desc->getAllSectionNames(); &vendorIdsAndTagDescs = gCache->getVendorIdsAndTagDescriptors();
size_t numSections = sectionNames->size(); if (vendorIdsAndTagDescs.size() == 0) {
std::vector<std::vector<HVendorTag>> tagsBySection(numSections); _hidl_cb(HStatus::UNKNOWN_ERROR, {});
int tagCount = desc->getTagCount(); return Void();
std::vector<uint32_t> tags(tagCount);
desc->getTagArray(tags.data());
for (int i = 0; i < tagCount; i++) {
HVendorTag vt;
vt.tagId = tags[i];
vt.tagName = desc->getTagName(tags[i]);
vt.tagType = (HCameraMetadataType) desc->getTagType(tags[i]);
ssize_t sectionIdx = desc->getSectionIndex(tags[i]);
tagsBySection[sectionIdx].push_back(vt);
} }
hVendorTagSections.resize(numSections);
for (size_t s = 0; s < numSections; s++) { hidl_vec<HProviderIdAndVendorTagSections> hTagIdsAndVendorTagSections;
hVendorTagSections[s].sectionName = (*sectionNames)[s].string(); hTagIdsAndVendorTagSections.resize(vendorIdsAndTagDescs.size());
hVendorTagSections[s].tags = tagsBySection[s]; size_t j = 0;
for (auto &vendorIdAndTagDescs : vendorIdsAndTagDescs) {
hidl_vec<HVendorTagSection> hVendorTagSections;
sp<VendorTagDescriptor> desc = vendorIdAndTagDescs.second;
const SortedVector<String8>* sectionNames = desc->getAllSectionNames();
size_t numSections = sectionNames->size();
std::vector<std::vector<HVendorTag>> tagsBySection(numSections);
int tagCount = desc->getTagCount();
std::vector<uint32_t> tags(tagCount);
desc->getTagArray(tags.data());
for (int i = 0; i < tagCount; i++) {
HVendorTag vt;
vt.tagId = tags[i];
vt.tagName = desc->getTagName(tags[i]);
vt.tagType = (HCameraMetadataType) desc->getTagType(tags[i]);
ssize_t sectionIdx = desc->getSectionIndex(tags[i]);
tagsBySection[sectionIdx].push_back(vt);
}
hVendorTagSections.resize(numSections);
for (size_t s = 0; s < numSections; s++) {
hVendorTagSections[s].sectionName = (*sectionNames)[s].string();
hVendorTagSections[s].tags = tagsBySection[s];
}
HProviderIdAndVendorTagSections &hProviderIdAndVendorTagSections =
hTagIdsAndVendorTagSections[j];
hProviderIdAndVendorTagSections.providerId = vendorIdAndTagDescs.first;
hProviderIdAndVendorTagSections.vendorTagSections = std::move(hVendorTagSections);
j++;
} }
_hidl_cb(hStatus, hVendorTagSections); _hidl_cb(HStatus::NO_ERROR, hTagIdsAndVendorTagSections);
return Void(); return Void();
} }

Loading…
Cancel
Save