Camera: VTS: Adjust test to handle optional readoutTimestamp support
With readout timestamp support becomes optional in b/309543399, we
need to adjust the VTS test to handle it.
Test: vendor testing
Bug: 354875531
Change-Id: I552b223f7834df83b8c0bae9f23ab7393a42b64a
diff --git a/camera/device/aidl/android/hardware/camera/device/ShutterMsg.aidl b/camera/device/aidl/android/hardware/camera/device/ShutterMsg.aidl
index 24ae1a0..f5489d4 100644
--- a/camera/device/aidl/android/hardware/camera/device/ShutterMsg.aidl
+++ b/camera/device/aidl/android/hardware/camera/device/ShutterMsg.aidl
@@ -40,6 +40,9 @@
* as timestamp, and for a rolling shutter sensor, the value must be
* timestamp + exposureTime + t_crop_top where t_crop_top is the exposure time
* skew of the cropped lines on the top.
+ *
+ * If ANDROID_SENSOR_READOUT_TIMESTAMP is set to NOT_SUPPORTED, this field
+ * will be ignored by the camera framework.
*/
long readoutTimestamp;
}
diff --git a/camera/provider/aidl/vts/camera_aidl_test.cpp b/camera/provider/aidl/vts/camera_aidl_test.cpp
index 1673ab0..c38c2f4 100644
--- a/camera/provider/aidl/vts/camera_aidl_test.cpp
+++ b/camera/provider/aidl/vts/camera_aidl_test.cpp
@@ -456,6 +456,22 @@
return ret;
}
+bool CameraAidlTest::isReadoutTimestampSupported(const camera_metadata_t* staticMeta) {
+ camera_metadata_ro_entry readoutTimestampEntry;
+ int rc = find_camera_metadata_ro_entry(staticMeta, ANDROID_SENSOR_READOUT_TIMESTAMP,
+ &readoutTimestampEntry);
+ if (rc != 0) {
+ ALOGI("%s: Failed to find ANDROID_SENSOR_READOUT_TIMESTAMP", __FUNCTION__);
+ return true;
+ }
+ if (readoutTimestampEntry.count == 1 && !readoutTimestampEntry.data.u8[0]) {
+ ALOGI("%s: readout timestamp not supported", __FUNCTION__);
+ return false;
+ }
+ ALOGI("%s: readout timestamp supported", __FUNCTION__);
+ return true;
+}
+
void CameraAidlTest::verifyLogicalCameraResult(const camera_metadata_t* staticMetadata,
const std::vector<uint8_t>& resultMetadata) {
camera_metadata_t* metadata = (camera_metadata_t*)resultMetadata.data();
@@ -2380,13 +2396,13 @@
ASSERT_NE(inflightReq->resultOutputBuffers.size(), 0u);
ASSERT_EQ(testStream.id, inflightReq->resultOutputBuffers[0].buffer.streamId);
- // shutterReadoutTimestamp must be available, and it must
+ // shutterReadoutTimestamp, if supported, must
// be >= shutterTimestamp + exposureTime,
// and < shutterTimestamp + exposureTime + rollingShutterSkew / 2.
- ASSERT_TRUE(inflightReq->shutterReadoutTimestampValid);
ASSERT_FALSE(inflightReq->collectedResult.isEmpty());
- if (inflightReq->collectedResult.exists(ANDROID_SENSOR_EXPOSURE_TIME)) {
+ if (mSupportReadoutTimestamp &&
+ inflightReq->collectedResult.exists(ANDROID_SENSOR_EXPOSURE_TIME)) {
camera_metadata_entry_t exposureTimeResult =
inflightReq->collectedResult.find(ANDROID_SENSOR_EXPOSURE_TIME);
nsecs_t exposureToReadout =
@@ -2901,13 +2917,14 @@
ASSERT_FALSE(inflightReq->errorCodeValid);
ASSERT_NE(inflightReq->resultOutputBuffers.size(), 0u);
ASSERT_EQ(testStream.id, inflightReq->resultOutputBuffers[0].buffer.streamId);
- ASSERT_TRUE(inflightReq->shutterReadoutTimestampValid);
- nsecs_t readoutTimestamp = inflightReq->shutterReadoutTimestamp;
+ nsecs_t captureTimestamp = mSupportReadoutTimestamp
+ ? inflightReq->shutterReadoutTimestamp
+ : inflightReq->shutterTimestamp;
if (previewStabilizationOn) {
// Here we collect the time difference between the buffer ready
- // timestamp - notify readout timestamp.
- // timeLag = buffer ready timestamp - notify readout timestamp.
+ // timestamp - notify timestamp.
+ // timeLag = buffer ready timestamp - notify timestamp.
// timeLag(previewStabilization) must be <=
// timeLag(stabilization off) + 1 frame duration.
auto it = cameraDeviceToTimeLag.find(name);
@@ -2918,12 +2935,12 @@
ASSERT_TRUE(it != cameraDeviceToTimeLag.end());
nsecs_t previewStabOnLagTime =
- inflightReq->resultOutputBuffers[0].timeStamp - readoutTimestamp;
+ inflightReq->resultOutputBuffers[0].timeStamp - captureTimestamp;
ASSERT_TRUE(previewStabOnLagTime <= (it->second + frameDuration));
} else {
// Fill in the buffer ready timestamp - notify timestamp;
cameraDeviceToTimeLag[std::string(name)] =
- inflightReq->resultOutputBuffers[0].timeStamp - readoutTimestamp;
+ inflightReq->resultOutputBuffers[0].timeStamp - captureTimestamp;
}
}
diff --git a/camera/provider/aidl/vts/camera_aidl_test.h b/camera/provider/aidl/vts/camera_aidl_test.h
index 782794b..9edbf41 100644
--- a/camera/provider/aidl/vts/camera_aidl_test.h
+++ b/camera/provider/aidl/vts/camera_aidl_test.h
@@ -346,6 +346,8 @@
static Status isOfflineSessionSupported(const camera_metadata_t* staticMeta);
+ static bool isReadoutTimestampSupported(const camera_metadata_t* staticMeta);
+
static Status getPhysicalCameraIds(const camera_metadata_t* staticMeta,
std::unordered_set<std::string>* physicalIds /*out*/);
@@ -456,8 +458,6 @@
struct InFlightRequest {
// Set by notify() SHUTTER call.
nsecs_t shutterTimestamp;
-
- bool shutterReadoutTimestampValid;
nsecs_t shutterReadoutTimestamp;
bool errorCodeValid;
@@ -523,7 +523,6 @@
InFlightRequest()
: shutterTimestamp(0),
- shutterReadoutTimestampValid(false),
shutterReadoutTimestamp(0),
errorCodeValid(false),
errorCode(ErrorCode::ERROR_BUFFER),
@@ -541,7 +540,6 @@
InFlightRequest(ssize_t numBuffers, bool hasInput, bool partialResults,
int32_t partialCount, std::shared_ptr<ResultMetadataQueue> queue = nullptr)
: shutterTimestamp(0),
- shutterReadoutTimestampValid(false),
shutterReadoutTimestamp(0),
errorCodeValid(false),
errorCode(ErrorCode::ERROR_BUFFER),
@@ -561,7 +559,6 @@
const std::unordered_set<std::string>& extraPhysicalResult,
std::shared_ptr<ResultMetadataQueue> queue = nullptr)
: shutterTimestamp(0),
- shutterReadoutTimestampValid(false),
shutterReadoutTimestamp(0),
errorCodeValid(false),
errorCode(ErrorCode::ERROR_BUFFER),
@@ -631,6 +628,8 @@
HandleImporter mHandleImporter;
+ bool mSupportReadoutTimestamp;
+
friend class DeviceCb;
friend class SimpleDeviceCb;
friend class TorchProviderCb;
diff --git a/camera/provider/aidl/vts/device_cb.cpp b/camera/provider/aidl/vts/device_cb.cpp
index 8a8b925..bfd1cd1 100644
--- a/camera/provider/aidl/vts/device_cb.cpp
+++ b/camera/provider/aidl/vts/device_cb.cpp
@@ -32,10 +32,11 @@
DeviceCb::DeviceCb(CameraAidlTest* parent, camera_metadata_t* staticMeta) : mParent(parent) {
mStaticMetadata = staticMeta;
+ parent->mSupportReadoutTimestamp = CameraAidlTest::isReadoutTimestampSupported(staticMeta);
}
ScopedAStatus DeviceCb::notify(const std::vector<NotifyMsg>& msgs) {
- std::vector<std::pair<bool, nsecs_t>> readoutTimestamps;
+ std::vector<nsecs_t> readoutTimestamps;
size_t count = msgs.size();
readoutTimestamps.resize(count);
@@ -44,11 +45,11 @@
const NotifyMsg& msg = msgs[i];
switch (msg.getTag()) {
case NotifyMsg::Tag::error:
- readoutTimestamps[i] = {false, 0};
+ readoutTimestamps[i] = 0;
break;
case NotifyMsg::Tag::shutter:
const auto& shutter = msg.get<NotifyMsg::Tag::shutter>();
- readoutTimestamps[i] = {true, shutter.readoutTimestamp};
+ readoutTimestamps[i] = shutter.readoutTimestamp;
break;
}
}
@@ -446,9 +447,8 @@
return notify;
}
-ScopedAStatus DeviceCb::notifyHelper(
- const std::vector<NotifyMsg>& msgs,
- const std::vector<std::pair<bool, nsecs_t>>& readoutTimestamps) {
+ScopedAStatus DeviceCb::notifyHelper(const std::vector<NotifyMsg>& msgs,
+ const std::vector<nsecs_t>& readoutTimestamps) {
std::lock_guard<std::mutex> l(mParent->mLock);
for (size_t i = 0; i < msgs.size(); i++) {
@@ -514,8 +514,7 @@
}
auto& r = itr->second;
r->shutterTimestamp = msg.get<NotifyMsg::Tag::shutter>().timestamp;
- r->shutterReadoutTimestampValid = readoutTimestamps[i].first;
- r->shutterReadoutTimestamp = readoutTimestamps[i].second;
+ r->shutterReadoutTimestamp = readoutTimestamps[i];
break;
}
}
diff --git a/camera/provider/aidl/vts/device_cb.h b/camera/provider/aidl/vts/device_cb.h
index 3ae7d10..d839ab4 100644
--- a/camera/provider/aidl/vts/device_cb.h
+++ b/camera/provider/aidl/vts/device_cb.h
@@ -60,7 +60,7 @@
bool processCaptureResultLocked(const CaptureResult& results,
std::vector<PhysicalCameraMetadata> physicalCameraMetadata);
ScopedAStatus notifyHelper(const std::vector<NotifyMsg>& msgs,
- const std::vector<std::pair<bool, nsecs_t>>& readoutTimestamps);
+ const std::vector<nsecs_t>& readoutTimestamps);
CameraAidlTest* mParent; // Parent object