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 36bd8c503398d6b483b7abba594c7838a4c93b6e23Emilian Peevconst String16 TagMonitor::kMonitorOption = String16("-m"); 37bd8c503398d6b483b7abba594c7838a4c93b6e23Emilian Peev 384d453830b6a8fb7571a88a9a241eabd50a483c44Eino-Ville Talvalaconst char* TagMonitor::k3aTags = 394d453830b6a8fb7571a88a9a241eabd50a483c44Eino-Ville Talvala "android.control.aeMode, android.control.afMode, android.control.awbMode," 404d453830b6a8fb7571a88a9a241eabd50a483c44Eino-Ville Talvala "android.control.aeState, android.control.afState, android.control.awbState," 414d453830b6a8fb7571a88a9a241eabd50a483c44Eino-Ville Talvala "android.control.aePrecaptureTrigger, android.control.afTrigger," 424d453830b6a8fb7571a88a9a241eabd50a483c44Eino-Ville Talvala "android.control.aeRegions, android.control.awbRegions, android.control.afRegions," 434d453830b6a8fb7571a88a9a241eabd50a483c44Eino-Ville Talvala "android.control.aeExposureCompensation, android.control.aeLock, android.control.awbLock," 444d453830b6a8fb7571a88a9a241eabd50a483c44Eino-Ville Talvala "android.control.aeAntibandingMode, android.control.aeTargetFpsRange," 454d453830b6a8fb7571a88a9a241eabd50a483c44Eino-Ville Talvala "android.control.effectMode, android.control.mode, android.control.sceneMode," 464d453830b6a8fb7571a88a9a241eabd50a483c44Eino-Ville Talvala "android.control.videoStabilizationMode"; 474d453830b6a8fb7571a88a9a241eabd50a483c44Eino-Ville Talvala 484d453830b6a8fb7571a88a9a241eabd50a483c44Eino-Ville Talvalavoid TagMonitor::parseTagsToMonitor(String8 tagNames) { 494d453830b6a8fb7571a88a9a241eabd50a483c44Eino-Ville Talvala std::lock_guard<std::mutex> lock(mMonitorMutex); 504d453830b6a8fb7571a88a9a241eabd50a483c44Eino-Ville Talvala 514d453830b6a8fb7571a88a9a241eabd50a483c44Eino-Ville Talvala // Expand shorthands 524d453830b6a8fb7571a88a9a241eabd50a483c44Eino-Ville Talvala if (ssize_t idx = tagNames.find("3a") != -1) { 534d453830b6a8fb7571a88a9a241eabd50a483c44Eino-Ville Talvala ssize_t end = tagNames.find(",", idx); 544d453830b6a8fb7571a88a9a241eabd50a483c44Eino-Ville Talvala char* start = tagNames.lockBuffer(tagNames.size()); 554d453830b6a8fb7571a88a9a241eabd50a483c44Eino-Ville Talvala start[idx] = '\0'; 564d453830b6a8fb7571a88a9a241eabd50a483c44Eino-Ville Talvala char* rest = (end != -1) ? (start + end) : (start + tagNames.size()); 574d453830b6a8fb7571a88a9a241eabd50a483c44Eino-Ville Talvala tagNames = String8::format("%s%s%s", start, k3aTags, rest); 584d453830b6a8fb7571a88a9a241eabd50a483c44Eino-Ville Talvala } 594d453830b6a8fb7571a88a9a241eabd50a483c44Eino-Ville Talvala 604d453830b6a8fb7571a88a9a241eabd50a483c44Eino-Ville Talvala sp<VendorTagDescriptor> vTags = 614d453830b6a8fb7571a88a9a241eabd50a483c44Eino-Ville Talvala VendorTagDescriptor::getGlobalVendorTagDescriptor(); 6271c73a2985a7ac65ee597be3441ab300fa56e22eEmilian Peev if ((nullptr == vTags.get()) || (0 >= vTags->getTagCount())) { 6371c73a2985a7ac65ee597be3441ab300fa56e22eEmilian Peev sp<VendorTagDescriptorCache> cache = 6471c73a2985a7ac65ee597be3441ab300fa56e22eEmilian Peev VendorTagDescriptorCache::getGlobalVendorTagCache(); 6571c73a2985a7ac65ee597be3441ab300fa56e22eEmilian Peev if (cache.get()) { 6671c73a2985a7ac65ee597be3441ab300fa56e22eEmilian Peev cache->getVendorTagDescriptor(mVendorTagId, &vTags); 6771c73a2985a7ac65ee597be3441ab300fa56e22eEmilian Peev } 6871c73a2985a7ac65ee597be3441ab300fa56e22eEmilian Peev } 694d453830b6a8fb7571a88a9a241eabd50a483c44Eino-Ville Talvala 704d453830b6a8fb7571a88a9a241eabd50a483c44Eino-Ville Talvala bool gotTag = false; 714d453830b6a8fb7571a88a9a241eabd50a483c44Eino-Ville Talvala 724d453830b6a8fb7571a88a9a241eabd50a483c44Eino-Ville Talvala char *tokenized = tagNames.lockBuffer(tagNames.size()); 734d453830b6a8fb7571a88a9a241eabd50a483c44Eino-Ville Talvala char *savePtr; 744d453830b6a8fb7571a88a9a241eabd50a483c44Eino-Ville Talvala char *nextTagName = strtok_r(tokenized, ", ", &savePtr); 754d453830b6a8fb7571a88a9a241eabd50a483c44Eino-Ville Talvala while (nextTagName != nullptr) { 764d453830b6a8fb7571a88a9a241eabd50a483c44Eino-Ville Talvala uint32_t tag; 774d453830b6a8fb7571a88a9a241eabd50a483c44Eino-Ville Talvala status_t res = CameraMetadata::getTagFromName(nextTagName, vTags.get(), &tag); 784d453830b6a8fb7571a88a9a241eabd50a483c44Eino-Ville Talvala if (res != OK) { 794d453830b6a8fb7571a88a9a241eabd50a483c44Eino-Ville Talvala ALOGW("%s: Unknown tag %s, ignoring", __FUNCTION__, nextTagName); 804d453830b6a8fb7571a88a9a241eabd50a483c44Eino-Ville Talvala } else { 814d453830b6a8fb7571a88a9a241eabd50a483c44Eino-Ville Talvala if (!gotTag) { 824d453830b6a8fb7571a88a9a241eabd50a483c44Eino-Ville Talvala mMonitoredTagList.clear(); 834d453830b6a8fb7571a88a9a241eabd50a483c44Eino-Ville Talvala gotTag = true; 844d453830b6a8fb7571a88a9a241eabd50a483c44Eino-Ville Talvala } 854d453830b6a8fb7571a88a9a241eabd50a483c44Eino-Ville Talvala mMonitoredTagList.push_back(tag); 864d453830b6a8fb7571a88a9a241eabd50a483c44Eino-Ville Talvala } 874d453830b6a8fb7571a88a9a241eabd50a483c44Eino-Ville Talvala nextTagName = strtok_r(nullptr, ", ", &savePtr); 884d453830b6a8fb7571a88a9a241eabd50a483c44Eino-Ville Talvala } 894d453830b6a8fb7571a88a9a241eabd50a483c44Eino-Ville Talvala 904d453830b6a8fb7571a88a9a241eabd50a483c44Eino-Ville Talvala tagNames.unlockBuffer(); 914d453830b6a8fb7571a88a9a241eabd50a483c44Eino-Ville Talvala 924d453830b6a8fb7571a88a9a241eabd50a483c44Eino-Ville Talvala if (gotTag) { 934d453830b6a8fb7571a88a9a241eabd50a483c44Eino-Ville Talvala // Got at least one new tag 944d453830b6a8fb7571a88a9a241eabd50a483c44Eino-Ville Talvala mMonitoringEnabled = true; 954d453830b6a8fb7571a88a9a241eabd50a483c44Eino-Ville Talvala } 964d453830b6a8fb7571a88a9a241eabd50a483c44Eino-Ville Talvala} 974d453830b6a8fb7571a88a9a241eabd50a483c44Eino-Ville Talvala 984d453830b6a8fb7571a88a9a241eabd50a483c44Eino-Ville Talvalavoid TagMonitor::disableMonitoring() { 994d453830b6a8fb7571a88a9a241eabd50a483c44Eino-Ville Talvala mMonitoringEnabled = false; 1004d453830b6a8fb7571a88a9a241eabd50a483c44Eino-Ville Talvala mLastMonitoredRequestValues.clear(); 1014d453830b6a8fb7571a88a9a241eabd50a483c44Eino-Ville Talvala mLastMonitoredResultValues.clear(); 1024d453830b6a8fb7571a88a9a241eabd50a483c44Eino-Ville Talvala} 1034d453830b6a8fb7571a88a9a241eabd50a483c44Eino-Ville Talvala 1044d453830b6a8fb7571a88a9a241eabd50a483c44Eino-Ville Talvalavoid TagMonitor::monitorMetadata(eventSource source, int64_t frameNumber, nsecs_t timestamp, 1054d453830b6a8fb7571a88a9a241eabd50a483c44Eino-Ville Talvala const CameraMetadata& metadata) { 1064d453830b6a8fb7571a88a9a241eabd50a483c44Eino-Ville Talvala if (!mMonitoringEnabled) return; 1074d453830b6a8fb7571a88a9a241eabd50a483c44Eino-Ville Talvala 1084d453830b6a8fb7571a88a9a241eabd50a483c44Eino-Ville Talvala std::lock_guard<std::mutex> lock(mMonitorMutex); 1094d453830b6a8fb7571a88a9a241eabd50a483c44Eino-Ville Talvala 1104d453830b6a8fb7571a88a9a241eabd50a483c44Eino-Ville Talvala if (timestamp == 0) { 1114d453830b6a8fb7571a88a9a241eabd50a483c44Eino-Ville Talvala timestamp = systemTime(SYSTEM_TIME_BOOTTIME); 1124d453830b6a8fb7571a88a9a241eabd50a483c44Eino-Ville Talvala } 1134d453830b6a8fb7571a88a9a241eabd50a483c44Eino-Ville Talvala 1144d453830b6a8fb7571a88a9a241eabd50a483c44Eino-Ville Talvala for (auto tag : mMonitoredTagList) { 1154d453830b6a8fb7571a88a9a241eabd50a483c44Eino-Ville Talvala camera_metadata_ro_entry entry = metadata.find(tag); 1164d453830b6a8fb7571a88a9a241eabd50a483c44Eino-Ville Talvala CameraMetadata &lastValues = (source == REQUEST) ? 1174d453830b6a8fb7571a88a9a241eabd50a483c44Eino-Ville Talvala mLastMonitoredRequestValues : mLastMonitoredResultValues; 11871c73a2985a7ac65ee597be3441ab300fa56e22eEmilian Peev if (lastValues.isEmpty()) { 11971c73a2985a7ac65ee597be3441ab300fa56e22eEmilian Peev lastValues = CameraMetadata(mMonitoredTagList.size()); 12071c73a2985a7ac65ee597be3441ab300fa56e22eEmilian Peev const camera_metadata_t *metaBuffer = 12171c73a2985a7ac65ee597be3441ab300fa56e22eEmilian Peev lastValues.getAndLock(); 12271c73a2985a7ac65ee597be3441ab300fa56e22eEmilian Peev set_camera_metadata_vendor_id( 12371c73a2985a7ac65ee597be3441ab300fa56e22eEmilian Peev const_cast<camera_metadata_t *> (metaBuffer), mVendorTagId); 12471c73a2985a7ac65ee597be3441ab300fa56e22eEmilian Peev lastValues.unlock(metaBuffer); 12571c73a2985a7ac65ee597be3441ab300fa56e22eEmilian Peev } 12671c73a2985a7ac65ee597be3441ab300fa56e22eEmilian Peev 1274d453830b6a8fb7571a88a9a241eabd50a483c44Eino-Ville Talvala camera_metadata_entry lastEntry = lastValues.find(tag); 1284d453830b6a8fb7571a88a9a241eabd50a483c44Eino-Ville Talvala 1294d453830b6a8fb7571a88a9a241eabd50a483c44Eino-Ville Talvala if (entry.count > 0) { 1304d453830b6a8fb7571a88a9a241eabd50a483c44Eino-Ville Talvala bool isDifferent = false; 1314d453830b6a8fb7571a88a9a241eabd50a483c44Eino-Ville Talvala if (lastEntry.count > 0) { 1324d453830b6a8fb7571a88a9a241eabd50a483c44Eino-Ville Talvala // Have a last value, compare to see if changed 1334d453830b6a8fb7571a88a9a241eabd50a483c44Eino-Ville Talvala if (lastEntry.type == entry.type && 1344d453830b6a8fb7571a88a9a241eabd50a483c44Eino-Ville Talvala lastEntry.count == entry.count) { 1354d453830b6a8fb7571a88a9a241eabd50a483c44Eino-Ville Talvala // Same type and count, compare values 1364d453830b6a8fb7571a88a9a241eabd50a483c44Eino-Ville Talvala size_t bytesPerValue = camera_metadata_type_size[lastEntry.type]; 1374d453830b6a8fb7571a88a9a241eabd50a483c44Eino-Ville Talvala size_t entryBytes = bytesPerValue * lastEntry.count; 1384d453830b6a8fb7571a88a9a241eabd50a483c44Eino-Ville Talvala int cmp = memcmp(entry.data.u8, lastEntry.data.u8, entryBytes); 1394d453830b6a8fb7571a88a9a241eabd50a483c44Eino-Ville Talvala if (cmp != 0) { 1404d453830b6a8fb7571a88a9a241eabd50a483c44Eino-Ville Talvala isDifferent = true; 1414d453830b6a8fb7571a88a9a241eabd50a483c44Eino-Ville Talvala } 1424d453830b6a8fb7571a88a9a241eabd50a483c44Eino-Ville Talvala } else { 1434d453830b6a8fb7571a88a9a241eabd50a483c44Eino-Ville Talvala // Count or type has changed 1444d453830b6a8fb7571a88a9a241eabd50a483c44Eino-Ville Talvala isDifferent = true; 1454d453830b6a8fb7571a88a9a241eabd50a483c44Eino-Ville Talvala } 1464d453830b6a8fb7571a88a9a241eabd50a483c44Eino-Ville Talvala } else { 1474d453830b6a8fb7571a88a9a241eabd50a483c44Eino-Ville Talvala // No last entry, so always consider to be different 1484d453830b6a8fb7571a88a9a241eabd50a483c44Eino-Ville Talvala isDifferent = true; 1494d453830b6a8fb7571a88a9a241eabd50a483c44Eino-Ville Talvala } 1504d453830b6a8fb7571a88a9a241eabd50a483c44Eino-Ville Talvala 1514d453830b6a8fb7571a88a9a241eabd50a483c44Eino-Ville Talvala if (isDifferent) { 15271c73a2985a7ac65ee597be3441ab300fa56e22eEmilian Peev ALOGV("%s: Tag %s changed", __FUNCTION__, 15371c73a2985a7ac65ee597be3441ab300fa56e22eEmilian Peev get_local_camera_metadata_tag_name_vendor_id( 15471c73a2985a7ac65ee597be3441ab300fa56e22eEmilian Peev tag, mVendorTagId)); 1554d453830b6a8fb7571a88a9a241eabd50a483c44Eino-Ville Talvala lastValues.update(entry); 1564d453830b6a8fb7571a88a9a241eabd50a483c44Eino-Ville Talvala mMonitoringEvents.emplace(source, frameNumber, timestamp, entry); 1574d453830b6a8fb7571a88a9a241eabd50a483c44Eino-Ville Talvala } 1584d453830b6a8fb7571a88a9a241eabd50a483c44Eino-Ville Talvala } else if (lastEntry.count > 0) { 1594d453830b6a8fb7571a88a9a241eabd50a483c44Eino-Ville Talvala // Value has been removed 16071c73a2985a7ac65ee597be3441ab300fa56e22eEmilian Peev ALOGV("%s: Tag %s removed", __FUNCTION__, 16171c73a2985a7ac65ee597be3441ab300fa56e22eEmilian Peev get_local_camera_metadata_tag_name_vendor_id( 16271c73a2985a7ac65ee597be3441ab300fa56e22eEmilian Peev tag, mVendorTagId)); 1634d453830b6a8fb7571a88a9a241eabd50a483c44Eino-Ville Talvala lastValues.erase(tag); 1644d453830b6a8fb7571a88a9a241eabd50a483c44Eino-Ville Talvala entry.tag = tag; 16571c73a2985a7ac65ee597be3441ab300fa56e22eEmilian Peev entry.type = get_local_camera_metadata_tag_type_vendor_id(tag, 16671c73a2985a7ac65ee597be3441ab300fa56e22eEmilian Peev mVendorTagId); 1674d453830b6a8fb7571a88a9a241eabd50a483c44Eino-Ville Talvala entry.count = 0; 1684d453830b6a8fb7571a88a9a241eabd50a483c44Eino-Ville Talvala mMonitoringEvents.emplace(source, frameNumber, timestamp, entry); 1694d453830b6a8fb7571a88a9a241eabd50a483c44Eino-Ville Talvala } 1704d453830b6a8fb7571a88a9a241eabd50a483c44Eino-Ville Talvala } 1714d453830b6a8fb7571a88a9a241eabd50a483c44Eino-Ville Talvala} 1724d453830b6a8fb7571a88a9a241eabd50a483c44Eino-Ville Talvala 1734d453830b6a8fb7571a88a9a241eabd50a483c44Eino-Ville Talvalavoid TagMonitor::dumpMonitoredMetadata(int fd) { 1744d453830b6a8fb7571a88a9a241eabd50a483c44Eino-Ville Talvala std::lock_guard<std::mutex> lock(mMonitorMutex); 1754d453830b6a8fb7571a88a9a241eabd50a483c44Eino-Ville Talvala 1764d453830b6a8fb7571a88a9a241eabd50a483c44Eino-Ville Talvala if (mMonitoringEnabled) { 1774d453830b6a8fb7571a88a9a241eabd50a483c44Eino-Ville Talvala dprintf(fd, " Tag monitoring enabled for tags:\n"); 1784d453830b6a8fb7571a88a9a241eabd50a483c44Eino-Ville Talvala for (uint32_t tag : mMonitoredTagList) { 1794d453830b6a8fb7571a88a9a241eabd50a483c44Eino-Ville Talvala dprintf(fd, " %s.%s\n", 18071c73a2985a7ac65ee597be3441ab300fa56e22eEmilian Peev get_local_camera_metadata_section_name_vendor_id(tag, 18171c73a2985a7ac65ee597be3441ab300fa56e22eEmilian Peev mVendorTagId), 18271c73a2985a7ac65ee597be3441ab300fa56e22eEmilian Peev get_local_camera_metadata_tag_name_vendor_id(tag, 18371c73a2985a7ac65ee597be3441ab300fa56e22eEmilian Peev mVendorTagId)); 1844d453830b6a8fb7571a88a9a241eabd50a483c44Eino-Ville Talvala } 1854d453830b6a8fb7571a88a9a241eabd50a483c44Eino-Ville Talvala } else { 1864d453830b6a8fb7571a88a9a241eabd50a483c44Eino-Ville Talvala dprintf(fd, " Tag monitoring disabled (enable with -m <name1,..,nameN>)\n"); 1874d453830b6a8fb7571a88a9a241eabd50a483c44Eino-Ville Talvala } 1884d453830b6a8fb7571a88a9a241eabd50a483c44Eino-Ville Talvala if (mMonitoringEvents.size() > 0) { 1894d453830b6a8fb7571a88a9a241eabd50a483c44Eino-Ville Talvala dprintf(fd, " Monitored tag event log:\n"); 1904d453830b6a8fb7571a88a9a241eabd50a483c44Eino-Ville Talvala for (const auto& event : mMonitoringEvents) { 1914d453830b6a8fb7571a88a9a241eabd50a483c44Eino-Ville Talvala int indentation = (event.source == REQUEST) ? 15 : 30; 1924d453830b6a8fb7571a88a9a241eabd50a483c44Eino-Ville Talvala dprintf(fd, " f%d:%" PRId64 "ns: %*s%s.%s: ", 1934d453830b6a8fb7571a88a9a241eabd50a483c44Eino-Ville Talvala event.frameNumber, event.timestamp, 1944d453830b6a8fb7571a88a9a241eabd50a483c44Eino-Ville Talvala indentation, 1954d453830b6a8fb7571a88a9a241eabd50a483c44Eino-Ville Talvala event.source == REQUEST ? "REQ:" : "RES:", 19671c73a2985a7ac65ee597be3441ab300fa56e22eEmilian Peev get_local_camera_metadata_section_name_vendor_id(event.tag, 19771c73a2985a7ac65ee597be3441ab300fa56e22eEmilian Peev mVendorTagId), 19871c73a2985a7ac65ee597be3441ab300fa56e22eEmilian Peev get_local_camera_metadata_tag_name_vendor_id(event.tag, 19971c73a2985a7ac65ee597be3441ab300fa56e22eEmilian Peev mVendorTagId)); 2004d453830b6a8fb7571a88a9a241eabd50a483c44Eino-Ville Talvala if (event.newData.size() == 0) { 2014d453830b6a8fb7571a88a9a241eabd50a483c44Eino-Ville Talvala dprintf(fd, " (Removed)\n"); 2024d453830b6a8fb7571a88a9a241eabd50a483c44Eino-Ville Talvala } else { 2034d453830b6a8fb7571a88a9a241eabd50a483c44Eino-Ville Talvala printData(fd, event.newData.data(), event.tag, 2044d453830b6a8fb7571a88a9a241eabd50a483c44Eino-Ville Talvala event.type, event.newData.size() / camera_metadata_type_size[event.type], 2054d453830b6a8fb7571a88a9a241eabd50a483c44Eino-Ville Talvala indentation + 18); 2064d453830b6a8fb7571a88a9a241eabd50a483c44Eino-Ville Talvala } 2074d453830b6a8fb7571a88a9a241eabd50a483c44Eino-Ville Talvala } 2084d453830b6a8fb7571a88a9a241eabd50a483c44Eino-Ville Talvala } 2094d453830b6a8fb7571a88a9a241eabd50a483c44Eino-Ville Talvala 2104d453830b6a8fb7571a88a9a241eabd50a483c44Eino-Ville Talvala} 2114d453830b6a8fb7571a88a9a241eabd50a483c44Eino-Ville Talvala 2124d453830b6a8fb7571a88a9a241eabd50a483c44Eino-Ville Talvala// TODO: Consolidate with printData from camera_metadata.h 2134d453830b6a8fb7571a88a9a241eabd50a483c44Eino-Ville Talvala 2144d453830b6a8fb7571a88a9a241eabd50a483c44Eino-Ville Talvala#define CAMERA_METADATA_ENUM_STRING_MAX_SIZE 29 2154d453830b6a8fb7571a88a9a241eabd50a483c44Eino-Ville Talvala 2164d453830b6a8fb7571a88a9a241eabd50a483c44Eino-Ville Talvalavoid TagMonitor::printData(int fd, const uint8_t *data_ptr, uint32_t tag, 2174d453830b6a8fb7571a88a9a241eabd50a483c44Eino-Ville Talvala int type, int count, int indentation) { 2184d453830b6a8fb7571a88a9a241eabd50a483c44Eino-Ville Talvala static int values_per_line[NUM_TYPES] = { 2194d453830b6a8fb7571a88a9a241eabd50a483c44Eino-Ville Talvala [TYPE_BYTE] = 16, 2204d453830b6a8fb7571a88a9a241eabd50a483c44Eino-Ville Talvala [TYPE_INT32] = 8, 2214d453830b6a8fb7571a88a9a241eabd50a483c44Eino-Ville Talvala [TYPE_FLOAT] = 8, 2224d453830b6a8fb7571a88a9a241eabd50a483c44Eino-Ville Talvala [TYPE_INT64] = 4, 2234d453830b6a8fb7571a88a9a241eabd50a483c44Eino-Ville Talvala [TYPE_DOUBLE] = 4, 2244d453830b6a8fb7571a88a9a241eabd50a483c44Eino-Ville Talvala [TYPE_RATIONAL] = 4, 2254d453830b6a8fb7571a88a9a241eabd50a483c44Eino-Ville Talvala }; 2264d453830b6a8fb7571a88a9a241eabd50a483c44Eino-Ville Talvala size_t type_size = camera_metadata_type_size[type]; 2274d453830b6a8fb7571a88a9a241eabd50a483c44Eino-Ville Talvala char value_string_tmp[CAMERA_METADATA_ENUM_STRING_MAX_SIZE]; 2284d453830b6a8fb7571a88a9a241eabd50a483c44Eino-Ville Talvala uint32_t value; 2294d453830b6a8fb7571a88a9a241eabd50a483c44Eino-Ville Talvala 2304d453830b6a8fb7571a88a9a241eabd50a483c44Eino-Ville Talvala int lines = count / values_per_line[type]; 2314d453830b6a8fb7571a88a9a241eabd50a483c44Eino-Ville Talvala if (count % values_per_line[type] != 0) lines++; 2324d453830b6a8fb7571a88a9a241eabd50a483c44Eino-Ville Talvala 2334d453830b6a8fb7571a88a9a241eabd50a483c44Eino-Ville Talvala int index = 0; 2344d453830b6a8fb7571a88a9a241eabd50a483c44Eino-Ville Talvala int j, k; 2354d453830b6a8fb7571a88a9a241eabd50a483c44Eino-Ville Talvala for (j = 0; j < lines; j++) { 2364d453830b6a8fb7571a88a9a241eabd50a483c44Eino-Ville Talvala dprintf(fd, "%*s[", (j != 0) ? indentation + 4 : 0, ""); 2374d453830b6a8fb7571a88a9a241eabd50a483c44Eino-Ville Talvala for (k = 0; 2384d453830b6a8fb7571a88a9a241eabd50a483c44Eino-Ville Talvala k < values_per_line[type] && count > 0; 2394d453830b6a8fb7571a88a9a241eabd50a483c44Eino-Ville Talvala k++, count--, index += type_size) { 2404d453830b6a8fb7571a88a9a241eabd50a483c44Eino-Ville Talvala 2414d453830b6a8fb7571a88a9a241eabd50a483c44Eino-Ville Talvala switch (type) { 2424d453830b6a8fb7571a88a9a241eabd50a483c44Eino-Ville Talvala case TYPE_BYTE: 2434d453830b6a8fb7571a88a9a241eabd50a483c44Eino-Ville Talvala value = *(data_ptr + index); 2444d453830b6a8fb7571a88a9a241eabd50a483c44Eino-Ville Talvala if (camera_metadata_enum_snprint(tag, 2454d453830b6a8fb7571a88a9a241eabd50a483c44Eino-Ville Talvala value, 2464d453830b6a8fb7571a88a9a241eabd50a483c44Eino-Ville Talvala value_string_tmp, 2474d453830b6a8fb7571a88a9a241eabd50a483c44Eino-Ville Talvala sizeof(value_string_tmp)) 2484d453830b6a8fb7571a88a9a241eabd50a483c44Eino-Ville Talvala == OK) { 2494d453830b6a8fb7571a88a9a241eabd50a483c44Eino-Ville Talvala dprintf(fd, "%s ", value_string_tmp); 2504d453830b6a8fb7571a88a9a241eabd50a483c44Eino-Ville Talvala } else { 2514d453830b6a8fb7571a88a9a241eabd50a483c44Eino-Ville Talvala dprintf(fd, "%hhu ", 2524d453830b6a8fb7571a88a9a241eabd50a483c44Eino-Ville Talvala *(data_ptr + index)); 2534d453830b6a8fb7571a88a9a241eabd50a483c44Eino-Ville Talvala } 2544d453830b6a8fb7571a88a9a241eabd50a483c44Eino-Ville Talvala break; 2554d453830b6a8fb7571a88a9a241eabd50a483c44Eino-Ville Talvala case TYPE_INT32: 2564d453830b6a8fb7571a88a9a241eabd50a483c44Eino-Ville Talvala value = 2574d453830b6a8fb7571a88a9a241eabd50a483c44Eino-Ville Talvala *(int32_t*)(data_ptr + index); 2584d453830b6a8fb7571a88a9a241eabd50a483c44Eino-Ville Talvala if (camera_metadata_enum_snprint(tag, 2594d453830b6a8fb7571a88a9a241eabd50a483c44Eino-Ville Talvala value, 2604d453830b6a8fb7571a88a9a241eabd50a483c44Eino-Ville Talvala value_string_tmp, 2614d453830b6a8fb7571a88a9a241eabd50a483c44Eino-Ville Talvala sizeof(value_string_tmp)) 2624d453830b6a8fb7571a88a9a241eabd50a483c44Eino-Ville Talvala == OK) { 2634d453830b6a8fb7571a88a9a241eabd50a483c44Eino-Ville Talvala dprintf(fd, "%s ", value_string_tmp); 2644d453830b6a8fb7571a88a9a241eabd50a483c44Eino-Ville Talvala } else { 2654d453830b6a8fb7571a88a9a241eabd50a483c44Eino-Ville Talvala dprintf(fd, "%" PRId32 " ", 2664d453830b6a8fb7571a88a9a241eabd50a483c44Eino-Ville Talvala *(int32_t*)(data_ptr + index)); 2674d453830b6a8fb7571a88a9a241eabd50a483c44Eino-Ville Talvala } 2684d453830b6a8fb7571a88a9a241eabd50a483c44Eino-Ville Talvala break; 2694d453830b6a8fb7571a88a9a241eabd50a483c44Eino-Ville Talvala case TYPE_FLOAT: 2704d453830b6a8fb7571a88a9a241eabd50a483c44Eino-Ville Talvala dprintf(fd, "%0.8f ", 2714d453830b6a8fb7571a88a9a241eabd50a483c44Eino-Ville Talvala *(float*)(data_ptr + index)); 2724d453830b6a8fb7571a88a9a241eabd50a483c44Eino-Ville Talvala break; 2734d453830b6a8fb7571a88a9a241eabd50a483c44Eino-Ville Talvala case TYPE_INT64: 2744d453830b6a8fb7571a88a9a241eabd50a483c44Eino-Ville Talvala dprintf(fd, "%" PRId64 " ", 2754d453830b6a8fb7571a88a9a241eabd50a483c44Eino-Ville Talvala *(int64_t*)(data_ptr + index)); 2764d453830b6a8fb7571a88a9a241eabd50a483c44Eino-Ville Talvala break; 2774d453830b6a8fb7571a88a9a241eabd50a483c44Eino-Ville Talvala case TYPE_DOUBLE: 2784d453830b6a8fb7571a88a9a241eabd50a483c44Eino-Ville Talvala dprintf(fd, "%0.8f ", 2794d453830b6a8fb7571a88a9a241eabd50a483c44Eino-Ville Talvala *(double*)(data_ptr + index)); 2804d453830b6a8fb7571a88a9a241eabd50a483c44Eino-Ville Talvala break; 2814d453830b6a8fb7571a88a9a241eabd50a483c44Eino-Ville Talvala case TYPE_RATIONAL: { 2824d453830b6a8fb7571a88a9a241eabd50a483c44Eino-Ville Talvala int32_t numerator = *(int32_t*)(data_ptr + index); 2834d453830b6a8fb7571a88a9a241eabd50a483c44Eino-Ville Talvala int32_t denominator = *(int32_t*)(data_ptr + index + 4); 2844d453830b6a8fb7571a88a9a241eabd50a483c44Eino-Ville Talvala dprintf(fd, "(%d / %d) ", 2854d453830b6a8fb7571a88a9a241eabd50a483c44Eino-Ville Talvala numerator, denominator); 2864d453830b6a8fb7571a88a9a241eabd50a483c44Eino-Ville Talvala break; 2874d453830b6a8fb7571a88a9a241eabd50a483c44Eino-Ville Talvala } 2884d453830b6a8fb7571a88a9a241eabd50a483c44Eino-Ville Talvala default: 2894d453830b6a8fb7571a88a9a241eabd50a483c44Eino-Ville Talvala dprintf(fd, "??? "); 2904d453830b6a8fb7571a88a9a241eabd50a483c44Eino-Ville Talvala } 2914d453830b6a8fb7571a88a9a241eabd50a483c44Eino-Ville Talvala } 2924d453830b6a8fb7571a88a9a241eabd50a483c44Eino-Ville Talvala dprintf(fd, "]\n"); 2934d453830b6a8fb7571a88a9a241eabd50a483c44Eino-Ville Talvala } 2944d453830b6a8fb7571a88a9a241eabd50a483c44Eino-Ville Talvala} 2954d453830b6a8fb7571a88a9a241eabd50a483c44Eino-Ville Talvala 2964d453830b6a8fb7571a88a9a241eabd50a483c44Eino-Ville Talvalatemplate<typename T> 2974d453830b6a8fb7571a88a9a241eabd50a483c44Eino-Ville TalvalaTagMonitor::MonitorEvent::MonitorEvent(eventSource src, uint32_t frameNumber, nsecs_t timestamp, 2984d453830b6a8fb7571a88a9a241eabd50a483c44Eino-Ville Talvala const T &value) : 2994d453830b6a8fb7571a88a9a241eabd50a483c44Eino-Ville Talvala source(src), 3004d453830b6a8fb7571a88a9a241eabd50a483c44Eino-Ville Talvala frameNumber(frameNumber), 3014d453830b6a8fb7571a88a9a241eabd50a483c44Eino-Ville Talvala timestamp(timestamp), 3024d453830b6a8fb7571a88a9a241eabd50a483c44Eino-Ville Talvala tag(value.tag), 3034d453830b6a8fb7571a88a9a241eabd50a483c44Eino-Ville Talvala type(value.type), 3044d453830b6a8fb7571a88a9a241eabd50a483c44Eino-Ville Talvala newData(value.data.u8, value.data.u8 + camera_metadata_type_size[value.type] * value.count) { 3054d453830b6a8fb7571a88a9a241eabd50a483c44Eino-Ville Talvala} 3064d453830b6a8fb7571a88a9a241eabd50a483c44Eino-Ville Talvala 3074d453830b6a8fb7571a88a9a241eabd50a483c44Eino-Ville TalvalaTagMonitor::MonitorEvent::~MonitorEvent() { 3084d453830b6a8fb7571a88a9a241eabd50a483c44Eino-Ville Talvala} 3094d453830b6a8fb7571a88a9a241eabd50a483c44Eino-Ville Talvala 3104d453830b6a8fb7571a88a9a241eabd50a483c44Eino-Ville Talvala} // namespace android 311