Loading services/camera/libcameraservice/device3/Camera3Device.cpp +15 −3 Original line number Diff line number Diff line Loading @@ -3083,10 +3083,11 @@ CameraMetadata Camera3Device::getLatestRequestLocked() { void Camera3Device::monitorMetadata(TagMonitor::eventSource source, int64_t frameNumber, nsecs_t timestamp, const CameraMetadata& metadata, const std::unordered_map<std::string, CameraMetadata>& physicalMetadata) { const std::unordered_map<std::string, CameraMetadata>& physicalMetadata, const std::set<int32_t> &outputStreamIds, int32_t inputStreamId) { mTagMonitor.monitorMetadata(source, frameNumber, timestamp, metadata, physicalMetadata); physicalMetadata, outputStreamIds, inputStreamId); } /** Loading Loading @@ -4589,9 +4590,20 @@ void Camera3Device::RequestThread::updateNextRequest(NextRequest& nextRequest) { sp<Camera3Device> parent = mParent.promote(); if (parent != NULL) { std::set<int32_t> outputStreamIds; for (size_t i = 0; i < halRequest.num_output_buffers; i++) { const camera_stream_buffer_t *src = halRequest.output_buffers + i; int32_t streamId = Camera3Stream::cast(src->stream)->getId(); outputStreamIds.emplace(streamId); } int32_t inputStreamId = -1; if (halRequest.input_buffer != nullptr) { inputStreamId = Camera3Stream::cast(halRequest.input_buffer->stream)->getId(); } parent->monitorMetadata(TagMonitor::REQUEST, halRequest.frame_number, 0, mLatestRequest, mLatestPhysicalRequest); 0, mLatestRequest, mLatestPhysicalRequest, outputStreamIds, inputStreamId); } } Loading services/camera/libcameraservice/device3/Camera3Device.h +2 −1 Original line number Diff line number Diff line Loading @@ -1249,7 +1249,8 @@ class Camera3Device : void monitorMetadata(TagMonitor::eventSource source, int64_t frameNumber, nsecs_t timestamp, const CameraMetadata& metadata, const std::unordered_map<std::string, CameraMetadata>& physicalMetadata); const std::unordered_map<std::string, CameraMetadata>& physicalMetadata, const std::set<int32_t> &outputStreamIds, int32_t inputStreamId); metadata_vendor_id_t mVendorTagId; Loading services/camera/libcameraservice/device3/Camera3OutputUtils.cpp +1 −1 Original line number Diff line number Diff line Loading @@ -368,7 +368,7 @@ void sendCaptureResult( } states.tagMonitor.monitorMetadata(TagMonitor::RESULT, frameNumber, sensorTimestamp, captureResult.mMetadata, monitoredPhysicalMetadata); monitoredPhysicalMetadata, std::set<int32_t>()); insertResultLocked(states, &captureResult, frameNumber); } Loading services/camera/libcameraservice/utils/TagMonitor.cpp +41 −12 Original line number Diff line number Diff line Loading @@ -112,11 +112,14 @@ void TagMonitor::disableMonitoring() { mLastMonitoredResultValues.clear(); mLastMonitoredPhysicalRequestKeys.clear(); mLastMonitoredPhysicalResultKeys.clear(); mLastStreamIds.clear(); mLastInputStreamId = -1; } void TagMonitor::monitorMetadata(eventSource source, int64_t frameNumber, nsecs_t timestamp, const CameraMetadata& metadata, const std::unordered_map<std::string, CameraMetadata>& physicalMetadata) { const std::unordered_map<std::string, CameraMetadata>& physicalMetadata, const std::set<int32_t> &outputStreamIds, int32_t inputStreamId) { if (!mMonitoringEnabled) return; std::lock_guard<std::mutex> lock(mMonitorMutex); Loading @@ -127,16 +130,19 @@ void TagMonitor::monitorMetadata(eventSource source, int64_t frameNumber, nsecs_ std::string emptyId; for (auto tag : mMonitoredTagList) { monitorSingleMetadata(source, frameNumber, timestamp, emptyId, tag, metadata); monitorSingleMetadata(source, frameNumber, timestamp, emptyId, tag, metadata, outputStreamIds, inputStreamId); for (auto& m : physicalMetadata) { monitorSingleMetadata(source, frameNumber, timestamp, m.first, tag, m.second); monitorSingleMetadata(source, frameNumber, timestamp, m.first, tag, m.second, outputStreamIds, inputStreamId); } } } void TagMonitor::monitorSingleMetadata(eventSource source, int64_t frameNumber, nsecs_t timestamp, const std::string& cameraId, uint32_t tag, const CameraMetadata& metadata) { const std::string& cameraId, uint32_t tag, const CameraMetadata& metadata, const std::set<int32_t> &outputStreamIds, int32_t inputStreamId) { CameraMetadata &lastValues = (source == REQUEST) ? (cameraId.empty() ? mLastMonitoredRequestValues : Loading Loading @@ -177,13 +183,21 @@ void TagMonitor::monitorSingleMetadata(eventSource source, int64_t frameNumber, // No last entry, so always consider to be different isDifferent = true; } // Also monitor when the stream ids change, this helps visually see what // monitored metadata values are for capture requests with different // stream ids. if (inputStreamId != mLastInputStreamId || outputStreamIds != mLastStreamIds) { mLastInputStreamId = inputStreamId; mLastStreamIds = outputStreamIds; isDifferent = true; } if (isDifferent) { ALOGV("%s: Tag %s changed", __FUNCTION__, get_local_camera_metadata_tag_name_vendor_id( tag, mVendorTagId)); lastValues.update(entry); mMonitoringEvents.emplace(source, frameNumber, timestamp, entry, cameraId); mMonitoringEvents.emplace(source, frameNumber, timestamp, entry, cameraId, outputStreamIds, inputStreamId); } } else if (lastEntry.count > 0) { // Value has been removed Loading @@ -195,7 +209,10 @@ void TagMonitor::monitorSingleMetadata(eventSource source, int64_t frameNumber, entry.type = get_local_camera_metadata_tag_type_vendor_id(tag, mVendorTagId); entry.count = 0; mMonitoringEvents.emplace(source, frameNumber, timestamp, entry, cameraId); mLastInputStreamId = inputStreamId; mLastStreamIds = outputStreamIds; mMonitoringEvents.emplace(source, frameNumber, timestamp, entry, cameraId, outputStreamIds, inputStreamId); } } Loading Loading @@ -232,7 +249,7 @@ void TagMonitor::dumpMonitoredMetadata(int fd) { } else { printData(fd, event.newData.data(), event.tag, event.type, event.newData.size() / camera_metadata_type_size[event.type], indentation + 18); indentation + 18, event.outputStreamIds, event.inputStreamId); } } } Loading @@ -244,7 +261,8 @@ void TagMonitor::dumpMonitoredMetadata(int fd) { #define CAMERA_METADATA_ENUM_STRING_MAX_SIZE 29 void TagMonitor::printData(int fd, const uint8_t *data_ptr, uint32_t tag, int type, int count, int indentation) { int type, int count, int indentation, const std::set<int32_t> &outputStreamIds, int32_t inputStreamId) { static int values_per_line[NUM_TYPES] = { [TYPE_BYTE] = 16, [TYPE_INT32] = 8, Loading Loading @@ -319,20 +337,31 @@ void TagMonitor::printData(int fd, const uint8_t *data_ptr, uint32_t tag, dprintf(fd, "??? "); } } dprintf(fd, "]\n"); dprintf(fd, "] "); if (outputStreamIds.size() > 0) { dprintf(fd, "output stream ids: "); for (const auto &id : outputStreamIds) { dprintf(fd, " %d ", id); } } if (inputStreamId != -1) { dprintf(fd, "input stream id: %d", inputStreamId); } dprintf(fd, "\n"); } } template<typename T> TagMonitor::MonitorEvent::MonitorEvent(eventSource src, uint32_t frameNumber, nsecs_t timestamp, const T &value, const std::string& cameraId) : const T &value, const std::string& cameraId, const std::set<int32_t> &outputStreamIds, int32_t inputStreamId) : source(src), frameNumber(frameNumber), timestamp(timestamp), tag(value.tag), type(value.type), newData(value.data.u8, value.data.u8 + camera_metadata_type_size[value.type] * value.count), cameraId(cameraId) { cameraId(cameraId), outputStreamIds(outputStreamIds), inputStreamId(inputStreamId) { } TagMonitor::MonitorEvent::~MonitorEvent() { Loading services/camera/libcameraservice/utils/TagMonitor.h +14 −4 Original line number Diff line number Diff line Loading @@ -20,6 +20,7 @@ #include <vector> #include <atomic> #include <mutex> #include <set> #include <unordered_map> #include <utils/RefBase.h> Loading Loading @@ -66,7 +67,8 @@ class TagMonitor { // Scan through the metadata and update the monitoring information void monitorMetadata(eventSource source, int64_t frameNumber, nsecs_t timestamp, const CameraMetadata& metadata, const std::unordered_map<std::string, CameraMetadata>& physicalMetadata); const std::unordered_map<std::string, CameraMetadata>& physicalMetadata, const std::set<int32_t> &outputStreamIds, int32_t inputStreamId = -1); // Dump current event log to the provided fd void dumpMonitoredMetadata(int fd); Loading @@ -74,11 +76,13 @@ class TagMonitor { private: static void printData(int fd, const uint8_t *data_ptr, uint32_t tag, int type, int count, int indentation); int type, int count, int indentation, const std::set<int32_t> &outputStreamIds, int32_t inputStreamId); void monitorSingleMetadata(TagMonitor::eventSource source, int64_t frameNumber, nsecs_t timestamp, const std::string& cameraId, uint32_t tag, const CameraMetadata& metadata); const CameraMetadata& metadata, const std::set<int32_t> &outputStreamIds, int32_t inputStreamId); std::atomic<bool> mMonitoringEnabled; std::mutex mMonitorMutex; Loading @@ -93,6 +97,9 @@ class TagMonitor { std::unordered_map<std::string, CameraMetadata> mLastMonitoredPhysicalRequestKeys; std::unordered_map<std::string, CameraMetadata> mLastMonitoredPhysicalResultKeys; int32_t mLastInputStreamId = -1; std::set<int32_t> mLastStreamIds; /** * A monitoring event * Stores a new metadata field value and the timestamp at which it changed. Loading @@ -101,7 +108,8 @@ class TagMonitor { struct MonitorEvent { template<typename T> MonitorEvent(eventSource src, uint32_t frameNumber, nsecs_t timestamp, const T &newValue, const std::string& cameraId); const T &newValue, const std::string& cameraId, const std::set<int32_t> &outputStreamIds, int32_t inputStreamId); ~MonitorEvent(); eventSource source; Loading @@ -111,6 +119,8 @@ class TagMonitor { uint8_t type; std::vector<uint8_t> newData; std::string cameraId; std::set<int32_t> outputStreamIds; int32_t inputStreamId = 1; }; // A ring buffer for tracking the last kMaxMonitorEvents metadata changes Loading Loading
services/camera/libcameraservice/device3/Camera3Device.cpp +15 −3 Original line number Diff line number Diff line Loading @@ -3083,10 +3083,11 @@ CameraMetadata Camera3Device::getLatestRequestLocked() { void Camera3Device::monitorMetadata(TagMonitor::eventSource source, int64_t frameNumber, nsecs_t timestamp, const CameraMetadata& metadata, const std::unordered_map<std::string, CameraMetadata>& physicalMetadata) { const std::unordered_map<std::string, CameraMetadata>& physicalMetadata, const std::set<int32_t> &outputStreamIds, int32_t inputStreamId) { mTagMonitor.monitorMetadata(source, frameNumber, timestamp, metadata, physicalMetadata); physicalMetadata, outputStreamIds, inputStreamId); } /** Loading Loading @@ -4589,9 +4590,20 @@ void Camera3Device::RequestThread::updateNextRequest(NextRequest& nextRequest) { sp<Camera3Device> parent = mParent.promote(); if (parent != NULL) { std::set<int32_t> outputStreamIds; for (size_t i = 0; i < halRequest.num_output_buffers; i++) { const camera_stream_buffer_t *src = halRequest.output_buffers + i; int32_t streamId = Camera3Stream::cast(src->stream)->getId(); outputStreamIds.emplace(streamId); } int32_t inputStreamId = -1; if (halRequest.input_buffer != nullptr) { inputStreamId = Camera3Stream::cast(halRequest.input_buffer->stream)->getId(); } parent->monitorMetadata(TagMonitor::REQUEST, halRequest.frame_number, 0, mLatestRequest, mLatestPhysicalRequest); 0, mLatestRequest, mLatestPhysicalRequest, outputStreamIds, inputStreamId); } } Loading
services/camera/libcameraservice/device3/Camera3Device.h +2 −1 Original line number Diff line number Diff line Loading @@ -1249,7 +1249,8 @@ class Camera3Device : void monitorMetadata(TagMonitor::eventSource source, int64_t frameNumber, nsecs_t timestamp, const CameraMetadata& metadata, const std::unordered_map<std::string, CameraMetadata>& physicalMetadata); const std::unordered_map<std::string, CameraMetadata>& physicalMetadata, const std::set<int32_t> &outputStreamIds, int32_t inputStreamId); metadata_vendor_id_t mVendorTagId; Loading
services/camera/libcameraservice/device3/Camera3OutputUtils.cpp +1 −1 Original line number Diff line number Diff line Loading @@ -368,7 +368,7 @@ void sendCaptureResult( } states.tagMonitor.monitorMetadata(TagMonitor::RESULT, frameNumber, sensorTimestamp, captureResult.mMetadata, monitoredPhysicalMetadata); monitoredPhysicalMetadata, std::set<int32_t>()); insertResultLocked(states, &captureResult, frameNumber); } Loading
services/camera/libcameraservice/utils/TagMonitor.cpp +41 −12 Original line number Diff line number Diff line Loading @@ -112,11 +112,14 @@ void TagMonitor::disableMonitoring() { mLastMonitoredResultValues.clear(); mLastMonitoredPhysicalRequestKeys.clear(); mLastMonitoredPhysicalResultKeys.clear(); mLastStreamIds.clear(); mLastInputStreamId = -1; } void TagMonitor::monitorMetadata(eventSource source, int64_t frameNumber, nsecs_t timestamp, const CameraMetadata& metadata, const std::unordered_map<std::string, CameraMetadata>& physicalMetadata) { const std::unordered_map<std::string, CameraMetadata>& physicalMetadata, const std::set<int32_t> &outputStreamIds, int32_t inputStreamId) { if (!mMonitoringEnabled) return; std::lock_guard<std::mutex> lock(mMonitorMutex); Loading @@ -127,16 +130,19 @@ void TagMonitor::monitorMetadata(eventSource source, int64_t frameNumber, nsecs_ std::string emptyId; for (auto tag : mMonitoredTagList) { monitorSingleMetadata(source, frameNumber, timestamp, emptyId, tag, metadata); monitorSingleMetadata(source, frameNumber, timestamp, emptyId, tag, metadata, outputStreamIds, inputStreamId); for (auto& m : physicalMetadata) { monitorSingleMetadata(source, frameNumber, timestamp, m.first, tag, m.second); monitorSingleMetadata(source, frameNumber, timestamp, m.first, tag, m.second, outputStreamIds, inputStreamId); } } } void TagMonitor::monitorSingleMetadata(eventSource source, int64_t frameNumber, nsecs_t timestamp, const std::string& cameraId, uint32_t tag, const CameraMetadata& metadata) { const std::string& cameraId, uint32_t tag, const CameraMetadata& metadata, const std::set<int32_t> &outputStreamIds, int32_t inputStreamId) { CameraMetadata &lastValues = (source == REQUEST) ? (cameraId.empty() ? mLastMonitoredRequestValues : Loading Loading @@ -177,13 +183,21 @@ void TagMonitor::monitorSingleMetadata(eventSource source, int64_t frameNumber, // No last entry, so always consider to be different isDifferent = true; } // Also monitor when the stream ids change, this helps visually see what // monitored metadata values are for capture requests with different // stream ids. if (inputStreamId != mLastInputStreamId || outputStreamIds != mLastStreamIds) { mLastInputStreamId = inputStreamId; mLastStreamIds = outputStreamIds; isDifferent = true; } if (isDifferent) { ALOGV("%s: Tag %s changed", __FUNCTION__, get_local_camera_metadata_tag_name_vendor_id( tag, mVendorTagId)); lastValues.update(entry); mMonitoringEvents.emplace(source, frameNumber, timestamp, entry, cameraId); mMonitoringEvents.emplace(source, frameNumber, timestamp, entry, cameraId, outputStreamIds, inputStreamId); } } else if (lastEntry.count > 0) { // Value has been removed Loading @@ -195,7 +209,10 @@ void TagMonitor::monitorSingleMetadata(eventSource source, int64_t frameNumber, entry.type = get_local_camera_metadata_tag_type_vendor_id(tag, mVendorTagId); entry.count = 0; mMonitoringEvents.emplace(source, frameNumber, timestamp, entry, cameraId); mLastInputStreamId = inputStreamId; mLastStreamIds = outputStreamIds; mMonitoringEvents.emplace(source, frameNumber, timestamp, entry, cameraId, outputStreamIds, inputStreamId); } } Loading Loading @@ -232,7 +249,7 @@ void TagMonitor::dumpMonitoredMetadata(int fd) { } else { printData(fd, event.newData.data(), event.tag, event.type, event.newData.size() / camera_metadata_type_size[event.type], indentation + 18); indentation + 18, event.outputStreamIds, event.inputStreamId); } } } Loading @@ -244,7 +261,8 @@ void TagMonitor::dumpMonitoredMetadata(int fd) { #define CAMERA_METADATA_ENUM_STRING_MAX_SIZE 29 void TagMonitor::printData(int fd, const uint8_t *data_ptr, uint32_t tag, int type, int count, int indentation) { int type, int count, int indentation, const std::set<int32_t> &outputStreamIds, int32_t inputStreamId) { static int values_per_line[NUM_TYPES] = { [TYPE_BYTE] = 16, [TYPE_INT32] = 8, Loading Loading @@ -319,20 +337,31 @@ void TagMonitor::printData(int fd, const uint8_t *data_ptr, uint32_t tag, dprintf(fd, "??? "); } } dprintf(fd, "]\n"); dprintf(fd, "] "); if (outputStreamIds.size() > 0) { dprintf(fd, "output stream ids: "); for (const auto &id : outputStreamIds) { dprintf(fd, " %d ", id); } } if (inputStreamId != -1) { dprintf(fd, "input stream id: %d", inputStreamId); } dprintf(fd, "\n"); } } template<typename T> TagMonitor::MonitorEvent::MonitorEvent(eventSource src, uint32_t frameNumber, nsecs_t timestamp, const T &value, const std::string& cameraId) : const T &value, const std::string& cameraId, const std::set<int32_t> &outputStreamIds, int32_t inputStreamId) : source(src), frameNumber(frameNumber), timestamp(timestamp), tag(value.tag), type(value.type), newData(value.data.u8, value.data.u8 + camera_metadata_type_size[value.type] * value.count), cameraId(cameraId) { cameraId(cameraId), outputStreamIds(outputStreamIds), inputStreamId(inputStreamId) { } TagMonitor::MonitorEvent::~MonitorEvent() { Loading
services/camera/libcameraservice/utils/TagMonitor.h +14 −4 Original line number Diff line number Diff line Loading @@ -20,6 +20,7 @@ #include <vector> #include <atomic> #include <mutex> #include <set> #include <unordered_map> #include <utils/RefBase.h> Loading Loading @@ -66,7 +67,8 @@ class TagMonitor { // Scan through the metadata and update the monitoring information void monitorMetadata(eventSource source, int64_t frameNumber, nsecs_t timestamp, const CameraMetadata& metadata, const std::unordered_map<std::string, CameraMetadata>& physicalMetadata); const std::unordered_map<std::string, CameraMetadata>& physicalMetadata, const std::set<int32_t> &outputStreamIds, int32_t inputStreamId = -1); // Dump current event log to the provided fd void dumpMonitoredMetadata(int fd); Loading @@ -74,11 +76,13 @@ class TagMonitor { private: static void printData(int fd, const uint8_t *data_ptr, uint32_t tag, int type, int count, int indentation); int type, int count, int indentation, const std::set<int32_t> &outputStreamIds, int32_t inputStreamId); void monitorSingleMetadata(TagMonitor::eventSource source, int64_t frameNumber, nsecs_t timestamp, const std::string& cameraId, uint32_t tag, const CameraMetadata& metadata); const CameraMetadata& metadata, const std::set<int32_t> &outputStreamIds, int32_t inputStreamId); std::atomic<bool> mMonitoringEnabled; std::mutex mMonitorMutex; Loading @@ -93,6 +97,9 @@ class TagMonitor { std::unordered_map<std::string, CameraMetadata> mLastMonitoredPhysicalRequestKeys; std::unordered_map<std::string, CameraMetadata> mLastMonitoredPhysicalResultKeys; int32_t mLastInputStreamId = -1; std::set<int32_t> mLastStreamIds; /** * A monitoring event * Stores a new metadata field value and the timestamp at which it changed. Loading @@ -101,7 +108,8 @@ class TagMonitor { struct MonitorEvent { template<typename T> MonitorEvent(eventSource src, uint32_t frameNumber, nsecs_t timestamp, const T &newValue, const std::string& cameraId); const T &newValue, const std::string& cameraId, const std::set<int32_t> &outputStreamIds, int32_t inputStreamId); ~MonitorEvent(); eventSource source; Loading @@ -111,6 +119,8 @@ class TagMonitor { uint8_t type; std::vector<uint8_t> newData; std::string cameraId; std::set<int32_t> outputStreamIds; int32_t inputStreamId = 1; }; // A ring buffer for tracking the last kMaxMonitorEvents metadata changes Loading