From ff805c114adfbac30dd54545427b6d175c699300 Mon Sep 17 00:00:00 2001 From: Shuzhen Wang Date: Tue, 30 Jul 2024 10:02:03 -0700 Subject: [PATCH] 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 --- .../hardware/camera/device/ShutterMsg.aidl | 3 ++ camera/provider/aidl/vts/camera_aidl_test.cpp | 35 ++++++++++++++----- camera/provider/aidl/vts/camera_aidl_test.h | 9 +++-- camera/provider/aidl/vts/device_cb.cpp | 15 ++++---- camera/provider/aidl/vts/device_cb.h | 2 +- 5 files changed, 41 insertions(+), 23 deletions(-) diff --git a/camera/device/aidl/android/hardware/camera/device/ShutterMsg.aidl b/camera/device/aidl/android/hardware/camera/device/ShutterMsg.aidl index 24ae1a0292..f5489d4c76 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 @@ parcelable ShutterMsg { * 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 1673ab09a8..c38c2f4964 100644 --- a/camera/provider/aidl/vts/camera_aidl_test.cpp +++ b/camera/provider/aidl/vts/camera_aidl_test.cpp @@ -456,6 +456,22 @@ Status CameraAidlTest::isLogicalMultiCamera(const camera_metadata_t* staticMeta) 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& resultMetadata) { camera_metadata_t* metadata = (camera_metadata_t*)resultMetadata.data(); @@ -2380,13 +2396,13 @@ void CameraAidlTest::processCaptureRequestInternal(uint64_t bufferUsage, 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 @@ void CameraAidlTest::processPreviewStabilizationCaptureRequestInternal( 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 @@ void CameraAidlTest::processPreviewStabilizationCaptureRequestInternal( 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 782794b6aa..9edbf41d42 100644 --- a/camera/provider/aidl/vts/camera_aidl_test.h +++ b/camera/provider/aidl/vts/camera_aidl_test.h @@ -346,6 +346,8 @@ class CameraAidlTest : public ::testing::TestWithParam { 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* physicalIds /*out*/); @@ -456,8 +458,6 @@ class CameraAidlTest : public ::testing::TestWithParam { struct InFlightRequest { // Set by notify() SHUTTER call. nsecs_t shutterTimestamp; - - bool shutterReadoutTimestampValid; nsecs_t shutterReadoutTimestamp; bool errorCodeValid; @@ -523,7 +523,6 @@ class CameraAidlTest : public ::testing::TestWithParam { InFlightRequest() : shutterTimestamp(0), - shutterReadoutTimestampValid(false), shutterReadoutTimestamp(0), errorCodeValid(false), errorCode(ErrorCode::ERROR_BUFFER), @@ -541,7 +540,6 @@ class CameraAidlTest : public ::testing::TestWithParam { InFlightRequest(ssize_t numBuffers, bool hasInput, bool partialResults, int32_t partialCount, std::shared_ptr queue = nullptr) : shutterTimestamp(0), - shutterReadoutTimestampValid(false), shutterReadoutTimestamp(0), errorCodeValid(false), errorCode(ErrorCode::ERROR_BUFFER), @@ -561,7 +559,6 @@ class CameraAidlTest : public ::testing::TestWithParam { const std::unordered_set& extraPhysicalResult, std::shared_ptr queue = nullptr) : shutterTimestamp(0), - shutterReadoutTimestampValid(false), shutterReadoutTimestamp(0), errorCodeValid(false), errorCode(ErrorCode::ERROR_BUFFER), @@ -631,6 +628,8 @@ class CameraAidlTest : public ::testing::TestWithParam { 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 8a8b925806..bfd1cd1318 100644 --- a/camera/provider/aidl/vts/device_cb.cpp +++ b/camera/provider/aidl/vts/device_cb.cpp @@ -32,10 +32,11 @@ const int64_t kBufferReturnTimeoutSec = 1; DeviceCb::DeviceCb(CameraAidlTest* parent, camera_metadata_t* staticMeta) : mParent(parent) { mStaticMetadata = staticMeta; + parent->mSupportReadoutTimestamp = CameraAidlTest::isReadoutTimestampSupported(staticMeta); } ScopedAStatus DeviceCb::notify(const std::vector& msgs) { - std::vector> readoutTimestamps; + std::vector readoutTimestamps; size_t count = msgs.size(); readoutTimestamps.resize(count); @@ -44,11 +45,11 @@ ScopedAStatus DeviceCb::notify(const std::vector& msgs) { 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(); - readoutTimestamps[i] = {true, shutter.readoutTimestamp}; + readoutTimestamps[i] = shutter.readoutTimestamp; break; } } @@ -446,9 +447,8 @@ bool DeviceCb::processCaptureResultLocked( return notify; } -ScopedAStatus DeviceCb::notifyHelper( - const std::vector& msgs, - const std::vector>& readoutTimestamps) { +ScopedAStatus DeviceCb::notifyHelper(const std::vector& msgs, + const std::vector& readoutTimestamps) { std::lock_guard l(mParent->mLock); for (size_t i = 0; i < msgs.size(); i++) { @@ -514,8 +514,7 @@ ScopedAStatus DeviceCb::notifyHelper( } auto& r = itr->second; r->shutterTimestamp = msg.get().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 3ae7d10596..d839ab4ba1 100644 --- a/camera/provider/aidl/vts/device_cb.h +++ b/camera/provider/aidl/vts/device_cb.h @@ -60,7 +60,7 @@ class DeviceCb : public BnCameraDeviceCallback { bool processCaptureResultLocked(const CaptureResult& results, std::vector physicalCameraMetadata); ScopedAStatus notifyHelper(const std::vector& msgs, - const std::vector>& readoutTimestamps); + const std::vector& readoutTimestamps); CameraAidlTest* mParent; // Parent object