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