1 /* 2 * Copyright (C) 2022 The Android Open Source Project 3 * 4 * Licensed under the Apache License, Version 2.0 (the "License"); 5 * you may not use this file except in compliance with the License. 6 * You may obtain a copy of the License at 7 * 8 * http://www.apache.org/licenses/LICENSE-2.0 9 * 10 * Unless required by applicable law or agreed to in writing, software 11 * distributed under the License is distributed on an "AS IS" BASIS, 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 * See the License for the specific language governing permissions and 14 * limitations under the License. 15 */ 16 17 #ifndef HARDWARE_INTERFACES_CAMERA_PROVIDER_AIDL_VTS_CAMERA_AIDL_TEST_H_ 18 #define HARDWARE_INTERFACES_CAMERA_PROVIDER_AIDL_VTS_CAMERA_AIDL_TEST_H_ 19 20 #define LOG_TAG "camera_aidl_hal_test" 21 22 #include <string> 23 #include <unordered_map> 24 #include <unordered_set> 25 26 #include <CameraMetadata.h> 27 #include <CameraParameters.h> 28 #include <HandleImporter.h> 29 #include <fmq/AidlMessageQueue.h> 30 31 #include <aidl/android/hardware/graphics/common/Dataspace.h> 32 33 #include <aidl/android/hardware/camera/common/Status.h> 34 #include <aidl/android/hardware/camera/common/TorchModeStatus.h> 35 #include <aidl/android/hardware/common/NativeHandle.h> 36 37 #include <aidl/android/hardware/camera/device/CaptureResult.h> 38 #include <aidl/android/hardware/camera/device/ErrorCode.h> 39 #include <aidl/android/hardware/camera/device/HalStream.h> 40 #include <aidl/android/hardware/camera/device/ICameraDevice.h> 41 #include <aidl/android/hardware/camera/device/NotifyMsg.h> 42 #include <aidl/android/hardware/camera/device/PhysicalCameraMetadata.h> 43 #include <aidl/android/hardware/camera/device/Stream.h> 44 45 #include <aidl/android/hardware/camera/provider/ICameraProvider.h> 46 47 #include <aidl/android/hardware/graphics/common/PixelFormat.h> 48 49 #include <gtest/gtest.h> 50 51 #include <log/log.h> 52 #include <system/camera_metadata.h> 53 #include <utils/KeyedVector.h> 54 #include <utils/Timers.h> 55 56 using ::aidl::android::hardware::camera::common::Status; 57 using ::aidl::android::hardware::camera::common::TorchModeStatus; 58 using ::aidl::android::hardware::camera::device::BufferRequest; 59 using ::aidl::android::hardware::camera::device::BufferRequestStatus; 60 using ::aidl::android::hardware::camera::device::CameraMetadata; 61 using ::aidl::android::hardware::camera::device::CaptureResult; 62 using ::aidl::android::hardware::camera::device::ErrorCode; 63 using ::aidl::android::hardware::camera::device::HalStream; 64 using ::aidl::android::hardware::camera::device::ICameraDevice; 65 using ::aidl::android::hardware::camera::device::ICameraDeviceSession; 66 using ::aidl::android::hardware::camera::device::ICameraInjectionSession; 67 using ::aidl::android::hardware::camera::device::NotifyMsg; 68 using ::aidl::android::hardware::camera::device::PhysicalCameraMetadata; 69 using ::aidl::android::hardware::camera::device::RequestTemplate; 70 using ::aidl::android::hardware::camera::device::Stream; 71 using ::aidl::android::hardware::camera::device::StreamBuffer; 72 using ::aidl::android::hardware::camera::device::StreamBufferRet; 73 using ::aidl::android::hardware::camera::device::StreamConfiguration; 74 using ::aidl::android::hardware::camera::device::StreamConfigurationMode; 75 using ::aidl::android::hardware::camera::provider::ConcurrentCameraIdCombination; 76 using ::aidl::android::hardware::camera::provider::ICameraProvider; 77 78 using ::aidl::android::hardware::common::NativeHandle; 79 using ::aidl::android::hardware::common::fmq::SynchronizedReadWrite; 80 81 using ::aidl::android::hardware::graphics::common::Dataspace; 82 using ::aidl::android::hardware::graphics::common::PixelFormat; 83 84 using ::android::hardware::camera::common::V1_0::helper::HandleImporter; 85 using ::android::hardware::camera::common::V1_0::helper::Size; 86 87 using ResultMetadataQueue = android::AidlMessageQueue<int8_t, SynchronizedReadWrite>; 88 89 using ::ndk::ScopedAStatus; 90 91 class DeviceCb; // Forward declare to break circular header dependency 92 93 class CameraAidlTest : public ::testing::TestWithParam<std::string> { 94 public: 95 enum SystemCameraKind { 96 /** 97 * These camera devices are visible to all apps and system components alike 98 */ 99 PUBLIC = 0, 100 101 /** 102 * These camera devices are visible only to processes having the 103 * android.permission.SYSTEM_CAMERA permission. They are not exposed to 3P 104 * apps. 105 */ 106 SYSTEM_ONLY_CAMERA, 107 108 /** 109 * These camera devices are visible only to HAL clients (that try to connect 110 * on a hwbinder thread). 111 */ 112 HIDDEN_SECURE_CAMERA 113 }; 114 115 struct AvailableStream { 116 int32_t width; 117 int32_t height; 118 int32_t format; 119 }; 120 121 enum ReprocessType { 122 PRIV_REPROCESS, 123 YUV_REPROCESS, 124 }; 125 126 struct AvailableZSLInputOutput { 127 int32_t inputFormat; 128 int32_t outputFormat; 129 }; 130 131 virtual void SetUp() override; 132 virtual void TearDown() override; 133 134 std::vector<std::string> getCameraDeviceNames(std::shared_ptr<ICameraProvider>& provider, 135 bool addSecureOnly = false); 136 137 static bool isSecureOnly(const std::shared_ptr<ICameraProvider>& provider, 138 const std::string& name); 139 140 std::map<std::string, std::string> getCameraDeviceIdToNameMap( 141 std::shared_ptr<ICameraProvider> provider); 142 143 static std::vector<ConcurrentCameraIdCombination> getConcurrentDeviceCombinations( 144 std::shared_ptr<ICameraProvider>& provider); 145 146 void notifyDeviceState(int64_t state); 147 148 static void allocateGraphicBuffer(uint32_t width, uint32_t height, uint64_t usage, 149 PixelFormat format, buffer_handle_t* buffer_handle /*out*/); 150 151 static void openEmptyDeviceSession(const std::string& name, 152 const std::shared_ptr<ICameraProvider>& provider, 153 std::shared_ptr<ICameraDeviceSession>* session /*out*/, 154 CameraMetadata* staticMeta /*out*/, 155 std::shared_ptr<ICameraDevice>* device /*out*/); 156 static void openEmptyInjectionSession(const std::string& name, 157 const std::shared_ptr<ICameraProvider>& provider, 158 std::shared_ptr<ICameraInjectionSession>* session /*out*/, 159 CameraMetadata* staticMeta /*out*/, 160 std::shared_ptr<ICameraDevice>* device /*out*/); 161 162 static void createStreamConfiguration(std::vector<Stream>& streams, 163 StreamConfigurationMode configMode, 164 StreamConfiguration* config, int32_t jpegBufferSize = 0); 165 166 void configureOfflineStillStream( 167 const std::string& name, const std::shared_ptr<ICameraProvider>& provider, 168 const AvailableStream* threshold, 169 std::shared_ptr<ICameraDeviceSession>* session /*out*/, Stream* stream /*out*/, 170 std::vector<HalStream>* halStreams, bool* supportsPartialResults /*out*/, 171 int32_t* partialResultCount /*out*/, std::shared_ptr<DeviceCb>* outCb /*out*/, 172 int32_t* jpegBufferSize /*out*/, bool* useHalBufManager /*out*/); 173 174 void configureStreams( 175 const std::string& name, const std::shared_ptr<ICameraProvider>& provider, 176 PixelFormat format, std::shared_ptr<ICameraDeviceSession>* session /*out*/, 177 Stream* previewStream /*out*/, std::vector<HalStream>* halStreams /*out*/, 178 bool* supportsPartialResults /*out*/, int32_t* partialResultCount /*out*/, 179 bool* useHalBufManager /*out*/, std::shared_ptr<DeviceCb>* outCb /*out*/, 180 uint32_t streamConfigCounter, bool maxResolution, 181 aidl::android::hardware::camera::metadata::RequestAvailableDynamicRangeProfilesMap 182 prof = ::aidl::android::hardware::camera::metadata:: 183 RequestAvailableDynamicRangeProfilesMap:: 184 ANDROID_REQUEST_AVAILABLE_DYNAMIC_RANGE_PROFILES_MAP_STANDARD); 185 186 void configurePreviewStreams( 187 const std::string& name, const std::shared_ptr<ICameraProvider>& provider, 188 const AvailableStream* previewThreshold, 189 const std::unordered_set<std::string>& physicalIds, 190 std::shared_ptr<ICameraDeviceSession>* session /*out*/, Stream* previewStream /*out*/, 191 std::vector<HalStream>* halStreams /*out*/, bool* supportsPartialResults /*out*/, 192 int32_t* partialResultCount /*out*/, bool* useHalBufManager /*out*/, 193 std::shared_ptr<DeviceCb>* cb /*out*/, int32_t streamConfigCounter = 0, 194 bool allowUnsupport = false); 195 196 void configurePreviewStream( 197 const std::string& name, const std::shared_ptr<ICameraProvider>& provider, 198 const AvailableStream* previewThreshold, 199 std::shared_ptr<ICameraDeviceSession>* session /*out*/, Stream* previewStream /*out*/, 200 std::vector<HalStream>* halStreams /*out*/, bool* supportsPartialResults /*out*/, 201 int32_t* partialResultCount /*out*/, bool* useHalBufManager /*out*/, 202 std::shared_ptr<DeviceCb>* cb /*out*/, uint32_t streamConfigCounter = 0); 203 204 void configureSingleStream( 205 const std::string& name, const std::shared_ptr<ICameraProvider>& provider, 206 const AvailableStream* previewThreshold, uint64_t bufferUsage, 207 RequestTemplate reqTemplate, std::shared_ptr<ICameraDeviceSession>* session /*out*/, 208 Stream* previewStream /*out*/, std::vector<HalStream>* halStreams /*out*/, 209 bool* supportsPartialResults /*out*/, int32_t* partialResultCount /*out*/, 210 bool* useHalBufManager /*out*/, std::shared_ptr<DeviceCb>* cb /*out*/, 211 uint32_t streamConfigCounter = 0); 212 213 void verifyLogicalOrUltraHighResCameraMetadata(const std::string& cameraName, 214 const std::shared_ptr<ICameraDevice>& device, 215 const CameraMetadata& chars, 216 const std::vector<std::string>& deviceNames); 217 218 static void verifyCameraCharacteristics(const CameraMetadata& chars); 219 220 static void verifyExtendedSceneModeCharacteristics(const camera_metadata_t* metadata); 221 222 static void verifyZoomCharacteristics(const camera_metadata_t* metadata); 223 224 static void verifyRecommendedConfigs(const CameraMetadata& chars); 225 226 static void verifyMonochromeCharacteristics(const CameraMetadata& chars); 227 228 static void verifyMonochromeCameraResult( 229 const ::android::hardware::camera::common::V1_0::helper::CameraMetadata& metadata); 230 231 static void verifyStreamUseCaseCharacteristics(const camera_metadata_t* metadata); 232 233 static void verifyStreamCombination(const std::shared_ptr<ICameraDevice>& device, 234 const StreamConfiguration& config, bool expectedStatus, 235 bool expectStreamCombQuery); 236 237 static void verifyLogicalCameraResult(const camera_metadata_t* staticMetadata, 238 const std::vector<uint8_t>& resultMetadata); 239 240 static void verifyBuffersReturned(const std::shared_ptr<ICameraDeviceSession>& session, 241 int32_t streamId, const std::shared_ptr<DeviceCb>& cb, 242 uint32_t streamConfigCounter = 0); 243 244 void verifyBuffersReturned(const std::shared_ptr<ICameraDeviceSession>& session, 245 const std::vector<int32_t>& streamIds, 246 const std::shared_ptr<DeviceCb>& cb, 247 uint32_t streamConfigCounter = 0); 248 249 static void verifySessionReconfigurationQuery( 250 const std::shared_ptr<ICameraDeviceSession>& session, camera_metadata* oldSessionParams, 251 camera_metadata* newSessionParams); 252 253 static void verifyRequestTemplate(const camera_metadata_t* metadata, 254 RequestTemplate requestTemplate); 255 256 static void overrideRotateAndCrop(CameraMetadata* settings /*in/out*/); 257 258 static bool isDepthOnly(const camera_metadata_t* staticMeta); 259 260 static bool isUltraHighResolution(const camera_metadata_t* staticMeta); 261 262 static Status getAvailableOutputStreams(const camera_metadata_t* staticMeta, 263 std::vector<AvailableStream>& outputStreams, 264 const AvailableStream* threshold = nullptr, 265 bool maxResolution = false); 266 267 static Status getMaxOutputSizeForFormat(const camera_metadata_t* staticMeta, PixelFormat format, 268 Size* size, bool maxResolution = false); 269 270 static Status getMandatoryConcurrentStreams(const camera_metadata_t* staticMeta, 271 std::vector<AvailableStream>* outputStreams); 272 273 static bool supportsPreviewStabilization(const std::string& name, 274 const std::shared_ptr<ICameraProvider>& provider); 275 276 static Status getJpegBufferSize(camera_metadata_t* staticMeta, int32_t* outBufSize); 277 278 static Status isConstrainedModeAvailable(camera_metadata_t* staticMeta); 279 280 static Status isLogicalMultiCamera(const camera_metadata_t* staticMeta); 281 282 static bool isTorchSupported(const camera_metadata_t* staticMeta); 283 284 static bool isTorchStrengthControlSupported(const camera_metadata_t* staticMeta); 285 286 static Status isOfflineSessionSupported(const camera_metadata_t* staticMeta); 287 288 static Status getPhysicalCameraIds(const camera_metadata_t* staticMeta, 289 std::unordered_set<std::string>* physicalIds /*out*/); 290 291 static Status getSupportedKeys(camera_metadata_t* staticMeta, uint32_t tagId, 292 std::unordered_set<int32_t>* requestIDs /*out*/); 293 294 static void fillOutputStreams(camera_metadata_ro_entry_t* entry, 295 std::vector<AvailableStream>& outputStreams, 296 const AvailableStream* threshold = nullptr, 297 const int32_t availableConfigOutputTag = 0u); 298 299 static void constructFilteredSettings( 300 const std::shared_ptr<ICameraDeviceSession>& session, 301 const std::unordered_set<int32_t>& availableKeys, RequestTemplate reqTemplate, 302 android::hardware::camera::common::V1_0::helper::CameraMetadata* 303 defaultSettings /*out*/, 304 android::hardware::camera::common::V1_0::helper::CameraMetadata* filteredSettings 305 /*out*/); 306 307 static Status pickConstrainedModeSize(camera_metadata_t* staticMeta, 308 AvailableStream& hfrStream); 309 310 static Status isZSLModeAvailable(const camera_metadata_t* staticMeta); 311 312 static Status isZSLModeAvailable(const camera_metadata_t* staticMeta, ReprocessType reprocType); 313 314 static Status getZSLInputOutputMap(camera_metadata_t* staticMeta, 315 std::vector<AvailableZSLInputOutput>& inputOutputMap); 316 317 static Status findLargestSize(const std::vector<AvailableStream>& streamSizes, int32_t format, 318 AvailableStream& result); 319 320 static Status isMonochromeCamera(const camera_metadata_t* staticMeta); 321 322 static Status getSystemCameraKind(const camera_metadata_t* staticMeta, 323 SystemCameraKind* systemCameraKind); 324 325 static void getMultiResolutionStreamConfigurations( 326 camera_metadata_ro_entry* multiResStreamConfigs, 327 camera_metadata_ro_entry* streamConfigs, 328 camera_metadata_ro_entry* maxResolutionStreamConfigs, 329 const camera_metadata_t* staticMetadata); 330 331 static void getPrivacyTestPatternModes( 332 const camera_metadata_t* staticMetadata, 333 std::unordered_set<int32_t>* privacyTestPatternModes /*out*/); 334 335 static Dataspace getDataspace(PixelFormat format); 336 337 void processCaptureRequestInternal(uint64_t bufferUsage, RequestTemplate reqTemplate, 338 bool useSecureOnlyCameras); 339 340 void processPreviewStabilizationCaptureRequestInternal( 341 bool previewStabilizationOn, 342 /*inout*/ std::unordered_map<std::string, nsecs_t>& cameraDeviceToTimeLag); 343 344 static bool is10BitDynamicRangeCapable(const camera_metadata_t* staticMeta); 345 346 static void get10BitDynamicRangeProfiles( 347 const camera_metadata_t* staticMeta, 348 std::vector<aidl::android::hardware::camera::metadata:: 349 RequestAvailableDynamicRangeProfilesMap>* profiles); 350 351 // Used by switchToOffline where a new result queue is created for offline reqs 352 void updateInflightResultQueue(const std::shared_ptr<ResultMetadataQueue>& resultQueue); 353 354 static Size getMinSize(Size a, Size b); 355 356 protected: 357 // In-flight queue for tracking completion of capture requests. 358 struct InFlightRequest { 359 // Set by notify() SHUTTER call. 360 nsecs_t shutterTimestamp; 361 362 bool shutterReadoutTimestampValid; 363 nsecs_t shutterReadoutTimestamp; 364 365 bool errorCodeValid; 366 ErrorCode errorCode; 367 368 // Is partial result supported 369 bool usePartialResult; 370 371 // Partial result count expected 372 int32_t numPartialResults; 373 374 // Message queue 375 std::shared_ptr<ResultMetadataQueue> resultQueue; 376 377 // Set by process_capture_result call with valid metadata 378 bool haveResultMetadata; 379 380 // Decremented by calls to process_capture_result with valid output 381 // and input buffers 382 ssize_t numBuffersLeft; 383 384 // A 64bit integer to index the frame number associated with this result. 385 int64_t frameNumber; 386 387 // The partial result count (index) for this capture result. 388 int32_t partialResultCount; 389 390 // For buffer drop errors, the stream ID for the stream that lost a buffer. 391 // For physical sub-camera result errors, the Id of the physical stream 392 // for the physical sub-camera. 393 // Otherwise -1. 394 int32_t errorStreamId; 395 396 // If this request has any input buffer 397 bool hasInputBuffer; 398 399 // Result metadata 400 ::android::hardware::camera::common::V1_0::helper::CameraMetadata collectedResult; 401 402 // Inflight buffers 403 using OutstandingBuffers = std::unordered_map<uint64_t, buffer_handle_t>; 404 std::vector<OutstandingBuffers> mOutstandingBufferIds; 405 406 // A copy-able StreamBuffer using buffer_handle_t instead of AIDLs NativeHandle 407 struct NativeStreamBuffer { 408 int32_t streamId; 409 int64_t bufferId; 410 buffer_handle_t buffer; 411 aidl::android::hardware::camera::device::BufferStatus status; 412 buffer_handle_t acquireFence; 413 buffer_handle_t releaseFence; 414 }; 415 416 // Buffers are added by process_capture_result when output buffers 417 // return from HAL but framework. 418 struct StreamBufferAndTimestamp { 419 NativeStreamBuffer buffer; 420 nsecs_t timeStamp; 421 }; 422 std::vector<StreamBufferAndTimestamp> resultOutputBuffers; 423 424 std::unordered_set<std::string> expectedPhysicalResults; 425 InFlightRequestInFlightRequest426 InFlightRequest() 427 : shutterTimestamp(0), 428 shutterReadoutTimestampValid(false), 429 shutterReadoutTimestamp(0), 430 errorCodeValid(false), 431 errorCode(ErrorCode::ERROR_BUFFER), 432 usePartialResult(false), 433 numPartialResults(0), 434 resultQueue(nullptr), 435 haveResultMetadata(false), 436 numBuffersLeft(0), 437 frameNumber(0), 438 partialResultCount(0), 439 errorStreamId(-1), 440 hasInputBuffer(false), 441 collectedResult(1, 10) {} 442 443 InFlightRequest(ssize_t numBuffers, bool hasInput, bool partialResults, 444 int32_t partialCount, std::shared_ptr<ResultMetadataQueue> queue = nullptr) 445 : shutterTimestamp(0), 446 shutterReadoutTimestampValid(false), 447 shutterReadoutTimestamp(0), 448 errorCodeValid(false), 449 errorCode(ErrorCode::ERROR_BUFFER), 450 usePartialResult(partialResults), 451 numPartialResults(partialCount), 452 resultQueue(queue), 453 haveResultMetadata(false), 454 numBuffersLeft(numBuffers), 455 frameNumber(0), 456 partialResultCount(0), 457 errorStreamId(-1), 458 hasInputBuffer(hasInput), 459 collectedResult(1, 10) {} 460 461 InFlightRequest(ssize_t numBuffers, bool hasInput, bool partialResults, 462 int32_t partialCount, 463 const std::unordered_set<std::string>& extraPhysicalResult, 464 std::shared_ptr<ResultMetadataQueue> queue = nullptr) 465 : shutterTimestamp(0), 466 shutterReadoutTimestampValid(false), 467 shutterReadoutTimestamp(0), 468 errorCodeValid(false), 469 errorCode(ErrorCode::ERROR_BUFFER), 470 usePartialResult(partialResults), 471 numPartialResults(partialCount), 472 resultQueue(queue), 473 haveResultMetadata(false), 474 numBuffersLeft(numBuffers), 475 frameNumber(0), 476 partialResultCount(0), 477 errorStreamId(-1), 478 hasInputBuffer(hasInput), 479 collectedResult(1, 10), 480 expectedPhysicalResults(extraPhysicalResult) {} 481 }; 482 483 static bool matchDeviceName(const std::string& deviceName, const std::string& providerType, 484 std::string* deviceVersion, std::string* cameraId); 485 486 static void verify10BitMetadata( 487 HandleImporter& importer, const InFlightRequest& request, 488 aidl::android::hardware::camera::metadata::RequestAvailableDynamicRangeProfilesMap 489 profile); 490 491 static void waitForReleaseFence( 492 std::vector<InFlightRequest::StreamBufferAndTimestamp>& resultOutputBuffers); 493 494 // Map from frame number to the in-flight request state 495 typedef std::unordered_map<uint32_t, std::shared_ptr<InFlightRequest>> InFlightMap; 496 497 std::mutex mLock; // Synchronize access to member variables 498 std::condition_variable mResultCondition; // Condition variable for incoming results 499 InFlightMap mInflightMap; // Map of all inflight requests 500 501 std::vector<NotifyMsg> mNotifyMessages; // Current notification message 502 503 std::mutex mTorchLock; // Synchronize access to torch status 504 std::condition_variable mTorchCond; // Condition variable for torch status 505 TorchModeStatus mTorchStatus; // Current torch status 506 507 // Camera provider service 508 std::shared_ptr<ICameraProvider> mProvider; 509 510 // Camera device session used by the tests 511 // Tests should take care of closing this session and setting it back to nullptr in successful 512 // case. Declared as a field to allow TeadDown function to close the session if a test assertion 513 // fails. 514 std::shared_ptr<ICameraDeviceSession> mSession; 515 516 // Camera provider type. 517 std::string mProviderType; 518 519 HandleImporter mHandleImporter; 520 521 friend class DeviceCb; 522 friend class SimpleDeviceCb; 523 friend class TorchProviderCb; 524 }; 525 526 namespace { 527 // device@<major>.<minor>/<type>/id 528 const char* kDeviceNameRE = "device@([0-9]+\\.[0-9]+)/\\s+/(.+)"; 529 const int32_t kMaxVideoWidth = 4096; 530 const int32_t kMaxVideoHeight = 2160; 531 532 const int64_t kStreamBufferTimeoutSec = 3; 533 const int64_t kTorchTimeoutSec = 1; 534 const char* kDumpOutput = "/dev/null"; 535 const uint32_t kMaxPreviewWidth = 1920; 536 const uint32_t kMaxPreviewHeight = 1080; 537 } // namespace 538 #endif // HARDWARE_INTERFACES_CAMERA_PROVIDER_AIDL_VTS_CAMERA_AIDL_TEST_H_ 539