diff --git a/camera/provider/2.4/vts/functional/VtsHalCameraProviderV2_4TargetTest.cpp b/camera/provider/2.4/vts/functional/VtsHalCameraProviderV2_4TargetTest.cpp index 3254cf2a21..7e5e8b2bae 100644 --- a/camera/provider/2.4/vts/functional/VtsHalCameraProviderV2_4TargetTest.cpp +++ b/camera/provider/2.4/vts/functional/VtsHalCameraProviderV2_4TargetTest.cpp @@ -171,6 +171,27 @@ struct AvailableStream { int32_t format; }; +struct RecordingRateSizePair { + int32_t recordingRate; + int32_t width; + int32_t height; + + bool operator==(const RecordingRateSizePair &p) const{ + return p.recordingRate == recordingRate && + p.width == width && + p.height == height; + } +}; + +struct RecordingRateSizePairHasher { + size_t operator()(const RecordingRateSizePair& p) const { + std::size_t p1 = std::hash()(p.recordingRate); + std::size_t p2 = std::hash()(p.width); + std::size_t p3 = std::hash()(p.height); + return p1 ^ p2 ^ p3; + } +}; + struct AvailableZSLInputOutput { int32_t inputFormat; int32_t outputFormat; @@ -4540,6 +4561,39 @@ TEST_P(CameraHidlTest, configureStreamsConstrainedOutputs) { rc = pickConstrainedModeSize(staticMeta, hfrStream); ASSERT_EQ(Status::OK, rc); + // Check that HAL does not advertise multiple preview rates + // for the same recording rate and size. + camera_metadata_ro_entry entry; + + std::unordered_map fpsRangeMap; + + auto retCode = find_camera_metadata_ro_entry(staticMeta, + ANDROID_CONTROL_AVAILABLE_HIGH_SPEED_VIDEO_CONFIGURATIONS, &entry); + ASSERT_EQ(retCode, 0); + ASSERT_GT(entry.count, 0); + + for (size_t i = 0; i < entry.count; i+=5) { + RecordingRateSizePair recordingRateSizePair; + recordingRateSizePair.width = entry.data.i32[i]; + recordingRateSizePair.height = entry.data.i32[i+1]; + + int32_t previewFps = entry.data.i32[i+2]; + int32_t recordingFps = entry.data.i32[i+3]; + recordingRateSizePair.recordingRate = recordingFps; + + if (recordingFps != previewFps) { + auto it = fpsRangeMap.find(recordingRateSizePair); + if (it == fpsRangeMap.end()) { + fpsRangeMap.insert(std::make_pair(recordingRateSizePair,previewFps)); + ALOGV("Added RecordingRateSizePair:%d , %d, %d PreviewRate: %d", + recordingFps, recordingRateSizePair.width, recordingRateSizePair.height, + previewFps); + } else { + ASSERT_EQ(previewFps, it->second); + } + } + } + int32_t streamId = 0; uint32_t streamConfigCounter = 0; V3_2::Stream stream = {streamId,