14d453830b6a8fb7571a88a9a241eabd50a483c44Eino-Ville Talvala/* 24d453830b6a8fb7571a88a9a241eabd50a483c44Eino-Ville Talvala * Copyright (C) 2016 The Android Open Source Project 34d453830b6a8fb7571a88a9a241eabd50a483c44Eino-Ville Talvala * 44d453830b6a8fb7571a88a9a241eabd50a483c44Eino-Ville Talvala * Licensed under the Apache License, Version 2.0 (the "License"); 54d453830b6a8fb7571a88a9a241eabd50a483c44Eino-Ville Talvala * you may not use this file except in compliance with the License. 64d453830b6a8fb7571a88a9a241eabd50a483c44Eino-Ville Talvala * You may obtain a copy of the License at 74d453830b6a8fb7571a88a9a241eabd50a483c44Eino-Ville Talvala * 84d453830b6a8fb7571a88a9a241eabd50a483c44Eino-Ville Talvala * http://www.apache.org/licenses/LICENSE-2.0 94d453830b6a8fb7571a88a9a241eabd50a483c44Eino-Ville Talvala * 104d453830b6a8fb7571a88a9a241eabd50a483c44Eino-Ville Talvala * Unless required by applicable law or agreed to in writing, software 114d453830b6a8fb7571a88a9a241eabd50a483c44Eino-Ville Talvala * distributed under the License is distributed on an "AS IS" BASIS, 124d453830b6a8fb7571a88a9a241eabd50a483c44Eino-Ville Talvala * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 134d453830b6a8fb7571a88a9a241eabd50a483c44Eino-Ville Talvala * See the License for the specific language governing permissions and 144d453830b6a8fb7571a88a9a241eabd50a483c44Eino-Ville Talvala * limitations under the License. 154d453830b6a8fb7571a88a9a241eabd50a483c44Eino-Ville Talvala */ 164d453830b6a8fb7571a88a9a241eabd50a483c44Eino-Ville Talvala 174d453830b6a8fb7571a88a9a241eabd50a483c44Eino-Ville Talvala#define LOG_TAG "Camera3-TagMonitor" 184d453830b6a8fb7571a88a9a241eabd50a483c44Eino-Ville Talvala#define ATRACE_TAG ATRACE_TAG_CAMERA 194d453830b6a8fb7571a88a9a241eabd50a483c44Eino-Ville Talvala//#define LOG_NDEBUG 0 204d453830b6a8fb7571a88a9a241eabd50a483c44Eino-Ville Talvala 214d453830b6a8fb7571a88a9a241eabd50a483c44Eino-Ville Talvala#include "TagMonitor.h" 224d453830b6a8fb7571a88a9a241eabd50a483c44Eino-Ville Talvala 234d453830b6a8fb7571a88a9a241eabd50a483c44Eino-Ville Talvala#include <inttypes.h> 244d453830b6a8fb7571a88a9a241eabd50a483c44Eino-Ville Talvala#include <utils/Log.h> 254d453830b6a8fb7571a88a9a241eabd50a483c44Eino-Ville Talvala#include <camera/VendorTagDescriptor.h> 2671c73a2985a7ac65ee597be3441ab300fa56e22eEmilian Peev#include <camera_metadata_hidden.h> 274d453830b6a8fb7571a88a9a241eabd50a483c44Eino-Ville Talvala 284d453830b6a8fb7571a88a9a241eabd50a483c44Eino-Ville Talvalanamespace android { 294d453830b6a8fb7571a88a9a241eabd50a483c44Eino-Ville Talvala 304d453830b6a8fb7571a88a9a241eabd50a483c44Eino-Ville TalvalaTagMonitor::TagMonitor(): 314d453830b6a8fb7571a88a9a241eabd50a483c44Eino-Ville Talvala mMonitoringEnabled(false), 3271c73a2985a7ac65ee597be3441ab300fa56e22eEmilian Peev mMonitoringEvents(kMaxMonitorEvents), 3371c73a2985a7ac65ee597be3441ab300fa56e22eEmilian Peev mVendorTagId(CAMERA_METADATA_INVALID_VENDOR_ID) 344d453830b6a8fb7571a88a9a241eabd50a483c44Eino-Ville Talvala{} 354d453830b6a8fb7571a88a9a241eabd50a483c44Eino-Ville Talvala 364d453830b6a8fb7571a88a9a241eabd50a483c44Eino-Ville Talvalaconst char* TagMonitor::k3aTags = 374d453830b6a8fb7571a88a9a241eabd50a483c44Eino-Ville Talvala "android.control.aeMode, android.control.afMode, android.control.awbMode," 384d453830b6a8fb7571a88a9a241eabd50a483c44Eino-Ville Talvala "android.control.aeState, android.control.afState, android.control.awbState," 394d453830b6a8fb7571a88a9a241eabd50a483c44Eino-Ville Talvala "android.control.aePrecaptureTrigger, android.control.afTrigger," 404d453830b6a8fb7571a88a9a241eabd50a483c44Eino-Ville Talvala "android.control.aeRegions, android.control.awbRegions, android.control.afRegions," 414d453830b6a8fb7571a88a9a241eabd50a483c44Eino-Ville Talvala "android.control.aeExposureCompensation, android.control.aeLock, android.control.awbLock," 424d453830b6a8fb7571a88a9a241eabd50a483c44Eino-Ville Talvala "android.control.aeAntibandingMode, android.control.aeTargetFpsRange," 434d453830b6a8fb7571a88a9a241eabd50a483c44Eino-Ville Talvala "android.control.effectMode, android.control.mode, android.control.sceneMode," 444d453830b6a8fb7571a88a9a241eabd50a483c44Eino-Ville Talvala "android.control.videoStabilizationMode"; 454d453830b6a8fb7571a88a9a241eabd50a483c44Eino-Ville Talvala 464d453830b6a8fb7571a88a9a241eabd50a483c44Eino-Ville Talvalavoid TagMonitor::parseTagsToMonitor(String8 tagNames) { 474d453830b6a8fb7571a88a9a241eabd50a483c44Eino-Ville Talvala std::lock_guard<std::mutex> lock(mMonitorMutex); 484d453830b6a8fb7571a88a9a241eabd50a483c44Eino-Ville Talvala 494d453830b6a8fb7571a88a9a241eabd50a483c44Eino-Ville Talvala // Expand shorthands 504d453830b6a8fb7571a88a9a241eabd50a483c44Eino-Ville Talvala if (ssize_t idx = tagNames.find("3a") != -1) { 514d453830b6a8fb7571a88a9a241eabd50a483c44Eino-Ville Talvala ssize_t end = tagNames.find(",", idx); 524d453830b6a8fb7571a88a9a241eabd50a483c44Eino-Ville Talvala char* start = tagNames.lockBuffer(tagNames.size()); 534d453830b6a8fb7571a88a9a241eabd50a483c44Eino-Ville Talvala start[idx] = '\0'; 544d453830b6a8fb7571a88a9a241eabd50a483c44Eino-Ville Talvala char* rest = (end != -1) ? (start + end) : (start + tagNames.size()); 554d453830b6a8fb7571a88a9a241eabd50a483c44Eino-Ville Talvala tagNames = String8::format("%s%s%s", start, k3aTags, rest); 564d453830b6a8fb7571a88a9a241eabd50a483c44Eino-Ville Talvala } 574d453830b6a8fb7571a88a9a241eabd50a483c44Eino-Ville Talvala 584d453830b6a8fb7571a88a9a241eabd50a483c44Eino-Ville Talvala sp<VendorTagDescriptor> vTags = 594d453830b6a8fb7571a88a9a241eabd50a483c44Eino-Ville Talvala VendorTagDescriptor::getGlobalVendorTagDescriptor(); 6071c73a2985a7ac65ee597be3441ab300fa56e22eEmilian Peev if ((nullptr == vTags.get()) || (0 >= vTags->getTagCount())) { 6171c73a2985a7ac65ee597be3441ab300fa56e22eEmilian Peev sp<VendorTagDescriptorCache> cache = 6271c73a2985a7ac65ee597be3441ab300fa56e22eEmilian Peev VendorTagDescriptorCache::getGlobalVendorTagCache(); 6371c73a2985a7ac65ee597be3441ab300fa56e22eEmilian Peev if (cache.get()) { 6471c73a2985a7ac65ee597be3441ab300fa56e22eEmilian Peev cache->getVendorTagDescriptor(mVendorTagId, &vTags); 6571c73a2985a7ac65ee597be3441ab300fa56e22eEmilian Peev } 6671c73a2985a7ac65ee597be3441ab300fa56e22eEmilian Peev } 674d453830b6a8fb7571a88a9a241eabd50a483c44Eino-Ville Talvala 684d453830b6a8fb7571a88a9a241eabd50a483c44Eino-Ville Talvala bool gotTag = false; 694d453830b6a8fb7571a88a9a241eabd50a483c44Eino-Ville Talvala 704d453830b6a8fb7571a88a9a241eabd50a483c44Eino-Ville Talvala char *tokenized = tagNames.lockBuffer(tagNames.size()); 714d453830b6a8fb7571a88a9a241eabd50a483c44Eino-Ville Talvala char *savePtr; 724d453830b6a8fb7571a88a9a241eabd50a483c44Eino-Ville Talvala char *nextTagName = strtok_r(tokenized, ", ", &savePtr); 734d453830b6a8fb7571a88a9a241eabd50a483c44Eino-Ville Talvala while (nextTagName != nullptr) { 744d453830b6a8fb7571a88a9a241eabd50a483c44Eino-Ville Talvala uint32_t tag; 754d453830b6a8fb7571a88a9a241eabd50a483c44Eino-Ville Talvala status_t res = CameraMetadata::getTagFromName(nextTagName, vTags.get(), &tag); 764d453830b6a8fb7571a88a9a241eabd50a483c44Eino-Ville Talvala if (res != OK) { 774d453830b6a8fb7571a88a9a241eabd50a483c44Eino-Ville Talvala ALOGW("%s: Unknown tag %s, ignoring", __FUNCTION__, nextTagName); 784d453830b6a8fb7571a88a9a241eabd50a483c44Eino-Ville Talvala } else { 794d453830b6a8fb7571a88a9a241eabd50a483c44Eino-Ville Talvala if (!gotTag) { 804d453830b6a8fb7571a88a9a241eabd50a483c44Eino-Ville Talvala mMonitoredTagList.clear(); 814d453830b6a8fb7571a88a9a241eabd50a483c44Eino-Ville Talvala gotTag = true; 824d453830b6a8fb7571a88a9a241eabd50a483c44Eino-Ville Talvala } 834d453830b6a8fb7571a88a9a241eabd50a483c44Eino-Ville Talvala mMonitoredTagList.push_back(tag); 844d453830b6a8fb7571a88a9a241eabd50a483c44Eino-Ville Talvala } 854d453830b6a8fb7571a88a9a241eabd50a483c44Eino-Ville Talvala nextTagName = strtok_r(nullptr, ", ", &savePtr); 864d453830b6a8fb7571a88a9a241eabd50a483c44Eino-Ville Talvala } 874d453830b6a8fb7571a88a9a241eabd50a483c44Eino-Ville Talvala 884d453830b6a8fb7571a88a9a241eabd50a483c44Eino-Ville Talvala tagNames.unlockBuffer(); 894d453830b6a8fb7571a88a9a241eabd50a483c44Eino-Ville Talvala 904d453830b6a8fb7571a88a9a241eabd50a483c44Eino-Ville Talvala if (gotTag) { 914d453830b6a8fb7571a88a9a241eabd50a483c44Eino-Ville Talvala // Got at least one new tag 924d453830b6a8fb7571a88a9a241eabd50a483c44Eino-Ville Talvala mMonitoringEnabled = true; 934d453830b6a8fb7571a88a9a241eabd50a483c44Eino-Ville Talvala } 944d453830b6a8fb7571a88a9a241eabd50a483c44Eino-Ville Talvala} 954d453830b6a8fb7571a88a9a241eabd50a483c44Eino-Ville Talvala 964d453830b6a8fb7571a88a9a241eabd50a483c44Eino-Ville Talvalavoid TagMonitor::disableMonitoring() { 974d453830b6a8fb7571a88a9a241eabd50a483c44Eino-Ville Talvala mMonitoringEnabled = false; 984d453830b6a8fb7571a88a9a241eabd50a483c44Eino-Ville Talvala mLastMonitoredRequestValues.clear(); 994d453830b6a8fb7571a88a9a241eabd50a483c44Eino-Ville Talvala mLastMonitoredResultValues.clear(); 1004d453830b6a8fb7571a88a9a241eabd50a483c44Eino-Ville Talvala} 1014d453830b6a8fb7571a88a9a241eabd50a483c44Eino-Ville Talvala 1024d453830b6a8fb7571a88a9a241eabd50a483c44Eino-Ville Talvalavoid TagMonitor::monitorMetadata(eventSource source, int64_t frameNumber, nsecs_t timestamp, 1034d453830b6a8fb7571a88a9a241eabd50a483c44Eino-Ville Talvala const CameraMetadata& metadata) { 1044d453830b6a8fb7571a88a9a241eabd50a483c44Eino-Ville Talvala if (!mMonitoringEnabled) return; 1054d453830b6a8fb7571a88a9a241eabd50a483c44Eino-Ville Talvala 1064d453830b6a8fb7571a88a9a241eabd50a483c44Eino-Ville Talvala std::lock_guard<std::mutex> lock(mMonitorMutex); 1074d453830b6a8fb7571a88a9a241eabd50a483c44Eino-Ville Talvala 1084d453830b6a8fb7571a88a9a241eabd50a483c44Eino-Ville Talvala if (timestamp == 0) { 1094d453830b6a8fb7571a88a9a241eabd50a483c44Eino-Ville Talvala timestamp = systemTime(SYSTEM_TIME_BOOTTIME); 1104d453830b6a8fb7571a88a9a241eabd50a483c44Eino-Ville Talvala } 1114d453830b6a8fb7571a88a9a241eabd50a483c44Eino-Ville Talvala 1124d453830b6a8fb7571a88a9a241eabd50a483c44Eino-Ville Talvala for (auto tag : mMonitoredTagList) { 1134d453830b6a8fb7571a88a9a241eabd50a483c44Eino-Ville Talvala camera_metadata_ro_entry entry = metadata.find(tag); 1144d453830b6a8fb7571a88a9a241eabd50a483c44Eino-Ville Talvala CameraMetadata &lastValues = (source == REQUEST) ? 1154d453830b6a8fb7571a88a9a241eabd50a483c44Eino-Ville Talvala mLastMonitoredRequestValues : mLastMonitoredResultValues; 11671c73a2985a7ac65ee597be3441ab300fa56e22eEmilian Peev if (lastValues.isEmpty()) { 11771c73a2985a7ac65ee597be3441ab300fa56e22eEmilian Peev lastValues = CameraMetadata(mMonitoredTagList.size()); 11871c73a2985a7ac65ee597be3441ab300fa56e22eEmilian Peev const camera_metadata_t *metaBuffer = 11971c73a2985a7ac65ee597be3441ab300fa56e22eEmilian Peev lastValues.getAndLock(); 12071c73a2985a7ac65ee597be3441ab300fa56e22eEmilian Peev set_camera_metadata_vendor_id( 12171c73a2985a7ac65ee597be3441ab300fa56e22eEmilian Peev const_cast<camera_metadata_t *> (metaBuffer), mVendorTagId); 12271c73a2985a7ac65ee597be3441ab300fa56e22eEmilian Peev lastValues.unlock(metaBuffer); 12371c73a2985a7ac65ee597be3441ab300fa56e22eEmilian Peev } 12471c73a2985a7ac65ee597be3441ab300fa56e22eEmilian Peev 1254d453830b6a8fb7571a88a9a241eabd50a483c44Eino-Ville Talvala camera_metadata_entry lastEntry = lastValues.find(tag); 1264d453830b6a8fb7571a88a9a241eabd50a483c44Eino-Ville Talvala 1274d453830b6a8fb7571a88a9a241eabd50a483c44Eino-Ville Talvala if (entry.count > 0) { 1284d453830b6a8fb7571a88a9a241eabd50a483c44Eino-Ville Talvala bool isDifferent = false; 1294d453830b6a8fb7571a88a9a241eabd50a483c44Eino-Ville Talvala if (lastEntry.count > 0) { 1304d453830b6a8fb7571a88a9a241eabd50a483c44Eino-Ville Talvala // Have a last value, compare to see if changed 1314d453830b6a8fb7571a88a9a241eabd50a483c44Eino-Ville Talvala if (lastEntry.type == entry.type && 1324d453830b6a8fb7571a88a9a241eabd50a483c44Eino-Ville Talvala lastEntry.count == entry.count) { 1334d453830b6a8fb7571a88a9a241eabd50a483c44Eino-Ville Talvala // Same type and count, compare values 1344d453830b6a8fb7571a88a9a241eabd50a483c44Eino-Ville Talvala size_t bytesPerValue = camera_metadata_type_size[lastEntry.type]; 1354d453830b6a8fb7571a88a9a241eabd50a483c44Eino-Ville Talvala size_t entryBytes = bytesPerValue * lastEntry.count; 1364d453830b6a8fb7571a88a9a241eabd50a483c44Eino-Ville Talvala int cmp = memcmp(entry.data.u8, lastEntry.data.u8, entryBytes); 1374d453830b6a8fb7571a88a9a241eabd50a483c44Eino-Ville Talvala if (cmp != 0) { 1384d453830b6a8fb7571a88a9a241eabd50a483c44Eino-Ville Talvala isDifferent = true; 1394d453830b6a8fb7571a88a9a241eabd50a483c44Eino-Ville Talvala } 1404d453830b6a8fb7571a88a9a241eabd50a483c44Eino-Ville Talvala } else { 1414d453830b6a8fb7571a88a9a241eabd50a483c44Eino-Ville Talvala // Count or type has changed 1424d453830b6a8fb7571a88a9a241eabd50a483c44Eino-Ville Talvala isDifferent = true; 1434d453830b6a8fb7571a88a9a241eabd50a483c44Eino-Ville Talvala } 1444d453830b6a8fb7571a88a9a241eabd50a483c44Eino-Ville Talvala } else { 1454d453830b6a8fb7571a88a9a241eabd50a483c44Eino-Ville Talvala // No last entry, so always consider to be different 1464d453830b6a8fb7571a88a9a241eabd50a483c44Eino-Ville Talvala isDifferent = true; 1474d453830b6a8fb7571a88a9a241eabd50a483c44Eino-Ville Talvala } 1484d453830b6a8fb7571a88a9a241eabd50a483c44Eino-Ville Talvala 1494d453830b6a8fb7571a88a9a241eabd50a483c44Eino-Ville Talvala if (isDifferent) { 15071c73a2985a7ac65ee597be3441ab300fa56e22eEmilian Peev ALOGV("%s: Tag %s changed", __FUNCTION__, 15171c73a2985a7ac65ee597be3441ab300fa56e22eEmilian Peev get_local_camera_metadata_tag_name_vendor_id( 15271c73a2985a7ac65ee597be3441ab300fa56e22eEmilian Peev tag, mVendorTagId)); 1534d453830b6a8fb7571a88a9a241eabd50a483c44Eino-Ville Talvala lastValues.update(entry); 1544d453830b6a8fb7571a88a9a241eabd50a483c44Eino-Ville Talvala mMonitoringEvents.emplace(source, frameNumber, timestamp, entry); 1554d453830b6a8fb7571a88a9a241eabd50a483c44Eino-Ville Talvala } 1564d453830b6a8fb7571a88a9a241eabd50a483c44Eino-Ville Talvala } else if (lastEntry.count > 0) { 1574d453830b6a8fb7571a88a9a241eabd50a483c44Eino-Ville Talvala // Value has been removed 15871c73a2985a7ac65ee597be3441ab300fa56e22eEmilian Peev ALOGV("%s: Tag %s removed", __FUNCTION__, 15971c73a2985a7ac65ee597be3441ab300fa56e22eEmilian Peev get_local_camera_metadata_tag_name_vendor_id( 16071c73a2985a7ac65ee597be3441ab300fa56e22eEmilian Peev tag, mVendorTagId)); 1614d453830b6a8fb7571a88a9a241eabd50a483c44Eino-Ville Talvala lastValues.erase(tag); 1624d453830b6a8fb7571a88a9a241eabd50a483c44Eino-Ville Talvala entry.tag = tag; 16371c73a2985a7ac65ee597be3441ab300fa56e22eEmilian Peev entry.type = get_local_camera_metadata_tag_type_vendor_id(tag, 16471c73a2985a7ac65ee597be3441ab300fa56e22eEmilian Peev mVendorTagId); 1654d453830b6a8fb7571a88a9a241eabd50a483c44Eino-Ville Talvala entry.count = 0; 1664d453830b6a8fb7571a88a9a241eabd50a483c44Eino-Ville Talvala mMonitoringEvents.emplace(source, frameNumber, timestamp, entry); 1674d453830b6a8fb7571a88a9a241eabd50a483c44Eino-Ville Talvala } 1684d453830b6a8fb7571a88a9a241eabd50a483c44Eino-Ville Talvala } 1694d453830b6a8fb7571a88a9a241eabd50a483c44Eino-Ville Talvala} 1704d453830b6a8fb7571a88a9a241eabd50a483c44Eino-Ville Talvala 1714d453830b6a8fb7571a88a9a241eabd50a483c44Eino-Ville Talvalavoid TagMonitor::dumpMonitoredMetadata(int fd) { 1724d453830b6a8fb7571a88a9a241eabd50a483c44Eino-Ville Talvala std::lock_guard<std::mutex> lock(mMonitorMutex); 1734d453830b6a8fb7571a88a9a241eabd50a483c44Eino-Ville Talvala 1744d453830b6a8fb7571a88a9a241eabd50a483c44Eino-Ville Talvala if (mMonitoringEnabled) { 1754d453830b6a8fb7571a88a9a241eabd50a483c44Eino-Ville Talvala dprintf(fd, " Tag monitoring enabled for tags:\n"); 1764d453830b6a8fb7571a88a9a241eabd50a483c44Eino-Ville Talvala for (uint32_t tag : mMonitoredTagList) { 1774d453830b6a8fb7571a88a9a241eabd50a483c44Eino-Ville Talvala dprintf(fd, " %s.%s\n", 17871c73a2985a7ac65ee597be3441ab300fa56e22eEmilian Peev get_local_camera_metadata_section_name_vendor_id(tag, 17971c73a2985a7ac65ee597be3441ab300fa56e22eEmilian Peev mVendorTagId), 18071c73a2985a7ac65ee597be3441ab300fa56e22eEmilian Peev get_local_camera_metadata_tag_name_vendor_id(tag, 18171c73a2985a7ac65ee597be3441ab300fa56e22eEmilian Peev mVendorTagId)); 1824d453830b6a8fb7571a88a9a241eabd50a483c44Eino-Ville Talvala } 1834d453830b6a8fb7571a88a9a241eabd50a483c44Eino-Ville Talvala } else { 1844d453830b6a8fb7571a88a9a241eabd50a483c44Eino-Ville Talvala dprintf(fd, " Tag monitoring disabled (enable with -m <name1,..,nameN>)\n"); 1854d453830b6a8fb7571a88a9a241eabd50a483c44Eino-Ville Talvala } 1864d453830b6a8fb7571a88a9a241eabd50a483c44Eino-Ville Talvala if (mMonitoringEvents.size() > 0) { 1874d453830b6a8fb7571a88a9a241eabd50a483c44Eino-Ville Talvala dprintf(fd, " Monitored tag event log:\n"); 1884d453830b6a8fb7571a88a9a241eabd50a483c44Eino-Ville Talvala for (const auto& event : mMonitoringEvents) { 1894d453830b6a8fb7571a88a9a241eabd50a483c44Eino-Ville Talvala int indentation = (event.source == REQUEST) ? 15 : 30; 1904d453830b6a8fb7571a88a9a241eabd50a483c44Eino-Ville Talvala dprintf(fd, " f%d:%" PRId64 "ns: %*s%s.%s: ", 1914d453830b6a8fb7571a88a9a241eabd50a483c44Eino-Ville Talvala event.frameNumber, event.timestamp, 1924d453830b6a8fb7571a88a9a241eabd50a483c44Eino-Ville Talvala indentation, 1934d453830b6a8fb7571a88a9a241eabd50a483c44Eino-Ville Talvala event.source == REQUEST ? "REQ:" : "RES:", 19471c73a2985a7ac65ee597be3441ab300fa56e22eEmilian Peev get_local_camera_metadata_section_name_vendor_id(event.tag, 19571c73a2985a7ac65ee597be3441ab300fa56e22eEmilian Peev mVendorTagId), 19671c73a2985a7ac65ee597be3441ab300fa56e22eEmilian Peev get_local_camera_metadata_tag_name_vendor_id(event.tag, 19771c73a2985a7ac65ee597be3441ab300fa56e22eEmilian Peev mVendorTagId)); 1984d453830b6a8fb7571a88a9a241eabd50a483c44Eino-Ville Talvala if (event.newData.size() == 0) { 1994d453830b6a8fb7571a88a9a241eabd50a483c44Eino-Ville Talvala dprintf(fd, " (Removed)\n"); 2004d453830b6a8fb7571a88a9a241eabd50a483c44Eino-Ville Talvala } else { 2014d453830b6a8fb7571a88a9a241eabd50a483c44Eino-Ville Talvala printData(fd, event.newData.data(), event.tag, 2024d453830b6a8fb7571a88a9a241eabd50a483c44Eino-Ville Talvala event.type, event.newData.size() / camera_metadata_type_size[event.type], 2034d453830b6a8fb7571a88a9a241eabd50a483c44Eino-Ville Talvala indentation + 18); 2044d453830b6a8fb7571a88a9a241eabd50a483c44Eino-Ville Talvala } 2054d453830b6a8fb7571a88a9a241eabd50a483c44Eino-Ville Talvala } 2064d453830b6a8fb7571a88a9a241eabd50a483c44Eino-Ville Talvala } 2074d453830b6a8fb7571a88a9a241eabd50a483c44Eino-Ville Talvala 2084d453830b6a8fb7571a88a9a241eabd50a483c44Eino-Ville Talvala} 2094d453830b6a8fb7571a88a9a241eabd50a483c44Eino-Ville Talvala 2104d453830b6a8fb7571a88a9a241eabd50a483c44Eino-Ville Talvala// TODO: Consolidate with printData from camera_metadata.h 2114d453830b6a8fb7571a88a9a241eabd50a483c44Eino-Ville Talvala 2124d453830b6a8fb7571a88a9a241eabd50a483c44Eino-Ville Talvala#define CAMERA_METADATA_ENUM_STRING_MAX_SIZE 29 2134d453830b6a8fb7571a88a9a241eabd50a483c44Eino-Ville Talvala 2144d453830b6a8fb7571a88a9a241eabd50a483c44Eino-Ville Talvalavoid TagMonitor::printData(int fd, const uint8_t *data_ptr, uint32_t tag, 2154d453830b6a8fb7571a88a9a241eabd50a483c44Eino-Ville Talvala int type, int count, int indentation) { 2164d453830b6a8fb7571a88a9a241eabd50a483c44Eino-Ville Talvala static int values_per_line[NUM_TYPES] = { 2174d453830b6a8fb7571a88a9a241eabd50a483c44Eino-Ville Talvala [TYPE_BYTE] = 16, 2184d453830b6a8fb7571a88a9a241eabd50a483c44Eino-Ville Talvala [TYPE_INT32] = 8, 2194d453830b6a8fb7571a88a9a241eabd50a483c44Eino-Ville Talvala [TYPE_FLOAT] = 8, 2204d453830b6a8fb7571a88a9a241eabd50a483c44Eino-Ville Talvala [TYPE_INT64] = 4, 2214d453830b6a8fb7571a88a9a241eabd50a483c44Eino-Ville Talvala [TYPE_DOUBLE] = 4, 2224d453830b6a8fb7571a88a9a241eabd50a483c44Eino-Ville Talvala [TYPE_RATIONAL] = 4, 2234d453830b6a8fb7571a88a9a241eabd50a483c44Eino-Ville Talvala }; 2244d453830b6a8fb7571a88a9a241eabd50a483c44Eino-Ville Talvala size_t type_size = camera_metadata_type_size[type]; 2254d453830b6a8fb7571a88a9a241eabd50a483c44Eino-Ville Talvala char value_string_tmp[CAMERA_METADATA_ENUM_STRING_MAX_SIZE]; 2264d453830b6a8fb7571a88a9a241eabd50a483c44Eino-Ville Talvala uint32_t value; 2274d453830b6a8fb7571a88a9a241eabd50a483c44Eino-Ville Talvala 2284d453830b6a8fb7571a88a9a241eabd50a483c44Eino-Ville Talvala int lines = count / values_per_line[type]; 2294d453830b6a8fb7571a88a9a241eabd50a483c44Eino-Ville Talvala if (count % values_per_line[type] != 0) lines++; 2304d453830b6a8fb7571a88a9a241eabd50a483c44Eino-Ville Talvala 2314d453830b6a8fb7571a88a9a241eabd50a483c44Eino-Ville Talvala int index = 0; 2324d453830b6a8fb7571a88a9a241eabd50a483c44Eino-Ville Talvala int j, k; 2334d453830b6a8fb7571a88a9a241eabd50a483c44Eino-Ville Talvala for (j = 0; j < lines; j++) { 2344d453830b6a8fb7571a88a9a241eabd50a483c44Eino-Ville Talvala dprintf(fd, "%*s[", (j != 0) ? indentation + 4 : 0, ""); 2354d453830b6a8fb7571a88a9a241eabd50a483c44Eino-Ville Talvala for (k = 0; 2364d453830b6a8fb7571a88a9a241eabd50a483c44Eino-Ville Talvala k < values_per_line[type] && count > 0; 2374d453830b6a8fb7571a88a9a241eabd50a483c44Eino-Ville Talvala k++, count--, index += type_size) { 2384d453830b6a8fb7571a88a9a241eabd50a483c44Eino-Ville Talvala 2394d453830b6a8fb7571a88a9a241eabd50a483c44Eino-Ville Talvala switch (type) { 2404d453830b6a8fb7571a88a9a241eabd50a483c44Eino-Ville Talvala case TYPE_BYTE: 2414d453830b6a8fb7571a88a9a241eabd50a483c44Eino-Ville Talvala value = *(data_ptr + index); 2424d453830b6a8fb7571a88a9a241eabd50a483c44Eino-Ville Talvala if (camera_metadata_enum_snprint(tag, 2434d453830b6a8fb7571a88a9a241eabd50a483c44Eino-Ville Talvala value, 2444d453830b6a8fb7571a88a9a241eabd50a483c44Eino-Ville Talvala value_string_tmp, 2454d453830b6a8fb7571a88a9a241eabd50a483c44Eino-Ville Talvala sizeof(value_string_tmp)) 2464d453830b6a8fb7571a88a9a241eabd50a483c44Eino-Ville Talvala == OK) { 2474d453830b6a8fb7571a88a9a241eabd50a483c44Eino-Ville Talvala dprintf(fd, "%s ", value_string_tmp); 2484d453830b6a8fb7571a88a9a241eabd50a483c44Eino-Ville Talvala } else { 2494d453830b6a8fb7571a88a9a241eabd50a483c44Eino-Ville Talvala dprintf(fd, "%hhu ", 2504d453830b6a8fb7571a88a9a241eabd50a483c44Eino-Ville Talvala *(data_ptr + index)); 2514d453830b6a8fb7571a88a9a241eabd50a483c44Eino-Ville Talvala } 2524d453830b6a8fb7571a88a9a241eabd50a483c44Eino-Ville Talvala break; 2534d453830b6a8fb7571a88a9a241eabd50a483c44Eino-Ville Talvala case TYPE_INT32: 2544d453830b6a8fb7571a88a9a241eabd50a483c44Eino-Ville Talvala value = 2554d453830b6a8fb7571a88a9a241eabd50a483c44Eino-Ville Talvala *(int32_t*)(data_ptr + index); 2564d453830b6a8fb7571a88a9a241eabd50a483c44Eino-Ville Talvala if (camera_metadata_enum_snprint(tag, 2574d453830b6a8fb7571a88a9a241eabd50a483c44Eino-Ville Talvala value, 2584d453830b6a8fb7571a88a9a241eabd50a483c44Eino-Ville Talvala value_string_tmp, 2594d453830b6a8fb7571a88a9a241eabd50a483c44Eino-Ville Talvala sizeof(value_string_tmp)) 2604d453830b6a8fb7571a88a9a241eabd50a483c44Eino-Ville Talvala == OK) { 2614d453830b6a8fb7571a88a9a241eabd50a483c44Eino-Ville Talvala dprintf(fd, "%s ", value_string_tmp); 2624d453830b6a8fb7571a88a9a241eabd50a483c44Eino-Ville Talvala } else { 2634d453830b6a8fb7571a88a9a241eabd50a483c44Eino-Ville Talvala dprintf(fd, "%" PRId32 " ", 2644d453830b6a8fb7571a88a9a241eabd50a483c44Eino-Ville Talvala *(int32_t*)(data_ptr + index)); 2654d453830b6a8fb7571a88a9a241eabd50a483c44Eino-Ville Talvala } 2664d453830b6a8fb7571a88a9a241eabd50a483c44Eino-Ville Talvala break; 2674d453830b6a8fb7571a88a9a241eabd50a483c44Eino-Ville Talvala case TYPE_FLOAT: 2684d453830b6a8fb7571a88a9a241eabd50a483c44Eino-Ville Talvala dprintf(fd, "%0.8f ", 2694d453830b6a8fb7571a88a9a241eabd50a483c44Eino-Ville Talvala *(float*)(data_ptr + index)); 2704d453830b6a8fb7571a88a9a241eabd50a483c44Eino-Ville Talvala break; 2714d453830b6a8fb7571a88a9a241eabd50a483c44Eino-Ville Talvala case TYPE_INT64: 2724d453830b6a8fb7571a88a9a241eabd50a483c44Eino-Ville Talvala dprintf(fd, "%" PRId64 " ", 2734d453830b6a8fb7571a88a9a241eabd50a483c44Eino-Ville Talvala *(int64_t*)(data_ptr + index)); 2744d453830b6a8fb7571a88a9a241eabd50a483c44Eino-Ville Talvala break; 2754d453830b6a8fb7571a88a9a241eabd50a483c44Eino-Ville Talvala case TYPE_DOUBLE: 2764d453830b6a8fb7571a88a9a241eabd50a483c44Eino-Ville Talvala dprintf(fd, "%0.8f ", 2774d453830b6a8fb7571a88a9a241eabd50a483c44Eino-Ville Talvala *(double*)(data_ptr + index)); 2784d453830b6a8fb7571a88a9a241eabd50a483c44Eino-Ville Talvala break; 2794d453830b6a8fb7571a88a9a241eabd50a483c44Eino-Ville Talvala case TYPE_RATIONAL: { 2804d453830b6a8fb7571a88a9a241eabd50a483c44Eino-Ville Talvala int32_t numerator = *(int32_t*)(data_ptr + index); 2814d453830b6a8fb7571a88a9a241eabd50a483c44Eino-Ville Talvala int32_t denominator = *(int32_t*)(data_ptr + index + 4); 2824d453830b6a8fb7571a88a9a241eabd50a483c44Eino-Ville Talvala dprintf(fd, "(%d / %d) ", 2834d453830b6a8fb7571a88a9a241eabd50a483c44Eino-Ville Talvala numerator, denominator); 2844d453830b6a8fb7571a88a9a241eabd50a483c44Eino-Ville Talvala break; 2854d453830b6a8fb7571a88a9a241eabd50a483c44Eino-Ville Talvala } 2864d453830b6a8fb7571a88a9a241eabd50a483c44Eino-Ville Talvala default: 2874d453830b6a8fb7571a88a9a241eabd50a483c44Eino-Ville Talvala dprintf(fd, "??? "); 2884d453830b6a8fb7571a88a9a241eabd50a483c44Eino-Ville Talvala } 2894d453830b6a8fb7571a88a9a241eabd50a483c44Eino-Ville Talvala } 2904d453830b6a8fb7571a88a9a241eabd50a483c44Eino-Ville Talvala dprintf(fd, "]\n"); 2914d453830b6a8fb7571a88a9a241eabd50a483c44Eino-Ville Talvala } 2924d453830b6a8fb7571a88a9a241eabd50a483c44Eino-Ville Talvala} 2934d453830b6a8fb7571a88a9a241eabd50a483c44Eino-Ville Talvala 2944d453830b6a8fb7571a88a9a241eabd50a483c44Eino-Ville Talvalatemplate<typename T> 2954d453830b6a8fb7571a88a9a241eabd50a483c44Eino-Ville TalvalaTagMonitor::MonitorEvent::MonitorEvent(eventSource src, uint32_t frameNumber, nsecs_t timestamp, 2964d453830b6a8fb7571a88a9a241eabd50a483c44Eino-Ville Talvala const T &value) : 2974d453830b6a8fb7571a88a9a241eabd50a483c44Eino-Ville Talvala source(src), 2984d453830b6a8fb7571a88a9a241eabd50a483c44Eino-Ville Talvala frameNumber(frameNumber), 2994d453830b6a8fb7571a88a9a241eabd50a483c44Eino-Ville Talvala timestamp(timestamp), 3004d453830b6a8fb7571a88a9a241eabd50a483c44Eino-Ville Talvala tag(value.tag), 3014d453830b6a8fb7571a88a9a241eabd50a483c44Eino-Ville Talvala type(value.type), 3024d453830b6a8fb7571a88a9a241eabd50a483c44Eino-Ville Talvala newData(value.data.u8, value.data.u8 + camera_metadata_type_size[value.type] * value.count) { 3034d453830b6a8fb7571a88a9a241eabd50a483c44Eino-Ville Talvala} 3044d453830b6a8fb7571a88a9a241eabd50a483c44Eino-Ville Talvala 3054d453830b6a8fb7571a88a9a241eabd50a483c44Eino-Ville TalvalaTagMonitor::MonitorEvent::~MonitorEvent() { 3064d453830b6a8fb7571a88a9a241eabd50a483c44Eino-Ville Talvala} 3074d453830b6a8fb7571a88a9a241eabd50a483c44Eino-Ville Talvala 3084d453830b6a8fb7571a88a9a241eabd50a483c44Eino-Ville Talvala} // namespace android 309