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#ifndef ANDROID_SERVERS_CAMERA_TAGMONITOR_H 184d453830b6a8fb7571a88a9a241eabd50a483c44Eino-Ville Talvala#define ANDROID_SERVERS_CAMERA_TAGMONITOR_H 194d453830b6a8fb7571a88a9a241eabd50a483c44Eino-Ville Talvala 204d453830b6a8fb7571a88a9a241eabd50a483c44Eino-Ville Talvala#include <vector> 214d453830b6a8fb7571a88a9a241eabd50a483c44Eino-Ville Talvala#include <atomic> 224d453830b6a8fb7571a88a9a241eabd50a483c44Eino-Ville Talvala#include <mutex> 234d453830b6a8fb7571a88a9a241eabd50a483c44Eino-Ville Talvala 244d453830b6a8fb7571a88a9a241eabd50a483c44Eino-Ville Talvala#include <utils/RefBase.h> 254d453830b6a8fb7571a88a9a241eabd50a483c44Eino-Ville Talvala#include <utils/String8.h> 264d453830b6a8fb7571a88a9a241eabd50a483c44Eino-Ville Talvala#include <utils/Timers.h> 274d453830b6a8fb7571a88a9a241eabd50a483c44Eino-Ville Talvala 284d453830b6a8fb7571a88a9a241eabd50a483c44Eino-Ville Talvala#include <media/RingBuffer.h> 294d453830b6a8fb7571a88a9a241eabd50a483c44Eino-Ville Talvala#include <system/camera_metadata.h> 3071c73a2985a7ac65ee597be3441ab300fa56e22eEmilian Peev#include <system/camera_vendor_tags.h> 314d453830b6a8fb7571a88a9a241eabd50a483c44Eino-Ville Talvala#include <camera/CameraMetadata.h> 324d453830b6a8fb7571a88a9a241eabd50a483c44Eino-Ville Talvala 334d453830b6a8fb7571a88a9a241eabd50a483c44Eino-Ville Talvalanamespace android { 344d453830b6a8fb7571a88a9a241eabd50a483c44Eino-Ville Talvala 354d453830b6a8fb7571a88a9a241eabd50a483c44Eino-Ville Talvala/** 364d453830b6a8fb7571a88a9a241eabd50a483c44Eino-Ville Talvala * A monitor for camera metadata values. 374d453830b6a8fb7571a88a9a241eabd50a483c44Eino-Ville Talvala * Tracks changes to specified metadata values over time, keeping a circular 384d453830b6a8fb7571a88a9a241eabd50a483c44Eino-Ville Talvala * buffer log that can be dumped at will. */ 394d453830b6a8fb7571a88a9a241eabd50a483c44Eino-Ville Talvalaclass TagMonitor { 404d453830b6a8fb7571a88a9a241eabd50a483c44Eino-Ville Talvala public: 414d453830b6a8fb7571a88a9a241eabd50a483c44Eino-Ville Talvala enum eventSource { 424d453830b6a8fb7571a88a9a241eabd50a483c44Eino-Ville Talvala REQUEST, 434d453830b6a8fb7571a88a9a241eabd50a483c44Eino-Ville Talvala RESULT 444d453830b6a8fb7571a88a9a241eabd50a483c44Eino-Ville Talvala }; 454d453830b6a8fb7571a88a9a241eabd50a483c44Eino-Ville Talvala 464d453830b6a8fb7571a88a9a241eabd50a483c44Eino-Ville Talvala TagMonitor(); 474d453830b6a8fb7571a88a9a241eabd50a483c44Eino-Ville Talvala 4871c73a2985a7ac65ee597be3441ab300fa56e22eEmilian Peev void initialize(metadata_vendor_id_t id) { mVendorTagId = id; } 4971c73a2985a7ac65ee597be3441ab300fa56e22eEmilian Peev 504d453830b6a8fb7571a88a9a241eabd50a483c44Eino-Ville Talvala // Parse tag name list (comma-separated) and if valid, enable monitoring 514d453830b6a8fb7571a88a9a241eabd50a483c44Eino-Ville Talvala // If invalid, do nothing. 524d453830b6a8fb7571a88a9a241eabd50a483c44Eino-Ville Talvala // Recognizes "3a" as a shortcut for enabling tracking 3A state, mode, and 534d453830b6a8fb7571a88a9a241eabd50a483c44Eino-Ville Talvala // triggers 544d453830b6a8fb7571a88a9a241eabd50a483c44Eino-Ville Talvala void parseTagsToMonitor(String8 tagNames); 554d453830b6a8fb7571a88a9a241eabd50a483c44Eino-Ville Talvala 564d453830b6a8fb7571a88a9a241eabd50a483c44Eino-Ville Talvala // Disable monitoring; does not clear the event log 574d453830b6a8fb7571a88a9a241eabd50a483c44Eino-Ville Talvala void disableMonitoring(); 584d453830b6a8fb7571a88a9a241eabd50a483c44Eino-Ville Talvala 594d453830b6a8fb7571a88a9a241eabd50a483c44Eino-Ville Talvala // Scan through the metadata and update the monitoring information 604d453830b6a8fb7571a88a9a241eabd50a483c44Eino-Ville Talvala void monitorMetadata(eventSource source, int64_t frameNumber, 614d453830b6a8fb7571a88a9a241eabd50a483c44Eino-Ville Talvala nsecs_t timestamp, const CameraMetadata& metadata); 624d453830b6a8fb7571a88a9a241eabd50a483c44Eino-Ville Talvala 634d453830b6a8fb7571a88a9a241eabd50a483c44Eino-Ville Talvala // Dump current event log to the provided fd 644d453830b6a8fb7571a88a9a241eabd50a483c44Eino-Ville Talvala void dumpMonitoredMetadata(int fd); 654d453830b6a8fb7571a88a9a241eabd50a483c44Eino-Ville Talvala 664d453830b6a8fb7571a88a9a241eabd50a483c44Eino-Ville Talvala private: 674d453830b6a8fb7571a88a9a241eabd50a483c44Eino-Ville Talvala 684d453830b6a8fb7571a88a9a241eabd50a483c44Eino-Ville Talvala static void printData(int fd, const uint8_t *data_ptr, uint32_t tag, 694d453830b6a8fb7571a88a9a241eabd50a483c44Eino-Ville Talvala int type, int count, int indentation); 704d453830b6a8fb7571a88a9a241eabd50a483c44Eino-Ville Talvala 714d453830b6a8fb7571a88a9a241eabd50a483c44Eino-Ville Talvala std::atomic<bool> mMonitoringEnabled; 724d453830b6a8fb7571a88a9a241eabd50a483c44Eino-Ville Talvala std::mutex mMonitorMutex; 734d453830b6a8fb7571a88a9a241eabd50a483c44Eino-Ville Talvala 744d453830b6a8fb7571a88a9a241eabd50a483c44Eino-Ville Talvala // Current tags to monitor and record changes to 754d453830b6a8fb7571a88a9a241eabd50a483c44Eino-Ville Talvala std::vector<uint32_t> mMonitoredTagList; 764d453830b6a8fb7571a88a9a241eabd50a483c44Eino-Ville Talvala 774d453830b6a8fb7571a88a9a241eabd50a483c44Eino-Ville Talvala // Latest-seen values of tracked tags 784d453830b6a8fb7571a88a9a241eabd50a483c44Eino-Ville Talvala CameraMetadata mLastMonitoredRequestValues; 794d453830b6a8fb7571a88a9a241eabd50a483c44Eino-Ville Talvala CameraMetadata mLastMonitoredResultValues; 804d453830b6a8fb7571a88a9a241eabd50a483c44Eino-Ville Talvala 814d453830b6a8fb7571a88a9a241eabd50a483c44Eino-Ville Talvala /** 824d453830b6a8fb7571a88a9a241eabd50a483c44Eino-Ville Talvala * A monitoring event 834d453830b6a8fb7571a88a9a241eabd50a483c44Eino-Ville Talvala * Stores a new metadata field value and the timestamp at which it changed. 844d453830b6a8fb7571a88a9a241eabd50a483c44Eino-Ville Talvala * Copies the source metadata value array and frees it on destruct. 854d453830b6a8fb7571a88a9a241eabd50a483c44Eino-Ville Talvala */ 864d453830b6a8fb7571a88a9a241eabd50a483c44Eino-Ville Talvala struct MonitorEvent { 874d453830b6a8fb7571a88a9a241eabd50a483c44Eino-Ville Talvala template<typename T> 884d453830b6a8fb7571a88a9a241eabd50a483c44Eino-Ville Talvala MonitorEvent(eventSource src, uint32_t frameNumber, nsecs_t timestamp, 894d453830b6a8fb7571a88a9a241eabd50a483c44Eino-Ville Talvala const T &newValue); 904d453830b6a8fb7571a88a9a241eabd50a483c44Eino-Ville Talvala ~MonitorEvent(); 914d453830b6a8fb7571a88a9a241eabd50a483c44Eino-Ville Talvala 924d453830b6a8fb7571a88a9a241eabd50a483c44Eino-Ville Talvala eventSource source; 934d453830b6a8fb7571a88a9a241eabd50a483c44Eino-Ville Talvala uint32_t frameNumber; 944d453830b6a8fb7571a88a9a241eabd50a483c44Eino-Ville Talvala nsecs_t timestamp; 954d453830b6a8fb7571a88a9a241eabd50a483c44Eino-Ville Talvala uint32_t tag; 964d453830b6a8fb7571a88a9a241eabd50a483c44Eino-Ville Talvala uint8_t type; 974d453830b6a8fb7571a88a9a241eabd50a483c44Eino-Ville Talvala std::vector<uint8_t> newData; 984d453830b6a8fb7571a88a9a241eabd50a483c44Eino-Ville Talvala }; 994d453830b6a8fb7571a88a9a241eabd50a483c44Eino-Ville Talvala 1004d453830b6a8fb7571a88a9a241eabd50a483c44Eino-Ville Talvala // A ring buffer for tracking the last kMaxMonitorEvents metadata changes 1014d453830b6a8fb7571a88a9a241eabd50a483c44Eino-Ville Talvala static const int kMaxMonitorEvents = 100; 1024d453830b6a8fb7571a88a9a241eabd50a483c44Eino-Ville Talvala RingBuffer<MonitorEvent> mMonitoringEvents; 1034d453830b6a8fb7571a88a9a241eabd50a483c44Eino-Ville Talvala 1044d453830b6a8fb7571a88a9a241eabd50a483c44Eino-Ville Talvala // 3A fields to use with the "3a" option 1054d453830b6a8fb7571a88a9a241eabd50a483c44Eino-Ville Talvala static const char *k3aTags; 10671c73a2985a7ac65ee597be3441ab300fa56e22eEmilian Peev metadata_vendor_id_t mVendorTagId; 1074d453830b6a8fb7571a88a9a241eabd50a483c44Eino-Ville Talvala}; 1084d453830b6a8fb7571a88a9a241eabd50a483c44Eino-Ville Talvala 1094d453830b6a8fb7571a88a9a241eabd50a483c44Eino-Ville Talvala} // namespace android 1104d453830b6a8fb7571a88a9a241eabd50a483c44Eino-Ville Talvala 1114d453830b6a8fb7571a88a9a241eabd50a483c44Eino-Ville Talvala#endif 112