diff --git a/camera/device/3.8/types.hal b/camera/device/3.8/types.hal index 6daa0e13b7..843d050bb2 100644 --- a/camera/device/3.8/types.hal +++ b/camera/device/3.8/types.hal @@ -35,8 +35,9 @@ struct ShutterMsg { /** * Timestamp for the capture readout. This must be in the same time domain - * as v3_2.timestamp, and the value must be v3_2.timestamp + exposureTime - * for a rolling shutter sensor. + * as v3_2.timestamp, and for a rolling shutter sensor, the value must be + * v3_2.timestamp + exposureTime + t_crop_top where t_crop_top is the exposure time + * skew of the cropped lines on the top. */ uint64_t readoutTimestamp; }; diff --git a/camera/provider/2.4/vts/functional/VtsHalCameraProviderV2_4TargetTest.cpp b/camera/provider/2.4/vts/functional/VtsHalCameraProviderV2_4TargetTest.cpp index ff8cd49e26..77974fcbe4 100644 --- a/camera/provider/2.4/vts/functional/VtsHalCameraProviderV2_4TargetTest.cpp +++ b/camera/provider/2.4/vts/functional/VtsHalCameraProviderV2_4TargetTest.cpp @@ -4796,15 +4796,24 @@ void CameraHidlTest::processCaptureRequestInternal(uint64_t bufferUsage, ASSERT_EQ(testStream.id, inflightReq.resultOutputBuffers[0].streamId); // For camera device 3.8 or newer, shutterReadoutTimestamp must be - // available, and it must be shutterTimestamp + exposureTime. + // available, and it must be >= shutterTimestamp + exposureTime, and + // < shutterTimestamp + exposureTime + rollingShutterSkew / 2. if (deviceVersion >= CAMERA_DEVICE_API_VERSION_3_8) { ASSERT_TRUE(inflightReq.shutterReadoutTimestampValid); ASSERT_FALSE(inflightReq.collectedResult.isEmpty()); if (inflightReq.collectedResult.exists(ANDROID_SENSOR_EXPOSURE_TIME)) { camera_metadata_entry_t exposureTimeResult = inflightReq.collectedResult.find( ANDROID_SENSOR_EXPOSURE_TIME); - ASSERT_EQ(inflightReq.shutterReadoutTimestamp - inflightReq.shutterTimestamp, - exposureTimeResult.data.i64[0]); + nsecs_t exposureToReadout = + inflightReq.shutterReadoutTimestamp - inflightReq.shutterTimestamp; + ASSERT_GE(exposureToReadout, exposureTimeResult.data.i64[0]); + if (inflightReq.collectedResult.exists(ANDROID_SENSOR_ROLLING_SHUTTER_SKEW)) { + camera_metadata_entry_t rollingShutterSkew = + inflightReq.collectedResult.find( + ANDROID_SENSOR_ROLLING_SHUTTER_SKEW); + ASSERT_LT(exposureToReadout, exposureTimeResult.data.i64[0] + + rollingShutterSkew.data.i64[0] / 2); + } } }