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