1 /* 2 * Copyright (C) 2016-2018 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 #define LOG_TAG "camera_hidl_hal_test" 18 19 #include <algorithm> 20 #include <chrono> 21 #include <mutex> 22 #include <regex> 23 #include <unordered_map> 24 #include <unordered_set> 25 #include <condition_variable> 26 27 #include <inttypes.h> 28 29 #include <android/hardware/camera/device/1.0/ICameraDevice.h> 30 #include <android/hardware/camera/device/3.2/ICameraDevice.h> 31 #include <android/hardware/camera/device/3.5/ICameraDevice.h> 32 #include <android/hardware/camera/device/3.3/ICameraDeviceSession.h> 33 #include <android/hardware/camera/device/3.4/ICameraDeviceSession.h> 34 #include <android/hardware/camera/device/3.5/ICameraDeviceSession.h> 35 #include <android/hardware/camera/device/3.4/ICameraDeviceCallback.h> 36 #include <android/hardware/camera/device/3.5/ICameraDeviceCallback.h> 37 #include <android/hardware/camera/provider/2.4/ICameraProvider.h> 38 #include <android/hardware/camera/provider/2.5/ICameraProvider.h> 39 #include <android/hardware/camera/metadata/3.4/types.h> 40 #include <android/hidl/manager/1.0/IServiceManager.h> 41 #include <binder/MemoryHeapBase.h> 42 #include <CameraMetadata.h> 43 #include <CameraParameters.h> 44 #include <cutils/properties.h> 45 #include <fmq/MessageQueue.h> 46 #include <grallocusage/GrallocUsageConversion.h> 47 #include <gui/BufferItemConsumer.h> 48 #include <gui/BufferQueue.h> 49 #include <gui/Surface.h> 50 #include <hardware/gralloc.h> 51 #include <hardware/gralloc1.h> 52 #include <system/camera.h> 53 #include <system/camera_metadata.h> 54 #include <ui/GraphicBuffer.h> 55 56 #include <android/hardware/graphics/allocator/2.0/IAllocator.h> 57 #include <android/hardware/graphics/allocator/3.0/IAllocator.h> 58 #include <android/hardware/graphics/mapper/2.0/IMapper.h> 59 #include <android/hardware/graphics/mapper/2.0/types.h> 60 #include <android/hardware/graphics/mapper/3.0/IMapper.h> 61 #include <android/hidl/allocator/1.0/IAllocator.h> 62 #include <android/hidl/memory/1.0/IMapper.h> 63 #include <android/hidl/memory/1.0/IMemory.h> 64 65 #include <VtsHalHidlTargetTestBase.h> 66 #include <VtsHalHidlTargetTestEnvBase.h> 67 68 using namespace ::android::hardware::camera::device; 69 using ::android::hardware::Return; 70 using ::android::hardware::Void; 71 using ::android::hardware::hidl_bitfield; 72 using ::android::hardware::hidl_handle; 73 using ::android::hardware::hidl_string; 74 using ::android::hardware::hidl_vec; 75 using ::android::sp; 76 using ::android::wp; 77 using ::android::GraphicBuffer; 78 using ::android::IGraphicBufferProducer; 79 using ::android::IGraphicBufferConsumer; 80 using ::android::BufferQueue; 81 using ::android::BufferItemConsumer; 82 using ::android::Surface; 83 using ::android::hardware::graphics::common::V1_0::BufferUsage; 84 using ::android::hardware::graphics::common::V1_0::Dataspace; 85 using ::android::hardware::graphics::common::V1_0::PixelFormat; 86 using ::android::hardware::camera::common::V1_0::Status; 87 using ::android::hardware::camera::common::V1_0::CameraDeviceStatus; 88 using ::android::hardware::camera::common::V1_0::TorchMode; 89 using ::android::hardware::camera::common::V1_0::TorchModeStatus; 90 using ::android::hardware::camera::common::V1_0::helper::CameraParameters; 91 using ::android::hardware::camera::common::V1_0::helper::Size; 92 using ::android::hardware::camera::provider::V2_4::ICameraProvider; 93 using ::android::hardware::camera::provider::V2_4::ICameraProviderCallback; 94 using ::android::hardware::camera::device::V3_2::ICameraDevice; 95 using ::android::hardware::camera::device::V3_2::BufferCache; 96 using ::android::hardware::camera::device::V3_2::CaptureRequest; 97 using ::android::hardware::camera::device::V3_2::CaptureResult; 98 using ::android::hardware::camera::device::V3_2::ICameraDeviceSession; 99 using ::android::hardware::camera::device::V3_2::NotifyMsg; 100 using ::android::hardware::camera::device::V3_2::RequestTemplate; 101 using ::android::hardware::camera::device::V3_2::StreamType; 102 using ::android::hardware::camera::device::V3_2::StreamRotation; 103 using ::android::hardware::camera::device::V3_2::StreamConfiguration; 104 using ::android::hardware::camera::device::V3_2::StreamConfigurationMode; 105 using ::android::hardware::camera::device::V3_2::CameraMetadata; 106 using ::android::hardware::camera::device::V3_2::HalStreamConfiguration; 107 using ::android::hardware::camera::device::V3_2::BufferStatus; 108 using ::android::hardware::camera::device::V3_2::StreamBuffer; 109 using ::android::hardware::camera::device::V3_2::MsgType; 110 using ::android::hardware::camera::device::V3_2::ErrorMsg; 111 using ::android::hardware::camera::device::V3_2::ErrorCode; 112 using ::android::hardware::camera::device::V1_0::CameraFacing; 113 using ::android::hardware::camera::device::V1_0::NotifyCallbackMsg; 114 using ::android::hardware::camera::device::V1_0::CommandType; 115 using ::android::hardware::camera::device::V1_0::DataCallbackMsg; 116 using ::android::hardware::camera::device::V1_0::CameraFrameMetadata; 117 using ::android::hardware::camera::device::V1_0::ICameraDevicePreviewCallback; 118 using ::android::hardware::camera::device::V1_0::FrameCallbackFlag; 119 using ::android::hardware::camera::device::V1_0::HandleTimestampMessage; 120 using ::android::hardware::camera::metadata::V3_4::CameraMetadataEnumAndroidSensorInfoColorFilterArrangement; 121 using ::android::hardware::camera::metadata::V3_4::CameraMetadataTag; 122 using ::android::hardware::camera::device::V3_4::PhysicalCameraMetadata; 123 using ::android::hardware::MessageQueue; 124 using ::android::hardware::kSynchronizedReadWrite; 125 using ::android::hidl::allocator::V1_0::IAllocator; 126 using ::android::hidl::memory::V1_0::IMemory; 127 using ::android::hidl::memory::V1_0::IMapper; 128 using ResultMetadataQueue = MessageQueue<uint8_t, kSynchronizedReadWrite>; 129 using ::android::hidl::manager::V1_0::IServiceManager; 130 131 using namespace ::android::hardware::camera; 132 133 const uint32_t kMaxPreviewWidth = 1920; 134 const uint32_t kMaxPreviewHeight = 1080; 135 const uint32_t kMaxVideoWidth = 4096; 136 const uint32_t kMaxVideoHeight = 2160; 137 const int64_t kStreamBufferTimeoutSec = 3; 138 const int64_t kAutoFocusTimeoutSec = 5; 139 const int64_t kTorchTimeoutSec = 1; 140 const int64_t kEmptyFlushTimeoutMSec = 200; 141 const char kDumpOutput[] = "/dev/null"; 142 const uint32_t kBurstFrameCount = 10; 143 const int64_t kBufferReturnTimeoutSec = 1; 144 145 struct AvailableStream { 146 int32_t width; 147 int32_t height; 148 int32_t format; 149 }; 150 151 struct AvailableZSLInputOutput { 152 int32_t inputFormat; 153 int32_t outputFormat; 154 }; 155 156 enum ReprocessType { 157 PRIV_REPROCESS, 158 YUV_REPROCESS, 159 }; 160 161 namespace { 162 // "device@<version>/legacy/<id>" 163 const char *kDeviceNameRE = "device@([0-9]+\\.[0-9]+)/%s/(.+)"; 164 const int CAMERA_DEVICE_API_VERSION_3_5 = 0x305; 165 const int CAMERA_DEVICE_API_VERSION_3_4 = 0x304; 166 const int CAMERA_DEVICE_API_VERSION_3_3 = 0x303; 167 const int CAMERA_DEVICE_API_VERSION_3_2 = 0x302; 168 const int CAMERA_DEVICE_API_VERSION_1_0 = 0x100; 169 const char *kHAL3_5 = "3.5"; 170 const char *kHAL3_4 = "3.4"; 171 const char *kHAL3_3 = "3.3"; 172 const char *kHAL3_2 = "3.2"; 173 const char *kHAL1_0 = "1.0"; 174 175 bool matchDeviceName(const hidl_string& deviceName, 176 const hidl_string &providerType, 177 std::string* deviceVersion, 178 std::string* cameraId) { 179 ::android::String8 pattern; 180 pattern.appendFormat(kDeviceNameRE, providerType.c_str()); 181 std::regex e(pattern.string()); 182 std::string deviceNameStd(deviceName.c_str()); 183 std::smatch sm; 184 if (std::regex_match(deviceNameStd, sm, e)) { 185 if (deviceVersion != nullptr) { 186 *deviceVersion = sm[1]; 187 } 188 if (cameraId != nullptr) { 189 *cameraId = sm[2]; 190 } 191 return true; 192 } 193 return false; 194 } 195 196 int getCameraDeviceVersion(const hidl_string& deviceName, 197 const hidl_string &providerType) { 198 std::string version; 199 bool match = matchDeviceName(deviceName, providerType, &version, nullptr); 200 if (!match) { 201 return -1; 202 } 203 204 if (version.compare(kHAL3_5) == 0) { 205 return CAMERA_DEVICE_API_VERSION_3_5; 206 } else if (version.compare(kHAL3_4) == 0) { 207 return CAMERA_DEVICE_API_VERSION_3_4; 208 } else if (version.compare(kHAL3_3) == 0) { 209 return CAMERA_DEVICE_API_VERSION_3_3; 210 } else if (version.compare(kHAL3_2) == 0) { 211 return CAMERA_DEVICE_API_VERSION_3_2; 212 } else if (version.compare(kHAL1_0) == 0) { 213 return CAMERA_DEVICE_API_VERSION_1_0; 214 } 215 return 0; 216 } 217 218 bool parseProviderName(const std::string& name, std::string *type /*out*/, 219 uint32_t *id /*out*/) { 220 if (!type || !id) { 221 ADD_FAILURE(); 222 return false; 223 } 224 225 std::string::size_type slashIdx = name.find('/'); 226 if (slashIdx == std::string::npos || slashIdx == name.size() - 1) { 227 ADD_FAILURE() << "Provider name does not have / separator between type" 228 "and id"; 229 return false; 230 } 231 232 std::string typeVal = name.substr(0, slashIdx); 233 234 char *endPtr; 235 errno = 0; 236 long idVal = strtol(name.c_str() + slashIdx + 1, &endPtr, 10); 237 if (errno != 0) { 238 ADD_FAILURE() << "cannot parse provider id as an integer:" << 239 name.c_str() << strerror(errno) << errno; 240 return false; 241 } 242 if (endPtr != name.c_str() + name.size()) { 243 ADD_FAILURE() << "provider id has unexpected length " << name.c_str(); 244 return false; 245 } 246 if (idVal < 0) { 247 ADD_FAILURE() << "id is negative: " << name.c_str() << idVal; 248 return false; 249 } 250 251 *type = typeVal; 252 *id = static_cast<uint32_t>(idVal); 253 254 return true; 255 } 256 257 Status mapToStatus(::android::status_t s) { 258 switch(s) { 259 case ::android::OK: 260 return Status::OK ; 261 case ::android::BAD_VALUE: 262 return Status::ILLEGAL_ARGUMENT ; 263 case -EBUSY: 264 return Status::CAMERA_IN_USE; 265 case -EUSERS: 266 return Status::MAX_CAMERAS_IN_USE; 267 case ::android::UNKNOWN_TRANSACTION: 268 return Status::METHOD_NOT_SUPPORTED; 269 case ::android::INVALID_OPERATION: 270 return Status::OPERATION_NOT_SUPPORTED; 271 case ::android::DEAD_OBJECT: 272 return Status::CAMERA_DISCONNECTED; 273 } 274 ALOGW("Unexpected HAL status code %d", s); 275 return Status::OPERATION_NOT_SUPPORTED; 276 } 277 278 void getFirstApiLevel(/*out*/int32_t* outApiLevel) { 279 int32_t firstApiLevel = property_get_int32("ro.product.first_api_level", /*default*/-1); 280 if (firstApiLevel < 0) { 281 firstApiLevel = property_get_int32("ro.build.version.sdk", /*default*/-1); 282 } 283 ASSERT_GT(firstApiLevel, 0); // first_api_level must exist 284 *outApiLevel = firstApiLevel; 285 return; 286 } 287 } 288 289 // Test environment for camera 290 class CameraHidlEnvironment : public ::testing::VtsHalHidlTargetTestEnvBase { 291 public: 292 // get the test environment singleton 293 static CameraHidlEnvironment* Instance() { 294 static CameraHidlEnvironment* instance = new CameraHidlEnvironment; 295 return instance; 296 } 297 298 virtual void HidlSetUp() override { ALOGI("SetUp CameraHidlEnvironment"); } 299 300 virtual void HidlTearDown() override { ALOGI("TearDown CameraHidlEnvironment"); } 301 302 virtual void registerTestServices() override { registerTestService<ICameraProvider>(); } 303 304 private: 305 CameraHidlEnvironment() {} 306 307 GTEST_DISALLOW_COPY_AND_ASSIGN_(CameraHidlEnvironment); 308 }; 309 310 struct BufferItemHander: public BufferItemConsumer::FrameAvailableListener { 311 BufferItemHander(wp<BufferItemConsumer> consumer) : mConsumer(consumer) {} 312 313 void onFrameAvailable(const android::BufferItem&) override { 314 sp<BufferItemConsumer> consumer = mConsumer.promote(); 315 ASSERT_NE(nullptr, consumer.get()); 316 317 android::BufferItem buffer; 318 ASSERT_EQ(android::OK, consumer->acquireBuffer(&buffer, 0)); 319 ASSERT_EQ(android::OK, consumer->releaseBuffer(buffer)); 320 } 321 322 private: 323 wp<BufferItemConsumer> mConsumer; 324 }; 325 326 struct PreviewWindowCb : public ICameraDevicePreviewCallback { 327 PreviewWindowCb(sp<ANativeWindow> anw) : mPreviewWidth(0), 328 mPreviewHeight(0), mFormat(0), mPreviewUsage(0), 329 mPreviewSwapInterval(-1), mCrop{-1, -1, -1, -1}, mAnw(anw) {} 330 331 using dequeueBuffer_cb = 332 std::function<void(Status status, uint64_t bufferId, 333 const hidl_handle& buffer, uint32_t stride)>; 334 Return<void> dequeueBuffer(dequeueBuffer_cb _hidl_cb) override; 335 336 Return<Status> enqueueBuffer(uint64_t bufferId) override; 337 338 Return<Status> cancelBuffer(uint64_t bufferId) override; 339 340 Return<Status> setBufferCount(uint32_t count) override; 341 342 Return<Status> setBuffersGeometry(uint32_t w, 343 uint32_t h, PixelFormat format) override; 344 345 Return<Status> setCrop(int32_t left, int32_t top, 346 int32_t right, int32_t bottom) override; 347 348 Return<Status> setUsage(BufferUsage usage) override; 349 350 Return<Status> setSwapInterval(int32_t interval) override; 351 352 using getMinUndequeuedBufferCount_cb = 353 std::function<void(Status status, uint32_t count)>; 354 Return<void> getMinUndequeuedBufferCount( 355 getMinUndequeuedBufferCount_cb _hidl_cb) override; 356 357 Return<Status> setTimestamp(int64_t timestamp) override; 358 359 private: 360 struct BufferHasher { 361 size_t operator()(const buffer_handle_t& buf) const { 362 if (buf == nullptr) 363 return 0; 364 365 size_t result = 1; 366 result = 31 * result + buf->numFds; 367 for (int i = 0; i < buf->numFds; i++) { 368 result = 31 * result + buf->data[i]; 369 } 370 return result; 371 } 372 }; 373 374 struct BufferComparator { 375 bool operator()(const buffer_handle_t& buf1, 376 const buffer_handle_t& buf2) const { 377 if (buf1->numFds == buf2->numFds) { 378 for (int i = 0; i < buf1->numFds; i++) { 379 if (buf1->data[i] != buf2->data[i]) { 380 return false; 381 } 382 } 383 return true; 384 } 385 return false; 386 } 387 }; 388 389 std::pair<bool, uint64_t> getBufferId(ANativeWindowBuffer* anb); 390 void cleanupCirculatingBuffers(); 391 392 std::mutex mBufferIdMapLock; // protecting mBufferIdMap and mNextBufferId 393 typedef std::unordered_map<const buffer_handle_t, uint64_t, 394 BufferHasher, BufferComparator> BufferIdMap; 395 396 BufferIdMap mBufferIdMap; // stream ID -> per stream buffer ID map 397 std::unordered_map<uint64_t, ANativeWindowBuffer*> mReversedBufMap; 398 uint64_t mNextBufferId = 1; 399 400 uint32_t mPreviewWidth, mPreviewHeight; 401 int mFormat, mPreviewUsage; 402 int32_t mPreviewSwapInterval; 403 android_native_rect_t mCrop; 404 sp<ANativeWindow> mAnw; //Native window reference 405 }; 406 407 std::pair<bool, uint64_t> PreviewWindowCb::getBufferId( 408 ANativeWindowBuffer* anb) { 409 std::lock_guard<std::mutex> lock(mBufferIdMapLock); 410 411 buffer_handle_t& buf = anb->handle; 412 auto it = mBufferIdMap.find(buf); 413 if (it == mBufferIdMap.end()) { 414 uint64_t bufId = mNextBufferId++; 415 mBufferIdMap[buf] = bufId; 416 mReversedBufMap[bufId] = anb; 417 return std::make_pair(true, bufId); 418 } else { 419 return std::make_pair(false, it->second); 420 } 421 } 422 423 void PreviewWindowCb::cleanupCirculatingBuffers() { 424 std::lock_guard<std::mutex> lock(mBufferIdMapLock); 425 mBufferIdMap.clear(); 426 mReversedBufMap.clear(); 427 } 428 429 Return<void> PreviewWindowCb::dequeueBuffer(dequeueBuffer_cb _hidl_cb) { 430 ANativeWindowBuffer* anb; 431 auto rc = native_window_dequeue_buffer_and_wait(mAnw.get(), &anb); 432 uint64_t bufferId = 0; 433 uint32_t stride = 0; 434 hidl_handle buf = nullptr; 435 if (rc == ::android::OK) { 436 auto pair = getBufferId(anb); 437 buf = (pair.first) ? anb->handle : nullptr; 438 bufferId = pair.second; 439 stride = anb->stride; 440 } 441 442 _hidl_cb(mapToStatus(rc), bufferId, buf, stride); 443 return Void(); 444 } 445 446 Return<Status> PreviewWindowCb::enqueueBuffer(uint64_t bufferId) { 447 if (mReversedBufMap.count(bufferId) == 0) { 448 ALOGE("%s: bufferId %" PRIu64 " not found", __FUNCTION__, bufferId); 449 return Status::ILLEGAL_ARGUMENT; 450 } 451 return mapToStatus(mAnw->queueBuffer(mAnw.get(), 452 mReversedBufMap.at(bufferId), -1)); 453 } 454 455 Return<Status> PreviewWindowCb::cancelBuffer(uint64_t bufferId) { 456 if (mReversedBufMap.count(bufferId) == 0) { 457 ALOGE("%s: bufferId %" PRIu64 " not found", __FUNCTION__, bufferId); 458 return Status::ILLEGAL_ARGUMENT; 459 } 460 return mapToStatus(mAnw->cancelBuffer(mAnw.get(), 461 mReversedBufMap.at(bufferId), -1)); 462 } 463 464 Return<Status> PreviewWindowCb::setBufferCount(uint32_t count) { 465 if (mAnw.get() != nullptr) { 466 // WAR for b/27039775 467 native_window_api_disconnect(mAnw.get(), NATIVE_WINDOW_API_CAMERA); 468 native_window_api_connect(mAnw.get(), NATIVE_WINDOW_API_CAMERA); 469 if (mPreviewWidth != 0) { 470 native_window_set_buffers_dimensions(mAnw.get(), 471 mPreviewWidth, mPreviewHeight); 472 native_window_set_buffers_format(mAnw.get(), mFormat); 473 } 474 if (mPreviewUsage != 0) { 475 native_window_set_usage(mAnw.get(), mPreviewUsage); 476 } 477 if (mPreviewSwapInterval >= 0) { 478 mAnw->setSwapInterval(mAnw.get(), mPreviewSwapInterval); 479 } 480 if (mCrop.left >= 0) { 481 native_window_set_crop(mAnw.get(), &(mCrop)); 482 } 483 } 484 485 auto rc = native_window_set_buffer_count(mAnw.get(), count); 486 if (rc == ::android::OK) { 487 cleanupCirculatingBuffers(); 488 } 489 490 return mapToStatus(rc); 491 } 492 493 Return<Status> PreviewWindowCb::setBuffersGeometry(uint32_t w, uint32_t h, 494 PixelFormat format) { 495 auto rc = native_window_set_buffers_dimensions(mAnw.get(), w, h); 496 if (rc == ::android::OK) { 497 mPreviewWidth = w; 498 mPreviewHeight = h; 499 rc = native_window_set_buffers_format(mAnw.get(), 500 static_cast<int>(format)); 501 if (rc == ::android::OK) { 502 mFormat = static_cast<int>(format); 503 } 504 } 505 506 return mapToStatus(rc); 507 } 508 509 Return<Status> PreviewWindowCb::setCrop(int32_t left, int32_t top, 510 int32_t right, int32_t bottom) { 511 android_native_rect_t crop = { left, top, right, bottom }; 512 auto rc = native_window_set_crop(mAnw.get(), &crop); 513 if (rc == ::android::OK) { 514 mCrop = crop; 515 } 516 return mapToStatus(rc); 517 } 518 519 Return<Status> PreviewWindowCb::setUsage(BufferUsage usage) { 520 auto rc = native_window_set_usage(mAnw.get(), static_cast<int>(usage)); 521 if (rc == ::android::OK) { 522 mPreviewUsage = static_cast<int>(usage); 523 } 524 return mapToStatus(rc); 525 } 526 527 Return<Status> PreviewWindowCb::setSwapInterval(int32_t interval) { 528 auto rc = mAnw->setSwapInterval(mAnw.get(), interval); 529 if (rc == ::android::OK) { 530 mPreviewSwapInterval = interval; 531 } 532 return mapToStatus(rc); 533 } 534 535 Return<void> PreviewWindowCb::getMinUndequeuedBufferCount( 536 getMinUndequeuedBufferCount_cb _hidl_cb) { 537 int count = 0; 538 auto rc = mAnw->query(mAnw.get(), 539 NATIVE_WINDOW_MIN_UNDEQUEUED_BUFFERS, &count); 540 _hidl_cb(mapToStatus(rc), count); 541 return Void(); 542 } 543 544 Return<Status> PreviewWindowCb::setTimestamp(int64_t timestamp) { 545 return mapToStatus(native_window_set_buffers_timestamp(mAnw.get(), 546 timestamp)); 547 } 548 549 // The main test class for camera HIDL HAL. 550 class CameraHidlTest : public ::testing::VtsHalHidlTargetTestBase { 551 public: 552 virtual void SetUp() override { 553 string service_name = CameraHidlEnvironment::Instance()->getServiceName<ICameraProvider>(); 554 ALOGI("get service with name: %s", service_name.c_str()); 555 mProvider = ::testing::VtsHalHidlTargetTestBase::getService<ICameraProvider>(service_name); 556 ASSERT_NE(mProvider, nullptr); 557 558 uint32_t id; 559 ASSERT_TRUE(parseProviderName(service_name, &mProviderType, &id)); 560 561 castProvider(mProvider, &mProvider2_5); 562 notifyDeviceState(provider::V2_5::DeviceState::NORMAL); 563 } 564 virtual void TearDown() override {} 565 566 hidl_vec<hidl_string> getCameraDeviceNames(sp<ICameraProvider> provider); 567 568 struct EmptyDeviceCb : public V3_5::ICameraDeviceCallback { 569 virtual Return<void> processCaptureResult( 570 const hidl_vec<CaptureResult>& /*results*/) override { 571 ALOGI("processCaptureResult callback"); 572 ADD_FAILURE(); // Empty callback should not reach here 573 return Void(); 574 } 575 576 virtual Return<void> processCaptureResult_3_4( 577 const hidl_vec<V3_4::CaptureResult>& /*results*/) override { 578 ALOGI("processCaptureResult_3_4 callback"); 579 ADD_FAILURE(); // Empty callback should not reach here 580 return Void(); 581 } 582 583 virtual Return<void> notify(const hidl_vec<NotifyMsg>& /*msgs*/) override { 584 ALOGI("notify callback"); 585 ADD_FAILURE(); // Empty callback should not reach here 586 return Void(); 587 } 588 589 virtual Return<void> requestStreamBuffers( 590 const hidl_vec<V3_5::BufferRequest>&, 591 requestStreamBuffers_cb _hidl_cb) override { 592 ALOGI("requestStreamBuffers callback"); 593 // HAL might want to request buffer after configureStreams, but tests with EmptyDeviceCb 594 // doesn't actually need to send capture requests, so just return an error. 595 hidl_vec<V3_5::StreamBufferRet> emptyBufRets; 596 _hidl_cb(V3_5::BufferRequestStatus::FAILED_UNKNOWN, emptyBufRets); 597 return Void(); 598 } 599 600 virtual Return<void> returnStreamBuffers(const hidl_vec<StreamBuffer>&) override { 601 ALOGI("returnStreamBuffers"); 602 ADD_FAILURE(); // Empty callback should not reach here 603 return Void(); 604 } 605 606 }; 607 608 struct DeviceCb : public V3_5::ICameraDeviceCallback { 609 DeviceCb(CameraHidlTest *parent, int deviceVersion, const camera_metadata_t *staticMeta) : 610 mParent(parent), mDeviceVersion(deviceVersion) { 611 mStaticMetadata = staticMeta; 612 } 613 614 Return<void> processCaptureResult_3_4( 615 const hidl_vec<V3_4::CaptureResult>& results) override; 616 Return<void> processCaptureResult(const hidl_vec<CaptureResult>& results) override; 617 Return<void> notify(const hidl_vec<NotifyMsg>& msgs) override; 618 619 Return<void> requestStreamBuffers( 620 const hidl_vec<V3_5::BufferRequest>& bufReqs, 621 requestStreamBuffers_cb _hidl_cb) override; 622 623 Return<void> returnStreamBuffers(const hidl_vec<StreamBuffer>& buffers) override; 624 625 void setCurrentStreamConfig(const hidl_vec<V3_2::Stream>& streams, 626 const hidl_vec<V3_2::HalStream>& halStreams); 627 628 void waitForBuffersReturned(); 629 630 private: 631 bool processCaptureResultLocked(const CaptureResult& results, 632 hidl_vec<PhysicalCameraMetadata> physicalCameraMetadata); 633 634 CameraHidlTest *mParent; // Parent object 635 int mDeviceVersion; 636 android::hardware::camera::common::V1_0::helper::CameraMetadata mStaticMetadata; 637 bool hasOutstandingBuffersLocked(); 638 639 /* members for requestStreamBuffers() and returnStreamBuffers()*/ 640 std::mutex mLock; // protecting members below 641 bool mUseHalBufManager = false; 642 hidl_vec<V3_2::Stream> mStreams; 643 hidl_vec<V3_2::HalStream> mHalStreams; 644 uint64_t mNextBufferId = 1; 645 using OutstandingBuffers = std::unordered_map<uint64_t, hidl_handle>; 646 // size == mStreams.size(). Tracking each streams outstanding buffers 647 std::vector<OutstandingBuffers> mOutstandingBufferIds; 648 std::condition_variable mFlushedCondition; 649 }; 650 651 struct TorchProviderCb : public ICameraProviderCallback { 652 TorchProviderCb(CameraHidlTest *parent) : mParent(parent) {} 653 virtual Return<void> cameraDeviceStatusChange( 654 const hidl_string&, CameraDeviceStatus) override { 655 return Void(); 656 } 657 658 virtual Return<void> torchModeStatusChange( 659 const hidl_string&, TorchModeStatus newStatus) override { 660 std::lock_guard<std::mutex> l(mParent->mTorchLock); 661 mParent->mTorchStatus = newStatus; 662 mParent->mTorchCond.notify_one(); 663 return Void(); 664 } 665 666 private: 667 CameraHidlTest *mParent; // Parent object 668 }; 669 670 struct Camera1DeviceCb : 671 public ::android::hardware::camera::device::V1_0::ICameraDeviceCallback { 672 Camera1DeviceCb(CameraHidlTest *parent) : mParent(parent) {} 673 674 Return<void> notifyCallback(NotifyCallbackMsg msgType, 675 int32_t ext1, int32_t ext2) override; 676 677 Return<uint32_t> registerMemory(const hidl_handle& descriptor, 678 uint32_t bufferSize, uint32_t bufferCount) override; 679 680 Return<void> unregisterMemory(uint32_t memId) override; 681 682 Return<void> dataCallback(DataCallbackMsg msgType, 683 uint32_t data, uint32_t bufferIndex, 684 const CameraFrameMetadata& metadata) override; 685 686 Return<void> dataCallbackTimestamp(DataCallbackMsg msgType, 687 uint32_t data, uint32_t bufferIndex, 688 int64_t timestamp) override; 689 690 Return<void> handleCallbackTimestamp(DataCallbackMsg msgType, 691 const hidl_handle& frameData,uint32_t data, 692 uint32_t bufferIndex, int64_t timestamp) override; 693 694 Return<void> handleCallbackTimestampBatch(DataCallbackMsg msgType, 695 const ::android::hardware::hidl_vec<HandleTimestampMessage>& batch) override; 696 697 698 private: 699 CameraHidlTest *mParent; // Parent object 700 }; 701 702 void notifyDeviceState(::android::hardware::camera::provider::V2_5::DeviceState newState); 703 704 void openCameraDevice(const std::string &name, sp<ICameraProvider> provider, 705 sp<::android::hardware::camera::device::V1_0::ICameraDevice> *device /*out*/); 706 void setupPreviewWindow( 707 const sp<::android::hardware::camera::device::V1_0::ICameraDevice> &device, 708 sp<BufferItemConsumer> *bufferItemConsumer /*out*/, 709 sp<BufferItemHander> *bufferHandler /*out*/); 710 void stopPreviewAndClose( 711 const sp<::android::hardware::camera::device::V1_0::ICameraDevice> &device); 712 void startPreview( 713 const sp<::android::hardware::camera::device::V1_0::ICameraDevice> &device); 714 void enableMsgType(unsigned int msgType, 715 const sp<::android::hardware::camera::device::V1_0::ICameraDevice> &device); 716 void disableMsgType(unsigned int msgType, 717 const sp<::android::hardware::camera::device::V1_0::ICameraDevice> &device); 718 void getParameters( 719 const sp<::android::hardware::camera::device::V1_0::ICameraDevice> &device, 720 CameraParameters *cameraParams /*out*/); 721 void setParameters( 722 const sp<::android::hardware::camera::device::V1_0::ICameraDevice> &device, 723 const CameraParameters &cameraParams); 724 void allocateGraphicBuffer(uint32_t width, uint32_t height, uint64_t usage, 725 PixelFormat format, hidl_handle *buffer_handle /*out*/); 726 void waitForFrameLocked(DataCallbackMsg msgFrame, 727 std::unique_lock<std::mutex> &l); 728 void openEmptyDeviceSession(const std::string &name, 729 sp<ICameraProvider> provider, 730 sp<ICameraDeviceSession> *session /*out*/, 731 camera_metadata_t **staticMeta /*out*/, 732 ::android::sp<ICameraDevice> *device = nullptr/*out*/); 733 void castProvider(const sp<provider::V2_4::ICameraProvider> &provider, 734 sp<provider::V2_5::ICameraProvider> *provider2_5 /*out*/); 735 void castSession(const sp<ICameraDeviceSession> &session, int32_t deviceVersion, 736 sp<device::V3_3::ICameraDeviceSession> *session3_3 /*out*/, 737 sp<device::V3_4::ICameraDeviceSession> *session3_4 /*out*/, 738 sp<device::V3_5::ICameraDeviceSession> *session3_5 /*out*/); 739 void castDevice(const sp<device::V3_2::ICameraDevice> &device, int32_t deviceVersion, 740 sp<device::V3_5::ICameraDevice> *device3_5/*out*/); 741 void createStreamConfiguration(const ::android::hardware::hidl_vec<V3_2::Stream>& streams3_2, 742 StreamConfigurationMode configMode, 743 ::android::hardware::camera::device::V3_2::StreamConfiguration *config3_2, 744 ::android::hardware::camera::device::V3_4::StreamConfiguration *config3_4, 745 ::android::hardware::camera::device::V3_5::StreamConfiguration *config3_5, 746 uint32_t jpegBufferSize = 0); 747 748 void configurePreviewStreams3_4(const std::string &name, int32_t deviceVersion, 749 sp<ICameraProvider> provider, 750 const AvailableStream *previewThreshold, 751 const std::unordered_set<std::string>& physicalIds, 752 sp<device::V3_4::ICameraDeviceSession> *session3_4 /*out*/, 753 sp<device::V3_5::ICameraDeviceSession> *session3_5 /*out*/, 754 V3_2::Stream* previewStream /*out*/, 755 device::V3_4::HalStreamConfiguration *halStreamConfig /*out*/, 756 bool *supportsPartialResults /*out*/, 757 uint32_t *partialResultCount /*out*/, 758 bool *useHalBufManager /*out*/, 759 sp<DeviceCb> *cb /*out*/, 760 uint32_t streamConfigCounter = 0, 761 bool allowUnsupport = false); 762 void configurePreviewStream(const std::string &name, int32_t deviceVersion, 763 sp<ICameraProvider> provider, 764 const AvailableStream *previewThreshold, 765 sp<ICameraDeviceSession> *session /*out*/, 766 V3_2::Stream *previewStream /*out*/, 767 HalStreamConfiguration *halStreamConfig /*out*/, 768 bool *supportsPartialResults /*out*/, 769 uint32_t *partialResultCount /*out*/, 770 bool *useHalBufManager /*out*/, 771 sp<DeviceCb> *cb /*out*/, 772 uint32_t streamConfigCounter = 0); 773 774 void verifyLogicalCameraMetadata(const std::string& cameraName, 775 const ::android::sp<::android::hardware::camera::device::V3_2::ICameraDevice>& device, 776 const CameraMetadata& chars, int deviceVersion, 777 const hidl_vec<hidl_string>& deviceNames); 778 void verifyCameraCharacteristics(Status status, const CameraMetadata& chars); 779 void verifyRecommendedConfigs(const CameraMetadata& metadata); 780 void verifyMonochromeCharacteristics(const CameraMetadata& chars, int deviceVersion); 781 void verifyMonochromeCameraResult( 782 const ::android::hardware::camera::common::V1_0::helper::CameraMetadata& metadata); 783 void verifyStreamCombination(sp<device::V3_5::ICameraDevice> cameraDevice3_5, 784 const ::android::hardware::camera::device::V3_4::StreamConfiguration &config3_4, 785 bool expectedStatus, bool expectStreamCombQuery); 786 void verifyLogicalCameraResult(const camera_metadata_t* staticMetadata, 787 const ::android::hardware::camera::common::V1_0::helper::CameraMetadata& resultMetadata); 788 789 void verifyBuffersReturned(sp<device::V3_2::ICameraDeviceSession> session, 790 int deviceVerison, int32_t streamId, sp<DeviceCb> cb, 791 uint32_t streamConfigCounter = 0); 792 793 void verifyBuffersReturned(sp<device::V3_4::ICameraDeviceSession> session, 794 hidl_vec<int32_t> streamIds, sp<DeviceCb> cb, 795 uint32_t streamConfigCounter = 0); 796 797 void verifySessionReconfigurationQuery(sp<device::V3_5::ICameraDeviceSession> session3_5, 798 camera_metadata* oldSessionParams, camera_metadata* newSessionParams); 799 800 bool isDepthOnly(camera_metadata_t* staticMeta); 801 802 static Status getAvailableOutputStreams(camera_metadata_t *staticMeta, 803 std::vector<AvailableStream> &outputStreams, 804 const AvailableStream *threshold = nullptr); 805 static Status getJpegBufferSize(camera_metadata_t *staticMeta, 806 uint32_t* outBufSize); 807 static Status isConstrainedModeAvailable(camera_metadata_t *staticMeta); 808 static Status isLogicalMultiCamera(const camera_metadata_t *staticMeta); 809 static Status getPhysicalCameraIds(const camera_metadata_t *staticMeta, 810 std::unordered_set<std::string> *physicalIds/*out*/); 811 static Status getSupportedKeys(camera_metadata_t *staticMeta, 812 uint32_t tagId, std::unordered_set<int32_t> *requestIDs/*out*/); 813 static void fillOutputStreams(camera_metadata_ro_entry_t* entry, 814 std::vector<AvailableStream>& outputStreams, 815 const AvailableStream *threshold = nullptr, 816 const int32_t availableConfigOutputTag = 0u); 817 static void constructFilteredSettings(const sp<ICameraDeviceSession>& session, 818 const std::unordered_set<int32_t>& availableKeys, RequestTemplate reqTemplate, 819 android::hardware::camera::common::V1_0::helper::CameraMetadata* defaultSettings/*out*/, 820 android::hardware::camera::common::V1_0::helper::CameraMetadata* filteredSettings 821 /*out*/); 822 static Status pickConstrainedModeSize(camera_metadata_t *staticMeta, 823 AvailableStream &hfrStream); 824 static Status isZSLModeAvailable(const camera_metadata_t *staticMeta); 825 static Status isZSLModeAvailable(const camera_metadata_t *staticMeta, ReprocessType reprocType); 826 static Status getZSLInputOutputMap(camera_metadata_t *staticMeta, 827 std::vector<AvailableZSLInputOutput> &inputOutputMap); 828 static Status findLargestSize( 829 const std::vector<AvailableStream> &streamSizes, 830 int32_t format, AvailableStream &result); 831 static Status isAutoFocusModeAvailable( 832 CameraParameters &cameraParams, const char *mode) ; 833 static Status isMonochromeCamera(const camera_metadata_t *staticMeta); 834 835 protected: 836 837 // In-flight queue for tracking completion of capture requests. 838 struct InFlightRequest { 839 // Set by notify() SHUTTER call. 840 nsecs_t shutterTimestamp; 841 842 bool errorCodeValid; 843 ErrorCode errorCode; 844 845 //Is partial result supported 846 bool usePartialResult; 847 848 //Partial result count expected 849 uint32_t numPartialResults; 850 851 // Message queue 852 std::shared_ptr<ResultMetadataQueue> resultQueue; 853 854 // Set by process_capture_result call with valid metadata 855 bool haveResultMetadata; 856 857 // Decremented by calls to process_capture_result with valid output 858 // and input buffers 859 ssize_t numBuffersLeft; 860 861 // A 64bit integer to index the frame number associated with this result. 862 int64_t frameNumber; 863 864 // The partial result count (index) for this capture result. 865 int32_t partialResultCount; 866 867 // For buffer drop errors, the stream ID for the stream that lost a buffer. 868 // Otherwise -1. 869 int32_t errorStreamId; 870 871 // If this request has any input buffer 872 bool hasInputBuffer; 873 874 // Result metadata 875 ::android::hardware::camera::common::V1_0::helper::CameraMetadata collectedResult; 876 877 // Buffers are added by process_capture_result when output buffers 878 // return from HAL but framework. 879 ::android::Vector<StreamBuffer> resultOutputBuffers; 880 881 InFlightRequest() : 882 shutterTimestamp(0), 883 errorCodeValid(false), 884 errorCode(ErrorCode::ERROR_BUFFER), 885 usePartialResult(false), 886 numPartialResults(0), 887 resultQueue(nullptr), 888 haveResultMetadata(false), 889 numBuffersLeft(0), 890 frameNumber(0), 891 partialResultCount(0), 892 errorStreamId(-1), 893 hasInputBuffer(false) {} 894 895 InFlightRequest(ssize_t numBuffers, bool hasInput, 896 bool partialResults, uint32_t partialCount, 897 std::shared_ptr<ResultMetadataQueue> queue = nullptr) : 898 shutterTimestamp(0), 899 errorCodeValid(false), 900 errorCode(ErrorCode::ERROR_BUFFER), 901 usePartialResult(partialResults), 902 numPartialResults(partialCount), 903 resultQueue(queue), 904 haveResultMetadata(false), 905 numBuffersLeft(numBuffers), 906 frameNumber(0), 907 partialResultCount(0), 908 errorStreamId(-1), 909 hasInputBuffer(hasInput) {} 910 }; 911 912 // Map from frame number to the in-flight request state 913 typedef ::android::KeyedVector<uint32_t, InFlightRequest*> InFlightMap; 914 915 std::mutex mLock; // Synchronize access to member variables 916 std::condition_variable mResultCondition; // Condition variable for incoming results 917 InFlightMap mInflightMap; // Map of all inflight requests 918 919 DataCallbackMsg mDataMessageTypeReceived; // Most recent message type received through data callbacks 920 uint32_t mVideoBufferIndex; // Buffer index of the most recent video buffer 921 uint32_t mVideoData; // Buffer data of the most recent video buffer 922 hidl_handle mVideoNativeHandle; // Most recent video buffer native handle 923 NotifyCallbackMsg mNotifyMessage; // Current notification message 924 925 std::mutex mTorchLock; // Synchronize access to torch status 926 std::condition_variable mTorchCond; // Condition variable for torch status 927 TorchModeStatus mTorchStatus; // Current torch status 928 929 // Holds camera registered buffers 930 std::unordered_map<uint32_t, sp<::android::MemoryHeapBase> > mMemoryPool; 931 932 // Camera provider service 933 sp<ICameraProvider> mProvider; 934 sp<::android::hardware::camera::provider::V2_5::ICameraProvider> mProvider2_5; 935 936 // Camera provider type. 937 std::string mProviderType; 938 }; 939 940 Return<void> CameraHidlTest::Camera1DeviceCb::notifyCallback( 941 NotifyCallbackMsg msgType, int32_t ext1 __unused, 942 int32_t ext2 __unused) { 943 std::unique_lock<std::mutex> l(mParent->mLock); 944 mParent->mNotifyMessage = msgType; 945 mParent->mResultCondition.notify_one(); 946 947 return Void(); 948 } 949 950 Return<uint32_t> CameraHidlTest::Camera1DeviceCb::registerMemory( 951 const hidl_handle& descriptor, uint32_t bufferSize, 952 uint32_t bufferCount) { 953 if (descriptor->numFds != 1) { 954 ADD_FAILURE() << "camera memory descriptor has" 955 " numFds " << descriptor->numFds << " (expect 1)" ; 956 return 0; 957 } 958 if (descriptor->data[0] < 0) { 959 ADD_FAILURE() << "camera memory descriptor has" 960 " FD " << descriptor->data[0] << " (expect >= 0)"; 961 return 0; 962 } 963 964 sp<::android::MemoryHeapBase> pool = new ::android::MemoryHeapBase( 965 descriptor->data[0], bufferSize*bufferCount, 0, 0); 966 mParent->mMemoryPool.emplace(pool->getHeapID(), pool); 967 968 return pool->getHeapID(); 969 } 970 971 Return<void> CameraHidlTest::Camera1DeviceCb::unregisterMemory(uint32_t memId) { 972 if (mParent->mMemoryPool.count(memId) == 0) { 973 ALOGE("%s: memory pool ID %d not found", __FUNCTION__, memId); 974 ADD_FAILURE(); 975 return Void(); 976 } 977 978 mParent->mMemoryPool.erase(memId); 979 return Void(); 980 } 981 982 Return<void> CameraHidlTest::Camera1DeviceCb::dataCallback( 983 DataCallbackMsg msgType __unused, uint32_t data __unused, 984 uint32_t bufferIndex __unused, 985 const CameraFrameMetadata& metadata __unused) { 986 std::unique_lock<std::mutex> l(mParent->mLock); 987 mParent->mDataMessageTypeReceived = msgType; 988 mParent->mResultCondition.notify_one(); 989 990 return Void(); 991 } 992 993 Return<void> CameraHidlTest::Camera1DeviceCb::dataCallbackTimestamp( 994 DataCallbackMsg msgType, uint32_t data, 995 uint32_t bufferIndex, int64_t timestamp __unused) { 996 std::unique_lock<std::mutex> l(mParent->mLock); 997 mParent->mDataMessageTypeReceived = msgType; 998 mParent->mVideoBufferIndex = bufferIndex; 999 if (mParent->mMemoryPool.count(data) == 0) { 1000 ADD_FAILURE() << "memory pool ID " << data << "not found"; 1001 } 1002 mParent->mVideoData = data; 1003 mParent->mResultCondition.notify_one(); 1004 1005 return Void(); 1006 } 1007 1008 Return<void> CameraHidlTest::Camera1DeviceCb::handleCallbackTimestamp( 1009 DataCallbackMsg msgType, const hidl_handle& frameData, 1010 uint32_t data __unused, uint32_t bufferIndex, 1011 int64_t timestamp __unused) { 1012 std::unique_lock<std::mutex> l(mParent->mLock); 1013 mParent->mDataMessageTypeReceived = msgType; 1014 mParent->mVideoBufferIndex = bufferIndex; 1015 if (mParent->mMemoryPool.count(data) == 0) { 1016 ADD_FAILURE() << "memory pool ID " << data << " not found"; 1017 } 1018 mParent->mVideoData = data; 1019 mParent->mVideoNativeHandle = frameData; 1020 mParent->mResultCondition.notify_one(); 1021 1022 return Void(); 1023 } 1024 1025 Return<void> CameraHidlTest::Camera1DeviceCb::handleCallbackTimestampBatch( 1026 DataCallbackMsg msgType, 1027 const hidl_vec<HandleTimestampMessage>& batch) { 1028 std::unique_lock<std::mutex> l(mParent->mLock); 1029 for (auto& msg : batch) { 1030 mParent->mDataMessageTypeReceived = msgType; 1031 mParent->mVideoBufferIndex = msg.bufferIndex; 1032 if (mParent->mMemoryPool.count(msg.data) == 0) { 1033 ADD_FAILURE() << "memory pool ID " << msg.data << " not found"; 1034 } 1035 mParent->mVideoData = msg.data; 1036 mParent->mVideoNativeHandle = msg.frameData; 1037 mParent->mResultCondition.notify_one(); 1038 } 1039 return Void(); 1040 } 1041 1042 Return<void> CameraHidlTest::DeviceCb::processCaptureResult_3_4( 1043 const hidl_vec<V3_4::CaptureResult>& results) { 1044 1045 if (nullptr == mParent) { 1046 return Void(); 1047 } 1048 1049 bool notify = false; 1050 std::unique_lock<std::mutex> l(mParent->mLock); 1051 for (size_t i = 0 ; i < results.size(); i++) { 1052 notify = processCaptureResultLocked(results[i].v3_2, results[i].physicalCameraMetadata); 1053 } 1054 1055 l.unlock(); 1056 if (notify) { 1057 mParent->mResultCondition.notify_one(); 1058 } 1059 1060 return Void(); 1061 } 1062 1063 Return<void> CameraHidlTest::DeviceCb::processCaptureResult( 1064 const hidl_vec<CaptureResult>& results) { 1065 if (nullptr == mParent) { 1066 return Void(); 1067 } 1068 1069 bool notify = false; 1070 std::unique_lock<std::mutex> l(mParent->mLock); 1071 ::android::hardware::hidl_vec<PhysicalCameraMetadata> noPhysMetadata; 1072 for (size_t i = 0 ; i < results.size(); i++) { 1073 notify = processCaptureResultLocked(results[i], noPhysMetadata); 1074 } 1075 1076 l.unlock(); 1077 if (notify) { 1078 mParent->mResultCondition.notify_one(); 1079 } 1080 1081 return Void(); 1082 } 1083 1084 bool CameraHidlTest::DeviceCb::processCaptureResultLocked(const CaptureResult& results, 1085 hidl_vec<PhysicalCameraMetadata> physicalCameraMetadata) { 1086 bool notify = false; 1087 uint32_t frameNumber = results.frameNumber; 1088 1089 if ((results.result.size() == 0) && 1090 (results.outputBuffers.size() == 0) && 1091 (results.inputBuffer.buffer == nullptr) && 1092 (results.fmqResultSize == 0)) { 1093 ALOGE("%s: No result data provided by HAL for frame %d result count: %d", 1094 __func__, frameNumber, (int) results.fmqResultSize); 1095 ADD_FAILURE(); 1096 return notify; 1097 } 1098 1099 ssize_t idx = mParent->mInflightMap.indexOfKey(frameNumber); 1100 if (::android::NAME_NOT_FOUND == idx) { 1101 ALOGE("%s: Unexpected frame number! received: %u", 1102 __func__, frameNumber); 1103 ADD_FAILURE(); 1104 return notify; 1105 } 1106 1107 bool isPartialResult = false; 1108 bool hasInputBufferInRequest = false; 1109 InFlightRequest *request = mParent->mInflightMap.editValueAt(idx); 1110 ::android::hardware::camera::device::V3_2::CameraMetadata resultMetadata; 1111 size_t resultSize = 0; 1112 if (results.fmqResultSize > 0) { 1113 resultMetadata.resize(results.fmqResultSize); 1114 if (request->resultQueue == nullptr) { 1115 ADD_FAILURE(); 1116 return notify; 1117 } 1118 if (!request->resultQueue->read(resultMetadata.data(), 1119 results.fmqResultSize)) { 1120 ALOGE("%s: Frame %d: Cannot read camera metadata from fmq," 1121 "size = %" PRIu64, __func__, frameNumber, 1122 results.fmqResultSize); 1123 ADD_FAILURE(); 1124 return notify; 1125 } 1126 1127 std::vector<::android::hardware::camera::device::V3_2::CameraMetadata> physResultMetadata; 1128 physResultMetadata.resize(physicalCameraMetadata.size()); 1129 for (size_t i = 0; i < physicalCameraMetadata.size(); i++) { 1130 physResultMetadata[i].resize(physicalCameraMetadata[i].fmqMetadataSize); 1131 if (!request->resultQueue->read(physResultMetadata[i].data(), 1132 physicalCameraMetadata[i].fmqMetadataSize)) { 1133 ALOGE("%s: Frame %d: Cannot read physical camera metadata from fmq," 1134 "size = %" PRIu64, __func__, frameNumber, 1135 physicalCameraMetadata[i].fmqMetadataSize); 1136 ADD_FAILURE(); 1137 return notify; 1138 } 1139 } 1140 resultSize = resultMetadata.size(); 1141 } else if (results.result.size() > 0) { 1142 resultMetadata.setToExternal(const_cast<uint8_t *>( 1143 results.result.data()), results.result.size()); 1144 resultSize = resultMetadata.size(); 1145 } 1146 1147 if (!request->usePartialResult && (resultSize > 0) && 1148 (results.partialResult != 1)) { 1149 ALOGE("%s: Result is malformed for frame %d: partial_result %u " 1150 "must be 1 if partial result is not supported", __func__, 1151 frameNumber, results.partialResult); 1152 ADD_FAILURE(); 1153 return notify; 1154 } 1155 1156 if (results.partialResult != 0) { 1157 request->partialResultCount = results.partialResult; 1158 } 1159 1160 // Check if this result carries only partial metadata 1161 if (request->usePartialResult && (resultSize > 0)) { 1162 if ((results.partialResult > request->numPartialResults) || 1163 (results.partialResult < 1)) { 1164 ALOGE("%s: Result is malformed for frame %d: partial_result %u" 1165 " must be in the range of [1, %d] when metadata is " 1166 "included in the result", __func__, frameNumber, 1167 results.partialResult, request->numPartialResults); 1168 ADD_FAILURE(); 1169 return notify; 1170 } 1171 request->collectedResult.append( 1172 reinterpret_cast<const camera_metadata_t*>( 1173 resultMetadata.data())); 1174 1175 isPartialResult = 1176 (results.partialResult < request->numPartialResults); 1177 } else if (resultSize > 0) { 1178 request->collectedResult.append(reinterpret_cast<const camera_metadata_t*>( 1179 resultMetadata.data())); 1180 isPartialResult = false; 1181 } 1182 1183 hasInputBufferInRequest = request->hasInputBuffer; 1184 1185 // Did we get the (final) result metadata for this capture? 1186 if ((resultSize > 0) && !isPartialResult) { 1187 if (request->haveResultMetadata) { 1188 ALOGE("%s: Called multiple times with metadata for frame %d", 1189 __func__, frameNumber); 1190 ADD_FAILURE(); 1191 return notify; 1192 } 1193 request->haveResultMetadata = true; 1194 request->collectedResult.sort(); 1195 1196 // Verify final result metadata 1197 bool isAtLeast_3_5 = mDeviceVersion >= CAMERA_DEVICE_API_VERSION_3_5; 1198 if (isAtLeast_3_5) { 1199 auto staticMetadataBuffer = mStaticMetadata.getAndLock(); 1200 bool isMonochrome = Status::OK == 1201 CameraHidlTest::isMonochromeCamera(staticMetadataBuffer); 1202 if (isMonochrome) { 1203 mParent->verifyMonochromeCameraResult(request->collectedResult); 1204 } 1205 1206 // Verify logical camera result metadata 1207 bool isLogicalCamera = 1208 Status::OK == CameraHidlTest::isLogicalMultiCamera(staticMetadataBuffer); 1209 if (isLogicalCamera) { 1210 mParent->verifyLogicalCameraResult(staticMetadataBuffer, request->collectedResult); 1211 } 1212 mStaticMetadata.unlock(staticMetadataBuffer); 1213 } 1214 } 1215 1216 uint32_t numBuffersReturned = results.outputBuffers.size(); 1217 if (results.inputBuffer.buffer != nullptr) { 1218 if (hasInputBufferInRequest) { 1219 numBuffersReturned += 1; 1220 } else { 1221 ALOGW("%s: Input buffer should be NULL if there is no input" 1222 " buffer sent in the request", __func__); 1223 } 1224 } 1225 request->numBuffersLeft -= numBuffersReturned; 1226 if (request->numBuffersLeft < 0) { 1227 ALOGE("%s: Too many buffers returned for frame %d", __func__, 1228 frameNumber); 1229 ADD_FAILURE(); 1230 return notify; 1231 } 1232 1233 request->resultOutputBuffers.appendArray(results.outputBuffers.data(), 1234 results.outputBuffers.size()); 1235 // If shutter event is received notify the pending threads. 1236 if (request->shutterTimestamp != 0) { 1237 notify = true; 1238 } 1239 1240 if (mUseHalBufManager) { 1241 // Don't return buffers of bufId 0 (empty buffer) 1242 std::vector<StreamBuffer> buffers; 1243 for (const auto& sb : results.outputBuffers) { 1244 if (sb.bufferId != 0) { 1245 buffers.push_back(sb); 1246 } 1247 } 1248 returnStreamBuffers(buffers); 1249 } 1250 return notify; 1251 } 1252 1253 void CameraHidlTest::DeviceCb::setCurrentStreamConfig( 1254 const hidl_vec<V3_2::Stream>& streams, const hidl_vec<V3_2::HalStream>& halStreams) { 1255 ASSERT_EQ(streams.size(), halStreams.size()); 1256 ASSERT_NE(streams.size(), 0); 1257 for (size_t i = 0; i < streams.size(); i++) { 1258 ASSERT_EQ(streams[i].id, halStreams[i].id); 1259 } 1260 std::lock_guard<std::mutex> l(mLock); 1261 mUseHalBufManager = true; 1262 mStreams = streams; 1263 mHalStreams = halStreams; 1264 mOutstandingBufferIds.clear(); 1265 for (size_t i = 0; i < streams.size(); i++) { 1266 mOutstandingBufferIds.emplace_back(); 1267 } 1268 } 1269 1270 bool CameraHidlTest::DeviceCb::hasOutstandingBuffersLocked() { 1271 if (!mUseHalBufManager) { 1272 return false; 1273 } 1274 for (const auto& outstandingBuffers : mOutstandingBufferIds) { 1275 if (!outstandingBuffers.empty()) { 1276 return true; 1277 } 1278 } 1279 return false; 1280 } 1281 1282 void CameraHidlTest::DeviceCb::waitForBuffersReturned() { 1283 std::unique_lock<std::mutex> lk(mLock); 1284 if (hasOutstandingBuffersLocked()) { 1285 auto timeout = std::chrono::seconds(kBufferReturnTimeoutSec); 1286 auto st = mFlushedCondition.wait_for(lk, timeout); 1287 ASSERT_NE(std::cv_status::timeout, st); 1288 } 1289 } 1290 1291 Return<void> CameraHidlTest::DeviceCb::notify( 1292 const hidl_vec<NotifyMsg>& messages) { 1293 std::lock_guard<std::mutex> l(mParent->mLock); 1294 1295 for (size_t i = 0; i < messages.size(); i++) { 1296 ssize_t idx = mParent->mInflightMap.indexOfKey( 1297 messages[i].msg.shutter.frameNumber); 1298 if (::android::NAME_NOT_FOUND == idx) { 1299 ALOGE("%s: Unexpected frame number! received: %u", 1300 __func__, messages[i].msg.shutter.frameNumber); 1301 ADD_FAILURE(); 1302 break; 1303 } 1304 InFlightRequest *r = mParent->mInflightMap.editValueAt(idx); 1305 1306 switch(messages[i].type) { 1307 case MsgType::ERROR: 1308 if (ErrorCode::ERROR_DEVICE == messages[i].msg.error.errorCode) { 1309 ALOGE("%s: Camera reported serious device error", 1310 __func__); 1311 ADD_FAILURE(); 1312 } else { 1313 r->errorCodeValid = true; 1314 r->errorCode = messages[i].msg.error.errorCode; 1315 r->errorStreamId = messages[i].msg.error.errorStreamId; 1316 } 1317 break; 1318 case MsgType::SHUTTER: 1319 r->shutterTimestamp = messages[i].msg.shutter.timestamp; 1320 break; 1321 default: 1322 ALOGE("%s: Unsupported notify message %d", __func__, 1323 messages[i].type); 1324 ADD_FAILURE(); 1325 break; 1326 } 1327 } 1328 1329 mParent->mResultCondition.notify_one(); 1330 return Void(); 1331 } 1332 1333 Return<void> CameraHidlTest::DeviceCb::requestStreamBuffers( 1334 const hidl_vec<V3_5::BufferRequest>& bufReqs, 1335 requestStreamBuffers_cb _hidl_cb) { 1336 using V3_5::BufferRequestStatus; 1337 using V3_5::StreamBufferRet; 1338 using V3_5::StreamBufferRequestError; 1339 hidl_vec<StreamBufferRet> bufRets; 1340 std::unique_lock<std::mutex> l(mLock); 1341 1342 if (!mUseHalBufManager) { 1343 ALOGE("%s: Camera does not support HAL buffer management", __FUNCTION__); 1344 ADD_FAILURE(); 1345 _hidl_cb(BufferRequestStatus::FAILED_ILLEGAL_ARGUMENTS, bufRets); 1346 return Void(); 1347 } 1348 1349 if (bufReqs.size() > mStreams.size()) { 1350 ALOGE("%s: illegal buffer request: too many requests!", __FUNCTION__); 1351 ADD_FAILURE(); 1352 _hidl_cb(BufferRequestStatus::FAILED_ILLEGAL_ARGUMENTS, bufRets); 1353 return Void(); 1354 } 1355 1356 std::vector<int32_t> indexes(bufReqs.size()); 1357 for (size_t i = 0; i < bufReqs.size(); i++) { 1358 bool found = false; 1359 for (size_t idx = 0; idx < mStreams.size(); idx++) { 1360 if (bufReqs[i].streamId == mStreams[idx].id) { 1361 found = true; 1362 indexes[i] = idx; 1363 break; 1364 } 1365 } 1366 if (!found) { 1367 ALOGE("%s: illegal buffer request: unknown streamId %d!", 1368 __FUNCTION__, bufReqs[i].streamId); 1369 ADD_FAILURE(); 1370 _hidl_cb(BufferRequestStatus::FAILED_ILLEGAL_ARGUMENTS, bufRets); 1371 return Void(); 1372 } 1373 } 1374 1375 bool allStreamOk = true; 1376 bool atLeastOneStreamOk = false; 1377 bufRets.resize(bufReqs.size()); 1378 for (size_t i = 0; i < bufReqs.size(); i++) { 1379 int32_t idx = indexes[i]; 1380 const auto& stream = mStreams[idx]; 1381 const auto& halStream = mHalStreams[idx]; 1382 const V3_5::BufferRequest& bufReq = bufReqs[i]; 1383 if (mOutstandingBufferIds[idx].size() + bufReq.numBuffersRequested > halStream.maxBuffers) { 1384 bufRets[i].streamId = stream.id; 1385 bufRets[i].val.error(StreamBufferRequestError::MAX_BUFFER_EXCEEDED); 1386 allStreamOk = false; 1387 continue; 1388 } 1389 1390 hidl_vec<StreamBuffer> tmpRetBuffers(bufReq.numBuffersRequested); 1391 for (size_t j = 0; j < bufReq.numBuffersRequested; j++) { 1392 hidl_handle buffer_handle; 1393 mParent->allocateGraphicBuffer(stream.width, stream.height, 1394 android_convertGralloc1To0Usage( 1395 halStream.producerUsage, halStream.consumerUsage), 1396 halStream.overrideFormat, &buffer_handle); 1397 1398 tmpRetBuffers[j] = {stream.id, mNextBufferId, buffer_handle, BufferStatus::OK, 1399 nullptr, nullptr}; 1400 mOutstandingBufferIds[idx].insert(std::make_pair(mNextBufferId++, buffer_handle)); 1401 } 1402 atLeastOneStreamOk = true; 1403 bufRets[i].streamId = stream.id; 1404 bufRets[i].val.buffers(std::move(tmpRetBuffers)); 1405 } 1406 1407 if (allStreamOk) { 1408 _hidl_cb(BufferRequestStatus::OK, bufRets); 1409 } else if (atLeastOneStreamOk) { 1410 _hidl_cb(BufferRequestStatus::FAILED_PARTIAL, bufRets); 1411 } else { 1412 _hidl_cb(BufferRequestStatus::FAILED_UNKNOWN, bufRets); 1413 } 1414 1415 if (!hasOutstandingBuffersLocked()) { 1416 l.unlock(); 1417 mFlushedCondition.notify_one(); 1418 } 1419 return Void(); 1420 } 1421 1422 Return<void> CameraHidlTest::DeviceCb::returnStreamBuffers( 1423 const hidl_vec<StreamBuffer>& buffers) { 1424 if (!mUseHalBufManager) { 1425 ALOGE("%s: Camera does not support HAL buffer management", __FUNCTION__); 1426 ADD_FAILURE(); 1427 } 1428 1429 std::lock_guard<std::mutex> l(mLock); 1430 for (const auto& buf : buffers) { 1431 bool found = false; 1432 for (size_t idx = 0; idx < mOutstandingBufferIds.size(); idx++) { 1433 if (mStreams[idx].id == buf.streamId && 1434 mOutstandingBufferIds[idx].count(buf.bufferId) == 1) { 1435 mOutstandingBufferIds[idx].erase(buf.bufferId); 1436 // TODO: check do we need to close/delete native handle or assume we have enough 1437 // memory to run till the test finish? since we do not capture much requests (and 1438 // most of time one buffer is sufficient) 1439 found = true; 1440 break; 1441 } 1442 } 1443 if (found) { 1444 continue; 1445 } 1446 ALOGE("%s: unknown buffer ID %" PRIu64, __FUNCTION__, buf.bufferId); 1447 ADD_FAILURE(); 1448 } 1449 return Void(); 1450 } 1451 1452 hidl_vec<hidl_string> CameraHidlTest::getCameraDeviceNames(sp<ICameraProvider> provider) { 1453 std::vector<std::string> cameraDeviceNames; 1454 Return<void> ret; 1455 ret = provider->getCameraIdList( 1456 [&](auto status, const auto& idList) { 1457 ALOGI("getCameraIdList returns status:%d", (int)status); 1458 for (size_t i = 0; i < idList.size(); i++) { 1459 ALOGI("Camera Id[%zu] is %s", i, idList[i].c_str()); 1460 } 1461 ASSERT_EQ(Status::OK, status); 1462 for (const auto& id : idList) { 1463 cameraDeviceNames.push_back(id); 1464 } 1465 }); 1466 if (!ret.isOk()) { 1467 ADD_FAILURE(); 1468 } 1469 1470 // External camera devices are reported through cameraDeviceStatusChange 1471 struct ProviderCb : public ICameraProviderCallback { 1472 virtual Return<void> cameraDeviceStatusChange( 1473 const hidl_string& devName, 1474 CameraDeviceStatus newStatus) override { 1475 ALOGI("camera device status callback name %s, status %d", 1476 devName.c_str(), (int) newStatus); 1477 if (newStatus == CameraDeviceStatus::PRESENT) { 1478 externalCameraDeviceNames.push_back(devName); 1479 1480 } 1481 return Void(); 1482 } 1483 1484 virtual Return<void> torchModeStatusChange( 1485 const hidl_string&, TorchModeStatus) override { 1486 return Void(); 1487 } 1488 1489 std::vector<std::string> externalCameraDeviceNames; 1490 }; 1491 sp<ProviderCb> cb = new ProviderCb; 1492 auto status = mProvider->setCallback(cb); 1493 1494 for (const auto& devName : cb->externalCameraDeviceNames) { 1495 if (cameraDeviceNames.end() == std::find( 1496 cameraDeviceNames.begin(), cameraDeviceNames.end(), devName)) { 1497 cameraDeviceNames.push_back(devName); 1498 } 1499 } 1500 1501 hidl_vec<hidl_string> retList(cameraDeviceNames.size()); 1502 for (size_t i = 0; i < cameraDeviceNames.size(); i++) { 1503 retList[i] = cameraDeviceNames[i]; 1504 } 1505 return retList; 1506 } 1507 1508 // Test devices with first_api_level >= P does not advertise device (at) 1.0 1509 TEST_F(CameraHidlTest, noHal1AfterP) { 1510 constexpr int32_t HAL1_PHASE_OUT_API_LEVEL = 28; 1511 int32_t firstApiLevel = 0; 1512 getFirstApiLevel(&firstApiLevel); 1513 1514 // all devices with first API level == 28 and <= 1GB of RAM must set low_ram 1515 // and thus be allowed to continue using HAL1 1516 if ((firstApiLevel == HAL1_PHASE_OUT_API_LEVEL) && 1517 (property_get_bool("ro.config.low_ram", /*default*/ false))) { 1518 ALOGI("Hal1 allowed for low ram device"); 1519 return; 1520 } 1521 1522 if (firstApiLevel >= HAL1_PHASE_OUT_API_LEVEL) { 1523 hidl_vec<hidl_string> cameraDeviceNames = getCameraDeviceNames(mProvider); 1524 for (const auto& name : cameraDeviceNames) { 1525 int deviceVersion = getCameraDeviceVersion(name, mProviderType); 1526 ASSERT_NE(deviceVersion, 0); // Must be a valid device version 1527 ASSERT_NE(deviceVersion, CAMERA_DEVICE_API_VERSION_1_0); // Must not be device (at) 1.0 1528 } 1529 } 1530 } 1531 1532 // Test if ICameraProvider::isTorchModeSupported returns Status::OK 1533 // Also if first_api_level >= Q torch API must be supported. 1534 TEST_F(CameraHidlTest, isTorchModeSupported) { 1535 constexpr int32_t API_LEVEL_Q = 29; 1536 int32_t firstApiLevel = 0; 1537 getFirstApiLevel(&firstApiLevel); 1538 1539 Return<void> ret; 1540 ret = mProvider->isSetTorchModeSupported([&](auto status, bool support) { 1541 ALOGI("isSetTorchModeSupported returns status:%d supported:%d", (int)status, support); 1542 ASSERT_EQ(Status::OK, status); 1543 if (firstApiLevel >= API_LEVEL_Q) { 1544 ASSERT_EQ(true, support); 1545 } 1546 }); 1547 ASSERT_TRUE(ret.isOk()); 1548 } 1549 1550 // TODO: consider removing this test if getCameraDeviceNames() has the same coverage 1551 TEST_F(CameraHidlTest, getCameraIdList) { 1552 Return<void> ret; 1553 ret = mProvider->getCameraIdList([&](auto status, const auto& idList) { 1554 ALOGI("getCameraIdList returns status:%d", (int)status); 1555 for (size_t i = 0; i < idList.size(); i++) { 1556 ALOGI("Camera Id[%zu] is %s", i, idList[i].c_str()); 1557 } 1558 ASSERT_EQ(Status::OK, status); 1559 }); 1560 ASSERT_TRUE(ret.isOk()); 1561 } 1562 1563 // Test if ICameraProvider::getVendorTags returns Status::OK 1564 TEST_F(CameraHidlTest, getVendorTags) { 1565 Return<void> ret; 1566 ret = mProvider->getVendorTags([&](auto status, const auto& vendorTagSecs) { 1567 ALOGI("getVendorTags returns status:%d numSections %zu", (int)status, vendorTagSecs.size()); 1568 for (size_t i = 0; i < vendorTagSecs.size(); i++) { 1569 ALOGI("Vendor tag section %zu name %s", i, vendorTagSecs[i].sectionName.c_str()); 1570 for (size_t j = 0; j < vendorTagSecs[i].tags.size(); j++) { 1571 const auto& tag = vendorTagSecs[i].tags[j]; 1572 ALOGI("Vendor tag id %u name %s type %d", tag.tagId, tag.tagName.c_str(), 1573 (int)tag.tagType); 1574 } 1575 } 1576 ASSERT_EQ(Status::OK, status); 1577 }); 1578 ASSERT_TRUE(ret.isOk()); 1579 } 1580 1581 // Test if ICameraProvider::setCallback returns Status::OK 1582 TEST_F(CameraHidlTest, setCallback) { 1583 struct ProviderCb : public ICameraProviderCallback { 1584 virtual Return<void> cameraDeviceStatusChange( 1585 const hidl_string& cameraDeviceName, 1586 CameraDeviceStatus newStatus) override { 1587 ALOGI("camera device status callback name %s, status %d", 1588 cameraDeviceName.c_str(), (int) newStatus); 1589 return Void(); 1590 } 1591 1592 virtual Return<void> torchModeStatusChange( 1593 const hidl_string& cameraDeviceName, 1594 TorchModeStatus newStatus) override { 1595 ALOGI("Torch mode status callback name %s, status %d", 1596 cameraDeviceName.c_str(), (int) newStatus); 1597 return Void(); 1598 } 1599 }; 1600 sp<ProviderCb> cb = new ProviderCb; 1601 auto status = mProvider->setCallback(cb); 1602 ASSERT_TRUE(status.isOk()); 1603 ASSERT_EQ(Status::OK, status); 1604 status = mProvider->setCallback(nullptr); 1605 ASSERT_TRUE(status.isOk()); 1606 ASSERT_EQ(Status::OK, status); 1607 } 1608 1609 // Test if ICameraProvider::getCameraDeviceInterface returns Status::OK and non-null device 1610 TEST_F(CameraHidlTest, getCameraDeviceInterface) { 1611 hidl_vec<hidl_string> cameraDeviceNames = getCameraDeviceNames(mProvider); 1612 1613 for (const auto& name : cameraDeviceNames) { 1614 int deviceVersion = getCameraDeviceVersion(name, mProviderType); 1615 switch (deviceVersion) { 1616 case CAMERA_DEVICE_API_VERSION_3_5: 1617 case CAMERA_DEVICE_API_VERSION_3_4: 1618 case CAMERA_DEVICE_API_VERSION_3_3: 1619 case CAMERA_DEVICE_API_VERSION_3_2: { 1620 Return<void> ret; 1621 ret = mProvider->getCameraDeviceInterface_V3_x( 1622 name, [&](auto status, const auto& device3_x) { 1623 ALOGI("getCameraDeviceInterface_V3_x returns status:%d", (int)status); 1624 ASSERT_EQ(Status::OK, status); 1625 ASSERT_NE(device3_x, nullptr); 1626 }); 1627 ASSERT_TRUE(ret.isOk()); 1628 } 1629 break; 1630 case CAMERA_DEVICE_API_VERSION_1_0: { 1631 Return<void> ret; 1632 ret = mProvider->getCameraDeviceInterface_V1_x( 1633 name, [&](auto status, const auto& device1) { 1634 ALOGI("getCameraDeviceInterface_V1_x returns status:%d", (int)status); 1635 ASSERT_EQ(Status::OK, status); 1636 ASSERT_NE(device1, nullptr); 1637 }); 1638 ASSERT_TRUE(ret.isOk()); 1639 } 1640 break; 1641 default: { 1642 ALOGE("%s: Unsupported device version %d", __func__, deviceVersion); 1643 ADD_FAILURE(); 1644 } 1645 break; 1646 } 1647 } 1648 } 1649 1650 // Verify that the device resource cost can be retrieved and the values are 1651 // sane. 1652 TEST_F(CameraHidlTest, getResourceCost) { 1653 hidl_vec<hidl_string> cameraDeviceNames = getCameraDeviceNames(mProvider); 1654 1655 for (const auto& name : cameraDeviceNames) { 1656 int deviceVersion = getCameraDeviceVersion(name, mProviderType); 1657 switch (deviceVersion) { 1658 case CAMERA_DEVICE_API_VERSION_3_5: 1659 case CAMERA_DEVICE_API_VERSION_3_4: 1660 case CAMERA_DEVICE_API_VERSION_3_3: 1661 case CAMERA_DEVICE_API_VERSION_3_2: { 1662 ::android::sp<::android::hardware::camera::device::V3_2::ICameraDevice> device3_x; 1663 ALOGI("getResourceCost: Testing camera device %s", name.c_str()); 1664 Return<void> ret; 1665 ret = mProvider->getCameraDeviceInterface_V3_x( 1666 name, [&](auto status, const auto& device) { 1667 ALOGI("getCameraDeviceInterface_V3_x returns status:%d", (int)status); 1668 ASSERT_EQ(Status::OK, status); 1669 ASSERT_NE(device, nullptr); 1670 device3_x = device; 1671 }); 1672 ASSERT_TRUE(ret.isOk()); 1673 1674 ret = device3_x->getResourceCost([&](auto status, const auto& resourceCost) { 1675 ALOGI("getResourceCost returns status:%d", (int)status); 1676 ASSERT_EQ(Status::OK, status); 1677 ALOGI(" Resource cost is %d", resourceCost.resourceCost); 1678 ASSERT_LE(resourceCost.resourceCost, 100u); 1679 for (const auto& name : resourceCost.conflictingDevices) { 1680 ALOGI(" Conflicting device: %s", name.c_str()); 1681 } 1682 }); 1683 ASSERT_TRUE(ret.isOk()); 1684 } 1685 break; 1686 case CAMERA_DEVICE_API_VERSION_1_0: { 1687 ::android::sp<::android::hardware::camera::device::V1_0::ICameraDevice> device1; 1688 ALOGI("getResourceCost: Testing camera device %s", name.c_str()); 1689 Return<void> ret; 1690 ret = mProvider->getCameraDeviceInterface_V1_x( 1691 name, [&](auto status, const auto& device) { 1692 ALOGI("getCameraDeviceInterface_V1_x returns status:%d", (int)status); 1693 ASSERT_EQ(Status::OK, status); 1694 ASSERT_NE(device, nullptr); 1695 device1 = device; 1696 }); 1697 ASSERT_TRUE(ret.isOk()); 1698 1699 ret = device1->getResourceCost([&](auto status, const auto& resourceCost) { 1700 ALOGI("getResourceCost returns status:%d", (int)status); 1701 ASSERT_EQ(Status::OK, status); 1702 ALOGI(" Resource cost is %d", resourceCost.resourceCost); 1703 ASSERT_LE(resourceCost.resourceCost, 100u); 1704 for (const auto& name : resourceCost.conflictingDevices) { 1705 ALOGI(" Conflicting device: %s", name.c_str()); 1706 } 1707 }); 1708 ASSERT_TRUE(ret.isOk()); 1709 } 1710 break; 1711 default: { 1712 ALOGE("%s: Unsupported device version %d", __func__, deviceVersion); 1713 ADD_FAILURE(); 1714 } 1715 break; 1716 } 1717 } 1718 } 1719 1720 // Verify that the static camera info can be retrieved 1721 // successfully. 1722 TEST_F(CameraHidlTest, getCameraInfo) { 1723 hidl_vec<hidl_string> cameraDeviceNames = getCameraDeviceNames(mProvider); 1724 1725 for (const auto& name : cameraDeviceNames) { 1726 if (getCameraDeviceVersion(name, mProviderType) == CAMERA_DEVICE_API_VERSION_1_0) { 1727 ::android::sp<::android::hardware::camera::device::V1_0::ICameraDevice> device1; 1728 ALOGI("getCameraCharacteristics: Testing camera device %s", name.c_str()); 1729 Return<void> ret; 1730 ret = mProvider->getCameraDeviceInterface_V1_x( 1731 name, [&](auto status, const auto& device) { 1732 ALOGI("getCameraDeviceInterface_V1_x returns status:%d", (int)status); 1733 ASSERT_EQ(Status::OK, status); 1734 ASSERT_NE(device, nullptr); 1735 device1 = device; 1736 }); 1737 ASSERT_TRUE(ret.isOk()); 1738 1739 ret = device1->getCameraInfo([&](auto status, const auto& info) { 1740 ALOGI("getCameraInfo returns status:%d", (int)status); 1741 ASSERT_EQ(Status::OK, status); 1742 switch (info.orientation) { 1743 case 0: 1744 case 90: 1745 case 180: 1746 case 270: 1747 // Expected cases 1748 ALOGI("camera orientation: %d", info.orientation); 1749 break; 1750 default: 1751 FAIL() << "Unexpected camera orientation:" << info.orientation; 1752 } 1753 switch (info.facing) { 1754 case CameraFacing::BACK: 1755 case CameraFacing::FRONT: 1756 case CameraFacing::EXTERNAL: 1757 // Expected cases 1758 ALOGI("camera facing: %d", info.facing); 1759 break; 1760 default: 1761 FAIL() << "Unexpected camera facing:" << static_cast<uint32_t>(info.facing); 1762 } 1763 }); 1764 ASSERT_TRUE(ret.isOk()); 1765 } 1766 } 1767 } 1768 1769 // Check whether preview window can be configured 1770 TEST_F(CameraHidlTest, setPreviewWindow) { 1771 hidl_vec<hidl_string> cameraDeviceNames = getCameraDeviceNames(mProvider); 1772 1773 for (const auto& name : cameraDeviceNames) { 1774 if (getCameraDeviceVersion(name, mProviderType) == CAMERA_DEVICE_API_VERSION_1_0) { 1775 sp<::android::hardware::camera::device::V1_0::ICameraDevice> device1; 1776 openCameraDevice(name, mProvider, &device1 /*out*/); 1777 ASSERT_NE(nullptr, device1.get()); 1778 sp<BufferItemConsumer> bufferItemConsumer; 1779 sp<BufferItemHander> bufferHandler; 1780 setupPreviewWindow(device1, &bufferItemConsumer /*out*/, &bufferHandler /*out*/); 1781 1782 Return<void> ret; 1783 ret = device1->close(); 1784 ASSERT_TRUE(ret.isOk()); 1785 } 1786 } 1787 } 1788 1789 // Verify that setting preview window fails in case device is not open 1790 TEST_F(CameraHidlTest, setPreviewWindowInvalid) { 1791 hidl_vec<hidl_string> cameraDeviceNames = getCameraDeviceNames(mProvider); 1792 1793 for (const auto& name : cameraDeviceNames) { 1794 if (getCameraDeviceVersion(name, mProviderType) == CAMERA_DEVICE_API_VERSION_1_0) { 1795 ::android::sp<::android::hardware::camera::device::V1_0::ICameraDevice> device1; 1796 ALOGI("getCameraCharacteristics: Testing camera device %s", name.c_str()); 1797 Return<void> ret; 1798 ret = mProvider->getCameraDeviceInterface_V1_x( 1799 name, [&](auto status, const auto& device) { 1800 ALOGI("getCameraDeviceInterface_V1_x returns status:%d", (int)status); 1801 ASSERT_EQ(Status::OK, status); 1802 ASSERT_NE(device, nullptr); 1803 device1 = device; 1804 }); 1805 ASSERT_TRUE(ret.isOk()); 1806 1807 Return<Status> returnStatus = device1->setPreviewWindow(nullptr); 1808 ASSERT_TRUE(returnStatus.isOk()); 1809 ASSERT_EQ(Status::OPERATION_NOT_SUPPORTED, returnStatus); 1810 } 1811 } 1812 } 1813 1814 // Start and stop preview checking whether it gets enabled in between. 1815 TEST_F(CameraHidlTest, startStopPreview) { 1816 hidl_vec<hidl_string> cameraDeviceNames = getCameraDeviceNames(mProvider); 1817 1818 for (const auto& name : cameraDeviceNames) { 1819 if (getCameraDeviceVersion(name, mProviderType) == CAMERA_DEVICE_API_VERSION_1_0) { 1820 sp<::android::hardware::camera::device::V1_0::ICameraDevice> device1; 1821 openCameraDevice(name, mProvider, &device1 /*out*/); 1822 ASSERT_NE(nullptr, device1.get()); 1823 sp<BufferItemConsumer> bufferItemConsumer; 1824 sp<BufferItemHander> bufferHandler; 1825 setupPreviewWindow(device1, &bufferItemConsumer /*out*/, &bufferHandler /*out*/); 1826 1827 startPreview(device1); 1828 1829 Return<bool> returnBoolStatus = device1->previewEnabled(); 1830 ASSERT_TRUE(returnBoolStatus.isOk()); 1831 ASSERT_TRUE(returnBoolStatus); 1832 1833 stopPreviewAndClose(device1); 1834 } 1835 } 1836 } 1837 1838 // Start preview without active preview window. Preview should start as soon 1839 // as a valid active window gets configured. 1840 TEST_F(CameraHidlTest, startStopPreviewDelayed) { 1841 hidl_vec<hidl_string> cameraDeviceNames = getCameraDeviceNames(mProvider); 1842 1843 for (const auto& name : cameraDeviceNames) { 1844 if (getCameraDeviceVersion(name, mProviderType) == CAMERA_DEVICE_API_VERSION_1_0) { 1845 sp<::android::hardware::camera::device::V1_0::ICameraDevice> device1; 1846 openCameraDevice(name, mProvider, &device1 /*out*/); 1847 ASSERT_NE(nullptr, device1.get()); 1848 1849 Return<Status> returnStatus = device1->setPreviewWindow(nullptr); 1850 ASSERT_TRUE(returnStatus.isOk()); 1851 ASSERT_EQ(Status::OK, returnStatus); 1852 1853 startPreview(device1); 1854 1855 sp<BufferItemConsumer> bufferItemConsumer; 1856 sp<BufferItemHander> bufferHandler; 1857 setupPreviewWindow(device1, &bufferItemConsumer /*out*/, &bufferHandler /*out*/); 1858 1859 // Preview should get enabled now 1860 Return<bool> returnBoolStatus = device1->previewEnabled(); 1861 ASSERT_TRUE(returnBoolStatus.isOk()); 1862 ASSERT_TRUE(returnBoolStatus); 1863 1864 stopPreviewAndClose(device1); 1865 } 1866 } 1867 } 1868 1869 // Verify that image capture behaves as expected along with preview callbacks. 1870 TEST_F(CameraHidlTest, takePicture) { 1871 hidl_vec<hidl_string> cameraDeviceNames = getCameraDeviceNames(mProvider); 1872 1873 for (const auto& name : cameraDeviceNames) { 1874 if (getCameraDeviceVersion(name, mProviderType) == CAMERA_DEVICE_API_VERSION_1_0) { 1875 sp<::android::hardware::camera::device::V1_0::ICameraDevice> device1; 1876 openCameraDevice(name, mProvider, &device1 /*out*/); 1877 ASSERT_NE(nullptr, device1.get()); 1878 sp<BufferItemConsumer> bufferItemConsumer; 1879 sp<BufferItemHander> bufferHandler; 1880 setupPreviewWindow(device1, &bufferItemConsumer /*out*/, &bufferHandler /*out*/); 1881 1882 { 1883 std::unique_lock<std::mutex> l(mLock); 1884 mDataMessageTypeReceived = DataCallbackMsg::RAW_IMAGE_NOTIFY; 1885 } 1886 1887 enableMsgType((unsigned int)DataCallbackMsg::PREVIEW_FRAME, device1); 1888 startPreview(device1); 1889 1890 { 1891 std::unique_lock<std::mutex> l(mLock); 1892 waitForFrameLocked(DataCallbackMsg::PREVIEW_FRAME, l); 1893 } 1894 1895 disableMsgType((unsigned int)DataCallbackMsg::PREVIEW_FRAME, device1); 1896 enableMsgType((unsigned int)DataCallbackMsg::COMPRESSED_IMAGE, device1); 1897 1898 { 1899 std::unique_lock<std::mutex> l(mLock); 1900 mDataMessageTypeReceived = DataCallbackMsg::RAW_IMAGE_NOTIFY; 1901 } 1902 1903 Return<Status> returnStatus = device1->takePicture(); 1904 ASSERT_TRUE(returnStatus.isOk()); 1905 ASSERT_EQ(Status::OK, returnStatus); 1906 1907 { 1908 std::unique_lock<std::mutex> l(mLock); 1909 waitForFrameLocked(DataCallbackMsg::COMPRESSED_IMAGE, l); 1910 } 1911 1912 disableMsgType((unsigned int)DataCallbackMsg::COMPRESSED_IMAGE, device1); 1913 stopPreviewAndClose(device1); 1914 } 1915 } 1916 } 1917 1918 // Image capture should fail in case preview didn't get enabled first. 1919 TEST_F(CameraHidlTest, takePictureFail) { 1920 hidl_vec<hidl_string> cameraDeviceNames = getCameraDeviceNames(mProvider); 1921 1922 for (const auto& name : cameraDeviceNames) { 1923 if (getCameraDeviceVersion(name, mProviderType) == CAMERA_DEVICE_API_VERSION_1_0) { 1924 sp<::android::hardware::camera::device::V1_0::ICameraDevice> device1; 1925 openCameraDevice(name, mProvider, &device1 /*out*/); 1926 ASSERT_NE(nullptr, device1.get()); 1927 1928 Return<Status> returnStatus = device1->takePicture(); 1929 ASSERT_TRUE(returnStatus.isOk()); 1930 ASSERT_NE(Status::OK, returnStatus); 1931 1932 Return<void> ret = device1->close(); 1933 ASSERT_TRUE(ret.isOk()); 1934 } 1935 } 1936 } 1937 1938 // Verify that image capture can be cancelled. 1939 TEST_F(CameraHidlTest, cancelPicture) { 1940 hidl_vec<hidl_string> cameraDeviceNames = getCameraDeviceNames(mProvider); 1941 1942 for (const auto& name : cameraDeviceNames) { 1943 if (getCameraDeviceVersion(name, mProviderType) == CAMERA_DEVICE_API_VERSION_1_0) { 1944 sp<::android::hardware::camera::device::V1_0::ICameraDevice> device1; 1945 openCameraDevice(name, mProvider, &device1 /*out*/); 1946 ASSERT_NE(nullptr, device1.get()); 1947 sp<BufferItemConsumer> bufferItemConsumer; 1948 sp<BufferItemHander> bufferHandler; 1949 setupPreviewWindow(device1, &bufferItemConsumer /*out*/, &bufferHandler /*out*/); 1950 startPreview(device1); 1951 1952 Return<Status> returnStatus = device1->takePicture(); 1953 ASSERT_TRUE(returnStatus.isOk()); 1954 ASSERT_EQ(Status::OK, returnStatus); 1955 1956 returnStatus = device1->cancelPicture(); 1957 ASSERT_TRUE(returnStatus.isOk()); 1958 ASSERT_EQ(Status::OK, returnStatus); 1959 1960 stopPreviewAndClose(device1); 1961 } 1962 } 1963 } 1964 1965 // Image capture cancel is a no-op when image capture is not running. 1966 TEST_F(CameraHidlTest, cancelPictureNOP) { 1967 hidl_vec<hidl_string> cameraDeviceNames = getCameraDeviceNames(mProvider); 1968 1969 for (const auto& name : cameraDeviceNames) { 1970 if (getCameraDeviceVersion(name, mProviderType) == CAMERA_DEVICE_API_VERSION_1_0) { 1971 sp<::android::hardware::camera::device::V1_0::ICameraDevice> device1; 1972 openCameraDevice(name, mProvider, &device1 /*out*/); 1973 ASSERT_NE(nullptr, device1.get()); 1974 sp<BufferItemConsumer> bufferItemConsumer; 1975 sp<BufferItemHander> bufferHandler; 1976 setupPreviewWindow(device1, &bufferItemConsumer /*out*/, &bufferHandler /*out*/); 1977 startPreview(device1); 1978 1979 Return<Status> returnStatus = device1->cancelPicture(); 1980 ASSERT_TRUE(returnStatus.isOk()); 1981 ASSERT_EQ(Status::OK, returnStatus); 1982 1983 stopPreviewAndClose(device1); 1984 } 1985 } 1986 } 1987 1988 // Test basic video recording. 1989 TEST_F(CameraHidlTest, startStopRecording) { 1990 hidl_vec<hidl_string> cameraDeviceNames = getCameraDeviceNames(mProvider); 1991 1992 for (const auto& name : cameraDeviceNames) { 1993 if (getCameraDeviceVersion(name, mProviderType) == CAMERA_DEVICE_API_VERSION_1_0) { 1994 sp<::android::hardware::camera::device::V1_0::ICameraDevice> device1; 1995 openCameraDevice(name, mProvider, &device1 /*out*/); 1996 ASSERT_NE(nullptr, device1.get()); 1997 sp<BufferItemConsumer> bufferItemConsumer; 1998 sp<BufferItemHander> bufferHandler; 1999 setupPreviewWindow(device1, &bufferItemConsumer /*out*/, &bufferHandler /*out*/); 2000 2001 { 2002 std::unique_lock<std::mutex> l(mLock); 2003 mDataMessageTypeReceived = DataCallbackMsg::RAW_IMAGE_NOTIFY; 2004 } 2005 2006 enableMsgType((unsigned int)DataCallbackMsg::PREVIEW_FRAME, device1); 2007 startPreview(device1); 2008 2009 { 2010 std::unique_lock<std::mutex> l(mLock); 2011 waitForFrameLocked(DataCallbackMsg::PREVIEW_FRAME, l); 2012 mDataMessageTypeReceived = DataCallbackMsg::RAW_IMAGE_NOTIFY; 2013 mVideoBufferIndex = UINT32_MAX; 2014 } 2015 2016 disableMsgType((unsigned int)DataCallbackMsg::PREVIEW_FRAME, device1); 2017 2018 bool videoMetaEnabled = false; 2019 Return<Status> returnStatus = device1->storeMetaDataInBuffers(true); 2020 ASSERT_TRUE(returnStatus.isOk()); 2021 // It is allowed for devices to not support this feature 2022 ASSERT_TRUE((Status::OK == returnStatus) || 2023 (Status::OPERATION_NOT_SUPPORTED == returnStatus)); 2024 if (Status::OK == returnStatus) { 2025 videoMetaEnabled = true; 2026 } 2027 2028 enableMsgType((unsigned int)DataCallbackMsg::VIDEO_FRAME, device1); 2029 Return<bool> returnBoolStatus = device1->recordingEnabled(); 2030 ASSERT_TRUE(returnBoolStatus.isOk()); 2031 ASSERT_FALSE(returnBoolStatus); 2032 2033 returnStatus = device1->startRecording(); 2034 ASSERT_TRUE(returnStatus.isOk()); 2035 ASSERT_EQ(Status::OK, returnStatus); 2036 2037 { 2038 std::unique_lock<std::mutex> l(mLock); 2039 waitForFrameLocked(DataCallbackMsg::VIDEO_FRAME, l); 2040 ASSERT_NE(UINT32_MAX, mVideoBufferIndex); 2041 disableMsgType((unsigned int)DataCallbackMsg::VIDEO_FRAME, device1); 2042 } 2043 2044 returnBoolStatus = device1->recordingEnabled(); 2045 ASSERT_TRUE(returnBoolStatus.isOk()); 2046 ASSERT_TRUE(returnBoolStatus); 2047 2048 Return<void> ret; 2049 if (videoMetaEnabled) { 2050 ret = device1->releaseRecordingFrameHandle(mVideoData, mVideoBufferIndex, 2051 mVideoNativeHandle); 2052 ASSERT_TRUE(ret.isOk()); 2053 } else { 2054 ret = device1->releaseRecordingFrame(mVideoData, mVideoBufferIndex); 2055 ASSERT_TRUE(ret.isOk()); 2056 } 2057 2058 ret = device1->stopRecording(); 2059 ASSERT_TRUE(ret.isOk()); 2060 2061 stopPreviewAndClose(device1); 2062 } 2063 } 2064 } 2065 2066 // It shouldn't be possible to start recording without enabling preview first. 2067 TEST_F(CameraHidlTest, startRecordingFail) { 2068 hidl_vec<hidl_string> cameraDeviceNames = getCameraDeviceNames(mProvider); 2069 2070 for (const auto& name : cameraDeviceNames) { 2071 if (getCameraDeviceVersion(name, mProviderType) == CAMERA_DEVICE_API_VERSION_1_0) { 2072 sp<::android::hardware::camera::device::V1_0::ICameraDevice> device1; 2073 openCameraDevice(name, mProvider, &device1 /*out*/); 2074 ASSERT_NE(nullptr, device1.get()); 2075 2076 Return<bool> returnBoolStatus = device1->recordingEnabled(); 2077 ASSERT_TRUE(returnBoolStatus.isOk()); 2078 ASSERT_FALSE(returnBoolStatus); 2079 2080 Return<Status> returnStatus = device1->startRecording(); 2081 ASSERT_TRUE(returnStatus.isOk()); 2082 ASSERT_NE(Status::OK, returnStatus); 2083 2084 Return<void> ret = device1->close(); 2085 ASSERT_TRUE(ret.isOk()); 2086 } 2087 } 2088 } 2089 2090 // Check autofocus support if available. 2091 TEST_F(CameraHidlTest, autoFocus) { 2092 hidl_vec<hidl_string> cameraDeviceNames = getCameraDeviceNames(mProvider); 2093 std::vector<const char*> focusModes = {CameraParameters::FOCUS_MODE_AUTO, 2094 CameraParameters::FOCUS_MODE_CONTINUOUS_PICTURE, 2095 CameraParameters::FOCUS_MODE_CONTINUOUS_VIDEO}; 2096 2097 for (const auto& name : cameraDeviceNames) { 2098 if (getCameraDeviceVersion(name, mProviderType) == CAMERA_DEVICE_API_VERSION_1_0) { 2099 sp<::android::hardware::camera::device::V1_0::ICameraDevice> device1; 2100 openCameraDevice(name, mProvider, &device1 /*out*/); 2101 ASSERT_NE(nullptr, device1.get()); 2102 2103 CameraParameters cameraParams; 2104 getParameters(device1, &cameraParams /*out*/); 2105 2106 if (Status::OK != 2107 isAutoFocusModeAvailable(cameraParams, CameraParameters::FOCUS_MODE_AUTO)) { 2108 Return<void> ret = device1->close(); 2109 ASSERT_TRUE(ret.isOk()); 2110 continue; 2111 } 2112 2113 sp<BufferItemConsumer> bufferItemConsumer; 2114 sp<BufferItemHander> bufferHandler; 2115 setupPreviewWindow(device1, &bufferItemConsumer /*out*/, &bufferHandler /*out*/); 2116 startPreview(device1); 2117 enableMsgType((unsigned int)NotifyCallbackMsg::FOCUS, device1); 2118 2119 for (auto& iter : focusModes) { 2120 if (Status::OK != isAutoFocusModeAvailable(cameraParams, iter)) { 2121 continue; 2122 } 2123 2124 cameraParams.set(CameraParameters::KEY_FOCUS_MODE, iter); 2125 setParameters(device1, cameraParams); 2126 { 2127 std::unique_lock<std::mutex> l(mLock); 2128 mNotifyMessage = NotifyCallbackMsg::ERROR; 2129 } 2130 2131 Return<Status> returnStatus = device1->autoFocus(); 2132 ASSERT_TRUE(returnStatus.isOk()); 2133 ASSERT_EQ(Status::OK, returnStatus); 2134 2135 { 2136 std::unique_lock<std::mutex> l(mLock); 2137 while (NotifyCallbackMsg::FOCUS != mNotifyMessage) { 2138 auto timeout = std::chrono::system_clock::now() + 2139 std::chrono::seconds(kAutoFocusTimeoutSec); 2140 ASSERT_NE(std::cv_status::timeout, mResultCondition.wait_until(l, timeout)); 2141 } 2142 } 2143 } 2144 2145 disableMsgType((unsigned int)NotifyCallbackMsg::FOCUS, device1); 2146 stopPreviewAndClose(device1); 2147 } 2148 } 2149 } 2150 2151 // In case autofocus is supported verify that it can be cancelled. 2152 TEST_F(CameraHidlTest, cancelAutoFocus) { 2153 hidl_vec<hidl_string> cameraDeviceNames = getCameraDeviceNames(mProvider); 2154 2155 for (const auto& name : cameraDeviceNames) { 2156 if (getCameraDeviceVersion(name, mProviderType) == CAMERA_DEVICE_API_VERSION_1_0) { 2157 sp<::android::hardware::camera::device::V1_0::ICameraDevice> device1; 2158 openCameraDevice(name, mProvider, &device1 /*out*/); 2159 ASSERT_NE(nullptr, device1.get()); 2160 2161 CameraParameters cameraParams; 2162 getParameters(device1, &cameraParams /*out*/); 2163 2164 if (Status::OK != 2165 isAutoFocusModeAvailable(cameraParams, CameraParameters::FOCUS_MODE_AUTO)) { 2166 Return<void> ret = device1->close(); 2167 ASSERT_TRUE(ret.isOk()); 2168 continue; 2169 } 2170 2171 // It should be fine to call before preview starts. 2172 ASSERT_EQ(Status::OK, device1->cancelAutoFocus()); 2173 2174 sp<BufferItemConsumer> bufferItemConsumer; 2175 sp<BufferItemHander> bufferHandler; 2176 setupPreviewWindow(device1, &bufferItemConsumer /*out*/, &bufferHandler /*out*/); 2177 startPreview(device1); 2178 2179 // It should be fine to call after preview starts too. 2180 Return<Status> returnStatus = device1->cancelAutoFocus(); 2181 ASSERT_TRUE(returnStatus.isOk()); 2182 ASSERT_EQ(Status::OK, returnStatus); 2183 2184 returnStatus = device1->autoFocus(); 2185 ASSERT_TRUE(returnStatus.isOk()); 2186 ASSERT_EQ(Status::OK, returnStatus); 2187 2188 returnStatus = device1->cancelAutoFocus(); 2189 ASSERT_TRUE(returnStatus.isOk()); 2190 ASSERT_EQ(Status::OK, returnStatus); 2191 2192 stopPreviewAndClose(device1); 2193 } 2194 } 2195 } 2196 2197 // Check whether face detection is available and try to enable&disable. 2198 TEST_F(CameraHidlTest, sendCommandFaceDetection) { 2199 hidl_vec<hidl_string> cameraDeviceNames = getCameraDeviceNames(mProvider); 2200 2201 for (const auto& name : cameraDeviceNames) { 2202 if (getCameraDeviceVersion(name, mProviderType) == CAMERA_DEVICE_API_VERSION_1_0) { 2203 sp<::android::hardware::camera::device::V1_0::ICameraDevice> device1; 2204 openCameraDevice(name, mProvider, &device1 /*out*/); 2205 ASSERT_NE(nullptr, device1.get()); 2206 2207 CameraParameters cameraParams; 2208 getParameters(device1, &cameraParams /*out*/); 2209 2210 int32_t hwFaces = cameraParams.getInt(CameraParameters::KEY_MAX_NUM_DETECTED_FACES_HW); 2211 int32_t swFaces = cameraParams.getInt(CameraParameters::KEY_MAX_NUM_DETECTED_FACES_SW); 2212 if ((0 >= hwFaces) && (0 >= swFaces)) { 2213 Return<void> ret = device1->close(); 2214 ASSERT_TRUE(ret.isOk()); 2215 continue; 2216 } 2217 2218 sp<BufferItemConsumer> bufferItemConsumer; 2219 sp<BufferItemHander> bufferHandler; 2220 setupPreviewWindow(device1, &bufferItemConsumer /*out*/, &bufferHandler /*out*/); 2221 startPreview(device1); 2222 2223 if (0 < hwFaces) { 2224 Return<Status> returnStatus = device1->sendCommand( 2225 CommandType::START_FACE_DETECTION, CAMERA_FACE_DETECTION_HW, 0); 2226 ASSERT_TRUE(returnStatus.isOk()); 2227 ASSERT_EQ(Status::OK, returnStatus); 2228 // TODO(epeev) : Enable and check for face notifications 2229 returnStatus = device1->sendCommand(CommandType::STOP_FACE_DETECTION, 2230 CAMERA_FACE_DETECTION_HW, 0); 2231 ASSERT_TRUE(returnStatus.isOk()); 2232 ASSERT_EQ(Status::OK, returnStatus); 2233 } 2234 2235 if (0 < swFaces) { 2236 Return<Status> returnStatus = device1->sendCommand( 2237 CommandType::START_FACE_DETECTION, CAMERA_FACE_DETECTION_SW, 0); 2238 ASSERT_TRUE(returnStatus.isOk()); 2239 ASSERT_EQ(Status::OK, returnStatus); 2240 // TODO(epeev) : Enable and check for face notifications 2241 returnStatus = device1->sendCommand(CommandType::STOP_FACE_DETECTION, 2242 CAMERA_FACE_DETECTION_SW, 0); 2243 ASSERT_TRUE(returnStatus.isOk()); 2244 ASSERT_EQ(Status::OK, returnStatus); 2245 } 2246 2247 stopPreviewAndClose(device1); 2248 } 2249 } 2250 } 2251 2252 // Check whether smooth zoom is available and try to enable&disable. 2253 TEST_F(CameraHidlTest, sendCommandSmoothZoom) { 2254 hidl_vec<hidl_string> cameraDeviceNames = getCameraDeviceNames(mProvider); 2255 2256 for (const auto& name : cameraDeviceNames) { 2257 if (getCameraDeviceVersion(name, mProviderType) == CAMERA_DEVICE_API_VERSION_1_0) { 2258 sp<::android::hardware::camera::device::V1_0::ICameraDevice> device1; 2259 openCameraDevice(name, mProvider, &device1 /*out*/); 2260 ASSERT_NE(nullptr, device1.get()); 2261 2262 CameraParameters cameraParams; 2263 getParameters(device1, &cameraParams /*out*/); 2264 2265 const char* smoothZoomStr = 2266 cameraParams.get(CameraParameters::KEY_SMOOTH_ZOOM_SUPPORTED); 2267 bool smoothZoomSupported = 2268 ((nullptr != smoothZoomStr) && (strcmp(smoothZoomStr, CameraParameters::TRUE) == 0)) 2269 ? true 2270 : false; 2271 if (!smoothZoomSupported) { 2272 Return<void> ret = device1->close(); 2273 ASSERT_TRUE(ret.isOk()); 2274 continue; 2275 } 2276 2277 int32_t maxZoom = cameraParams.getInt(CameraParameters::KEY_MAX_ZOOM); 2278 ASSERT_TRUE(0 < maxZoom); 2279 2280 sp<BufferItemConsumer> bufferItemConsumer; 2281 sp<BufferItemHander> bufferHandler; 2282 setupPreviewWindow(device1, &bufferItemConsumer /*out*/, &bufferHandler /*out*/); 2283 startPreview(device1); 2284 setParameters(device1, cameraParams); 2285 2286 Return<Status> returnStatus = 2287 device1->sendCommand(CommandType::START_SMOOTH_ZOOM, maxZoom, 0); 2288 ASSERT_TRUE(returnStatus.isOk()); 2289 ASSERT_EQ(Status::OK, returnStatus); 2290 // TODO(epeev) : Enable and check for face notifications 2291 returnStatus = device1->sendCommand(CommandType::STOP_SMOOTH_ZOOM, 0, 0); 2292 ASSERT_TRUE(returnStatus.isOk()); 2293 ASSERT_EQ(Status::OK, returnStatus); 2294 2295 stopPreviewAndClose(device1); 2296 } 2297 } 2298 } 2299 2300 // Basic sanity tests related to camera parameters. 2301 TEST_F(CameraHidlTest, getSetParameters) { 2302 hidl_vec<hidl_string> cameraDeviceNames = getCameraDeviceNames(mProvider); 2303 2304 for (const auto& name : cameraDeviceNames) { 2305 if (getCameraDeviceVersion(name, mProviderType) == CAMERA_DEVICE_API_VERSION_1_0) { 2306 sp<::android::hardware::camera::device::V1_0::ICameraDevice> device1; 2307 openCameraDevice(name, mProvider, &device1 /*out*/); 2308 ASSERT_NE(nullptr, device1.get()); 2309 2310 CameraParameters cameraParams; 2311 getParameters(device1, &cameraParams /*out*/); 2312 2313 int32_t width, height; 2314 cameraParams.getPictureSize(&width, &height); 2315 ASSERT_TRUE((0 < width) && (0 < height)); 2316 cameraParams.getPreviewSize(&width, &height); 2317 ASSERT_TRUE((0 < width) && (0 < height)); 2318 int32_t minFps, maxFps; 2319 cameraParams.getPreviewFpsRange(&minFps, &maxFps); 2320 ASSERT_TRUE((0 < minFps) && (0 < maxFps)); 2321 ASSERT_NE(nullptr, cameraParams.getPreviewFormat()); 2322 ASSERT_NE(nullptr, cameraParams.getPictureFormat()); 2323 ASSERT_TRUE( 2324 strcmp(CameraParameters::PIXEL_FORMAT_JPEG, cameraParams.getPictureFormat()) == 0); 2325 2326 const char* flashMode = cameraParams.get(CameraParameters::KEY_FLASH_MODE); 2327 ASSERT_TRUE((nullptr == flashMode) || 2328 (strcmp(CameraParameters::FLASH_MODE_OFF, flashMode) == 0)); 2329 2330 const char* wbMode = cameraParams.get(CameraParameters::KEY_WHITE_BALANCE); 2331 ASSERT_TRUE((nullptr == wbMode) || 2332 (strcmp(CameraParameters::WHITE_BALANCE_AUTO, wbMode) == 0)); 2333 2334 const char* effect = cameraParams.get(CameraParameters::KEY_EFFECT); 2335 ASSERT_TRUE((nullptr == effect) || 2336 (strcmp(CameraParameters::EFFECT_NONE, effect) == 0)); 2337 2338 ::android::Vector<Size> previewSizes; 2339 cameraParams.getSupportedPreviewSizes(previewSizes); 2340 ASSERT_FALSE(previewSizes.empty()); 2341 ::android::Vector<Size> pictureSizes; 2342 cameraParams.getSupportedPictureSizes(pictureSizes); 2343 ASSERT_FALSE(pictureSizes.empty()); 2344 const char* previewFormats = 2345 cameraParams.get(CameraParameters::KEY_SUPPORTED_PREVIEW_FORMATS); 2346 ASSERT_NE(nullptr, previewFormats); 2347 ::android::String8 previewFormatsString(previewFormats); 2348 ASSERT_TRUE(previewFormatsString.contains(CameraParameters::PIXEL_FORMAT_YUV420SP)); 2349 ASSERT_NE(nullptr, cameraParams.get(CameraParameters::KEY_SUPPORTED_PICTURE_FORMATS)); 2350 ASSERT_NE(nullptr, 2351 cameraParams.get(CameraParameters::KEY_SUPPORTED_PREVIEW_FRAME_RATES)); 2352 const char* focusModes = cameraParams.get(CameraParameters::KEY_SUPPORTED_FOCUS_MODES); 2353 ASSERT_NE(nullptr, focusModes); 2354 ::android::String8 focusModesString(focusModes); 2355 const char* focusMode = cameraParams.get(CameraParameters::KEY_FOCUS_MODE); 2356 ASSERT_NE(nullptr, focusMode); 2357 // Auto focus mode should be default 2358 if (focusModesString.contains(CameraParameters::FOCUS_MODE_AUTO)) { 2359 ASSERT_TRUE(strcmp(CameraParameters::FOCUS_MODE_AUTO, focusMode) == 0); 2360 } 2361 ASSERT_TRUE(0 < cameraParams.getInt(CameraParameters::KEY_FOCAL_LENGTH)); 2362 int32_t horizontalViewAngle = 2363 cameraParams.getInt(CameraParameters::KEY_HORIZONTAL_VIEW_ANGLE); 2364 ASSERT_TRUE((0 < horizontalViewAngle) && (360 >= horizontalViewAngle)); 2365 int32_t verticalViewAngle = 2366 cameraParams.getInt(CameraParameters::KEY_VERTICAL_VIEW_ANGLE); 2367 ASSERT_TRUE((0 < verticalViewAngle) && (360 >= verticalViewAngle)); 2368 int32_t jpegQuality = cameraParams.getInt(CameraParameters::KEY_JPEG_QUALITY); 2369 ASSERT_TRUE((1 <= jpegQuality) && (100 >= jpegQuality)); 2370 int32_t jpegThumbQuality = 2371 cameraParams.getInt(CameraParameters::KEY_JPEG_THUMBNAIL_QUALITY); 2372 ASSERT_TRUE((1 <= jpegThumbQuality) && (100 >= jpegThumbQuality)); 2373 2374 cameraParams.setPictureSize(pictureSizes[0].width, pictureSizes[0].height); 2375 cameraParams.setPreviewSize(previewSizes[0].width, previewSizes[0].height); 2376 2377 setParameters(device1, cameraParams); 2378 getParameters(device1, &cameraParams /*out*/); 2379 2380 cameraParams.getPictureSize(&width, &height); 2381 ASSERT_TRUE((pictureSizes[0].width == width) && (pictureSizes[0].height == height)); 2382 cameraParams.getPreviewSize(&width, &height); 2383 ASSERT_TRUE((previewSizes[0].width == width) && (previewSizes[0].height == height)); 2384 2385 Return<void> ret = device1->close(); 2386 ASSERT_TRUE(ret.isOk()); 2387 } 2388 } 2389 } 2390 2391 // Verify that the static camera characteristics can be retrieved 2392 // successfully. 2393 TEST_F(CameraHidlTest, getCameraCharacteristics) { 2394 hidl_vec<hidl_string> cameraDeviceNames = getCameraDeviceNames(mProvider); 2395 2396 for (const auto& name : cameraDeviceNames) { 2397 int deviceVersion = getCameraDeviceVersion(name, mProviderType); 2398 switch (deviceVersion) { 2399 case CAMERA_DEVICE_API_VERSION_3_5: 2400 case CAMERA_DEVICE_API_VERSION_3_4: 2401 case CAMERA_DEVICE_API_VERSION_3_3: 2402 case CAMERA_DEVICE_API_VERSION_3_2: { 2403 ::android::sp<::android::hardware::camera::device::V3_2::ICameraDevice> device3_x; 2404 ALOGI("getCameraCharacteristics: Testing camera device %s", name.c_str()); 2405 Return<void> ret; 2406 ret = mProvider->getCameraDeviceInterface_V3_x( 2407 name, [&](auto status, const auto& device) { 2408 ALOGI("getCameraDeviceInterface_V3_x returns status:%d", (int)status); 2409 ASSERT_EQ(Status::OK, status); 2410 ASSERT_NE(device, nullptr); 2411 device3_x = device; 2412 }); 2413 ASSERT_TRUE(ret.isOk()); 2414 2415 ret = device3_x->getCameraCharacteristics([&](auto status, const auto& chars) { 2416 verifyCameraCharacteristics(status, chars); 2417 verifyMonochromeCharacteristics(chars, deviceVersion); 2418 verifyRecommendedConfigs(chars); 2419 verifyLogicalCameraMetadata(name, device3_x, chars, deviceVersion, 2420 cameraDeviceNames); 2421 }); 2422 ASSERT_TRUE(ret.isOk()); 2423 2424 //getPhysicalCameraCharacteristics will fail for publicly 2425 //advertised camera IDs. 2426 if (deviceVersion >= CAMERA_DEVICE_API_VERSION_3_5) { 2427 auto castResult = device::V3_5::ICameraDevice::castFrom(device3_x); 2428 ASSERT_TRUE(castResult.isOk()); 2429 ::android::sp<::android::hardware::camera::device::V3_5::ICameraDevice> 2430 device3_5 = castResult; 2431 ASSERT_NE(device3_5, nullptr); 2432 2433 std::string version, cameraId; 2434 ASSERT_TRUE(::matchDeviceName(name, mProviderType, &version, &cameraId)); 2435 Return<void> ret = device3_5->getPhysicalCameraCharacteristics(cameraId, 2436 [&](auto status, const auto& chars) { 2437 ASSERT_TRUE(Status::ILLEGAL_ARGUMENT == status); 2438 ASSERT_EQ(0, chars.size()); 2439 }); 2440 ASSERT_TRUE(ret.isOk()); 2441 } 2442 } 2443 break; 2444 case CAMERA_DEVICE_API_VERSION_1_0: { 2445 //Not applicable 2446 } 2447 break; 2448 default: { 2449 ALOGE("%s: Unsupported device version %d", __func__, deviceVersion); 2450 ADD_FAILURE(); 2451 } 2452 break; 2453 } 2454 } 2455 } 2456 2457 //In case it is supported verify that torch can be enabled. 2458 //Check for corresponding toch callbacks as well. 2459 TEST_F(CameraHidlTest, setTorchMode) { 2460 hidl_vec<hidl_string> cameraDeviceNames = getCameraDeviceNames(mProvider); 2461 bool torchControlSupported = false; 2462 Return<void> ret; 2463 2464 ret = mProvider->isSetTorchModeSupported([&](auto status, bool support) { 2465 ALOGI("isSetTorchModeSupported returns status:%d supported:%d", (int)status, support); 2466 ASSERT_EQ(Status::OK, status); 2467 torchControlSupported = support; 2468 }); 2469 2470 sp<TorchProviderCb> cb = new TorchProviderCb(this); 2471 Return<Status> returnStatus = mProvider->setCallback(cb); 2472 ASSERT_TRUE(returnStatus.isOk()); 2473 ASSERT_EQ(Status::OK, returnStatus); 2474 2475 for (const auto& name : cameraDeviceNames) { 2476 int deviceVersion = getCameraDeviceVersion(name, mProviderType); 2477 switch (deviceVersion) { 2478 case CAMERA_DEVICE_API_VERSION_3_5: 2479 case CAMERA_DEVICE_API_VERSION_3_4: 2480 case CAMERA_DEVICE_API_VERSION_3_3: 2481 case CAMERA_DEVICE_API_VERSION_3_2: { 2482 ::android::sp<::android::hardware::camera::device::V3_2::ICameraDevice> device3_x; 2483 ALOGI("setTorchMode: Testing camera device %s", name.c_str()); 2484 ret = mProvider->getCameraDeviceInterface_V3_x( 2485 name, [&](auto status, const auto& device) { 2486 ALOGI("getCameraDeviceInterface_V3_x returns status:%d", (int)status); 2487 ASSERT_EQ(Status::OK, status); 2488 ASSERT_NE(device, nullptr); 2489 device3_x = device; 2490 }); 2491 ASSERT_TRUE(ret.isOk()); 2492 2493 mTorchStatus = TorchModeStatus::NOT_AVAILABLE; 2494 returnStatus = device3_x->setTorchMode(TorchMode::ON); 2495 ASSERT_TRUE(returnStatus.isOk()); 2496 if (!torchControlSupported) { 2497 ASSERT_EQ(Status::METHOD_NOT_SUPPORTED, returnStatus); 2498 } else { 2499 ASSERT_TRUE(returnStatus == Status::OK || 2500 returnStatus == Status::OPERATION_NOT_SUPPORTED); 2501 if (returnStatus == Status::OK) { 2502 { 2503 std::unique_lock<std::mutex> l(mTorchLock); 2504 while (TorchModeStatus::NOT_AVAILABLE == mTorchStatus) { 2505 auto timeout = std::chrono::system_clock::now() + 2506 std::chrono::seconds(kTorchTimeoutSec); 2507 ASSERT_NE(std::cv_status::timeout, mTorchCond.wait_until(l, timeout)); 2508 } 2509 ASSERT_EQ(TorchModeStatus::AVAILABLE_ON, mTorchStatus); 2510 mTorchStatus = TorchModeStatus::NOT_AVAILABLE; 2511 } 2512 2513 returnStatus = device3_x->setTorchMode(TorchMode::OFF); 2514 ASSERT_TRUE(returnStatus.isOk()); 2515 ASSERT_EQ(Status::OK, returnStatus); 2516 2517 { 2518 std::unique_lock<std::mutex> l(mTorchLock); 2519 while (TorchModeStatus::NOT_AVAILABLE == mTorchStatus) { 2520 auto timeout = std::chrono::system_clock::now() + 2521 std::chrono::seconds(kTorchTimeoutSec); 2522 ASSERT_NE(std::cv_status::timeout, mTorchCond.wait_until(l, timeout)); 2523 } 2524 ASSERT_EQ(TorchModeStatus::AVAILABLE_OFF, mTorchStatus); 2525 } 2526 } 2527 } 2528 } 2529 break; 2530 case CAMERA_DEVICE_API_VERSION_1_0: { 2531 ::android::sp<::android::hardware::camera::device::V1_0::ICameraDevice> device1; 2532 ALOGI("dumpState: Testing camera device %s", name.c_str()); 2533 ret = mProvider->getCameraDeviceInterface_V1_x( 2534 name, [&](auto status, const auto& device) { 2535 ALOGI("getCameraDeviceInterface_V1_x returns status:%d", (int)status); 2536 ASSERT_EQ(Status::OK, status); 2537 ASSERT_NE(device, nullptr); 2538 device1 = device; 2539 }); 2540 ASSERT_TRUE(ret.isOk()); 2541 2542 mTorchStatus = TorchModeStatus::NOT_AVAILABLE; 2543 returnStatus = device1->setTorchMode(TorchMode::ON); 2544 ASSERT_TRUE(returnStatus.isOk()); 2545 if (!torchControlSupported) { 2546 ASSERT_EQ(Status::METHOD_NOT_SUPPORTED, returnStatus); 2547 } else { 2548 ASSERT_TRUE(returnStatus == Status::OK || 2549 returnStatus == Status::OPERATION_NOT_SUPPORTED); 2550 if (returnStatus == Status::OK) { 2551 { 2552 std::unique_lock<std::mutex> l(mTorchLock); 2553 while (TorchModeStatus::NOT_AVAILABLE == mTorchStatus) { 2554 auto timeout = std::chrono::system_clock::now() + 2555 std::chrono::seconds(kTorchTimeoutSec); 2556 ASSERT_NE(std::cv_status::timeout, mTorchCond.wait_until(l, 2557 timeout)); 2558 } 2559 ASSERT_EQ(TorchModeStatus::AVAILABLE_ON, mTorchStatus); 2560 mTorchStatus = TorchModeStatus::NOT_AVAILABLE; 2561 } 2562 2563 returnStatus = device1->setTorchMode(TorchMode::OFF); 2564 ASSERT_TRUE(returnStatus.isOk()); 2565 ASSERT_EQ(Status::OK, returnStatus); 2566 2567 { 2568 std::unique_lock<std::mutex> l(mTorchLock); 2569 while (TorchModeStatus::NOT_AVAILABLE == mTorchStatus) { 2570 auto timeout = std::chrono::system_clock::now() + 2571 std::chrono::seconds(kTorchTimeoutSec); 2572 ASSERT_NE(std::cv_status::timeout, mTorchCond.wait_until(l, 2573 timeout)); 2574 } 2575 ASSERT_EQ(TorchModeStatus::AVAILABLE_OFF, mTorchStatus); 2576 } 2577 } 2578 } 2579 ret = device1->close(); 2580 ASSERT_TRUE(ret.isOk()); 2581 } 2582 break; 2583 default: { 2584 ALOGE("%s: Unsupported device version %d", __func__, deviceVersion); 2585 ADD_FAILURE(); 2586 } 2587 break; 2588 } 2589 } 2590 2591 returnStatus = mProvider->setCallback(nullptr); 2592 ASSERT_TRUE(returnStatus.isOk()); 2593 ASSERT_EQ(Status::OK, returnStatus); 2594 } 2595 2596 // Check dump functionality. 2597 TEST_F(CameraHidlTest, dumpState) { 2598 hidl_vec<hidl_string> cameraDeviceNames = getCameraDeviceNames(mProvider); 2599 Return<void> ret; 2600 2601 for (const auto& name : cameraDeviceNames) { 2602 int deviceVersion = getCameraDeviceVersion(name, mProviderType); 2603 switch (deviceVersion) { 2604 case CAMERA_DEVICE_API_VERSION_3_5: 2605 case CAMERA_DEVICE_API_VERSION_3_4: 2606 case CAMERA_DEVICE_API_VERSION_3_3: 2607 case CAMERA_DEVICE_API_VERSION_3_2: { 2608 ::android::sp<ICameraDevice> device3_x; 2609 ALOGI("dumpState: Testing camera device %s", name.c_str()); 2610 ret = mProvider->getCameraDeviceInterface_V3_x( 2611 name, [&](auto status, const auto& device) { 2612 ALOGI("getCameraDeviceInterface_V3_x returns status:%d", (int)status); 2613 ASSERT_EQ(Status::OK, status); 2614 ASSERT_NE(device, nullptr); 2615 device3_x = device; 2616 }); 2617 ASSERT_TRUE(ret.isOk()); 2618 2619 native_handle_t* raw_handle = native_handle_create(1, 0); 2620 raw_handle->data[0] = open(kDumpOutput, O_RDWR); 2621 ASSERT_GE(raw_handle->data[0], 0); 2622 hidl_handle handle = raw_handle; 2623 ret = device3_x->dumpState(handle); 2624 ASSERT_TRUE(ret.isOk()); 2625 close(raw_handle->data[0]); 2626 native_handle_delete(raw_handle); 2627 } 2628 break; 2629 case CAMERA_DEVICE_API_VERSION_1_0: { 2630 ::android::sp<::android::hardware::camera::device::V1_0::ICameraDevice> device1; 2631 ALOGI("dumpState: Testing camera device %s", name.c_str()); 2632 ret = mProvider->getCameraDeviceInterface_V1_x( 2633 name, [&](auto status, const auto& device) { 2634 ALOGI("getCameraDeviceInterface_V1_x returns status:%d", (int)status); 2635 ASSERT_EQ(Status::OK, status); 2636 ASSERT_NE(device, nullptr); 2637 device1 = device; 2638 }); 2639 ASSERT_TRUE(ret.isOk()); 2640 2641 native_handle_t* raw_handle = native_handle_create(1, 0); 2642 raw_handle->data[0] = open(kDumpOutput, O_RDWR); 2643 ASSERT_GE(raw_handle->data[0], 0); 2644 hidl_handle handle = raw_handle; 2645 Return<Status> returnStatus = device1->dumpState(handle); 2646 ASSERT_TRUE(returnStatus.isOk()); 2647 ASSERT_EQ(Status::OK, returnStatus); 2648 close(raw_handle->data[0]); 2649 native_handle_delete(raw_handle); 2650 } 2651 break; 2652 default: { 2653 ALOGE("%s: Unsupported device version %d", __func__, deviceVersion); 2654 ADD_FAILURE(); 2655 } 2656 break; 2657 } 2658 } 2659 } 2660 2661 // Open, dumpStates, then close 2662 TEST_F(CameraHidlTest, openClose) { 2663 hidl_vec<hidl_string> cameraDeviceNames = getCameraDeviceNames(mProvider); 2664 Return<void> ret; 2665 2666 for (const auto& name : cameraDeviceNames) { 2667 int deviceVersion = getCameraDeviceVersion(name, mProviderType); 2668 switch (deviceVersion) { 2669 case CAMERA_DEVICE_API_VERSION_3_5: 2670 case CAMERA_DEVICE_API_VERSION_3_4: 2671 case CAMERA_DEVICE_API_VERSION_3_3: 2672 case CAMERA_DEVICE_API_VERSION_3_2: { 2673 ::android::sp<::android::hardware::camera::device::V3_2::ICameraDevice> device3_x; 2674 ALOGI("openClose: Testing camera device %s", name.c_str()); 2675 ret = mProvider->getCameraDeviceInterface_V3_x( 2676 name, [&](auto status, const auto& device) { 2677 ALOGI("getCameraDeviceInterface_V3_x returns status:%d", (int)status); 2678 ASSERT_EQ(Status::OK, status); 2679 ASSERT_NE(device, nullptr); 2680 device3_x = device; 2681 }); 2682 ASSERT_TRUE(ret.isOk()); 2683 2684 sp<EmptyDeviceCb> cb = new EmptyDeviceCb; 2685 sp<ICameraDeviceSession> session; 2686 ret = device3_x->open(cb, [&](auto status, const auto& newSession) { 2687 ALOGI("device::open returns status:%d", (int)status); 2688 ASSERT_EQ(Status::OK, status); 2689 ASSERT_NE(newSession, nullptr); 2690 session = newSession; 2691 }); 2692 ASSERT_TRUE(ret.isOk()); 2693 // Ensure that a device labeling itself as 3.3/3.4 can have its session interface 2694 // cast the 3.3/3.4 interface, and that lower versions can't be cast to it. 2695 sp<device::V3_3::ICameraDeviceSession> sessionV3_3; 2696 sp<device::V3_4::ICameraDeviceSession> sessionV3_4; 2697 sp<device::V3_5::ICameraDeviceSession> sessionV3_5; 2698 castSession(session, deviceVersion, &sessionV3_3, &sessionV3_4, &sessionV3_5); 2699 if (deviceVersion == CAMERA_DEVICE_API_VERSION_3_5) { 2700 ASSERT_TRUE(sessionV3_5.get() != nullptr); 2701 } else if (deviceVersion == CAMERA_DEVICE_API_VERSION_3_4) { 2702 ASSERT_TRUE(sessionV3_4.get() != nullptr); 2703 } else if (deviceVersion == CAMERA_DEVICE_API_VERSION_3_3) { 2704 ASSERT_TRUE(sessionV3_3.get() != nullptr); 2705 } else { //V3_2 2706 ASSERT_TRUE(sessionV3_3.get() == nullptr); 2707 ASSERT_TRUE(sessionV3_4.get() == nullptr); 2708 ASSERT_TRUE(sessionV3_5.get() == nullptr); 2709 } 2710 native_handle_t* raw_handle = native_handle_create(1, 0); 2711 raw_handle->data[0] = open(kDumpOutput, O_RDWR); 2712 ASSERT_GE(raw_handle->data[0], 0); 2713 hidl_handle handle = raw_handle; 2714 ret = device3_x->dumpState(handle); 2715 ASSERT_TRUE(ret.isOk()); 2716 close(raw_handle->data[0]); 2717 native_handle_delete(raw_handle); 2718 2719 ret = session->close(); 2720 ASSERT_TRUE(ret.isOk()); 2721 // TODO: test all session API calls return INTERNAL_ERROR after close 2722 // TODO: keep a wp copy here and verify session cannot be promoted out of this scope 2723 } 2724 break; 2725 case CAMERA_DEVICE_API_VERSION_1_0: { 2726 sp<::android::hardware::camera::device::V1_0::ICameraDevice> device1; 2727 openCameraDevice(name, mProvider, &device1 /*out*/); 2728 ASSERT_NE(nullptr, device1.get()); 2729 2730 native_handle_t* raw_handle = native_handle_create(1, 0); 2731 raw_handle->data[0] = open(kDumpOutput, O_RDWR); 2732 ASSERT_GE(raw_handle->data[0], 0); 2733 hidl_handle handle = raw_handle; 2734 Return<Status> returnStatus = device1->dumpState(handle); 2735 ASSERT_TRUE(returnStatus.isOk()); 2736 ASSERT_EQ(Status::OK, returnStatus); 2737 close(raw_handle->data[0]); 2738 native_handle_delete(raw_handle); 2739 2740 ret = device1->close(); 2741 ASSERT_TRUE(ret.isOk()); 2742 } 2743 break; 2744 default: { 2745 ALOGE("%s: Unsupported device version %d", __func__, deviceVersion); 2746 ADD_FAILURE(); 2747 } 2748 break; 2749 } 2750 } 2751 } 2752 2753 // Check whether all common default request settings can be sucessfully 2754 // constructed. 2755 TEST_F(CameraHidlTest, constructDefaultRequestSettings) { 2756 hidl_vec<hidl_string> cameraDeviceNames = getCameraDeviceNames(mProvider); 2757 2758 for (const auto& name : cameraDeviceNames) { 2759 int deviceVersion = getCameraDeviceVersion(name, mProviderType); 2760 switch (deviceVersion) { 2761 case CAMERA_DEVICE_API_VERSION_3_5: 2762 case CAMERA_DEVICE_API_VERSION_3_4: 2763 case CAMERA_DEVICE_API_VERSION_3_3: 2764 case CAMERA_DEVICE_API_VERSION_3_2: { 2765 ::android::sp<::android::hardware::camera::device::V3_2::ICameraDevice> device3_x; 2766 Return<void> ret; 2767 ALOGI("constructDefaultRequestSettings: Testing camera device %s", name.c_str()); 2768 ret = mProvider->getCameraDeviceInterface_V3_x( 2769 name, [&](auto status, const auto& device) { 2770 ALOGI("getCameraDeviceInterface_V3_x returns status:%d", (int)status); 2771 ASSERT_EQ(Status::OK, status); 2772 ASSERT_NE(device, nullptr); 2773 device3_x = device; 2774 }); 2775 ASSERT_TRUE(ret.isOk()); 2776 2777 sp<EmptyDeviceCb> cb = new EmptyDeviceCb; 2778 sp<ICameraDeviceSession> session; 2779 ret = device3_x->open(cb, [&](auto status, const auto& newSession) { 2780 ALOGI("device::open returns status:%d", (int)status); 2781 ASSERT_EQ(Status::OK, status); 2782 ASSERT_NE(newSession, nullptr); 2783 session = newSession; 2784 }); 2785 ASSERT_TRUE(ret.isOk()); 2786 2787 for (uint32_t t = (uint32_t)RequestTemplate::PREVIEW; 2788 t <= (uint32_t)RequestTemplate::MANUAL; t++) { 2789 RequestTemplate reqTemplate = (RequestTemplate)t; 2790 ret = 2791 session->constructDefaultRequestSettings( 2792 reqTemplate, [&](auto status, const auto& req) { 2793 ALOGI("constructDefaultRequestSettings returns status:%d", 2794 (int)status); 2795 if (reqTemplate == RequestTemplate::ZERO_SHUTTER_LAG || 2796 reqTemplate == RequestTemplate::MANUAL) { 2797 // optional templates 2798 ASSERT_TRUE((status == Status::OK) || 2799 (status == Status::ILLEGAL_ARGUMENT)); 2800 } else { 2801 ASSERT_EQ(Status::OK, status); 2802 } 2803 2804 if (status == Status::OK) { 2805 const camera_metadata_t* metadata = 2806 (camera_metadata_t*) req.data(); 2807 size_t expectedSize = req.size(); 2808 int result = validate_camera_metadata_structure( 2809 metadata, &expectedSize); 2810 ASSERT_TRUE((result == 0) || 2811 (result == CAMERA_METADATA_VALIDATION_SHIFTED)); 2812 size_t entryCount = 2813 get_camera_metadata_entry_count(metadata); 2814 // TODO: we can do better than 0 here. Need to check how many required 2815 // request keys we've defined for each template 2816 ASSERT_GT(entryCount, 0u); 2817 ALOGI("template %u metadata entry count is %zu", 2818 t, entryCount); 2819 } else { 2820 ASSERT_EQ(0u, req.size()); 2821 } 2822 }); 2823 ASSERT_TRUE(ret.isOk()); 2824 } 2825 ret = session->close(); 2826 ASSERT_TRUE(ret.isOk()); 2827 } 2828 break; 2829 case CAMERA_DEVICE_API_VERSION_1_0: { 2830 //Not applicable 2831 } 2832 break; 2833 default: { 2834 ALOGE("%s: Unsupported device version %d", __func__, deviceVersion); 2835 ADD_FAILURE(); 2836 } 2837 break; 2838 } 2839 } 2840 } 2841 2842 2843 // Verify that all supported stream formats and sizes can be configured 2844 // successfully. 2845 TEST_F(CameraHidlTest, configureStreamsAvailableOutputs) { 2846 hidl_vec<hidl_string> cameraDeviceNames = getCameraDeviceNames(mProvider); 2847 std::vector<AvailableStream> outputStreams; 2848 2849 for (const auto& name : cameraDeviceNames) { 2850 int deviceVersion = getCameraDeviceVersion(name, mProviderType); 2851 if (deviceVersion == CAMERA_DEVICE_API_VERSION_1_0) { 2852 continue; 2853 } else if (deviceVersion <= 0) { 2854 ALOGE("%s: Unsupported device version %d", __func__, deviceVersion); 2855 ADD_FAILURE(); 2856 return; 2857 } 2858 2859 camera_metadata_t* staticMeta; 2860 Return<void> ret; 2861 sp<ICameraDeviceSession> session; 2862 sp<device::V3_3::ICameraDeviceSession> session3_3; 2863 sp<device::V3_4::ICameraDeviceSession> session3_4; 2864 sp<device::V3_5::ICameraDeviceSession> session3_5; 2865 sp<device::V3_2::ICameraDevice> cameraDevice; 2866 sp<device::V3_5::ICameraDevice> cameraDevice3_5; 2867 openEmptyDeviceSession(name, mProvider, 2868 &session /*out*/, &staticMeta /*out*/, &cameraDevice /*out*/); 2869 castSession(session, deviceVersion, &session3_3, &session3_4, &session3_5); 2870 castDevice(cameraDevice, deviceVersion, &cameraDevice3_5); 2871 2872 outputStreams.clear(); 2873 ASSERT_EQ(Status::OK, getAvailableOutputStreams(staticMeta, outputStreams)); 2874 ASSERT_NE(0u, outputStreams.size()); 2875 2876 uint32_t jpegBufferSize = 0; 2877 ASSERT_EQ(Status::OK, getJpegBufferSize(staticMeta, &jpegBufferSize)); 2878 ASSERT_NE(0u, jpegBufferSize); 2879 2880 int32_t streamId = 0; 2881 uint32_t streamConfigCounter = 0; 2882 for (auto& it : outputStreams) { 2883 V3_2::Stream stream3_2; 2884 V3_2::DataspaceFlags dataspaceFlag = 0; 2885 switch (static_cast<PixelFormat>(it.format)) { 2886 case PixelFormat::BLOB: 2887 dataspaceFlag = static_cast<V3_2::DataspaceFlags>(Dataspace::V0_JFIF); 2888 break; 2889 case PixelFormat::Y16: 2890 dataspaceFlag = static_cast<V3_2::DataspaceFlags>(Dataspace::DEPTH); 2891 break; 2892 default: 2893 dataspaceFlag = static_cast<V3_2::DataspaceFlags>(Dataspace::UNKNOWN); 2894 } 2895 stream3_2 = {streamId, 2896 StreamType::OUTPUT, 2897 static_cast<uint32_t>(it.width), 2898 static_cast<uint32_t>(it.height), 2899 static_cast<PixelFormat>(it.format), 2900 GRALLOC1_CONSUMER_USAGE_HWCOMPOSER, 2901 dataspaceFlag, 2902 StreamRotation::ROTATION_0}; 2903 ::android::hardware::hidl_vec<V3_2::Stream> streams3_2 = {stream3_2}; 2904 ::android::hardware::camera::device::V3_5::StreamConfiguration config3_5; 2905 ::android::hardware::camera::device::V3_4::StreamConfiguration config3_4; 2906 ::android::hardware::camera::device::V3_2::StreamConfiguration config3_2; 2907 createStreamConfiguration(streams3_2, StreamConfigurationMode::NORMAL_MODE, 2908 &config3_2, &config3_4, &config3_5, jpegBufferSize); 2909 if (session3_5 != nullptr) { 2910 bool expectStreamCombQuery = (isLogicalMultiCamera(staticMeta) == Status::OK); 2911 verifyStreamCombination(cameraDevice3_5, config3_4, 2912 /*expectedStatus*/ true, expectStreamCombQuery); 2913 config3_5.streamConfigCounter = streamConfigCounter++; 2914 ret = session3_5->configureStreams_3_5(config3_5, 2915 [streamId](Status s, device::V3_4::HalStreamConfiguration halConfig) { 2916 ASSERT_EQ(Status::OK, s); 2917 ASSERT_EQ(1u, halConfig.streams.size()); 2918 ASSERT_EQ(halConfig.streams[0].v3_3.v3_2.id, streamId); 2919 }); 2920 } else if (session3_4 != nullptr) { 2921 ret = session3_4->configureStreams_3_4(config3_4, 2922 [streamId](Status s, device::V3_4::HalStreamConfiguration halConfig) { 2923 ASSERT_EQ(Status::OK, s); 2924 ASSERT_EQ(1u, halConfig.streams.size()); 2925 ASSERT_EQ(halConfig.streams[0].v3_3.v3_2.id, streamId); 2926 }); 2927 } else if (session3_3 != nullptr) { 2928 ret = session3_3->configureStreams_3_3(config3_2, 2929 [streamId](Status s, device::V3_3::HalStreamConfiguration halConfig) { 2930 ASSERT_EQ(Status::OK, s); 2931 ASSERT_EQ(1u, halConfig.streams.size()); 2932 ASSERT_EQ(halConfig.streams[0].v3_2.id, streamId); 2933 }); 2934 } else { 2935 ret = session->configureStreams(config3_2, 2936 [streamId](Status s, HalStreamConfiguration halConfig) { 2937 ASSERT_EQ(Status::OK, s); 2938 ASSERT_EQ(1u, halConfig.streams.size()); 2939 ASSERT_EQ(halConfig.streams[0].id, streamId); 2940 }); 2941 } 2942 ASSERT_TRUE(ret.isOk()); 2943 streamId++; 2944 } 2945 2946 free_camera_metadata(staticMeta); 2947 ret = session->close(); 2948 ASSERT_TRUE(ret.isOk()); 2949 } 2950 } 2951 2952 // Check for correct handling of invalid/incorrect configuration parameters. 2953 TEST_F(CameraHidlTest, configureStreamsInvalidOutputs) { 2954 hidl_vec<hidl_string> cameraDeviceNames = getCameraDeviceNames(mProvider); 2955 std::vector<AvailableStream> outputStreams; 2956 2957 for (const auto& name : cameraDeviceNames) { 2958 int deviceVersion = getCameraDeviceVersion(name, mProviderType); 2959 if (deviceVersion == CAMERA_DEVICE_API_VERSION_1_0) { 2960 continue; 2961 } else if (deviceVersion <= 0) { 2962 ALOGE("%s: Unsupported device version %d", __func__, deviceVersion); 2963 ADD_FAILURE(); 2964 return; 2965 } 2966 2967 camera_metadata_t* staticMeta; 2968 Return<void> ret; 2969 sp<ICameraDeviceSession> session; 2970 sp<device::V3_3::ICameraDeviceSession> session3_3; 2971 sp<device::V3_4::ICameraDeviceSession> session3_4; 2972 sp<device::V3_5::ICameraDeviceSession> session3_5; 2973 sp<device::V3_2::ICameraDevice> cameraDevice; 2974 sp<device::V3_5::ICameraDevice> cameraDevice3_5; 2975 openEmptyDeviceSession(name, mProvider, &session /*out*/, &staticMeta /*out*/, 2976 &cameraDevice /*out*/); 2977 castSession(session, deviceVersion, &session3_3, &session3_4, &session3_5); 2978 castDevice(cameraDevice, deviceVersion, &cameraDevice3_5); 2979 2980 outputStreams.clear(); 2981 ASSERT_EQ(Status::OK, getAvailableOutputStreams(staticMeta, outputStreams)); 2982 ASSERT_NE(0u, outputStreams.size()); 2983 2984 uint32_t jpegBufferSize = 0; 2985 ASSERT_EQ(Status::OK, getJpegBufferSize(staticMeta, &jpegBufferSize)); 2986 ASSERT_NE(0u, jpegBufferSize); 2987 2988 int32_t streamId = 0; 2989 V3_2::Stream stream3_2 = {streamId++, 2990 StreamType::OUTPUT, 2991 static_cast<uint32_t>(0), 2992 static_cast<uint32_t>(0), 2993 static_cast<PixelFormat>(outputStreams[0].format), 2994 GRALLOC1_CONSUMER_USAGE_HWCOMPOSER, 2995 0, 2996 StreamRotation::ROTATION_0}; 2997 uint32_t streamConfigCounter = 0; 2998 ::android::hardware::hidl_vec<V3_2::Stream> streams = {stream3_2}; 2999 ::android::hardware::camera::device::V3_5::StreamConfiguration config3_5; 3000 ::android::hardware::camera::device::V3_4::StreamConfiguration config3_4; 3001 ::android::hardware::camera::device::V3_2::StreamConfiguration config3_2; 3002 createStreamConfiguration(streams, StreamConfigurationMode::NORMAL_MODE, 3003 &config3_2, &config3_4, &config3_5, jpegBufferSize); 3004 if (session3_5 != nullptr) { 3005 verifyStreamCombination(cameraDevice3_5, config3_4, /*expectedStatus*/ false, 3006 /*expectStreamCombQuery*/false); 3007 config3_5.streamConfigCounter = streamConfigCounter++; 3008 ret = session3_5->configureStreams_3_5(config3_5, 3009 [](Status s, device::V3_4::HalStreamConfiguration) { 3010 ASSERT_TRUE((Status::ILLEGAL_ARGUMENT == s) || 3011 (Status::INTERNAL_ERROR == s)); 3012 }); 3013 } else if (session3_4 != nullptr) { 3014 ret = session3_4->configureStreams_3_4(config3_4, 3015 [](Status s, device::V3_4::HalStreamConfiguration) { 3016 ASSERT_TRUE((Status::ILLEGAL_ARGUMENT == s) || 3017 (Status::INTERNAL_ERROR == s)); 3018 }); 3019 } else if(session3_3 != nullptr) { 3020 ret = session3_3->configureStreams_3_3(config3_2, 3021 [](Status s, device::V3_3::HalStreamConfiguration) { 3022 ASSERT_TRUE((Status::ILLEGAL_ARGUMENT == s) || 3023 (Status::INTERNAL_ERROR == s)); 3024 }); 3025 } else { 3026 ret = session->configureStreams(config3_2, 3027 [](Status s, HalStreamConfiguration) { 3028 ASSERT_TRUE((Status::ILLEGAL_ARGUMENT == s) || 3029 (Status::INTERNAL_ERROR == s)); 3030 }); 3031 } 3032 ASSERT_TRUE(ret.isOk()); 3033 3034 stream3_2 = {streamId++, 3035 StreamType::OUTPUT, 3036 static_cast<uint32_t>(UINT32_MAX), 3037 static_cast<uint32_t>(UINT32_MAX), 3038 static_cast<PixelFormat>(outputStreams[0].format), 3039 GRALLOC1_CONSUMER_USAGE_HWCOMPOSER, 3040 0, 3041 StreamRotation::ROTATION_0}; 3042 streams[0] = stream3_2; 3043 createStreamConfiguration(streams, StreamConfigurationMode::NORMAL_MODE, 3044 &config3_2, &config3_4, &config3_5, jpegBufferSize); 3045 if (session3_5 != nullptr) { 3046 config3_5.streamConfigCounter = streamConfigCounter++; 3047 ret = session3_5->configureStreams_3_5(config3_5, [](Status s, 3048 device::V3_4::HalStreamConfiguration) { 3049 ASSERT_EQ(Status::ILLEGAL_ARGUMENT, s); 3050 }); 3051 } else if(session3_4 != nullptr) { 3052 ret = session3_4->configureStreams_3_4(config3_4, [](Status s, 3053 device::V3_4::HalStreamConfiguration) { 3054 ASSERT_EQ(Status::ILLEGAL_ARGUMENT, s); 3055 }); 3056 } else if(session3_3 != nullptr) { 3057 ret = session3_3->configureStreams_3_3(config3_2, [](Status s, 3058 device::V3_3::HalStreamConfiguration) { 3059 ASSERT_EQ(Status::ILLEGAL_ARGUMENT, s); 3060 }); 3061 } else { 3062 ret = session->configureStreams(config3_2, [](Status s, 3063 HalStreamConfiguration) { 3064 ASSERT_EQ(Status::ILLEGAL_ARGUMENT, s); 3065 }); 3066 } 3067 ASSERT_TRUE(ret.isOk()); 3068 3069 for (auto& it : outputStreams) { 3070 stream3_2 = {streamId++, 3071 StreamType::OUTPUT, 3072 static_cast<uint32_t>(it.width), 3073 static_cast<uint32_t>(it.height), 3074 static_cast<PixelFormat>(UINT32_MAX), 3075 GRALLOC1_CONSUMER_USAGE_HWCOMPOSER, 3076 0, 3077 StreamRotation::ROTATION_0}; 3078 streams[0] = stream3_2; 3079 createStreamConfiguration(streams, StreamConfigurationMode::NORMAL_MODE, 3080 &config3_2, &config3_4, &config3_5, jpegBufferSize); 3081 if (session3_5 != nullptr) { 3082 config3_5.streamConfigCounter = streamConfigCounter++; 3083 ret = session3_5->configureStreams_3_5(config3_5, 3084 [](Status s, device::V3_4::HalStreamConfiguration) { 3085 ASSERT_EQ(Status::ILLEGAL_ARGUMENT, s); 3086 }); 3087 } else if(session3_4 != nullptr) { 3088 ret = session3_4->configureStreams_3_4(config3_4, 3089 [](Status s, device::V3_4::HalStreamConfiguration) { 3090 ASSERT_EQ(Status::ILLEGAL_ARGUMENT, s); 3091 }); 3092 } else if(session3_3 != nullptr) { 3093 ret = session3_3->configureStreams_3_3(config3_2, 3094 [](Status s, device::V3_3::HalStreamConfiguration) { 3095 ASSERT_EQ(Status::ILLEGAL_ARGUMENT, s); 3096 }); 3097 } else { 3098 ret = session->configureStreams(config3_2, 3099 [](Status s, HalStreamConfiguration) { 3100 ASSERT_EQ(Status::ILLEGAL_ARGUMENT, s); 3101 }); 3102 } 3103 ASSERT_TRUE(ret.isOk()); 3104 3105 stream3_2 = {streamId++, 3106 StreamType::OUTPUT, 3107 static_cast<uint32_t>(it.width), 3108 static_cast<uint32_t>(it.height), 3109 static_cast<PixelFormat>(it.format), 3110 GRALLOC1_CONSUMER_USAGE_HWCOMPOSER, 3111 0, 3112 static_cast<StreamRotation>(UINT32_MAX)}; 3113 streams[0] = stream3_2; 3114 createStreamConfiguration(streams, StreamConfigurationMode::NORMAL_MODE, 3115 &config3_2, &config3_4, &config3_5, jpegBufferSize); 3116 if (session3_5 != nullptr) { 3117 config3_5.streamConfigCounter = streamConfigCounter++; 3118 ret = session3_5->configureStreams_3_5(config3_5, 3119 [](Status s, device::V3_4::HalStreamConfiguration) { 3120 ASSERT_EQ(Status::ILLEGAL_ARGUMENT, s); 3121 }); 3122 } else if(session3_4 != nullptr) { 3123 ret = session3_4->configureStreams_3_4(config3_4, 3124 [](Status s, device::V3_4::HalStreamConfiguration) { 3125 ASSERT_EQ(Status::ILLEGAL_ARGUMENT, s); 3126 }); 3127 } else if(session3_3 != nullptr) { 3128 ret = session3_3->configureStreams_3_3(config3_2, 3129 [](Status s, device::V3_3::HalStreamConfiguration) { 3130 ASSERT_EQ(Status::ILLEGAL_ARGUMENT, s); 3131 }); 3132 } else { 3133 ret = session->configureStreams(config3_2, 3134 [](Status s, HalStreamConfiguration) { 3135 ASSERT_EQ(Status::ILLEGAL_ARGUMENT, s); 3136 }); 3137 } 3138 ASSERT_TRUE(ret.isOk()); 3139 } 3140 3141 free_camera_metadata(staticMeta); 3142 ret = session->close(); 3143 ASSERT_TRUE(ret.isOk()); 3144 } 3145 } 3146 3147 // Check whether all supported ZSL output stream combinations can be 3148 // configured successfully. 3149 TEST_F(CameraHidlTest, configureStreamsZSLInputOutputs) { 3150 hidl_vec<hidl_string> cameraDeviceNames = getCameraDeviceNames(mProvider); 3151 std::vector<AvailableStream> inputStreams; 3152 std::vector<AvailableZSLInputOutput> inputOutputMap; 3153 3154 for (const auto& name : cameraDeviceNames) { 3155 int deviceVersion = getCameraDeviceVersion(name, mProviderType); 3156 if (deviceVersion == CAMERA_DEVICE_API_VERSION_1_0) { 3157 continue; 3158 } else if (deviceVersion <= 0) { 3159 ALOGE("%s: Unsupported device version %d", __func__, deviceVersion); 3160 ADD_FAILURE(); 3161 return; 3162 } 3163 3164 camera_metadata_t* staticMeta; 3165 Return<void> ret; 3166 sp<ICameraDeviceSession> session; 3167 sp<device::V3_3::ICameraDeviceSession> session3_3; 3168 sp<device::V3_4::ICameraDeviceSession> session3_4; 3169 sp<device::V3_5::ICameraDeviceSession> session3_5; 3170 sp<device::V3_2::ICameraDevice> cameraDevice; 3171 sp<device::V3_5::ICameraDevice> cameraDevice3_5; 3172 openEmptyDeviceSession(name, mProvider, &session /*out*/, &staticMeta /*out*/, 3173 &cameraDevice /*out*/); 3174 castSession(session, deviceVersion, &session3_3, &session3_4, &session3_5); 3175 castDevice(cameraDevice, deviceVersion, &cameraDevice3_5); 3176 3177 Status rc = isZSLModeAvailable(staticMeta); 3178 if (Status::METHOD_NOT_SUPPORTED == rc) { 3179 ret = session->close(); 3180 ASSERT_TRUE(ret.isOk()); 3181 continue; 3182 } 3183 ASSERT_EQ(Status::OK, rc); 3184 3185 inputStreams.clear(); 3186 ASSERT_EQ(Status::OK, getAvailableOutputStreams(staticMeta, inputStreams)); 3187 ASSERT_NE(0u, inputStreams.size()); 3188 3189 inputOutputMap.clear(); 3190 ASSERT_EQ(Status::OK, getZSLInputOutputMap(staticMeta, inputOutputMap)); 3191 ASSERT_NE(0u, inputOutputMap.size()); 3192 3193 bool supportMonoY8 = false; 3194 if (Status::OK == isMonochromeCamera(staticMeta)) { 3195 for (auto& it : inputStreams) { 3196 if (it.format == static_cast<uint32_t>(PixelFormat::Y8)) { 3197 supportMonoY8 = true; 3198 break; 3199 } 3200 } 3201 } 3202 3203 uint32_t jpegBufferSize = 0; 3204 ASSERT_EQ(Status::OK, getJpegBufferSize(staticMeta, &jpegBufferSize)); 3205 ASSERT_NE(0u, jpegBufferSize); 3206 3207 int32_t streamId = 0; 3208 bool hasPrivToY8 = false, hasY8ToY8 = false, hasY8ToBlob = false; 3209 uint32_t streamConfigCounter = 0; 3210 for (auto& inputIter : inputOutputMap) { 3211 AvailableStream input; 3212 ASSERT_EQ(Status::OK, findLargestSize(inputStreams, inputIter.inputFormat, 3213 input)); 3214 ASSERT_NE(0u, inputStreams.size()); 3215 3216 if (inputIter.inputFormat == static_cast<uint32_t>(PixelFormat::IMPLEMENTATION_DEFINED) 3217 && inputIter.outputFormat == static_cast<uint32_t>(PixelFormat::Y8)) { 3218 hasPrivToY8 = true; 3219 } else if (inputIter.inputFormat == static_cast<uint32_t>(PixelFormat::Y8)) { 3220 if (inputIter.outputFormat == static_cast<uint32_t>(PixelFormat::BLOB)) { 3221 hasY8ToBlob = true; 3222 } else if (inputIter.outputFormat == static_cast<uint32_t>(PixelFormat::Y8)) { 3223 hasY8ToY8 = true; 3224 } 3225 } 3226 AvailableStream outputThreshold = {INT32_MAX, INT32_MAX, 3227 inputIter.outputFormat}; 3228 std::vector<AvailableStream> outputStreams; 3229 ASSERT_EQ(Status::OK, 3230 getAvailableOutputStreams(staticMeta, outputStreams, 3231 &outputThreshold)); 3232 for (auto& outputIter : outputStreams) { 3233 V3_2::Stream zslStream = {streamId++, 3234 StreamType::OUTPUT, 3235 static_cast<uint32_t>(input.width), 3236 static_cast<uint32_t>(input.height), 3237 static_cast<PixelFormat>(input.format), 3238 GRALLOC_USAGE_HW_CAMERA_ZSL, 3239 0, 3240 StreamRotation::ROTATION_0}; 3241 V3_2::Stream inputStream = {streamId++, 3242 StreamType::INPUT, 3243 static_cast<uint32_t>(input.width), 3244 static_cast<uint32_t>(input.height), 3245 static_cast<PixelFormat>(input.format), 3246 0, 3247 0, 3248 StreamRotation::ROTATION_0}; 3249 V3_2::Stream outputStream = {streamId++, 3250 StreamType::OUTPUT, 3251 static_cast<uint32_t>(outputIter.width), 3252 static_cast<uint32_t>(outputIter.height), 3253 static_cast<PixelFormat>(outputIter.format), 3254 GRALLOC1_CONSUMER_USAGE_HWCOMPOSER, 3255 0, 3256 StreamRotation::ROTATION_0}; 3257 3258 ::android::hardware::hidl_vec<V3_2::Stream> streams = {inputStream, zslStream, 3259 outputStream}; 3260 ::android::hardware::camera::device::V3_5::StreamConfiguration config3_5; 3261 ::android::hardware::camera::device::V3_4::StreamConfiguration config3_4; 3262 ::android::hardware::camera::device::V3_2::StreamConfiguration config3_2; 3263 createStreamConfiguration(streams, StreamConfigurationMode::NORMAL_MODE, 3264 &config3_2, &config3_4, &config3_5, jpegBufferSize); 3265 if (session3_5 != nullptr) { 3266 verifyStreamCombination(cameraDevice3_5, config3_4, 3267 /*expectedStatus*/ true, /*expectStreamCombQuery*/ false); 3268 config3_5.streamConfigCounter = streamConfigCounter++; 3269 ret = session3_5->configureStreams_3_5(config3_5, 3270 [](Status s, device::V3_4::HalStreamConfiguration halConfig) { 3271 ASSERT_EQ(Status::OK, s); 3272 ASSERT_EQ(3u, halConfig.streams.size()); 3273 }); 3274 } else if (session3_4 != nullptr) { 3275 ret = session3_4->configureStreams_3_4(config3_4, 3276 [](Status s, device::V3_4::HalStreamConfiguration halConfig) { 3277 ASSERT_EQ(Status::OK, s); 3278 ASSERT_EQ(3u, halConfig.streams.size()); 3279 }); 3280 } else if (session3_3 != nullptr) { 3281 ret = session3_3->configureStreams_3_3(config3_2, 3282 [](Status s, device::V3_3::HalStreamConfiguration halConfig) { 3283 ASSERT_EQ(Status::OK, s); 3284 ASSERT_EQ(3u, halConfig.streams.size()); 3285 }); 3286 } else { 3287 ret = session->configureStreams(config3_2, 3288 [](Status s, HalStreamConfiguration halConfig) { 3289 ASSERT_EQ(Status::OK, s); 3290 ASSERT_EQ(3u, halConfig.streams.size()); 3291 }); 3292 } 3293 ASSERT_TRUE(ret.isOk()); 3294 } 3295 } 3296 3297 if (supportMonoY8) { 3298 if (Status::OK == isZSLModeAvailable(staticMeta, PRIV_REPROCESS)) { 3299 ASSERT_TRUE(hasPrivToY8); 3300 } 3301 if (Status::OK == isZSLModeAvailable(staticMeta, YUV_REPROCESS)) { 3302 ASSERT_TRUE(hasY8ToY8); 3303 ASSERT_TRUE(hasY8ToBlob); 3304 } 3305 } 3306 3307 free_camera_metadata(staticMeta); 3308 ret = session->close(); 3309 ASSERT_TRUE(ret.isOk()); 3310 } 3311 } 3312 3313 // Check whether session parameters are supported. If Hal support for them 3314 // exist, then try to configure a preview stream using them. 3315 TEST_F(CameraHidlTest, configureStreamsWithSessionParameters) { 3316 hidl_vec<hidl_string> cameraDeviceNames = getCameraDeviceNames(mProvider); 3317 std::vector<AvailableStream> outputPreviewStreams; 3318 AvailableStream previewThreshold = {kMaxPreviewWidth, kMaxPreviewHeight, 3319 static_cast<int32_t>(PixelFormat::IMPLEMENTATION_DEFINED)}; 3320 3321 for (const auto& name : cameraDeviceNames) { 3322 int deviceVersion = getCameraDeviceVersion(name, mProviderType); 3323 if (deviceVersion <= 0) { 3324 ALOGE("%s: Unsupported device version %d", __func__, deviceVersion); 3325 ADD_FAILURE(); 3326 return; 3327 } else if (deviceVersion < CAMERA_DEVICE_API_VERSION_3_4) { 3328 continue; 3329 } 3330 3331 camera_metadata_t* staticMetaBuffer; 3332 Return<void> ret; 3333 sp<ICameraDeviceSession> session; 3334 sp<device::V3_3::ICameraDeviceSession> session3_3; 3335 sp<device::V3_4::ICameraDeviceSession> session3_4; 3336 sp<device::V3_5::ICameraDeviceSession> session3_5; 3337 openEmptyDeviceSession(name, mProvider, &session /*out*/, &staticMetaBuffer /*out*/); 3338 castSession(session, deviceVersion, &session3_3, &session3_4, &session3_5); 3339 if (deviceVersion == CAMERA_DEVICE_API_VERSION_3_4) { 3340 ASSERT_NE(session3_4, nullptr); 3341 } else { 3342 ASSERT_NE(session3_5, nullptr); 3343 } 3344 3345 std::unordered_set<int32_t> availableSessionKeys; 3346 auto rc = getSupportedKeys(staticMetaBuffer, ANDROID_REQUEST_AVAILABLE_SESSION_KEYS, 3347 &availableSessionKeys); 3348 ASSERT_TRUE(Status::OK == rc); 3349 if (availableSessionKeys.empty()) { 3350 free_camera_metadata(staticMetaBuffer); 3351 ret = session->close(); 3352 ASSERT_TRUE(ret.isOk()); 3353 continue; 3354 } 3355 3356 android::hardware::camera::common::V1_0::helper::CameraMetadata previewRequestSettings; 3357 android::hardware::camera::common::V1_0::helper::CameraMetadata sessionParams, 3358 modifiedSessionParams; 3359 constructFilteredSettings(session, availableSessionKeys, RequestTemplate::PREVIEW, 3360 &previewRequestSettings, &sessionParams); 3361 if (sessionParams.isEmpty()) { 3362 free_camera_metadata(staticMetaBuffer); 3363 ret = session->close(); 3364 ASSERT_TRUE(ret.isOk()); 3365 continue; 3366 } 3367 3368 outputPreviewStreams.clear(); 3369 3370 ASSERT_EQ(Status::OK, getAvailableOutputStreams(staticMetaBuffer, outputPreviewStreams, 3371 &previewThreshold)); 3372 ASSERT_NE(0u, outputPreviewStreams.size()); 3373 3374 V3_4::Stream previewStream; 3375 previewStream.v3_2 = {0, 3376 StreamType::OUTPUT, 3377 static_cast<uint32_t>(outputPreviewStreams[0].width), 3378 static_cast<uint32_t>(outputPreviewStreams[0].height), 3379 static_cast<PixelFormat>(outputPreviewStreams[0].format), 3380 GRALLOC1_CONSUMER_USAGE_HWCOMPOSER, 3381 0, 3382 StreamRotation::ROTATION_0}; 3383 previewStream.bufferSize = 0; 3384 ::android::hardware::hidl_vec<V3_4::Stream> streams = {previewStream}; 3385 ::android::hardware::camera::device::V3_4::StreamConfiguration config; 3386 ::android::hardware::camera::device::V3_5::StreamConfiguration config3_5; 3387 config.streams = streams; 3388 config.operationMode = StreamConfigurationMode::NORMAL_MODE; 3389 modifiedSessionParams = sessionParams; 3390 auto sessionParamsBuffer = sessionParams.release(); 3391 config.sessionParams.setToExternal(reinterpret_cast<uint8_t *> (sessionParamsBuffer), 3392 get_camera_metadata_size(sessionParamsBuffer)); 3393 config3_5.v3_4 = config; 3394 config3_5.streamConfigCounter = 0; 3395 if (session3_5 != nullptr) { 3396 bool newSessionParamsAvailable = false; 3397 for (const auto& it : availableSessionKeys) { 3398 if (modifiedSessionParams.exists(it)) { 3399 modifiedSessionParams.erase(it); 3400 newSessionParamsAvailable = true; 3401 break; 3402 } 3403 } 3404 if (newSessionParamsAvailable) { 3405 auto modifiedSessionParamsBuffer = modifiedSessionParams.release(); 3406 verifySessionReconfigurationQuery(session3_5, sessionParamsBuffer, 3407 modifiedSessionParamsBuffer); 3408 modifiedSessionParams.acquire(modifiedSessionParamsBuffer); 3409 } 3410 3411 ret = session3_5->configureStreams_3_5(config3_5, 3412 [](Status s, device::V3_4::HalStreamConfiguration halConfig) { 3413 ASSERT_EQ(Status::OK, s); 3414 ASSERT_EQ(1u, halConfig.streams.size()); 3415 }); 3416 } else { 3417 ret = session3_4->configureStreams_3_4(config, 3418 [](Status s, device::V3_4::HalStreamConfiguration halConfig) { 3419 ASSERT_EQ(Status::OK, s); 3420 ASSERT_EQ(1u, halConfig.streams.size()); 3421 }); 3422 } 3423 sessionParams.acquire(sessionParamsBuffer); 3424 ASSERT_TRUE(ret.isOk()); 3425 3426 free_camera_metadata(staticMetaBuffer); 3427 ret = session->close(); 3428 ASSERT_TRUE(ret.isOk()); 3429 } 3430 } 3431 3432 // Verify that all supported preview + still capture stream combinations 3433 // can be configured successfully. 3434 TEST_F(CameraHidlTest, configureStreamsPreviewStillOutputs) { 3435 hidl_vec<hidl_string> cameraDeviceNames = getCameraDeviceNames(mProvider); 3436 std::vector<AvailableStream> outputBlobStreams; 3437 std::vector<AvailableStream> outputPreviewStreams; 3438 AvailableStream previewThreshold = {kMaxPreviewWidth, kMaxPreviewHeight, 3439 static_cast<int32_t>(PixelFormat::IMPLEMENTATION_DEFINED)}; 3440 AvailableStream blobThreshold = {INT32_MAX, INT32_MAX, 3441 static_cast<int32_t>(PixelFormat::BLOB)}; 3442 3443 for (const auto& name : cameraDeviceNames) { 3444 int deviceVersion = getCameraDeviceVersion(name, mProviderType); 3445 if (deviceVersion == CAMERA_DEVICE_API_VERSION_1_0) { 3446 continue; 3447 } else if (deviceVersion <= 0) { 3448 ALOGE("%s: Unsupported device version %d", __func__, deviceVersion); 3449 ADD_FAILURE(); 3450 return; 3451 } 3452 3453 camera_metadata_t* staticMeta; 3454 Return<void> ret; 3455 sp<ICameraDeviceSession> session; 3456 sp<device::V3_3::ICameraDeviceSession> session3_3; 3457 sp<device::V3_4::ICameraDeviceSession> session3_4; 3458 sp<device::V3_5::ICameraDeviceSession> session3_5; 3459 sp<device::V3_2::ICameraDevice> cameraDevice; 3460 sp<device::V3_5::ICameraDevice> cameraDevice3_5; 3461 openEmptyDeviceSession(name, mProvider, &session /*out*/, &staticMeta /*out*/, 3462 &cameraDevice /*out*/); 3463 castSession(session, deviceVersion, &session3_3, &session3_4, &session3_5); 3464 castDevice(cameraDevice, deviceVersion, &cameraDevice3_5); 3465 3466 // Check if camera support depth only 3467 if (isDepthOnly(staticMeta)) { 3468 free_camera_metadata(staticMeta); 3469 ret = session->close(); 3470 ASSERT_TRUE(ret.isOk()); 3471 continue; 3472 } 3473 3474 outputBlobStreams.clear(); 3475 ASSERT_EQ(Status::OK, 3476 getAvailableOutputStreams(staticMeta, outputBlobStreams, 3477 &blobThreshold)); 3478 ASSERT_NE(0u, outputBlobStreams.size()); 3479 3480 outputPreviewStreams.clear(); 3481 ASSERT_EQ(Status::OK, getAvailableOutputStreams(staticMeta, outputPreviewStreams, 3482 &previewThreshold)); 3483 ASSERT_NE(0u, outputPreviewStreams.size()); 3484 3485 uint32_t jpegBufferSize = 0; 3486 ASSERT_EQ(Status::OK, getJpegBufferSize(staticMeta, &jpegBufferSize)); 3487 ASSERT_NE(0u, jpegBufferSize); 3488 3489 int32_t streamId = 0; 3490 uint32_t streamConfigCounter = 0; 3491 for (auto& blobIter : outputBlobStreams) { 3492 for (auto& previewIter : outputPreviewStreams) { 3493 V3_2::Stream previewStream = {streamId++, 3494 StreamType::OUTPUT, 3495 static_cast<uint32_t>(previewIter.width), 3496 static_cast<uint32_t>(previewIter.height), 3497 static_cast<PixelFormat>(previewIter.format), 3498 GRALLOC1_CONSUMER_USAGE_HWCOMPOSER, 3499 0, 3500 StreamRotation::ROTATION_0}; 3501 V3_2::Stream blobStream = {streamId++, 3502 StreamType::OUTPUT, 3503 static_cast<uint32_t>(blobIter.width), 3504 static_cast<uint32_t>(blobIter.height), 3505 static_cast<PixelFormat>(blobIter.format), 3506 GRALLOC1_CONSUMER_USAGE_CPU_READ, 3507 static_cast<V3_2::DataspaceFlags>(Dataspace::V0_JFIF), 3508 StreamRotation::ROTATION_0}; 3509 ::android::hardware::hidl_vec<V3_2::Stream> streams = {previewStream, 3510 blobStream}; 3511 ::android::hardware::camera::device::V3_5::StreamConfiguration config3_5; 3512 ::android::hardware::camera::device::V3_4::StreamConfiguration config3_4; 3513 ::android::hardware::camera::device::V3_2::StreamConfiguration config3_2; 3514 createStreamConfiguration(streams, StreamConfigurationMode::NORMAL_MODE, 3515 &config3_2, &config3_4, &config3_5, jpegBufferSize); 3516 if (session3_5 != nullptr) { 3517 verifyStreamCombination(cameraDevice3_5, config3_4, 3518 /*expectedStatus*/ true, /*expectStreamCombQuery*/ false); 3519 config3_5.streamConfigCounter = streamConfigCounter++; 3520 ret = session3_5->configureStreams_3_5(config3_5, 3521 [](Status s, device::V3_4::HalStreamConfiguration halConfig) { 3522 ASSERT_EQ(Status::OK, s); 3523 ASSERT_EQ(2u, halConfig.streams.size()); 3524 }); 3525 } else if (session3_4 != nullptr) { 3526 ret = session3_4->configureStreams_3_4(config3_4, 3527 [](Status s, device::V3_4::HalStreamConfiguration halConfig) { 3528 ASSERT_EQ(Status::OK, s); 3529 ASSERT_EQ(2u, halConfig.streams.size()); 3530 }); 3531 } else if (session3_3 != nullptr) { 3532 ret = session3_3->configureStreams_3_3(config3_2, 3533 [](Status s, device::V3_3::HalStreamConfiguration halConfig) { 3534 ASSERT_EQ(Status::OK, s); 3535 ASSERT_EQ(2u, halConfig.streams.size()); 3536 }); 3537 } else { 3538 ret = session->configureStreams(config3_2, 3539 [](Status s, HalStreamConfiguration halConfig) { 3540 ASSERT_EQ(Status::OK, s); 3541 ASSERT_EQ(2u, halConfig.streams.size()); 3542 }); 3543 } 3544 ASSERT_TRUE(ret.isOk()); 3545 } 3546 } 3547 3548 free_camera_metadata(staticMeta); 3549 ret = session->close(); 3550 ASSERT_TRUE(ret.isOk()); 3551 } 3552 } 3553 3554 // In case constrained mode is supported, test whether it can be 3555 // configured. Additionally check for common invalid inputs when 3556 // using this mode. 3557 TEST_F(CameraHidlTest, configureStreamsConstrainedOutputs) { 3558 hidl_vec<hidl_string> cameraDeviceNames = getCameraDeviceNames(mProvider); 3559 3560 for (const auto& name : cameraDeviceNames) { 3561 int deviceVersion = getCameraDeviceVersion(name, mProviderType); 3562 if (deviceVersion == CAMERA_DEVICE_API_VERSION_1_0) { 3563 continue; 3564 } else if (deviceVersion <= 0) { 3565 ALOGE("%s: Unsupported device version %d", __func__, deviceVersion); 3566 ADD_FAILURE(); 3567 return; 3568 } 3569 3570 camera_metadata_t* staticMeta; 3571 Return<void> ret; 3572 sp<ICameraDeviceSession> session; 3573 sp<device::V3_3::ICameraDeviceSession> session3_3; 3574 sp<device::V3_4::ICameraDeviceSession> session3_4; 3575 sp<device::V3_5::ICameraDeviceSession> session3_5; 3576 sp<device::V3_2::ICameraDevice> cameraDevice; 3577 sp<device::V3_5::ICameraDevice> cameraDevice3_5; 3578 openEmptyDeviceSession(name, mProvider, &session /*out*/, &staticMeta /*out*/, 3579 &cameraDevice /*out*/); 3580 castSession(session, deviceVersion, &session3_3, &session3_4, &session3_5); 3581 castDevice(cameraDevice, deviceVersion, &cameraDevice3_5); 3582 3583 Status rc = isConstrainedModeAvailable(staticMeta); 3584 if (Status::METHOD_NOT_SUPPORTED == rc) { 3585 ret = session->close(); 3586 ASSERT_TRUE(ret.isOk()); 3587 continue; 3588 } 3589 ASSERT_EQ(Status::OK, rc); 3590 3591 AvailableStream hfrStream; 3592 rc = pickConstrainedModeSize(staticMeta, hfrStream); 3593 ASSERT_EQ(Status::OK, rc); 3594 3595 int32_t streamId = 0; 3596 uint32_t streamConfigCounter = 0; 3597 V3_2::Stream stream = {streamId, 3598 StreamType::OUTPUT, 3599 static_cast<uint32_t>(hfrStream.width), 3600 static_cast<uint32_t>(hfrStream.height), 3601 static_cast<PixelFormat>(hfrStream.format), 3602 GRALLOC1_CONSUMER_USAGE_VIDEO_ENCODER, 3603 0, 3604 StreamRotation::ROTATION_0}; 3605 ::android::hardware::hidl_vec<V3_2::Stream> streams = {stream}; 3606 ::android::hardware::camera::device::V3_5::StreamConfiguration config3_5; 3607 ::android::hardware::camera::device::V3_4::StreamConfiguration config3_4; 3608 ::android::hardware::camera::device::V3_2::StreamConfiguration config3_2; 3609 createStreamConfiguration(streams, StreamConfigurationMode::CONSTRAINED_HIGH_SPEED_MODE, 3610 &config3_2, &config3_4, &config3_5); 3611 if (session3_5 != nullptr) { 3612 verifyStreamCombination(cameraDevice3_5, config3_4, 3613 /*expectedStatus*/ true, /*expectStreamCombQuery*/ false); 3614 config3_5.streamConfigCounter = streamConfigCounter++; 3615 ret = session3_5->configureStreams_3_5(config3_5, 3616 [streamId](Status s, device::V3_4::HalStreamConfiguration halConfig) { 3617 ASSERT_EQ(Status::OK, s); 3618 ASSERT_EQ(1u, halConfig.streams.size()); 3619 ASSERT_EQ(halConfig.streams[0].v3_3.v3_2.id, streamId); 3620 }); 3621 } else if (session3_4 != nullptr) { 3622 ret = session3_4->configureStreams_3_4(config3_4, 3623 [streamId](Status s, device::V3_4::HalStreamConfiguration halConfig) { 3624 ASSERT_EQ(Status::OK, s); 3625 ASSERT_EQ(1u, halConfig.streams.size()); 3626 ASSERT_EQ(halConfig.streams[0].v3_3.v3_2.id, streamId); 3627 }); 3628 } else if (session3_3 != nullptr) { 3629 ret = session3_3->configureStreams_3_3(config3_2, 3630 [streamId](Status s, device::V3_3::HalStreamConfiguration halConfig) { 3631 ASSERT_EQ(Status::OK, s); 3632 ASSERT_EQ(1u, halConfig.streams.size()); 3633 ASSERT_EQ(halConfig.streams[0].v3_2.id, streamId); 3634 }); 3635 } else { 3636 ret = session->configureStreams(config3_2, 3637 [streamId](Status s, HalStreamConfiguration halConfig) { 3638 ASSERT_EQ(Status::OK, s); 3639 ASSERT_EQ(1u, halConfig.streams.size()); 3640 ASSERT_EQ(halConfig.streams[0].id, streamId); 3641 }); 3642 } 3643 ASSERT_TRUE(ret.isOk()); 3644 3645 stream = {streamId++, 3646 StreamType::OUTPUT, 3647 static_cast<uint32_t>(0), 3648 static_cast<uint32_t>(0), 3649 static_cast<PixelFormat>(hfrStream.format), 3650 GRALLOC1_CONSUMER_USAGE_VIDEO_ENCODER, 3651 0, 3652 StreamRotation::ROTATION_0}; 3653 streams[0] = stream; 3654 createStreamConfiguration(streams, StreamConfigurationMode::CONSTRAINED_HIGH_SPEED_MODE, 3655 &config3_2, &config3_4, &config3_5); 3656 if (session3_5 != nullptr) { 3657 config3_5.streamConfigCounter = streamConfigCounter++; 3658 ret = session3_5->configureStreams_3_5(config3_5, 3659 [](Status s, device::V3_4::HalStreamConfiguration) { 3660 ASSERT_TRUE((Status::ILLEGAL_ARGUMENT == s) || 3661 (Status::INTERNAL_ERROR == s)); 3662 }); 3663 } else if (session3_4 != nullptr) { 3664 ret = session3_4->configureStreams_3_4(config3_4, 3665 [](Status s, device::V3_4::HalStreamConfiguration) { 3666 ASSERT_TRUE((Status::ILLEGAL_ARGUMENT == s) || 3667 (Status::INTERNAL_ERROR == s)); 3668 }); 3669 } else if (session3_3 != nullptr) { 3670 ret = session3_3->configureStreams_3_3(config3_2, 3671 [](Status s, device::V3_3::HalStreamConfiguration) { 3672 ASSERT_TRUE((Status::ILLEGAL_ARGUMENT == s) || 3673 (Status::INTERNAL_ERROR == s)); 3674 }); 3675 } else { 3676 ret = session->configureStreams(config3_2, 3677 [](Status s, HalStreamConfiguration) { 3678 ASSERT_TRUE((Status::ILLEGAL_ARGUMENT == s) || 3679 (Status::INTERNAL_ERROR == s)); 3680 }); 3681 } 3682 ASSERT_TRUE(ret.isOk()); 3683 3684 stream = {streamId++, 3685 StreamType::OUTPUT, 3686 static_cast<uint32_t>(UINT32_MAX), 3687 static_cast<uint32_t>(UINT32_MAX), 3688 static_cast<PixelFormat>(hfrStream.format), 3689 GRALLOC1_CONSUMER_USAGE_VIDEO_ENCODER, 3690 0, 3691 StreamRotation::ROTATION_0}; 3692 streams[0] = stream; 3693 createStreamConfiguration(streams, StreamConfigurationMode::CONSTRAINED_HIGH_SPEED_MODE, 3694 &config3_2, &config3_4, &config3_5); 3695 if (session3_5 != nullptr) { 3696 config3_5.streamConfigCounter = streamConfigCounter++; 3697 ret = session3_5->configureStreams_3_5(config3_5, 3698 [](Status s, device::V3_4::HalStreamConfiguration) { 3699 ASSERT_EQ(Status::ILLEGAL_ARGUMENT, s); 3700 }); 3701 } else if (session3_4 != nullptr) { 3702 ret = session3_4->configureStreams_3_4(config3_4, 3703 [](Status s, device::V3_4::HalStreamConfiguration) { 3704 ASSERT_EQ(Status::ILLEGAL_ARGUMENT, s); 3705 }); 3706 } else if (session3_3 != nullptr) { 3707 ret = session3_3->configureStreams_3_3(config3_2, 3708 [](Status s, device::V3_3::HalStreamConfiguration) { 3709 ASSERT_EQ(Status::ILLEGAL_ARGUMENT, s); 3710 }); 3711 } else { 3712 ret = session->configureStreams(config3_2, 3713 [](Status s, HalStreamConfiguration) { 3714 ASSERT_EQ(Status::ILLEGAL_ARGUMENT, s); 3715 }); 3716 } 3717 ASSERT_TRUE(ret.isOk()); 3718 3719 stream = {streamId++, 3720 StreamType::OUTPUT, 3721 static_cast<uint32_t>(hfrStream.width), 3722 static_cast<uint32_t>(hfrStream.height), 3723 static_cast<PixelFormat>(UINT32_MAX), 3724 GRALLOC1_CONSUMER_USAGE_VIDEO_ENCODER, 3725 0, 3726 StreamRotation::ROTATION_0}; 3727 streams[0] = stream; 3728 createStreamConfiguration(streams, StreamConfigurationMode::CONSTRAINED_HIGH_SPEED_MODE, 3729 &config3_2, &config3_4, &config3_5); 3730 if (session3_5 != nullptr) { 3731 config3_5.streamConfigCounter = streamConfigCounter++; 3732 ret = session3_5->configureStreams_3_5(config3_5, 3733 [](Status s, device::V3_4::HalStreamConfiguration) { 3734 ASSERT_EQ(Status::ILLEGAL_ARGUMENT, s); 3735 }); 3736 } else if (session3_4 != nullptr) { 3737 ret = session3_4->configureStreams_3_4(config3_4, 3738 [](Status s, device::V3_4::HalStreamConfiguration) { 3739 ASSERT_EQ(Status::ILLEGAL_ARGUMENT, s); 3740 }); 3741 } else if (session3_3 != nullptr) { 3742 ret = session3_3->configureStreams_3_3(config3_2, 3743 [](Status s, device::V3_3::HalStreamConfiguration) { 3744 ASSERT_EQ(Status::ILLEGAL_ARGUMENT, s); 3745 }); 3746 } else { 3747 ret = session->configureStreams(config3_2, 3748 [](Status s, HalStreamConfiguration) { 3749 ASSERT_EQ(Status::ILLEGAL_ARGUMENT, s); 3750 }); 3751 } 3752 ASSERT_TRUE(ret.isOk()); 3753 3754 free_camera_metadata(staticMeta); 3755 ret = session->close(); 3756 ASSERT_TRUE(ret.isOk()); 3757 } 3758 } 3759 3760 // Verify that all supported video + snapshot stream combinations can 3761 // be configured successfully. 3762 TEST_F(CameraHidlTest, configureStreamsVideoStillOutputs) { 3763 hidl_vec<hidl_string> cameraDeviceNames = getCameraDeviceNames(mProvider); 3764 std::vector<AvailableStream> outputBlobStreams; 3765 std::vector<AvailableStream> outputVideoStreams; 3766 AvailableStream videoThreshold = {kMaxVideoWidth, kMaxVideoHeight, 3767 static_cast<int32_t>(PixelFormat::IMPLEMENTATION_DEFINED)}; 3768 AvailableStream blobThreshold = {kMaxVideoWidth, kMaxVideoHeight, 3769 static_cast<int32_t>(PixelFormat::BLOB)}; 3770 3771 for (const auto& name : cameraDeviceNames) { 3772 int deviceVersion = getCameraDeviceVersion(name, mProviderType); 3773 if (deviceVersion == CAMERA_DEVICE_API_VERSION_1_0) { 3774 continue; 3775 } else if (deviceVersion <= 0) { 3776 ALOGE("%s: Unsupported device version %d", __func__, deviceVersion); 3777 ADD_FAILURE(); 3778 return; 3779 } 3780 3781 camera_metadata_t* staticMeta; 3782 Return<void> ret; 3783 sp<ICameraDeviceSession> session; 3784 sp<device::V3_3::ICameraDeviceSession> session3_3; 3785 sp<device::V3_4::ICameraDeviceSession> session3_4; 3786 sp<device::V3_5::ICameraDeviceSession> session3_5; 3787 sp<device::V3_2::ICameraDevice> cameraDevice; 3788 sp<device::V3_5::ICameraDevice> cameraDevice3_5; 3789 openEmptyDeviceSession(name, mProvider, &session /*out*/, &staticMeta /*out*/, 3790 &cameraDevice /*out*/); 3791 castSession(session, deviceVersion, &session3_3, &session3_4, &session3_5); 3792 castDevice(cameraDevice, deviceVersion, &cameraDevice3_5); 3793 3794 // Check if camera support depth only 3795 if (isDepthOnly(staticMeta)) { 3796 free_camera_metadata(staticMeta); 3797 ret = session->close(); 3798 ASSERT_TRUE(ret.isOk()); 3799 continue; 3800 } 3801 3802 outputBlobStreams.clear(); 3803 ASSERT_EQ(Status::OK, 3804 getAvailableOutputStreams(staticMeta, outputBlobStreams, 3805 &blobThreshold)); 3806 ASSERT_NE(0u, outputBlobStreams.size()); 3807 3808 outputVideoStreams.clear(); 3809 ASSERT_EQ(Status::OK, 3810 getAvailableOutputStreams(staticMeta, outputVideoStreams, 3811 &videoThreshold)); 3812 ASSERT_NE(0u, outputVideoStreams.size()); 3813 3814 uint32_t jpegBufferSize = 0; 3815 ASSERT_EQ(Status::OK, getJpegBufferSize(staticMeta, &jpegBufferSize)); 3816 ASSERT_NE(0u, jpegBufferSize); 3817 3818 int32_t streamId = 0; 3819 uint32_t streamConfigCounter = 0; 3820 for (auto& blobIter : outputBlobStreams) { 3821 for (auto& videoIter : outputVideoStreams) { 3822 V3_2::Stream videoStream = {streamId++, 3823 StreamType::OUTPUT, 3824 static_cast<uint32_t>(videoIter.width), 3825 static_cast<uint32_t>(videoIter.height), 3826 static_cast<PixelFormat>(videoIter.format), 3827 GRALLOC1_CONSUMER_USAGE_VIDEO_ENCODER, 3828 0, 3829 StreamRotation::ROTATION_0}; 3830 V3_2::Stream blobStream = {streamId++, 3831 StreamType::OUTPUT, 3832 static_cast<uint32_t>(blobIter.width), 3833 static_cast<uint32_t>(blobIter.height), 3834 static_cast<PixelFormat>(blobIter.format), 3835 GRALLOC1_CONSUMER_USAGE_CPU_READ, 3836 static_cast<V3_2::DataspaceFlags>(Dataspace::V0_JFIF), 3837 StreamRotation::ROTATION_0}; 3838 ::android::hardware::hidl_vec<V3_2::Stream> streams = {videoStream, blobStream}; 3839 ::android::hardware::camera::device::V3_5::StreamConfiguration config3_5; 3840 ::android::hardware::camera::device::V3_4::StreamConfiguration config3_4; 3841 ::android::hardware::camera::device::V3_2::StreamConfiguration config3_2; 3842 createStreamConfiguration(streams, StreamConfigurationMode::NORMAL_MODE, 3843 &config3_2, &config3_4, &config3_5, jpegBufferSize); 3844 if (session3_5 != nullptr) { 3845 verifyStreamCombination(cameraDevice3_5, config3_4, 3846 /*expectedStatus*/ true, /*expectStreamCombQuery*/ false); 3847 config3_5.streamConfigCounter = streamConfigCounter++; 3848 ret = session3_5->configureStreams_3_5(config3_5, 3849 [](Status s, device::V3_4::HalStreamConfiguration halConfig) { 3850 ASSERT_EQ(Status::OK, s); 3851 ASSERT_EQ(2u, halConfig.streams.size()); 3852 }); 3853 } else if (session3_4 != nullptr) { 3854 ret = session3_4->configureStreams_3_4(config3_4, 3855 [](Status s, device::V3_4::HalStreamConfiguration halConfig) { 3856 ASSERT_EQ(Status::OK, s); 3857 ASSERT_EQ(2u, halConfig.streams.size()); 3858 }); 3859 } else if (session3_3 != nullptr) { 3860 ret = session3_3->configureStreams_3_3(config3_2, 3861 [](Status s, device::V3_3::HalStreamConfiguration halConfig) { 3862 ASSERT_EQ(Status::OK, s); 3863 ASSERT_EQ(2u, halConfig.streams.size()); 3864 }); 3865 } else { 3866 ret = session->configureStreams(config3_2, 3867 [](Status s, HalStreamConfiguration halConfig) { 3868 ASSERT_EQ(Status::OK, s); 3869 ASSERT_EQ(2u, halConfig.streams.size()); 3870 }); 3871 } 3872 ASSERT_TRUE(ret.isOk()); 3873 } 3874 } 3875 3876 free_camera_metadata(staticMeta); 3877 ret = session->close(); 3878 ASSERT_TRUE(ret.isOk()); 3879 } 3880 } 3881 3882 // Generate and verify a camera capture request 3883 TEST_F(CameraHidlTest, processCaptureRequestPreview) { 3884 hidl_vec<hidl_string> cameraDeviceNames = getCameraDeviceNames(mProvider); 3885 AvailableStream previewThreshold = {kMaxPreviewWidth, kMaxPreviewHeight, 3886 static_cast<int32_t>(PixelFormat::IMPLEMENTATION_DEFINED)}; 3887 uint64_t bufferId = 1; 3888 uint32_t frameNumber = 1; 3889 ::android::hardware::hidl_vec<uint8_t> settings; 3890 3891 for (const auto& name : cameraDeviceNames) { 3892 int deviceVersion = getCameraDeviceVersion(name, mProviderType); 3893 if (deviceVersion == CAMERA_DEVICE_API_VERSION_1_0) { 3894 continue; 3895 } else if (deviceVersion <= 0) { 3896 ALOGE("%s: Unsupported device version %d", __func__, deviceVersion); 3897 ADD_FAILURE(); 3898 return; 3899 } 3900 3901 V3_2::Stream previewStream; 3902 HalStreamConfiguration halStreamConfig; 3903 sp<ICameraDeviceSession> session; 3904 sp<DeviceCb> cb; 3905 bool supportsPartialResults = false; 3906 bool useHalBufManager = false; 3907 uint32_t partialResultCount = 0; 3908 configurePreviewStream(name, deviceVersion, mProvider, &previewThreshold, &session /*out*/, 3909 &previewStream /*out*/, &halStreamConfig /*out*/, 3910 &supportsPartialResults /*out*/, 3911 &partialResultCount /*out*/, &useHalBufManager /*out*/, &cb /*out*/); 3912 3913 std::shared_ptr<ResultMetadataQueue> resultQueue; 3914 auto resultQueueRet = 3915 session->getCaptureResultMetadataQueue( 3916 [&resultQueue](const auto& descriptor) { 3917 resultQueue = std::make_shared<ResultMetadataQueue>( 3918 descriptor); 3919 if (!resultQueue->isValid() || 3920 resultQueue->availableToWrite() <= 0) { 3921 ALOGE("%s: HAL returns empty result metadata fmq," 3922 " not use it", __func__); 3923 resultQueue = nullptr; 3924 // Don't use the queue onwards. 3925 } 3926 }); 3927 ASSERT_TRUE(resultQueueRet.isOk()); 3928 3929 InFlightRequest inflightReq = {1, false, supportsPartialResults, 3930 partialResultCount, resultQueue}; 3931 3932 RequestTemplate reqTemplate = RequestTemplate::PREVIEW; 3933 Return<void> ret; 3934 ret = session->constructDefaultRequestSettings(reqTemplate, 3935 [&](auto status, const auto& req) { 3936 ASSERT_EQ(Status::OK, status); 3937 settings = req; 3938 }); 3939 ASSERT_TRUE(ret.isOk()); 3940 3941 hidl_handle buffer_handle; 3942 StreamBuffer outputBuffer; 3943 if (useHalBufManager) { 3944 outputBuffer = {halStreamConfig.streams[0].id, 3945 /*bufferId*/ 0, 3946 buffer_handle, 3947 BufferStatus::OK, 3948 nullptr, 3949 nullptr}; 3950 } else { 3951 allocateGraphicBuffer(previewStream.width, previewStream.height, 3952 android_convertGralloc1To0Usage(halStreamConfig.streams[0].producerUsage, 3953 halStreamConfig.streams[0].consumerUsage), 3954 halStreamConfig.streams[0].overrideFormat, &buffer_handle); 3955 outputBuffer = {halStreamConfig.streams[0].id, 3956 bufferId, 3957 buffer_handle, 3958 BufferStatus::OK, 3959 nullptr, 3960 nullptr}; 3961 } 3962 ::android::hardware::hidl_vec<StreamBuffer> outputBuffers = {outputBuffer}; 3963 StreamBuffer emptyInputBuffer = {-1, 0, nullptr, BufferStatus::ERROR, nullptr, 3964 nullptr}; 3965 CaptureRequest request = {frameNumber, 0 /* fmqSettingsSize */, settings, 3966 emptyInputBuffer, outputBuffers}; 3967 3968 { 3969 std::unique_lock<std::mutex> l(mLock); 3970 mInflightMap.clear(); 3971 mInflightMap.add(frameNumber, &inflightReq); 3972 } 3973 3974 Status status = Status::INTERNAL_ERROR; 3975 uint32_t numRequestProcessed = 0; 3976 hidl_vec<BufferCache> cachesToRemove; 3977 Return<void> returnStatus = session->processCaptureRequest( 3978 {request}, cachesToRemove, [&status, &numRequestProcessed](auto s, 3979 uint32_t n) { 3980 status = s; 3981 numRequestProcessed = n; 3982 }); 3983 ASSERT_TRUE(returnStatus.isOk()); 3984 ASSERT_EQ(Status::OK, status); 3985 ASSERT_EQ(numRequestProcessed, 1u); 3986 3987 { 3988 std::unique_lock<std::mutex> l(mLock); 3989 while (!inflightReq.errorCodeValid && 3990 ((0 < inflightReq.numBuffersLeft) || 3991 (!inflightReq.haveResultMetadata))) { 3992 auto timeout = std::chrono::system_clock::now() + 3993 std::chrono::seconds(kStreamBufferTimeoutSec); 3994 ASSERT_NE(std::cv_status::timeout, 3995 mResultCondition.wait_until(l, timeout)); 3996 } 3997 3998 ASSERT_FALSE(inflightReq.errorCodeValid); 3999 ASSERT_NE(inflightReq.resultOutputBuffers.size(), 0u); 4000 ASSERT_EQ(previewStream.id, inflightReq.resultOutputBuffers[0].streamId); 4001 4002 request.frameNumber++; 4003 // Empty settings should be supported after the first call 4004 // for repeating requests. 4005 request.settings.setToExternal(nullptr, 0, true); 4006 // The buffer has been registered to HAL by bufferId, so per 4007 // API contract we should send a null handle for this buffer 4008 request.outputBuffers[0].buffer = nullptr; 4009 mInflightMap.clear(); 4010 inflightReq = {1, false, supportsPartialResults, partialResultCount, 4011 resultQueue}; 4012 mInflightMap.add(request.frameNumber, &inflightReq); 4013 } 4014 4015 returnStatus = session->processCaptureRequest( 4016 {request}, cachesToRemove, [&status, &numRequestProcessed](auto s, 4017 uint32_t n) { 4018 status = s; 4019 numRequestProcessed = n; 4020 }); 4021 ASSERT_TRUE(returnStatus.isOk()); 4022 ASSERT_EQ(Status::OK, status); 4023 ASSERT_EQ(numRequestProcessed, 1u); 4024 4025 { 4026 std::unique_lock<std::mutex> l(mLock); 4027 while (!inflightReq.errorCodeValid && 4028 ((0 < inflightReq.numBuffersLeft) || 4029 (!inflightReq.haveResultMetadata))) { 4030 auto timeout = std::chrono::system_clock::now() + 4031 std::chrono::seconds(kStreamBufferTimeoutSec); 4032 ASSERT_NE(std::cv_status::timeout, 4033 mResultCondition.wait_until(l, timeout)); 4034 } 4035 4036 ASSERT_FALSE(inflightReq.errorCodeValid); 4037 ASSERT_NE(inflightReq.resultOutputBuffers.size(), 0u); 4038 ASSERT_EQ(previewStream.id, inflightReq.resultOutputBuffers[0].streamId); 4039 } 4040 4041 if (useHalBufManager) { 4042 verifyBuffersReturned(session, deviceVersion, previewStream.id, cb); 4043 } 4044 4045 ret = session->close(); 4046 ASSERT_TRUE(ret.isOk()); 4047 } 4048 } 4049 4050 // Generate and verify a multi-camera capture request 4051 TEST_F(CameraHidlTest, processMultiCaptureRequestPreview) { 4052 hidl_vec<hidl_string> cameraDeviceNames = getCameraDeviceNames(mProvider); 4053 AvailableStream previewThreshold = {kMaxPreviewWidth, kMaxPreviewHeight, 4054 static_cast<int32_t>(PixelFormat::YCBCR_420_888)}; 4055 uint64_t bufferId = 1; 4056 uint32_t frameNumber = 1; 4057 ::android::hardware::hidl_vec<uint8_t> settings; 4058 ::android::hardware::hidl_vec<uint8_t> emptySettings; 4059 hidl_string invalidPhysicalId = "-1"; 4060 4061 for (const auto& name : cameraDeviceNames) { 4062 int deviceVersion = getCameraDeviceVersion(name, mProviderType); 4063 if (deviceVersion < CAMERA_DEVICE_API_VERSION_3_5) { 4064 continue; 4065 } 4066 std::string version, deviceId; 4067 ASSERT_TRUE(::matchDeviceName(name, mProviderType, &version, &deviceId)); 4068 camera_metadata_t* staticMeta; 4069 Return<void> ret; 4070 sp<ICameraDeviceSession> session; 4071 openEmptyDeviceSession(name, mProvider, &session /*out*/, &staticMeta /*out*/); 4072 4073 Status rc = isLogicalMultiCamera(staticMeta); 4074 if (Status::METHOD_NOT_SUPPORTED == rc) { 4075 free_camera_metadata(staticMeta); 4076 ret = session->close(); 4077 ASSERT_TRUE(ret.isOk()); 4078 continue; 4079 } 4080 std::unordered_set<std::string> physicalIds; 4081 rc = getPhysicalCameraIds(staticMeta, &physicalIds); 4082 ASSERT_TRUE(Status::OK == rc); 4083 ASSERT_TRUE(physicalIds.size() > 1); 4084 4085 std::unordered_set<int32_t> physicalRequestKeyIDs; 4086 rc = getSupportedKeys(staticMeta, 4087 ANDROID_REQUEST_AVAILABLE_PHYSICAL_CAMERA_REQUEST_KEYS, &physicalRequestKeyIDs); 4088 ASSERT_TRUE(Status::OK == rc); 4089 if (physicalRequestKeyIDs.empty()) { 4090 free_camera_metadata(staticMeta); 4091 ret = session->close(); 4092 ASSERT_TRUE(ret.isOk()); 4093 // The logical camera doesn't support any individual physical requests. 4094 continue; 4095 } 4096 4097 android::hardware::camera::common::V1_0::helper::CameraMetadata defaultPreviewSettings; 4098 android::hardware::camera::common::V1_0::helper::CameraMetadata filteredSettings; 4099 constructFilteredSettings(session, physicalRequestKeyIDs, RequestTemplate::PREVIEW, 4100 &defaultPreviewSettings, &filteredSettings); 4101 if (filteredSettings.isEmpty()) { 4102 // No physical device settings in default request. 4103 free_camera_metadata(staticMeta); 4104 ret = session->close(); 4105 ASSERT_TRUE(ret.isOk()); 4106 continue; 4107 } 4108 4109 const camera_metadata_t *settingsBuffer = defaultPreviewSettings.getAndLock(); 4110 settings.setToExternal( 4111 reinterpret_cast<uint8_t *> (const_cast<camera_metadata_t *> (settingsBuffer)), 4112 get_camera_metadata_size(settingsBuffer)); 4113 4114 free_camera_metadata(staticMeta); 4115 ret = session->close(); 4116 ASSERT_TRUE(ret.isOk()); 4117 4118 // Leave only 2 physical devices in the id set. 4119 auto it = physicalIds.begin(); 4120 string physicalDeviceId = *it; it++; 4121 physicalIds.erase(++it, physicalIds.end()); 4122 ASSERT_EQ(physicalIds.size(), 2u); 4123 4124 V3_4::HalStreamConfiguration halStreamConfig; 4125 bool supportsPartialResults = false; 4126 bool useHalBufManager = false; 4127 uint32_t partialResultCount = 0; 4128 V3_2::Stream previewStream; 4129 sp<device::V3_4::ICameraDeviceSession> session3_4; 4130 sp<device::V3_5::ICameraDeviceSession> session3_5; 4131 sp<DeviceCb> cb; 4132 configurePreviewStreams3_4(name, deviceVersion, mProvider, &previewThreshold, physicalIds, 4133 &session3_4, &session3_5, &previewStream, &halStreamConfig /*out*/, 4134 &supportsPartialResults /*out*/, &partialResultCount /*out*/, 4135 &useHalBufManager /*out*/, &cb /*out*/, 0 /*streamConfigCounter*/, 4136 true /*allowUnsupport*/); 4137 if (session3_5 == nullptr) { 4138 ret = session3_4->close(); 4139 ASSERT_TRUE(ret.isOk()); 4140 continue; 4141 } 4142 4143 std::shared_ptr<ResultMetadataQueue> resultQueue; 4144 auto resultQueueRet = 4145 session3_4->getCaptureResultMetadataQueue( 4146 [&resultQueue](const auto& descriptor) { 4147 resultQueue = std::make_shared<ResultMetadataQueue>( 4148 descriptor); 4149 if (!resultQueue->isValid() || 4150 resultQueue->availableToWrite() <= 0) { 4151 ALOGE("%s: HAL returns empty result metadata fmq," 4152 " not use it", __func__); 4153 resultQueue = nullptr; 4154 // Don't use the queue onwards. 4155 } 4156 }); 4157 ASSERT_TRUE(resultQueueRet.isOk()); 4158 4159 InFlightRequest inflightReq = {static_cast<ssize_t> (halStreamConfig.streams.size()), false, 4160 supportsPartialResults, partialResultCount, resultQueue}; 4161 4162 std::vector<hidl_handle> graphicBuffers; 4163 graphicBuffers.reserve(halStreamConfig.streams.size()); 4164 ::android::hardware::hidl_vec<StreamBuffer> outputBuffers; 4165 outputBuffers.resize(halStreamConfig.streams.size()); 4166 size_t k = 0; 4167 for (const auto& halStream : halStreamConfig.streams) { 4168 hidl_handle buffer_handle; 4169 if (useHalBufManager) { 4170 outputBuffers[k] = {halStream.v3_3.v3_2.id, /*bufferId*/0, buffer_handle, 4171 BufferStatus::OK, nullptr, nullptr}; 4172 } else { 4173 allocateGraphicBuffer(previewStream.width, previewStream.height, 4174 android_convertGralloc1To0Usage(halStream.v3_3.v3_2.producerUsage, 4175 halStream.v3_3.v3_2.consumerUsage), 4176 halStream.v3_3.v3_2.overrideFormat, &buffer_handle); 4177 graphicBuffers.push_back(buffer_handle); 4178 outputBuffers[k] = {halStream.v3_3.v3_2.id, bufferId, buffer_handle, 4179 BufferStatus::OK, nullptr, nullptr}; 4180 bufferId++; 4181 } 4182 k++; 4183 } 4184 hidl_vec<V3_4::PhysicalCameraSetting> camSettings(1); 4185 const camera_metadata_t *filteredSettingsBuffer = filteredSettings.getAndLock(); 4186 camSettings[0].settings.setToExternal( 4187 reinterpret_cast<uint8_t *> (const_cast<camera_metadata_t *> ( 4188 filteredSettingsBuffer)), 4189 get_camera_metadata_size(filteredSettingsBuffer)); 4190 camSettings[0].fmqSettingsSize = 0; 4191 camSettings[0].physicalCameraId = physicalDeviceId; 4192 4193 StreamBuffer emptyInputBuffer = {-1, 0, nullptr, BufferStatus::ERROR, nullptr, nullptr}; 4194 V3_4::CaptureRequest request = {{frameNumber, 0 /* fmqSettingsSize */, settings, 4195 emptyInputBuffer, outputBuffers}, camSettings}; 4196 4197 { 4198 std::unique_lock<std::mutex> l(mLock); 4199 mInflightMap.clear(); 4200 mInflightMap.add(frameNumber, &inflightReq); 4201 } 4202 4203 Status stat = Status::INTERNAL_ERROR; 4204 uint32_t numRequestProcessed = 0; 4205 hidl_vec<BufferCache> cachesToRemove; 4206 Return<void> returnStatus = session3_4->processCaptureRequest_3_4( 4207 {request}, cachesToRemove, [&stat, &numRequestProcessed](auto s, uint32_t n) { 4208 stat = s; 4209 numRequestProcessed = n; 4210 }); 4211 ASSERT_TRUE(returnStatus.isOk()); 4212 ASSERT_EQ(Status::OK, stat); 4213 ASSERT_EQ(numRequestProcessed, 1u); 4214 4215 { 4216 std::unique_lock<std::mutex> l(mLock); 4217 while (!inflightReq.errorCodeValid && 4218 ((0 < inflightReq.numBuffersLeft) || 4219 (!inflightReq.haveResultMetadata))) { 4220 auto timeout = std::chrono::system_clock::now() + 4221 std::chrono::seconds(kStreamBufferTimeoutSec); 4222 ASSERT_NE(std::cv_status::timeout, 4223 mResultCondition.wait_until(l, timeout)); 4224 } 4225 4226 ASSERT_FALSE(inflightReq.errorCodeValid); 4227 ASSERT_NE(inflightReq.resultOutputBuffers.size(), 0u); 4228 4229 request.v3_2.frameNumber++; 4230 // Empty settings should be supported after the first call 4231 // for repeating requests. 4232 request.v3_2.settings.setToExternal(nullptr, 0, true); 4233 request.physicalCameraSettings[0].settings.setToExternal(nullptr, 0, true); 4234 // The buffer has been registered to HAL by bufferId, so per 4235 // API contract we should send a null handle for this buffer 4236 request.v3_2.outputBuffers[0].buffer = nullptr; 4237 mInflightMap.clear(); 4238 inflightReq = {static_cast<ssize_t> (physicalIds.size()), false, 4239 supportsPartialResults, partialResultCount, resultQueue}; 4240 mInflightMap.add(request.v3_2.frameNumber, &inflightReq); 4241 } 4242 4243 returnStatus = session3_4->processCaptureRequest_3_4( 4244 {request}, cachesToRemove, [&stat, &numRequestProcessed](auto s, uint32_t n) { 4245 stat = s; 4246 numRequestProcessed = n; 4247 }); 4248 ASSERT_TRUE(returnStatus.isOk()); 4249 ASSERT_EQ(Status::OK, stat); 4250 ASSERT_EQ(numRequestProcessed, 1u); 4251 4252 { 4253 std::unique_lock<std::mutex> l(mLock); 4254 while (!inflightReq.errorCodeValid && 4255 ((0 < inflightReq.numBuffersLeft) || 4256 (!inflightReq.haveResultMetadata))) { 4257 auto timeout = std::chrono::system_clock::now() + 4258 std::chrono::seconds(kStreamBufferTimeoutSec); 4259 ASSERT_NE(std::cv_status::timeout, 4260 mResultCondition.wait_until(l, timeout)); 4261 } 4262 4263 ASSERT_FALSE(inflightReq.errorCodeValid); 4264 ASSERT_NE(inflightReq.resultOutputBuffers.size(), 0u); 4265 } 4266 4267 // Invalid physical camera id should fail process requests 4268 frameNumber++; 4269 camSettings[0].physicalCameraId = invalidPhysicalId; 4270 camSettings[0].settings = settings; 4271 request = {{frameNumber, 0 /* fmqSettingsSize */, settings, 4272 emptyInputBuffer, outputBuffers}, camSettings}; 4273 returnStatus = session3_4->processCaptureRequest_3_4( 4274 {request}, cachesToRemove, [&stat, &numRequestProcessed](auto s, uint32_t n) { 4275 stat = s; 4276 numRequestProcessed = n; 4277 }); 4278 ASSERT_TRUE(returnStatus.isOk()); 4279 ASSERT_EQ(Status::ILLEGAL_ARGUMENT, stat); 4280 4281 defaultPreviewSettings.unlock(settingsBuffer); 4282 filteredSettings.unlock(filteredSettingsBuffer); 4283 4284 if (useHalBufManager) { 4285 hidl_vec<int32_t> streamIds(halStreamConfig.streams.size()); 4286 for (size_t i = 0; i < streamIds.size(); i++) { 4287 streamIds[i] = halStreamConfig.streams[i].v3_3.v3_2.id; 4288 } 4289 verifyBuffersReturned(session3_4, streamIds, cb); 4290 } 4291 4292 ret = session3_4->close(); 4293 ASSERT_TRUE(ret.isOk()); 4294 } 4295 } 4296 4297 // Generate and verify a burst containing alternating sensor sensitivity values 4298 TEST_F(CameraHidlTest, processCaptureRequestBurstISO) { 4299 hidl_vec<hidl_string> cameraDeviceNames = getCameraDeviceNames(mProvider); 4300 AvailableStream previewThreshold = {kMaxPreviewWidth, kMaxPreviewHeight, 4301 static_cast<int32_t>(PixelFormat::IMPLEMENTATION_DEFINED)}; 4302 uint64_t bufferId = 1; 4303 uint32_t frameNumber = 1; 4304 float isoTol = .03f; 4305 ::android::hardware::hidl_vec<uint8_t> settings; 4306 4307 for (const auto& name : cameraDeviceNames) { 4308 int deviceVersion = getCameraDeviceVersion(name, mProviderType); 4309 if (deviceVersion == CAMERA_DEVICE_API_VERSION_1_0) { 4310 continue; 4311 } else if (deviceVersion <= 0) { 4312 ALOGE("%s: Unsupported device version %d", __func__, deviceVersion); 4313 ADD_FAILURE(); 4314 return; 4315 } 4316 camera_metadata_t* staticMetaBuffer; 4317 Return<void> ret; 4318 sp<ICameraDeviceSession> session; 4319 openEmptyDeviceSession(name, mProvider, &session /*out*/, &staticMetaBuffer /*out*/); 4320 ::android::hardware::camera::common::V1_0::helper::CameraMetadata staticMeta( 4321 staticMetaBuffer); 4322 4323 camera_metadata_entry_t hwLevel = staticMeta.find(ANDROID_INFO_SUPPORTED_HARDWARE_LEVEL); 4324 ASSERT_TRUE(0 < hwLevel.count); 4325 if (ANDROID_INFO_SUPPORTED_HARDWARE_LEVEL_LIMITED == hwLevel.data.u8[0] || 4326 ANDROID_INFO_SUPPORTED_HARDWARE_LEVEL_EXTERNAL == hwLevel.data.u8[0]) { 4327 //Limited/External devices can skip this test 4328 ret = session->close(); 4329 ASSERT_TRUE(ret.isOk()); 4330 continue; 4331 } 4332 4333 camera_metadata_entry_t isoRange = staticMeta.find(ANDROID_SENSOR_INFO_SENSITIVITY_RANGE); 4334 ASSERT_EQ(isoRange.count, 2u); 4335 4336 ret = session->close(); 4337 ASSERT_TRUE(ret.isOk()); 4338 4339 bool supportsPartialResults = false; 4340 bool useHalBufManager = false; 4341 uint32_t partialResultCount = 0; 4342 V3_2::Stream previewStream; 4343 HalStreamConfiguration halStreamConfig; 4344 sp<DeviceCb> cb; 4345 configurePreviewStream(name, deviceVersion, mProvider, &previewThreshold, 4346 &session /*out*/, &previewStream /*out*/, &halStreamConfig /*out*/, 4347 &supportsPartialResults /*out*/, &partialResultCount /*out*/, 4348 &useHalBufManager /*out*/, &cb /*out*/); 4349 std::shared_ptr<ResultMetadataQueue> resultQueue; 4350 4351 auto resultQueueRet = session->getCaptureResultMetadataQueue( 4352 [&resultQueue](const auto& descriptor) { 4353 resultQueue = std::make_shared<ResultMetadataQueue>(descriptor); 4354 if (!resultQueue->isValid() || resultQueue->availableToWrite() <= 0) { 4355 ALOGE("%s: HAL returns empty result metadata fmq," 4356 " not use it", __func__); 4357 resultQueue = nullptr; 4358 // Don't use the queue onwards. 4359 } 4360 }); 4361 ASSERT_TRUE(resultQueueRet.isOk()); 4362 ASSERT_NE(nullptr, resultQueue); 4363 4364 ret = session->constructDefaultRequestSettings(RequestTemplate::PREVIEW, 4365 [&](auto status, const auto& req) { 4366 ASSERT_EQ(Status::OK, status); 4367 settings = req; }); 4368 ASSERT_TRUE(ret.isOk()); 4369 4370 ::android::hardware::camera::common::V1_0::helper::CameraMetadata requestMeta; 4371 StreamBuffer emptyInputBuffer = {-1, 0, nullptr, BufferStatus::ERROR, nullptr, nullptr}; 4372 hidl_handle buffers[kBurstFrameCount]; 4373 StreamBuffer outputBuffers[kBurstFrameCount]; 4374 CaptureRequest requests[kBurstFrameCount]; 4375 InFlightRequest inflightReqs[kBurstFrameCount]; 4376 int32_t isoValues[kBurstFrameCount]; 4377 hidl_vec<uint8_t> requestSettings[kBurstFrameCount]; 4378 for (uint32_t i = 0; i < kBurstFrameCount; i++) { 4379 std::unique_lock<std::mutex> l(mLock); 4380 4381 isoValues[i] = ((i % 2) == 0) ? isoRange.data.i32[0] : isoRange.data.i32[1]; 4382 if (useHalBufManager) { 4383 outputBuffers[i] = {halStreamConfig.streams[0].id, /*bufferId*/0, 4384 nullptr, BufferStatus::OK, nullptr, nullptr}; 4385 } else { 4386 allocateGraphicBuffer(previewStream.width, previewStream.height, 4387 android_convertGralloc1To0Usage(halStreamConfig.streams[0].producerUsage, 4388 halStreamConfig.streams[0].consumerUsage), 4389 halStreamConfig.streams[0].overrideFormat, &buffers[i]); 4390 outputBuffers[i] = {halStreamConfig.streams[0].id, bufferId + i, 4391 buffers[i], BufferStatus::OK, nullptr, nullptr}; 4392 } 4393 4394 requestMeta.append(reinterpret_cast<camera_metadata_t *> (settings.data())); 4395 4396 // Disable all 3A routines 4397 uint8_t mode = static_cast<uint8_t>(ANDROID_CONTROL_MODE_OFF); 4398 ASSERT_EQ(::android::OK, requestMeta.update(ANDROID_CONTROL_MODE, &mode, 1)); 4399 ASSERT_EQ(::android::OK, requestMeta.update(ANDROID_SENSOR_SENSITIVITY, &isoValues[i], 4400 1)); 4401 camera_metadata_t *metaBuffer = requestMeta.release(); 4402 requestSettings[i].setToExternal(reinterpret_cast<uint8_t *> (metaBuffer), 4403 get_camera_metadata_size(metaBuffer), true); 4404 4405 requests[i] = {frameNumber + i, 0 /* fmqSettingsSize */, requestSettings[i], 4406 emptyInputBuffer, {outputBuffers[i]}}; 4407 4408 inflightReqs[i] = {1, false, supportsPartialResults, partialResultCount, resultQueue}; 4409 mInflightMap.add(frameNumber + i, &inflightReqs[i]); 4410 } 4411 4412 Status status = Status::INTERNAL_ERROR; 4413 uint32_t numRequestProcessed = 0; 4414 hidl_vec<BufferCache> cachesToRemove; 4415 hidl_vec<CaptureRequest> burstRequest; 4416 burstRequest.setToExternal(requests, kBurstFrameCount); 4417 Return<void> returnStatus = session->processCaptureRequest(burstRequest, cachesToRemove, 4418 [&status, &numRequestProcessed] (auto s, uint32_t n) { 4419 status = s; 4420 numRequestProcessed = n; 4421 }); 4422 ASSERT_TRUE(returnStatus.isOk()); 4423 ASSERT_EQ(Status::OK, status); 4424 ASSERT_EQ(numRequestProcessed, kBurstFrameCount); 4425 4426 for (size_t i = 0; i < kBurstFrameCount; i++) { 4427 std::unique_lock<std::mutex> l(mLock); 4428 while (!inflightReqs[i].errorCodeValid && ((0 < inflightReqs[i].numBuffersLeft) || 4429 (!inflightReqs[i].haveResultMetadata))) { 4430 auto timeout = std::chrono::system_clock::now() + 4431 std::chrono::seconds(kStreamBufferTimeoutSec); 4432 ASSERT_NE(std::cv_status::timeout, mResultCondition.wait_until(l, timeout)); 4433 } 4434 4435 ASSERT_FALSE(inflightReqs[i].errorCodeValid); 4436 ASSERT_NE(inflightReqs[i].resultOutputBuffers.size(), 0u); 4437 ASSERT_EQ(previewStream.id, inflightReqs[i].resultOutputBuffers[0].streamId); 4438 ASSERT_FALSE(inflightReqs[i].collectedResult.isEmpty()); 4439 ASSERT_TRUE(inflightReqs[i].collectedResult.exists(ANDROID_SENSOR_SENSITIVITY)); 4440 camera_metadata_entry_t isoResult = inflightReqs[i].collectedResult.find( 4441 ANDROID_SENSOR_SENSITIVITY); 4442 ASSERT_TRUE(std::abs(isoResult.data.i32[0] - isoValues[i]) <= 4443 std::round(isoValues[i]*isoTol)); 4444 } 4445 4446 if (useHalBufManager) { 4447 verifyBuffersReturned(session, deviceVersion, previewStream.id, cb); 4448 } 4449 ret = session->close(); 4450 ASSERT_TRUE(ret.isOk()); 4451 } 4452 } 4453 4454 // Test whether an incorrect capture request with missing settings will 4455 // be reported correctly. 4456 TEST_F(CameraHidlTest, processCaptureRequestInvalidSinglePreview) { 4457 hidl_vec<hidl_string> cameraDeviceNames = getCameraDeviceNames(mProvider); 4458 std::vector<AvailableStream> outputPreviewStreams; 4459 AvailableStream previewThreshold = {kMaxPreviewWidth, kMaxPreviewHeight, 4460 static_cast<int32_t>(PixelFormat::IMPLEMENTATION_DEFINED)}; 4461 uint64_t bufferId = 1; 4462 uint32_t frameNumber = 1; 4463 ::android::hardware::hidl_vec<uint8_t> settings; 4464 4465 for (const auto& name : cameraDeviceNames) { 4466 int deviceVersion = getCameraDeviceVersion(name, mProviderType); 4467 if (deviceVersion == CAMERA_DEVICE_API_VERSION_1_0) { 4468 continue; 4469 } else if (deviceVersion <= 0) { 4470 ALOGE("%s: Unsupported device version %d", __func__, deviceVersion); 4471 ADD_FAILURE(); 4472 return; 4473 } 4474 4475 V3_2::Stream previewStream; 4476 HalStreamConfiguration halStreamConfig; 4477 sp<ICameraDeviceSession> session; 4478 sp<DeviceCb> cb; 4479 bool supportsPartialResults = false; 4480 bool useHalBufManager = false; 4481 uint32_t partialResultCount = 0; 4482 configurePreviewStream(name, deviceVersion, mProvider, &previewThreshold, &session /*out*/, 4483 &previewStream /*out*/, &halStreamConfig /*out*/, 4484 &supportsPartialResults /*out*/, 4485 &partialResultCount /*out*/, &useHalBufManager /*out*/, &cb /*out*/); 4486 4487 hidl_handle buffer_handle; 4488 4489 if (useHalBufManager) { 4490 bufferId = 0; 4491 } else { 4492 allocateGraphicBuffer(previewStream.width, previewStream.height, 4493 android_convertGralloc1To0Usage(halStreamConfig.streams[0].producerUsage, 4494 halStreamConfig.streams[0].consumerUsage), 4495 halStreamConfig.streams[0].overrideFormat, &buffer_handle); 4496 } 4497 4498 StreamBuffer outputBuffer = {halStreamConfig.streams[0].id, 4499 bufferId, 4500 buffer_handle, 4501 BufferStatus::OK, 4502 nullptr, 4503 nullptr}; 4504 ::android::hardware::hidl_vec<StreamBuffer> outputBuffers = {outputBuffer}; 4505 StreamBuffer emptyInputBuffer = {-1, 0, nullptr, BufferStatus::ERROR, nullptr, 4506 nullptr}; 4507 CaptureRequest request = {frameNumber, 0 /* fmqSettingsSize */, settings, 4508 emptyInputBuffer, outputBuffers}; 4509 4510 // Settings were not correctly initialized, we should fail here 4511 Status status = Status::OK; 4512 uint32_t numRequestProcessed = 0; 4513 hidl_vec<BufferCache> cachesToRemove; 4514 Return<void> ret = session->processCaptureRequest( 4515 {request}, cachesToRemove, [&status, &numRequestProcessed](auto s, 4516 uint32_t n) { 4517 status = s; 4518 numRequestProcessed = n; 4519 }); 4520 ASSERT_TRUE(ret.isOk()); 4521 ASSERT_EQ(Status::ILLEGAL_ARGUMENT, status); 4522 ASSERT_EQ(numRequestProcessed, 0u); 4523 4524 ret = session->close(); 4525 ASSERT_TRUE(ret.isOk()); 4526 } 4527 } 4528 4529 // Check whether an invalid capture request with missing output buffers 4530 // will be reported correctly. 4531 TEST_F(CameraHidlTest, processCaptureRequestInvalidBuffer) { 4532 hidl_vec<hidl_string> cameraDeviceNames = getCameraDeviceNames(mProvider); 4533 std::vector<AvailableStream> outputBlobStreams; 4534 AvailableStream previewThreshold = {kMaxPreviewWidth, kMaxPreviewHeight, 4535 static_cast<int32_t>(PixelFormat::IMPLEMENTATION_DEFINED)}; 4536 uint32_t frameNumber = 1; 4537 ::android::hardware::hidl_vec<uint8_t> settings; 4538 4539 for (const auto& name : cameraDeviceNames) { 4540 int deviceVersion = getCameraDeviceVersion(name, mProviderType); 4541 if (deviceVersion == CAMERA_DEVICE_API_VERSION_1_0) { 4542 continue; 4543 } else if (deviceVersion <= 0) { 4544 ALOGE("%s: Unsupported device version %d", __func__, deviceVersion); 4545 ADD_FAILURE(); 4546 return; 4547 } 4548 4549 V3_2::Stream previewStream; 4550 HalStreamConfiguration halStreamConfig; 4551 sp<ICameraDeviceSession> session; 4552 sp<DeviceCb> cb; 4553 bool supportsPartialResults = false; 4554 bool useHalBufManager = false; 4555 uint32_t partialResultCount = 0; 4556 configurePreviewStream(name, deviceVersion, mProvider, &previewThreshold, &session /*out*/, 4557 &previewStream /*out*/, &halStreamConfig /*out*/, 4558 &supportsPartialResults /*out*/, 4559 &partialResultCount /*out*/, &useHalBufManager /*out*/, &cb /*out*/); 4560 4561 RequestTemplate reqTemplate = RequestTemplate::PREVIEW; 4562 Return<void> ret; 4563 ret = session->constructDefaultRequestSettings(reqTemplate, 4564 [&](auto status, const auto& req) { 4565 ASSERT_EQ(Status::OK, status); 4566 settings = req; 4567 }); 4568 ASSERT_TRUE(ret.isOk()); 4569 4570 ::android::hardware::hidl_vec<StreamBuffer> emptyOutputBuffers; 4571 StreamBuffer emptyInputBuffer = {-1, 0, nullptr, BufferStatus::ERROR, nullptr, 4572 nullptr}; 4573 CaptureRequest request = {frameNumber, 0 /* fmqSettingsSize */, settings, 4574 emptyInputBuffer, emptyOutputBuffers}; 4575 4576 // Output buffers are missing, we should fail here 4577 Status status = Status::OK; 4578 uint32_t numRequestProcessed = 0; 4579 hidl_vec<BufferCache> cachesToRemove; 4580 ret = session->processCaptureRequest( 4581 {request}, cachesToRemove, [&status, &numRequestProcessed](auto s, 4582 uint32_t n) { 4583 status = s; 4584 numRequestProcessed = n; 4585 }); 4586 ASSERT_TRUE(ret.isOk()); 4587 ASSERT_EQ(Status::ILLEGAL_ARGUMENT, status); 4588 ASSERT_EQ(numRequestProcessed, 0u); 4589 4590 ret = session->close(); 4591 ASSERT_TRUE(ret.isOk()); 4592 } 4593 } 4594 4595 // Generate, trigger and flush a preview request 4596 TEST_F(CameraHidlTest, flushPreviewRequest) { 4597 hidl_vec<hidl_string> cameraDeviceNames = getCameraDeviceNames(mProvider); 4598 std::vector<AvailableStream> outputPreviewStreams; 4599 AvailableStream previewThreshold = {kMaxPreviewWidth, kMaxPreviewHeight, 4600 static_cast<int32_t>(PixelFormat::IMPLEMENTATION_DEFINED)}; 4601 uint64_t bufferId = 1; 4602 uint32_t frameNumber = 1; 4603 ::android::hardware::hidl_vec<uint8_t> settings; 4604 4605 for (const auto& name : cameraDeviceNames) { 4606 int deviceVersion = getCameraDeviceVersion(name, mProviderType); 4607 if (deviceVersion == CAMERA_DEVICE_API_VERSION_1_0) { 4608 continue; 4609 } else if (deviceVersion <= 0) { 4610 ALOGE("%s: Unsupported device version %d", __func__, deviceVersion); 4611 ADD_FAILURE(); 4612 return; 4613 } 4614 4615 V3_2::Stream previewStream; 4616 HalStreamConfiguration halStreamConfig; 4617 sp<ICameraDeviceSession> session; 4618 sp<DeviceCb> cb; 4619 bool supportsPartialResults = false; 4620 bool useHalBufManager = false; 4621 uint32_t partialResultCount = 0; 4622 configurePreviewStream(name, deviceVersion, mProvider, &previewThreshold, &session /*out*/, 4623 &previewStream /*out*/, &halStreamConfig /*out*/, 4624 &supportsPartialResults /*out*/, 4625 &partialResultCount /*out*/, &useHalBufManager /*out*/, &cb /*out*/); 4626 4627 std::shared_ptr<ResultMetadataQueue> resultQueue; 4628 auto resultQueueRet = 4629 session->getCaptureResultMetadataQueue( 4630 [&resultQueue](const auto& descriptor) { 4631 resultQueue = std::make_shared<ResultMetadataQueue>( 4632 descriptor); 4633 if (!resultQueue->isValid() || 4634 resultQueue->availableToWrite() <= 0) { 4635 ALOGE("%s: HAL returns empty result metadata fmq," 4636 " not use it", __func__); 4637 resultQueue = nullptr; 4638 // Don't use the queue onwards. 4639 } 4640 }); 4641 ASSERT_TRUE(resultQueueRet.isOk()); 4642 4643 InFlightRequest inflightReq = {1, false, supportsPartialResults, 4644 partialResultCount, resultQueue}; 4645 RequestTemplate reqTemplate = RequestTemplate::PREVIEW; 4646 Return<void> ret; 4647 ret = session->constructDefaultRequestSettings(reqTemplate, 4648 [&](auto status, const auto& req) { 4649 ASSERT_EQ(Status::OK, status); 4650 settings = req; 4651 }); 4652 ASSERT_TRUE(ret.isOk()); 4653 4654 hidl_handle buffer_handle; 4655 if (useHalBufManager) { 4656 bufferId = 0; 4657 } else { 4658 allocateGraphicBuffer(previewStream.width, previewStream.height, 4659 android_convertGralloc1To0Usage(halStreamConfig.streams[0].producerUsage, 4660 halStreamConfig.streams[0].consumerUsage), 4661 halStreamConfig.streams[0].overrideFormat, &buffer_handle); 4662 } 4663 4664 StreamBuffer outputBuffer = {halStreamConfig.streams[0].id, 4665 bufferId, 4666 buffer_handle, 4667 BufferStatus::OK, 4668 nullptr, 4669 nullptr}; 4670 ::android::hardware::hidl_vec<StreamBuffer> outputBuffers = {outputBuffer}; 4671 const StreamBuffer emptyInputBuffer = {-1, 0, nullptr, 4672 BufferStatus::ERROR, nullptr, nullptr}; 4673 CaptureRequest request = {frameNumber, 0 /* fmqSettingsSize */, settings, 4674 emptyInputBuffer, outputBuffers}; 4675 4676 { 4677 std::unique_lock<std::mutex> l(mLock); 4678 mInflightMap.clear(); 4679 mInflightMap.add(frameNumber, &inflightReq); 4680 } 4681 4682 Status status = Status::INTERNAL_ERROR; 4683 uint32_t numRequestProcessed = 0; 4684 hidl_vec<BufferCache> cachesToRemove; 4685 ret = session->processCaptureRequest( 4686 {request}, cachesToRemove, [&status, &numRequestProcessed](auto s, 4687 uint32_t n) { 4688 status = s; 4689 numRequestProcessed = n; 4690 }); 4691 4692 ASSERT_TRUE(ret.isOk()); 4693 ASSERT_EQ(Status::OK, status); 4694 ASSERT_EQ(numRequestProcessed, 1u); 4695 // Flush before waiting for request to complete. 4696 Return<Status> returnStatus = session->flush(); 4697 ASSERT_TRUE(returnStatus.isOk()); 4698 ASSERT_EQ(Status::OK, returnStatus); 4699 4700 { 4701 std::unique_lock<std::mutex> l(mLock); 4702 while (!inflightReq.errorCodeValid && 4703 ((0 < inflightReq.numBuffersLeft) || 4704 (!inflightReq.haveResultMetadata))) { 4705 auto timeout = std::chrono::system_clock::now() + 4706 std::chrono::seconds(kStreamBufferTimeoutSec); 4707 ASSERT_NE(std::cv_status::timeout, mResultCondition.wait_until(l, 4708 timeout)); 4709 } 4710 4711 if (!inflightReq.errorCodeValid) { 4712 ASSERT_NE(inflightReq.resultOutputBuffers.size(), 0u); 4713 ASSERT_EQ(previewStream.id, inflightReq.resultOutputBuffers[0].streamId); 4714 } else { 4715 switch (inflightReq.errorCode) { 4716 case ErrorCode::ERROR_REQUEST: 4717 case ErrorCode::ERROR_RESULT: 4718 case ErrorCode::ERROR_BUFFER: 4719 // Expected 4720 break; 4721 case ErrorCode::ERROR_DEVICE: 4722 default: 4723 FAIL() << "Unexpected error:" 4724 << static_cast<uint32_t>(inflightReq.errorCode); 4725 } 4726 } 4727 } 4728 4729 if (useHalBufManager) { 4730 verifyBuffersReturned(session, deviceVersion, previewStream.id, cb); 4731 } 4732 4733 ret = session->close(); 4734 ASSERT_TRUE(ret.isOk()); 4735 } 4736 } 4737 4738 // Verify that camera flushes correctly without any pending requests. 4739 TEST_F(CameraHidlTest, flushEmpty) { 4740 hidl_vec<hidl_string> cameraDeviceNames = getCameraDeviceNames(mProvider); 4741 std::vector<AvailableStream> outputPreviewStreams; 4742 AvailableStream previewThreshold = {kMaxPreviewWidth, kMaxPreviewHeight, 4743 static_cast<int32_t>(PixelFormat::IMPLEMENTATION_DEFINED)}; 4744 4745 for (const auto& name : cameraDeviceNames) { 4746 int deviceVersion = getCameraDeviceVersion(name, mProviderType); 4747 if (deviceVersion == CAMERA_DEVICE_API_VERSION_1_0) { 4748 continue; 4749 } else if (deviceVersion <= 0) { 4750 ALOGE("%s: Unsupported device version %d", __func__, deviceVersion); 4751 ADD_FAILURE(); 4752 return; 4753 } 4754 4755 V3_2::Stream previewStream; 4756 HalStreamConfiguration halStreamConfig; 4757 sp<ICameraDeviceSession> session; 4758 sp<DeviceCb> cb; 4759 bool supportsPartialResults = false; 4760 bool useHalBufManager = false; 4761 uint32_t partialResultCount = 0; 4762 configurePreviewStream(name, deviceVersion, mProvider, &previewThreshold, &session /*out*/, 4763 &previewStream /*out*/, &halStreamConfig /*out*/, 4764 &supportsPartialResults /*out*/, 4765 &partialResultCount /*out*/, &useHalBufManager /*out*/, &cb /*out*/); 4766 4767 Return<Status> returnStatus = session->flush(); 4768 ASSERT_TRUE(returnStatus.isOk()); 4769 ASSERT_EQ(Status::OK, returnStatus); 4770 4771 { 4772 std::unique_lock<std::mutex> l(mLock); 4773 auto timeout = std::chrono::system_clock::now() + 4774 std::chrono::milliseconds(kEmptyFlushTimeoutMSec); 4775 ASSERT_EQ(std::cv_status::timeout, mResultCondition.wait_until(l, timeout)); 4776 } 4777 4778 Return<void> ret = session->close(); 4779 ASSERT_TRUE(ret.isOk()); 4780 } 4781 } 4782 4783 // Test camera provider (at) 2.5 notify method 4784 TEST_F(CameraHidlTest, providerDeviceStateNotification) { 4785 4786 notifyDeviceState(provider::V2_5::DeviceState::BACK_COVERED); 4787 notifyDeviceState(provider::V2_5::DeviceState::NORMAL); 4788 } 4789 4790 // Retrieve all valid output stream resolutions from the camera 4791 // static characteristics. 4792 Status CameraHidlTest::getAvailableOutputStreams(camera_metadata_t *staticMeta, 4793 std::vector<AvailableStream> &outputStreams, 4794 const AvailableStream *threshold) { 4795 AvailableStream depthPreviewThreshold = {kMaxPreviewWidth, kMaxPreviewHeight, 4796 static_cast<int32_t>(PixelFormat::Y16)}; 4797 if (nullptr == staticMeta) { 4798 return Status::ILLEGAL_ARGUMENT; 4799 } 4800 4801 camera_metadata_ro_entry scalarEntry; 4802 camera_metadata_ro_entry depthEntry; 4803 int foundScalar = find_camera_metadata_ro_entry(staticMeta, 4804 ANDROID_SCALER_AVAILABLE_STREAM_CONFIGURATIONS, &scalarEntry); 4805 int foundDepth = find_camera_metadata_ro_entry(staticMeta, 4806 ANDROID_DEPTH_AVAILABLE_DEPTH_STREAM_CONFIGURATIONS, &depthEntry); 4807 if ((0 != foundScalar || (0 != (scalarEntry.count % 4))) && 4808 (0 != foundDepth || (0 != (depthEntry.count % 4)))) { 4809 return Status::ILLEGAL_ARGUMENT; 4810 } 4811 4812 if(foundScalar == 0 && (0 == (scalarEntry.count % 4))) { 4813 fillOutputStreams(&scalarEntry, outputStreams, threshold, 4814 ANDROID_SCALER_AVAILABLE_STREAM_CONFIGURATIONS_OUTPUT); 4815 } 4816 4817 if(foundDepth == 0 && (0 == (depthEntry.count % 4))) { 4818 fillOutputStreams(&depthEntry, outputStreams, &depthPreviewThreshold, 4819 ANDROID_DEPTH_AVAILABLE_DEPTH_STREAM_CONFIGURATIONS_OUTPUT); 4820 } 4821 4822 return Status::OK; 4823 } 4824 4825 void CameraHidlTest::fillOutputStreams(camera_metadata_ro_entry_t* entry, 4826 std::vector<AvailableStream>& outputStreams, const AvailableStream* threshold, 4827 const int32_t availableConfigOutputTag) { 4828 for (size_t i = 0; i < entry->count; i+=4) { 4829 if (availableConfigOutputTag == entry->data.i32[i + 3]) { 4830 if(nullptr == threshold) { 4831 AvailableStream s = {entry->data.i32[i+1], 4832 entry->data.i32[i+2], entry->data.i32[i]}; 4833 outputStreams.push_back(s); 4834 } else { 4835 if ((threshold->format == entry->data.i32[i]) && 4836 (threshold->width >= entry->data.i32[i+1]) && 4837 (threshold->height >= entry->data.i32[i+2])) { 4838 AvailableStream s = {entry->data.i32[i+1], 4839 entry->data.i32[i+2], threshold->format}; 4840 outputStreams.push_back(s); 4841 } 4842 } 4843 } 4844 } 4845 } 4846 4847 // Get max jpeg buffer size in android.jpeg.maxSize 4848 Status CameraHidlTest::getJpegBufferSize(camera_metadata_t *staticMeta, uint32_t* outBufSize) { 4849 if (nullptr == staticMeta || nullptr == outBufSize) { 4850 return Status::ILLEGAL_ARGUMENT; 4851 } 4852 4853 camera_metadata_ro_entry entry; 4854 int rc = find_camera_metadata_ro_entry(staticMeta, 4855 ANDROID_JPEG_MAX_SIZE, &entry); 4856 if ((0 != rc) || (1 != entry.count)) { 4857 return Status::ILLEGAL_ARGUMENT; 4858 } 4859 4860 *outBufSize = static_cast<uint32_t>(entry.data.i32[0]); 4861 return Status::OK; 4862 } 4863 4864 // Check if the camera device has logical multi-camera capability. 4865 Status CameraHidlTest::isLogicalMultiCamera(const camera_metadata_t *staticMeta) { 4866 Status ret = Status::METHOD_NOT_SUPPORTED; 4867 if (nullptr == staticMeta) { 4868 return Status::ILLEGAL_ARGUMENT; 4869 } 4870 4871 camera_metadata_ro_entry entry; 4872 int rc = find_camera_metadata_ro_entry(staticMeta, 4873 ANDROID_REQUEST_AVAILABLE_CAPABILITIES, &entry); 4874 if (0 != rc) { 4875 return Status::ILLEGAL_ARGUMENT; 4876 } 4877 4878 for (size_t i = 0; i < entry.count; i++) { 4879 if (ANDROID_REQUEST_AVAILABLE_CAPABILITIES_LOGICAL_MULTI_CAMERA == entry.data.u8[i]) { 4880 ret = Status::OK; 4881 break; 4882 } 4883 } 4884 4885 return ret; 4886 } 4887 4888 // Generate a list of physical camera ids backing a logical multi-camera. 4889 Status CameraHidlTest::getPhysicalCameraIds(const camera_metadata_t *staticMeta, 4890 std::unordered_set<std::string> *physicalIds) { 4891 if ((nullptr == staticMeta) || (nullptr == physicalIds)) { 4892 return Status::ILLEGAL_ARGUMENT; 4893 } 4894 4895 camera_metadata_ro_entry entry; 4896 int rc = find_camera_metadata_ro_entry(staticMeta, ANDROID_LOGICAL_MULTI_CAMERA_PHYSICAL_IDS, 4897 &entry); 4898 if (0 != rc) { 4899 return Status::ILLEGAL_ARGUMENT; 4900 } 4901 4902 const uint8_t* ids = entry.data.u8; 4903 size_t start = 0; 4904 for (size_t i = 0; i < entry.count; i++) { 4905 if (ids[i] == '\0') { 4906 if (start != i) { 4907 std::string currentId(reinterpret_cast<const char *> (ids + start)); 4908 physicalIds->emplace(currentId); 4909 } 4910 start = i + 1; 4911 } 4912 } 4913 4914 return Status::OK; 4915 } 4916 4917 // Generate a set of suported camera key ids. 4918 Status CameraHidlTest::getSupportedKeys(camera_metadata_t *staticMeta, 4919 uint32_t tagId, std::unordered_set<int32_t> *requestIDs) { 4920 if ((nullptr == staticMeta) || (nullptr == requestIDs)) { 4921 return Status::ILLEGAL_ARGUMENT; 4922 } 4923 4924 camera_metadata_ro_entry entry; 4925 int rc = find_camera_metadata_ro_entry(staticMeta, tagId, &entry); 4926 if ((0 != rc) || (entry.count == 0)) { 4927 return Status::OK; 4928 } 4929 4930 requestIDs->insert(entry.data.i32, entry.data.i32 + entry.count); 4931 4932 return Status::OK; 4933 } 4934 4935 void CameraHidlTest::constructFilteredSettings(const sp<ICameraDeviceSession>& session, 4936 const std::unordered_set<int32_t>& availableKeys, RequestTemplate reqTemplate, 4937 android::hardware::camera::common::V1_0::helper::CameraMetadata* defaultSettings, 4938 android::hardware::camera::common::V1_0::helper::CameraMetadata* filteredSettings) { 4939 ASSERT_NE(defaultSettings, nullptr); 4940 ASSERT_NE(filteredSettings, nullptr); 4941 4942 auto ret = session->constructDefaultRequestSettings(reqTemplate, 4943 [&defaultSettings] (auto status, const auto& req) mutable { 4944 ASSERT_EQ(Status::OK, status); 4945 4946 const camera_metadata_t *metadata = reinterpret_cast<const camera_metadata_t*> ( 4947 req.data()); 4948 size_t expectedSize = req.size(); 4949 int result = validate_camera_metadata_structure(metadata, &expectedSize); 4950 ASSERT_TRUE((result == 0) || (result == CAMERA_METADATA_VALIDATION_SHIFTED)); 4951 4952 size_t entryCount = get_camera_metadata_entry_count(metadata); 4953 ASSERT_GT(entryCount, 0u); 4954 *defaultSettings = metadata; 4955 }); 4956 ASSERT_TRUE(ret.isOk()); 4957 const android::hardware::camera::common::V1_0::helper::CameraMetadata &constSettings = 4958 *defaultSettings; 4959 for (const auto& keyIt : availableKeys) { 4960 camera_metadata_ro_entry entry = constSettings.find(keyIt); 4961 if (entry.count > 0) { 4962 filteredSettings->update(entry); 4963 } 4964 } 4965 } 4966 4967 // Check if constrained mode is supported by using the static 4968 // camera characteristics. 4969 Status CameraHidlTest::isConstrainedModeAvailable(camera_metadata_t *staticMeta) { 4970 Status ret = Status::METHOD_NOT_SUPPORTED; 4971 if (nullptr == staticMeta) { 4972 return Status::ILLEGAL_ARGUMENT; 4973 } 4974 4975 camera_metadata_ro_entry entry; 4976 int rc = find_camera_metadata_ro_entry(staticMeta, 4977 ANDROID_REQUEST_AVAILABLE_CAPABILITIES, &entry); 4978 if (0 != rc) { 4979 return Status::ILLEGAL_ARGUMENT; 4980 } 4981 4982 for (size_t i = 0; i < entry.count; i++) { 4983 if (ANDROID_REQUEST_AVAILABLE_CAPABILITIES_CONSTRAINED_HIGH_SPEED_VIDEO == 4984 entry.data.u8[i]) { 4985 ret = Status::OK; 4986 break; 4987 } 4988 } 4989 4990 return ret; 4991 } 4992 4993 // Pick the largest supported HFR mode from the static camera 4994 // characteristics. 4995 Status CameraHidlTest::pickConstrainedModeSize(camera_metadata_t *staticMeta, 4996 AvailableStream &hfrStream) { 4997 if (nullptr == staticMeta) { 4998 return Status::ILLEGAL_ARGUMENT; 4999 } 5000 5001 camera_metadata_ro_entry entry; 5002 int rc = find_camera_metadata_ro_entry(staticMeta, 5003 ANDROID_CONTROL_AVAILABLE_HIGH_SPEED_VIDEO_CONFIGURATIONS, &entry); 5004 if (0 != rc) { 5005 return Status::METHOD_NOT_SUPPORTED; 5006 } else if (0 != (entry.count % 5)) { 5007 return Status::ILLEGAL_ARGUMENT; 5008 } 5009 5010 hfrStream = {0, 0, 5011 static_cast<uint32_t>(PixelFormat::IMPLEMENTATION_DEFINED)}; 5012 for (size_t i = 0; i < entry.count; i+=5) { 5013 int32_t w = entry.data.i32[i]; 5014 int32_t h = entry.data.i32[i+1]; 5015 if ((hfrStream.width * hfrStream.height) < (w *h)) { 5016 hfrStream.width = w; 5017 hfrStream.height = h; 5018 } 5019 } 5020 5021 return Status::OK; 5022 } 5023 5024 // Check whether ZSL is available using the static camera 5025 // characteristics. 5026 Status CameraHidlTest::isZSLModeAvailable(const camera_metadata_t *staticMeta) { 5027 if (Status::OK == isZSLModeAvailable(staticMeta, PRIV_REPROCESS)) { 5028 return Status::OK; 5029 } else { 5030 return isZSLModeAvailable(staticMeta, YUV_REPROCESS); 5031 } 5032 } 5033 5034 Status CameraHidlTest::isZSLModeAvailable(const camera_metadata_t *staticMeta, 5035 ReprocessType reprocType) { 5036 5037 Status ret = Status::METHOD_NOT_SUPPORTED; 5038 if (nullptr == staticMeta) { 5039 return Status::ILLEGAL_ARGUMENT; 5040 } 5041 5042 camera_metadata_ro_entry entry; 5043 int rc = find_camera_metadata_ro_entry(staticMeta, 5044 ANDROID_REQUEST_AVAILABLE_CAPABILITIES, &entry); 5045 if (0 != rc) { 5046 return Status::ILLEGAL_ARGUMENT; 5047 } 5048 5049 for (size_t i = 0; i < entry.count; i++) { 5050 if ((reprocType == PRIV_REPROCESS && 5051 ANDROID_REQUEST_AVAILABLE_CAPABILITIES_PRIVATE_REPROCESSING == entry.data.u8[i]) || 5052 (reprocType == YUV_REPROCESS && 5053 ANDROID_REQUEST_AVAILABLE_CAPABILITIES_YUV_REPROCESSING == entry.data.u8[i])) { 5054 ret = Status::OK; 5055 break; 5056 } 5057 } 5058 5059 return ret; 5060 } 5061 5062 // Check whether this is a monochrome camera using the static camera characteristics. 5063 Status CameraHidlTest::isMonochromeCamera(const camera_metadata_t *staticMeta) { 5064 Status ret = Status::METHOD_NOT_SUPPORTED; 5065 if (nullptr == staticMeta) { 5066 return Status::ILLEGAL_ARGUMENT; 5067 } 5068 5069 camera_metadata_ro_entry entry; 5070 int rc = find_camera_metadata_ro_entry(staticMeta, 5071 ANDROID_REQUEST_AVAILABLE_CAPABILITIES, &entry); 5072 if (0 != rc) { 5073 return Status::ILLEGAL_ARGUMENT; 5074 } 5075 5076 for (size_t i = 0; i < entry.count; i++) { 5077 if (ANDROID_REQUEST_AVAILABLE_CAPABILITIES_MONOCHROME == entry.data.u8[i]) { 5078 ret = Status::OK; 5079 break; 5080 } 5081 } 5082 5083 return ret; 5084 } 5085 5086 // Retrieve the reprocess input-output format map from the static 5087 // camera characteristics. 5088 Status CameraHidlTest::getZSLInputOutputMap(camera_metadata_t *staticMeta, 5089 std::vector<AvailableZSLInputOutput> &inputOutputMap) { 5090 if (nullptr == staticMeta) { 5091 return Status::ILLEGAL_ARGUMENT; 5092 } 5093 5094 camera_metadata_ro_entry entry; 5095 int rc = find_camera_metadata_ro_entry(staticMeta, 5096 ANDROID_SCALER_AVAILABLE_INPUT_OUTPUT_FORMATS_MAP, &entry); 5097 if ((0 != rc) || (0 >= entry.count)) { 5098 return Status::ILLEGAL_ARGUMENT; 5099 } 5100 5101 const int32_t* contents = &entry.data.i32[0]; 5102 for (size_t i = 0; i < entry.count; ) { 5103 int32_t inputFormat = contents[i++]; 5104 int32_t length = contents[i++]; 5105 for (int32_t j = 0; j < length; j++) { 5106 int32_t outputFormat = contents[i+j]; 5107 AvailableZSLInputOutput zslEntry = {inputFormat, outputFormat}; 5108 inputOutputMap.push_back(zslEntry); 5109 } 5110 i += length; 5111 } 5112 5113 return Status::OK; 5114 } 5115 5116 // Search for the largest stream size for a given format. 5117 Status CameraHidlTest::findLargestSize( 5118 const std::vector<AvailableStream> &streamSizes, int32_t format, 5119 AvailableStream &result) { 5120 result = {0, 0, 0}; 5121 for (auto &iter : streamSizes) { 5122 if (format == iter.format) { 5123 if ((result.width * result.height) < (iter.width * iter.height)) { 5124 result = iter; 5125 } 5126 } 5127 } 5128 5129 return (result.format == format) ? Status::OK : Status::ILLEGAL_ARGUMENT; 5130 } 5131 5132 // Check whether the camera device supports specific focus mode. 5133 Status CameraHidlTest::isAutoFocusModeAvailable( 5134 CameraParameters &cameraParams, 5135 const char *mode) { 5136 ::android::String8 focusModes(cameraParams.get( 5137 CameraParameters::KEY_SUPPORTED_FOCUS_MODES)); 5138 if (focusModes.contains(mode)) { 5139 return Status::OK; 5140 } 5141 5142 return Status::METHOD_NOT_SUPPORTED; 5143 } 5144 5145 void CameraHidlTest::createStreamConfiguration( 5146 const ::android::hardware::hidl_vec<V3_2::Stream>& streams3_2, 5147 StreamConfigurationMode configMode, 5148 ::android::hardware::camera::device::V3_2::StreamConfiguration *config3_2 /*out*/, 5149 ::android::hardware::camera::device::V3_4::StreamConfiguration *config3_4 /*out*/, 5150 ::android::hardware::camera::device::V3_5::StreamConfiguration *config3_5 /*out*/, 5151 uint32_t jpegBufferSize) { 5152 ASSERT_NE(nullptr, config3_2); 5153 ASSERT_NE(nullptr, config3_4); 5154 ASSERT_NE(nullptr, config3_5); 5155 5156 ::android::hardware::hidl_vec<V3_4::Stream> streams3_4(streams3_2.size()); 5157 size_t idx = 0; 5158 for (auto& stream3_2 : streams3_2) { 5159 V3_4::Stream stream; 5160 stream.v3_2 = stream3_2; 5161 stream.bufferSize = 0; 5162 if (stream3_2.format == PixelFormat::BLOB && 5163 stream3_2.dataSpace == static_cast<V3_2::DataspaceFlags>(Dataspace::V0_JFIF)) { 5164 stream.bufferSize = jpegBufferSize; 5165 } 5166 streams3_4[idx++] = stream; 5167 } 5168 // Caller is responsible to fill in non-zero config3_5->streamConfigCounter after this returns 5169 *config3_5 = {{streams3_4, configMode, {}}, 0}; 5170 *config3_4 = config3_5->v3_4; 5171 *config3_2 = {streams3_2, configMode}; 5172 } 5173 5174 // Configure multiple preview streams using different physical ids. 5175 void CameraHidlTest::configurePreviewStreams3_4(const std::string &name, int32_t deviceVersion, 5176 sp<ICameraProvider> provider, 5177 const AvailableStream *previewThreshold, 5178 const std::unordered_set<std::string>& physicalIds, 5179 sp<device::V3_4::ICameraDeviceSession> *session3_4 /*out*/, 5180 sp<device::V3_5::ICameraDeviceSession> *session3_5 /*out*/, 5181 V3_2::Stream *previewStream /*out*/, 5182 device::V3_4::HalStreamConfiguration *halStreamConfig /*out*/, 5183 bool *supportsPartialResults /*out*/, 5184 uint32_t *partialResultCount /*out*/, 5185 bool *useHalBufManager /*out*/, 5186 sp<DeviceCb> *outCb /*out*/, 5187 uint32_t streamConfigCounter, 5188 bool allowUnsupport) { 5189 ASSERT_NE(nullptr, session3_4); 5190 ASSERT_NE(nullptr, session3_5); 5191 ASSERT_NE(nullptr, halStreamConfig); 5192 ASSERT_NE(nullptr, previewStream); 5193 ASSERT_NE(nullptr, supportsPartialResults); 5194 ASSERT_NE(nullptr, partialResultCount); 5195 ASSERT_NE(nullptr, useHalBufManager); 5196 ASSERT_NE(nullptr, outCb); 5197 ASSERT_FALSE(physicalIds.empty()); 5198 5199 std::vector<AvailableStream> outputPreviewStreams; 5200 ::android::sp<ICameraDevice> device3_x; 5201 ALOGI("configureStreams: Testing camera device %s", name.c_str()); 5202 Return<void> ret; 5203 ret = provider->getCameraDeviceInterface_V3_x( 5204 name, 5205 [&](auto status, const auto& device) { 5206 ALOGI("getCameraDeviceInterface_V3_x returns status:%d", 5207 (int)status); 5208 ASSERT_EQ(Status::OK, status); 5209 ASSERT_NE(device, nullptr); 5210 device3_x = device; 5211 }); 5212 ASSERT_TRUE(ret.isOk()); 5213 5214 camera_metadata_t *staticMeta; 5215 ret = device3_x->getCameraCharacteristics([&] (Status s, 5216 CameraMetadata metadata) { 5217 ASSERT_EQ(Status::OK, s); 5218 staticMeta = clone_camera_metadata( 5219 reinterpret_cast<const camera_metadata_t*>(metadata.data())); 5220 ASSERT_NE(nullptr, staticMeta); 5221 }); 5222 ASSERT_TRUE(ret.isOk()); 5223 5224 camera_metadata_ro_entry entry; 5225 auto status = find_camera_metadata_ro_entry(staticMeta, 5226 ANDROID_REQUEST_PARTIAL_RESULT_COUNT, &entry); 5227 if ((0 == status) && (entry.count > 0)) { 5228 *partialResultCount = entry.data.i32[0]; 5229 *supportsPartialResults = (*partialResultCount > 1); 5230 } 5231 5232 sp<DeviceCb> cb = new DeviceCb(this, deviceVersion, staticMeta); 5233 sp<ICameraDeviceSession> session; 5234 ret = device3_x->open( 5235 cb, 5236 [&session](auto status, const auto& newSession) { 5237 ALOGI("device::open returns status:%d", (int)status); 5238 ASSERT_EQ(Status::OK, status); 5239 ASSERT_NE(newSession, nullptr); 5240 session = newSession; 5241 }); 5242 ASSERT_TRUE(ret.isOk()); 5243 *outCb = cb; 5244 5245 sp<device::V3_3::ICameraDeviceSession> session3_3; 5246 castSession(session, deviceVersion, &session3_3, session3_4, session3_5); 5247 ASSERT_NE(nullptr, (*session3_4).get()); 5248 5249 *useHalBufManager = false; 5250 status = find_camera_metadata_ro_entry(staticMeta, 5251 ANDROID_INFO_SUPPORTED_BUFFER_MANAGEMENT_VERSION, &entry); 5252 if ((0 == status) && (entry.count == 1)) { 5253 *useHalBufManager = (entry.data.u8[0] == 5254 ANDROID_INFO_SUPPORTED_BUFFER_MANAGEMENT_VERSION_HIDL_DEVICE_3_5); 5255 } 5256 5257 outputPreviewStreams.clear(); 5258 auto rc = getAvailableOutputStreams(staticMeta, 5259 outputPreviewStreams, previewThreshold); 5260 free_camera_metadata(staticMeta); 5261 ASSERT_EQ(Status::OK, rc); 5262 ASSERT_FALSE(outputPreviewStreams.empty()); 5263 5264 ::android::hardware::hidl_vec<V3_4::Stream> streams3_4(physicalIds.size()); 5265 int32_t streamId = 0; 5266 for (auto const& physicalId : physicalIds) { 5267 V3_4::Stream stream3_4 = {{streamId, StreamType::OUTPUT, 5268 static_cast<uint32_t> (outputPreviewStreams[0].width), 5269 static_cast<uint32_t> (outputPreviewStreams[0].height), 5270 static_cast<PixelFormat> (outputPreviewStreams[0].format), 5271 GRALLOC1_CONSUMER_USAGE_HWCOMPOSER, 0, StreamRotation::ROTATION_0}, 5272 physicalId.c_str(), /*bufferSize*/ 0}; 5273 streams3_4[streamId++] = stream3_4; 5274 } 5275 5276 ::android::hardware::camera::device::V3_4::StreamConfiguration config3_4; 5277 ::android::hardware::camera::device::V3_5::StreamConfiguration config3_5; 5278 config3_4 = {streams3_4, StreamConfigurationMode::NORMAL_MODE, {}}; 5279 RequestTemplate reqTemplate = RequestTemplate::PREVIEW; 5280 ret = (*session3_4)->constructDefaultRequestSettings(reqTemplate, 5281 [&config3_4](auto status, const auto& req) { 5282 ASSERT_EQ(Status::OK, status); 5283 config3_4.sessionParams = req; 5284 }); 5285 ASSERT_TRUE(ret.isOk()); 5286 5287 ASSERT_TRUE(!allowUnsupport || deviceVersion == CAMERA_DEVICE_API_VERSION_3_5); 5288 if (allowUnsupport) { 5289 sp<device::V3_5::ICameraDevice> cameraDevice3_5; 5290 castDevice(device3_x, deviceVersion, &cameraDevice3_5); 5291 5292 bool supported = false; 5293 ret = cameraDevice3_5->isStreamCombinationSupported(config3_4, 5294 [&supported](Status s, bool combStatus) { 5295 ASSERT_TRUE((Status::OK == s) || 5296 (Status::METHOD_NOT_SUPPORTED == s)); 5297 if (Status::OK == s) { 5298 supported = combStatus; 5299 } 5300 }); 5301 ASSERT_TRUE(ret.isOk()); 5302 // If stream combination is not supported, return null session. 5303 if (!supported) { 5304 *session3_5 = nullptr; 5305 return; 5306 } 5307 } 5308 5309 if (*session3_5 != nullptr) { 5310 config3_5.v3_4 = config3_4; 5311 config3_5.streamConfigCounter = streamConfigCounter; 5312 ret = (*session3_5)->configureStreams_3_5(config3_5, 5313 [&] (Status s, device::V3_4::HalStreamConfiguration halConfig) { 5314 ASSERT_EQ(Status::OK, s); 5315 ASSERT_EQ(physicalIds.size(), halConfig.streams.size()); 5316 *halStreamConfig = halConfig; 5317 if (*useHalBufManager) { 5318 hidl_vec<V3_2::Stream> streams(physicalIds.size()); 5319 hidl_vec<V3_2::HalStream> halStreams(physicalIds.size()); 5320 for (size_t i = 0; i < physicalIds.size(); i++) { 5321 streams[i] = streams3_4[i].v3_2; 5322 halStreams[i] = halConfig.streams[i].v3_3.v3_2; 5323 } 5324 cb->setCurrentStreamConfig(streams, halStreams); 5325 } 5326 }); 5327 } else { 5328 ret = (*session3_4)->configureStreams_3_4(config3_4, 5329 [&] (Status s, device::V3_4::HalStreamConfiguration halConfig) { 5330 ASSERT_EQ(Status::OK, s); 5331 ASSERT_EQ(physicalIds.size(), halConfig.streams.size()); 5332 *halStreamConfig = halConfig; 5333 }); 5334 } 5335 *previewStream = streams3_4[0].v3_2; 5336 ASSERT_TRUE(ret.isOk()); 5337 } 5338 5339 bool CameraHidlTest::isDepthOnly(camera_metadata_t* staticMeta) { 5340 camera_metadata_ro_entry scalarEntry; 5341 camera_metadata_ro_entry depthEntry; 5342 5343 int rc = find_camera_metadata_ro_entry( 5344 staticMeta, ANDROID_REQUEST_AVAILABLE_CAPABILITIES, &scalarEntry); 5345 if (rc == 0) { 5346 for (uint32_t i = 0; i < scalarEntry.count; i++) { 5347 if (scalarEntry.data.u8[i] == ANDROID_REQUEST_AVAILABLE_CAPABILITIES_BACKWARD_COMPATIBLE) { 5348 return false; 5349 } 5350 } 5351 } 5352 5353 for (uint32_t i = 0; i < scalarEntry.count; i++) { 5354 if (scalarEntry.data.u8[i] == ANDROID_REQUEST_AVAILABLE_CAPABILITIES_DEPTH_OUTPUT) { 5355 5356 rc = find_camera_metadata_ro_entry( 5357 staticMeta, ANDROID_DEPTH_AVAILABLE_DEPTH_STREAM_CONFIGURATIONS, &depthEntry); 5358 size_t i = 0; 5359 if (rc == 0 && depthEntry.data.i32[i] == static_cast<int32_t>(PixelFormat::Y16)) { 5360 // only Depth16 format is supported now 5361 return true; 5362 } 5363 break; 5364 } 5365 } 5366 5367 return false; 5368 } 5369 5370 // Open a device session and configure a preview stream. 5371 void CameraHidlTest::configurePreviewStream(const std::string &name, int32_t deviceVersion, 5372 sp<ICameraProvider> provider, 5373 const AvailableStream *previewThreshold, 5374 sp<ICameraDeviceSession> *session /*out*/, 5375 V3_2::Stream *previewStream /*out*/, 5376 HalStreamConfiguration *halStreamConfig /*out*/, 5377 bool *supportsPartialResults /*out*/, 5378 uint32_t *partialResultCount /*out*/, 5379 bool *useHalBufManager /*out*/, 5380 sp<DeviceCb> *outCb /*out*/, 5381 uint32_t streamConfigCounter) { 5382 ASSERT_NE(nullptr, session); 5383 ASSERT_NE(nullptr, previewStream); 5384 ASSERT_NE(nullptr, halStreamConfig); 5385 ASSERT_NE(nullptr, supportsPartialResults); 5386 ASSERT_NE(nullptr, partialResultCount); 5387 ASSERT_NE(nullptr, useHalBufManager); 5388 ASSERT_NE(nullptr, outCb); 5389 5390 std::vector<AvailableStream> outputPreviewStreams; 5391 ::android::sp<ICameraDevice> device3_x; 5392 ALOGI("configureStreams: Testing camera device %s", name.c_str()); 5393 Return<void> ret; 5394 ret = provider->getCameraDeviceInterface_V3_x( 5395 name, 5396 [&](auto status, const auto& device) { 5397 ALOGI("getCameraDeviceInterface_V3_x returns status:%d", 5398 (int)status); 5399 ASSERT_EQ(Status::OK, status); 5400 ASSERT_NE(device, nullptr); 5401 device3_x = device; 5402 }); 5403 ASSERT_TRUE(ret.isOk()); 5404 5405 camera_metadata_t *staticMeta; 5406 ret = device3_x->getCameraCharacteristics([&] (Status s, 5407 CameraMetadata metadata) { 5408 ASSERT_EQ(Status::OK, s); 5409 staticMeta = clone_camera_metadata( 5410 reinterpret_cast<const camera_metadata_t*>(metadata.data())); 5411 ASSERT_NE(nullptr, staticMeta); 5412 }); 5413 ASSERT_TRUE(ret.isOk()); 5414 5415 camera_metadata_ro_entry entry; 5416 auto status = find_camera_metadata_ro_entry(staticMeta, 5417 ANDROID_REQUEST_PARTIAL_RESULT_COUNT, &entry); 5418 if ((0 == status) && (entry.count > 0)) { 5419 *partialResultCount = entry.data.i32[0]; 5420 *supportsPartialResults = (*partialResultCount > 1); 5421 } 5422 5423 sp<DeviceCb> cb = new DeviceCb(this, deviceVersion, staticMeta); 5424 ret = device3_x->open( 5425 cb, 5426 [&](auto status, const auto& newSession) { 5427 ALOGI("device::open returns status:%d", (int)status); 5428 ASSERT_EQ(Status::OK, status); 5429 ASSERT_NE(newSession, nullptr); 5430 *session = newSession; 5431 }); 5432 ASSERT_TRUE(ret.isOk()); 5433 *outCb = cb; 5434 5435 sp<device::V3_3::ICameraDeviceSession> session3_3; 5436 sp<device::V3_4::ICameraDeviceSession> session3_4; 5437 sp<device::V3_5::ICameraDeviceSession> session3_5; 5438 castSession(*session, deviceVersion, &session3_3, &session3_4, &session3_5); 5439 5440 *useHalBufManager = false; 5441 status = find_camera_metadata_ro_entry(staticMeta, 5442 ANDROID_INFO_SUPPORTED_BUFFER_MANAGEMENT_VERSION, &entry); 5443 if ((0 == status) && (entry.count == 1)) { 5444 *useHalBufManager = (entry.data.u8[0] == 5445 ANDROID_INFO_SUPPORTED_BUFFER_MANAGEMENT_VERSION_HIDL_DEVICE_3_5); 5446 } 5447 5448 outputPreviewStreams.clear(); 5449 auto rc = getAvailableOutputStreams(staticMeta, 5450 outputPreviewStreams, previewThreshold); 5451 5452 uint32_t jpegBufferSize = 0; 5453 ASSERT_EQ(Status::OK, getJpegBufferSize(staticMeta, &jpegBufferSize)); 5454 ASSERT_NE(0u, jpegBufferSize); 5455 5456 free_camera_metadata(staticMeta); 5457 ASSERT_EQ(Status::OK, rc); 5458 ASSERT_FALSE(outputPreviewStreams.empty()); 5459 5460 V3_2::DataspaceFlags dataspaceFlag = 0; 5461 switch (static_cast<PixelFormat>(outputPreviewStreams[0].format)) { 5462 case PixelFormat::Y16: 5463 dataspaceFlag = static_cast<V3_2::DataspaceFlags>(Dataspace::DEPTH); 5464 break; 5465 default: 5466 dataspaceFlag = static_cast<V3_2::DataspaceFlags>(Dataspace::UNKNOWN); 5467 } 5468 5469 V3_2::Stream stream3_2 = {0, StreamType::OUTPUT, 5470 static_cast<uint32_t> (outputPreviewStreams[0].width), 5471 static_cast<uint32_t> (outputPreviewStreams[0].height), 5472 static_cast<PixelFormat> (outputPreviewStreams[0].format), 5473 GRALLOC1_CONSUMER_USAGE_HWCOMPOSER, dataspaceFlag, StreamRotation::ROTATION_0}; 5474 ::android::hardware::hidl_vec<V3_2::Stream> streams3_2 = {stream3_2}; 5475 ::android::hardware::camera::device::V3_2::StreamConfiguration config3_2; 5476 ::android::hardware::camera::device::V3_4::StreamConfiguration config3_4; 5477 ::android::hardware::camera::device::V3_5::StreamConfiguration config3_5; 5478 createStreamConfiguration(streams3_2, StreamConfigurationMode::NORMAL_MODE, 5479 &config3_2, &config3_4, &config3_5, jpegBufferSize); 5480 if (session3_5 != nullptr) { 5481 RequestTemplate reqTemplate = RequestTemplate::PREVIEW; 5482 ret = session3_5->constructDefaultRequestSettings(reqTemplate, 5483 [&config3_5](auto status, const auto& req) { 5484 ASSERT_EQ(Status::OK, status); 5485 config3_5.v3_4.sessionParams = req; 5486 }); 5487 ASSERT_TRUE(ret.isOk()); 5488 config3_5.streamConfigCounter = streamConfigCounter; 5489 ret = session3_5->configureStreams_3_5(config3_5, 5490 [&] (Status s, device::V3_4::HalStreamConfiguration halConfig) { 5491 ASSERT_EQ(Status::OK, s); 5492 ASSERT_EQ(1u, halConfig.streams.size()); 5493 halStreamConfig->streams.resize(1); 5494 halStreamConfig->streams[0] = halConfig.streams[0].v3_3.v3_2; 5495 if (*useHalBufManager) { 5496 hidl_vec<V3_2::Stream> streams(1); 5497 hidl_vec<V3_2::HalStream> halStreams(1); 5498 streams[0] = stream3_2; 5499 halStreams[0] = halConfig.streams[0].v3_3.v3_2; 5500 cb->setCurrentStreamConfig(streams, halStreams); 5501 } 5502 }); 5503 } else if (session3_4 != nullptr) { 5504 RequestTemplate reqTemplate = RequestTemplate::PREVIEW; 5505 ret = session3_4->constructDefaultRequestSettings(reqTemplate, 5506 [&config3_4](auto status, const auto& req) { 5507 ASSERT_EQ(Status::OK, status); 5508 config3_4.sessionParams = req; 5509 }); 5510 ASSERT_TRUE(ret.isOk()); 5511 ret = session3_4->configureStreams_3_4(config3_4, 5512 [&] (Status s, device::V3_4::HalStreamConfiguration halConfig) { 5513 ASSERT_EQ(Status::OK, s); 5514 ASSERT_EQ(1u, halConfig.streams.size()); 5515 halStreamConfig->streams.resize(halConfig.streams.size()); 5516 for (size_t i = 0; i < halConfig.streams.size(); i++) { 5517 halStreamConfig->streams[i] = halConfig.streams[i].v3_3.v3_2; 5518 } 5519 }); 5520 } else if (session3_3 != nullptr) { 5521 ret = session3_3->configureStreams_3_3(config3_2, 5522 [&] (Status s, device::V3_3::HalStreamConfiguration halConfig) { 5523 ASSERT_EQ(Status::OK, s); 5524 ASSERT_EQ(1u, halConfig.streams.size()); 5525 halStreamConfig->streams.resize(halConfig.streams.size()); 5526 for (size_t i = 0; i < halConfig.streams.size(); i++) { 5527 halStreamConfig->streams[i] = halConfig.streams[i].v3_2; 5528 } 5529 }); 5530 } else { 5531 ret = (*session)->configureStreams(config3_2, 5532 [&] (Status s, HalStreamConfiguration halConfig) { 5533 ASSERT_EQ(Status::OK, s); 5534 ASSERT_EQ(1u, halConfig.streams.size()); 5535 *halStreamConfig = halConfig; 5536 }); 5537 } 5538 *previewStream = stream3_2; 5539 ASSERT_TRUE(ret.isOk()); 5540 } 5541 5542 void CameraHidlTest::castDevice(const sp<device::V3_2::ICameraDevice> &device, 5543 int32_t deviceVersion, sp<device::V3_5::ICameraDevice> *device3_5/*out*/) { 5544 ASSERT_NE(nullptr, device3_5); 5545 if (deviceVersion == CAMERA_DEVICE_API_VERSION_3_5) { 5546 auto castResult = device::V3_5::ICameraDevice::castFrom(device); 5547 ASSERT_TRUE(castResult.isOk()); 5548 *device3_5 = castResult; 5549 } 5550 } 5551 5552 //Cast camera provider to corresponding version if available 5553 void CameraHidlTest::castProvider(const sp<ICameraProvider> &provider, 5554 sp<provider::V2_5::ICameraProvider> *provider2_5 /*out*/) { 5555 ASSERT_NE(nullptr, provider2_5); 5556 auto castResult = provider::V2_5::ICameraProvider::castFrom(provider); 5557 if (castResult.isOk()) { 5558 *provider2_5 = castResult; 5559 } 5560 } 5561 5562 //Cast camera device session to corresponding version 5563 void CameraHidlTest::castSession(const sp<ICameraDeviceSession> &session, int32_t deviceVersion, 5564 sp<device::V3_3::ICameraDeviceSession> *session3_3 /*out*/, 5565 sp<device::V3_4::ICameraDeviceSession> *session3_4 /*out*/, 5566 sp<device::V3_5::ICameraDeviceSession> *session3_5 /*out*/) { 5567 ASSERT_NE(nullptr, session3_3); 5568 ASSERT_NE(nullptr, session3_4); 5569 ASSERT_NE(nullptr, session3_5); 5570 5571 switch (deviceVersion) { 5572 case CAMERA_DEVICE_API_VERSION_3_5: { 5573 auto castResult = device::V3_5::ICameraDeviceSession::castFrom(session); 5574 ASSERT_TRUE(castResult.isOk()); 5575 *session3_5 = castResult; 5576 } 5577 [[fallthrough]]; 5578 case CAMERA_DEVICE_API_VERSION_3_4: { 5579 auto castResult = device::V3_4::ICameraDeviceSession::castFrom(session); 5580 ASSERT_TRUE(castResult.isOk()); 5581 *session3_4 = castResult; 5582 } 5583 [[fallthrough]]; 5584 case CAMERA_DEVICE_API_VERSION_3_3: { 5585 auto castResult = device::V3_3::ICameraDeviceSession::castFrom(session); 5586 ASSERT_TRUE(castResult.isOk()); 5587 *session3_3 = castResult; 5588 break; 5589 } 5590 default: 5591 //no-op 5592 return; 5593 } 5594 } 5595 5596 void CameraHidlTest::verifyStreamCombination(sp<device::V3_5::ICameraDevice> cameraDevice3_5, 5597 const ::android::hardware::camera::device::V3_4::StreamConfiguration &config3_4, 5598 bool expectedStatus, bool expectMethodSupported) { 5599 if (cameraDevice3_5.get() != nullptr) { 5600 auto ret = cameraDevice3_5->isStreamCombinationSupported(config3_4, 5601 [expectedStatus, expectMethodSupported] (Status s, bool combStatus) { 5602 ASSERT_TRUE((Status::OK == s) || 5603 (!expectMethodSupported && Status::METHOD_NOT_SUPPORTED == s)); 5604 if (Status::OK == s) { 5605 ASSERT_TRUE(combStatus == expectedStatus); 5606 } 5607 }); 5608 ASSERT_TRUE(ret.isOk()); 5609 } 5610 } 5611 5612 // Verify logical camera static metadata 5613 void CameraHidlTest::verifyLogicalCameraMetadata(const std::string& cameraName, 5614 const ::android::sp<::android::hardware::camera::device::V3_2::ICameraDevice>& device, 5615 const CameraMetadata &chars, int deviceVersion, 5616 const hidl_vec<hidl_string>& deviceNames) { 5617 const camera_metadata_t* metadata = (camera_metadata_t*)chars.data(); 5618 ASSERT_NE(nullptr, metadata); 5619 5620 Status rc = isLogicalMultiCamera(metadata); 5621 ASSERT_TRUE(Status::OK == rc || Status::METHOD_NOT_SUPPORTED == rc); 5622 if (Status::METHOD_NOT_SUPPORTED == rc) { 5623 return; 5624 } 5625 5626 std::string version, cameraId; 5627 ASSERT_TRUE(::matchDeviceName(cameraName, mProviderType, &version, &cameraId)); 5628 std::unordered_set<std::string> physicalIds; 5629 ASSERT_TRUE(Status::OK == getPhysicalCameraIds(metadata, &physicalIds)); 5630 for (auto physicalId : physicalIds) { 5631 ASSERT_NE(physicalId, cameraId); 5632 bool isPublicId = false; 5633 for (auto& deviceName : deviceNames) { 5634 std::string publicVersion, publicId; 5635 ASSERT_TRUE(::matchDeviceName(deviceName, mProviderType, &publicVersion, &publicId)); 5636 if (physicalId == publicId) { 5637 isPublicId = true; 5638 break; 5639 } 5640 } 5641 if (isPublicId) { 5642 continue; 5643 } 5644 5645 ASSERT_TRUE(deviceVersion >= CAMERA_DEVICE_API_VERSION_3_5); 5646 auto castResult = device::V3_5::ICameraDevice::castFrom(device); 5647 ASSERT_TRUE(castResult.isOk()); 5648 ::android::sp<::android::hardware::camera::device::V3_5::ICameraDevice> device3_5 = 5649 castResult; 5650 ASSERT_NE(device3_5, nullptr); 5651 5652 // Check camera characteristics for hidden camera id 5653 Return<void> ret = device3_5->getPhysicalCameraCharacteristics(physicalId, 5654 [&](auto status, const auto& chars) { 5655 verifyCameraCharacteristics(status, chars); 5656 verifyMonochromeCharacteristics(chars, deviceVersion); 5657 }); 5658 ASSERT_TRUE(ret.isOk()); 5659 5660 // Check calling getCameraDeviceInterface_V3_x() on hidden camera id returns 5661 // ILLEGAL_ARGUMENT. 5662 std::stringstream s; 5663 s << "device@" << version << "/" << mProviderType << "/" << physicalId; 5664 hidl_string fullPhysicalId(s.str()); 5665 ret = mProvider->getCameraDeviceInterface_V3_x(fullPhysicalId, 5666 [&](auto status, const auto& device3_x) { 5667 ASSERT_EQ(Status::ILLEGAL_ARGUMENT, status); 5668 ASSERT_EQ(device3_x, nullptr); 5669 }); 5670 ASSERT_TRUE(ret.isOk()); 5671 } 5672 5673 // Make sure ANDROID_LOGICAL_MULTI_CAMERA_ACTIVE_PHYSICAL_ID is available in 5674 // result keys. 5675 if (deviceVersion >= CAMERA_DEVICE_API_VERSION_3_5) { 5676 camera_metadata_ro_entry entry; 5677 int retcode = find_camera_metadata_ro_entry(metadata, 5678 ANDROID_REQUEST_AVAILABLE_RESULT_KEYS, &entry); 5679 if ((0 == retcode) && (entry.count > 0)) { 5680 ASSERT_NE(std::find(entry.data.i32, entry.data.i32 + entry.count, 5681 static_cast<int32_t>( 5682 CameraMetadataTag::ANDROID_LOGICAL_MULTI_CAMERA_ACTIVE_PHYSICAL_ID)), 5683 entry.data.i32 + entry.count); 5684 } else { 5685 ADD_FAILURE() << "Get camera availableResultKeys failed!"; 5686 } 5687 } 5688 } 5689 5690 void CameraHidlTest::verifyCameraCharacteristics(Status status, const CameraMetadata& chars) { 5691 ASSERT_EQ(Status::OK, status); 5692 const camera_metadata_t* metadata = (camera_metadata_t*)chars.data(); 5693 size_t expectedSize = chars.size(); 5694 int result = validate_camera_metadata_structure(metadata, &expectedSize); 5695 ASSERT_TRUE((result == 0) || (result == CAMERA_METADATA_VALIDATION_SHIFTED)); 5696 size_t entryCount = get_camera_metadata_entry_count(metadata); 5697 // TODO: we can do better than 0 here. Need to check how many required 5698 // characteristics keys we've defined. 5699 ASSERT_GT(entryCount, 0u); 5700 5701 camera_metadata_ro_entry entry; 5702 int retcode = find_camera_metadata_ro_entry(metadata, 5703 ANDROID_INFO_SUPPORTED_HARDWARE_LEVEL, &entry); 5704 if ((0 == retcode) && (entry.count > 0)) { 5705 uint8_t hardwareLevel = entry.data.u8[0]; 5706 ASSERT_TRUE( 5707 hardwareLevel == ANDROID_INFO_SUPPORTED_HARDWARE_LEVEL_LIMITED || 5708 hardwareLevel == ANDROID_INFO_SUPPORTED_HARDWARE_LEVEL_FULL || 5709 hardwareLevel == ANDROID_INFO_SUPPORTED_HARDWARE_LEVEL_3 || 5710 hardwareLevel == ANDROID_INFO_SUPPORTED_HARDWARE_LEVEL_EXTERNAL); 5711 } else { 5712 ADD_FAILURE() << "Get camera hardware level failed!"; 5713 } 5714 5715 entry.count = 0; 5716 retcode = find_camera_metadata_ro_entry(metadata, 5717 ANDROID_REQUEST_CHARACTERISTIC_KEYS_NEEDING_PERMISSION, &entry); 5718 if ((0 == retcode) || (entry.count > 0)) { 5719 ADD_FAILURE() << "ANDROID_REQUEST_CHARACTERISTIC_KEYS_NEEDING_PERMISSION " 5720 << " per API contract should never be set by Hal!"; 5721 } 5722 retcode = find_camera_metadata_ro_entry(metadata, 5723 ANDROID_DEPTH_AVAILABLE_DYNAMIC_DEPTH_STREAM_CONFIGURATIONS, &entry); 5724 if ((0 == retcode) || (entry.count > 0)) { 5725 ADD_FAILURE() << "ANDROID_DEPTH_AVAILABLE_DYNAMIC_DEPTH_STREAM_CONFIGURATIONS" 5726 << " per API contract should never be set by Hal!"; 5727 } 5728 retcode = find_camera_metadata_ro_entry(metadata, 5729 ANDROID_DEPTH_AVAILABLE_DYNAMIC_DEPTH_MIN_FRAME_DURATIONS, &entry); 5730 if ((0 == retcode) || (entry.count > 0)) { 5731 ADD_FAILURE() << "ANDROID_DEPTH_AVAILABLE_DYNAMIC_DEPTH_MIN_FRAME_DURATIONS" 5732 << " per API contract should never be set by Hal!"; 5733 } 5734 retcode = find_camera_metadata_ro_entry(metadata, 5735 ANDROID_DEPTH_AVAILABLE_DYNAMIC_DEPTH_STALL_DURATIONS, &entry); 5736 if ((0 == retcode) || (entry.count > 0)) { 5737 ADD_FAILURE() << "ANDROID_DEPTH_AVAILABLE_DYNAMIC_DEPTH_STALL_DURATIONS" 5738 << " per API contract should never be set by Hal!"; 5739 } 5740 5741 retcode = find_camera_metadata_ro_entry(metadata, 5742 ANDROID_HEIC_AVAILABLE_HEIC_STREAM_CONFIGURATIONS, &entry); 5743 if (0 == retcode || entry.count > 0) { 5744 ADD_FAILURE() << "ANDROID_HEIC_AVAILABLE_HEIC_STREAM_CONFIGURATIONS " 5745 << " per API contract should never be set by Hal!"; 5746 } 5747 5748 retcode = find_camera_metadata_ro_entry(metadata, 5749 ANDROID_HEIC_AVAILABLE_HEIC_MIN_FRAME_DURATIONS, &entry); 5750 if (0 == retcode || entry.count > 0) { 5751 ADD_FAILURE() << "ANDROID_HEIC_AVAILABLE_HEIC_MIN_FRAME_DURATIONS " 5752 << " per API contract should never be set by Hal!"; 5753 } 5754 5755 retcode = find_camera_metadata_ro_entry(metadata, 5756 ANDROID_HEIC_AVAILABLE_HEIC_STALL_DURATIONS, &entry); 5757 if (0 == retcode || entry.count > 0) { 5758 ADD_FAILURE() << "ANDROID_HEIC_AVAILABLE_HEIC_STALL_DURATIONS " 5759 << " per API contract should never be set by Hal!"; 5760 } 5761 5762 retcode = find_camera_metadata_ro_entry(metadata, 5763 ANDROID_HEIC_INFO_SUPPORTED, &entry); 5764 if (0 == retcode && entry.count > 0) { 5765 retcode = find_camera_metadata_ro_entry(metadata, 5766 ANDROID_HEIC_INFO_MAX_JPEG_APP_SEGMENTS_COUNT, &entry); 5767 if (0 == retcode && entry.count > 0) { 5768 uint8_t maxJpegAppSegmentsCount = entry.data.u8[0]; 5769 ASSERT_TRUE(maxJpegAppSegmentsCount >= 1 && 5770 maxJpegAppSegmentsCount <= 16); 5771 } else { 5772 ADD_FAILURE() << "Get Heic maxJpegAppSegmentsCount failed!"; 5773 } 5774 } 5775 } 5776 5777 void CameraHidlTest::verifyMonochromeCharacteristics(const CameraMetadata& chars, 5778 int deviceVersion) { 5779 const camera_metadata_t* metadata = (camera_metadata_t*)chars.data(); 5780 Status rc = isMonochromeCamera(metadata); 5781 if (Status::METHOD_NOT_SUPPORTED == rc) { 5782 return; 5783 } 5784 ASSERT_EQ(Status::OK, rc); 5785 5786 camera_metadata_ro_entry entry; 5787 // Check capabilities 5788 int retcode = find_camera_metadata_ro_entry(metadata, 5789 ANDROID_REQUEST_AVAILABLE_CAPABILITIES, &entry); 5790 if ((0 == retcode) && (entry.count > 0)) { 5791 ASSERT_EQ(std::find(entry.data.u8, entry.data.u8 + entry.count, 5792 ANDROID_REQUEST_AVAILABLE_CAPABILITIES_MANUAL_POST_PROCESSING), 5793 entry.data.u8 + entry.count); 5794 if (deviceVersion < CAMERA_DEVICE_API_VERSION_3_5) { 5795 ASSERT_EQ(std::find(entry.data.u8, entry.data.u8 + entry.count, 5796 ANDROID_REQUEST_AVAILABLE_CAPABILITIES_RAW), 5797 entry.data.u8 + entry.count); 5798 } 5799 } 5800 5801 if (deviceVersion >= CAMERA_DEVICE_API_VERSION_3_5) { 5802 // Check Cfa 5803 retcode = find_camera_metadata_ro_entry(metadata, 5804 ANDROID_SENSOR_INFO_COLOR_FILTER_ARRANGEMENT, &entry); 5805 if ((0 == retcode) && (entry.count == 1)) { 5806 ASSERT_TRUE(entry.data.i32[0] == static_cast<int32_t>( 5807 CameraMetadataEnumAndroidSensorInfoColorFilterArrangement::ANDROID_SENSOR_INFO_COLOR_FILTER_ARRANGEMENT_MONO) 5808 || entry.data.i32[0] == static_cast<int32_t>( 5809 CameraMetadataEnumAndroidSensorInfoColorFilterArrangement::ANDROID_SENSOR_INFO_COLOR_FILTER_ARRANGEMENT_NIR)); 5810 } 5811 5812 // Check availableRequestKeys 5813 retcode = find_camera_metadata_ro_entry(metadata, 5814 ANDROID_REQUEST_AVAILABLE_REQUEST_KEYS, &entry); 5815 if ((0 == retcode) && (entry.count > 0)) { 5816 for (size_t i = 0; i < entry.count; i++) { 5817 ASSERT_NE(entry.data.i32[i], ANDROID_COLOR_CORRECTION_MODE); 5818 ASSERT_NE(entry.data.i32[i], ANDROID_COLOR_CORRECTION_TRANSFORM); 5819 ASSERT_NE(entry.data.i32[i], ANDROID_COLOR_CORRECTION_GAINS); 5820 } 5821 } else { 5822 ADD_FAILURE() << "Get camera availableRequestKeys failed!"; 5823 } 5824 5825 // Check availableResultKeys 5826 retcode = find_camera_metadata_ro_entry(metadata, 5827 ANDROID_REQUEST_AVAILABLE_RESULT_KEYS, &entry); 5828 if ((0 == retcode) && (entry.count > 0)) { 5829 for (size_t i = 0; i < entry.count; i++) { 5830 ASSERT_NE(entry.data.i32[i], ANDROID_SENSOR_GREEN_SPLIT); 5831 ASSERT_NE(entry.data.i32[i], ANDROID_SENSOR_NEUTRAL_COLOR_POINT); 5832 ASSERT_NE(entry.data.i32[i], ANDROID_COLOR_CORRECTION_MODE); 5833 ASSERT_NE(entry.data.i32[i], ANDROID_COLOR_CORRECTION_TRANSFORM); 5834 ASSERT_NE(entry.data.i32[i], ANDROID_COLOR_CORRECTION_GAINS); 5835 } 5836 } else { 5837 ADD_FAILURE() << "Get camera availableResultKeys failed!"; 5838 } 5839 5840 // Check availableCharacteristicKeys 5841 retcode = find_camera_metadata_ro_entry(metadata, 5842 ANDROID_REQUEST_AVAILABLE_CHARACTERISTICS_KEYS, &entry); 5843 if ((0 == retcode) && (entry.count > 0)) { 5844 for (size_t i = 0; i < entry.count; i++) { 5845 ASSERT_NE(entry.data.i32[i], ANDROID_SENSOR_REFERENCE_ILLUMINANT1); 5846 ASSERT_NE(entry.data.i32[i], ANDROID_SENSOR_REFERENCE_ILLUMINANT2); 5847 ASSERT_NE(entry.data.i32[i], ANDROID_SENSOR_CALIBRATION_TRANSFORM1); 5848 ASSERT_NE(entry.data.i32[i], ANDROID_SENSOR_CALIBRATION_TRANSFORM2); 5849 ASSERT_NE(entry.data.i32[i], ANDROID_SENSOR_COLOR_TRANSFORM1); 5850 ASSERT_NE(entry.data.i32[i], ANDROID_SENSOR_COLOR_TRANSFORM2); 5851 ASSERT_NE(entry.data.i32[i], ANDROID_SENSOR_FORWARD_MATRIX1); 5852 ASSERT_NE(entry.data.i32[i], ANDROID_SENSOR_FORWARD_MATRIX2); 5853 } 5854 } else { 5855 ADD_FAILURE() << "Get camera availableResultKeys failed!"; 5856 } 5857 5858 // Check blackLevelPattern 5859 retcode = find_camera_metadata_ro_entry(metadata, 5860 ANDROID_SENSOR_BLACK_LEVEL_PATTERN, &entry); 5861 if ((0 == retcode) && (entry.count > 0)) { 5862 ASSERT_EQ(entry.count, 4); 5863 for (size_t i = 1; i < entry.count; i++) { 5864 ASSERT_EQ(entry.data.i32[i], entry.data.i32[0]); 5865 } 5866 } 5867 } 5868 } 5869 5870 void CameraHidlTest::verifyMonochromeCameraResult( 5871 const ::android::hardware::camera::common::V1_0::helper::CameraMetadata& metadata) { 5872 camera_metadata_ro_entry entry; 5873 5874 // Check tags that are not applicable for monochrome camera 5875 ASSERT_FALSE(metadata.exists(ANDROID_SENSOR_GREEN_SPLIT)); 5876 ASSERT_FALSE(metadata.exists(ANDROID_SENSOR_NEUTRAL_COLOR_POINT)); 5877 ASSERT_FALSE(metadata.exists(ANDROID_COLOR_CORRECTION_MODE)); 5878 ASSERT_FALSE(metadata.exists(ANDROID_COLOR_CORRECTION_TRANSFORM)); 5879 ASSERT_FALSE(metadata.exists(ANDROID_COLOR_CORRECTION_GAINS)); 5880 5881 // Check dynamicBlackLevel 5882 entry = metadata.find(ANDROID_SENSOR_DYNAMIC_BLACK_LEVEL); 5883 if (entry.count > 0) { 5884 ASSERT_EQ(entry.count, 4); 5885 for (size_t i = 1; i < entry.count; i++) { 5886 ASSERT_FLOAT_EQ(entry.data.f[i], entry.data.f[0]); 5887 } 5888 } 5889 5890 // Check noiseProfile 5891 entry = metadata.find(ANDROID_SENSOR_NOISE_PROFILE); 5892 if (entry.count > 0) { 5893 ASSERT_EQ(entry.count, 2); 5894 } 5895 5896 // Check lensShadingMap 5897 entry = metadata.find(ANDROID_STATISTICS_LENS_SHADING_MAP); 5898 if (entry.count > 0) { 5899 ASSERT_EQ(entry.count % 4, 0); 5900 for (size_t i = 0; i < entry.count/4; i++) { 5901 ASSERT_FLOAT_EQ(entry.data.f[i*4+1], entry.data.f[i*4]); 5902 ASSERT_FLOAT_EQ(entry.data.f[i*4+2], entry.data.f[i*4]); 5903 ASSERT_FLOAT_EQ(entry.data.f[i*4+3], entry.data.f[i*4]); 5904 } 5905 } 5906 5907 // Check tonemapCurve 5908 camera_metadata_ro_entry curveRed = metadata.find(ANDROID_TONEMAP_CURVE_RED); 5909 camera_metadata_ro_entry curveGreen = metadata.find(ANDROID_TONEMAP_CURVE_GREEN); 5910 camera_metadata_ro_entry curveBlue = metadata.find(ANDROID_TONEMAP_CURVE_BLUE); 5911 if (curveRed.count > 0 && curveGreen.count > 0 && curveBlue.count > 0) { 5912 ASSERT_EQ(curveRed.count, curveGreen.count); 5913 ASSERT_EQ(curveRed.count, curveBlue.count); 5914 for (size_t i = 0; i < curveRed.count; i++) { 5915 ASSERT_FLOAT_EQ(curveGreen.data.f[i], curveRed.data.f[i]); 5916 ASSERT_FLOAT_EQ(curveBlue.data.f[i], curveRed.data.f[i]); 5917 } 5918 } 5919 } 5920 5921 void CameraHidlTest::verifyBuffersReturned( 5922 sp<device::V3_2::ICameraDeviceSession> session, 5923 int deviceVersion, int32_t streamId, 5924 sp<DeviceCb> cb, uint32_t streamConfigCounter) { 5925 sp<device::V3_3::ICameraDeviceSession> session3_3; 5926 sp<device::V3_4::ICameraDeviceSession> session3_4; 5927 sp<device::V3_5::ICameraDeviceSession> session3_5; 5928 castSession(session, deviceVersion, &session3_3, &session3_4, &session3_5); 5929 ASSERT_NE(nullptr, session3_5.get()); 5930 5931 hidl_vec<int32_t> streamIds(1); 5932 streamIds[0] = streamId; 5933 session3_5->signalStreamFlush(streamIds, /*streamConfigCounter*/streamConfigCounter); 5934 cb->waitForBuffersReturned(); 5935 } 5936 5937 void CameraHidlTest::verifyBuffersReturned( 5938 sp<device::V3_4::ICameraDeviceSession> session3_4, 5939 hidl_vec<int32_t> streamIds, sp<DeviceCb> cb, uint32_t streamConfigCounter) { 5940 auto castResult = device::V3_5::ICameraDeviceSession::castFrom(session3_4); 5941 ASSERT_TRUE(castResult.isOk()); 5942 sp<device::V3_5::ICameraDeviceSession> session3_5 = castResult; 5943 ASSERT_NE(nullptr, session3_5.get()); 5944 5945 session3_5->signalStreamFlush(streamIds, /*streamConfigCounter*/streamConfigCounter); 5946 cb->waitForBuffersReturned(); 5947 } 5948 5949 void CameraHidlTest::verifyLogicalCameraResult(const camera_metadata_t* staticMetadata, 5950 const ::android::hardware::camera::common::V1_0::helper::CameraMetadata& resultMetadata) { 5951 std::unordered_set<std::string> physicalIds; 5952 Status rc = getPhysicalCameraIds(staticMetadata, &physicalIds); 5953 ASSERT_TRUE(Status::OK == rc); 5954 ASSERT_TRUE(physicalIds.size() > 1); 5955 5956 camera_metadata_ro_entry entry; 5957 // Check mainPhysicalId 5958 entry = resultMetadata.find(ANDROID_LOGICAL_MULTI_CAMERA_ACTIVE_PHYSICAL_ID); 5959 if (entry.count > 0) { 5960 std::string mainPhysicalId(reinterpret_cast<const char *>(entry.data.u8)); 5961 ASSERT_NE(physicalIds.find(mainPhysicalId), physicalIds.end()); 5962 } else { 5963 ADD_FAILURE() << "Get LOGICAL_MULTI_CAMERA_ACTIVE_PHYSICAL_ID failed!"; 5964 } 5965 } 5966 5967 // Open a device session with empty callbacks and return static metadata. 5968 void CameraHidlTest::openEmptyDeviceSession(const std::string &name, sp<ICameraProvider> provider, 5969 sp<ICameraDeviceSession> *session /*out*/, camera_metadata_t **staticMeta /*out*/, 5970 ::android::sp<ICameraDevice> *cameraDevice /*out*/) { 5971 ASSERT_NE(nullptr, session); 5972 ASSERT_NE(nullptr, staticMeta); 5973 5974 ::android::sp<ICameraDevice> device3_x; 5975 ALOGI("configureStreams: Testing camera device %s", name.c_str()); 5976 Return<void> ret; 5977 ret = provider->getCameraDeviceInterface_V3_x( 5978 name, 5979 [&](auto status, const auto& device) { 5980 ALOGI("getCameraDeviceInterface_V3_x returns status:%d", 5981 (int)status); 5982 ASSERT_EQ(Status::OK, status); 5983 ASSERT_NE(device, nullptr); 5984 device3_x = device; 5985 }); 5986 ASSERT_TRUE(ret.isOk()); 5987 if (cameraDevice != nullptr) { 5988 *cameraDevice = device3_x; 5989 } 5990 5991 sp<EmptyDeviceCb> cb = new EmptyDeviceCb(); 5992 ret = device3_x->open(cb, [&](auto status, const auto& newSession) { 5993 ALOGI("device::open returns status:%d", (int)status); 5994 ASSERT_EQ(Status::OK, status); 5995 ASSERT_NE(newSession, nullptr); 5996 *session = newSession; 5997 }); 5998 ASSERT_TRUE(ret.isOk()); 5999 6000 ret = device3_x->getCameraCharacteristics([&] (Status s, 6001 CameraMetadata metadata) { 6002 ASSERT_EQ(Status::OK, s); 6003 *staticMeta = clone_camera_metadata( 6004 reinterpret_cast<const camera_metadata_t*>(metadata.data())); 6005 ASSERT_NE(nullptr, *staticMeta); 6006 }); 6007 ASSERT_TRUE(ret.isOk()); 6008 } 6009 6010 void CameraHidlTest::notifyDeviceState(provider::V2_5::DeviceState newState) { 6011 if (mProvider2_5.get() == nullptr) return; 6012 6013 mProvider2_5->notifyDeviceStateChange( 6014 static_cast<hidl_bitfield<provider::V2_5::DeviceState>>(newState)); 6015 } 6016 6017 // Open a particular camera device. 6018 void CameraHidlTest::openCameraDevice(const std::string &name, 6019 sp<ICameraProvider> provider, 6020 sp<::android::hardware::camera::device::V1_0::ICameraDevice> *device1 /*out*/) { 6021 ASSERT_TRUE(nullptr != device1); 6022 6023 Return<void> ret; 6024 ret = provider->getCameraDeviceInterface_V1_x( 6025 name, 6026 [&](auto status, const auto& device) { 6027 ALOGI("getCameraDeviceInterface_V1_x returns status:%d", 6028 (int)status); 6029 ASSERT_EQ(Status::OK, status); 6030 ASSERT_NE(device, nullptr); 6031 *device1 = device; 6032 }); 6033 ASSERT_TRUE(ret.isOk()); 6034 6035 sp<Camera1DeviceCb> deviceCb = new Camera1DeviceCb(this); 6036 Return<Status> returnStatus = (*device1)->open(deviceCb); 6037 ASSERT_TRUE(returnStatus.isOk()); 6038 ASSERT_EQ(Status::OK, returnStatus); 6039 } 6040 6041 // Initialize and configure a preview window. 6042 void CameraHidlTest::setupPreviewWindow( 6043 const sp<::android::hardware::camera::device::V1_0::ICameraDevice> &device, 6044 sp<BufferItemConsumer> *bufferItemConsumer /*out*/, 6045 sp<BufferItemHander> *bufferHandler /*out*/) { 6046 ASSERT_NE(nullptr, device.get()); 6047 ASSERT_NE(nullptr, bufferItemConsumer); 6048 ASSERT_NE(nullptr, bufferHandler); 6049 6050 sp<IGraphicBufferProducer> producer; 6051 sp<IGraphicBufferConsumer> consumer; 6052 BufferQueue::createBufferQueue(&producer, &consumer); 6053 *bufferItemConsumer = new BufferItemConsumer(consumer, 6054 GraphicBuffer::USAGE_HW_TEXTURE); //Use GLConsumer default usage flags 6055 ASSERT_NE(nullptr, (*bufferItemConsumer).get()); 6056 *bufferHandler = new BufferItemHander(*bufferItemConsumer); 6057 ASSERT_NE(nullptr, (*bufferHandler).get()); 6058 (*bufferItemConsumer)->setFrameAvailableListener(*bufferHandler); 6059 sp<Surface> surface = new Surface(producer); 6060 sp<PreviewWindowCb> previewCb = new PreviewWindowCb(surface); 6061 6062 auto rc = device->setPreviewWindow(previewCb); 6063 ASSERT_TRUE(rc.isOk()); 6064 ASSERT_EQ(Status::OK, rc); 6065 } 6066 6067 // Stop camera preview and close camera. 6068 void CameraHidlTest::stopPreviewAndClose( 6069 const sp<::android::hardware::camera::device::V1_0::ICameraDevice> &device) { 6070 Return<void> ret = device->stopPreview(); 6071 ASSERT_TRUE(ret.isOk()); 6072 6073 ret = device->close(); 6074 ASSERT_TRUE(ret.isOk()); 6075 } 6076 6077 // Enable a specific camera message type. 6078 void CameraHidlTest::enableMsgType(unsigned int msgType, 6079 const sp<::android::hardware::camera::device::V1_0::ICameraDevice> &device) { 6080 Return<void> ret = device->enableMsgType(msgType); 6081 ASSERT_TRUE(ret.isOk()); 6082 6083 Return<bool> returnBoolStatus = device->msgTypeEnabled(msgType); 6084 ASSERT_TRUE(returnBoolStatus.isOk()); 6085 ASSERT_TRUE(returnBoolStatus); 6086 } 6087 6088 // Disable a specific camera message type. 6089 void CameraHidlTest::disableMsgType(unsigned int msgType, 6090 const sp<::android::hardware::camera::device::V1_0::ICameraDevice> &device) { 6091 Return<void> ret = device->disableMsgType(msgType); 6092 ASSERT_TRUE(ret.isOk()); 6093 6094 Return<bool> returnBoolStatus = device->msgTypeEnabled(msgType); 6095 ASSERT_TRUE(returnBoolStatus.isOk()); 6096 ASSERT_FALSE(returnBoolStatus); 6097 } 6098 6099 // Wait until a specific frame notification arrives. 6100 void CameraHidlTest::waitForFrameLocked(DataCallbackMsg msgFrame, 6101 std::unique_lock<std::mutex> &l) { 6102 while (msgFrame != mDataMessageTypeReceived) { 6103 auto timeout = std::chrono::system_clock::now() + 6104 std::chrono::seconds(kStreamBufferTimeoutSec); 6105 ASSERT_NE(std::cv_status::timeout, 6106 mResultCondition.wait_until(l, timeout)); 6107 } 6108 } 6109 6110 // Start preview on a particular camera device 6111 void CameraHidlTest::startPreview( 6112 const sp<::android::hardware::camera::device::V1_0::ICameraDevice> &device) { 6113 Return<Status> returnStatus = device->startPreview(); 6114 ASSERT_TRUE(returnStatus.isOk()); 6115 ASSERT_EQ(Status::OK, returnStatus); 6116 } 6117 6118 // Retrieve camera parameters. 6119 void CameraHidlTest::getParameters( 6120 const sp<::android::hardware::camera::device::V1_0::ICameraDevice> &device, 6121 CameraParameters *cameraParams /*out*/) { 6122 ASSERT_NE(nullptr, cameraParams); 6123 6124 Return<void> ret; 6125 ret = device->getParameters([&] (const ::android::hardware::hidl_string& params) { 6126 ASSERT_FALSE(params.empty()); 6127 ::android::String8 paramString(params.c_str()); 6128 (*cameraParams).unflatten(paramString); 6129 }); 6130 ASSERT_TRUE(ret.isOk()); 6131 } 6132 6133 // Set camera parameters. 6134 void CameraHidlTest::setParameters( 6135 const sp<::android::hardware::camera::device::V1_0::ICameraDevice> &device, 6136 const CameraParameters &cameraParams) { 6137 Return<Status> returnStatus = device->setParameters( 6138 cameraParams.flatten().string()); 6139 ASSERT_TRUE(returnStatus.isOk()); 6140 ASSERT_EQ(Status::OK, returnStatus); 6141 } 6142 6143 void CameraHidlTest::allocateGraphicBuffer(uint32_t width, uint32_t height, uint64_t usage, 6144 PixelFormat format, hidl_handle *buffer_handle /*out*/) { 6145 ASSERT_NE(buffer_handle, nullptr); 6146 6147 sp<android::hardware::graphics::allocator::V2_0::IAllocator> allocator = 6148 android::hardware::graphics::allocator::V2_0::IAllocator::getService(); 6149 sp<android::hardware::graphics::allocator::V3_0::IAllocator> allocatorV3 = 6150 android::hardware::graphics::allocator::V3_0::IAllocator::getService(); 6151 6152 sp<android::hardware::graphics::mapper::V3_0::IMapper> mapperV3 = 6153 android::hardware::graphics::mapper::V3_0::IMapper::getService(); 6154 sp<android::hardware::graphics::mapper::V2_0::IMapper> mapper = 6155 android::hardware::graphics::mapper::V2_0::IMapper::getService(); 6156 ::android::hardware::hidl_vec<uint32_t> descriptor; 6157 if (mapperV3 != nullptr && allocatorV3 != nullptr) { 6158 android::hardware::graphics::mapper::V3_0::IMapper::BufferDescriptorInfo descriptorInfo {}; 6159 descriptorInfo.width = width; 6160 descriptorInfo.height = height; 6161 descriptorInfo.layerCount = 1; 6162 descriptorInfo.format = 6163 static_cast<android::hardware::graphics::common::V1_2::PixelFormat>(format); 6164 descriptorInfo.usage = usage; 6165 6166 auto ret = mapperV3->createDescriptor( 6167 descriptorInfo, [&descriptor](android::hardware::graphics::mapper::V3_0::Error err, 6168 ::android::hardware::hidl_vec<uint32_t> desc) { 6169 ASSERT_EQ(err, android::hardware::graphics::mapper::V3_0::Error::NONE); 6170 descriptor = desc; 6171 }); 6172 ASSERT_TRUE(ret.isOk()); 6173 6174 ret = allocatorV3->allocate(descriptor, 1u, 6175 [&](android::hardware::graphics::mapper::V3_0::Error err, uint32_t /*stride*/, 6176 const ::android::hardware::hidl_vec<::android::hardware::hidl_handle>& buffers) { 6177 ASSERT_EQ(android::hardware::graphics::mapper::V3_0::Error::NONE, err); 6178 ASSERT_EQ(buffers.size(), 1u); 6179 *buffer_handle = buffers[0]; 6180 }); 6181 ASSERT_TRUE(ret.isOk()); 6182 } else { 6183 ASSERT_NE(mapper.get(), nullptr); 6184 ASSERT_NE(allocator.get(), nullptr); 6185 android::hardware::graphics::mapper::V2_0::IMapper::BufferDescriptorInfo descriptorInfo {}; 6186 descriptorInfo.width = width; 6187 descriptorInfo.height = height; 6188 descriptorInfo.layerCount = 1; 6189 descriptorInfo.format = format; 6190 descriptorInfo.usage = usage; 6191 6192 auto ret = mapper->createDescriptor( 6193 descriptorInfo, [&descriptor](android::hardware::graphics::mapper::V2_0::Error err, 6194 ::android::hardware::hidl_vec<uint32_t> desc) { 6195 ASSERT_EQ(err, android::hardware::graphics::mapper::V2_0::Error::NONE); 6196 descriptor = desc; 6197 }); 6198 ASSERT_TRUE(ret.isOk()); 6199 6200 ret = allocator->allocate(descriptor, 1u, 6201 [&](android::hardware::graphics::mapper::V2_0::Error err, uint32_t /*stride*/, 6202 const ::android::hardware::hidl_vec<::android::hardware::hidl_handle>& buffers) { 6203 ASSERT_EQ(android::hardware::graphics::mapper::V2_0::Error::NONE, err); 6204 ASSERT_EQ(buffers.size(), 1u); 6205 *buffer_handle = buffers[0]; 6206 }); 6207 ASSERT_TRUE(ret.isOk()); 6208 } 6209 } 6210 6211 void CameraHidlTest::verifyRecommendedConfigs(const CameraMetadata& chars) { 6212 size_t CONFIG_ENTRY_SIZE = 5; 6213 size_t CONFIG_ENTRY_TYPE_OFFSET = 3; 6214 size_t CONFIG_ENTRY_BITFIELD_OFFSET = 4; 6215 uint32_t maxPublicUsecase = 6216 ANDROID_SCALER_AVAILABLE_RECOMMENDED_STREAM_CONFIGURATIONS_PUBLIC_END; 6217 uint32_t vendorUsecaseStart = 6218 ANDROID_SCALER_AVAILABLE_RECOMMENDED_STREAM_CONFIGURATIONS_VENDOR_START; 6219 uint32_t usecaseMask = (1 << vendorUsecaseStart) - 1; 6220 usecaseMask &= ~((1 << maxPublicUsecase) - 1); 6221 6222 const camera_metadata_t* metadata = reinterpret_cast<const camera_metadata_t*> (chars.data()); 6223 6224 camera_metadata_ro_entry recommendedConfigsEntry, recommendedDepthConfigsEntry, ioMapEntry; 6225 recommendedConfigsEntry.count = recommendedDepthConfigsEntry.count = ioMapEntry.count = 0; 6226 int retCode = find_camera_metadata_ro_entry(metadata, 6227 ANDROID_SCALER_AVAILABLE_RECOMMENDED_STREAM_CONFIGURATIONS, &recommendedConfigsEntry); 6228 int depthRetCode = find_camera_metadata_ro_entry(metadata, 6229 ANDROID_DEPTH_AVAILABLE_RECOMMENDED_DEPTH_STREAM_CONFIGURATIONS, 6230 &recommendedDepthConfigsEntry); 6231 int ioRetCode = find_camera_metadata_ro_entry(metadata, 6232 ANDROID_SCALER_AVAILABLE_RECOMMENDED_INPUT_OUTPUT_FORMATS_MAP, &ioMapEntry); 6233 if ((0 != retCode) && (0 != depthRetCode)) { 6234 //In case both regular and depth recommended configurations are absent, 6235 //I/O should be absent as well. 6236 ASSERT_NE(ioRetCode, 0); 6237 return; 6238 } 6239 6240 camera_metadata_ro_entry availableKeysEntry; 6241 retCode = find_camera_metadata_ro_entry(metadata, 6242 ANDROID_REQUEST_AVAILABLE_CHARACTERISTICS_KEYS, &availableKeysEntry); 6243 ASSERT_TRUE((0 == retCode) && (availableKeysEntry.count > 0)); 6244 std::vector<int32_t> availableKeys; 6245 availableKeys.reserve(availableKeysEntry.count); 6246 availableKeys.insert(availableKeys.end(), availableKeysEntry.data.i32, 6247 availableKeysEntry.data.i32 + availableKeysEntry.count); 6248 6249 if (recommendedConfigsEntry.count > 0) { 6250 ASSERT_NE(std::find(availableKeys.begin(), availableKeys.end(), 6251 ANDROID_SCALER_AVAILABLE_RECOMMENDED_STREAM_CONFIGURATIONS), 6252 availableKeys.end()); 6253 ASSERT_EQ((recommendedConfigsEntry.count % CONFIG_ENTRY_SIZE), 0); 6254 for (size_t i = 0; i < recommendedConfigsEntry.count; i += CONFIG_ENTRY_SIZE) { 6255 int32_t entryType = 6256 recommendedConfigsEntry.data.i32[i + CONFIG_ENTRY_TYPE_OFFSET]; 6257 uint32_t bitfield = 6258 recommendedConfigsEntry.data.i32[i + CONFIG_ENTRY_BITFIELD_OFFSET]; 6259 ASSERT_TRUE((entryType == 6260 ANDROID_SCALER_AVAILABLE_STREAM_CONFIGURATIONS_OUTPUT) || 6261 (entryType == 6262 ANDROID_SCALER_AVAILABLE_STREAM_CONFIGURATIONS_INPUT)); 6263 ASSERT_TRUE((bitfield & usecaseMask) == 0); 6264 } 6265 } 6266 6267 if (recommendedDepthConfigsEntry.count > 0) { 6268 ASSERT_NE(std::find(availableKeys.begin(), availableKeys.end(), 6269 ANDROID_DEPTH_AVAILABLE_RECOMMENDED_DEPTH_STREAM_CONFIGURATIONS), 6270 availableKeys.end()); 6271 ASSERT_EQ((recommendedDepthConfigsEntry.count % CONFIG_ENTRY_SIZE), 0); 6272 for (size_t i = 0; i < recommendedDepthConfigsEntry.count; i += CONFIG_ENTRY_SIZE) { 6273 int32_t entryType = 6274 recommendedDepthConfigsEntry.data.i32[i + CONFIG_ENTRY_TYPE_OFFSET]; 6275 uint32_t bitfield = 6276 recommendedDepthConfigsEntry.data.i32[i + CONFIG_ENTRY_BITFIELD_OFFSET]; 6277 ASSERT_TRUE((entryType == 6278 ANDROID_SCALER_AVAILABLE_STREAM_CONFIGURATIONS_OUTPUT) || 6279 (entryType == 6280 ANDROID_SCALER_AVAILABLE_STREAM_CONFIGURATIONS_INPUT)); 6281 ASSERT_TRUE((bitfield & usecaseMask) == 0); 6282 } 6283 6284 if (recommendedConfigsEntry.count == 0) { 6285 //In case regular recommended configurations are absent but suggested depth 6286 //configurations are present, I/O should be absent. 6287 ASSERT_NE(ioRetCode, 0); 6288 } 6289 } 6290 6291 if ((ioRetCode == 0) && (ioMapEntry.count > 0)) { 6292 ASSERT_NE(std::find(availableKeys.begin(), availableKeys.end(), 6293 ANDROID_SCALER_AVAILABLE_RECOMMENDED_INPUT_OUTPUT_FORMATS_MAP), 6294 availableKeys.end()); 6295 ASSERT_EQ(isZSLModeAvailable(metadata), Status::OK); 6296 } 6297 } 6298 6299 void CameraHidlTest::verifySessionReconfigurationQuery( 6300 sp<device::V3_5::ICameraDeviceSession> session3_5, camera_metadata* oldSessionParams, 6301 camera_metadata* newSessionParams) { 6302 ASSERT_NE(nullptr, session3_5.get()); 6303 ASSERT_NE(nullptr, oldSessionParams); 6304 ASSERT_NE(nullptr, newSessionParams); 6305 6306 android::hardware::hidl_vec<uint8_t> oldParams, newParams; 6307 oldParams.setToExternal(reinterpret_cast<uint8_t*>(oldSessionParams), 6308 get_camera_metadata_size(oldSessionParams)); 6309 newParams.setToExternal(reinterpret_cast<uint8_t*>(newSessionParams), 6310 get_camera_metadata_size(newSessionParams)); 6311 android::hardware::camera::common::V1_0::Status callStatus; 6312 auto hidlCb = [&callStatus] (android::hardware::camera::common::V1_0::Status s, 6313 bool /*requiredFlag*/) { 6314 callStatus = s; 6315 }; 6316 auto ret = session3_5->isReconfigurationRequired(oldParams, newParams, hidlCb); 6317 ASSERT_TRUE(ret.isOk()); 6318 switch (callStatus) { 6319 case android::hardware::camera::common::V1_0::Status::OK: 6320 case android::hardware::camera::common::V1_0::Status::METHOD_NOT_SUPPORTED: 6321 break; 6322 case android::hardware::camera::common::V1_0::Status::INTERNAL_ERROR: 6323 default: 6324 ADD_FAILURE() << "Query calllback failed"; 6325 } 6326 } 6327 6328 int main(int argc, char **argv) { 6329 ::testing::AddGlobalTestEnvironment(CameraHidlEnvironment::Instance()); 6330 ::testing::InitGoogleTest(&argc, argv); 6331 CameraHidlEnvironment::Instance()->init(&argc, argv); 6332 int status = RUN_ALL_TESTS(); 6333 ALOGI("Test result = %d", status); 6334 return status; 6335 } 6336