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 /* 18 * Contains implementation of a class EmulatedFakeCamera2 that encapsulates 19 * functionality of an advanced fake camera. 20 */ 21 22 //#define LOG_NDEBUG 0 23 #define LOG_TAG "EmulatedCamera_FakeCamera2" 24 #include <utils/Log.h> 25 26 #include "EmulatedFakeCamera2.h" 27 #include "EmulatedCameraFactory.h" 28 #include <ui/Rect.h> 29 #include <ui/GraphicBufferMapper.h> 30 #include "gralloc_cb.h" 31 32 namespace android { 33 34 const int64_t USEC = 1000LL; 35 const int64_t MSEC = USEC * 1000LL; 36 const int64_t SEC = MSEC * 1000LL; 37 38 const uint32_t EmulatedFakeCamera2::kAvailableFormats[4] = { 39 HAL_PIXEL_FORMAT_RAW_SENSOR, 40 HAL_PIXEL_FORMAT_BLOB, 41 HAL_PIXEL_FORMAT_RGBA_8888, 42 // HAL_PIXEL_FORMAT_YV12, 43 HAL_PIXEL_FORMAT_YCrCb_420_SP 44 }; 45 46 const uint32_t EmulatedFakeCamera2::kAvailableRawSizes[2] = { 47 640, 480 48 // Sensor::kResolution[0], Sensor::kResolution[1] 49 }; 50 51 const uint64_t EmulatedFakeCamera2::kAvailableRawMinDurations[1] = { 52 Sensor::kFrameDurationRange[0] 53 }; 54 55 const uint32_t EmulatedFakeCamera2::kAvailableProcessedSizesBack[4] = { 56 640, 480, 320, 240 57 // Sensor::kResolution[0], Sensor::kResolution[1] 58 }; 59 60 const uint32_t EmulatedFakeCamera2::kAvailableProcessedSizesFront[4] = { 61 320, 240, 160, 120 62 // Sensor::kResolution[0], Sensor::kResolution[1] 63 }; 64 65 const uint64_t EmulatedFakeCamera2::kAvailableProcessedMinDurations[1] = { 66 Sensor::kFrameDurationRange[0] 67 }; 68 69 const uint32_t EmulatedFakeCamera2::kAvailableJpegSizesBack[2] = { 70 640, 480 71 // Sensor::kResolution[0], Sensor::kResolution[1] 72 }; 73 74 const uint32_t EmulatedFakeCamera2::kAvailableJpegSizesFront[2] = { 75 320, 240 76 // Sensor::kResolution[0], Sensor::kResolution[1] 77 }; 78 79 80 const uint64_t EmulatedFakeCamera2::kAvailableJpegMinDurations[1] = { 81 Sensor::kFrameDurationRange[0] 82 }; 83 84 85 EmulatedFakeCamera2::EmulatedFakeCamera2(int cameraId, 86 bool facingBack, 87 struct hw_module_t* module) 88 : EmulatedCamera2(cameraId,module), 89 mFacingBack(facingBack) 90 { 91 ALOGD("Constructing emulated fake camera 2 facing %s", 92 facingBack ? "back" : "front"); 93 } 94 95 EmulatedFakeCamera2::~EmulatedFakeCamera2() { 96 if (mCameraInfo != NULL) { 97 free_camera_metadata(mCameraInfo); 98 } 99 } 100 101 /**************************************************************************** 102 * Public API overrides 103 ***************************************************************************/ 104 105 status_t EmulatedFakeCamera2::Initialize() { 106 status_t res; 107 108 set_camera_metadata_vendor_tag_ops( 109 static_cast<vendor_tag_query_ops_t*>(&mVendorTagOps)); 110 111 res = constructStaticInfo(&mCameraInfo, true); 112 if (res != OK) { 113 ALOGE("%s: Unable to allocate static info: %s (%d)", 114 __FUNCTION__, strerror(-res), res); 115 return res; 116 } 117 res = constructStaticInfo(&mCameraInfo, false); 118 if (res != OK) { 119 ALOGE("%s: Unable to fill in static info: %s (%d)", 120 __FUNCTION__, strerror(-res), res); 121 return res; 122 } 123 if (res != OK) return res; 124 125 mNextStreamId = 1; 126 mNextReprocessStreamId = 1; 127 mRawStreamCount = 0; 128 mProcessedStreamCount = 0; 129 mJpegStreamCount = 0; 130 mReprocessStreamCount = 0; 131 132 return NO_ERROR; 133 } 134 135 /**************************************************************************** 136 * Camera module API overrides 137 ***************************************************************************/ 138 139 status_t EmulatedFakeCamera2::connectCamera(hw_device_t** device) { 140 status_t res; 141 ALOGV("%s", __FUNCTION__); 142 143 mConfigureThread = new ConfigureThread(this); 144 mReadoutThread = new ReadoutThread(this); 145 mControlThread = new ControlThread(this); 146 mSensor = new Sensor(this); 147 mJpegCompressor = new JpegCompressor(this); 148 149 mNextStreamId = 1; 150 mNextReprocessStreamId = 1; 151 152 res = mSensor->startUp(); 153 if (res != NO_ERROR) return res; 154 155 res = mConfigureThread->run("EmulatedFakeCamera2::configureThread"); 156 if (res != NO_ERROR) return res; 157 158 res = mReadoutThread->run("EmulatedFakeCamera2::readoutThread"); 159 if (res != NO_ERROR) return res; 160 161 res = mControlThread->run("EmulatedFakeCamera2::controlThread"); 162 if (res != NO_ERROR) return res; 163 164 return EmulatedCamera2::connectCamera(device); 165 } 166 167 status_t EmulatedFakeCamera2::closeCamera() { 168 Mutex::Autolock l(mMutex); 169 170 status_t res; 171 ALOGV("%s", __FUNCTION__); 172 173 res = mSensor->shutDown(); 174 if (res != NO_ERROR) { 175 ALOGE("%s: Unable to shut down sensor: %d", __FUNCTION__, res); 176 return res; 177 } 178 179 mConfigureThread->requestExit(); 180 mReadoutThread->requestExit(); 181 mControlThread->requestExit(); 182 mJpegCompressor->cancel(); 183 184 mConfigureThread->join(); 185 mReadoutThread->join(); 186 mControlThread->join(); 187 188 ALOGV("%s exit", __FUNCTION__); 189 return NO_ERROR; 190 } 191 192 status_t EmulatedFakeCamera2::getCameraInfo(struct camera_info *info) { 193 info->facing = mFacingBack ? CAMERA_FACING_BACK : CAMERA_FACING_FRONT; 194 info->orientation = gEmulatedCameraFactory.getFakeCameraOrientation(); 195 return EmulatedCamera2::getCameraInfo(info); 196 } 197 198 /**************************************************************************** 199 * Camera device API overrides 200 ***************************************************************************/ 201 202 /** Request input queue */ 203 204 int EmulatedFakeCamera2::requestQueueNotify() { 205 ALOGV("Request queue notification received"); 206 207 ALOG_ASSERT(mRequestQueueSrc != NULL, 208 "%s: Request queue src not set, but received queue notification!", 209 __FUNCTION__); 210 ALOG_ASSERT(mFrameQueueDst != NULL, 211 "%s: Request queue src not set, but received queue notification!", 212 __FUNCTION__); 213 ALOG_ASSERT(mStreams.size() != 0, 214 "%s: No streams allocated, but received queue notification!", 215 __FUNCTION__); 216 return mConfigureThread->newRequestAvailable(); 217 } 218 219 int EmulatedFakeCamera2::getInProgressCount() { 220 Mutex::Autolock l(mMutex); 221 222 int requestCount = 0; 223 requestCount += mConfigureThread->getInProgressCount(); 224 requestCount += mReadoutThread->getInProgressCount(); 225 requestCount += mJpegCompressor->isBusy() ? 1 : 0; 226 227 return requestCount; 228 } 229 230 int EmulatedFakeCamera2::constructDefaultRequest( 231 int request_template, 232 camera_metadata_t **request) { 233 234 if (request == NULL) return BAD_VALUE; 235 if (request_template < 0 || request_template >= CAMERA2_TEMPLATE_COUNT) { 236 return BAD_VALUE; 237 } 238 status_t res; 239 // Pass 1, calculate size and allocate 240 res = constructDefaultRequest(request_template, 241 request, 242 true); 243 if (res != OK) { 244 return res; 245 } 246 // Pass 2, build request 247 res = constructDefaultRequest(request_template, 248 request, 249 false); 250 if (res != OK) { 251 ALOGE("Unable to populate new request for template %d", 252 request_template); 253 } 254 255 return res; 256 } 257 258 int EmulatedFakeCamera2::allocateStream( 259 uint32_t width, 260 uint32_t height, 261 int format, 262 const camera2_stream_ops_t *stream_ops, 263 uint32_t *stream_id, 264 uint32_t *format_actual, 265 uint32_t *usage, 266 uint32_t *max_buffers) { 267 Mutex::Autolock l(mMutex); 268 269 // Temporary shim until FORMAT_ZSL is removed 270 if (format == CAMERA2_HAL_PIXEL_FORMAT_ZSL) { 271 format = HAL_PIXEL_FORMAT_IMPLEMENTATION_DEFINED; 272 } 273 274 if (format != HAL_PIXEL_FORMAT_IMPLEMENTATION_DEFINED) { 275 unsigned int numFormats = sizeof(kAvailableFormats) / sizeof(uint32_t); 276 unsigned int formatIdx = 0; 277 unsigned int sizeOffsetIdx = 0; 278 for (; formatIdx < numFormats; formatIdx++) { 279 if (format == (int)kAvailableFormats[formatIdx]) break; 280 } 281 if (formatIdx == numFormats) { 282 ALOGE("%s: Format 0x%x is not supported", __FUNCTION__, format); 283 return BAD_VALUE; 284 } 285 } 286 287 const uint32_t *availableSizes; 288 size_t availableSizeCount; 289 switch (format) { 290 case HAL_PIXEL_FORMAT_RAW_SENSOR: 291 availableSizes = kAvailableRawSizes; 292 availableSizeCount = sizeof(kAvailableRawSizes)/sizeof(uint32_t); 293 break; 294 case HAL_PIXEL_FORMAT_BLOB: 295 availableSizes = mFacingBack ? 296 kAvailableJpegSizesBack : kAvailableJpegSizesFront; 297 availableSizeCount = mFacingBack ? 298 sizeof(kAvailableJpegSizesBack)/sizeof(uint32_t) : 299 sizeof(kAvailableJpegSizesFront)/sizeof(uint32_t); 300 break; 301 case HAL_PIXEL_FORMAT_IMPLEMENTATION_DEFINED: 302 case HAL_PIXEL_FORMAT_RGBA_8888: 303 case HAL_PIXEL_FORMAT_YV12: 304 case HAL_PIXEL_FORMAT_YCrCb_420_SP: 305 availableSizes = mFacingBack ? 306 kAvailableProcessedSizesBack : kAvailableProcessedSizesFront; 307 availableSizeCount = mFacingBack ? 308 sizeof(kAvailableProcessedSizesBack)/sizeof(uint32_t) : 309 sizeof(kAvailableProcessedSizesFront)/sizeof(uint32_t); 310 break; 311 default: 312 ALOGE("%s: Unknown format 0x%x", __FUNCTION__, format); 313 return BAD_VALUE; 314 } 315 316 unsigned int resIdx = 0; 317 for (; resIdx < availableSizeCount; resIdx++) { 318 if (availableSizes[resIdx * 2] == width && 319 availableSizes[resIdx * 2 + 1] == height) break; 320 } 321 if (resIdx == availableSizeCount) { 322 ALOGE("%s: Format 0x%x does not support resolution %d, %d", __FUNCTION__, 323 format, width, height); 324 return BAD_VALUE; 325 } 326 327 switch (format) { 328 case HAL_PIXEL_FORMAT_RAW_SENSOR: 329 if (mRawStreamCount >= kMaxRawStreamCount) { 330 ALOGE("%s: Cannot allocate another raw stream (%d already allocated)", 331 __FUNCTION__, mRawStreamCount); 332 return INVALID_OPERATION; 333 } 334 mRawStreamCount++; 335 break; 336 case HAL_PIXEL_FORMAT_BLOB: 337 if (mJpegStreamCount >= kMaxJpegStreamCount) { 338 ALOGE("%s: Cannot allocate another JPEG stream (%d already allocated)", 339 __FUNCTION__, mJpegStreamCount); 340 return INVALID_OPERATION; 341 } 342 mJpegStreamCount++; 343 break; 344 default: 345 if (mProcessedStreamCount >= kMaxProcessedStreamCount) { 346 ALOGE("%s: Cannot allocate another processed stream (%d already allocated)", 347 __FUNCTION__, mProcessedStreamCount); 348 return INVALID_OPERATION; 349 } 350 mProcessedStreamCount++; 351 } 352 353 Stream newStream; 354 newStream.ops = stream_ops; 355 newStream.width = width; 356 newStream.height = height; 357 newStream.format = format; 358 // TODO: Query stride from gralloc 359 newStream.stride = width; 360 361 mStreams.add(mNextStreamId, newStream); 362 363 *stream_id = mNextStreamId; 364 if (format_actual) *format_actual = format; 365 *usage = GRALLOC_USAGE_HW_CAMERA_WRITE; 366 *max_buffers = kMaxBufferCount; 367 368 ALOGV("Stream allocated: %d, %d x %d, 0x%x. U: %x, B: %d", 369 *stream_id, width, height, format, *usage, *max_buffers); 370 371 mNextStreamId++; 372 return NO_ERROR; 373 } 374 375 int EmulatedFakeCamera2::registerStreamBuffers( 376 uint32_t stream_id, 377 int num_buffers, 378 buffer_handle_t *buffers) { 379 Mutex::Autolock l(mMutex); 380 381 ALOGV("%s: Stream %d registering %d buffers", __FUNCTION__, 382 stream_id, num_buffers); 383 // Need to find out what the final concrete pixel format for our stream is 384 // Assumes that all buffers have the same format. 385 if (num_buffers < 1) { 386 ALOGE("%s: Stream %d only has %d buffers!", 387 __FUNCTION__, stream_id, num_buffers); 388 return BAD_VALUE; 389 } 390 const cb_handle_t *streamBuffer = 391 reinterpret_cast<const cb_handle_t*>(buffers[0]); 392 393 int finalFormat = streamBuffer->format; 394 395 if (finalFormat == HAL_PIXEL_FORMAT_IMPLEMENTATION_DEFINED) { 396 ALOGE("%s: Stream %d: Bad final pixel format " 397 "HAL_PIXEL_FORMAT_IMPLEMENTATION_DEFINED; " 398 "concrete pixel format required!", __FUNCTION__, stream_id); 399 return BAD_VALUE; 400 } 401 402 ssize_t streamIndex = mStreams.indexOfKey(stream_id); 403 if (streamIndex < 0) { 404 ALOGE("%s: Unknown stream id %d!", __FUNCTION__, stream_id); 405 return BAD_VALUE; 406 } 407 408 Stream &stream = mStreams.editValueAt(streamIndex); 409 410 ALOGV("%s: Stream %d format set to %x, previously %x", 411 __FUNCTION__, stream_id, finalFormat, stream.format); 412 413 stream.format = finalFormat; 414 415 return NO_ERROR; 416 } 417 418 int EmulatedFakeCamera2::releaseStream(uint32_t stream_id) { 419 Mutex::Autolock l(mMutex); 420 421 ssize_t streamIndex = mStreams.indexOfKey(stream_id); 422 if (streamIndex < 0) { 423 ALOGE("%s: Unknown stream id %d!", __FUNCTION__, stream_id); 424 return BAD_VALUE; 425 } 426 427 if (isStreamInUse(stream_id)) { 428 ALOGE("%s: Cannot release stream %d; in use!", __FUNCTION__, 429 stream_id); 430 return BAD_VALUE; 431 } 432 433 switch(mStreams.valueAt(streamIndex).format) { 434 case HAL_PIXEL_FORMAT_RAW_SENSOR: 435 mRawStreamCount--; 436 break; 437 case HAL_PIXEL_FORMAT_BLOB: 438 mJpegStreamCount--; 439 break; 440 default: 441 mProcessedStreamCount--; 442 break; 443 } 444 445 mStreams.removeItemsAt(streamIndex); 446 447 return NO_ERROR; 448 } 449 450 int EmulatedFakeCamera2::allocateReprocessStreamFromStream( 451 uint32_t output_stream_id, 452 const camera2_stream_in_ops_t *stream_ops, 453 uint32_t *stream_id) { 454 Mutex::Autolock l(mMutex); 455 456 ssize_t baseStreamIndex = mStreams.indexOfKey(output_stream_id); 457 if (baseStreamIndex < 0) { 458 ALOGE("%s: Unknown output stream id %d!", __FUNCTION__, output_stream_id); 459 return BAD_VALUE; 460 } 461 462 const Stream &baseStream = mStreams[baseStreamIndex]; 463 464 // We'll reprocess anything we produced 465 466 if (mReprocessStreamCount >= kMaxReprocessStreamCount) { 467 ALOGE("%s: Cannot allocate another reprocess stream (%d already allocated)", 468 __FUNCTION__, mReprocessStreamCount); 469 return INVALID_OPERATION; 470 } 471 mReprocessStreamCount++; 472 473 ReprocessStream newStream; 474 newStream.ops = stream_ops; 475 newStream.width = baseStream.width; 476 newStream.height = baseStream.height; 477 newStream.format = baseStream.format; 478 newStream.stride = baseStream.stride; 479 newStream.sourceStreamId = output_stream_id; 480 481 *stream_id = mNextReprocessStreamId; 482 mReprocessStreams.add(mNextReprocessStreamId, newStream); 483 484 ALOGV("Reprocess stream allocated: %d: %d, %d, 0x%x. Parent stream: %d", 485 *stream_id, newStream.width, newStream.height, newStream.format, 486 output_stream_id); 487 488 mNextReprocessStreamId++; 489 return NO_ERROR; 490 } 491 492 int EmulatedFakeCamera2::releaseReprocessStream(uint32_t stream_id) { 493 Mutex::Autolock l(mMutex); 494 495 ssize_t streamIndex = mReprocessStreams.indexOfKey(stream_id); 496 if (streamIndex < 0) { 497 ALOGE("%s: Unknown reprocess stream id %d!", __FUNCTION__, stream_id); 498 return BAD_VALUE; 499 } 500 501 if (isReprocessStreamInUse(stream_id)) { 502 ALOGE("%s: Cannot release reprocessing stream %d; in use!", __FUNCTION__, 503 stream_id); 504 return BAD_VALUE; 505 } 506 507 mReprocessStreamCount--; 508 mReprocessStreams.removeItemsAt(streamIndex); 509 510 return NO_ERROR; 511 } 512 513 int EmulatedFakeCamera2::triggerAction(uint32_t trigger_id, 514 int32_t ext1, 515 int32_t ext2) { 516 Mutex::Autolock l(mMutex); 517 return mControlThread->triggerAction(trigger_id, 518 ext1, ext2); 519 } 520 521 /** Custom tag definitions */ 522 523 // Emulator camera metadata sections 524 enum { 525 EMULATOR_SCENE = VENDOR_SECTION, 526 END_EMULATOR_SECTIONS 527 }; 528 529 enum { 530 EMULATOR_SCENE_START = EMULATOR_SCENE << 16, 531 }; 532 533 // Emulator camera metadata tags 534 enum { 535 // Hour of day to use for lighting calculations (0-23). Default: 12 536 EMULATOR_SCENE_HOUROFDAY = EMULATOR_SCENE_START, 537 EMULATOR_SCENE_END 538 }; 539 540 unsigned int emulator_metadata_section_bounds[END_EMULATOR_SECTIONS - 541 VENDOR_SECTION][2] = { 542 { EMULATOR_SCENE_START, EMULATOR_SCENE_END } 543 }; 544 545 const char *emulator_metadata_section_names[END_EMULATOR_SECTIONS - 546 VENDOR_SECTION] = { 547 "com.android.emulator.scene" 548 }; 549 550 typedef struct emulator_tag_info { 551 const char *tag_name; 552 uint8_t tag_type; 553 } emulator_tag_info_t; 554 555 emulator_tag_info_t emulator_scene[EMULATOR_SCENE_END - EMULATOR_SCENE_START] = { 556 { "hourOfDay", TYPE_INT32 } 557 }; 558 559 emulator_tag_info_t *tag_info[END_EMULATOR_SECTIONS - 560 VENDOR_SECTION] = { 561 emulator_scene 562 }; 563 564 const char* EmulatedFakeCamera2::getVendorSectionName(uint32_t tag) { 565 ALOGV("%s", __FUNCTION__); 566 uint32_t section = tag >> 16; 567 if (section < VENDOR_SECTION || section > END_EMULATOR_SECTIONS) return NULL; 568 return emulator_metadata_section_names[section - VENDOR_SECTION]; 569 } 570 571 const char* EmulatedFakeCamera2::getVendorTagName(uint32_t tag) { 572 ALOGV("%s", __FUNCTION__); 573 uint32_t section = tag >> 16; 574 if (section < VENDOR_SECTION || section > END_EMULATOR_SECTIONS) return NULL; 575 uint32_t section_index = section - VENDOR_SECTION; 576 if (tag >= emulator_metadata_section_bounds[section_index][1]) { 577 return NULL; 578 } 579 uint32_t tag_index = tag & 0xFFFF; 580 return tag_info[section_index][tag_index].tag_name; 581 } 582 583 int EmulatedFakeCamera2::getVendorTagType(uint32_t tag) { 584 ALOGV("%s", __FUNCTION__); 585 uint32_t section = tag >> 16; 586 if (section < VENDOR_SECTION || section > END_EMULATOR_SECTIONS) return -1; 587 uint32_t section_index = section - VENDOR_SECTION; 588 if (tag >= emulator_metadata_section_bounds[section_index][1]) { 589 return -1; 590 } 591 uint32_t tag_index = tag & 0xFFFF; 592 return tag_info[section_index][tag_index].tag_type; 593 } 594 595 /** Shutdown and debug methods */ 596 597 int EmulatedFakeCamera2::dump(int fd) { 598 String8 result; 599 600 result.appendFormat(" Camera HAL device: EmulatedFakeCamera2\n"); 601 result.appendFormat(" Streams:\n"); 602 for (size_t i = 0; i < mStreams.size(); i++) { 603 int id = mStreams.keyAt(i); 604 const Stream& s = mStreams.valueAt(i); 605 result.appendFormat( 606 " Stream %d: %d x %d, format 0x%x, stride %d\n", 607 id, s.width, s.height, s.format, s.stride); 608 } 609 610 write(fd, result.string(), result.size()); 611 612 return NO_ERROR; 613 } 614 615 void EmulatedFakeCamera2::signalError() { 616 // TODO: Let parent know so we can shut down cleanly 617 ALOGE("Worker thread is signaling a serious error"); 618 } 619 620 /** Pipeline control worker thread methods */ 621 622 EmulatedFakeCamera2::ConfigureThread::ConfigureThread(EmulatedFakeCamera2 *parent): 623 Thread(false), 624 mParent(parent), 625 mRequestCount(0), 626 mNextBuffers(NULL) { 627 mRunning = false; 628 } 629 630 EmulatedFakeCamera2::ConfigureThread::~ConfigureThread() { 631 } 632 633 status_t EmulatedFakeCamera2::ConfigureThread::readyToRun() { 634 Mutex::Autolock lock(mInputMutex); 635 636 ALOGV("Starting up ConfigureThread"); 637 mRequest = NULL; 638 mActive = false; 639 mRunning = true; 640 641 mInputSignal.signal(); 642 return NO_ERROR; 643 } 644 645 status_t EmulatedFakeCamera2::ConfigureThread::waitUntilRunning() { 646 Mutex::Autolock lock(mInputMutex); 647 if (!mRunning) { 648 ALOGV("Waiting for configure thread to start"); 649 mInputSignal.wait(mInputMutex); 650 } 651 return OK; 652 } 653 654 status_t EmulatedFakeCamera2::ConfigureThread::newRequestAvailable() { 655 waitUntilRunning(); 656 657 Mutex::Autolock lock(mInputMutex); 658 659 mActive = true; 660 mInputSignal.signal(); 661 662 return OK; 663 } 664 665 bool EmulatedFakeCamera2::ConfigureThread::isStreamInUse(uint32_t id) { 666 Mutex::Autolock lock(mInternalsMutex); 667 668 if (mNextBuffers == NULL) return false; 669 for (size_t i=0; i < mNextBuffers->size(); i++) { 670 if ((*mNextBuffers)[i].streamId == (int)id) return true; 671 } 672 return false; 673 } 674 675 int EmulatedFakeCamera2::ConfigureThread::getInProgressCount() { 676 Mutex::Autolock lock(mInputMutex); 677 return mRequestCount; 678 } 679 680 bool EmulatedFakeCamera2::ConfigureThread::threadLoop() { 681 status_t res; 682 683 // Check if we're currently processing or just waiting 684 { 685 Mutex::Autolock lock(mInputMutex); 686 if (!mActive) { 687 // Inactive, keep waiting until we've been signaled 688 status_t res; 689 res = mInputSignal.waitRelative(mInputMutex, kWaitPerLoop); 690 if (res != NO_ERROR && res != TIMED_OUT) { 691 ALOGE("%s: Error waiting for input requests: %d", 692 __FUNCTION__, res); 693 return false; 694 } 695 if (!mActive) return true; 696 ALOGV("New request available"); 697 } 698 // Active 699 } 700 if (mRequest == NULL) { 701 Mutex::Autolock il(mInternalsMutex); 702 703 ALOGV("Configure: Getting next request"); 704 res = mParent->mRequestQueueSrc->dequeue_request( 705 mParent->mRequestQueueSrc, 706 &mRequest); 707 if (res != NO_ERROR) { 708 ALOGE("%s: Error dequeuing next request: %d", __FUNCTION__, res); 709 mParent->signalError(); 710 return false; 711 } 712 if (mRequest == NULL) { 713 ALOGV("Configure: Request queue empty, going inactive"); 714 // No requests available, go into inactive mode 715 Mutex::Autolock lock(mInputMutex); 716 mActive = false; 717 return true; 718 } else { 719 Mutex::Autolock lock(mInputMutex); 720 mRequestCount++; 721 } 722 723 camera_metadata_entry_t type; 724 res = find_camera_metadata_entry(mRequest, 725 ANDROID_REQUEST_TYPE, 726 &type); 727 if (res != NO_ERROR) { 728 ALOGE("%s: error reading request type", __FUNCTION__); 729 mParent->signalError(); 730 return false; 731 } 732 bool success = false;; 733 switch (type.data.u8[0]) { 734 case ANDROID_REQUEST_TYPE_CAPTURE: 735 success = setupCapture(); 736 break; 737 case ANDROID_REQUEST_TYPE_REPROCESS: 738 success = setupReprocess(); 739 break; 740 default: 741 ALOGE("%s: Unexpected request type %d", 742 __FUNCTION__, type.data.u8[0]); 743 mParent->signalError(); 744 break; 745 } 746 if (!success) return false; 747 748 } 749 750 if (mWaitingForReadout) { 751 bool readoutDone; 752 readoutDone = mParent->mReadoutThread->waitForReady(kWaitPerLoop); 753 if (!readoutDone) return true; 754 755 if (mNextNeedsJpeg) { 756 ALOGV("Configure: Waiting for JPEG compressor"); 757 } else { 758 ALOGV("Configure: Waiting for sensor"); 759 } 760 mWaitingForReadout = false; 761 } 762 763 if (mNextNeedsJpeg) { 764 bool jpegDone; 765 jpegDone = mParent->mJpegCompressor->waitForDone(kWaitPerLoop); 766 if (!jpegDone) return true; 767 768 ALOGV("Configure: Waiting for sensor"); 769 mNextNeedsJpeg = false; 770 } 771 772 if (mNextIsCapture) { 773 return configureNextCapture(); 774 } else { 775 return configureNextReprocess(); 776 } 777 } 778 779 bool EmulatedFakeCamera2::ConfigureThread::setupCapture() { 780 status_t res; 781 782 mNextIsCapture = true; 783 // Get necessary parameters for sensor config 784 mParent->mControlThread->processRequest(mRequest); 785 786 camera_metadata_entry_t streams; 787 res = find_camera_metadata_entry(mRequest, 788 ANDROID_REQUEST_OUTPUT_STREAMS, 789 &streams); 790 if (res != NO_ERROR) { 791 ALOGE("%s: error reading output stream tag", __FUNCTION__); 792 mParent->signalError(); 793 return false; 794 } 795 796 mNextBuffers = new Buffers; 797 mNextNeedsJpeg = false; 798 ALOGV("Configure: Setting up buffers for capture"); 799 for (size_t i = 0; i < streams.count; i++) { 800 int streamId = streams.data.u8[i]; 801 const Stream &s = mParent->getStreamInfo(streamId); 802 if (s.format == HAL_PIXEL_FORMAT_IMPLEMENTATION_DEFINED) { 803 ALOGE("%s: Stream %d does not have a concrete pixel format, but " 804 "is included in a request!", __FUNCTION__, streamId); 805 mParent->signalError(); 806 return false; 807 } 808 StreamBuffer b; 809 b.streamId = streams.data.u8[i]; 810 b.width = s.width; 811 b.height = s.height; 812 b.format = s.format; 813 b.stride = s.stride; 814 mNextBuffers->push_back(b); 815 ALOGV("Configure: Buffer %d: Stream %d, %d x %d, format 0x%x, " 816 "stride %d", 817 i, b.streamId, b.width, b.height, b.format, b.stride); 818 if (b.format == HAL_PIXEL_FORMAT_BLOB) { 819 mNextNeedsJpeg = true; 820 } 821 } 822 823 camera_metadata_entry_t e; 824 res = find_camera_metadata_entry(mRequest, 825 ANDROID_REQUEST_FRAME_COUNT, 826 &e); 827 if (res != NO_ERROR) { 828 ALOGE("%s: error reading frame count tag: %s (%d)", 829 __FUNCTION__, strerror(-res), res); 830 mParent->signalError(); 831 return false; 832 } 833 mNextFrameNumber = *e.data.i32; 834 835 res = find_camera_metadata_entry(mRequest, 836 ANDROID_SENSOR_EXPOSURE_TIME, 837 &e); 838 if (res != NO_ERROR) { 839 ALOGE("%s: error reading exposure time tag: %s (%d)", 840 __FUNCTION__, strerror(-res), res); 841 mParent->signalError(); 842 return false; 843 } 844 mNextExposureTime = *e.data.i64; 845 846 res = find_camera_metadata_entry(mRequest, 847 ANDROID_SENSOR_FRAME_DURATION, 848 &e); 849 if (res != NO_ERROR) { 850 ALOGE("%s: error reading frame duration tag", __FUNCTION__); 851 mParent->signalError(); 852 return false; 853 } 854 mNextFrameDuration = *e.data.i64; 855 856 if (mNextFrameDuration < 857 mNextExposureTime + Sensor::kMinVerticalBlank) { 858 mNextFrameDuration = mNextExposureTime + Sensor::kMinVerticalBlank; 859 } 860 res = find_camera_metadata_entry(mRequest, 861 ANDROID_SENSOR_SENSITIVITY, 862 &e); 863 if (res != NO_ERROR) { 864 ALOGE("%s: error reading sensitivity tag", __FUNCTION__); 865 mParent->signalError(); 866 return false; 867 } 868 mNextSensitivity = *e.data.i32; 869 870 res = find_camera_metadata_entry(mRequest, 871 EMULATOR_SCENE_HOUROFDAY, 872 &e); 873 if (res == NO_ERROR) { 874 ALOGV("Setting hour: %d", *e.data.i32); 875 mParent->mSensor->getScene().setHour(*e.data.i32); 876 } 877 878 // Start waiting on readout thread 879 mWaitingForReadout = true; 880 ALOGV("Configure: Waiting for readout thread"); 881 882 return true; 883 } 884 885 bool EmulatedFakeCamera2::ConfigureThread::configureNextCapture() { 886 bool vsync = mParent->mSensor->waitForVSync(kWaitPerLoop); 887 if (!vsync) return true; 888 889 Mutex::Autolock il(mInternalsMutex); 890 ALOGV("Configure: Configuring sensor for capture %d", mNextFrameNumber); 891 mParent->mSensor->setExposureTime(mNextExposureTime); 892 mParent->mSensor->setFrameDuration(mNextFrameDuration); 893 mParent->mSensor->setSensitivity(mNextSensitivity); 894 895 getBuffers(); 896 897 ALOGV("Configure: Done configure for capture %d", mNextFrameNumber); 898 mParent->mReadoutThread->setNextOperation(true, mRequest, mNextBuffers); 899 mParent->mSensor->setDestinationBuffers(mNextBuffers); 900 901 mRequest = NULL; 902 mNextBuffers = NULL; 903 904 Mutex::Autolock lock(mInputMutex); 905 mRequestCount--; 906 907 return true; 908 } 909 910 bool EmulatedFakeCamera2::ConfigureThread::setupReprocess() { 911 status_t res; 912 913 mNextNeedsJpeg = true; 914 mNextIsCapture = false; 915 916 camera_metadata_entry_t reprocessStreams; 917 res = find_camera_metadata_entry(mRequest, 918 ANDROID_REQUEST_INPUT_STREAMS, 919 &reprocessStreams); 920 if (res != NO_ERROR) { 921 ALOGE("%s: error reading output stream tag", __FUNCTION__); 922 mParent->signalError(); 923 return false; 924 } 925 926 mNextBuffers = new Buffers; 927 928 ALOGV("Configure: Setting up input buffers for reprocess"); 929 for (size_t i = 0; i < reprocessStreams.count; i++) { 930 int streamId = reprocessStreams.data.u8[i]; 931 const ReprocessStream &s = mParent->getReprocessStreamInfo(streamId); 932 if (s.format != HAL_PIXEL_FORMAT_RGB_888) { 933 ALOGE("%s: Only ZSL reprocessing supported!", 934 __FUNCTION__); 935 mParent->signalError(); 936 return false; 937 } 938 StreamBuffer b; 939 b.streamId = -streamId; 940 b.width = s.width; 941 b.height = s.height; 942 b.format = s.format; 943 b.stride = s.stride; 944 mNextBuffers->push_back(b); 945 } 946 947 camera_metadata_entry_t streams; 948 res = find_camera_metadata_entry(mRequest, 949 ANDROID_REQUEST_OUTPUT_STREAMS, 950 &streams); 951 if (res != NO_ERROR) { 952 ALOGE("%s: error reading output stream tag", __FUNCTION__); 953 mParent->signalError(); 954 return false; 955 } 956 957 ALOGV("Configure: Setting up output buffers for reprocess"); 958 for (size_t i = 0; i < streams.count; i++) { 959 int streamId = streams.data.u8[i]; 960 const Stream &s = mParent->getStreamInfo(streamId); 961 if (s.format != HAL_PIXEL_FORMAT_BLOB) { 962 // TODO: Support reprocess to YUV 963 ALOGE("%s: Non-JPEG output stream %d for reprocess not supported", 964 __FUNCTION__, streamId); 965 mParent->signalError(); 966 return false; 967 } 968 StreamBuffer b; 969 b.streamId = streams.data.u8[i]; 970 b.width = s.width; 971 b.height = s.height; 972 b.format = s.format; 973 b.stride = s.stride; 974 mNextBuffers->push_back(b); 975 ALOGV("Configure: Buffer %d: Stream %d, %d x %d, format 0x%x, " 976 "stride %d", 977 i, b.streamId, b.width, b.height, b.format, b.stride); 978 } 979 980 camera_metadata_entry_t e; 981 res = find_camera_metadata_entry(mRequest, 982 ANDROID_REQUEST_FRAME_COUNT, 983 &e); 984 if (res != NO_ERROR) { 985 ALOGE("%s: error reading frame count tag: %s (%d)", 986 __FUNCTION__, strerror(-res), res); 987 mParent->signalError(); 988 return false; 989 } 990 mNextFrameNumber = *e.data.i32; 991 992 return true; 993 } 994 995 bool EmulatedFakeCamera2::ConfigureThread::configureNextReprocess() { 996 Mutex::Autolock il(mInternalsMutex); 997 998 getBuffers(); 999 1000 ALOGV("Configure: Done configure for reprocess %d", mNextFrameNumber); 1001 mParent->mReadoutThread->setNextOperation(false, mRequest, mNextBuffers); 1002 1003 mRequest = NULL; 1004 mNextBuffers = NULL; 1005 1006 Mutex::Autolock lock(mInputMutex); 1007 mRequestCount--; 1008 1009 return true; 1010 } 1011 1012 bool EmulatedFakeCamera2::ConfigureThread::getBuffers() { 1013 status_t res; 1014 /** Get buffers to fill for this frame */ 1015 for (size_t i = 0; i < mNextBuffers->size(); i++) { 1016 StreamBuffer &b = mNextBuffers->editItemAt(i); 1017 1018 if (b.streamId > 0) { 1019 Stream s = mParent->getStreamInfo(b.streamId); 1020 ALOGV("Configure: Dequeing buffer from stream %d", b.streamId); 1021 res = s.ops->dequeue_buffer(s.ops, &(b.buffer) ); 1022 if (res != NO_ERROR || b.buffer == NULL) { 1023 ALOGE("%s: Unable to dequeue buffer from stream %d: %s (%d)", 1024 __FUNCTION__, b.streamId, strerror(-res), res); 1025 mParent->signalError(); 1026 return false; 1027 } 1028 1029 /* Lock the buffer from the perspective of the graphics mapper */ 1030 const Rect rect(s.width, s.height); 1031 1032 res = GraphicBufferMapper::get().lock(*(b.buffer), 1033 GRALLOC_USAGE_HW_CAMERA_WRITE, 1034 rect, (void**)&(b.img) ); 1035 1036 if (res != NO_ERROR) { 1037 ALOGE("%s: grbuffer_mapper.lock failure: %s (%d)", 1038 __FUNCTION__, strerror(-res), res); 1039 s.ops->cancel_buffer(s.ops, 1040 b.buffer); 1041 mParent->signalError(); 1042 return false; 1043 } 1044 } else { 1045 ReprocessStream s = mParent->getReprocessStreamInfo(-b.streamId); 1046 ALOGV("Configure: Acquiring buffer from reprocess stream %d", 1047 -b.streamId); 1048 res = s.ops->acquire_buffer(s.ops, &(b.buffer) ); 1049 if (res != NO_ERROR || b.buffer == NULL) { 1050 ALOGE("%s: Unable to acquire buffer from reprocess stream %d: " 1051 "%s (%d)", __FUNCTION__, -b.streamId, 1052 strerror(-res), res); 1053 mParent->signalError(); 1054 return false; 1055 } 1056 1057 /* Lock the buffer from the perspective of the graphics mapper */ 1058 const Rect rect(s.width, s.height); 1059 1060 res = GraphicBufferMapper::get().lock(*(b.buffer), 1061 GRALLOC_USAGE_HW_CAMERA_READ, 1062 rect, (void**)&(b.img) ); 1063 if (res != NO_ERROR) { 1064 ALOGE("%s: grbuffer_mapper.lock failure: %s (%d)", 1065 __FUNCTION__, strerror(-res), res); 1066 s.ops->release_buffer(s.ops, 1067 b.buffer); 1068 mParent->signalError(); 1069 return false; 1070 } 1071 } 1072 } 1073 return true; 1074 } 1075 1076 EmulatedFakeCamera2::ReadoutThread::ReadoutThread(EmulatedFakeCamera2 *parent): 1077 Thread(false), 1078 mParent(parent), 1079 mRunning(false), 1080 mActive(false), 1081 mRequestCount(0), 1082 mRequest(NULL), 1083 mBuffers(NULL) { 1084 mInFlightQueue = new InFlightQueue[kInFlightQueueSize]; 1085 mInFlightHead = 0; 1086 mInFlightTail = 0; 1087 } 1088 1089 EmulatedFakeCamera2::ReadoutThread::~ReadoutThread() { 1090 delete mInFlightQueue; 1091 } 1092 1093 status_t EmulatedFakeCamera2::ReadoutThread::readyToRun() { 1094 Mutex::Autolock lock(mInputMutex); 1095 ALOGV("Starting up ReadoutThread"); 1096 mRunning = true; 1097 mInputSignal.signal(); 1098 return NO_ERROR; 1099 } 1100 1101 status_t EmulatedFakeCamera2::ReadoutThread::waitUntilRunning() { 1102 Mutex::Autolock lock(mInputMutex); 1103 if (!mRunning) { 1104 ALOGV("Waiting for readout thread to start"); 1105 mInputSignal.wait(mInputMutex); 1106 } 1107 return OK; 1108 } 1109 1110 bool EmulatedFakeCamera2::ReadoutThread::waitForReady(nsecs_t timeout) { 1111 status_t res; 1112 Mutex::Autolock lock(mInputMutex); 1113 while (!readyForNextCapture()) { 1114 res = mReadySignal.waitRelative(mInputMutex, timeout); 1115 if (res == TIMED_OUT) return false; 1116 if (res != OK) { 1117 ALOGE("%s: Error waiting for ready: %s (%d)", __FUNCTION__, 1118 strerror(-res), res); 1119 return false; 1120 } 1121 } 1122 return true; 1123 } 1124 1125 bool EmulatedFakeCamera2::ReadoutThread::readyForNextCapture() { 1126 return (mInFlightTail + 1) % kInFlightQueueSize != mInFlightHead; 1127 } 1128 1129 void EmulatedFakeCamera2::ReadoutThread::setNextOperation( 1130 bool isCapture, 1131 camera_metadata_t *request, 1132 Buffers *buffers) { 1133 Mutex::Autolock lock(mInputMutex); 1134 if ( !readyForNextCapture() ) { 1135 ALOGE("In flight queue full, dropping captures"); 1136 mParent->signalError(); 1137 return; 1138 } 1139 mInFlightQueue[mInFlightTail].isCapture = isCapture; 1140 mInFlightQueue[mInFlightTail].request = request; 1141 mInFlightQueue[mInFlightTail].buffers = buffers; 1142 mInFlightTail = (mInFlightTail + 1) % kInFlightQueueSize; 1143 mRequestCount++; 1144 1145 if (!mActive) { 1146 mActive = true; 1147 mInputSignal.signal(); 1148 } 1149 } 1150 1151 bool EmulatedFakeCamera2::ReadoutThread::isStreamInUse(uint32_t id) { 1152 Mutex::Autolock lock(mInputMutex); 1153 1154 size_t i = mInFlightHead; 1155 while (i != mInFlightTail) { 1156 for (size_t j = 0; j < mInFlightQueue[i].buffers->size(); j++) { 1157 if ( (*(mInFlightQueue[i].buffers))[j].streamId == (int)id ) 1158 return true; 1159 } 1160 i = (i + 1) % kInFlightQueueSize; 1161 } 1162 1163 Mutex::Autolock iLock(mInternalsMutex); 1164 1165 if (mBuffers != NULL) { 1166 for (i = 0; i < mBuffers->size(); i++) { 1167 if ( (*mBuffers)[i].streamId == (int)id) return true; 1168 } 1169 } 1170 1171 return false; 1172 } 1173 1174 int EmulatedFakeCamera2::ReadoutThread::getInProgressCount() { 1175 Mutex::Autolock lock(mInputMutex); 1176 1177 return mRequestCount; 1178 } 1179 1180 bool EmulatedFakeCamera2::ReadoutThread::threadLoop() { 1181 static const nsecs_t kWaitPerLoop = 10000000L; // 10 ms 1182 status_t res; 1183 int32_t frameNumber; 1184 1185 // Check if we're currently processing or just waiting 1186 { 1187 Mutex::Autolock lock(mInputMutex); 1188 if (!mActive) { 1189 // Inactive, keep waiting until we've been signaled 1190 res = mInputSignal.waitRelative(mInputMutex, kWaitPerLoop); 1191 if (res != NO_ERROR && res != TIMED_OUT) { 1192 ALOGE("%s: Error waiting for capture requests: %d", 1193 __FUNCTION__, res); 1194 mParent->signalError(); 1195 return false; 1196 } 1197 if (!mActive) return true; 1198 } 1199 // Active, see if we need a new request 1200 if (mRequest == NULL) { 1201 if (mInFlightHead == mInFlightTail) { 1202 // Go inactive 1203 ALOGV("Waiting for sensor data"); 1204 mActive = false; 1205 return true; 1206 } else { 1207 Mutex::Autolock iLock(mInternalsMutex); 1208 mReadySignal.signal(); 1209 mIsCapture = mInFlightQueue[mInFlightHead].isCapture; 1210 mRequest = mInFlightQueue[mInFlightHead].request; 1211 mBuffers = mInFlightQueue[mInFlightHead].buffers; 1212 mInFlightQueue[mInFlightHead].request = NULL; 1213 mInFlightQueue[mInFlightHead].buffers = NULL; 1214 mInFlightHead = (mInFlightHead + 1) % kInFlightQueueSize; 1215 ALOGV("Ready to read out request %p, %d buffers", 1216 mRequest, mBuffers->size()); 1217 } 1218 } 1219 } 1220 1221 // Active with request, wait on sensor to complete 1222 1223 nsecs_t captureTime; 1224 1225 if (mIsCapture) { 1226 bool gotFrame; 1227 gotFrame = mParent->mSensor->waitForNewFrame(kWaitPerLoop, 1228 &captureTime); 1229 1230 if (!gotFrame) return true; 1231 } 1232 1233 Mutex::Autolock iLock(mInternalsMutex); 1234 1235 camera_metadata_entry_t entry; 1236 if (!mIsCapture) { 1237 res = find_camera_metadata_entry(mRequest, 1238 ANDROID_SENSOR_TIMESTAMP, 1239 &entry); 1240 if (res != NO_ERROR) { 1241 ALOGE("%s: error reading reprocessing timestamp: %s (%d)", 1242 __FUNCTION__, strerror(-res), res); 1243 mParent->signalError(); 1244 return false; 1245 } 1246 captureTime = entry.data.i64[0]; 1247 } 1248 1249 res = find_camera_metadata_entry(mRequest, 1250 ANDROID_REQUEST_FRAME_COUNT, 1251 &entry); 1252 if (res != NO_ERROR) { 1253 ALOGE("%s: error reading frame count tag: %s (%d)", 1254 __FUNCTION__, strerror(-res), res); 1255 mParent->signalError(); 1256 return false; 1257 } 1258 frameNumber = *entry.data.i32; 1259 1260 res = find_camera_metadata_entry(mRequest, 1261 ANDROID_REQUEST_METADATA_MODE, 1262 &entry); 1263 if (res != NO_ERROR) { 1264 ALOGE("%s: error reading metadata mode tag: %s (%d)", 1265 __FUNCTION__, strerror(-res), res); 1266 mParent->signalError(); 1267 return false; 1268 } 1269 1270 // Got sensor data and request, construct frame and send it out 1271 ALOGV("Readout: Constructing metadata and frames for request %d", 1272 frameNumber); 1273 1274 if (*entry.data.u8 == ANDROID_REQUEST_METADATA_FULL) { 1275 ALOGV("Readout: Metadata requested, constructing"); 1276 1277 camera_metadata_t *frame = NULL; 1278 1279 size_t frame_entries = get_camera_metadata_entry_count(mRequest); 1280 size_t frame_data = get_camera_metadata_data_count(mRequest); 1281 1282 // TODO: Dynamically calculate based on enabled statistics, etc 1283 frame_entries += 10; 1284 frame_data += 100; 1285 1286 res = mParent->mFrameQueueDst->dequeue_frame(mParent->mFrameQueueDst, 1287 frame_entries, frame_data, &frame); 1288 1289 if (res != NO_ERROR || frame == NULL) { 1290 ALOGE("%s: Unable to dequeue frame metadata buffer", __FUNCTION__); 1291 mParent->signalError(); 1292 return false; 1293 } 1294 1295 res = append_camera_metadata(frame, mRequest); 1296 if (res != NO_ERROR) { 1297 ALOGE("Unable to append request metadata"); 1298 } 1299 1300 if (mIsCapture) { 1301 add_camera_metadata_entry(frame, 1302 ANDROID_SENSOR_TIMESTAMP, 1303 &captureTime, 1304 1); 1305 1306 int32_t hourOfDay = (int32_t)mParent->mSensor->getScene().getHour(); 1307 camera_metadata_entry_t requestedHour; 1308 res = find_camera_metadata_entry(frame, 1309 EMULATOR_SCENE_HOUROFDAY, 1310 &requestedHour); 1311 if (res == NAME_NOT_FOUND) { 1312 res = add_camera_metadata_entry(frame, 1313 EMULATOR_SCENE_HOUROFDAY, 1314 &hourOfDay, 1); 1315 if (res != NO_ERROR) { 1316 ALOGE("Unable to add vendor tag"); 1317 } 1318 } else if (res == OK) { 1319 *requestedHour.data.i32 = hourOfDay; 1320 } else { 1321 ALOGE("%s: Error looking up vendor tag", __FUNCTION__); 1322 } 1323 1324 collectStatisticsMetadata(frame); 1325 // TODO: Collect all final values used from sensor in addition to timestamp 1326 } 1327 1328 ALOGV("Readout: Enqueue frame %d", frameNumber); 1329 mParent->mFrameQueueDst->enqueue_frame(mParent->mFrameQueueDst, 1330 frame); 1331 } 1332 ALOGV("Readout: Free request"); 1333 res = mParent->mRequestQueueSrc->free_request(mParent->mRequestQueueSrc, mRequest); 1334 if (res != NO_ERROR) { 1335 ALOGE("%s: Unable to return request buffer to queue: %d", 1336 __FUNCTION__, res); 1337 mParent->signalError(); 1338 return false; 1339 } 1340 mRequest = NULL; 1341 1342 int compressedBufferIndex = -1; 1343 ALOGV("Readout: Processing %d buffers", mBuffers->size()); 1344 for (size_t i = 0; i < mBuffers->size(); i++) { 1345 const StreamBuffer &b = (*mBuffers)[i]; 1346 ALOGV("Readout: Buffer %d: Stream %d, %d x %d, format 0x%x, stride %d", 1347 i, b.streamId, b.width, b.height, b.format, b.stride); 1348 if (b.streamId > 0) { 1349 if (b.format == HAL_PIXEL_FORMAT_BLOB) { 1350 // Assumes only one BLOB buffer type per capture 1351 compressedBufferIndex = i; 1352 } else { 1353 ALOGV("Readout: Sending image buffer %d (%p) to output stream %d", 1354 i, (void*)*(b.buffer), b.streamId); 1355 GraphicBufferMapper::get().unlock(*(b.buffer)); 1356 const Stream &s = mParent->getStreamInfo(b.streamId); 1357 res = s.ops->enqueue_buffer(s.ops, captureTime, b.buffer); 1358 if (res != OK) { 1359 ALOGE("Error enqueuing image buffer %p: %s (%d)", b.buffer, 1360 strerror(-res), res); 1361 mParent->signalError(); 1362 } 1363 } 1364 } 1365 } 1366 1367 if (compressedBufferIndex == -1) { 1368 delete mBuffers; 1369 mBuffers = NULL; 1370 } else { 1371 ALOGV("Readout: Starting JPEG compression for buffer %d, stream %d", 1372 compressedBufferIndex, 1373 (*mBuffers)[compressedBufferIndex].streamId); 1374 mParent->mJpegCompressor->start(mBuffers, captureTime); 1375 mBuffers = NULL; 1376 } 1377 1378 Mutex::Autolock l(mInputMutex); 1379 mRequestCount--; 1380 ALOGV("Readout: Done with request %d", frameNumber); 1381 return true; 1382 } 1383 1384 status_t EmulatedFakeCamera2::ReadoutThread::collectStatisticsMetadata( 1385 camera_metadata_t *frame) { 1386 // Completely fake face rectangles, don't correspond to real faces in scene 1387 ALOGV("Readout: Collecting statistics metadata"); 1388 1389 status_t res; 1390 camera_metadata_entry_t entry; 1391 res = find_camera_metadata_entry(frame, 1392 ANDROID_STATS_FACE_DETECT_MODE, 1393 &entry); 1394 if (res != OK) { 1395 ALOGE("%s: Unable to find face detect mode!", __FUNCTION__); 1396 return BAD_VALUE; 1397 } 1398 1399 if (entry.data.u8[0] == ANDROID_STATS_FACE_DETECTION_OFF) return OK; 1400 1401 // The coordinate system for the face regions is the raw sensor pixel 1402 // coordinates. Here, we map from the scene coordinates (0-19 in both axis) 1403 // to raw pixels, for the scene defined in fake-pipeline2/Scene.cpp. We 1404 // approximately place two faces on top of the windows of the house. No 1405 // actual faces exist there, but might one day. Note that this doesn't 1406 // account for the offsets used to account for aspect ratio differences, so 1407 // the rectangles don't line up quite right. 1408 const size_t numFaces = 2; 1409 int32_t rects[numFaces * 4] = { 1410 Sensor::kResolution[0] * 10 / 20, 1411 Sensor::kResolution[1] * 15 / 20, 1412 Sensor::kResolution[0] * 12 / 20, 1413 Sensor::kResolution[1] * 17 / 20, 1414 1415 Sensor::kResolution[0] * 16 / 20, 1416 Sensor::kResolution[1] * 15 / 20, 1417 Sensor::kResolution[0] * 18 / 20, 1418 Sensor::kResolution[1] * 17 / 20 1419 }; 1420 // To simulate some kind of real detection going on, we jitter the rectangles on 1421 // each frame by a few pixels in each dimension. 1422 for (size_t i = 0; i < numFaces * 4; i++) { 1423 rects[i] += (int32_t)(((float)rand() / RAND_MAX) * 6 - 3); 1424 } 1425 // The confidence scores (0-100) are similarly jittered. 1426 uint8_t scores[numFaces] = { 85, 95 }; 1427 for (size_t i = 0; i < numFaces; i++) { 1428 scores[i] += (int32_t)(((float)rand() / RAND_MAX) * 10 - 5); 1429 } 1430 1431 res = add_camera_metadata_entry(frame, ANDROID_STATS_FACE_RECTANGLES, 1432 rects, numFaces * 4); 1433 if (res != OK) { 1434 ALOGE("%s: Unable to add face rectangles!", __FUNCTION__); 1435 return BAD_VALUE; 1436 } 1437 1438 res = add_camera_metadata_entry(frame, ANDROID_STATS_FACE_SCORES, 1439 scores, numFaces); 1440 if (res != OK) { 1441 ALOGE("%s: Unable to add face scores!", __FUNCTION__); 1442 return BAD_VALUE; 1443 } 1444 1445 if (entry.data.u8[0] == ANDROID_STATS_FACE_DETECTION_SIMPLE) return OK; 1446 1447 // Advanced face detection options - add eye/mouth coordinates. The 1448 // coordinates in order are (leftEyeX, leftEyeY, rightEyeX, rightEyeY, 1449 // mouthX, mouthY). The mapping is the same as the face rectangles. 1450 int32_t features[numFaces * 6] = { 1451 Sensor::kResolution[0] * 10.5 / 20, 1452 Sensor::kResolution[1] * 16 / 20, 1453 Sensor::kResolution[0] * 11.5 / 20, 1454 Sensor::kResolution[1] * 16 / 20, 1455 Sensor::kResolution[0] * 11 / 20, 1456 Sensor::kResolution[1] * 16.5 / 20, 1457 1458 Sensor::kResolution[0] * 16.5 / 20, 1459 Sensor::kResolution[1] * 16 / 20, 1460 Sensor::kResolution[0] * 17.5 / 20, 1461 Sensor::kResolution[1] * 16 / 20, 1462 Sensor::kResolution[0] * 17 / 20, 1463 Sensor::kResolution[1] * 16.5 / 20, 1464 }; 1465 // Jitter these a bit less than the rects 1466 for (size_t i = 0; i < numFaces * 6; i++) { 1467 features[i] += (int32_t)(((float)rand() / RAND_MAX) * 4 - 2); 1468 } 1469 // These are unique IDs that are used to identify each face while it's 1470 // visible to the detector (if a face went away and came back, it'd get a 1471 // new ID). 1472 int32_t ids[numFaces] = { 1473 100, 200 1474 }; 1475 1476 res = add_camera_metadata_entry(frame, ANDROID_STATS_FACE_LANDMARKS, 1477 features, numFaces * 6); 1478 if (res != OK) { 1479 ALOGE("%s: Unable to add face landmarks!", __FUNCTION__); 1480 return BAD_VALUE; 1481 } 1482 1483 res = add_camera_metadata_entry(frame, ANDROID_STATS_FACE_IDS, 1484 ids, numFaces); 1485 if (res != OK) { 1486 ALOGE("%s: Unable to add face scores!", __FUNCTION__); 1487 return BAD_VALUE; 1488 } 1489 1490 return OK; 1491 } 1492 1493 EmulatedFakeCamera2::ControlThread::ControlThread(EmulatedFakeCamera2 *parent): 1494 Thread(false), 1495 mParent(parent) { 1496 mRunning = false; 1497 } 1498 1499 EmulatedFakeCamera2::ControlThread::~ControlThread() { 1500 } 1501 1502 status_t EmulatedFakeCamera2::ControlThread::readyToRun() { 1503 Mutex::Autolock lock(mInputMutex); 1504 1505 ALOGV("Starting up ControlThread"); 1506 mRunning = true; 1507 mStartAf = false; 1508 mCancelAf = false; 1509 mStartPrecapture = false; 1510 1511 mControlMode = ANDROID_CONTROL_AUTO; 1512 1513 mEffectMode = ANDROID_CONTROL_EFFECT_OFF; 1514 mSceneMode = ANDROID_CONTROL_SCENE_MODE_FACE_PRIORITY; 1515 1516 mAfMode = ANDROID_CONTROL_AF_AUTO; 1517 mAfModeChange = false; 1518 1519 mAeMode = ANDROID_CONTROL_AE_ON; 1520 mAwbMode = ANDROID_CONTROL_AWB_AUTO; 1521 1522 mAfTriggerId = 0; 1523 mPrecaptureTriggerId = 0; 1524 1525 mAfState = ANDROID_CONTROL_AF_STATE_INACTIVE; 1526 mAeState = ANDROID_CONTROL_AE_STATE_INACTIVE; 1527 mAwbState = ANDROID_CONTROL_AWB_STATE_INACTIVE; 1528 1529 mExposureTime = kNormalExposureTime; 1530 1531 mInputSignal.signal(); 1532 return NO_ERROR; 1533 } 1534 1535 status_t EmulatedFakeCamera2::ControlThread::waitUntilRunning() { 1536 Mutex::Autolock lock(mInputMutex); 1537 if (!mRunning) { 1538 ALOGV("Waiting for control thread to start"); 1539 mInputSignal.wait(mInputMutex); 1540 } 1541 return OK; 1542 } 1543 1544 status_t EmulatedFakeCamera2::ControlThread::processRequest(camera_metadata_t *request) { 1545 Mutex::Autolock lock(mInputMutex); 1546 // TODO: Add handling for all android.control.* fields here 1547 camera_metadata_entry_t mode; 1548 status_t res; 1549 1550 res = find_camera_metadata_entry(request, 1551 ANDROID_CONTROL_MODE, 1552 &mode); 1553 mControlMode = mode.data.u8[0]; 1554 1555 res = find_camera_metadata_entry(request, 1556 ANDROID_CONTROL_EFFECT_MODE, 1557 &mode); 1558 mEffectMode = mode.data.u8[0]; 1559 1560 res = find_camera_metadata_entry(request, 1561 ANDROID_CONTROL_SCENE_MODE, 1562 &mode); 1563 mSceneMode = mode.data.u8[0]; 1564 1565 res = find_camera_metadata_entry(request, 1566 ANDROID_CONTROL_AF_MODE, 1567 &mode); 1568 if (mAfMode != mode.data.u8[0]) { 1569 ALOGV("AF new mode: %d, old mode %d", mode.data.u8[0], mAfMode); 1570 mAfMode = mode.data.u8[0]; 1571 mAfModeChange = true; 1572 mStartAf = false; 1573 mCancelAf = false; 1574 } 1575 1576 res = find_camera_metadata_entry(request, 1577 ANDROID_CONTROL_AE_MODE, 1578 &mode); 1579 mAeMode = mode.data.u8[0]; 1580 1581 res = find_camera_metadata_entry(request, 1582 ANDROID_CONTROL_AE_LOCK, 1583 &mode); 1584 bool aeLock = (mode.data.u8[0] == ANDROID_CONTROL_AE_LOCK_ON); 1585 if (mAeLock && !aeLock) { 1586 mAeState = ANDROID_CONTROL_AE_STATE_INACTIVE; 1587 } 1588 mAeLock = aeLock; 1589 1590 res = find_camera_metadata_entry(request, 1591 ANDROID_CONTROL_AWB_MODE, 1592 &mode); 1593 mAwbMode = mode.data.u8[0]; 1594 1595 // TODO: Override more control fields 1596 1597 if (mAeMode != ANDROID_CONTROL_AE_OFF) { 1598 camera_metadata_entry_t exposureTime; 1599 res = find_camera_metadata_entry(request, 1600 ANDROID_SENSOR_EXPOSURE_TIME, 1601 &exposureTime); 1602 if (res == OK) { 1603 exposureTime.data.i64[0] = mExposureTime; 1604 } 1605 } 1606 1607 return OK; 1608 } 1609 1610 status_t EmulatedFakeCamera2::ControlThread::triggerAction(uint32_t msgType, 1611 int32_t ext1, int32_t ext2) { 1612 ALOGV("%s: Triggering %d (%d, %d)", __FUNCTION__, msgType, ext1, ext2); 1613 Mutex::Autolock lock(mInputMutex); 1614 switch (msgType) { 1615 case CAMERA2_TRIGGER_AUTOFOCUS: 1616 mAfTriggerId = ext1; 1617 mStartAf = true; 1618 mCancelAf = false; 1619 break; 1620 case CAMERA2_TRIGGER_CANCEL_AUTOFOCUS: 1621 mAfTriggerId = ext1; 1622 mStartAf = false; 1623 mCancelAf = true; 1624 break; 1625 case CAMERA2_TRIGGER_PRECAPTURE_METERING: 1626 mPrecaptureTriggerId = ext1; 1627 mStartPrecapture = true; 1628 break; 1629 default: 1630 ALOGE("%s: Unknown action triggered: %d (arguments %d %d)", 1631 __FUNCTION__, msgType, ext1, ext2); 1632 return BAD_VALUE; 1633 } 1634 return OK; 1635 } 1636 1637 const nsecs_t EmulatedFakeCamera2::ControlThread::kControlCycleDelay = 100 * MSEC; 1638 const nsecs_t EmulatedFakeCamera2::ControlThread::kMinAfDuration = 500 * MSEC; 1639 const nsecs_t EmulatedFakeCamera2::ControlThread::kMaxAfDuration = 900 * MSEC; 1640 const float EmulatedFakeCamera2::ControlThread::kAfSuccessRate = 0.9; 1641 // Once every 5 seconds 1642 const float EmulatedFakeCamera2::ControlThread::kContinuousAfStartRate = 1643 kControlCycleDelay / 5.0 * SEC; 1644 const nsecs_t EmulatedFakeCamera2::ControlThread::kMinAeDuration = 500 * MSEC; 1645 const nsecs_t EmulatedFakeCamera2::ControlThread::kMaxAeDuration = 2 * SEC; 1646 const nsecs_t EmulatedFakeCamera2::ControlThread::kMinPrecaptureAeDuration = 100 * MSEC; 1647 const nsecs_t EmulatedFakeCamera2::ControlThread::kMaxPrecaptureAeDuration = 400 * MSEC; 1648 // Once every 3 seconds 1649 const float EmulatedFakeCamera2::ControlThread::kAeScanStartRate = 1650 kControlCycleDelay / 3000000000.0; 1651 1652 const nsecs_t EmulatedFakeCamera2::ControlThread::kNormalExposureTime = 10 * MSEC; 1653 const nsecs_t EmulatedFakeCamera2::ControlThread::kExposureJump = 2 * MSEC; 1654 const nsecs_t EmulatedFakeCamera2::ControlThread::kMinExposureTime = 1 * MSEC; 1655 1656 bool EmulatedFakeCamera2::ControlThread::threadLoop() { 1657 bool afModeChange = false; 1658 bool afTriggered = false; 1659 bool afCancelled = false; 1660 uint8_t afState; 1661 uint8_t afMode; 1662 int32_t afTriggerId; 1663 bool precaptureTriggered = false; 1664 uint8_t aeState; 1665 uint8_t aeMode; 1666 bool aeLock; 1667 int32_t precaptureTriggerId; 1668 nsecs_t nextSleep = kControlCycleDelay; 1669 1670 { 1671 Mutex::Autolock lock(mInputMutex); 1672 if (mStartAf) { 1673 ALOGD("Starting AF trigger processing"); 1674 afTriggered = true; 1675 mStartAf = false; 1676 } else if (mCancelAf) { 1677 ALOGD("Starting cancel AF trigger processing"); 1678 afCancelled = true; 1679 mCancelAf = false; 1680 } 1681 afState = mAfState; 1682 afMode = mAfMode; 1683 afModeChange = mAfModeChange; 1684 mAfModeChange = false; 1685 1686 afTriggerId = mAfTriggerId; 1687 1688 if(mStartPrecapture) { 1689 ALOGD("Starting precapture trigger processing"); 1690 precaptureTriggered = true; 1691 mStartPrecapture = false; 1692 } 1693 aeState = mAeState; 1694 aeMode = mAeMode; 1695 aeLock = mAeLock; 1696 precaptureTriggerId = mPrecaptureTriggerId; 1697 } 1698 1699 if (afCancelled || afModeChange) { 1700 ALOGV("Resetting AF state due to cancel/mode change"); 1701 afState = ANDROID_CONTROL_AF_STATE_INACTIVE; 1702 updateAfState(afState, afTriggerId); 1703 mAfScanDuration = 0; 1704 mLockAfterPassiveScan = false; 1705 } 1706 1707 uint8_t oldAfState = afState; 1708 1709 if (afTriggered) { 1710 afState = processAfTrigger(afMode, afState); 1711 } 1712 1713 afState = maybeStartAfScan(afMode, afState); 1714 afState = updateAfScan(afMode, afState, &nextSleep); 1715 updateAfState(afState, afTriggerId); 1716 1717 if (precaptureTriggered) { 1718 aeState = processPrecaptureTrigger(aeMode, aeState); 1719 } 1720 1721 aeState = maybeStartAeScan(aeMode, aeLock, aeState); 1722 aeState = updateAeScan(aeMode, aeLock, aeState, &nextSleep); 1723 updateAeState(aeState, precaptureTriggerId); 1724 1725 int ret; 1726 timespec t; 1727 t.tv_sec = 0; 1728 t.tv_nsec = nextSleep; 1729 do { 1730 ret = nanosleep(&t, &t); 1731 } while (ret != 0); 1732 1733 if (mAfScanDuration > 0) { 1734 mAfScanDuration -= nextSleep; 1735 } 1736 if (mAeScanDuration > 0) { 1737 mAeScanDuration -= nextSleep; 1738 } 1739 1740 return true; 1741 } 1742 1743 int EmulatedFakeCamera2::ControlThread::processAfTrigger(uint8_t afMode, 1744 uint8_t afState) { 1745 switch (afMode) { 1746 case ANDROID_CONTROL_AF_OFF: 1747 case ANDROID_CONTROL_AF_EDOF: 1748 // Do nothing 1749 break; 1750 case ANDROID_CONTROL_AF_MACRO: 1751 case ANDROID_CONTROL_AF_AUTO: 1752 switch (afState) { 1753 case ANDROID_CONTROL_AF_STATE_INACTIVE: 1754 case ANDROID_CONTROL_AF_STATE_FOCUSED_LOCKED: 1755 case ANDROID_CONTROL_AF_STATE_NOT_FOCUSED_LOCKED: 1756 // Start new focusing cycle 1757 mAfScanDuration = ((double)rand() / RAND_MAX) * 1758 (kMaxAfDuration - kMinAfDuration) + kMinAfDuration; 1759 afState = ANDROID_CONTROL_AF_STATE_ACTIVE_SCAN; 1760 ALOGV("%s: AF scan start, duration %lld ms", 1761 __FUNCTION__, mAfScanDuration / 1000000); 1762 break; 1763 case ANDROID_CONTROL_AF_STATE_ACTIVE_SCAN: 1764 // Ignore new request, already scanning 1765 break; 1766 default: 1767 ALOGE("Unexpected AF state in AUTO/MACRO AF mode: %d", 1768 afState); 1769 } 1770 break; 1771 case ANDROID_CONTROL_AF_CONTINUOUS_PICTURE: 1772 switch (afState) { 1773 // Picture mode waits for passive scan to complete 1774 case ANDROID_CONTROL_AF_STATE_PASSIVE_SCAN: 1775 mLockAfterPassiveScan = true; 1776 break; 1777 case ANDROID_CONTROL_AF_STATE_INACTIVE: 1778 afState = ANDROID_CONTROL_AF_STATE_NOT_FOCUSED_LOCKED; 1779 break; 1780 case ANDROID_CONTROL_AF_STATE_PASSIVE_FOCUSED: 1781 afState = ANDROID_CONTROL_AF_STATE_FOCUSED_LOCKED; 1782 break; 1783 case ANDROID_CONTROL_AF_STATE_FOCUSED_LOCKED: 1784 case ANDROID_CONTROL_AF_STATE_NOT_FOCUSED_LOCKED: 1785 // Must cancel to get out of these states 1786 break; 1787 default: 1788 ALOGE("Unexpected AF state in CONTINUOUS_PICTURE AF mode: %d", 1789 afState); 1790 } 1791 break; 1792 case ANDROID_CONTROL_AF_CONTINUOUS_VIDEO: 1793 switch (afState) { 1794 // Video mode does not wait for passive scan to complete 1795 case ANDROID_CONTROL_AF_STATE_PASSIVE_SCAN: 1796 case ANDROID_CONTROL_AF_STATE_INACTIVE: 1797 afState = ANDROID_CONTROL_AF_STATE_NOT_FOCUSED_LOCKED; 1798 break; 1799 case ANDROID_CONTROL_AF_STATE_PASSIVE_FOCUSED: 1800 afState = ANDROID_CONTROL_AF_STATE_FOCUSED_LOCKED; 1801 break; 1802 case ANDROID_CONTROL_AF_STATE_FOCUSED_LOCKED: 1803 case ANDROID_CONTROL_AF_STATE_NOT_FOCUSED_LOCKED: 1804 // Must cancel to get out of these states 1805 break; 1806 default: 1807 ALOGE("Unexpected AF state in CONTINUOUS_VIDEO AF mode: %d", 1808 afState); 1809 } 1810 break; 1811 default: 1812 break; 1813 } 1814 return afState; 1815 } 1816 1817 int EmulatedFakeCamera2::ControlThread::maybeStartAfScan(uint8_t afMode, 1818 uint8_t afState) { 1819 if ((afMode == ANDROID_CONTROL_AF_CONTINUOUS_VIDEO || 1820 afMode == ANDROID_CONTROL_AF_CONTINUOUS_PICTURE) && 1821 (afState == ANDROID_CONTROL_AF_STATE_INACTIVE || 1822 afState == ANDROID_CONTROL_AF_STATE_PASSIVE_FOCUSED)) { 1823 1824 bool startScan = ((double)rand() / RAND_MAX) < kContinuousAfStartRate; 1825 if (startScan) { 1826 // Start new passive focusing cycle 1827 mAfScanDuration = ((double)rand() / RAND_MAX) * 1828 (kMaxAfDuration - kMinAfDuration) + kMinAfDuration; 1829 afState = ANDROID_CONTROL_AF_STATE_PASSIVE_SCAN; 1830 ALOGV("%s: AF passive scan start, duration %lld ms", 1831 __FUNCTION__, mAfScanDuration / 1000000); 1832 } 1833 } 1834 return afState; 1835 } 1836 1837 int EmulatedFakeCamera2::ControlThread::updateAfScan(uint8_t afMode, 1838 uint8_t afState, nsecs_t *maxSleep) { 1839 if (! (afState == ANDROID_CONTROL_AF_STATE_ACTIVE_SCAN || 1840 afState == ANDROID_CONTROL_AF_STATE_PASSIVE_SCAN ) ) { 1841 return afState; 1842 } 1843 1844 if (mAfScanDuration <= 0) { 1845 ALOGV("%s: AF scan done", __FUNCTION__); 1846 switch (afMode) { 1847 case ANDROID_CONTROL_AF_MACRO: 1848 case ANDROID_CONTROL_AF_AUTO: { 1849 bool success = ((double)rand() / RAND_MAX) < kAfSuccessRate; 1850 if (success) { 1851 afState = ANDROID_CONTROL_AF_STATE_FOCUSED_LOCKED; 1852 } else { 1853 afState = ANDROID_CONTROL_AF_STATE_NOT_FOCUSED_LOCKED; 1854 } 1855 break; 1856 } 1857 case ANDROID_CONTROL_AF_CONTINUOUS_PICTURE: 1858 if (mLockAfterPassiveScan) { 1859 afState = ANDROID_CONTROL_AF_STATE_FOCUSED_LOCKED; 1860 mLockAfterPassiveScan = false; 1861 } else { 1862 afState = ANDROID_CONTROL_AF_STATE_PASSIVE_FOCUSED; 1863 } 1864 break; 1865 case ANDROID_CONTROL_AF_CONTINUOUS_VIDEO: 1866 afState = ANDROID_CONTROL_AF_STATE_PASSIVE_FOCUSED; 1867 break; 1868 default: 1869 ALOGE("Unexpected AF mode in scan state"); 1870 } 1871 } else { 1872 if (mAfScanDuration <= *maxSleep) { 1873 *maxSleep = mAfScanDuration; 1874 } 1875 } 1876 return afState; 1877 } 1878 1879 void EmulatedFakeCamera2::ControlThread::updateAfState(uint8_t newState, 1880 int32_t triggerId) { 1881 Mutex::Autolock lock(mInputMutex); 1882 if (mAfState != newState) { 1883 ALOGV("%s: Autofocus state now %d, id %d", __FUNCTION__, 1884 newState, triggerId); 1885 mAfState = newState; 1886 mParent->sendNotification(CAMERA2_MSG_AUTOFOCUS, 1887 newState, triggerId, 0); 1888 } 1889 } 1890 1891 int EmulatedFakeCamera2::ControlThread::processPrecaptureTrigger(uint8_t aeMode, 1892 uint8_t aeState) { 1893 switch (aeMode) { 1894 case ANDROID_CONTROL_AE_OFF: 1895 // Don't do anything for these 1896 return aeState; 1897 case ANDROID_CONTROL_AE_ON: 1898 case ANDROID_CONTROL_AE_ON_AUTO_FLASH: 1899 case ANDROID_CONTROL_AE_ON_ALWAYS_FLASH: 1900 case ANDROID_CONTROL_AE_ON_AUTO_FLASH_REDEYE: 1901 // Trigger a precapture cycle 1902 aeState = ANDROID_CONTROL_AE_STATE_PRECAPTURE; 1903 mAeScanDuration = ((double)rand() / RAND_MAX) * 1904 (kMaxPrecaptureAeDuration - kMinPrecaptureAeDuration) + 1905 kMinPrecaptureAeDuration; 1906 ALOGD("%s: AE precapture scan start, duration %lld ms", 1907 __FUNCTION__, mAeScanDuration / 1000000); 1908 1909 } 1910 return aeState; 1911 } 1912 1913 int EmulatedFakeCamera2::ControlThread::maybeStartAeScan(uint8_t aeMode, 1914 bool aeLocked, 1915 uint8_t aeState) { 1916 if (aeLocked) return aeState; 1917 switch (aeMode) { 1918 case ANDROID_CONTROL_AE_OFF: 1919 break; 1920 case ANDROID_CONTROL_AE_ON: 1921 case ANDROID_CONTROL_AE_ON_AUTO_FLASH: 1922 case ANDROID_CONTROL_AE_ON_ALWAYS_FLASH: 1923 case ANDROID_CONTROL_AE_ON_AUTO_FLASH_REDEYE: { 1924 if (aeState != ANDROID_CONTROL_AE_STATE_INACTIVE && 1925 aeState != ANDROID_CONTROL_AE_STATE_CONVERGED) break; 1926 1927 bool startScan = ((double)rand() / RAND_MAX) < kAeScanStartRate; 1928 if (startScan) { 1929 mAeScanDuration = ((double)rand() / RAND_MAX) * 1930 (kMaxAeDuration - kMinAeDuration) + kMinAeDuration; 1931 aeState = ANDROID_CONTROL_AE_STATE_SEARCHING; 1932 ALOGD("%s: AE scan start, duration %lld ms", 1933 __FUNCTION__, mAeScanDuration / 1000000); 1934 } 1935 } 1936 } 1937 1938 return aeState; 1939 } 1940 1941 int EmulatedFakeCamera2::ControlThread::updateAeScan(uint8_t aeMode, 1942 bool aeLock, uint8_t aeState, nsecs_t *maxSleep) { 1943 if (aeLock && aeState != ANDROID_CONTROL_AE_STATE_PRECAPTURE) { 1944 mAeScanDuration = 0; 1945 aeState = ANDROID_CONTROL_AE_STATE_LOCKED; 1946 } else if ((aeState == ANDROID_CONTROL_AE_STATE_SEARCHING) || 1947 (aeState == ANDROID_CONTROL_AE_STATE_PRECAPTURE ) ) { 1948 if (mAeScanDuration <= 0) { 1949 ALOGD("%s: AE scan done", __FUNCTION__); 1950 aeState = aeLock ? 1951 ANDROID_CONTROL_AE_STATE_LOCKED :ANDROID_CONTROL_AE_STATE_CONVERGED; 1952 1953 Mutex::Autolock lock(mInputMutex); 1954 mExposureTime = kNormalExposureTime; 1955 } else { 1956 if (mAeScanDuration <= *maxSleep) { 1957 *maxSleep = mAeScanDuration; 1958 } 1959 1960 int64_t exposureDelta = 1961 ((double)rand() / RAND_MAX) * 2 * kExposureJump - 1962 kExposureJump; 1963 Mutex::Autolock lock(mInputMutex); 1964 mExposureTime = mExposureTime + exposureDelta; 1965 if (mExposureTime < kMinExposureTime) mExposureTime = kMinExposureTime; 1966 } 1967 } 1968 1969 return aeState; 1970 } 1971 1972 1973 void EmulatedFakeCamera2::ControlThread::updateAeState(uint8_t newState, 1974 int32_t triggerId) { 1975 Mutex::Autolock lock(mInputMutex); 1976 if (mAeState != newState) { 1977 ALOGD("%s: Autoexposure state now %d, id %d", __FUNCTION__, 1978 newState, triggerId); 1979 mAeState = newState; 1980 mParent->sendNotification(CAMERA2_MSG_AUTOEXPOSURE, 1981 newState, triggerId, 0); 1982 } 1983 } 1984 1985 /** Private methods */ 1986 1987 status_t EmulatedFakeCamera2::constructStaticInfo( 1988 camera_metadata_t **info, 1989 bool sizeRequest) const { 1990 1991 size_t entryCount = 0; 1992 size_t dataCount = 0; 1993 status_t ret; 1994 1995 #define ADD_OR_SIZE( tag, data, count ) \ 1996 if ( ( ret = addOrSize(*info, sizeRequest, &entryCount, &dataCount, \ 1997 tag, data, count) ) != OK ) return ret 1998 1999 // android.lens 2000 2001 // 5 cm min focus distance for back camera, infinity (fixed focus) for front 2002 const float minFocusDistance = mFacingBack ? 1.0/0.05 : 0.0; 2003 ADD_OR_SIZE(ANDROID_LENS_MINIMUM_FOCUS_DISTANCE, 2004 &minFocusDistance, 1); 2005 // 5 m hyperfocal distance for back camera, infinity (fixed focus) for front 2006 const float hyperFocalDistance = mFacingBack ? 1.0/5.0 : 0.0; 2007 ADD_OR_SIZE(ANDROID_LENS_HYPERFOCAL_DISTANCE, 2008 &minFocusDistance, 1); 2009 2010 static const float focalLength = 3.30f; // mm 2011 ADD_OR_SIZE(ANDROID_LENS_AVAILABLE_FOCAL_LENGTHS, 2012 &focalLength, 1); 2013 static const float aperture = 2.8f; 2014 ADD_OR_SIZE(ANDROID_LENS_AVAILABLE_APERTURES, 2015 &aperture, 1); 2016 static const float filterDensity = 0; 2017 ADD_OR_SIZE(ANDROID_LENS_AVAILABLE_FILTER_DENSITY, 2018 &filterDensity, 1); 2019 static const uint8_t availableOpticalStabilization = 2020 ANDROID_LENS_OPTICAL_STABILIZATION_OFF; 2021 ADD_OR_SIZE(ANDROID_LENS_AVAILABLE_OPTICAL_STABILIZATION, 2022 &availableOpticalStabilization, 1); 2023 2024 static const int32_t lensShadingMapSize[] = {1, 1}; 2025 ADD_OR_SIZE(ANDROID_LENS_SHADING_MAP_SIZE, lensShadingMapSize, 2026 sizeof(lensShadingMapSize)/sizeof(int32_t)); 2027 2028 static const float lensShadingMap[3 * 1 * 1 ] = 2029 { 1.f, 1.f, 1.f }; 2030 ADD_OR_SIZE(ANDROID_LENS_SHADING_MAP, lensShadingMap, 2031 sizeof(lensShadingMap)/sizeof(float)); 2032 2033 // Identity transform 2034 static const int32_t geometricCorrectionMapSize[] = {2, 2}; 2035 ADD_OR_SIZE(ANDROID_LENS_GEOMETRIC_CORRECTION_MAP_SIZE, 2036 geometricCorrectionMapSize, 2037 sizeof(geometricCorrectionMapSize)/sizeof(int32_t)); 2038 2039 static const float geometricCorrectionMap[2 * 3 * 2 * 2] = { 2040 0.f, 0.f, 0.f, 0.f, 0.f, 0.f, 2041 1.f, 0.f, 1.f, 0.f, 1.f, 0.f, 2042 0.f, 1.f, 0.f, 1.f, 0.f, 1.f, 2043 1.f, 1.f, 1.f, 1.f, 1.f, 1.f}; 2044 ADD_OR_SIZE(ANDROID_LENS_GEOMETRIC_CORRECTION_MAP, 2045 geometricCorrectionMap, 2046 sizeof(geometricCorrectionMap)/sizeof(float)); 2047 2048 int32_t lensFacing = mFacingBack ? 2049 ANDROID_LENS_FACING_BACK : ANDROID_LENS_FACING_FRONT; 2050 ADD_OR_SIZE(ANDROID_LENS_FACING, &lensFacing, 1); 2051 2052 float lensPosition[3]; 2053 if (mFacingBack) { 2054 // Back-facing camera is center-top on device 2055 lensPosition[0] = 0; 2056 lensPosition[1] = 20; 2057 lensPosition[2] = -5; 2058 } else { 2059 // Front-facing camera is center-right on device 2060 lensPosition[0] = 20; 2061 lensPosition[1] = 20; 2062 lensPosition[2] = 0; 2063 } 2064 ADD_OR_SIZE(ANDROID_LENS_POSITION, lensPosition, sizeof(lensPosition)/ 2065 sizeof(float)); 2066 2067 // android.sensor 2068 2069 ADD_OR_SIZE(ANDROID_SENSOR_EXPOSURE_TIME_RANGE, 2070 Sensor::kExposureTimeRange, 2); 2071 2072 ADD_OR_SIZE(ANDROID_SENSOR_MAX_FRAME_DURATION, 2073 &Sensor::kFrameDurationRange[1], 1); 2074 2075 ADD_OR_SIZE(ANDROID_SENSOR_AVAILABLE_SENSITIVITIES, 2076 Sensor::kAvailableSensitivities, 2077 sizeof(Sensor::kAvailableSensitivities) 2078 /sizeof(uint32_t)); 2079 2080 ADD_OR_SIZE(ANDROID_SENSOR_COLOR_FILTER_ARRANGEMENT, 2081 &Sensor::kColorFilterArrangement, 1); 2082 2083 static const float sensorPhysicalSize[2] = {3.20f, 2.40f}; // mm 2084 ADD_OR_SIZE(ANDROID_SENSOR_PHYSICAL_SIZE, 2085 sensorPhysicalSize, 2); 2086 2087 ADD_OR_SIZE(ANDROID_SENSOR_PIXEL_ARRAY_SIZE, 2088 Sensor::kResolution, 2); 2089 2090 ADD_OR_SIZE(ANDROID_SENSOR_ACTIVE_ARRAY_SIZE, 2091 Sensor::kResolution, 2); 2092 2093 ADD_OR_SIZE(ANDROID_SENSOR_WHITE_LEVEL, 2094 &Sensor::kMaxRawValue, 1); 2095 2096 static const int32_t blackLevelPattern[4] = { 2097 Sensor::kBlackLevel, Sensor::kBlackLevel, 2098 Sensor::kBlackLevel, Sensor::kBlackLevel 2099 }; 2100 ADD_OR_SIZE(ANDROID_SENSOR_BLACK_LEVEL_PATTERN, 2101 blackLevelPattern, sizeof(blackLevelPattern)/sizeof(int32_t)); 2102 2103 //TODO: sensor color calibration fields 2104 2105 // android.flash 2106 static const uint8_t flashAvailable = 0; 2107 ADD_OR_SIZE(ANDROID_FLASH_AVAILABLE, &flashAvailable, 1); 2108 2109 static const int64_t flashChargeDuration = 0; 2110 ADD_OR_SIZE(ANDROID_FLASH_CHARGE_DURATION, &flashChargeDuration, 1); 2111 2112 // android.tonemap 2113 2114 static const int32_t tonemapCurvePoints = 128; 2115 ADD_OR_SIZE(ANDROID_TONEMAP_MAX_CURVE_POINTS, &tonemapCurvePoints, 1); 2116 2117 // android.scaler 2118 2119 ADD_OR_SIZE(ANDROID_SCALER_AVAILABLE_FORMATS, 2120 kAvailableFormats, 2121 sizeof(kAvailableFormats)/sizeof(uint32_t)); 2122 2123 ADD_OR_SIZE(ANDROID_SCALER_AVAILABLE_RAW_SIZES, 2124 kAvailableRawSizes, 2125 sizeof(kAvailableRawSizes)/sizeof(uint32_t)); 2126 2127 ADD_OR_SIZE(ANDROID_SCALER_AVAILABLE_RAW_MIN_DURATIONS, 2128 kAvailableRawMinDurations, 2129 sizeof(kAvailableRawMinDurations)/sizeof(uint64_t)); 2130 2131 if (mFacingBack) { 2132 ADD_OR_SIZE(ANDROID_SCALER_AVAILABLE_PROCESSED_SIZES, 2133 kAvailableProcessedSizesBack, 2134 sizeof(kAvailableProcessedSizesBack)/sizeof(uint32_t)); 2135 } else { 2136 ADD_OR_SIZE(ANDROID_SCALER_AVAILABLE_PROCESSED_SIZES, 2137 kAvailableProcessedSizesFront, 2138 sizeof(kAvailableProcessedSizesFront)/sizeof(uint32_t)); 2139 } 2140 2141 ADD_OR_SIZE(ANDROID_SCALER_AVAILABLE_PROCESSED_MIN_DURATIONS, 2142 kAvailableProcessedMinDurations, 2143 sizeof(kAvailableProcessedMinDurations)/sizeof(uint64_t)); 2144 2145 if (mFacingBack) { 2146 ADD_OR_SIZE(ANDROID_SCALER_AVAILABLE_JPEG_SIZES, 2147 kAvailableJpegSizesBack, 2148 sizeof(kAvailableJpegSizesBack)/sizeof(uint32_t)); 2149 } else { 2150 ADD_OR_SIZE(ANDROID_SCALER_AVAILABLE_JPEG_SIZES, 2151 kAvailableJpegSizesFront, 2152 sizeof(kAvailableJpegSizesFront)/sizeof(uint32_t)); 2153 } 2154 2155 ADD_OR_SIZE(ANDROID_SCALER_AVAILABLE_JPEG_MIN_DURATIONS, 2156 kAvailableJpegMinDurations, 2157 sizeof(kAvailableJpegMinDurations)/sizeof(uint64_t)); 2158 2159 static const float maxZoom = 10; 2160 ADD_OR_SIZE(ANDROID_SCALER_AVAILABLE_MAX_ZOOM, 2161 &maxZoom, 1); 2162 2163 // android.jpeg 2164 2165 static const int32_t jpegThumbnailSizes[] = { 2166 0, 0, 2167 160, 120, 2168 320, 240 2169 }; 2170 ADD_OR_SIZE(ANDROID_JPEG_AVAILABLE_THUMBNAIL_SIZES, 2171 jpegThumbnailSizes, sizeof(jpegThumbnailSizes)/sizeof(int32_t)); 2172 2173 static const int32_t jpegMaxSize = JpegCompressor::kMaxJpegSize; 2174 ADD_OR_SIZE(ANDROID_JPEG_MAX_SIZE, &jpegMaxSize, 1); 2175 2176 // android.stats 2177 2178 static const uint8_t availableFaceDetectModes[] = { 2179 ANDROID_STATS_FACE_DETECTION_OFF, 2180 ANDROID_STATS_FACE_DETECTION_SIMPLE, 2181 ANDROID_STATS_FACE_DETECTION_FULL 2182 }; 2183 2184 ADD_OR_SIZE(ANDROID_STATS_AVAILABLE_FACE_DETECT_MODES, 2185 availableFaceDetectModes, 2186 sizeof(availableFaceDetectModes)); 2187 2188 static const int32_t maxFaceCount = 8; 2189 ADD_OR_SIZE(ANDROID_STATS_MAX_FACE_COUNT, 2190 &maxFaceCount, 1); 2191 2192 static const int32_t histogramSize = 64; 2193 ADD_OR_SIZE(ANDROID_STATS_HISTOGRAM_BUCKET_COUNT, 2194 &histogramSize, 1); 2195 2196 static const int32_t maxHistogramCount = 1000; 2197 ADD_OR_SIZE(ANDROID_STATS_MAX_HISTOGRAM_COUNT, 2198 &maxHistogramCount, 1); 2199 2200 static const int32_t sharpnessMapSize[2] = {64, 64}; 2201 ADD_OR_SIZE(ANDROID_STATS_SHARPNESS_MAP_SIZE, 2202 sharpnessMapSize, sizeof(sharpnessMapSize)/sizeof(int32_t)); 2203 2204 static const int32_t maxSharpnessMapValue = 1000; 2205 ADD_OR_SIZE(ANDROID_STATS_MAX_SHARPNESS_MAP_VALUE, 2206 &maxSharpnessMapValue, 1); 2207 2208 // android.control 2209 2210 static const uint8_t availableSceneModes[] = { 2211 ANDROID_CONTROL_SCENE_MODE_UNSUPPORTED 2212 }; 2213 ADD_OR_SIZE(ANDROID_CONTROL_AVAILABLE_SCENE_MODES, 2214 availableSceneModes, sizeof(availableSceneModes)); 2215 2216 static const uint8_t availableEffects[] = { 2217 ANDROID_CONTROL_EFFECT_OFF 2218 }; 2219 ADD_OR_SIZE(ANDROID_CONTROL_AVAILABLE_EFFECTS, 2220 availableEffects, sizeof(availableEffects)); 2221 2222 int32_t max3aRegions = 0; 2223 ADD_OR_SIZE(ANDROID_CONTROL_MAX_REGIONS, 2224 &max3aRegions, 1); 2225 2226 static const uint8_t availableAeModes[] = { 2227 ANDROID_CONTROL_AE_OFF, 2228 ANDROID_CONTROL_AE_ON 2229 }; 2230 ADD_OR_SIZE(ANDROID_CONTROL_AE_AVAILABLE_MODES, 2231 availableAeModes, sizeof(availableAeModes)); 2232 2233 static const camera_metadata_rational exposureCompensationStep = { 2234 1, 3 2235 }; 2236 ADD_OR_SIZE(ANDROID_CONTROL_AE_EXP_COMPENSATION_STEP, 2237 &exposureCompensationStep, 1); 2238 2239 int32_t exposureCompensationRange[] = {-9, 9}; 2240 ADD_OR_SIZE(ANDROID_CONTROL_AE_EXP_COMPENSATION_RANGE, 2241 exposureCompensationRange, 2242 sizeof(exposureCompensationRange)/sizeof(int32_t)); 2243 2244 static const int32_t availableTargetFpsRanges[] = { 2245 5, 30, 15, 30 2246 }; 2247 ADD_OR_SIZE(ANDROID_CONTROL_AE_AVAILABLE_TARGET_FPS_RANGES, 2248 availableTargetFpsRanges, 2249 sizeof(availableTargetFpsRanges)/sizeof(int32_t)); 2250 2251 static const uint8_t availableAntibandingModes[] = { 2252 ANDROID_CONTROL_AE_ANTIBANDING_OFF, 2253 ANDROID_CONTROL_AE_ANTIBANDING_AUTO 2254 }; 2255 ADD_OR_SIZE(ANDROID_CONTROL_AE_AVAILABLE_ANTIBANDING_MODES, 2256 availableAntibandingModes, sizeof(availableAntibandingModes)); 2257 2258 static const uint8_t availableAwbModes[] = { 2259 ANDROID_CONTROL_AWB_OFF, 2260 ANDROID_CONTROL_AWB_AUTO, 2261 ANDROID_CONTROL_AWB_INCANDESCENT, 2262 ANDROID_CONTROL_AWB_FLUORESCENT, 2263 ANDROID_CONTROL_AWB_DAYLIGHT, 2264 ANDROID_CONTROL_AWB_SHADE 2265 }; 2266 ADD_OR_SIZE(ANDROID_CONTROL_AWB_AVAILABLE_MODES, 2267 availableAwbModes, sizeof(availableAwbModes)); 2268 2269 static const uint8_t availableAfModesBack[] = { 2270 ANDROID_CONTROL_AF_OFF, 2271 ANDROID_CONTROL_AF_AUTO, 2272 ANDROID_CONTROL_AF_MACRO, 2273 ANDROID_CONTROL_AF_CONTINUOUS_VIDEO, 2274 ANDROID_CONTROL_AF_CONTINUOUS_PICTURE 2275 }; 2276 2277 static const uint8_t availableAfModesFront[] = { 2278 ANDROID_CONTROL_AF_OFF 2279 }; 2280 2281 if (mFacingBack) { 2282 ADD_OR_SIZE(ANDROID_CONTROL_AF_AVAILABLE_MODES, 2283 availableAfModesBack, sizeof(availableAfModesBack)); 2284 } else { 2285 ADD_OR_SIZE(ANDROID_CONTROL_AF_AVAILABLE_MODES, 2286 availableAfModesFront, sizeof(availableAfModesFront)); 2287 } 2288 2289 static const uint8_t availableVstabModes[] = { 2290 ANDROID_CONTROL_VIDEO_STABILIZATION_OFF 2291 }; 2292 ADD_OR_SIZE(ANDROID_CONTROL_AVAILABLE_VIDEO_STABILIZATION_MODES, 2293 availableVstabModes, sizeof(availableVstabModes)); 2294 2295 #undef ADD_OR_SIZE 2296 /** Allocate metadata if sizing */ 2297 if (sizeRequest) { 2298 ALOGV("Allocating %d entries, %d extra bytes for " 2299 "static camera info", 2300 entryCount, dataCount); 2301 *info = allocate_camera_metadata(entryCount, dataCount); 2302 if (*info == NULL) { 2303 ALOGE("Unable to allocate camera static info" 2304 "(%d entries, %d bytes extra data)", 2305 entryCount, dataCount); 2306 return NO_MEMORY; 2307 } 2308 } 2309 return OK; 2310 } 2311 2312 status_t EmulatedFakeCamera2::constructDefaultRequest( 2313 int request_template, 2314 camera_metadata_t **request, 2315 bool sizeRequest) const { 2316 2317 size_t entryCount = 0; 2318 size_t dataCount = 0; 2319 status_t ret; 2320 2321 #define ADD_OR_SIZE( tag, data, count ) \ 2322 if ( ( ret = addOrSize(*request, sizeRequest, &entryCount, &dataCount, \ 2323 tag, data, count) ) != OK ) return ret 2324 2325 /** android.request */ 2326 2327 static const uint8_t requestType = ANDROID_REQUEST_TYPE_CAPTURE; 2328 ADD_OR_SIZE(ANDROID_REQUEST_TYPE, &requestType, 1); 2329 2330 static const uint8_t metadataMode = ANDROID_REQUEST_METADATA_FULL; 2331 ADD_OR_SIZE(ANDROID_REQUEST_METADATA_MODE, &metadataMode, 1); 2332 2333 static const int32_t id = 0; 2334 ADD_OR_SIZE(ANDROID_REQUEST_ID, &id, 1); 2335 2336 static const int32_t frameCount = 0; 2337 ADD_OR_SIZE(ANDROID_REQUEST_FRAME_COUNT, &frameCount, 1); 2338 2339 // OUTPUT_STREAMS set by user 2340 entryCount += 1; 2341 dataCount += 5; // TODO: Should be maximum stream number 2342 2343 /** android.lens */ 2344 2345 static const float focusDistance = 0; 2346 ADD_OR_SIZE(ANDROID_LENS_FOCUS_DISTANCE, &focusDistance, 1); 2347 2348 static const float aperture = 2.8f; 2349 ADD_OR_SIZE(ANDROID_LENS_APERTURE, &aperture, 1); 2350 2351 static const float focalLength = 5.0f; 2352 ADD_OR_SIZE(ANDROID_LENS_FOCAL_LENGTH, &focalLength, 1); 2353 2354 static const float filterDensity = 0; 2355 ADD_OR_SIZE(ANDROID_LENS_FILTER_DENSITY, &filterDensity, 1); 2356 2357 static const uint8_t opticalStabilizationMode = 2358 ANDROID_LENS_OPTICAL_STABILIZATION_OFF; 2359 ADD_OR_SIZE(ANDROID_LENS_OPTICAL_STABILIZATION_MODE, 2360 &opticalStabilizationMode, 1); 2361 2362 // FOCUS_RANGE set only in frame 2363 2364 /** android.sensor */ 2365 2366 static const int64_t exposureTime = 10 * MSEC; 2367 ADD_OR_SIZE(ANDROID_SENSOR_EXPOSURE_TIME, &exposureTime, 1); 2368 2369 static const int64_t frameDuration = 33333333L; // 1/30 s 2370 ADD_OR_SIZE(ANDROID_SENSOR_FRAME_DURATION, &frameDuration, 1); 2371 2372 static const int32_t sensitivity = 100; 2373 ADD_OR_SIZE(ANDROID_SENSOR_SENSITIVITY, &sensitivity, 1); 2374 2375 // TIMESTAMP set only in frame 2376 2377 /** android.flash */ 2378 2379 static const uint8_t flashMode = ANDROID_FLASH_OFF; 2380 ADD_OR_SIZE(ANDROID_FLASH_MODE, &flashMode, 1); 2381 2382 static const uint8_t flashPower = 10; 2383 ADD_OR_SIZE(ANDROID_FLASH_FIRING_POWER, &flashPower, 1); 2384 2385 static const int64_t firingTime = 0; 2386 ADD_OR_SIZE(ANDROID_FLASH_FIRING_TIME, &firingTime, 1); 2387 2388 /** Processing block modes */ 2389 uint8_t hotPixelMode = 0; 2390 uint8_t demosaicMode = 0; 2391 uint8_t noiseMode = 0; 2392 uint8_t shadingMode = 0; 2393 uint8_t geometricMode = 0; 2394 uint8_t colorMode = 0; 2395 uint8_t tonemapMode = 0; 2396 uint8_t edgeMode = 0; 2397 switch (request_template) { 2398 case CAMERA2_TEMPLATE_PREVIEW: 2399 hotPixelMode = ANDROID_PROCESSING_FAST; 2400 demosaicMode = ANDROID_PROCESSING_FAST; 2401 noiseMode = ANDROID_PROCESSING_FAST; 2402 shadingMode = ANDROID_PROCESSING_FAST; 2403 geometricMode = ANDROID_PROCESSING_FAST; 2404 colorMode = ANDROID_PROCESSING_FAST; 2405 tonemapMode = ANDROID_PROCESSING_FAST; 2406 edgeMode = ANDROID_PROCESSING_FAST; 2407 break; 2408 case CAMERA2_TEMPLATE_STILL_CAPTURE: 2409 hotPixelMode = ANDROID_PROCESSING_HIGH_QUALITY; 2410 demosaicMode = ANDROID_PROCESSING_HIGH_QUALITY; 2411 noiseMode = ANDROID_PROCESSING_HIGH_QUALITY; 2412 shadingMode = ANDROID_PROCESSING_HIGH_QUALITY; 2413 geometricMode = ANDROID_PROCESSING_HIGH_QUALITY; 2414 colorMode = ANDROID_PROCESSING_HIGH_QUALITY; 2415 tonemapMode = ANDROID_PROCESSING_HIGH_QUALITY; 2416 edgeMode = ANDROID_PROCESSING_HIGH_QUALITY; 2417 break; 2418 case CAMERA2_TEMPLATE_VIDEO_RECORD: 2419 hotPixelMode = ANDROID_PROCESSING_FAST; 2420 demosaicMode = ANDROID_PROCESSING_FAST; 2421 noiseMode = ANDROID_PROCESSING_FAST; 2422 shadingMode = ANDROID_PROCESSING_FAST; 2423 geometricMode = ANDROID_PROCESSING_FAST; 2424 colorMode = ANDROID_PROCESSING_FAST; 2425 tonemapMode = ANDROID_PROCESSING_FAST; 2426 edgeMode = ANDROID_PROCESSING_FAST; 2427 break; 2428 case CAMERA2_TEMPLATE_VIDEO_SNAPSHOT: 2429 hotPixelMode = ANDROID_PROCESSING_HIGH_QUALITY; 2430 demosaicMode = ANDROID_PROCESSING_HIGH_QUALITY; 2431 noiseMode = ANDROID_PROCESSING_HIGH_QUALITY; 2432 shadingMode = ANDROID_PROCESSING_HIGH_QUALITY; 2433 geometricMode = ANDROID_PROCESSING_HIGH_QUALITY; 2434 colorMode = ANDROID_PROCESSING_HIGH_QUALITY; 2435 tonemapMode = ANDROID_PROCESSING_HIGH_QUALITY; 2436 edgeMode = ANDROID_PROCESSING_HIGH_QUALITY; 2437 break; 2438 case CAMERA2_TEMPLATE_ZERO_SHUTTER_LAG: 2439 hotPixelMode = ANDROID_PROCESSING_HIGH_QUALITY; 2440 demosaicMode = ANDROID_PROCESSING_HIGH_QUALITY; 2441 noiseMode = ANDROID_PROCESSING_HIGH_QUALITY; 2442 shadingMode = ANDROID_PROCESSING_HIGH_QUALITY; 2443 geometricMode = ANDROID_PROCESSING_HIGH_QUALITY; 2444 colorMode = ANDROID_PROCESSING_HIGH_QUALITY; 2445 tonemapMode = ANDROID_PROCESSING_HIGH_QUALITY; 2446 edgeMode = ANDROID_PROCESSING_HIGH_QUALITY; 2447 break; 2448 default: 2449 hotPixelMode = ANDROID_PROCESSING_FAST; 2450 demosaicMode = ANDROID_PROCESSING_FAST; 2451 noiseMode = ANDROID_PROCESSING_FAST; 2452 shadingMode = ANDROID_PROCESSING_FAST; 2453 geometricMode = ANDROID_PROCESSING_FAST; 2454 colorMode = ANDROID_PROCESSING_FAST; 2455 tonemapMode = ANDROID_PROCESSING_FAST; 2456 edgeMode = ANDROID_PROCESSING_FAST; 2457 break; 2458 } 2459 ADD_OR_SIZE(ANDROID_HOT_PIXEL_MODE, &hotPixelMode, 1); 2460 ADD_OR_SIZE(ANDROID_DEMOSAIC_MODE, &demosaicMode, 1); 2461 ADD_OR_SIZE(ANDROID_NOISE_MODE, &noiseMode, 1); 2462 ADD_OR_SIZE(ANDROID_SHADING_MODE, &shadingMode, 1); 2463 ADD_OR_SIZE(ANDROID_GEOMETRIC_MODE, &geometricMode, 1); 2464 ADD_OR_SIZE(ANDROID_COLOR_MODE, &colorMode, 1); 2465 ADD_OR_SIZE(ANDROID_TONEMAP_MODE, &tonemapMode, 1); 2466 ADD_OR_SIZE(ANDROID_EDGE_MODE, &edgeMode, 1); 2467 2468 /** android.noise */ 2469 static const uint8_t noiseStrength = 5; 2470 ADD_OR_SIZE(ANDROID_NOISE_STRENGTH, &noiseStrength, 1); 2471 2472 /** android.color */ 2473 static const float colorTransform[9] = { 2474 1.0f, 0.f, 0.f, 2475 0.f, 1.f, 0.f, 2476 0.f, 0.f, 1.f 2477 }; 2478 ADD_OR_SIZE(ANDROID_COLOR_TRANSFORM, colorTransform, 9); 2479 2480 /** android.tonemap */ 2481 static const float tonemapCurve[4] = { 2482 0.f, 0.f, 2483 1.f, 1.f 2484 }; 2485 ADD_OR_SIZE(ANDROID_TONEMAP_CURVE_RED, tonemapCurve, 4); 2486 ADD_OR_SIZE(ANDROID_TONEMAP_CURVE_GREEN, tonemapCurve, 4); 2487 ADD_OR_SIZE(ANDROID_TONEMAP_CURVE_BLUE, tonemapCurve, 4); 2488 2489 /** android.edge */ 2490 static const uint8_t edgeStrength = 5; 2491 ADD_OR_SIZE(ANDROID_EDGE_STRENGTH, &edgeStrength, 1); 2492 2493 /** android.scaler */ 2494 static const int32_t cropRegion[3] = { 2495 0, 0, Sensor::kResolution[0] 2496 }; 2497 ADD_OR_SIZE(ANDROID_SCALER_CROP_REGION, cropRegion, 3); 2498 2499 /** android.jpeg */ 2500 static const int32_t jpegQuality = 80; 2501 ADD_OR_SIZE(ANDROID_JPEG_QUALITY, &jpegQuality, 1); 2502 2503 static const int32_t thumbnailSize[2] = { 2504 640, 480 2505 }; 2506 ADD_OR_SIZE(ANDROID_JPEG_THUMBNAIL_SIZE, thumbnailSize, 2); 2507 2508 static const int32_t thumbnailQuality = 80; 2509 ADD_OR_SIZE(ANDROID_JPEG_THUMBNAIL_QUALITY, &thumbnailQuality, 1); 2510 2511 static const double gpsCoordinates[2] = { 2512 0, 0 2513 }; 2514 ADD_OR_SIZE(ANDROID_JPEG_GPS_COORDINATES, gpsCoordinates, 2); 2515 2516 static const uint8_t gpsProcessingMethod[32] = "None"; 2517 ADD_OR_SIZE(ANDROID_JPEG_GPS_PROCESSING_METHOD, gpsProcessingMethod, 32); 2518 2519 static const int64_t gpsTimestamp = 0; 2520 ADD_OR_SIZE(ANDROID_JPEG_GPS_TIMESTAMP, &gpsTimestamp, 1); 2521 2522 static const int32_t jpegOrientation = 0; 2523 ADD_OR_SIZE(ANDROID_JPEG_ORIENTATION, &jpegOrientation, 1); 2524 2525 /** android.stats */ 2526 2527 static const uint8_t faceDetectMode = ANDROID_STATS_FACE_DETECTION_OFF; 2528 ADD_OR_SIZE(ANDROID_STATS_FACE_DETECT_MODE, &faceDetectMode, 1); 2529 2530 static const uint8_t histogramMode = ANDROID_STATS_OFF; 2531 ADD_OR_SIZE(ANDROID_STATS_HISTOGRAM_MODE, &histogramMode, 1); 2532 2533 static const uint8_t sharpnessMapMode = ANDROID_STATS_OFF; 2534 ADD_OR_SIZE(ANDROID_STATS_SHARPNESS_MAP_MODE, &sharpnessMapMode, 1); 2535 2536 // faceRectangles, faceScores, faceLandmarks, faceIds, histogram, 2537 // sharpnessMap only in frames 2538 2539 /** android.control */ 2540 2541 uint8_t controlIntent = 0; 2542 switch (request_template) { 2543 case CAMERA2_TEMPLATE_PREVIEW: 2544 controlIntent = ANDROID_CONTROL_INTENT_PREVIEW; 2545 break; 2546 case CAMERA2_TEMPLATE_STILL_CAPTURE: 2547 controlIntent = ANDROID_CONTROL_INTENT_STILL_CAPTURE; 2548 break; 2549 case CAMERA2_TEMPLATE_VIDEO_RECORD: 2550 controlIntent = ANDROID_CONTROL_INTENT_VIDEO_RECORD; 2551 break; 2552 case CAMERA2_TEMPLATE_VIDEO_SNAPSHOT: 2553 controlIntent = ANDROID_CONTROL_INTENT_VIDEO_SNAPSHOT; 2554 break; 2555 case CAMERA2_TEMPLATE_ZERO_SHUTTER_LAG: 2556 controlIntent = ANDROID_CONTROL_INTENT_ZERO_SHUTTER_LAG; 2557 break; 2558 default: 2559 controlIntent = ANDROID_CONTROL_INTENT_CUSTOM; 2560 break; 2561 } 2562 ADD_OR_SIZE(ANDROID_CONTROL_CAPTURE_INTENT, &controlIntent, 1); 2563 2564 static const uint8_t controlMode = ANDROID_CONTROL_AUTO; 2565 ADD_OR_SIZE(ANDROID_CONTROL_MODE, &controlMode, 1); 2566 2567 static const uint8_t effectMode = ANDROID_CONTROL_EFFECT_OFF; 2568 ADD_OR_SIZE(ANDROID_CONTROL_EFFECT_MODE, &effectMode, 1); 2569 2570 static const uint8_t sceneMode = ANDROID_CONTROL_SCENE_MODE_FACE_PRIORITY; 2571 ADD_OR_SIZE(ANDROID_CONTROL_SCENE_MODE, &sceneMode, 1); 2572 2573 static const uint8_t aeMode = ANDROID_CONTROL_AE_ON_AUTO_FLASH; 2574 ADD_OR_SIZE(ANDROID_CONTROL_AE_MODE, &aeMode, 1); 2575 2576 static const uint8_t aeLock = ANDROID_CONTROL_AE_LOCK_OFF; 2577 ADD_OR_SIZE(ANDROID_CONTROL_AE_LOCK, &aeLock, 1); 2578 2579 static const int32_t controlRegions[5] = { 2580 0, 0, Sensor::kResolution[0], Sensor::kResolution[1], 1000 2581 }; 2582 ADD_OR_SIZE(ANDROID_CONTROL_AE_REGIONS, controlRegions, 5); 2583 2584 static const int32_t aeExpCompensation = 0; 2585 ADD_OR_SIZE(ANDROID_CONTROL_AE_EXP_COMPENSATION, &aeExpCompensation, 1); 2586 2587 static const int32_t aeTargetFpsRange[2] = { 2588 10, 30 2589 }; 2590 ADD_OR_SIZE(ANDROID_CONTROL_AE_TARGET_FPS_RANGE, aeTargetFpsRange, 2); 2591 2592 static const uint8_t aeAntibandingMode = 2593 ANDROID_CONTROL_AE_ANTIBANDING_AUTO; 2594 ADD_OR_SIZE(ANDROID_CONTROL_AE_ANTIBANDING_MODE, &aeAntibandingMode, 1); 2595 2596 static const uint8_t awbMode = 2597 ANDROID_CONTROL_AWB_AUTO; 2598 ADD_OR_SIZE(ANDROID_CONTROL_AWB_MODE, &awbMode, 1); 2599 2600 static const uint8_t awbLock = ANDROID_CONTROL_AWB_LOCK_OFF; 2601 ADD_OR_SIZE(ANDROID_CONTROL_AWB_LOCK, &awbLock, 1); 2602 2603 ADD_OR_SIZE(ANDROID_CONTROL_AWB_REGIONS, controlRegions, 5); 2604 2605 uint8_t afMode = 0; 2606 switch (request_template) { 2607 case CAMERA2_TEMPLATE_PREVIEW: 2608 afMode = ANDROID_CONTROL_AF_AUTO; 2609 break; 2610 case CAMERA2_TEMPLATE_STILL_CAPTURE: 2611 afMode = ANDROID_CONTROL_AF_AUTO; 2612 break; 2613 case CAMERA2_TEMPLATE_VIDEO_RECORD: 2614 afMode = ANDROID_CONTROL_AF_CONTINUOUS_VIDEO; 2615 break; 2616 case CAMERA2_TEMPLATE_VIDEO_SNAPSHOT: 2617 afMode = ANDROID_CONTROL_AF_CONTINUOUS_VIDEO; 2618 break; 2619 case CAMERA2_TEMPLATE_ZERO_SHUTTER_LAG: 2620 afMode = ANDROID_CONTROL_AF_CONTINUOUS_PICTURE; 2621 break; 2622 default: 2623 afMode = ANDROID_CONTROL_AF_AUTO; 2624 break; 2625 } 2626 ADD_OR_SIZE(ANDROID_CONTROL_AF_MODE, &afMode, 1); 2627 2628 ADD_OR_SIZE(ANDROID_CONTROL_AF_REGIONS, controlRegions, 5); 2629 2630 static const uint8_t vstabMode = ANDROID_CONTROL_VIDEO_STABILIZATION_OFF; 2631 ADD_OR_SIZE(ANDROID_CONTROL_VIDEO_STABILIZATION_MODE, &vstabMode, 1); 2632 2633 // aeState, awbState, afState only in frame 2634 2635 /** Allocate metadata if sizing */ 2636 if (sizeRequest) { 2637 ALOGV("Allocating %d entries, %d extra bytes for " 2638 "request template type %d", 2639 entryCount, dataCount, request_template); 2640 *request = allocate_camera_metadata(entryCount, dataCount); 2641 if (*request == NULL) { 2642 ALOGE("Unable to allocate new request template type %d " 2643 "(%d entries, %d bytes extra data)", request_template, 2644 entryCount, dataCount); 2645 return NO_MEMORY; 2646 } 2647 } 2648 return OK; 2649 #undef ADD_OR_SIZE 2650 } 2651 2652 status_t EmulatedFakeCamera2::addOrSize(camera_metadata_t *request, 2653 bool sizeRequest, 2654 size_t *entryCount, 2655 size_t *dataCount, 2656 uint32_t tag, 2657 const void *entryData, 2658 size_t entryDataCount) { 2659 status_t res; 2660 if (!sizeRequest) { 2661 return add_camera_metadata_entry(request, tag, entryData, 2662 entryDataCount); 2663 } else { 2664 int type = get_camera_metadata_tag_type(tag); 2665 if (type < 0 ) return BAD_VALUE; 2666 (*entryCount)++; 2667 (*dataCount) += calculate_camera_metadata_entry_data_size(type, 2668 entryDataCount); 2669 return OK; 2670 } 2671 } 2672 2673 bool EmulatedFakeCamera2::isStreamInUse(uint32_t id) { 2674 // Assumes mMutex is locked; otherwise new requests could enter 2675 // configureThread while readoutThread is being checked 2676 2677 // Order of isStreamInUse calls matters 2678 if (mConfigureThread->isStreamInUse(id) || 2679 mReadoutThread->isStreamInUse(id) || 2680 mJpegCompressor->isStreamInUse(id) ) { 2681 ALOGE("%s: Stream %d is in use in active requests!", 2682 __FUNCTION__, id); 2683 return true; 2684 } 2685 return false; 2686 } 2687 2688 bool EmulatedFakeCamera2::isReprocessStreamInUse(uint32_t id) { 2689 // TODO: implement 2690 return false; 2691 } 2692 2693 const Stream& EmulatedFakeCamera2::getStreamInfo(uint32_t streamId) { 2694 Mutex::Autolock lock(mMutex); 2695 2696 return mStreams.valueFor(streamId); 2697 } 2698 2699 const ReprocessStream& EmulatedFakeCamera2::getReprocessStreamInfo(uint32_t streamId) { 2700 Mutex::Autolock lock(mMutex); 2701 2702 return mReprocessStreams.valueFor(streamId); 2703 } 2704 2705 }; /* namespace android */ 2706