1 /* 2 * Copyright (C) 2012 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 "Camera2_test" 18 //#define LOG_NDEBUG 0 19 20 #include <utils/Log.h> 21 #include <gtest/gtest.h> 22 #include <iostream> 23 #include <fstream> 24 25 #include <utils/Vector.h> 26 #include <gui/CpuConsumer.h> 27 #include <ui/PixelFormat.h> 28 #include <system/camera_metadata.h> 29 30 #include "camera2_utils.h" 31 #include "TestExtensions.h" 32 33 namespace android { 34 namespace camera2 { 35 namespace tests { 36 37 class Camera2Test: public testing::Test { 38 public: 39 void SetUpModule() { 40 int res; 41 42 hw_module_t *module = NULL; 43 res = hw_get_module(CAMERA_HARDWARE_MODULE_ID, 44 (const hw_module_t **)&module); 45 46 ASSERT_EQ(0, res) 47 << "Failure opening camera hardware module: " << res; 48 ASSERT_TRUE(NULL != module) 49 << "No camera module was set by hw_get_module"; 50 51 IF_ALOGV() { 52 std::cout << " Camera module name: " 53 << module->name << std::endl; 54 std::cout << " Camera module author: " 55 << module->author << std::endl; 56 std::cout << " Camera module API version: 0x" << std::hex 57 << module->module_api_version << std::endl; 58 std::cout << " Camera module HAL API version: 0x" << std::hex 59 << module->hal_api_version << std::endl; 60 } 61 62 int16_t version2_0 = CAMERA_MODULE_API_VERSION_2_0; 63 ASSERT_LE(version2_0, module->module_api_version) 64 << "Camera module version is 0x" 65 << std::hex << module->module_api_version 66 << ", should be at least 2.0. (0x" 67 << std::hex << CAMERA_MODULE_API_VERSION_2_0 << ")"; 68 69 sCameraModule = reinterpret_cast<camera_module_t*>(module); 70 71 sNumCameras = sCameraModule->get_number_of_cameras(); 72 ASSERT_LT(0, sNumCameras) << "No camera devices available!"; 73 74 IF_ALOGV() { 75 std::cout << " Camera device count: " << sNumCameras << std::endl; 76 } 77 78 sCameraSupportsHal2 = new bool[sNumCameras]; 79 80 for (int i = 0; i < sNumCameras; i++) { 81 camera_info info; 82 res = sCameraModule->get_camera_info(i, &info); 83 ASSERT_EQ(0, res) 84 << "Failure getting camera info for camera " << i; 85 IF_ALOGV() { 86 std::cout << " Camera device: " << std::dec 87 << i << std::endl;; 88 std::cout << " Facing: " << std::dec 89 << info.facing << std::endl; 90 std::cout << " Orientation: " << std::dec 91 << info.orientation << std::endl; 92 std::cout << " Version: 0x" << std::hex << 93 info.device_version << std::endl; 94 } 95 if (info.device_version >= CAMERA_DEVICE_API_VERSION_2_0 && 96 info.device_version < CAMERA_DEVICE_API_VERSION_3_0) { 97 sCameraSupportsHal2[i] = true; 98 ASSERT_TRUE(NULL != info.static_camera_characteristics); 99 IF_ALOGV() { 100 std::cout << " Static camera metadata:" << std::endl; 101 dump_indented_camera_metadata(info.static_camera_characteristics, 102 0, 1, 6); 103 } 104 } else { 105 sCameraSupportsHal2[i] = false; 106 } 107 } 108 } 109 110 void TearDownModule() { 111 hw_module_t *module = reinterpret_cast<hw_module_t*>(sCameraModule); 112 ASSERT_EQ(0, HWModuleHelpers::closeModule(module)); 113 } 114 115 static const camera_module_t *getCameraModule() { 116 return sCameraModule; 117 } 118 119 static int getNumCameras() { 120 return sNumCameras; 121 } 122 123 static bool isHal2Supported(int id) { 124 return sCameraSupportsHal2[id]; 125 } 126 127 static camera2_device_t *openCameraDevice(int id) { 128 ALOGV("Opening camera %d", id); 129 if (NULL == sCameraSupportsHal2) return NULL; 130 if (id >= sNumCameras) return NULL; 131 if (!sCameraSupportsHal2[id]) return NULL; 132 133 hw_device_t *device = NULL; 134 const camera_module_t *cam_module = getCameraModule(); 135 if (cam_module == NULL) { 136 return NULL; 137 } 138 139 char camId[10]; 140 int res; 141 142 snprintf(camId, 10, "%d", id); 143 res = cam_module->common.methods->open( 144 (const hw_module_t*)cam_module, 145 camId, 146 &device); 147 if (res != NO_ERROR || device == NULL) { 148 return NULL; 149 } 150 camera2_device_t *cam_device = 151 reinterpret_cast<camera2_device_t*>(device); 152 return cam_device; 153 } 154 155 static status_t configureCameraDevice(camera2_device_t *dev, 156 MetadataQueue &requestQueue, 157 MetadataQueue &frameQueue, 158 NotifierListener &listener) { 159 160 status_t err; 161 162 err = dev->ops->set_request_queue_src_ops(dev, 163 requestQueue.getToConsumerInterface()); 164 if (err != OK) return err; 165 166 requestQueue.setFromConsumerInterface(dev); 167 168 err = dev->ops->set_frame_queue_dst_ops(dev, 169 frameQueue.getToProducerInterface()); 170 if (err != OK) return err; 171 172 err = listener.getNotificationsFrom(dev); 173 if (err != OK) return err; 174 175 return OK; 176 } 177 178 static status_t closeCameraDevice(camera2_device_t **cam_dev) { 179 int res; 180 if (*cam_dev == NULL ) return OK; 181 182 ALOGV("Closing camera %p", cam_dev); 183 184 hw_device_t *dev = reinterpret_cast<hw_device_t *>(*cam_dev); 185 res = dev->close(dev); 186 *cam_dev = NULL; 187 return res; 188 } 189 190 void setUpCamera(int id) { 191 ASSERT_GT(sNumCameras, id); 192 status_t res; 193 194 if (mDevice != NULL) { 195 closeCameraDevice(&mDevice); 196 } 197 mId = id; 198 mDevice = openCameraDevice(mId); 199 ASSERT_TRUE(NULL != mDevice) << "Failed to open camera device"; 200 201 camera_info info; 202 res = sCameraModule->get_camera_info(id, &info); 203 ASSERT_EQ(OK, res); 204 205 mStaticInfo = info.static_camera_characteristics; 206 207 res = configureCameraDevice(mDevice, 208 mRequests, 209 mFrames, 210 mNotifications); 211 ASSERT_EQ(OK, res) << "Failure to configure camera device"; 212 213 } 214 215 void setUpStream(sp<IGraphicBufferProducer> consumer, 216 int width, int height, int format, int *id) { 217 status_t res; 218 219 StreamAdapter* stream = new StreamAdapter(consumer); 220 221 ALOGV("Creating stream, format 0x%x, %d x %d", format, width, height); 222 res = stream->connectToDevice(mDevice, width, height, format); 223 ASSERT_EQ(NO_ERROR, res) << "Failed to connect to stream: " 224 << strerror(-res); 225 mStreams.push_back(stream); 226 227 *id = stream->getId(); 228 } 229 230 void disconnectStream(int id) { 231 status_t res; 232 unsigned int i=0; 233 for (; i < mStreams.size(); i++) { 234 if (mStreams[i]->getId() == id) { 235 res = mStreams[i]->disconnect(); 236 ASSERT_EQ(NO_ERROR, res) << 237 "Failed to disconnect stream " << id; 238 break; 239 } 240 } 241 ASSERT_GT(mStreams.size(), i) << "Stream id not found:" << id; 242 } 243 244 void getResolutionList(int32_t format, 245 const int32_t **list, 246 size_t *count) { 247 ALOGV("Getting resolutions for format %x", format); 248 status_t res; 249 if (format != HAL_PIXEL_FORMAT_IMPLEMENTATION_DEFINED) { 250 camera_metadata_ro_entry_t availableFormats; 251 res = find_camera_metadata_ro_entry(mStaticInfo, 252 ANDROID_SCALER_AVAILABLE_FORMATS, 253 &availableFormats); 254 ASSERT_EQ(OK, res); 255 256 uint32_t formatIdx; 257 for (formatIdx=0; formatIdx < availableFormats.count; formatIdx++) { 258 if (availableFormats.data.i32[formatIdx] == format) break; 259 } 260 ASSERT_NE(availableFormats.count, formatIdx) 261 << "No support found for format 0x" << std::hex << format; 262 } 263 264 camera_metadata_ro_entry_t availableSizes; 265 if (format == HAL_PIXEL_FORMAT_RAW_SENSOR) { 266 res = find_camera_metadata_ro_entry(mStaticInfo, 267 ANDROID_SCALER_AVAILABLE_RAW_SIZES, 268 &availableSizes); 269 } else if (format == HAL_PIXEL_FORMAT_BLOB) { 270 res = find_camera_metadata_ro_entry(mStaticInfo, 271 ANDROID_SCALER_AVAILABLE_JPEG_SIZES, 272 &availableSizes); 273 } else { 274 res = find_camera_metadata_ro_entry(mStaticInfo, 275 ANDROID_SCALER_AVAILABLE_PROCESSED_SIZES, 276 &availableSizes); 277 } 278 ASSERT_EQ(OK, res); 279 280 *list = availableSizes.data.i32; 281 *count = availableSizes.count; 282 } 283 284 status_t waitUntilDrained() { 285 static const uint32_t kSleepTime = 50000; // 50 ms 286 static const uint32_t kMaxSleepTime = 10000000; // 10 s 287 ALOGV("%s: Camera %d: Starting wait", __FUNCTION__, mId); 288 289 // TODO: Set up notifications from HAL, instead of sleeping here 290 uint32_t totalTime = 0; 291 while (mDevice->ops->get_in_progress_count(mDevice) > 0) { 292 usleep(kSleepTime); 293 totalTime += kSleepTime; 294 if (totalTime > kMaxSleepTime) { 295 ALOGE("%s: Waited %d us, %d requests still in flight", __FUNCTION__, 296 mDevice->ops->get_in_progress_count(mDevice), totalTime); 297 return TIMED_OUT; 298 } 299 } 300 ALOGV("%s: Camera %d: HAL is idle", __FUNCTION__, mId); 301 return OK; 302 } 303 304 virtual void SetUp() { 305 TEST_EXTENSION_FORKING_SET_UP; 306 307 SetUpModule(); 308 309 const ::testing::TestInfo* const testInfo = 310 ::testing::UnitTest::GetInstance()->current_test_info(); 311 (void)testInfo; 312 313 ALOGV("*** Starting test %s in test case %s", testInfo->name(), 314 testInfo->test_case_name()); 315 mDevice = NULL; 316 } 317 318 virtual void TearDown() { 319 TEST_EXTENSION_FORKING_TEAR_DOWN; 320 321 for (unsigned int i = 0; i < mStreams.size(); i++) { 322 delete mStreams[i]; 323 } 324 if (mDevice != NULL) { 325 closeCameraDevice(&mDevice); 326 } 327 328 TearDownModule(); 329 } 330 331 int mId; 332 camera2_device *mDevice; 333 const camera_metadata_t *mStaticInfo; 334 335 MetadataQueue mRequests; 336 MetadataQueue mFrames; 337 NotifierListener mNotifications; 338 339 Vector<StreamAdapter*> mStreams; 340 341 private: 342 static camera_module_t *sCameraModule; 343 static int sNumCameras; 344 static bool *sCameraSupportsHal2; 345 }; 346 347 camera_module_t *Camera2Test::sCameraModule = NULL; 348 bool *Camera2Test::sCameraSupportsHal2 = NULL; 349 int Camera2Test::sNumCameras = 0; 350 351 static const nsecs_t USEC = 1000; 352 static const nsecs_t MSEC = 1000*USEC; 353 static const nsecs_t SEC = 1000*MSEC; 354 355 356 TEST_F(Camera2Test, OpenClose) { 357 358 TEST_EXTENSION_FORKING_INIT; 359 360 status_t res; 361 362 for (int id = 0; id < getNumCameras(); id++) { 363 if (!isHal2Supported(id)) continue; 364 365 camera2_device_t *d = openCameraDevice(id); 366 ASSERT_TRUE(NULL != d) << "Failed to open camera device"; 367 368 res = closeCameraDevice(&d); 369 ASSERT_EQ(NO_ERROR, res) << "Failed to close camera device"; 370 } 371 } 372 373 TEST_F(Camera2Test, Capture1Raw) { 374 375 TEST_EXTENSION_FORKING_INIT; 376 377 status_t res; 378 379 for (int id = 0; id < getNumCameras(); id++) { 380 if (!isHal2Supported(id)) continue; 381 382 ASSERT_NO_FATAL_FAILURE(setUpCamera(id)); 383 384 sp<IGraphicBufferProducer> bqProducer; 385 sp<IGraphicBufferConsumer> bqConsumer; 386 BufferQueue::createBufferQueue(&bqProducer, &bqConsumer); 387 sp<CpuConsumer> rawConsumer = new CpuConsumer(bqConsumer, 1); 388 sp<FrameWaiter> rawWaiter = new FrameWaiter(); 389 rawConsumer->setFrameAvailableListener(rawWaiter); 390 391 const int32_t *rawResolutions; 392 size_t rawResolutionsCount; 393 394 int format = HAL_PIXEL_FORMAT_RAW_SENSOR; 395 396 getResolutionList(format, 397 &rawResolutions, &rawResolutionsCount); 398 399 if (rawResolutionsCount <= 0) { 400 const ::testing::TestInfo* const test_info = 401 ::testing::UnitTest::GetInstance()->current_test_info(); 402 std::cerr << "Skipping test " 403 << test_info->test_case_name() << "." 404 << test_info->name() 405 << " because the optional format was not available: " 406 << "RAW_SENSOR" << std::endl; 407 return; 408 } 409 410 ASSERT_LT((size_t)0, rawResolutionsCount); 411 412 // Pick first available raw resolution 413 int width = rawResolutions[0]; 414 int height = rawResolutions[1]; 415 416 int streamId; 417 ASSERT_NO_FATAL_FAILURE( 418 setUpStream(bqProducer, width, height, format, &streamId) ); 419 420 camera_metadata_t *request; 421 request = allocate_camera_metadata(20, 2000); 422 423 uint8_t metadataMode = ANDROID_REQUEST_METADATA_MODE_FULL; 424 add_camera_metadata_entry(request, 425 ANDROID_REQUEST_METADATA_MODE, 426 (void**)&metadataMode, 1); 427 uint32_t outputStreams = streamId; 428 add_camera_metadata_entry(request, 429 ANDROID_REQUEST_OUTPUT_STREAMS, 430 (void**)&outputStreams, 1); 431 432 uint64_t exposureTime = 10*MSEC; 433 add_camera_metadata_entry(request, 434 ANDROID_SENSOR_EXPOSURE_TIME, 435 (void**)&exposureTime, 1); 436 uint64_t frameDuration = 30*MSEC; 437 add_camera_metadata_entry(request, 438 ANDROID_SENSOR_FRAME_DURATION, 439 (void**)&frameDuration, 1); 440 uint32_t sensitivity = 100; 441 add_camera_metadata_entry(request, 442 ANDROID_SENSOR_SENSITIVITY, 443 (void**)&sensitivity, 1); 444 uint8_t requestType = ANDROID_REQUEST_TYPE_CAPTURE; 445 add_camera_metadata_entry(request, 446 ANDROID_REQUEST_TYPE, 447 (void**)&requestType, 1); 448 449 uint32_t hourOfDay = 12; 450 add_camera_metadata_entry(request, 451 0x80000000, // EMULATOR_HOUROFDAY 452 &hourOfDay, 1); 453 454 IF_ALOGV() { 455 std::cout << "Input request: " << std::endl; 456 dump_indented_camera_metadata(request, 0, 1, 2); 457 } 458 459 res = mRequests.enqueue(request); 460 ASSERT_EQ(NO_ERROR, res) << "Can't enqueue request: " << strerror(-res); 461 462 res = mFrames.waitForBuffer(exposureTime + SEC); 463 ASSERT_EQ(NO_ERROR, res) << "No frame to get: " << strerror(-res); 464 465 camera_metadata_t *frame; 466 res = mFrames.dequeue(&frame); 467 ASSERT_EQ(NO_ERROR, res); 468 ASSERT_TRUE(frame != NULL); 469 470 IF_ALOGV() { 471 std::cout << "Output frame:" << std::endl; 472 dump_indented_camera_metadata(frame, 0, 1, 2); 473 } 474 475 res = rawWaiter->waitForFrame(exposureTime + SEC); 476 ASSERT_EQ(NO_ERROR, res); 477 478 CpuConsumer::LockedBuffer buffer; 479 res = rawConsumer->lockNextBuffer(&buffer); 480 ASSERT_EQ(NO_ERROR, res); 481 482 IF_ALOGV() { 483 const char *dumpname = 484 "/data/local/tmp/camera2_test-capture1raw-dump.raw"; 485 ALOGV("Dumping raw buffer to %s", dumpname); 486 // Write to file 487 std::ofstream rawFile(dumpname); 488 size_t bpp = 2; 489 for (unsigned int y = 0; y < buffer.height; y++) { 490 rawFile.write( 491 (const char *)(buffer.data + y * buffer.stride * bpp), 492 buffer.width * bpp); 493 } 494 rawFile.close(); 495 } 496 497 res = rawConsumer->unlockBuffer(buffer); 498 ASSERT_EQ(NO_ERROR, res); 499 500 ASSERT_EQ(OK, waitUntilDrained()); 501 ASSERT_NO_FATAL_FAILURE(disconnectStream(streamId)); 502 503 res = closeCameraDevice(&mDevice); 504 ASSERT_EQ(NO_ERROR, res) << "Failed to close camera device"; 505 506 } 507 } 508 509 TEST_F(Camera2Test, CaptureBurstRaw) { 510 511 TEST_EXTENSION_FORKING_INIT; 512 513 status_t res; 514 515 for (int id = 0; id < getNumCameras(); id++) { 516 if (!isHal2Supported(id)) continue; 517 518 ASSERT_NO_FATAL_FAILURE(setUpCamera(id)); 519 520 sp<IGraphicBufferProducer> bqProducer; 521 sp<IGraphicBufferConsumer> bqConsumer; 522 BufferQueue::createBufferQueue(&bqProducer, &bqConsumer); 523 sp<CpuConsumer> rawConsumer = new CpuConsumer(bqConsumer, 1); 524 sp<FrameWaiter> rawWaiter = new FrameWaiter(); 525 rawConsumer->setFrameAvailableListener(rawWaiter); 526 527 const int32_t *rawResolutions; 528 size_t rawResolutionsCount; 529 530 int format = HAL_PIXEL_FORMAT_RAW_SENSOR; 531 532 getResolutionList(format, 533 &rawResolutions, &rawResolutionsCount); 534 535 if (rawResolutionsCount <= 0) { 536 const ::testing::TestInfo* const test_info = 537 ::testing::UnitTest::GetInstance()->current_test_info(); 538 std::cerr << "Skipping test " 539 << test_info->test_case_name() << "." 540 << test_info->name() 541 << " because the optional format was not available: " 542 << "RAW_SENSOR" << std::endl; 543 return; 544 } 545 546 ASSERT_LT((uint32_t)0, rawResolutionsCount); 547 548 // Pick first available raw resolution 549 int width = rawResolutions[0]; 550 int height = rawResolutions[1]; 551 552 int streamId; 553 ASSERT_NO_FATAL_FAILURE( 554 setUpStream(bqProducer, width, height, format, &streamId) ); 555 556 camera_metadata_t *request; 557 request = allocate_camera_metadata(20, 2000); 558 559 uint8_t metadataMode = ANDROID_REQUEST_METADATA_MODE_FULL; 560 add_camera_metadata_entry(request, 561 ANDROID_REQUEST_METADATA_MODE, 562 (void**)&metadataMode, 1); 563 uint32_t outputStreams = streamId; 564 add_camera_metadata_entry(request, 565 ANDROID_REQUEST_OUTPUT_STREAMS, 566 (void**)&outputStreams, 1); 567 568 uint64_t frameDuration = 30*MSEC; 569 add_camera_metadata_entry(request, 570 ANDROID_SENSOR_FRAME_DURATION, 571 (void**)&frameDuration, 1); 572 uint32_t sensitivity = 100; 573 add_camera_metadata_entry(request, 574 ANDROID_SENSOR_SENSITIVITY, 575 (void**)&sensitivity, 1); 576 uint8_t requestType = ANDROID_REQUEST_TYPE_CAPTURE; 577 add_camera_metadata_entry(request, 578 ANDROID_REQUEST_TYPE, 579 (void**)&requestType, 1); 580 581 uint32_t hourOfDay = 12; 582 add_camera_metadata_entry(request, 583 0x80000000, // EMULATOR_HOUROFDAY 584 &hourOfDay, 1); 585 586 IF_ALOGV() { 587 std::cout << "Input request template: " << std::endl; 588 dump_indented_camera_metadata(request, 0, 1, 2); 589 } 590 591 int numCaptures = 10; 592 593 // Enqueue numCaptures requests with increasing exposure time 594 595 uint64_t exposureTime = 100 * USEC; 596 for (int reqCount = 0; reqCount < numCaptures; reqCount++ ) { 597 camera_metadata_t *req; 598 req = allocate_camera_metadata(20, 2000); 599 append_camera_metadata(req, request); 600 601 add_camera_metadata_entry(req, 602 ANDROID_SENSOR_EXPOSURE_TIME, 603 (void**)&exposureTime, 1); 604 exposureTime *= 2; 605 606 res = mRequests.enqueue(req); 607 ASSERT_EQ(NO_ERROR, res) << "Can't enqueue request: " 608 << strerror(-res); 609 } 610 611 // Get frames and image buffers one by one 612 uint64_t expectedExposureTime = 100 * USEC; 613 for (int frameCount = 0; frameCount < 10; frameCount++) { 614 res = mFrames.waitForBuffer(SEC + expectedExposureTime); 615 ASSERT_EQ(NO_ERROR, res) << "No frame to get: " << strerror(-res); 616 617 camera_metadata_t *frame; 618 res = mFrames.dequeue(&frame); 619 ASSERT_EQ(NO_ERROR, res); 620 ASSERT_TRUE(frame != NULL); 621 622 camera_metadata_entry_t frameNumber; 623 res = find_camera_metadata_entry(frame, 624 ANDROID_REQUEST_FRAME_COUNT, 625 &frameNumber); 626 ASSERT_EQ(NO_ERROR, res); 627 ASSERT_EQ(frameCount, *frameNumber.data.i32); 628 629 res = rawWaiter->waitForFrame(SEC + expectedExposureTime); 630 ASSERT_EQ(NO_ERROR, res) << 631 "Never got raw data for capture " << frameCount; 632 633 CpuConsumer::LockedBuffer buffer; 634 res = rawConsumer->lockNextBuffer(&buffer); 635 ASSERT_EQ(NO_ERROR, res); 636 637 IF_ALOGV() { 638 char dumpname[60]; 639 snprintf(dumpname, 60, 640 "/data/local/tmp/camera2_test-" 641 "captureBurstRaw-dump_%d.raw", 642 frameCount); 643 ALOGV("Dumping raw buffer to %s", dumpname); 644 // Write to file 645 std::ofstream rawFile(dumpname); 646 for (unsigned int y = 0; y < buffer.height; y++) { 647 rawFile.write( 648 (const char *)(buffer.data + y * buffer.stride * 2), 649 buffer.width * 2); 650 } 651 rawFile.close(); 652 } 653 654 res = rawConsumer->unlockBuffer(buffer); 655 ASSERT_EQ(NO_ERROR, res); 656 657 expectedExposureTime *= 2; 658 } 659 } 660 } 661 662 TEST_F(Camera2Test, ConstructDefaultRequests) { 663 664 TEST_EXTENSION_FORKING_INIT; 665 666 status_t res; 667 668 for (int id = 0; id < getNumCameras(); id++) { 669 if (!isHal2Supported(id)) continue; 670 671 ASSERT_NO_FATAL_FAILURE(setUpCamera(id)); 672 673 for (int i = CAMERA2_TEMPLATE_PREVIEW; i < CAMERA2_TEMPLATE_COUNT; 674 i++) { 675 camera_metadata_t *request = NULL; 676 res = mDevice->ops->construct_default_request(mDevice, 677 i, 678 &request); 679 EXPECT_EQ(NO_ERROR, res) << 680 "Unable to construct request from template type " << i; 681 EXPECT_TRUE(request != NULL); 682 EXPECT_LT((size_t)0, get_camera_metadata_entry_count(request)); 683 EXPECT_LT((size_t)0, get_camera_metadata_data_count(request)); 684 685 IF_ALOGV() { 686 std::cout << " ** Template type " << i << ":"<<std::endl; 687 dump_indented_camera_metadata(request, 0, 2, 4); 688 } 689 690 free_camera_metadata(request); 691 } 692 } 693 } 694 695 TEST_F(Camera2Test, Capture1Jpeg) { 696 status_t res; 697 698 for (int id = 0; id < getNumCameras(); id++) { 699 if (!isHal2Supported(id)) continue; 700 701 ASSERT_NO_FATAL_FAILURE(setUpCamera(id)); 702 703 sp<IGraphicBufferProducer> bqProducer; 704 sp<IGraphicBufferConsumer> bqConsumer; 705 BufferQueue::createBufferQueue(&bqProducer, &bqConsumer); 706 sp<CpuConsumer> jpegConsumer = new CpuConsumer(bqConsumer, 1); 707 sp<FrameWaiter> jpegWaiter = new FrameWaiter(); 708 jpegConsumer->setFrameAvailableListener(jpegWaiter); 709 710 const int32_t *jpegResolutions; 711 size_t jpegResolutionsCount; 712 713 int format = HAL_PIXEL_FORMAT_BLOB; 714 715 getResolutionList(format, 716 &jpegResolutions, &jpegResolutionsCount); 717 ASSERT_LT((size_t)0, jpegResolutionsCount); 718 719 // Pick first available JPEG resolution 720 int width = jpegResolutions[0]; 721 int height = jpegResolutions[1]; 722 723 int streamId; 724 ASSERT_NO_FATAL_FAILURE( 725 setUpStream(bqProducer, width, height, format, &streamId) ); 726 727 camera_metadata_t *request; 728 request = allocate_camera_metadata(20, 2000); 729 730 uint8_t metadataMode = ANDROID_REQUEST_METADATA_MODE_FULL; 731 add_camera_metadata_entry(request, 732 ANDROID_REQUEST_METADATA_MODE, 733 (void**)&metadataMode, 1); 734 uint32_t outputStreams = streamId; 735 add_camera_metadata_entry(request, 736 ANDROID_REQUEST_OUTPUT_STREAMS, 737 (void**)&outputStreams, 1); 738 739 uint64_t exposureTime = 10*MSEC; 740 add_camera_metadata_entry(request, 741 ANDROID_SENSOR_EXPOSURE_TIME, 742 (void**)&exposureTime, 1); 743 uint64_t frameDuration = 30*MSEC; 744 add_camera_metadata_entry(request, 745 ANDROID_SENSOR_FRAME_DURATION, 746 (void**)&frameDuration, 1); 747 uint32_t sensitivity = 100; 748 add_camera_metadata_entry(request, 749 ANDROID_SENSOR_SENSITIVITY, 750 (void**)&sensitivity, 1); 751 uint8_t requestType = ANDROID_REQUEST_TYPE_CAPTURE; 752 add_camera_metadata_entry(request, 753 ANDROID_REQUEST_TYPE, 754 (void**)&requestType, 1); 755 756 uint32_t hourOfDay = 12; 757 add_camera_metadata_entry(request, 758 0x80000000, // EMULATOR_HOUROFDAY 759 &hourOfDay, 1); 760 761 IF_ALOGV() { 762 std::cout << "Input request: " << std::endl; 763 dump_indented_camera_metadata(request, 0, 1, 4); 764 } 765 766 res = mRequests.enqueue(request); 767 ASSERT_EQ(NO_ERROR, res) << "Can't enqueue request: " << strerror(-res); 768 769 res = mFrames.waitForBuffer(exposureTime + SEC); 770 ASSERT_EQ(NO_ERROR, res) << "No frame to get: " << strerror(-res); 771 772 camera_metadata_t *frame; 773 res = mFrames.dequeue(&frame); 774 ASSERT_EQ(NO_ERROR, res); 775 ASSERT_TRUE(frame != NULL); 776 777 IF_ALOGV() { 778 std::cout << "Output frame:" << std::endl; 779 dump_indented_camera_metadata(frame, 0, 1, 4); 780 } 781 782 res = jpegWaiter->waitForFrame(exposureTime + SEC); 783 ASSERT_EQ(NO_ERROR, res); 784 785 CpuConsumer::LockedBuffer buffer; 786 res = jpegConsumer->lockNextBuffer(&buffer); 787 ASSERT_EQ(NO_ERROR, res); 788 789 IF_ALOGV() { 790 const char *dumpname = 791 "/data/local/tmp/camera2_test-capture1jpeg-dump.jpeg"; 792 ALOGV("Dumping raw buffer to %s", dumpname); 793 // Write to file 794 std::ofstream jpegFile(dumpname); 795 size_t bpp = 1; 796 for (unsigned int y = 0; y < buffer.height; y++) { 797 jpegFile.write( 798 (const char *)(buffer.data + y * buffer.stride * bpp), 799 buffer.width * bpp); 800 } 801 jpegFile.close(); 802 } 803 804 res = jpegConsumer->unlockBuffer(buffer); 805 ASSERT_EQ(NO_ERROR, res); 806 807 ASSERT_EQ(OK, waitUntilDrained()); 808 ASSERT_NO_FATAL_FAILURE(disconnectStream(streamId)); 809 810 res = closeCameraDevice(&mDevice); 811 ASSERT_EQ(NO_ERROR, res) << "Failed to close camera device"; 812 813 } 814 } 815 816 } // namespace tests 817 } // namespace camera2 818 } // namespace android 819