mirror of
https://github.com/Evolution-X/hardware_interfaces
synced 2026-02-01 05:49:27 +00:00
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
This commit is contained in:
@@ -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;
|
||||
}
|
||||
|
||||
@@ -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<uint8_t>& resultMetadata) {
|
||||
camera_metadata_t* metadata = (camera_metadata_t*)resultMetadata.data();
|
||||
@@ -2383,13 +2399,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 =
|
||||
@@ -2904,13 +2920,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);
|
||||
@@ -2921,12 +2938,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;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -346,6 +346,8 @@ class CameraAidlTest : public ::testing::TestWithParam<std::string> {
|
||||
|
||||
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 @@ class CameraAidlTest : public ::testing::TestWithParam<std::string> {
|
||||
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<std::string> {
|
||||
|
||||
InFlightRequest()
|
||||
: shutterTimestamp(0),
|
||||
shutterReadoutTimestampValid(false),
|
||||
shutterReadoutTimestamp(0),
|
||||
errorCodeValid(false),
|
||||
errorCode(ErrorCode::ERROR_BUFFER),
|
||||
@@ -541,7 +540,6 @@ class CameraAidlTest : public ::testing::TestWithParam<std::string> {
|
||||
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 @@ class CameraAidlTest : public ::testing::TestWithParam<std::string> {
|
||||
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 @@ class CameraAidlTest : public ::testing::TestWithParam<std::string> {
|
||||
|
||||
HandleImporter mHandleImporter;
|
||||
|
||||
bool mSupportReadoutTimestamp;
|
||||
|
||||
friend class DeviceCb;
|
||||
friend class SimpleDeviceCb;
|
||||
friend class TorchProviderCb;
|
||||
|
||||
@@ -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<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 @@ ScopedAStatus DeviceCb::notify(const std::vector<NotifyMsg>& 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<NotifyMsg::Tag::shutter>();
|
||||
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<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 @@ ScopedAStatus DeviceCb::notifyHelper(
|
||||
}
|
||||
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;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -60,7 +60,7 @@ class DeviceCb : public BnCameraDeviceCallback {
|
||||
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
|
||||
|
||||
|
||||
Reference in New Issue
Block a user