1 /* 2 * Copyright (C) 2015 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_NDEBUG 0 18 #define LOG_TAG "NativeCamera" 19 #include <log/log.h> 20 21 #include <chrono> 22 #include <condition_variable> 23 #include <string> 24 #include <map> 25 #include <mutex> 26 #include <vector> 27 #include <unistd.h> 28 #include <assert.h> 29 #include <jni.h> 30 #include <stdio.h> 31 #include <string.h> 32 33 #include <android/native_window_jni.h> 34 35 #include "camera/NdkCameraError.h" 36 #include "camera/NdkCameraManager.h" 37 #include "camera/NdkCameraDevice.h" 38 #include "camera/NdkCameraCaptureSession.h" 39 #include "media/NdkImage.h" 40 #include "media/NdkImageReader.h" 41 42 #define LOG_ERROR(buf, ...) sprintf(buf, __VA_ARGS__); \ 43 ALOGE("%s", buf); 44 45 namespace { 46 const int MAX_ERROR_STRING_LEN = 512; 47 char errorString[MAX_ERROR_STRING_LEN]; 48 } 49 50 class CameraServiceListener { 51 public: 52 static void onAvailable(void* obj, const char* cameraId) { 53 ALOGV("Camera %s onAvailable", cameraId); 54 if (obj == nullptr) { 55 return; 56 } 57 CameraServiceListener* thiz = reinterpret_cast<CameraServiceListener*>(obj); 58 std::lock_guard<std::mutex> lock(thiz->mMutex); 59 thiz->mOnAvailableCount++; 60 thiz->mAvailableMap[cameraId] = true; 61 return; 62 } 63 64 static void onUnavailable(void* obj, const char* cameraId) { 65 ALOGV("Camera %s onUnavailable", cameraId); 66 if (obj == nullptr) { 67 return; 68 } 69 CameraServiceListener* thiz = reinterpret_cast<CameraServiceListener*>(obj); 70 std::lock_guard<std::mutex> lock(thiz->mMutex); 71 thiz->mOnUnavailableCount++; 72 thiz->mAvailableMap[cameraId] = false; 73 return; 74 } 75 76 void resetCount() { 77 std::lock_guard<std::mutex> lock(mMutex); 78 mOnAvailableCount = 0; 79 mOnUnavailableCount = 0; 80 return; 81 } 82 83 int getAvailableCount() { 84 std::lock_guard<std::mutex> lock(mMutex); 85 return mOnAvailableCount; 86 } 87 88 int getUnavailableCount() { 89 std::lock_guard<std::mutex> lock(mMutex); 90 return mOnUnavailableCount; 91 } 92 93 bool isAvailable(const char* cameraId) { 94 std::lock_guard<std::mutex> lock(mMutex); 95 if (mAvailableMap.count(cameraId) == 0) { 96 return false; 97 } 98 return mAvailableMap[cameraId]; 99 } 100 101 private: 102 std::mutex mMutex; 103 int mOnAvailableCount = 0; 104 int mOnUnavailableCount = 0; 105 std::map<std::string, bool> mAvailableMap; 106 }; 107 108 class CameraDeviceListener { 109 public: 110 static void onDisconnected(void* obj, ACameraDevice* device) { 111 ALOGV("Camera %s is disconnected!", ACameraDevice_getId(device)); 112 if (obj == nullptr) { 113 return; 114 } 115 CameraDeviceListener* thiz = reinterpret_cast<CameraDeviceListener*>(obj); 116 std::lock_guard<std::mutex> lock(thiz->mMutex); 117 thiz->mOnDisconnect++; 118 return; 119 } 120 121 static void onError(void* obj, ACameraDevice* device, int errorCode) { 122 ALOGV("Camera %s receive error %d!", ACameraDevice_getId(device), errorCode); 123 if (obj == nullptr) { 124 return; 125 } 126 CameraDeviceListener* thiz = reinterpret_cast<CameraDeviceListener*>(obj); 127 std::lock_guard<std::mutex> lock(thiz->mMutex); 128 thiz->mOnError++; 129 thiz->mLatestError = errorCode; 130 return; 131 } 132 133 private: 134 std::mutex mMutex; 135 int mOnDisconnect = 0; 136 int mOnError = 0; 137 int mLatestError = 0; 138 }; 139 140 class CaptureSessionListener { 141 142 public: 143 static void onClosed(void* obj, ACameraCaptureSession *session) { 144 // TODO: might want an API to query cameraId even session is closed? 145 ALOGV("Session %p is closed!", session); 146 if (obj == nullptr) { 147 return; 148 } 149 CaptureSessionListener* thiz = reinterpret_cast<CaptureSessionListener*>(obj); 150 std::lock_guard<std::mutex> lock(thiz->mMutex); 151 thiz->mIsClosed = true; 152 thiz->mOnClosed++; // Should never > 1 153 } 154 155 static void onReady(void* obj, ACameraCaptureSession *session) { 156 ALOGV("%s", __FUNCTION__); 157 if (obj == nullptr) { 158 return; 159 } 160 CaptureSessionListener* thiz = reinterpret_cast<CaptureSessionListener*>(obj); 161 std::lock_guard<std::mutex> lock(thiz->mMutex); 162 ACameraDevice* device = nullptr; 163 camera_status_t ret = ACameraCaptureSession_getDevice(session, &device); 164 // There will be one onReady fired after session closed 165 if (ret != ACAMERA_OK && !thiz->mIsClosed) { 166 ALOGE("%s Getting camera device from session callback failed!", 167 __FUNCTION__); 168 thiz->mInError = true; 169 } 170 ALOGV("Session for camera %s is ready!", ACameraDevice_getId(device)); 171 thiz->mIsIdle = true; 172 thiz->mOnReady++; 173 } 174 175 static void onActive(void* obj, ACameraCaptureSession *session) { 176 ALOGV("%s", __FUNCTION__); 177 if (obj == nullptr) { 178 return; 179 } 180 CaptureSessionListener* thiz = reinterpret_cast<CaptureSessionListener*>(obj); 181 std::lock_guard<std::mutex> lock(thiz->mMutex); 182 ACameraDevice* device = nullptr; 183 camera_status_t ret = ACameraCaptureSession_getDevice(session, &device); 184 if (ret != ACAMERA_OK) { 185 ALOGE("%s Getting camera device from session callback failed!", 186 __FUNCTION__); 187 thiz->mInError = true; 188 } 189 ALOGV("Session for camera %s is busy!", ACameraDevice_getId(device)); 190 thiz->mIsIdle = false; 191 thiz->mOnActive; 192 } 193 194 bool isClosed() { 195 std::lock_guard<std::mutex> lock(mMutex); 196 return mIsClosed; 197 } 198 199 bool isIdle() { 200 std::lock_guard<std::mutex> lock(mMutex); 201 return mIsIdle; 202 } 203 204 bool isInError() { 205 std::lock_guard<std::mutex> lock(mMutex); 206 return mInError; 207 } 208 209 int onClosedCount() { 210 std::lock_guard<std::mutex> lock(mMutex); 211 return mOnClosed; 212 } 213 214 int onReadyCount() { 215 std::lock_guard<std::mutex> lock(mMutex); 216 return mOnReady; 217 } 218 219 int onActiveCount() { 220 std::lock_guard<std::mutex> lock(mMutex); 221 return mOnActive; 222 } 223 224 void reset() { 225 std::lock_guard<std::mutex> lock(mMutex); 226 mIsClosed = false; 227 mIsIdle = true; 228 mInError = false; 229 mOnClosed = 0; 230 mOnReady = 0; 231 mOnActive = 0; 232 } 233 234 private: 235 std::mutex mMutex; 236 bool mIsClosed = false; 237 bool mIsIdle = true; 238 bool mInError = false; // should always stay false 239 int mOnClosed = 0; 240 int mOnReady = 0; 241 int mOnActive = 0; 242 }; 243 244 class CaptureResultListener { 245 public: 246 ~CaptureResultListener() { 247 std::unique_lock<std::mutex> l(mMutex); 248 clearSavedRequestsLocked(); 249 } 250 251 static void onCaptureStart(void* /*obj*/, ACameraCaptureSession* /*session*/, 252 const ACaptureRequest* /*request*/, int64_t /*timestamp*/) { 253 //Not used for now 254 } 255 256 static void onCaptureProgressed(void* /*obj*/, ACameraCaptureSession* /*session*/, 257 ACaptureRequest* /*request*/, const ACameraMetadata* /*result*/) { 258 //Not used for now 259 } 260 261 static void onCaptureCompleted(void* obj, ACameraCaptureSession* /*session*/, 262 ACaptureRequest* request, const ACameraMetadata* result) { 263 ALOGV("%s", __FUNCTION__); 264 if ((obj == nullptr) || (result == nullptr)) { 265 return; 266 } 267 CaptureResultListener* thiz = reinterpret_cast<CaptureResultListener*>(obj); 268 std::lock_guard<std::mutex> lock(thiz->mMutex); 269 ACameraMetadata_const_entry entry; 270 auto ret = ACameraMetadata_getConstEntry(result, ACAMERA_SYNC_FRAME_NUMBER, &entry); 271 if (ret != ACAMERA_OK) { 272 ALOGE("Error: Sync frame number missing from result!"); 273 return; 274 } 275 276 if (thiz->mSaveCompletedRequests) { 277 thiz->mCompletedRequests.push_back(ACaptureRequest_copy(request)); 278 } 279 280 thiz->mLastCompletedFrameNumber = entry.data.i64[0]; 281 thiz->mResultCondition.notify_one(); 282 } 283 284 static void onCaptureFailed(void* obj, ACameraCaptureSession* /*session*/, 285 ACaptureRequest* /*request*/, ACameraCaptureFailure* failure) { 286 ALOGV("%s", __FUNCTION__); 287 if ((obj == nullptr) || (failure == nullptr)) { 288 return; 289 } 290 CaptureResultListener* thiz = reinterpret_cast<CaptureResultListener*>(obj); 291 std::lock_guard<std::mutex> lock(thiz->mMutex); 292 thiz->mLastFailedFrameNumber = failure->frameNumber; 293 thiz->mResultCondition.notify_one(); 294 } 295 296 static void onCaptureSequenceCompleted(void* obj, ACameraCaptureSession* /*session*/, 297 int sequenceId, int64_t frameNumber) { 298 ALOGV("%s", __FUNCTION__); 299 if (obj == nullptr) { 300 return; 301 } 302 CaptureResultListener* thiz = reinterpret_cast<CaptureResultListener*>(obj); 303 std::lock_guard<std::mutex> lock(thiz->mMutex); 304 thiz->mLastSequenceIdCompleted = sequenceId; 305 thiz->mLastSequenceFrameNumber = frameNumber; 306 thiz->mResultCondition.notify_one(); 307 } 308 309 static void onCaptureSequenceAborted(void* /*obj*/, ACameraCaptureSession* /*session*/, 310 int /*sequenceId*/) { 311 //Not used for now 312 } 313 314 static void onCaptureBufferLost(void* obj, ACameraCaptureSession* /*session*/, 315 ACaptureRequest* /*request*/, ANativeWindow* /*window*/, int64_t frameNumber) { 316 ALOGV("%s", __FUNCTION__); 317 if (obj == nullptr) { 318 return; 319 } 320 CaptureResultListener* thiz = reinterpret_cast<CaptureResultListener*>(obj); 321 std::lock_guard<std::mutex> lock(thiz->mMutex); 322 thiz->mLastLostFrameNumber = frameNumber; 323 thiz->mResultCondition.notify_one(); 324 } 325 326 int64_t getCaptureSequenceLastFrameNumber(int64_t sequenceId, uint32_t timeoutSec) { 327 int64_t ret = -1; 328 std::unique_lock<std::mutex> l(mMutex); 329 330 while (mLastSequenceIdCompleted != sequenceId) { 331 auto timeout = std::chrono::system_clock::now() + 332 std::chrono::seconds(timeoutSec); 333 if (std::cv_status::timeout == mResultCondition.wait_until(l, timeout)) { 334 break; 335 } 336 } 337 338 if (mLastSequenceIdCompleted == sequenceId) { 339 ret = mLastSequenceFrameNumber; 340 } 341 342 return ret; 343 } 344 345 bool waitForFrameNumber(int64_t frameNumber, uint32_t timeoutSec) { 346 bool ret = false; 347 std::unique_lock<std::mutex> l(mMutex); 348 349 while ((mLastCompletedFrameNumber != frameNumber) && 350 (mLastLostFrameNumber != frameNumber) && 351 (mLastFailedFrameNumber != frameNumber)) { 352 auto timeout = std::chrono::system_clock::now() + 353 std::chrono::seconds(timeoutSec); 354 if (std::cv_status::timeout == mResultCondition.wait_until(l, timeout)) { 355 break; 356 } 357 } 358 359 if ((mLastCompletedFrameNumber == frameNumber) || 360 (mLastLostFrameNumber == frameNumber) || 361 (mLastFailedFrameNumber == frameNumber)) { 362 ret = true; 363 } 364 365 return ret; 366 } 367 368 void setRequestSave(bool enable) { 369 std::unique_lock<std::mutex> l(mMutex); 370 if (!enable) { 371 clearSavedRequestsLocked(); 372 } 373 mSaveCompletedRequests = enable; 374 } 375 376 // The lifecycle of returned ACaptureRequest* is still managed by CaptureResultListener 377 void getCompletedRequests(std::vector<ACaptureRequest*>* out) { 378 std::unique_lock<std::mutex> l(mMutex); 379 *out = mCompletedRequests; 380 } 381 382 void reset() { 383 std::lock_guard<std::mutex> lock(mMutex); 384 mLastSequenceIdCompleted = -1; 385 mLastSequenceFrameNumber = -1; 386 mLastCompletedFrameNumber = -1; 387 mLastLostFrameNumber = -1; 388 mLastFailedFrameNumber = -1; 389 mSaveCompletedRequests = false; 390 clearSavedRequestsLocked(); 391 } 392 393 private: 394 std::mutex mMutex; 395 std::condition_variable mResultCondition; 396 int mLastSequenceIdCompleted = -1; 397 int64_t mLastSequenceFrameNumber = -1; 398 int64_t mLastCompletedFrameNumber = -1; 399 int64_t mLastLostFrameNumber = -1; 400 int64_t mLastFailedFrameNumber = -1; 401 bool mSaveCompletedRequests = false; 402 std::vector<ACaptureRequest*> mCompletedRequests; 403 404 void clearSavedRequestsLocked() { 405 for (ACaptureRequest* req : mCompletedRequests) { 406 ACaptureRequest_free(req); 407 } 408 mCompletedRequests.clear(); 409 } 410 }; 411 412 class ImageReaderListener { 413 public: 414 // count, acquire, validate, and delete AImage when a new image is available 415 static void validateImageCb(void* obj, AImageReader* reader) { 416 ALOGV("%s", __FUNCTION__); 417 if (obj == nullptr) { 418 return; 419 } 420 ImageReaderListener* thiz = reinterpret_cast<ImageReaderListener*>(obj); 421 std::lock_guard<std::mutex> lock(thiz->mMutex); 422 thiz->mOnImageAvailableCount++; 423 424 AImage* img = nullptr; 425 media_status_t ret = AImageReader_acquireNextImage(reader, &img); 426 if (ret != AMEDIA_OK || img == nullptr) { 427 ALOGE("%s: acquire image from reader %p failed! ret: %d, img %p", 428 __FUNCTION__, reader, ret, img); 429 return; 430 } 431 432 // TODO: validate image content 433 int32_t format = -1; 434 ret = AImage_getFormat(img, &format); 435 if (ret != AMEDIA_OK || format == -1) { 436 ALOGE("%s: get format for image %p failed! ret: %d, format %d", 437 __FUNCTION__, img, ret, format); 438 } 439 440 // Save jpeg to SD card 441 if (thiz->mDumpFilePathBase && format == AIMAGE_FORMAT_JPEG) { 442 int32_t numPlanes = 0; 443 ret = AImage_getNumberOfPlanes(img, &numPlanes); 444 if (ret != AMEDIA_OK || numPlanes != 1) { 445 ALOGE("%s: get numPlanes for image %p failed! ret: %d, numPlanes %d", 446 __FUNCTION__, img, ret, numPlanes); 447 AImage_delete(img); 448 return; 449 } 450 451 int32_t width = -1, height = -1; 452 ret = AImage_getWidth(img, &width); 453 if (ret != AMEDIA_OK || width <= 0) { 454 ALOGE("%s: get width for image %p failed! ret: %d, width %d", 455 __FUNCTION__, img, ret, width); 456 AImage_delete(img); 457 return; 458 } 459 460 ret = AImage_getHeight(img, &height); 461 if (ret != AMEDIA_OK || height <= 0) { 462 ALOGE("%s: get height for image %p failed! ret: %d, height %d", 463 __FUNCTION__, img, ret, height); 464 AImage_delete(img); 465 return; 466 } 467 468 uint8_t* data = nullptr; 469 int dataLength = 0; 470 ret = AImage_getPlaneData(img, /*planeIdx*/0, &data, &dataLength); 471 if (ret != AMEDIA_OK || data == nullptr || dataLength <= 0) { 472 ALOGE("%s: get jpeg data for image %p failed! ret: %d, data %p, len %d", 473 __FUNCTION__, img, ret, data, dataLength); 474 AImage_delete(img); 475 return; 476 } 477 478 #if 0 479 char dumpFilePath[512]; 480 sprintf(dumpFilePath, "%s/%dx%d.jpg", thiz->mDumpFilePathBase, width, height); 481 ALOGI("Writing jpeg file to %s", dumpFilePath); 482 FILE* file = fopen(dumpFilePath,"w+"); 483 484 if (file != nullptr) { 485 fwrite(data, 1, dataLength, file); 486 fflush(file); 487 fclose(file); 488 } 489 #endif 490 } 491 492 AImage_delete(img); 493 } 494 495 // count, acquire image but not delete the image 496 static void acquireImageCb(void* obj, AImageReader* reader) { 497 ALOGV("%s", __FUNCTION__); 498 if (obj == nullptr) { 499 return; 500 } 501 ImageReaderListener* thiz = reinterpret_cast<ImageReaderListener*>(obj); 502 std::lock_guard<std::mutex> lock(thiz->mMutex); 503 thiz->mOnImageAvailableCount++; 504 505 // Acquire, but not closing. 506 AImage* img = nullptr; 507 media_status_t ret = AImageReader_acquireNextImage(reader, &img); 508 if (ret != AMEDIA_OK || img == nullptr) { 509 ALOGE("%s: acquire image from reader %p failed! ret: %d, img %p", 510 __FUNCTION__, reader, ret, img); 511 return; 512 } 513 return; 514 } 515 516 int onImageAvailableCount() { 517 std::lock_guard<std::mutex> lock(mMutex); 518 return mOnImageAvailableCount; 519 } 520 521 void setDumpFilePathBase(const char* path) { 522 std::lock_guard<std::mutex> lock(mMutex); 523 mDumpFilePathBase = path; 524 } 525 526 private: 527 // TODO: add mReader to make sure each listener is associated to one reader? 528 std::mutex mMutex; 529 int mOnImageAvailableCount = 0; 530 const char* mDumpFilePathBase = nullptr; 531 }; 532 533 class StaticInfo { 534 public: 535 explicit StaticInfo(ACameraMetadata* chars) : mChars(chars) {} 536 537 bool isColorOutputSupported() { 538 return isCapabilitySupported(ACAMERA_REQUEST_AVAILABLE_CAPABILITIES_BACKWARD_COMPATIBLE); 539 } 540 541 bool isCapabilitySupported(acamera_metadata_enum_android_request_available_capabilities_t cap) { 542 ACameraMetadata_const_entry entry; 543 ACameraMetadata_getConstEntry(mChars, ACAMERA_REQUEST_AVAILABLE_CAPABILITIES, &entry); 544 for (uint32_t i = 0; i < entry.count; i++) { 545 if (entry.data.u8[i] == cap) { 546 return true; 547 } 548 } 549 return false; 550 } 551 private: 552 const ACameraMetadata* mChars; 553 }; 554 555 class PreviewTestCase { 556 public: 557 ~PreviewTestCase() { 558 resetCamera(); 559 deInit(); 560 if (mCameraManager) { 561 ACameraManager_delete(mCameraManager); 562 mCameraManager = nullptr; 563 } 564 } 565 566 PreviewTestCase() { 567 // create is guaranteed to succeed; 568 createManager(); 569 } 570 571 // Free all resources except camera manager 572 void resetCamera() { 573 mSessionListener.reset(); 574 mResultListener.reset(); 575 if (mSession) { 576 ACameraCaptureSession_close(mSession); 577 mSession = nullptr; 578 } 579 if (mDevice) { 580 ACameraDevice_close(mDevice); 581 mDevice = nullptr; 582 } 583 if (mImgReader) { 584 AImageReader_delete(mImgReader); 585 // No need to call ANativeWindow_release on imageReaderAnw 586 mImgReaderAnw = nullptr; 587 mImgReader = nullptr; 588 } 589 if (mPreviewAnw) { 590 ANativeWindow_release(mPreviewAnw); 591 mPreviewAnw = nullptr; 592 } 593 if (mOutputs) { 594 ACaptureSessionOutputContainer_free(mOutputs); 595 mOutputs = nullptr; 596 } 597 if (mPreviewOutput) { 598 ACaptureSessionOutput_free(mPreviewOutput); 599 mPreviewOutput = nullptr; 600 } 601 if (mImgReaderOutput) { 602 ACaptureSessionOutput_free(mImgReaderOutput); 603 mImgReaderOutput = nullptr; 604 } 605 if (mPreviewRequest) { 606 ACaptureRequest_free(mPreviewRequest); 607 mPreviewRequest = nullptr; 608 } 609 if (mStillRequest) { 610 ACaptureRequest_free(mStillRequest); 611 mStillRequest = nullptr; 612 } 613 if (mReqPreviewOutput) { 614 ACameraOutputTarget_free(mReqPreviewOutput); 615 mReqPreviewOutput = nullptr; 616 } 617 if (mReqImgReaderOutput) { 618 ACameraOutputTarget_free(mReqImgReaderOutput); 619 mReqImgReaderOutput = nullptr; 620 } 621 622 mImgReaderInited = false; 623 mPreviewInited = false; 624 } 625 626 camera_status_t initWithErrorLog() { 627 camera_status_t ret = ACameraManager_getCameraIdList( 628 mCameraManager, &mCameraIdList); 629 if (ret != ACAMERA_OK) { 630 LOG_ERROR(errorString, "Get camera id list failed: ret %d", ret); 631 return ret; 632 } 633 ret = ACameraManager_registerAvailabilityCallback(mCameraManager, &mServiceCb); 634 if (ret != ACAMERA_OK) { 635 LOG_ERROR(errorString, "Register availability callback failed: ret %d", ret); 636 return ret; 637 } 638 mMgrInited = true; 639 return ACAMERA_OK; 640 } 641 642 camera_status_t deInit () { 643 if (!mMgrInited) { 644 return ACAMERA_OK; 645 } 646 647 camera_status_t ret = ACameraManager_unregisterAvailabilityCallback( 648 mCameraManager, &mServiceCb); 649 if (ret != ACAMERA_OK) { 650 ALOGE("Unregister availability callback failed: ret %d", ret); 651 return ret; 652 } 653 654 if (mCameraIdList) { 655 ACameraManager_deleteCameraIdList(mCameraIdList); 656 mCameraIdList = nullptr; 657 } 658 mMgrInited = false; 659 return ACAMERA_OK; 660 } 661 662 int getNumCameras() { 663 if (!mMgrInited || !mCameraIdList) { 664 return -1; 665 } 666 return mCameraIdList->numCameras; 667 } 668 669 const char* getCameraId(int idx) { 670 if (!mMgrInited || !mCameraIdList || idx < 0 || idx >= mCameraIdList->numCameras) { 671 return nullptr; 672 } 673 return mCameraIdList->cameraIds[idx]; 674 } 675 676 camera_status_t updateOutput(JNIEnv* env, ACaptureSessionOutput *output) { 677 if (mSession == nullptr) { 678 ALOGE("Testcase cannot update output configuration session %p", 679 mSession); 680 return ACAMERA_ERROR_UNKNOWN; 681 } 682 683 return ACameraCaptureSession_updateSharedOutput(mSession, output); 684 } 685 686 camera_status_t openCamera(const char* cameraId) { 687 if (mDevice) { 688 ALOGE("Cannot open camera before closing previously open one"); 689 return ACAMERA_ERROR_INVALID_PARAMETER; 690 } 691 mCameraId = cameraId; 692 return ACameraManager_openCamera(mCameraManager, cameraId, &mDeviceCb, &mDevice); 693 } 694 695 camera_status_t closeCamera() { 696 camera_status_t ret = ACameraDevice_close(mDevice); 697 mDevice = nullptr; 698 return ret; 699 } 700 701 bool isCameraAvailable(const char* cameraId) { 702 if (!mMgrInited) { 703 ALOGE("Camera service listener has not been registered!"); 704 } 705 return mServiceListener.isAvailable(cameraId); 706 } 707 708 media_status_t initImageReaderWithErrorLog( 709 int32_t width, int32_t height, int32_t format, int32_t maxImages, 710 AImageReader_ImageListener* listener) { 711 if (mImgReader || mImgReaderAnw) { 712 LOG_ERROR(errorString, "Cannot init image reader before closing existing one"); 713 return AMEDIA_ERROR_UNKNOWN; 714 } 715 716 media_status_t ret = AImageReader_new( 717 width, height, format, 718 maxImages, &mImgReader); 719 if (ret != AMEDIA_OK) { 720 LOG_ERROR(errorString, "Create image reader. ret %d", ret); 721 return ret; 722 } 723 if (mImgReader == nullptr) { 724 LOG_ERROR(errorString, "null image reader created"); 725 return AMEDIA_ERROR_UNKNOWN; 726 } 727 728 ret = AImageReader_setImageListener(mImgReader, listener); 729 if (ret != AMEDIA_OK) { 730 LOG_ERROR(errorString, "Set AImageReader listener failed. ret %d", ret); 731 return ret; 732 } 733 734 ret = AImageReader_getWindow(mImgReader, &mImgReaderAnw); 735 if (ret != AMEDIA_OK) { 736 LOG_ERROR(errorString, "AImageReader_getWindow failed. ret %d", ret); 737 return ret; 738 } 739 if (mImgReaderAnw == nullptr) { 740 LOG_ERROR(errorString, "Null ANW from AImageReader!"); 741 return AMEDIA_ERROR_UNKNOWN; 742 } 743 mImgReaderInited = true; 744 return AMEDIA_OK; 745 } 746 747 ANativeWindow* initPreviewAnw(JNIEnv* env, jobject jSurface) { 748 if (mPreviewAnw) { 749 ALOGE("Cannot init preview twice!"); 750 return nullptr; 751 } 752 mPreviewAnw = ANativeWindow_fromSurface(env, jSurface); 753 mPreviewInited = true; 754 return mPreviewAnw; 755 } 756 757 camera_status_t createCaptureSessionWithLog(bool isPreviewShared = false, 758 ACaptureRequest *sessionParameters = nullptr) { 759 if (mSession) { 760 LOG_ERROR(errorString, "Cannot create session before closing existing one"); 761 return ACAMERA_ERROR_UNKNOWN; 762 } 763 764 if (!mMgrInited || (!mImgReaderInited && !mPreviewInited)) { 765 LOG_ERROR(errorString, "Cannot create session. mgrInit %d readerInit %d previewInit %d", 766 mMgrInited, mImgReaderInited, mPreviewInited); 767 return ACAMERA_ERROR_UNKNOWN; 768 } 769 770 camera_status_t ret = ACaptureSessionOutputContainer_create(&mOutputs); 771 if (ret != ACAMERA_OK) { 772 LOG_ERROR(errorString, "Create capture session output container failed. ret %d", ret); 773 return ret; 774 } 775 776 if (mImgReaderInited) { 777 ret = ACaptureSessionOutput_create(mImgReaderAnw, &mImgReaderOutput); 778 if (ret != ACAMERA_OK || mImgReaderOutput == nullptr) { 779 LOG_ERROR(errorString, 780 "Sesssion image reader output create fail! ret %d output %p", 781 ret, mImgReaderOutput); 782 if (ret == ACAMERA_OK) { 783 ret = ACAMERA_ERROR_UNKNOWN; // ret OK but output is null 784 } 785 return ret; 786 } 787 788 ret = ACaptureSessionOutputContainer_add(mOutputs, mImgReaderOutput); 789 if (ret != ACAMERA_OK) { 790 LOG_ERROR(errorString, "Sesssion image reader output add failed! ret %d", ret); 791 return ret; 792 } 793 } 794 795 if (mPreviewInited) { 796 if (isPreviewShared) { 797 ret = ACaptureSessionSharedOutput_create(mPreviewAnw, &mPreviewOutput); 798 } else { 799 ret = ACaptureSessionOutput_create(mPreviewAnw, &mPreviewOutput); 800 } 801 if (ret != ACAMERA_OK || mPreviewOutput == nullptr) { 802 LOG_ERROR(errorString, 803 "Sesssion preview output create fail! ret %d output %p", 804 ret, mPreviewOutput); 805 if (ret == ACAMERA_OK) { 806 ret = ACAMERA_ERROR_UNKNOWN; // ret OK but output is null 807 } 808 return ret; 809 } 810 811 ret = ACaptureSessionOutputContainer_add(mOutputs, mPreviewOutput); 812 if (ret != ACAMERA_OK) { 813 LOG_ERROR(errorString, "Sesssion preview output add failed! ret %d", ret); 814 return ret; 815 } 816 } 817 818 ret = ACameraDevice_createCaptureSessionWithSessionParameters( 819 mDevice, mOutputs, sessionParameters, &mSessionCb, &mSession); 820 if (ret != ACAMERA_OK || mSession == nullptr) { 821 LOG_ERROR(errorString, "Create session for camera %s failed. ret %d session %p", 822 mCameraId, ret, mSession); 823 if (ret == ACAMERA_OK) { 824 ret = ACAMERA_ERROR_UNKNOWN; // ret OK but session is null 825 } 826 return ret; 827 } 828 829 return ACAMERA_OK; 830 } 831 832 void closeSession() { 833 if (mSession != nullptr) { 834 ACameraCaptureSession_close(mSession); 835 } 836 if (mOutputs) { 837 ACaptureSessionOutputContainer_free(mOutputs); 838 mOutputs = nullptr; 839 } 840 if (mPreviewOutput) { 841 ACaptureSessionOutput_free(mPreviewOutput); 842 mPreviewOutput = nullptr; 843 } 844 if (mImgReaderOutput) { 845 ACaptureSessionOutput_free(mImgReaderOutput); 846 mImgReaderOutput = nullptr; 847 } 848 mSession = nullptr; 849 } 850 851 camera_status_t createRequestsWithErrorLog() { 852 if (mPreviewRequest || mStillRequest) { 853 LOG_ERROR(errorString, "Cannot create requests before deleteing existing one"); 854 return ACAMERA_ERROR_UNKNOWN; 855 } 856 857 if (mDevice == nullptr || (!mPreviewInited && !mImgReaderInited)) { 858 LOG_ERROR(errorString, 859 "Cannot create request. device %p previewInit %d readeInit %d", 860 mDevice, mPreviewInited, mImgReaderInited); 861 return ACAMERA_ERROR_UNKNOWN; 862 } 863 864 camera_status_t ret; 865 if (mPreviewInited) { 866 ret = ACameraDevice_createCaptureRequest( 867 mDevice, TEMPLATE_PREVIEW, &mPreviewRequest); 868 if (ret != ACAMERA_OK) { 869 LOG_ERROR(errorString, "Camera %s create preview request failed. ret %d", 870 mCameraId, ret); 871 return ret; 872 } 873 874 ret = ACameraOutputTarget_create(mPreviewAnw, &mReqPreviewOutput); 875 if (ret != ACAMERA_OK) { 876 LOG_ERROR(errorString, 877 "Camera %s create request preview output target failed. ret %d", 878 mCameraId, ret); 879 return ret; 880 } 881 882 ret = ACaptureRequest_addTarget(mPreviewRequest, mReqPreviewOutput); 883 if (ret != ACAMERA_OK) { 884 LOG_ERROR(errorString, "Camera %s add preview request output failed. ret %d", 885 mCameraId, ret); 886 return ret; 887 } 888 } else { 889 ALOGI("Preview not inited. Will not create preview request!"); 890 } 891 892 if (mImgReaderInited) { 893 ret = ACameraDevice_createCaptureRequest( 894 mDevice, TEMPLATE_STILL_CAPTURE, &mStillRequest); 895 if (ret != ACAMERA_OK) { 896 LOG_ERROR(errorString, "Camera %s create still request failed. ret %d", 897 mCameraId, ret); 898 return ret; 899 } 900 901 ret = ACameraOutputTarget_create(mImgReaderAnw, &mReqImgReaderOutput); 902 if (ret != ACAMERA_OK) { 903 LOG_ERROR(errorString, 904 "Camera %s create request reader output target failed. ret %d", 905 mCameraId, ret); 906 return ret; 907 } 908 909 ret = ACaptureRequest_addTarget(mStillRequest, mReqImgReaderOutput); 910 if (ret != ACAMERA_OK) { 911 LOG_ERROR(errorString, "Camera %s add still request output failed. ret %d", 912 mCameraId, ret); 913 return ret; 914 } 915 916 if (mPreviewInited) { 917 ret = ACaptureRequest_addTarget(mStillRequest, mReqPreviewOutput); 918 if (ret != ACAMERA_OK) { 919 LOG_ERROR(errorString, 920 "Camera %s add still request preview output failed. ret %d", 921 mCameraId, ret); 922 return ret; 923 } 924 } 925 } else { 926 ALOGI("AImageReader not inited. Will not create still request!"); 927 } 928 929 return ACAMERA_OK; 930 } 931 932 // The output ACaptureRequest* is still managed by testcase class 933 camera_status_t getStillRequest(ACaptureRequest** out) { 934 if (mStillRequest == nullptr) { 935 ALOGE("Camera %s Still capture request hasn't been created", mCameraId); 936 return ACAMERA_ERROR_INVALID_PARAMETER; 937 } 938 *out = mStillRequest; 939 return ACAMERA_OK; 940 } 941 942 camera_status_t getPreviewRequest(ACaptureRequest** out) { 943 if (mPreviewRequest == nullptr) { 944 ALOGE("Camera %s Preview capture request hasn't been created", mCameraId); 945 return ACAMERA_ERROR_INVALID_PARAMETER; 946 } 947 *out = mPreviewRequest; 948 return ACAMERA_OK; 949 } 950 951 camera_status_t startPreview(int *sequenceId = nullptr) { 952 if (mSession == nullptr || mPreviewRequest == nullptr) { 953 ALOGE("Testcase cannot start preview: session %p, preview request %p", 954 mSession, mPreviewRequest); 955 return ACAMERA_ERROR_UNKNOWN; 956 } 957 int previewSeqId; 958 camera_status_t ret; 959 if (sequenceId == nullptr) { 960 ret = ACameraCaptureSession_setRepeatingRequest( 961 mSession, nullptr, 1, &mPreviewRequest, &previewSeqId); 962 } else { 963 ret = ACameraCaptureSession_setRepeatingRequest( 964 mSession, &mResultCb, 1, &mPreviewRequest, sequenceId); 965 } 966 return ret; 967 } 968 969 camera_status_t updateRepeatingRequest(ACaptureRequest *updatedRequest, 970 int *sequenceId = nullptr) { 971 if (mSession == nullptr || updatedRequest == nullptr) { 972 ALOGE("Testcase cannot update repeating request: session %p, updated request %p", 973 mSession, updatedRequest); 974 return ACAMERA_ERROR_UNKNOWN; 975 } 976 977 int previewSeqId; 978 camera_status_t ret; 979 if (sequenceId == nullptr) { 980 ret = ACameraCaptureSession_setRepeatingRequest( 981 mSession, nullptr, 1, &updatedRequest, &previewSeqId); 982 } else { 983 ret = ACameraCaptureSession_setRepeatingRequest( 984 mSession, &mResultCb, 1, &updatedRequest, sequenceId); 985 } 986 return ret; 987 } 988 989 int64_t getCaptureSequenceLastFrameNumber(int64_t sequenceId, uint32_t timeoutSec) { 990 return mResultListener.getCaptureSequenceLastFrameNumber(sequenceId, timeoutSec); 991 } 992 993 bool waitForFrameNumber(int64_t frameNumber, uint32_t timeoutSec) { 994 return mResultListener.waitForFrameNumber(frameNumber, timeoutSec); 995 } 996 997 camera_status_t takePicture() { 998 if (mSession == nullptr || mStillRequest == nullptr) { 999 ALOGE("Testcase cannot take picture: session %p, still request %p", 1000 mSession, mStillRequest); 1001 return ACAMERA_ERROR_UNKNOWN; 1002 } 1003 int seqId; 1004 return ACameraCaptureSession_capture( 1005 mSession, nullptr, 1, &mStillRequest, &seqId); 1006 } 1007 1008 camera_status_t capture(ACaptureRequest* request, 1009 ACameraCaptureSession_captureCallbacks* listener, 1010 /*out*/int* seqId) { 1011 if (mSession == nullptr || request == nullptr) { 1012 ALOGE("Testcase cannot capture session: session %p, request %p", 1013 mSession, request); 1014 return ACAMERA_ERROR_UNKNOWN; 1015 } 1016 return ACameraCaptureSession_capture( 1017 mSession, listener, 1, &request, seqId); 1018 } 1019 1020 camera_status_t resetWithErrorLog() { 1021 camera_status_t ret; 1022 1023 closeSession(); 1024 1025 for (int i = 0; i < 50; i++) { 1026 usleep(100000); // sleep 100ms 1027 if (mSessionListener.isClosed()) { 1028 ALOGI("Session take ~%d ms to close", i*100); 1029 break; 1030 } 1031 } 1032 1033 if (!mSessionListener.isClosed() || mSessionListener.onClosedCount() != 1) { 1034 LOG_ERROR(errorString, 1035 "Session for camera %s close error. isClosde %d close count %d", 1036 mCameraId, mSessionListener.isClosed(), mSessionListener.onClosedCount()); 1037 return ACAMERA_ERROR_UNKNOWN; 1038 } 1039 mSessionListener.reset(); 1040 mResultListener.reset(); 1041 1042 ret = closeCamera(); 1043 if (ret != ACAMERA_OK) { 1044 LOG_ERROR(errorString, "Close camera device %s failure. ret %d", mCameraId, ret); 1045 return ret; 1046 } 1047 1048 resetCamera(); 1049 return ACAMERA_OK; 1050 } 1051 1052 CaptureSessionListener* getSessionListener() { 1053 return &mSessionListener; 1054 } 1055 1056 ACameraDevice* getCameraDevice() { 1057 return mDevice; 1058 } 1059 1060 ACaptureSessionOutput *getPreviewOutput() { 1061 return mPreviewOutput; 1062 } 1063 1064 private: 1065 ACameraManager* createManager() { 1066 if (!mCameraManager) { 1067 mCameraManager = ACameraManager_create(); 1068 } 1069 return mCameraManager; 1070 } 1071 1072 CameraServiceListener mServiceListener; 1073 ACameraManager_AvailabilityCallbacks mServiceCb { 1074 &mServiceListener, 1075 CameraServiceListener::onAvailable, 1076 CameraServiceListener::onUnavailable 1077 }; 1078 CameraDeviceListener mDeviceListener; 1079 ACameraDevice_StateCallbacks mDeviceCb { 1080 &mDeviceListener, 1081 CameraDeviceListener::onDisconnected, 1082 CameraDeviceListener::onError 1083 }; 1084 CaptureSessionListener mSessionListener; 1085 ACameraCaptureSession_stateCallbacks mSessionCb { 1086 &mSessionListener, 1087 CaptureSessionListener::onClosed, 1088 CaptureSessionListener::onReady, 1089 CaptureSessionListener::onActive 1090 }; 1091 1092 CaptureResultListener mResultListener; 1093 ACameraCaptureSession_captureCallbacks mResultCb { 1094 &mResultListener, 1095 CaptureResultListener::onCaptureStart, 1096 CaptureResultListener::onCaptureProgressed, 1097 CaptureResultListener::onCaptureCompleted, 1098 CaptureResultListener::onCaptureFailed, 1099 CaptureResultListener::onCaptureSequenceCompleted, 1100 CaptureResultListener::onCaptureSequenceAborted, 1101 CaptureResultListener::onCaptureBufferLost 1102 }; 1103 1104 ACameraIdList* mCameraIdList = nullptr; 1105 ACameraDevice* mDevice = nullptr; 1106 AImageReader* mImgReader = nullptr; 1107 ANativeWindow* mImgReaderAnw = nullptr; 1108 ANativeWindow* mPreviewAnw = nullptr; 1109 ACameraManager* mCameraManager = nullptr; 1110 ACaptureSessionOutputContainer* mOutputs = nullptr; 1111 ACaptureSessionOutput* mPreviewOutput = nullptr; 1112 ACaptureSessionOutput* mImgReaderOutput = nullptr; 1113 ACameraCaptureSession* mSession = nullptr; 1114 ACaptureRequest* mPreviewRequest = nullptr; 1115 ACaptureRequest* mStillRequest = nullptr; 1116 ACameraOutputTarget* mReqPreviewOutput = nullptr; 1117 ACameraOutputTarget* mReqImgReaderOutput = nullptr; 1118 const char* mCameraId; 1119 1120 bool mMgrInited = false; // cameraId, serviceListener 1121 bool mImgReaderInited = false; 1122 bool mPreviewInited = false; 1123 }; 1124 1125 jint throwAssertionError(JNIEnv* env, const char* message) 1126 { 1127 jclass assertionClass; 1128 const char* className = "junit/framework/AssertionFailedError"; 1129 1130 assertionClass = env->FindClass(className); 1131 if (assertionClass == nullptr) { 1132 ALOGE("Native throw error: cannot find class %s", className); 1133 return -1; 1134 } 1135 return env->ThrowNew(assertionClass, message); 1136 } 1137 1138 extern "C" jboolean 1139 Java_android_hardware_camera2_cts_NativeCameraManagerTest_\ 1140 testCameraManagerGetAndCloseNative( 1141 JNIEnv* env, jclass /*clazz*/) { 1142 bool pass = false; 1143 ALOGV("%s", __FUNCTION__); 1144 ACameraManager* cameraManager2 = nullptr; 1145 ACameraManager* cameraManager3 = nullptr; 1146 ACameraManager* cameraManager4 = nullptr; 1147 camera_status_t ret = ACAMERA_OK; 1148 ACameraManager* cameraManager = ACameraManager_create(); 1149 if (cameraManager == nullptr) { 1150 LOG_ERROR(errorString, "ACameraManager_create returns nullptr"); 1151 goto cleanup; 1152 } 1153 ACameraManager_delete(cameraManager); 1154 cameraManager = nullptr; 1155 1156 // Test get/close multiple instances 1157 cameraManager = ACameraManager_create(); 1158 cameraManager2 = ACameraManager_create(); 1159 if (cameraManager2 == nullptr) { 1160 LOG_ERROR(errorString, "ACameraManager_create 2 returns nullptr"); 1161 goto cleanup; 1162 } 1163 ACameraManager_delete(cameraManager); 1164 cameraManager = nullptr; 1165 cameraManager3 = ACameraManager_create(); 1166 if (cameraManager3 == nullptr) { 1167 LOG_ERROR(errorString, "ACameraManager_create 3 returns nullptr"); 1168 goto cleanup; 1169 } 1170 cameraManager4 = ACameraManager_create(); 1171 if (cameraManager4 == nullptr) { 1172 LOG_ERROR(errorString, "ACameraManager_create 4 returns nullptr"); 1173 goto cleanup; 1174 } 1175 ACameraManager_delete(cameraManager3); 1176 ACameraManager_delete(cameraManager2); 1177 ACameraManager_delete(cameraManager4); 1178 1179 pass = true; 1180 cleanup: 1181 if (cameraManager) { 1182 ACameraManager_delete(cameraManager); 1183 } 1184 ALOGI("%s %s", __FUNCTION__, pass ? "pass" : "fail"); 1185 if (!pass) { 1186 throwAssertionError(env, errorString); 1187 } 1188 return pass; 1189 } 1190 1191 extern "C" jboolean 1192 Java_android_hardware_camera2_cts_NativeCameraManagerTest_\ 1193 testCameraManagerGetCameraIdsNative( 1194 JNIEnv* env, jclass /*clazz*/) { 1195 ALOGV("%s", __FUNCTION__); 1196 bool pass = false; 1197 ACameraManager* mgr = ACameraManager_create(); 1198 ACameraIdList *cameraIdList = nullptr; 1199 camera_status_t ret = ACameraManager_getCameraIdList(mgr, &cameraIdList); 1200 if (ret != ACAMERA_OK || cameraIdList == nullptr) { 1201 LOG_ERROR(errorString, "Get camera id list failed: ret %d, cameraIdList %p", 1202 ret, cameraIdList); 1203 goto cleanup; 1204 } 1205 ALOGI("Number of cameras: %d", cameraIdList->numCameras); 1206 for (int i = 0; i < cameraIdList->numCameras; i++) { 1207 ALOGI("Camera ID: %s", cameraIdList->cameraIds[i]); 1208 } 1209 ACameraManager_deleteCameraIdList(cameraIdList); 1210 cameraIdList = nullptr; 1211 1212 pass = true; 1213 cleanup: 1214 if (mgr) { 1215 ACameraManager_delete(mgr); 1216 } 1217 if (cameraIdList) { 1218 ACameraManager_deleteCameraIdList(cameraIdList); 1219 } 1220 ALOGI("%s %s", __FUNCTION__, pass ? "pass" : "fail"); 1221 if (!pass) { 1222 throwAssertionError(env, errorString); 1223 } 1224 return pass; 1225 } 1226 1227 extern "C" jboolean 1228 Java_android_hardware_camera2_cts_NativeCameraManagerTest_\ 1229 testCameraManagerAvailabilityCallbackNative( 1230 JNIEnv* env, jclass /*clazz*/) { 1231 ALOGV("%s", __FUNCTION__); 1232 bool pass = false; 1233 ACameraManager* mgr = ACameraManager_create(); 1234 ACameraIdList *cameraIdList = nullptr; 1235 camera_status_t ret = ACameraManager_getCameraIdList(mgr, &cameraIdList); 1236 int numCameras = cameraIdList->numCameras; 1237 CameraServiceListener listener; 1238 ACameraManager_AvailabilityCallbacks cbs { 1239 &listener, 1240 CameraServiceListener::onAvailable, 1241 CameraServiceListener::onUnavailable}; 1242 ret = ACameraManager_registerAvailabilityCallback(mgr, &cbs); 1243 if (ret != ACAMERA_OK) { 1244 LOG_ERROR(errorString, "Register availability callback failed: ret %d", ret); 1245 goto cleanup; 1246 } 1247 sleep(1); // sleep a second to give some time for callbacks to happen 1248 1249 // Should at least get onAvailable for each camera once 1250 if (listener.getAvailableCount() < numCameras) { 1251 LOG_ERROR(errorString, "Expect at least %d available callback but only got %d", 1252 numCameras, listener.getAvailableCount()); 1253 goto cleanup; 1254 } 1255 1256 ret = ACameraManager_unregisterAvailabilityCallback(mgr, &cbs); 1257 if (ret != ACAMERA_OK) { 1258 LOG_ERROR(errorString, "Unregister availability callback failed: ret %d", ret); 1259 goto cleanup; 1260 } 1261 pass = true; 1262 cleanup: 1263 if (cameraIdList) { 1264 ACameraManager_deleteCameraIdList(cameraIdList); 1265 } 1266 if (mgr) { 1267 ACameraManager_delete(mgr); 1268 } 1269 ALOGI("%s %s", __FUNCTION__, pass ? "pass" : "failed"); 1270 if (!pass) { 1271 throwAssertionError(env, errorString); 1272 } 1273 return pass; 1274 } 1275 1276 extern "C" jboolean 1277 Java_android_hardware_camera2_cts_NativeCameraManagerTest_\ 1278 testCameraManagerCharacteristicsNative( 1279 JNIEnv* env, jclass /*clazz*/) { 1280 ALOGV("%s", __FUNCTION__); 1281 bool pass = false; 1282 ACameraManager* mgr = ACameraManager_create(); 1283 ACameraIdList *cameraIdList = nullptr; 1284 ACameraMetadata* chars = nullptr; 1285 int numCameras = 0; 1286 camera_status_t ret = ACameraManager_getCameraIdList(mgr, &cameraIdList); 1287 if (ret != ACAMERA_OK || cameraIdList == nullptr) { 1288 LOG_ERROR(errorString, "Get camera id list failed: ret %d, cameraIdList %p", 1289 ret, cameraIdList); 1290 goto cleanup; 1291 } 1292 numCameras = cameraIdList->numCameras; 1293 1294 for (int i = 0; i < numCameras; i++) { 1295 ret = ACameraManager_getCameraCharacteristics( 1296 mgr, cameraIdList->cameraIds[i], &chars); 1297 if (ret != ACAMERA_OK) { 1298 LOG_ERROR(errorString, "Get camera characteristics failed: ret %d", ret); 1299 goto cleanup; 1300 } 1301 1302 int32_t numTags = 0; 1303 const uint32_t* tags = nullptr; 1304 ret = ACameraMetadata_getAllTags(chars, &numTags, &tags); 1305 if (ret != ACAMERA_OK) { 1306 LOG_ERROR(errorString, "Get camera characteristics tags failed: ret %d", ret); 1307 goto cleanup; 1308 } 1309 1310 for (int tid = 0; tid < numTags; tid++) { 1311 uint32_t tagId = tags[tid]; 1312 ALOGV("%s capture request contains key %u", __FUNCTION__, tagId); 1313 uint32_t sectionId = tagId >> 16; 1314 if (sectionId >= ACAMERA_SECTION_COUNT && sectionId < ACAMERA_VENDOR) { 1315 LOG_ERROR(errorString, "Unknown tagId %u, sectionId %u", tagId, sectionId); 1316 goto cleanup; 1317 } 1318 } 1319 1320 ACameraMetadata_const_entry entry; 1321 ret = ACameraMetadata_getConstEntry(chars, ACAMERA_REQUEST_AVAILABLE_CAPABILITIES, &entry); 1322 if (ret != ACAMERA_OK) { 1323 LOG_ERROR(errorString, "Get const available capabilities key failed. ret %d", ret); 1324 goto cleanup; 1325 } 1326 1327 // Check the entry is actually legit 1328 if (entry.tag != ACAMERA_REQUEST_AVAILABLE_CAPABILITIES || 1329 entry.count == 0 || entry.type != ACAMERA_TYPE_BYTE || entry.data.i32 == nullptr) { 1330 LOG_ERROR(errorString, 1331 "Bad available capabilities key: tag: %d (expected %d), count %u (expect > 0), " 1332 "type %d (expected %d), data %p (expected not null)", 1333 entry.tag, ACAMERA_REQUEST_AVAILABLE_CAPABILITIES, entry.count, 1334 entry.type, ACAMERA_TYPE_BYTE, entry.data.i32); 1335 goto cleanup; 1336 } 1337 // All camera supports BC except depth only cameras 1338 bool supportBC = false, supportDepth = false; 1339 for (uint32_t i = 0; i < entry.count; i++) { 1340 if (entry.data.u8[i] == ACAMERA_REQUEST_AVAILABLE_CAPABILITIES_BACKWARD_COMPATIBLE) { 1341 supportBC = true; 1342 } 1343 if (entry.data.u8[i] == ACAMERA_REQUEST_AVAILABLE_CAPABILITIES_DEPTH_OUTPUT) { 1344 supportDepth = true; 1345 } 1346 } 1347 if (!(supportBC || supportDepth)) { 1348 LOG_ERROR(errorString, "Error: camera device %s does not support either BC or DEPTH", 1349 cameraIdList->cameraIds[i]); 1350 goto cleanup; 1351 } 1352 1353 // Check get unknown value fails 1354 uint32_t badTag = (uint32_t) ACAMERA_VENDOR_START - 1; 1355 ret = ACameraMetadata_getConstEntry(chars, badTag, &entry); 1356 if (ret == ACAMERA_OK) { 1357 LOG_ERROR(errorString, "Error: get unknown tag should fail!"); 1358 goto cleanup; 1359 } 1360 1361 ACameraMetadata_free(chars); 1362 chars = nullptr; 1363 } 1364 1365 pass = true; 1366 cleanup: 1367 if (chars) { 1368 ACameraMetadata_free(chars); 1369 } 1370 ACameraManager_deleteCameraIdList(cameraIdList); 1371 ACameraManager_delete(mgr); 1372 ALOGI("%s %s", __FUNCTION__, pass ? "pass" : "failed"); 1373 if (!pass) { 1374 throwAssertionError(env, errorString); 1375 } 1376 return pass; 1377 } 1378 1379 extern "C" jboolean 1380 Java_android_hardware_camera2_cts_NativeCameraDeviceTest_\ 1381 testCameraDeviceOpenAndCloseNative( 1382 JNIEnv* env, jclass /*clazz*/) { 1383 ALOGV("%s", __FUNCTION__); 1384 int numCameras = 0; 1385 bool pass = false; 1386 PreviewTestCase testCase; 1387 1388 camera_status_t ret = testCase.initWithErrorLog(); 1389 if (ret != ACAMERA_OK) { 1390 // Don't log error here. testcase did it 1391 goto cleanup; 1392 } 1393 1394 numCameras = testCase.getNumCameras(); 1395 if (numCameras < 0) { 1396 LOG_ERROR(errorString, "Testcase returned negavtive number of cameras: %d", numCameras); 1397 goto cleanup; 1398 } 1399 1400 for (int i = 0; i < numCameras; i++) { 1401 const char* cameraId = testCase.getCameraId(i); 1402 if (cameraId == nullptr) { 1403 LOG_ERROR(errorString, "Testcase returned null camera id for camera %d", i); 1404 goto cleanup; 1405 } 1406 1407 ret = testCase.openCamera(cameraId); 1408 if (ret != ACAMERA_OK) { 1409 LOG_ERROR(errorString, "Open camera device %s failure. ret %d", cameraId, ret); 1410 goto cleanup; 1411 } 1412 1413 usleep(100000); // sleep to give some time for callbacks to happen 1414 1415 if (testCase.isCameraAvailable(cameraId)) { 1416 LOG_ERROR(errorString, "Camera %s should be unavailable now", cameraId); 1417 goto cleanup; 1418 } 1419 1420 ret = testCase.closeCamera(); 1421 if (ret != ACAMERA_OK) { 1422 LOG_ERROR(errorString, "Close camera device %s failure. ret %d", cameraId, ret); 1423 goto cleanup; 1424 } 1425 1426 usleep(100000); // sleep to give some time for callbacks to happen 1427 1428 if (!testCase.isCameraAvailable(cameraId)) { 1429 LOG_ERROR(errorString, "Camera %s should be available now", cameraId); 1430 goto cleanup; 1431 } 1432 } 1433 1434 ret = testCase.deInit(); 1435 if (ret != ACAMERA_OK) { 1436 LOG_ERROR(errorString, "Testcase deInit failed: ret %d", ret); 1437 goto cleanup; 1438 } 1439 1440 pass = true; 1441 cleanup: 1442 ALOGI("%s %s", __FUNCTION__, pass ? "pass" : "failed"); 1443 if (!pass) { 1444 throwAssertionError(env, errorString); 1445 } 1446 return pass; 1447 } 1448 1449 extern "C" jboolean 1450 Java_android_hardware_camera2_cts_NativeCameraDeviceTest_\ 1451 testCameraDeviceCreateCaptureRequestNative( 1452 JNIEnv* env, jclass /*clazz*/) { 1453 ALOGV("%s", __FUNCTION__); 1454 bool pass = false; 1455 ACameraManager* mgr = ACameraManager_create(); 1456 ACameraIdList* cameraIdList = nullptr; 1457 ACameraDevice* device = nullptr; 1458 ACaptureRequest* request = nullptr; 1459 ACameraMetadata* chars = nullptr; 1460 camera_status_t ret = ACameraManager_getCameraIdList(mgr, &cameraIdList); 1461 1462 int numCameras = cameraIdList->numCameras; 1463 for (int i = 0; i < numCameras; i++) { 1464 CameraDeviceListener deviceListener; 1465 const char* cameraId = cameraIdList->cameraIds[i]; 1466 ACameraDevice_StateCallbacks deviceCb { 1467 &deviceListener, 1468 CameraDeviceListener::onDisconnected, 1469 CameraDeviceListener::onError 1470 }; 1471 ret = ACameraManager_openCamera(mgr, cameraId, &deviceCb, &device); 1472 if (ret != ACAMERA_OK) { 1473 LOG_ERROR(errorString, "Open camera device %s failure. ret %d", cameraId, ret); 1474 goto cleanup; 1475 } 1476 1477 ret = ACameraManager_getCameraCharacteristics(mgr, cameraId, &chars); 1478 if (ret != ACAMERA_OK || chars == nullptr) { 1479 LOG_ERROR(errorString, "Get camera %s characteristics failure. ret %d, chars %p", 1480 cameraId, ret, chars); 1481 goto cleanup; 1482 } 1483 StaticInfo staticInfo(chars); 1484 1485 for (int t = TEMPLATE_PREVIEW; t <= TEMPLATE_MANUAL; t++) { 1486 ACameraDevice_request_template templateId = 1487 static_cast<ACameraDevice_request_template>(t); 1488 ret = ACameraDevice_createCaptureRequest(device, templateId, &request); 1489 if (ret == ACAMERA_ERROR_INVALID_PARAMETER) { 1490 // template not supported. skip 1491 continue; 1492 } 1493 1494 if (ret != ACAMERA_OK) { 1495 LOG_ERROR(errorString, "Create capture request failed!: ret %d", ret); 1496 goto cleanup; 1497 } 1498 1499 int32_t numTags = 0; 1500 const uint32_t* tags = nullptr; 1501 ret = ACaptureRequest_getAllTags(request, &numTags, &tags); 1502 if (ret != ACAMERA_OK) { 1503 LOG_ERROR(errorString, "Get capture request tags failed: ret %d", ret); 1504 goto cleanup; 1505 } 1506 1507 for (int tid = 0; tid < numTags; tid++) { 1508 uint32_t tagId = tags[tid]; 1509 ALOGV("%s capture request contains key %u", __FUNCTION__, tagId); 1510 uint32_t sectionId = tagId >> 16; 1511 if (sectionId >= ACAMERA_SECTION_COUNT && sectionId < ACAMERA_VENDOR) { 1512 LOG_ERROR(errorString, "Unknown tagId %u, sectionId %u", tagId, sectionId); 1513 goto cleanup; 1514 } 1515 } 1516 1517 void* context = nullptr; 1518 ret = ACaptureRequest_getUserContext(request, &context); 1519 if (ret != ACAMERA_OK) { 1520 LOG_ERROR(errorString, "Get capture request context failed: ret %d", ret); 1521 goto cleanup; 1522 } 1523 if (context != nullptr) { 1524 LOG_ERROR(errorString, "Capture request context is not null: %p", context); 1525 goto cleanup; 1526 } 1527 1528 intptr_t magic_num = 0xBEEF; 1529 ret = ACaptureRequest_setUserContext(request, (void*) magic_num); 1530 if (ret != ACAMERA_OK) { 1531 LOG_ERROR(errorString, "Set capture request context failed: ret %d", ret); 1532 goto cleanup; 1533 } 1534 1535 ret = ACaptureRequest_getUserContext(request, &context); 1536 if (ret != ACAMERA_OK) { 1537 LOG_ERROR(errorString, "Get capture request context failed: ret %d", ret); 1538 goto cleanup; 1539 } 1540 if (context != (void*) magic_num) { 1541 LOG_ERROR(errorString, "Capture request context is wrong: %p", context); 1542 goto cleanup; 1543 } 1544 1545 // try get/set capture request fields 1546 ACameraMetadata_const_entry entry; 1547 ret = ACaptureRequest_getConstEntry(request, ACAMERA_CONTROL_AE_MODE, &entry); 1548 if (ret != ACAMERA_OK) { 1549 LOG_ERROR(errorString, "Get AE mode key failed. ret %d", ret); 1550 goto cleanup; 1551 } 1552 1553 if (entry.tag != ACAMERA_CONTROL_AE_MODE || entry.type != ACAMERA_TYPE_BYTE ||\ 1554 entry.count != 1) { 1555 LOG_ERROR(errorString, 1556 "Bad AE mode key. tag 0x%x (expect 0x%x), type %d (expect %d), " 1557 "count %d (expect %d)", 1558 entry.tag, ACAMERA_CONTROL_AE_MODE, entry.type, ACAMERA_TYPE_BYTE, 1559 entry.count, 1); 1560 goto cleanup; 1561 } 1562 if (t == TEMPLATE_MANUAL) { 1563 if (entry.data.u8[0] != ACAMERA_CONTROL_AE_MODE_OFF) { 1564 LOG_ERROR(errorString, "Error: MANUAL template AE mode %d (expect %d)", 1565 entry.data.u8[0], ACAMERA_CONTROL_AE_MODE_OFF); 1566 goto cleanup; 1567 } 1568 // try set AE_MODE_ON 1569 uint8_t aeMode = ACAMERA_CONTROL_AE_MODE_ON; 1570 ret = ACaptureRequest_setEntry_u8( 1571 request, ACAMERA_CONTROL_AE_MODE, /*count*/ 1, &aeMode); 1572 if (ret != ACAMERA_OK) { 1573 LOG_ERROR(errorString, 1574 "Error: Camera %s template %d: update AE mode key fail. ret %d", 1575 cameraId, t, ret); 1576 goto cleanup; 1577 } 1578 ret = ACaptureRequest_getConstEntry( 1579 request, ACAMERA_CONTROL_AE_MODE, &entry); 1580 if (ret != ACAMERA_OK) { 1581 LOG_ERROR(errorString, "Get AE mode key failed. ret %d", ret); 1582 goto cleanup; 1583 } 1584 if (entry.data.u8[0] != aeMode) { 1585 LOG_ERROR(errorString, 1586 "Error: AE mode key is not updated. expect %d but get %d", 1587 aeMode, entry.data.u8[0]); 1588 goto cleanup; 1589 } 1590 } else { 1591 if (staticInfo.isColorOutputSupported()) { 1592 if (entry.data.u8[0] != ACAMERA_CONTROL_AE_MODE_ON) { 1593 LOG_ERROR(errorString, 1594 "Error: Template %d has wrong AE mode %d (expect %d)", 1595 t, entry.data.u8[0], ACAMERA_CONTROL_AE_MODE_ON); 1596 goto cleanup; 1597 } 1598 // try set AE_MODE_OFF 1599 if (staticInfo.isCapabilitySupported( 1600 ACAMERA_REQUEST_AVAILABLE_CAPABILITIES_MANUAL_SENSOR)) { 1601 uint8_t aeMode = ACAMERA_CONTROL_AE_MODE_OFF; 1602 ret = ACaptureRequest_setEntry_u8( 1603 request, ACAMERA_CONTROL_AE_MODE, /*count*/ 1, &aeMode); 1604 if (ret != ACAMERA_OK) { 1605 LOG_ERROR(errorString, 1606 "Error: Camera %s template %d: update AE mode key fail. ret %d", 1607 cameraId, t, ret); 1608 goto cleanup; 1609 } 1610 ret = ACaptureRequest_getConstEntry( 1611 request, ACAMERA_CONTROL_AE_MODE, &entry); 1612 if (ret != ACAMERA_OK) { 1613 LOG_ERROR(errorString, "Get AE mode key failed. ret %d", ret); 1614 goto cleanup; 1615 } 1616 if (entry.data.u8[0] != aeMode) { 1617 LOG_ERROR(errorString, 1618 "Error: AE mode key is not updated. expect %d but get %d", 1619 aeMode, entry.data.u8[0]); 1620 goto cleanup; 1621 } 1622 } 1623 } 1624 } 1625 ACaptureRequest_free(request); 1626 request = nullptr; 1627 } 1628 1629 ACameraMetadata_free(chars); 1630 chars = nullptr; 1631 ACameraDevice_close(device); 1632 device = nullptr; 1633 } 1634 1635 pass = true; 1636 cleanup: 1637 if (cameraIdList) { 1638 ACameraManager_deleteCameraIdList(cameraIdList); 1639 } 1640 if (request) { 1641 ACaptureRequest_free(request); 1642 } 1643 if (chars) { 1644 ACameraMetadata_free(chars); 1645 } 1646 if (device) { 1647 ACameraDevice_close(device); 1648 } 1649 if (mgr) { 1650 ACameraManager_delete(mgr); 1651 } 1652 ALOGI("%s %s", __FUNCTION__, pass ? "pass" : "failed"); 1653 if (!pass) { 1654 throwAssertionError(env, errorString); 1655 } 1656 return pass; 1657 } 1658 1659 extern "C" jboolean 1660 Java_android_hardware_camera2_cts_NativeCameraDeviceTest_\ 1661 testCameraDeviceSessionOpenAndCloseNative( 1662 JNIEnv* env, jclass /*clazz*/, jobject jPreviewSurface) { 1663 ALOGV("%s", __FUNCTION__); 1664 int numCameras = 0; 1665 bool pass = false; 1666 PreviewTestCase testCase; 1667 1668 camera_status_t ret = testCase.initWithErrorLog(); 1669 if (ret != ACAMERA_OK) { 1670 // Don't log error here. testcase did it 1671 goto cleanup; 1672 } 1673 1674 numCameras = testCase.getNumCameras(); 1675 if (numCameras < 0) { 1676 LOG_ERROR(errorString, "Testcase returned negavtive number of cameras: %d", numCameras); 1677 goto cleanup; 1678 } 1679 1680 for (int i = 0; i < numCameras; i++) { 1681 const char* cameraId = testCase.getCameraId(i); 1682 if (cameraId == nullptr) { 1683 LOG_ERROR(errorString, "Testcase returned null camera id for camera %d", i); 1684 goto cleanup; 1685 } 1686 1687 ret = testCase.openCamera(cameraId); 1688 if (ret != ACAMERA_OK) { 1689 LOG_ERROR(errorString, "Open camera device %s failure. ret %d", cameraId, ret); 1690 goto cleanup; 1691 } 1692 1693 usleep(100000); // sleep to give some time for callbacks to happen 1694 1695 if (testCase.isCameraAvailable(cameraId)) { 1696 LOG_ERROR(errorString, "Camera %s should be unavailable now", cameraId); 1697 goto cleanup; 1698 } 1699 1700 ANativeWindow* previewAnw = testCase.initPreviewAnw(env, jPreviewSurface); 1701 if (previewAnw == nullptr) { 1702 LOG_ERROR(errorString, "Null ANW from preview surface!"); 1703 goto cleanup; 1704 } 1705 1706 CaptureSessionListener* sessionListener = testCase.getSessionListener(); 1707 if (sessionListener == nullptr) { 1708 LOG_ERROR(errorString, "Session listener camera %s is null", cameraId); 1709 goto cleanup; 1710 } 1711 1712 // Try open/close session multiple times 1713 for (int j = 0; j < 5; j++) { 1714 ret = testCase.createCaptureSessionWithLog(); 1715 if (ret != ACAMERA_OK) { 1716 // Don't log error here. testcase did it 1717 goto cleanup; 1718 } 1719 1720 usleep(100000); // sleep to give some time for callbacks to happen 1721 1722 if (!sessionListener->isIdle()) { 1723 LOG_ERROR(errorString, "Session for camera %s should be idle right after creation", 1724 cameraId); 1725 goto cleanup; 1726 } 1727 1728 testCase.closeSession(); 1729 1730 usleep(100000); // sleep to give some time for callbacks to happen 1731 if (!sessionListener->isClosed() || sessionListener->onClosedCount() != 1) { 1732 LOG_ERROR(errorString, 1733 "Session for camera %s close error. isClosde %d close count %d", 1734 cameraId, sessionListener->isClosed(), sessionListener->onClosedCount()); 1735 goto cleanup; 1736 } 1737 sessionListener->reset(); 1738 } 1739 1740 // Try open/close really fast 1741 ret = testCase.createCaptureSessionWithLog(); 1742 if (ret != ACAMERA_OK) { 1743 LOG_ERROR(errorString, "Create session for camera %s failed. ret %d", 1744 cameraId, ret); 1745 goto cleanup; 1746 } 1747 testCase.closeSession(); 1748 usleep(100000); // sleep to give some time for callbacks to happen 1749 if (!sessionListener->isClosed() || sessionListener->onClosedCount() != 1) { 1750 LOG_ERROR(errorString, 1751 "Session for camera %s close error. isClosde %d close count %d", 1752 cameraId, sessionListener->isClosed(), sessionListener->onClosedCount()); 1753 goto cleanup; 1754 } 1755 1756 ret = testCase.resetWithErrorLog(); 1757 if (ret != ACAMERA_OK) { 1758 // Don't log error here. testcase did it 1759 goto cleanup; 1760 } 1761 1762 usleep(100000); // sleep to give some time for callbacks to happen 1763 1764 if (!testCase.isCameraAvailable(cameraId)) { 1765 LOG_ERROR(errorString, "Camera %s should be available now", cameraId); 1766 goto cleanup; 1767 } 1768 } 1769 1770 ret = testCase.deInit(); 1771 if (ret != ACAMERA_OK) { 1772 LOG_ERROR(errorString, "Testcase deInit failed: ret %d", ret); 1773 goto cleanup; 1774 } 1775 1776 pass = true; 1777 cleanup: 1778 ALOGI("%s %s", __FUNCTION__, pass ? "pass" : "failed"); 1779 if (!pass) { 1780 throwAssertionError(env, errorString); 1781 } 1782 return pass; 1783 } 1784 1785 extern "C" jboolean 1786 Java_android_hardware_camera2_cts_NativeCameraDeviceTest_\ 1787 testCameraDeviceSharedOutputUpdate( 1788 JNIEnv* env, jclass /*clazz*/, jobject jPreviewSurface, jobject jSharedSurface) { 1789 ALOGV("%s", __FUNCTION__); 1790 int numCameras = 0; 1791 bool pass = false; 1792 PreviewTestCase testCase; 1793 int sequenceId = -1; 1794 int64_t lastFrameNumber = 0; 1795 bool frameArrived = false; 1796 ANativeWindow* previewAnw = nullptr; 1797 ANativeWindow* sharedAnw = ANativeWindow_fromSurface(env, jSharedSurface); 1798 ACaptureRequest* updatedRequest = nullptr; 1799 ACameraOutputTarget* reqPreviewOutput = nullptr; 1800 ACameraOutputTarget* reqSharedOutput = nullptr; 1801 ACaptureSessionOutput *previewOutput = nullptr; 1802 uint32_t timeoutSec = 1; 1803 uint32_t runPreviewSec = 2; 1804 1805 camera_status_t ret = testCase.initWithErrorLog(); 1806 if (ret != ACAMERA_OK) { 1807 // Don't log error here. testcase did it 1808 goto cleanup; 1809 } 1810 1811 numCameras = testCase.getNumCameras(); 1812 if (numCameras < 0) { 1813 LOG_ERROR(errorString, "Testcase returned negavtive number of cameras: %d", numCameras); 1814 goto cleanup; 1815 } 1816 1817 for (int i = 0; i < numCameras; i++) { 1818 const char* cameraId = testCase.getCameraId(i); 1819 if (cameraId == nullptr) { 1820 LOG_ERROR(errorString, "Testcase returned null camera id for camera %d", i); 1821 goto cleanup; 1822 } 1823 1824 ret = testCase.openCamera(cameraId); 1825 if (ret != ACAMERA_OK) { 1826 LOG_ERROR(errorString, "Open camera device %s failure. ret %d", cameraId, ret); 1827 goto cleanup; 1828 } 1829 1830 usleep(100000); // sleep to give some time for callbacks to happen 1831 1832 if (testCase.isCameraAvailable(cameraId)) { 1833 LOG_ERROR(errorString, "Camera %s should be unavailable now", cameraId); 1834 goto cleanup; 1835 } 1836 1837 previewAnw = testCase.initPreviewAnw(env, jPreviewSurface); 1838 if (previewAnw == nullptr) { 1839 LOG_ERROR(errorString, "Null ANW from preview surface!"); 1840 goto cleanup; 1841 } 1842 1843 ret = testCase.createCaptureSessionWithLog(true); 1844 if (ret != ACAMERA_OK) { 1845 // Don't log error here. testcase did it 1846 goto cleanup; 1847 } 1848 1849 ret = testCase.createRequestsWithErrorLog(); 1850 if (ret != ACAMERA_OK) { 1851 // Don't log error here. testcase did it 1852 goto cleanup; 1853 } 1854 1855 ret = testCase.startPreview(); 1856 if (ret != ACAMERA_OK) { 1857 LOG_ERROR(errorString, "Start preview failed!"); 1858 goto cleanup; 1859 } 1860 1861 sleep(runPreviewSec); 1862 1863 previewOutput = testCase.getPreviewOutput(); 1864 //Try some bad input 1865 ret = ACaptureSessionSharedOutput_add(previewOutput, previewAnw); 1866 if (ret != ACAMERA_ERROR_INVALID_PARAMETER) { 1867 LOG_ERROR(errorString, "ACaptureSessionSharedOutput_add should return invalid " 1868 "parameter! %d", ret); 1869 goto cleanup; 1870 } 1871 1872 ret = ACaptureSessionSharedOutput_remove(previewOutput, previewAnw); 1873 if (ret != ACAMERA_ERROR_INVALID_PARAMETER) { 1874 LOG_ERROR(errorString, "ACaptureSessionSharedOutput_remove should return invalid " 1875 "parameter! %d", ret); 1876 goto cleanup; 1877 } 1878 1879 //Now try with valid input 1880 ret = ACaptureSessionSharedOutput_add(previewOutput, sharedAnw); 1881 if (ret != ACAMERA_OK) { 1882 LOG_ERROR(errorString, "ACaptureSessionSharedOutput_add failed!") 1883 goto cleanup; 1884 } 1885 1886 ret = testCase.updateOutput(env, previewOutput); 1887 if (ret != ACAMERA_OK) { 1888 LOG_ERROR(errorString, "Failed to update output configuration!") 1889 goto cleanup; 1890 } 1891 1892 ret = ACameraDevice_createCaptureRequest( 1893 testCase.getCameraDevice(), TEMPLATE_PREVIEW, &updatedRequest); 1894 if (ret != ACAMERA_OK) { 1895 LOG_ERROR(errorString, "Camera %s create preview request failed. ret %d", 1896 cameraId, ret); 1897 goto cleanup; 1898 } 1899 1900 ret = ACameraOutputTarget_create(previewAnw, &reqPreviewOutput); 1901 if (ret != ACAMERA_OK) { 1902 LOG_ERROR(errorString, 1903 "Camera %s create request preview output target failed. ret %d", 1904 cameraId, ret); 1905 goto cleanup; 1906 } 1907 1908 ret = ACaptureRequest_addTarget(updatedRequest, reqPreviewOutput); 1909 if (ret != ACAMERA_OK) { 1910 LOG_ERROR(errorString, "Camera %s add preview request output failed. ret %d", 1911 cameraId, ret); 1912 goto cleanup; 1913 } 1914 1915 ret = ACameraOutputTarget_create(sharedAnw, &reqSharedOutput); 1916 if (ret != ACAMERA_OK) { 1917 LOG_ERROR(errorString, 1918 "Camera %s create request preview output target failed. ret %d", 1919 cameraId, ret); 1920 goto cleanup; 1921 } 1922 1923 ret = ACaptureRequest_addTarget(updatedRequest, reqSharedOutput); 1924 if (ret != ACAMERA_OK) { 1925 LOG_ERROR(errorString, "Camera %s add preview request output failed. ret %d", 1926 cameraId, ret); 1927 goto cleanup; 1928 } 1929 1930 ret = testCase.updateRepeatingRequest(updatedRequest, &sequenceId); 1931 if (ret != ACAMERA_OK) { 1932 LOG_ERROR(errorString, "Camera %s failed to update repeated request. ret %d", 1933 cameraId, ret); 1934 goto cleanup; 1935 } 1936 1937 sleep(runPreviewSec); 1938 1939 ret = ACaptureSessionSharedOutput_remove(previewOutput, sharedAnw); 1940 if (ret != ACAMERA_OK) { 1941 LOG_ERROR(errorString, "ACaptureSessionSharedOutput_remove failed!"); 1942 goto cleanup; 1943 } 1944 1945 //Try removing shared output which still has pending camera requests 1946 ret = testCase.updateOutput(env, previewOutput); 1947 if (ret != ACAMERA_ERROR_INVALID_PARAMETER) { 1948 LOG_ERROR(errorString, "updateOutput should fail!"); 1949 goto cleanup; 1950 } 1951 1952 //Remove the shared output correctly by updating the repeating request 1953 //first 1954 ret = ACaptureRequest_removeTarget(updatedRequest, reqSharedOutput); 1955 if (ret != ACAMERA_OK) { 1956 LOG_ERROR(errorString, "Camera %s remove target output failed. ret %d", 1957 cameraId, ret); 1958 goto cleanup; 1959 } 1960 1961 ret = testCase.updateRepeatingRequest(updatedRequest); 1962 if (ret != ACAMERA_OK) { 1963 LOG_ERROR(errorString, "Camera %s failed to update repeated request. ret %d", 1964 cameraId, ret); 1965 goto cleanup; 1966 } 1967 1968 //Then wait for all old requests to flush 1969 lastFrameNumber = testCase.getCaptureSequenceLastFrameNumber(sequenceId, timeoutSec); 1970 if (lastFrameNumber < 0) { 1971 LOG_ERROR(errorString, "Camera %s failed to acquire last frame number!", 1972 cameraId); 1973 goto cleanup; 1974 } 1975 1976 frameArrived = testCase.waitForFrameNumber(lastFrameNumber, timeoutSec); 1977 if (!frameArrived) { 1978 LOG_ERROR(errorString, "Camera %s timed out waiting on last frame number!", 1979 cameraId); 1980 goto cleanup; 1981 } 1982 1983 ret = testCase.updateOutput(env, previewOutput); 1984 if (ret != ACAMERA_OK) { 1985 LOG_ERROR(errorString, "updateOutput failed!"); 1986 goto cleanup; 1987 } 1988 1989 sleep(runPreviewSec); 1990 1991 ret = testCase.resetWithErrorLog(); 1992 if (ret != ACAMERA_OK) { 1993 // Don't log error here. testcase did it 1994 goto cleanup; 1995 } 1996 1997 usleep(100000); // sleep to give some time for callbacks to happen 1998 1999 if (!testCase.isCameraAvailable(cameraId)) { 2000 LOG_ERROR(errorString, "Camera %s should be available now", cameraId); 2001 goto cleanup; 2002 } 2003 } 2004 2005 ret = testCase.deInit(); 2006 if (ret != ACAMERA_OK) { 2007 LOG_ERROR(errorString, "Testcase deInit failed: ret %d", ret); 2008 goto cleanup; 2009 } 2010 2011 pass = true; 2012 2013 cleanup: 2014 2015 if (updatedRequest != nullptr) { 2016 ACaptureRequest_free(updatedRequest); 2017 updatedRequest = nullptr; 2018 } 2019 2020 if (reqPreviewOutput != nullptr) { 2021 ACameraOutputTarget_free(reqPreviewOutput); 2022 reqPreviewOutput = nullptr; 2023 } 2024 2025 if (reqSharedOutput != nullptr) { 2026 ACameraOutputTarget_free(reqSharedOutput); 2027 reqSharedOutput = nullptr; 2028 } 2029 2030 if (sharedAnw) { 2031 ANativeWindow_release(sharedAnw); 2032 sharedAnw = nullptr; 2033 } 2034 2035 ALOGI("%s %s", __FUNCTION__, pass ? "pass" : "failed"); 2036 if (!pass) { 2037 throwAssertionError(env, errorString); 2038 } 2039 return pass; 2040 } 2041 2042 extern "C" jboolean 2043 Java_android_hardware_camera2_cts_NativeCameraDeviceTest_\ 2044 testCameraDeviceSimplePreviewNative( 2045 JNIEnv* env, jclass /*clazz*/, jobject jPreviewSurface) { 2046 ALOGV("%s", __FUNCTION__); 2047 int numCameras = 0; 2048 bool pass = false; 2049 PreviewTestCase testCase; 2050 2051 camera_status_t ret = testCase.initWithErrorLog(); 2052 if (ret != ACAMERA_OK) { 2053 // Don't log error here. testcase did it 2054 goto cleanup; 2055 } 2056 2057 numCameras = testCase.getNumCameras(); 2058 if (numCameras < 0) { 2059 LOG_ERROR(errorString, "Testcase returned negavtive number of cameras: %d", numCameras); 2060 goto cleanup; 2061 } 2062 2063 for (int i = 0; i < numCameras; i++) { 2064 const char* cameraId = testCase.getCameraId(i); 2065 if (cameraId == nullptr) { 2066 LOG_ERROR(errorString, "Testcase returned null camera id for camera %d", i); 2067 goto cleanup; 2068 } 2069 2070 ret = testCase.openCamera(cameraId); 2071 if (ret != ACAMERA_OK) { 2072 LOG_ERROR(errorString, "Open camera device %s failure. ret %d", cameraId, ret); 2073 goto cleanup; 2074 } 2075 2076 usleep(100000); // sleep to give some time for callbacks to happen 2077 2078 if (testCase.isCameraAvailable(cameraId)) { 2079 LOG_ERROR(errorString, "Camera %s should be unavailable now", cameraId); 2080 goto cleanup; 2081 } 2082 2083 ANativeWindow* previewAnw = testCase.initPreviewAnw(env, jPreviewSurface); 2084 if (previewAnw == nullptr) { 2085 LOG_ERROR(errorString, "Null ANW from preview surface!"); 2086 goto cleanup; 2087 } 2088 2089 ret = testCase.createCaptureSessionWithLog(); 2090 if (ret != ACAMERA_OK) { 2091 // Don't log error here. testcase did it 2092 goto cleanup; 2093 } 2094 2095 ret = testCase.createRequestsWithErrorLog(); 2096 if (ret != ACAMERA_OK) { 2097 // Don't log error here. testcase did it 2098 goto cleanup; 2099 } 2100 2101 ret = testCase.startPreview(); 2102 if (ret != ACAMERA_OK) { 2103 LOG_ERROR(errorString, "Start preview failed!"); 2104 goto cleanup; 2105 } 2106 2107 sleep(3); 2108 2109 ret = testCase.resetWithErrorLog(); 2110 if (ret != ACAMERA_OK) { 2111 // Don't log error here. testcase did it 2112 goto cleanup; 2113 } 2114 2115 usleep(100000); // sleep to give some time for callbacks to happen 2116 2117 if (!testCase.isCameraAvailable(cameraId)) { 2118 LOG_ERROR(errorString, "Camera %s should be available now", cameraId); 2119 goto cleanup; 2120 } 2121 } 2122 2123 ret = testCase.deInit(); 2124 if (ret != ACAMERA_OK) { 2125 LOG_ERROR(errorString, "Testcase deInit failed: ret %d", ret); 2126 goto cleanup; 2127 } 2128 2129 pass = true; 2130 cleanup: 2131 ALOGI("%s %s", __FUNCTION__, pass ? "pass" : "failed"); 2132 if (!pass) { 2133 throwAssertionError(env, errorString); 2134 } 2135 return pass; 2136 } 2137 2138 extern "C" jboolean 2139 Java_android_hardware_camera2_cts_NativeCameraDeviceTest_\ 2140 testCameraDevicePreviewWithSessionParametersNative( 2141 JNIEnv* env, jclass /*clazz*/, jobject jPreviewSurface) { 2142 ALOGV("%s", __FUNCTION__); 2143 int numCameras = 0; 2144 bool pass = false; 2145 ACameraManager* mgr = ACameraManager_create(); 2146 ACameraMetadata* chars = nullptr; 2147 PreviewTestCase testCase; 2148 2149 camera_status_t ret = testCase.initWithErrorLog(); 2150 if (ret != ACAMERA_OK) { 2151 // Don't log error here. testcase did it 2152 goto cleanup; 2153 } 2154 2155 numCameras = testCase.getNumCameras(); 2156 if (numCameras < 0) { 2157 LOG_ERROR(errorString, "Testcase returned negavtive number of cameras: %d", numCameras); 2158 goto cleanup; 2159 } 2160 2161 for (int i = 0; i < numCameras; i++) { 2162 const char* cameraId = testCase.getCameraId(i); 2163 if (cameraId == nullptr) { 2164 LOG_ERROR(errorString, "Testcase returned null camera id for camera %d", i); 2165 goto cleanup; 2166 } 2167 2168 ret = ACameraManager_getCameraCharacteristics( 2169 mgr, cameraId, &chars); 2170 if (ret != ACAMERA_OK) { 2171 LOG_ERROR(errorString, "Get camera characteristics failed: ret %d", ret); 2172 goto cleanup; 2173 } 2174 2175 ACameraMetadata_const_entry sessionParamKeys{}; 2176 ret = ACameraMetadata_getConstEntry(chars, ACAMERA_REQUEST_AVAILABLE_SESSION_KEYS, 2177 &sessionParamKeys); 2178 if ((ret != ACAMERA_OK) || (sessionParamKeys.count == 0)) { 2179 ACameraMetadata_free(chars); 2180 chars = nullptr; 2181 continue; 2182 } 2183 2184 ret = testCase.openCamera(cameraId); 2185 if (ret != ACAMERA_OK) { 2186 LOG_ERROR(errorString, "Open camera device %s failure. ret %d", cameraId, ret); 2187 goto cleanup; 2188 } 2189 2190 usleep(100000); // sleep to give some time for callbacks to happen 2191 2192 if (testCase.isCameraAvailable(cameraId)) { 2193 LOG_ERROR(errorString, "Camera %s should be unavailable now", cameraId); 2194 goto cleanup; 2195 } 2196 2197 ANativeWindow* previewAnw = testCase.initPreviewAnw(env, jPreviewSurface); 2198 if (previewAnw == nullptr) { 2199 LOG_ERROR(errorString, "Null ANW from preview surface!"); 2200 goto cleanup; 2201 } 2202 2203 ret = testCase.createRequestsWithErrorLog(); 2204 if (ret != ACAMERA_OK) { 2205 // Don't log error here. testcase did it 2206 goto cleanup; 2207 } 2208 2209 ACaptureRequest *previewRequest = nullptr; 2210 ret = testCase.getPreviewRequest(&previewRequest); 2211 if ((ret != ACAMERA_OK) || (previewRequest == nullptr)) { 2212 LOG_ERROR(errorString, "Preview request query failed!"); 2213 goto cleanup; 2214 } 2215 2216 ret = testCase.createCaptureSessionWithLog(/*isPreviewShared*/ false, previewRequest); 2217 if (ret != ACAMERA_OK) { 2218 // Don't log error here. testcase did it 2219 goto cleanup; 2220 } 2221 2222 ret = testCase.startPreview(); 2223 if (ret != ACAMERA_OK) { 2224 LOG_ERROR(errorString, "Start preview failed!"); 2225 goto cleanup; 2226 } 2227 2228 sleep(3); 2229 2230 ret = testCase.resetWithErrorLog(); 2231 if (ret != ACAMERA_OK) { 2232 // Don't log error here. testcase did it 2233 goto cleanup; 2234 } 2235 2236 usleep(100000); // sleep to give some time for callbacks to happen 2237 2238 if (!testCase.isCameraAvailable(cameraId)) { 2239 LOG_ERROR(errorString, "Camera %s should be available now", cameraId); 2240 goto cleanup; 2241 } 2242 2243 ACameraMetadata_free(chars); 2244 chars = nullptr; 2245 } 2246 2247 ret = testCase.deInit(); 2248 if (ret != ACAMERA_OK) { 2249 LOG_ERROR(errorString, "Testcase deInit failed: ret %d", ret); 2250 goto cleanup; 2251 } 2252 2253 pass = true; 2254 cleanup: 2255 if (chars) { 2256 ACameraMetadata_free(chars); 2257 } 2258 ACameraManager_delete(mgr); 2259 ALOGI("%s %s", __FUNCTION__, pass ? "pass" : "failed"); 2260 if (!pass) { 2261 throwAssertionError(env, errorString); 2262 } 2263 return pass; 2264 } 2265 2266 bool nativeImageReaderTestBase( 2267 JNIEnv* env, jstring jOutPath, AImageReader_ImageCallback cb) { 2268 const int NUM_TEST_IMAGES = 10; 2269 const int TEST_WIDTH = 640; 2270 const int TEST_HEIGHT = 480; 2271 media_status_t mediaRet = AMEDIA_ERROR_UNKNOWN; 2272 int numCameras = 0; 2273 bool pass = false; 2274 PreviewTestCase testCase; 2275 2276 const char* outPath = (jOutPath == nullptr) ? nullptr : 2277 env->GetStringUTFChars(jOutPath, nullptr); 2278 if (outPath != nullptr) { 2279 ALOGI("%s: out path is %s", __FUNCTION__, outPath); 2280 } 2281 2282 camera_status_t ret = testCase.initWithErrorLog(); 2283 if (ret != ACAMERA_OK) { 2284 // Don't log error here. testcase did it 2285 goto cleanup; 2286 } 2287 2288 numCameras = testCase.getNumCameras(); 2289 if (numCameras < 0) { 2290 LOG_ERROR(errorString, "Testcase returned negavtive number of cameras: %d", numCameras); 2291 goto cleanup; 2292 } 2293 2294 for (int i = 0; i < numCameras; i++) { 2295 const char* cameraId = testCase.getCameraId(i); 2296 if (cameraId == nullptr) { 2297 LOG_ERROR(errorString, "Testcase returned null camera id for camera %d", i); 2298 goto cleanup; 2299 } 2300 2301 ret = testCase.openCamera(cameraId); 2302 if (ret != ACAMERA_OK) { 2303 LOG_ERROR(errorString, "Open camera device %s failure. ret %d", cameraId, ret); 2304 goto cleanup; 2305 } 2306 2307 usleep(100000); // sleep to give some time for callbacks to happen 2308 2309 if (testCase.isCameraAvailable(cameraId)) { 2310 LOG_ERROR(errorString, "Camera %s should be unavailable now", cameraId); 2311 goto cleanup; 2312 } 2313 2314 ImageReaderListener readerListener; 2315 AImageReader_ImageListener readerCb { &readerListener, cb }; 2316 readerListener.setDumpFilePathBase(outPath); 2317 2318 mediaRet = testCase.initImageReaderWithErrorLog( 2319 TEST_WIDTH, TEST_HEIGHT, AIMAGE_FORMAT_JPEG, NUM_TEST_IMAGES, 2320 &readerCb); 2321 if (mediaRet != AMEDIA_OK) { 2322 // Don't log error here. testcase did it 2323 goto cleanup; 2324 } 2325 2326 ret = testCase.createCaptureSessionWithLog(); 2327 if (ret != ACAMERA_OK) { 2328 // Don't log error here. testcase did it 2329 goto cleanup; 2330 } 2331 2332 ret = testCase.createRequestsWithErrorLog(); 2333 if (ret != ACAMERA_OK) { 2334 // Don't log error here. testcase did it 2335 goto cleanup; 2336 } 2337 2338 CaptureResultListener resultListener; 2339 ACameraCaptureSession_captureCallbacks resultCb { 2340 &resultListener, 2341 CaptureResultListener::onCaptureStart, 2342 CaptureResultListener::onCaptureProgressed, 2343 CaptureResultListener::onCaptureCompleted, 2344 CaptureResultListener::onCaptureFailed, 2345 CaptureResultListener::onCaptureSequenceCompleted, 2346 CaptureResultListener::onCaptureSequenceAborted, 2347 CaptureResultListener::onCaptureBufferLost 2348 }; 2349 resultListener.setRequestSave(true); 2350 ACaptureRequest* requestTemplate = nullptr; 2351 ret = testCase.getStillRequest(&requestTemplate); 2352 if (ret != ACAMERA_OK || requestTemplate == nullptr) { 2353 // Don't log error here. testcase did it 2354 goto cleanup; 2355 } 2356 2357 // Do some still capture 2358 int lastSeqId = -1; 2359 for (intptr_t capture = 0; capture < NUM_TEST_IMAGES; capture++) { 2360 ACaptureRequest* req = ACaptureRequest_copy(requestTemplate); 2361 ACaptureRequest_setUserContext(req, (void*) capture); 2362 int seqId; 2363 ret = testCase.capture(req, &resultCb, &seqId); 2364 if (ret != ACAMERA_OK) { 2365 LOG_ERROR(errorString, "Camera %s capture(%" PRIdPTR ") failed. ret %d", 2366 cameraId, capture, ret); 2367 goto cleanup; 2368 } 2369 if (capture == NUM_TEST_IMAGES - 1) { 2370 lastSeqId = seqId; 2371 } 2372 ACaptureRequest_free(req); 2373 } 2374 2375 // wait until last sequence complete 2376 resultListener.getCaptureSequenceLastFrameNumber(lastSeqId, /*timeoutSec*/ 3); 2377 2378 std::vector<ACaptureRequest*> completedRequests; 2379 resultListener.getCompletedRequests(&completedRequests); 2380 2381 if (completedRequests.size() != NUM_TEST_IMAGES) { 2382 LOG_ERROR(errorString, "Camera %s fails to capture %d capture results. Got %zu", 2383 cameraId, NUM_TEST_IMAGES, completedRequests.size()); 2384 goto cleanup; 2385 } 2386 2387 for (intptr_t i = 0; i < NUM_TEST_IMAGES; i++) { 2388 intptr_t userContext = -1; 2389 ret = ACaptureRequest_getUserContext(completedRequests[i], (void**) &userContext); 2390 if (ret != ACAMERA_OK) { 2391 LOG_ERROR(errorString, "Camera %s fails to get request user context", cameraId); 2392 goto cleanup; 2393 } 2394 2395 if (userContext != i) { 2396 LOG_ERROR(errorString, "Camera %s fails to return matching user context. " 2397 "Expect %" PRIdPTR ", got %" PRIdPTR, cameraId, i, userContext); 2398 goto cleanup; 2399 } 2400 } 2401 2402 // wait until all capture finished 2403 for (int i = 0; i < 50; i++) { 2404 usleep(100000); // sleep 100ms 2405 if (readerListener.onImageAvailableCount() == NUM_TEST_IMAGES) { 2406 ALOGI("Session take ~%d ms to capture %d images", 2407 i*100, NUM_TEST_IMAGES); 2408 break; 2409 } 2410 } 2411 2412 if (readerListener.onImageAvailableCount() != NUM_TEST_IMAGES) { 2413 LOG_ERROR(errorString, "Camera %s timeout capturing %d images. Got %d", 2414 cameraId, NUM_TEST_IMAGES, readerListener.onImageAvailableCount()); 2415 goto cleanup; 2416 } 2417 2418 ret = testCase.resetWithErrorLog(); 2419 if (ret != ACAMERA_OK) { 2420 // Don't log error here. testcase did it 2421 goto cleanup; 2422 } 2423 2424 usleep(100000); // sleep to give some time for callbacks to happen 2425 2426 if (!testCase.isCameraAvailable(cameraId)) { 2427 LOG_ERROR(errorString, "Camera %s should be available now", cameraId); 2428 goto cleanup; 2429 } 2430 } 2431 2432 ret = testCase.deInit(); 2433 if (ret != ACAMERA_OK) { 2434 LOG_ERROR(errorString, "Testcase deInit failed: ret %d", ret); 2435 goto cleanup; 2436 } 2437 2438 pass = true; 2439 2440 cleanup: 2441 if (outPath != nullptr) { 2442 env->ReleaseStringUTFChars(jOutPath, outPath); 2443 } 2444 ALOGI("%s %s", __FUNCTION__, pass ? "pass" : "failed"); 2445 if (!pass) { 2446 throwAssertionError(env, errorString); 2447 } 2448 return pass; 2449 } 2450 2451 extern "C" jboolean 2452 Java_android_hardware_camera2_cts_NativeImageReaderTest_\ 2453 testJpegNative( 2454 JNIEnv* env, jclass /*clazz*/, jstring jOutPath) { 2455 ALOGV("%s", __FUNCTION__); 2456 return nativeImageReaderTestBase(env, jOutPath, ImageReaderListener::validateImageCb); 2457 } 2458 2459 2460 extern "C" jboolean 2461 Java_android_hardware_camera2_cts_NativeImageReaderTest_\ 2462 testImageReaderCloseAcquiredImagesNative( 2463 JNIEnv* env, jclass /*clazz*/) { 2464 ALOGV("%s", __FUNCTION__); 2465 return nativeImageReaderTestBase(env, nullptr, ImageReaderListener::acquireImageCb); 2466 } 2467 2468 2469 extern "C" jboolean 2470 Java_android_hardware_camera2_cts_NativeStillCaptureTest_\ 2471 testStillCaptureNative( 2472 JNIEnv* env, jclass /*clazz*/, jstring jOutPath, jobject jPreviewSurface) { 2473 ALOGV("%s", __FUNCTION__); 2474 const int NUM_TEST_IMAGES = 10; 2475 const int TEST_WIDTH = 640; 2476 const int TEST_HEIGHT = 480; 2477 media_status_t mediaRet = AMEDIA_ERROR_UNKNOWN; 2478 int numCameras = 0; 2479 bool pass = false; 2480 PreviewTestCase testCase; 2481 2482 const char* outPath = env->GetStringUTFChars(jOutPath, nullptr); 2483 ALOGI("%s: out path is %s", __FUNCTION__, outPath); 2484 2485 camera_status_t ret = testCase.initWithErrorLog(); 2486 if (ret != ACAMERA_OK) { 2487 // Don't log error here. testcase did it 2488 goto cleanup; 2489 } 2490 2491 numCameras = testCase.getNumCameras(); 2492 if (numCameras < 0) { 2493 LOG_ERROR(errorString, "Testcase returned negavtive number of cameras: %d", numCameras); 2494 goto cleanup; 2495 } 2496 2497 for (int i = 0; i < numCameras; i++) { 2498 const char* cameraId = testCase.getCameraId(i); 2499 if (cameraId == nullptr) { 2500 LOG_ERROR(errorString, "Testcase returned null camera id for camera %d", i); 2501 goto cleanup; 2502 } 2503 2504 ret = testCase.openCamera(cameraId); 2505 if (ret != ACAMERA_OK) { 2506 LOG_ERROR(errorString, "Open camera device %s failure. ret %d", cameraId, ret); 2507 goto cleanup; 2508 } 2509 2510 usleep(100000); // sleep to give some time for callbacks to happen 2511 2512 if (testCase.isCameraAvailable(cameraId)) { 2513 LOG_ERROR(errorString, "Camera %s should be unavailable now", cameraId); 2514 goto cleanup; 2515 } 2516 2517 ImageReaderListener readerListener; 2518 AImageReader_ImageListener readerCb { 2519 &readerListener, 2520 ImageReaderListener::validateImageCb 2521 }; 2522 readerListener.setDumpFilePathBase(outPath); 2523 mediaRet = testCase.initImageReaderWithErrorLog( 2524 TEST_WIDTH, TEST_HEIGHT, AIMAGE_FORMAT_JPEG, NUM_TEST_IMAGES, 2525 &readerCb); 2526 if (mediaRet != AMEDIA_OK) { 2527 // Don't log error here. testcase did it 2528 goto cleanup; 2529 } 2530 2531 ANativeWindow* previewAnw = testCase.initPreviewAnw(env, jPreviewSurface); 2532 if (previewAnw == nullptr) { 2533 LOG_ERROR(errorString, "Null ANW from preview surface!"); 2534 goto cleanup; 2535 } 2536 2537 ret = testCase.createCaptureSessionWithLog(); 2538 if (ret != ACAMERA_OK) { 2539 // Don't log error here. testcase did it 2540 goto cleanup; 2541 } 2542 2543 ret = testCase.createRequestsWithErrorLog(); 2544 if (ret != ACAMERA_OK) { 2545 // Don't log error here. testcase did it 2546 goto cleanup; 2547 } 2548 2549 ret = testCase.startPreview(); 2550 if (ret != ACAMERA_OK) { 2551 LOG_ERROR(errorString, "Start preview failed!"); 2552 goto cleanup; 2553 } 2554 2555 // Let preview run some time 2556 sleep(3); 2557 2558 // Do some still capture 2559 for (int capture = 0; capture < NUM_TEST_IMAGES; capture++) { 2560 ret = testCase.takePicture(); 2561 if (ret != ACAMERA_OK) { 2562 LOG_ERROR(errorString, "Camera %s capture(%d) failed. ret %d", 2563 cameraId, capture, ret); 2564 goto cleanup; 2565 } 2566 } 2567 2568 // wait until all capture finished 2569 for (int i = 0; i < 50; i++) { 2570 usleep(100000); // sleep 100ms 2571 if (readerListener.onImageAvailableCount() == NUM_TEST_IMAGES) { 2572 ALOGI("Session take ~%d ms to capture %d images", 2573 i*100, NUM_TEST_IMAGES); 2574 break; 2575 } 2576 } 2577 2578 if (readerListener.onImageAvailableCount() != NUM_TEST_IMAGES) { 2579 LOG_ERROR(errorString, "Camera %s timeout capturing %d images. Got %d", 2580 cameraId, NUM_TEST_IMAGES, readerListener.onImageAvailableCount()); 2581 goto cleanup; 2582 } 2583 2584 ret = testCase.resetWithErrorLog(); 2585 if (ret != ACAMERA_OK) { 2586 // Don't log error here. testcase did it 2587 goto cleanup; 2588 } 2589 2590 usleep(100000); // sleep to give some time for callbacks to happen 2591 2592 if (!testCase.isCameraAvailable(cameraId)) { 2593 LOG_ERROR(errorString, "Camera %s should be available now", cameraId); 2594 goto cleanup; 2595 } 2596 } 2597 2598 ret = testCase.deInit(); 2599 if (ret != ACAMERA_OK) { 2600 LOG_ERROR(errorString, "Testcase deInit failed: ret %d", ret); 2601 goto cleanup; 2602 } 2603 2604 pass = true; 2605 cleanup: 2606 env->ReleaseStringUTFChars(jOutPath, outPath); 2607 ALOGI("%s %s", __FUNCTION__, pass ? "pass" : "failed"); 2608 if (!pass) { 2609 throwAssertionError(env, errorString); 2610 } 2611 return pass; 2612 } 2613 2614