Camera: Add logical camera related metadata in dumpsys
Add below logical camera support to dumpsys:
- Physical camera id to stream info.
- Physical camera request/result metadata.
- Physical camera metadata in tag monitor.
Also fixed an issue of missing vendor tags in physical metadata.
Test: Run physical streams and observe dumpsys
Bug: 111940580
Change-Id: I02889b213ff5e7ec29506c0483ef40de9d107ccb
diff --git a/services/camera/libcameraservice/device3/Camera3Device.cpp b/services/camera/libcameraservice/device3/Camera3Device.cpp
index 415b2d8..dcbcaba 100644
--- a/services/camera/libcameraservice/device3/Camera3Device.cpp
+++ b/services/camera/libcameraservice/device3/Camera3Device.cpp
@@ -1306,7 +1306,7 @@
void Camera3Device::processOneCaptureResultLocked(
const hardware::camera::device::V3_2::CaptureResult& result,
const hardware::hidl_vec<
- hardware::camera::device::V3_4::PhysicalCameraMetadata> physicalCameraMetadatas) {
+ hardware::camera::device::V3_4::PhysicalCameraMetadata> physicalCameraMetadata) {
camera3_capture_result r;
status_t res;
r.frame_number = result.frameNumber;
@@ -1322,21 +1322,21 @@
r.result = reinterpret_cast<const camera_metadata_t*>(resultMetadata.data());
// Read and validate physical camera metadata
- size_t physResultCount = physicalCameraMetadatas.size();
+ size_t physResultCount = physicalCameraMetadata.size();
std::vector<const char*> physCamIds(physResultCount);
std::vector<const camera_metadata_t *> phyCamMetadatas(physResultCount);
std::vector<hardware::camera::device::V3_2::CameraMetadata> physResultMetadata;
physResultMetadata.resize(physResultCount);
- for (size_t i = 0; i < physicalCameraMetadatas.size(); i++) {
- res = readOneCameraMetadataLocked(physicalCameraMetadatas[i].fmqMetadataSize,
- physResultMetadata[i], physicalCameraMetadatas[i].metadata);
+ for (size_t i = 0; i < physicalCameraMetadata.size(); i++) {
+ res = readOneCameraMetadataLocked(physicalCameraMetadata[i].fmqMetadataSize,
+ physResultMetadata[i], physicalCameraMetadata[i].metadata);
if (res != OK) {
ALOGE("%s: Frame %d: Failed to read capture result metadata for camera %s",
__FUNCTION__, result.frameNumber,
- physicalCameraMetadatas[i].physicalCameraId.c_str());
+ physicalCameraMetadata[i].physicalCameraId.c_str());
return;
}
- physCamIds[i] = physicalCameraMetadatas[i].physicalCameraId.c_str();
+ physCamIds[i] = physicalCameraMetadata[i].physicalCameraId.c_str();
phyCamMetadatas[i] = reinterpret_cast<const camera_metadata_t*>(
physResultMetadata[i].data());
}
@@ -3420,6 +3420,14 @@
return;
}
+ // Update vendor tag id for physical metadata
+ for (auto& physicalMetadata : result->mPhysicalMetadatas) {
+ camera_metadata_t *pmeta = const_cast<camera_metadata_t *>(
+ physicalMetadata.mPhysicalCameraMetadata.getAndLock());
+ set_camera_metadata_vendor_id(pmeta, mVendorTagId);
+ physicalMetadata.mPhysicalCameraMetadata.unlock(pmeta);
+ }
+
// Valid result, insert into queue
List<CaptureResult>::iterator queuedResult =
mResultQueue.insert(mResultQueue.end(), CaptureResult(*result));
@@ -3551,8 +3559,14 @@
}
}
+ std::unordered_map<std::string, CameraMetadata> monitoredPhysicalMetadata;
+ for (auto& m : physicalMetadatas) {
+ monitoredPhysicalMetadata.emplace(String8(m.mPhysicalCameraId).string(),
+ CameraMetadata(m.mPhysicalCameraMetadata));
+ }
mTagMonitor.monitorMetadata(TagMonitor::RESULT,
- frameNumber, timestamp.data.i64[0], captureResult.mMetadata);
+ frameNumber, timestamp.data.i64[0], captureResult.mMetadata,
+ monitoredPhysicalMetadata);
insertResultLocked(&captureResult, frameNumber);
}
@@ -3966,8 +3980,11 @@
void Camera3Device::monitorMetadata(TagMonitor::eventSource source,
- int64_t frameNumber, nsecs_t timestamp, const CameraMetadata& metadata) {
- mTagMonitor.monitorMetadata(source, frameNumber, timestamp, metadata);
+ int64_t frameNumber, nsecs_t timestamp, const CameraMetadata& metadata,
+ const std::unordered_map<std::string, CameraMetadata>& physicalMetadata) {
+
+ mTagMonitor.monitorMetadata(source, frameNumber, timestamp, metadata,
+ physicalMetadata);
}
/**
@@ -5107,28 +5124,7 @@
NextRequest& nextRequest = mNextRequests.editItemAt(i);
nextRequest.submitted = true;
-
- // Update the latest request sent to HAL
- if (nextRequest.halRequest.settings != NULL) { // Don't update if they were unchanged
- Mutex::Autolock al(mLatestRequestMutex);
-
- camera_metadata_t* cloned = clone_camera_metadata(nextRequest.halRequest.settings);
- mLatestRequest.acquire(cloned);
-
- sp<Camera3Device> parent = mParent.promote();
- if (parent != NULL) {
- parent->monitorMetadata(TagMonitor::REQUEST,
- nextRequest.halRequest.frame_number,
- 0, mLatestRequest);
- }
- }
-
- if (nextRequest.halRequest.settings != NULL) {
- nextRequest.captureRequest->mSettingsList.begin()->metadata.unlock(
- nextRequest.halRequest.settings);
- }
-
- cleanupPhysicalSettings(nextRequest.captureRequest, &nextRequest.halRequest);
+ updateNextRequest(nextRequest);
if (!triggerRemoveFailed) {
// Remove any previously queued triggers (after unlock)
@@ -5183,26 +5179,7 @@
// Mark that the request has be submitted successfully.
nextRequest.submitted = true;
- // Update the latest request sent to HAL
- if (nextRequest.halRequest.settings != NULL) { // Don't update if they were unchanged
- Mutex::Autolock al(mLatestRequestMutex);
-
- camera_metadata_t* cloned = clone_camera_metadata(nextRequest.halRequest.settings);
- mLatestRequest.acquire(cloned);
-
- sp<Camera3Device> parent = mParent.promote();
- if (parent != NULL) {
- parent->monitorMetadata(TagMonitor::REQUEST, nextRequest.halRequest.frame_number,
- 0, mLatestRequest);
- }
- }
-
- if (nextRequest.halRequest.settings != NULL) {
- nextRequest.captureRequest->mSettingsList.begin()->metadata.unlock(
- nextRequest.halRequest.settings);
- }
-
- cleanupPhysicalSettings(nextRequest.captureRequest, &nextRequest.halRequest);
+ updateNextRequest(nextRequest);
// Remove any previously queued triggers (after unlock)
res = removeTriggers(mPrevRequest);
@@ -5264,6 +5241,37 @@
return false;
}
+void Camera3Device::RequestThread::updateNextRequest(NextRequest& nextRequest) {
+ // Update the latest request sent to HAL
+ if (nextRequest.halRequest.settings != NULL) { // Don't update if they were unchanged
+ Mutex::Autolock al(mLatestRequestMutex);
+
+ camera_metadata_t* cloned = clone_camera_metadata(nextRequest.halRequest.settings);
+ mLatestRequest.acquire(cloned);
+
+ mLatestPhysicalRequest.clear();
+ for (uint32_t i = 0; i < nextRequest.halRequest.num_physcam_settings; i++) {
+ cloned = clone_camera_metadata(nextRequest.halRequest.physcam_settings[i]);
+ mLatestPhysicalRequest.emplace(nextRequest.halRequest.physcam_id[i],
+ CameraMetadata(cloned));
+ }
+
+ sp<Camera3Device> parent = mParent.promote();
+ if (parent != NULL) {
+ parent->monitorMetadata(TagMonitor::REQUEST,
+ nextRequest.halRequest.frame_number,
+ 0, mLatestRequest, mLatestPhysicalRequest);
+ }
+ }
+
+ if (nextRequest.halRequest.settings != NULL) {
+ nextRequest.captureRequest->mSettingsList.begin()->metadata.unlock(
+ nextRequest.halRequest.settings);
+ }
+
+ cleanupPhysicalSettings(nextRequest.captureRequest, &nextRequest.halRequest);
+}
+
bool Camera3Device::RequestThread::updateSessionParameters(const CameraMetadata& settings) {
ATRACE_CALL();
bool updatesDetected = false;
diff --git a/services/camera/libcameraservice/device3/Camera3Device.h b/services/camera/libcameraservice/device3/Camera3Device.h
index f8245df..6376e6f 100644
--- a/services/camera/libcameraservice/device3/Camera3Device.h
+++ b/services/camera/libcameraservice/device3/Camera3Device.h
@@ -554,7 +554,7 @@
void processOneCaptureResultLocked(
const hardware::camera::device::V3_2::CaptureResult& result,
const hardware::hidl_vec<
- hardware::camera::device::V3_4::PhysicalCameraMetadata> physicalCameraMetadatas);
+ hardware::camera::device::V3_4::PhysicalCameraMetadata> physicalCameraMetadata);
status_t readOneCameraMetadataLocked(uint64_t fmqResultSize,
hardware::camera::device::V3_2::CameraMetadata& resultMetadata,
const hardware::camera::device::V3_2::CameraMetadata& result);
@@ -910,8 +910,8 @@
bool skipHFRTargetFPSUpdate(int32_t tag, const camera_metadata_ro_entry_t& newEntry,
const camera_metadata_entry_t& currentEntry);
- // Re-configure camera using the latest session parameters.
- bool reconfigureCamera();
+ // Update next request sent to HAL
+ void updateNextRequest(NextRequest& nextRequest);
wp<Camera3Device> mParent;
wp<camera3::StatusTracker> mStatusTracker;
@@ -955,6 +955,7 @@
// android.request.id for latest process_capture_request
int32_t mLatestRequestId;
CameraMetadata mLatestRequest;
+ std::unordered_map<std::string, CameraMetadata> mLatestPhysicalRequest;
typedef KeyedVector<uint32_t/*tag*/, RequestTrigger> TriggerMap;
Mutex mTriggerMutex;
@@ -1263,7 +1264,8 @@
TagMonitor mTagMonitor;
void monitorMetadata(TagMonitor::eventSource source, int64_t frameNumber,
- nsecs_t timestamp, const CameraMetadata& metadata);
+ nsecs_t timestamp, const CameraMetadata& metadata,
+ const std::unordered_map<std::string, CameraMetadata>& physicalMetadata);
metadata_vendor_id_t mVendorTagId;
diff --git a/services/camera/libcameraservice/device3/Camera3IOStreamBase.cpp b/services/camera/libcameraservice/device3/Camera3IOStreamBase.cpp
index 2e909a0..ef0d919 100644
--- a/services/camera/libcameraservice/device3/Camera3IOStreamBase.cpp
+++ b/services/camera/libcameraservice/device3/Camera3IOStreamBase.cpp
@@ -82,6 +82,9 @@
lines.appendFormat(" Max size: %zu\n", mMaxSize);
lines.appendFormat(" Combined usage: %" PRIu64 ", max HAL buffers: %d\n",
mUsage | consumerUsage, camera3_stream::max_buffers);
+ if (strlen(camera3_stream::physical_camera_id) > 0) {
+ lines.appendFormat(" Physical camera id: %s\n", camera3_stream::physical_camera_id);
+ }
lines.appendFormat(" Frames produced: %d, last timestamp: %" PRId64 " ns\n",
mFrameCount, mLastTimestamp);
lines.appendFormat(" Total buffers: %zu, currently dequeued: %zu\n",