1 /* 2 * Copyright (C) 2013 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 EmulatedFakeCamera3 that encapsulates 19 * functionality of an advanced fake camera. 20 */ 21 22 #include <inttypes.h> 23 24 //#define LOG_NDEBUG 0 25 //#define LOG_NNDEBUG 0 26 #define LOG_TAG "EmulatedCamera_FakeCamera3" 27 #include <utils/Log.h> 28 29 #include "EmulatedFakeCamera3.h" 30 #include "EmulatedCameraFactory.h" 31 #include <ui/Fence.h> 32 #include <ui/Rect.h> 33 #include <ui/GraphicBufferMapper.h> 34 #include "gralloc_cb.h" 35 36 #include "fake-pipeline2/Sensor.h" 37 #include "fake-pipeline2/JpegCompressor.h" 38 #include <cmath> 39 40 #if defined(LOG_NNDEBUG) && LOG_NNDEBUG == 0 41 #define ALOGVV ALOGV 42 #else 43 #define ALOGVV(...) ((void)0) 44 #endif 45 46 namespace android { 47 48 /** 49 * Constants for camera capabilities 50 */ 51 52 const int64_t USEC = 1000LL; 53 const int64_t MSEC = USEC * 1000LL; 54 const int64_t SEC = MSEC * 1000LL; 55 56 const int32_t EmulatedFakeCamera3::kAvailableFormats[5] = { 57 HAL_PIXEL_FORMAT_RAW_SENSOR, 58 HAL_PIXEL_FORMAT_BLOB, 59 HAL_PIXEL_FORMAT_RGBA_8888, 60 HAL_PIXEL_FORMAT_IMPLEMENTATION_DEFINED, 61 // These are handled by YCbCr_420_888 62 // HAL_PIXEL_FORMAT_YV12, 63 // HAL_PIXEL_FORMAT_YCrCb_420_SP, 64 HAL_PIXEL_FORMAT_YCbCr_420_888 65 }; 66 67 const uint32_t EmulatedFakeCamera3::kAvailableRawSizes[2] = { 68 640, 480 69 // Sensor::kResolution[0], Sensor::kResolution[1] 70 }; 71 72 const uint64_t EmulatedFakeCamera3::kAvailableRawMinDurations[1] = { 73 (const uint64_t)Sensor::kFrameDurationRange[0] 74 }; 75 76 const uint32_t EmulatedFakeCamera3::kAvailableProcessedSizesBack[4] = { 77 640, 480, 320, 240 78 // Sensor::kResolution[0], Sensor::kResolution[1] 79 }; 80 81 const uint32_t EmulatedFakeCamera3::kAvailableProcessedSizesFront[4] = { 82 320, 240, 160, 120 83 // Sensor::kResolution[0], Sensor::kResolution[1] 84 }; 85 86 const uint64_t EmulatedFakeCamera3::kAvailableProcessedMinDurations[1] = { 87 (const uint64_t)Sensor::kFrameDurationRange[0] 88 }; 89 90 const uint32_t EmulatedFakeCamera3::kAvailableJpegSizesBack[2] = { 91 640, 480 92 // Sensor::kResolution[0], Sensor::kResolution[1] 93 }; 94 95 const uint32_t EmulatedFakeCamera3::kAvailableJpegSizesFront[2] = { 96 320, 240 97 // Sensor::kResolution[0], Sensor::kResolution[1] 98 }; 99 100 101 const uint64_t EmulatedFakeCamera3::kAvailableJpegMinDurations[1] = { 102 (const uint64_t)Sensor::kFrameDurationRange[0] 103 }; 104 105 /** 106 * 3A constants 107 */ 108 109 // Default exposure and gain targets for different scenarios 110 const nsecs_t EmulatedFakeCamera3::kNormalExposureTime = 10 * MSEC; 111 const nsecs_t EmulatedFakeCamera3::kFacePriorityExposureTime = 30 * MSEC; 112 const int EmulatedFakeCamera3::kNormalSensitivity = 100; 113 const int EmulatedFakeCamera3::kFacePrioritySensitivity = 400; 114 const float EmulatedFakeCamera3::kExposureTrackRate = 0.1; 115 const int EmulatedFakeCamera3::kPrecaptureMinFrames = 10; 116 const int EmulatedFakeCamera3::kStableAeMaxFrames = 100; 117 const float EmulatedFakeCamera3::kExposureWanderMin = -2; 118 const float EmulatedFakeCamera3::kExposureWanderMax = 1; 119 120 /** 121 * Camera device lifecycle methods 122 */ 123 124 EmulatedFakeCamera3::EmulatedFakeCamera3(int cameraId, bool facingBack, 125 struct hw_module_t* module) : 126 EmulatedCamera3(cameraId, module), 127 mFacingBack(facingBack) { 128 ALOGI("Constructing emulated fake camera 3 facing %s", 129 facingBack ? "back" : "front"); 130 131 for (size_t i = 0; i < CAMERA3_TEMPLATE_COUNT; i++) { 132 mDefaultTemplates[i] = NULL; 133 } 134 135 /** 136 * Front cameras = limited mode 137 * Back cameras = full mode 138 */ 139 mFullMode = facingBack; 140 } 141 142 EmulatedFakeCamera3::~EmulatedFakeCamera3() { 143 for (size_t i = 0; i < CAMERA3_TEMPLATE_COUNT; i++) { 144 if (mDefaultTemplates[i] != NULL) { 145 free_camera_metadata(mDefaultTemplates[i]); 146 } 147 } 148 } 149 150 status_t EmulatedFakeCamera3::Initialize() { 151 ALOGV("%s: E", __FUNCTION__); 152 status_t res; 153 154 if (mStatus != STATUS_ERROR) { 155 ALOGE("%s: Already initialized!", __FUNCTION__); 156 return INVALID_OPERATION; 157 } 158 159 res = constructStaticInfo(); 160 if (res != OK) { 161 ALOGE("%s: Unable to allocate static info: %s (%d)", 162 __FUNCTION__, strerror(-res), res); 163 return res; 164 } 165 166 return EmulatedCamera3::Initialize(); 167 } 168 169 status_t EmulatedFakeCamera3::connectCamera(hw_device_t** device) { 170 ALOGV("%s: E", __FUNCTION__); 171 Mutex::Autolock l(mLock); 172 status_t res; 173 174 if (mStatus != STATUS_CLOSED) { 175 ALOGE("%s: Can't connect in state %d", __FUNCTION__, mStatus); 176 return INVALID_OPERATION; 177 } 178 179 mSensor = new Sensor(); 180 mSensor->setSensorListener(this); 181 182 res = mSensor->startUp(); 183 if (res != NO_ERROR) return res; 184 185 mReadoutThread = new ReadoutThread(this); 186 mJpegCompressor = new JpegCompressor(); 187 188 res = mReadoutThread->run("EmuCam3::readoutThread"); 189 if (res != NO_ERROR) return res; 190 191 // Initialize fake 3A 192 193 mControlMode = ANDROID_CONTROL_MODE_AUTO; 194 mFacePriority = false; 195 mAeMode = ANDROID_CONTROL_AE_MODE_ON; 196 mAfMode = ANDROID_CONTROL_AF_MODE_AUTO; 197 mAwbMode = ANDROID_CONTROL_AWB_MODE_AUTO; 198 mAeState = ANDROID_CONTROL_AE_STATE_INACTIVE; 199 mAfState = ANDROID_CONTROL_AF_STATE_INACTIVE; 200 mAwbState = ANDROID_CONTROL_AWB_STATE_INACTIVE; 201 mAfTriggerId = 0; 202 mAeTriggerId = 0; 203 mAeCurrentExposureTime = kNormalExposureTime; 204 mAeCurrentSensitivity = kNormalSensitivity; 205 206 return EmulatedCamera3::connectCamera(device); 207 } 208 209 status_t EmulatedFakeCamera3::closeCamera() { 210 ALOGV("%s: E", __FUNCTION__); 211 status_t res; 212 { 213 Mutex::Autolock l(mLock); 214 if (mStatus == STATUS_CLOSED) return OK; 215 216 res = mSensor->shutDown(); 217 if (res != NO_ERROR) { 218 ALOGE("%s: Unable to shut down sensor: %d", __FUNCTION__, res); 219 return res; 220 } 221 mSensor.clear(); 222 223 mReadoutThread->requestExit(); 224 } 225 226 mReadoutThread->join(); 227 228 { 229 Mutex::Autolock l(mLock); 230 // Clear out private stream information 231 for (StreamIterator s = mStreams.begin(); s != mStreams.end(); s++) { 232 PrivateStreamInfo *privStream = 233 static_cast<PrivateStreamInfo*>((*s)->priv); 234 delete privStream; 235 (*s)->priv = NULL; 236 } 237 mStreams.clear(); 238 mReadoutThread.clear(); 239 } 240 241 return EmulatedCamera3::closeCamera(); 242 } 243 244 status_t EmulatedFakeCamera3::getCameraInfo(struct camera_info *info) { 245 info->facing = mFacingBack ? CAMERA_FACING_BACK : CAMERA_FACING_FRONT; 246 info->orientation = gEmulatedCameraFactory.getFakeCameraOrientation(); 247 return EmulatedCamera3::getCameraInfo(info); 248 } 249 250 /** 251 * Camera3 interface methods 252 */ 253 254 status_t EmulatedFakeCamera3::configureStreams( 255 camera3_stream_configuration *streamList) { 256 Mutex::Autolock l(mLock); 257 ALOGV("%s: %d streams", __FUNCTION__, streamList->num_streams); 258 259 if (mStatus != STATUS_OPEN && mStatus != STATUS_READY) { 260 ALOGE("%s: Cannot configure streams in state %d", 261 __FUNCTION__, mStatus); 262 return NO_INIT; 263 } 264 265 /** 266 * Sanity-check input list. 267 */ 268 if (streamList == NULL) { 269 ALOGE("%s: NULL stream configuration", __FUNCTION__); 270 return BAD_VALUE; 271 } 272 273 if (streamList->streams == NULL) { 274 ALOGE("%s: NULL stream list", __FUNCTION__); 275 return BAD_VALUE; 276 } 277 278 if (streamList->num_streams < 1) { 279 ALOGE("%s: Bad number of streams requested: %d", __FUNCTION__, 280 streamList->num_streams); 281 return BAD_VALUE; 282 } 283 284 camera3_stream_t *inputStream = NULL; 285 for (size_t i = 0; i < streamList->num_streams; i++) { 286 camera3_stream_t *newStream = streamList->streams[i]; 287 288 if (newStream == NULL) { 289 ALOGE("%s: Stream index %zu was NULL", 290 __FUNCTION__, i); 291 return BAD_VALUE; 292 } 293 294 ALOGV("%s: Stream %p (id %zu), type %d, usage 0x%x, format 0x%x", 295 __FUNCTION__, newStream, i, newStream->stream_type, 296 newStream->usage, 297 newStream->format); 298 299 if (newStream->stream_type == CAMERA3_STREAM_INPUT || 300 newStream->stream_type == CAMERA3_STREAM_BIDIRECTIONAL) { 301 if (inputStream != NULL) { 302 303 ALOGE("%s: Multiple input streams requested!", __FUNCTION__); 304 return BAD_VALUE; 305 } 306 inputStream = newStream; 307 } 308 309 bool validFormat = false; 310 for (size_t f = 0; 311 f < sizeof(kAvailableFormats)/sizeof(kAvailableFormats[0]); 312 f++) { 313 if (newStream->format == kAvailableFormats[f]) { 314 validFormat = true; 315 break; 316 } 317 } 318 if (!validFormat) { 319 ALOGE("%s: Unsupported stream format 0x%x requested", 320 __FUNCTION__, newStream->format); 321 return BAD_VALUE; 322 } 323 } 324 mInputStream = inputStream; 325 326 /** 327 * Initially mark all existing streams as not alive 328 */ 329 for (StreamIterator s = mStreams.begin(); s != mStreams.end(); ++s) { 330 PrivateStreamInfo *privStream = 331 static_cast<PrivateStreamInfo*>((*s)->priv); 332 privStream->alive = false; 333 } 334 335 /** 336 * Find new streams and mark still-alive ones 337 */ 338 for (size_t i = 0; i < streamList->num_streams; i++) { 339 camera3_stream_t *newStream = streamList->streams[i]; 340 if (newStream->priv == NULL) { 341 // New stream, construct info 342 PrivateStreamInfo *privStream = new PrivateStreamInfo(); 343 privStream->alive = true; 344 privStream->registered = false; 345 346 switch (newStream->stream_type) { 347 case CAMERA3_STREAM_OUTPUT: 348 newStream->usage = GRALLOC_USAGE_HW_CAMERA_WRITE; 349 break; 350 case CAMERA3_STREAM_INPUT: 351 newStream->usage = GRALLOC_USAGE_HW_CAMERA_READ; 352 break; 353 case CAMERA3_STREAM_BIDIRECTIONAL: 354 newStream->usage = GRALLOC_USAGE_HW_CAMERA_READ | 355 GRALLOC_USAGE_HW_CAMERA_WRITE; 356 break; 357 } 358 newStream->max_buffers = kMaxBufferCount; 359 newStream->priv = privStream; 360 mStreams.push_back(newStream); 361 } else { 362 // Existing stream, mark as still alive. 363 PrivateStreamInfo *privStream = 364 static_cast<PrivateStreamInfo*>(newStream->priv); 365 privStream->alive = true; 366 } 367 } 368 369 /** 370 * Reap the dead streams 371 */ 372 for (StreamIterator s = mStreams.begin(); s != mStreams.end();) { 373 PrivateStreamInfo *privStream = 374 static_cast<PrivateStreamInfo*>((*s)->priv); 375 if (!privStream->alive) { 376 (*s)->priv = NULL; 377 delete privStream; 378 s = mStreams.erase(s); 379 } else { 380 ++s; 381 } 382 } 383 384 /** 385 * Can't reuse settings across configure call 386 */ 387 mPrevSettings.clear(); 388 389 return OK; 390 } 391 392 status_t EmulatedFakeCamera3::registerStreamBuffers( 393 const camera3_stream_buffer_set *bufferSet) { 394 ALOGV("%s: E", __FUNCTION__); 395 Mutex::Autolock l(mLock); 396 397 /** 398 * Sanity checks 399 */ 400 401 // OK: register streams at any time during configure 402 // (but only once per stream) 403 if (mStatus != STATUS_READY && mStatus != STATUS_ACTIVE) { 404 ALOGE("%s: Cannot register buffers in state %d", 405 __FUNCTION__, mStatus); 406 return NO_INIT; 407 } 408 409 if (bufferSet == NULL) { 410 ALOGE("%s: NULL buffer set!", __FUNCTION__); 411 return BAD_VALUE; 412 } 413 414 StreamIterator s = mStreams.begin(); 415 for (; s != mStreams.end(); ++s) { 416 if (bufferSet->stream == *s) break; 417 } 418 if (s == mStreams.end()) { 419 ALOGE("%s: Trying to register buffers for a non-configured stream!", 420 __FUNCTION__); 421 return BAD_VALUE; 422 } 423 424 /** 425 * Register the buffers. This doesn't mean anything to the emulator besides 426 * marking them off as registered. 427 */ 428 429 PrivateStreamInfo *privStream = 430 static_cast<PrivateStreamInfo*>((*s)->priv); 431 432 if (privStream->registered) { 433 ALOGE("%s: Illegal to register buffer more than once", __FUNCTION__); 434 return BAD_VALUE; 435 } 436 437 privStream->registered = true; 438 439 return OK; 440 } 441 442 const camera_metadata_t* EmulatedFakeCamera3::constructDefaultRequestSettings( 443 int type) { 444 ALOGV("%s: E", __FUNCTION__); 445 Mutex::Autolock l(mLock); 446 447 if (type < 0 || type >= CAMERA2_TEMPLATE_COUNT) { 448 ALOGE("%s: Unknown request settings template: %d", 449 __FUNCTION__, type); 450 return NULL; 451 } 452 453 /** 454 * Cache is not just an optimization - pointer returned has to live at 455 * least as long as the camera device instance does. 456 */ 457 if (mDefaultTemplates[type] != NULL) { 458 return mDefaultTemplates[type]; 459 } 460 461 CameraMetadata settings; 462 463 /** android.request */ 464 465 static const uint8_t requestType = ANDROID_REQUEST_TYPE_CAPTURE; 466 settings.update(ANDROID_REQUEST_TYPE, &requestType, 1); 467 468 static const uint8_t metadataMode = ANDROID_REQUEST_METADATA_MODE_FULL; 469 settings.update(ANDROID_REQUEST_METADATA_MODE, &metadataMode, 1); 470 471 static const int32_t id = 0; 472 settings.update(ANDROID_REQUEST_ID, &id, 1); 473 474 static const int32_t frameCount = 0; 475 settings.update(ANDROID_REQUEST_FRAME_COUNT, &frameCount, 1); 476 477 /** android.lens */ 478 479 static const float focusDistance = 0; 480 settings.update(ANDROID_LENS_FOCUS_DISTANCE, &focusDistance, 1); 481 482 static const float aperture = 2.8f; 483 settings.update(ANDROID_LENS_APERTURE, &aperture, 1); 484 485 static const float focalLength = 5.0f; 486 settings.update(ANDROID_LENS_FOCAL_LENGTH, &focalLength, 1); 487 488 static const float filterDensity = 0; 489 settings.update(ANDROID_LENS_FILTER_DENSITY, &filterDensity, 1); 490 491 static const uint8_t opticalStabilizationMode = 492 ANDROID_LENS_OPTICAL_STABILIZATION_MODE_OFF; 493 settings.update(ANDROID_LENS_OPTICAL_STABILIZATION_MODE, 494 &opticalStabilizationMode, 1); 495 496 // FOCUS_RANGE set only in frame 497 498 /** android.sensor */ 499 500 static const int64_t exposureTime = 10 * MSEC; 501 settings.update(ANDROID_SENSOR_EXPOSURE_TIME, &exposureTime, 1); 502 503 static const int64_t frameDuration = 33333333L; // 1/30 s 504 settings.update(ANDROID_SENSOR_FRAME_DURATION, &frameDuration, 1); 505 506 static const int32_t sensitivity = 100; 507 settings.update(ANDROID_SENSOR_SENSITIVITY, &sensitivity, 1); 508 509 // TIMESTAMP set only in frame 510 511 /** android.flash */ 512 513 static const uint8_t flashMode = ANDROID_FLASH_MODE_OFF; 514 settings.update(ANDROID_FLASH_MODE, &flashMode, 1); 515 516 static const uint8_t flashPower = 10; 517 settings.update(ANDROID_FLASH_FIRING_POWER, &flashPower, 1); 518 519 static const int64_t firingTime = 0; 520 settings.update(ANDROID_FLASH_FIRING_TIME, &firingTime, 1); 521 522 /** Processing block modes */ 523 uint8_t hotPixelMode = 0; 524 uint8_t demosaicMode = 0; 525 uint8_t noiseMode = 0; 526 uint8_t shadingMode = 0; 527 uint8_t colorMode = 0; 528 uint8_t tonemapMode = 0; 529 uint8_t edgeMode = 0; 530 switch (type) { 531 case CAMERA2_TEMPLATE_STILL_CAPTURE: 532 // fall-through 533 case CAMERA2_TEMPLATE_VIDEO_SNAPSHOT: 534 // fall-through 535 case CAMERA2_TEMPLATE_ZERO_SHUTTER_LAG: 536 hotPixelMode = ANDROID_HOT_PIXEL_MODE_HIGH_QUALITY; 537 demosaicMode = ANDROID_DEMOSAIC_MODE_HIGH_QUALITY; 538 noiseMode = ANDROID_NOISE_REDUCTION_MODE_HIGH_QUALITY; 539 shadingMode = ANDROID_SHADING_MODE_HIGH_QUALITY; 540 colorMode = ANDROID_COLOR_CORRECTION_MODE_HIGH_QUALITY; 541 tonemapMode = ANDROID_TONEMAP_MODE_HIGH_QUALITY; 542 edgeMode = ANDROID_EDGE_MODE_HIGH_QUALITY; 543 break; 544 case CAMERA2_TEMPLATE_PREVIEW: 545 // fall-through 546 case CAMERA2_TEMPLATE_VIDEO_RECORD: 547 // fall-through 548 default: 549 hotPixelMode = ANDROID_HOT_PIXEL_MODE_FAST; 550 demosaicMode = ANDROID_DEMOSAIC_MODE_FAST; 551 noiseMode = ANDROID_NOISE_REDUCTION_MODE_FAST; 552 shadingMode = ANDROID_SHADING_MODE_FAST; 553 colorMode = ANDROID_COLOR_CORRECTION_MODE_FAST; 554 tonemapMode = ANDROID_TONEMAP_MODE_FAST; 555 edgeMode = ANDROID_EDGE_MODE_FAST; 556 break; 557 } 558 settings.update(ANDROID_HOT_PIXEL_MODE, &hotPixelMode, 1); 559 settings.update(ANDROID_DEMOSAIC_MODE, &demosaicMode, 1); 560 settings.update(ANDROID_NOISE_REDUCTION_MODE, &noiseMode, 1); 561 settings.update(ANDROID_SHADING_MODE, &shadingMode, 1); 562 settings.update(ANDROID_COLOR_CORRECTION_MODE, &colorMode, 1); 563 settings.update(ANDROID_TONEMAP_MODE, &tonemapMode, 1); 564 settings.update(ANDROID_EDGE_MODE, &edgeMode, 1); 565 566 /** android.noise */ 567 static const uint8_t noiseStrength = 5; 568 settings.update(ANDROID_NOISE_REDUCTION_STRENGTH, &noiseStrength, 1); 569 570 /** android.color */ 571 static const float colorTransform[9] = { 572 1.0f, 0.f, 0.f, 573 0.f, 1.f, 0.f, 574 0.f, 0.f, 1.f 575 }; 576 settings.update(ANDROID_COLOR_CORRECTION_TRANSFORM, colorTransform, 9); 577 578 /** android.tonemap */ 579 static const float tonemapCurve[4] = { 580 0.f, 0.f, 581 1.f, 1.f 582 }; 583 settings.update(ANDROID_TONEMAP_CURVE_RED, tonemapCurve, 4); 584 settings.update(ANDROID_TONEMAP_CURVE_GREEN, tonemapCurve, 4); 585 settings.update(ANDROID_TONEMAP_CURVE_BLUE, tonemapCurve, 4); 586 587 /** android.edge */ 588 static const uint8_t edgeStrength = 5; 589 settings.update(ANDROID_EDGE_STRENGTH, &edgeStrength, 1); 590 591 /** android.scaler */ 592 static const int32_t cropRegion[3] = { 593 0, 0, (int32_t)Sensor::kResolution[0] 594 }; 595 settings.update(ANDROID_SCALER_CROP_REGION, cropRegion, 3); 596 597 /** android.jpeg */ 598 static const uint8_t jpegQuality = 80; 599 settings.update(ANDROID_JPEG_QUALITY, &jpegQuality, 1); 600 601 static const int32_t thumbnailSize[2] = { 602 640, 480 603 }; 604 settings.update(ANDROID_JPEG_THUMBNAIL_SIZE, thumbnailSize, 2); 605 606 static const uint8_t thumbnailQuality = 80; 607 settings.update(ANDROID_JPEG_THUMBNAIL_QUALITY, &thumbnailQuality, 1); 608 609 static const double gpsCoordinates[2] = { 610 0, 0 611 }; 612 settings.update(ANDROID_JPEG_GPS_COORDINATES, gpsCoordinates, 2); 613 614 static const uint8_t gpsProcessingMethod[32] = "None"; 615 settings.update(ANDROID_JPEG_GPS_PROCESSING_METHOD, gpsProcessingMethod, 32); 616 617 static const int64_t gpsTimestamp = 0; 618 settings.update(ANDROID_JPEG_GPS_TIMESTAMP, &gpsTimestamp, 1); 619 620 static const int32_t jpegOrientation = 0; 621 settings.update(ANDROID_JPEG_ORIENTATION, &jpegOrientation, 1); 622 623 /** android.stats */ 624 625 static const uint8_t faceDetectMode = 626 ANDROID_STATISTICS_FACE_DETECT_MODE_OFF; 627 settings.update(ANDROID_STATISTICS_FACE_DETECT_MODE, &faceDetectMode, 1); 628 629 static const uint8_t histogramMode = ANDROID_STATISTICS_HISTOGRAM_MODE_OFF; 630 settings.update(ANDROID_STATISTICS_HISTOGRAM_MODE, &histogramMode, 1); 631 632 static const uint8_t sharpnessMapMode = 633 ANDROID_STATISTICS_SHARPNESS_MAP_MODE_OFF; 634 settings.update(ANDROID_STATISTICS_SHARPNESS_MAP_MODE, &sharpnessMapMode, 1); 635 636 // faceRectangles, faceScores, faceLandmarks, faceIds, histogram, 637 // sharpnessMap only in frames 638 639 /** android.control */ 640 641 uint8_t controlIntent = 0; 642 switch (type) { 643 case CAMERA2_TEMPLATE_PREVIEW: 644 controlIntent = ANDROID_CONTROL_CAPTURE_INTENT_PREVIEW; 645 break; 646 case CAMERA2_TEMPLATE_STILL_CAPTURE: 647 controlIntent = ANDROID_CONTROL_CAPTURE_INTENT_STILL_CAPTURE; 648 break; 649 case CAMERA2_TEMPLATE_VIDEO_RECORD: 650 controlIntent = ANDROID_CONTROL_CAPTURE_INTENT_VIDEO_RECORD; 651 break; 652 case CAMERA2_TEMPLATE_VIDEO_SNAPSHOT: 653 controlIntent = ANDROID_CONTROL_CAPTURE_INTENT_VIDEO_SNAPSHOT; 654 break; 655 case CAMERA2_TEMPLATE_ZERO_SHUTTER_LAG: 656 controlIntent = ANDROID_CONTROL_CAPTURE_INTENT_ZERO_SHUTTER_LAG; 657 break; 658 default: 659 controlIntent = ANDROID_CONTROL_CAPTURE_INTENT_CUSTOM; 660 break; 661 } 662 settings.update(ANDROID_CONTROL_CAPTURE_INTENT, &controlIntent, 1); 663 664 static const uint8_t controlMode = ANDROID_CONTROL_MODE_AUTO; 665 settings.update(ANDROID_CONTROL_MODE, &controlMode, 1); 666 667 static const uint8_t effectMode = ANDROID_CONTROL_EFFECT_MODE_OFF; 668 settings.update(ANDROID_CONTROL_EFFECT_MODE, &effectMode, 1); 669 670 static const uint8_t sceneMode = ANDROID_CONTROL_SCENE_MODE_FACE_PRIORITY; 671 settings.update(ANDROID_CONTROL_SCENE_MODE, &sceneMode, 1); 672 673 static const uint8_t aeMode = ANDROID_CONTROL_AE_MODE_ON; 674 settings.update(ANDROID_CONTROL_AE_MODE, &aeMode, 1); 675 676 static const uint8_t aeLock = ANDROID_CONTROL_AE_LOCK_OFF; 677 settings.update(ANDROID_CONTROL_AE_LOCK, &aeLock, 1); 678 679 static const int32_t controlRegions[5] = { 680 0, 0, (int32_t)Sensor::kResolution[0], (int32_t)Sensor::kResolution[1], 681 1000 682 }; 683 settings.update(ANDROID_CONTROL_AE_REGIONS, controlRegions, 5); 684 685 static const int32_t aeExpCompensation = 0; 686 settings.update(ANDROID_CONTROL_AE_EXPOSURE_COMPENSATION, &aeExpCompensation, 1); 687 688 static const int32_t aeTargetFpsRange[2] = { 689 10, 30 690 }; 691 settings.update(ANDROID_CONTROL_AE_TARGET_FPS_RANGE, aeTargetFpsRange, 2); 692 693 static const uint8_t aeAntibandingMode = 694 ANDROID_CONTROL_AE_ANTIBANDING_MODE_AUTO; 695 settings.update(ANDROID_CONTROL_AE_ANTIBANDING_MODE, &aeAntibandingMode, 1); 696 697 static const uint8_t awbMode = 698 ANDROID_CONTROL_AWB_MODE_AUTO; 699 settings.update(ANDROID_CONTROL_AWB_MODE, &awbMode, 1); 700 701 static const uint8_t awbLock = ANDROID_CONTROL_AWB_LOCK_OFF; 702 settings.update(ANDROID_CONTROL_AWB_LOCK, &awbLock, 1); 703 704 settings.update(ANDROID_CONTROL_AWB_REGIONS, controlRegions, 5); 705 706 uint8_t afMode = 0; 707 switch (type) { 708 case CAMERA2_TEMPLATE_PREVIEW: 709 afMode = ANDROID_CONTROL_AF_MODE_AUTO; 710 break; 711 case CAMERA2_TEMPLATE_STILL_CAPTURE: 712 afMode = ANDROID_CONTROL_AF_MODE_AUTO; 713 break; 714 case CAMERA2_TEMPLATE_VIDEO_RECORD: 715 afMode = ANDROID_CONTROL_AF_MODE_CONTINUOUS_VIDEO; 716 break; 717 case CAMERA2_TEMPLATE_VIDEO_SNAPSHOT: 718 afMode = ANDROID_CONTROL_AF_MODE_CONTINUOUS_VIDEO; 719 break; 720 case CAMERA2_TEMPLATE_ZERO_SHUTTER_LAG: 721 afMode = ANDROID_CONTROL_AF_MODE_CONTINUOUS_PICTURE; 722 break; 723 default: 724 afMode = ANDROID_CONTROL_AF_MODE_AUTO; 725 break; 726 } 727 settings.update(ANDROID_CONTROL_AF_MODE, &afMode, 1); 728 729 settings.update(ANDROID_CONTROL_AF_REGIONS, controlRegions, 5); 730 731 static const uint8_t vstabMode = 732 ANDROID_CONTROL_VIDEO_STABILIZATION_MODE_OFF; 733 settings.update(ANDROID_CONTROL_VIDEO_STABILIZATION_MODE, &vstabMode, 1); 734 735 // aeState, awbState, afState only in frame 736 737 mDefaultTemplates[type] = settings.release(); 738 739 return mDefaultTemplates[type]; 740 } 741 742 status_t EmulatedFakeCamera3::processCaptureRequest( 743 camera3_capture_request *request) { 744 745 Mutex::Autolock l(mLock); 746 status_t res; 747 748 /** Validation */ 749 750 if (mStatus < STATUS_READY) { 751 ALOGE("%s: Can't submit capture requests in state %d", __FUNCTION__, 752 mStatus); 753 return INVALID_OPERATION; 754 } 755 756 if (request == NULL) { 757 ALOGE("%s: NULL request!", __FUNCTION__); 758 return BAD_VALUE; 759 } 760 761 uint32_t frameNumber = request->frame_number; 762 763 if (request->settings == NULL && mPrevSettings.isEmpty()) { 764 ALOGE("%s: Request %d: NULL settings for first request after" 765 "configureStreams()", __FUNCTION__, frameNumber); 766 return BAD_VALUE; 767 } 768 769 if (request->input_buffer != NULL && 770 request->input_buffer->stream != mInputStream) { 771 ALOGE("%s: Request %d: Input buffer not from input stream!", 772 __FUNCTION__, frameNumber); 773 ALOGV("%s: Bad stream %p, expected: %p", 774 __FUNCTION__, request->input_buffer->stream, 775 mInputStream); 776 ALOGV("%s: Bad stream type %d, expected stream type %d", 777 __FUNCTION__, request->input_buffer->stream->stream_type, 778 mInputStream ? mInputStream->stream_type : -1); 779 780 return BAD_VALUE; 781 } 782 783 if (request->num_output_buffers < 1 || request->output_buffers == NULL) { 784 ALOGE("%s: Request %d: No output buffers provided!", 785 __FUNCTION__, frameNumber); 786 return BAD_VALUE; 787 } 788 789 // Validate all buffers, starting with input buffer if it's given 790 791 ssize_t idx; 792 const camera3_stream_buffer_t *b; 793 if (request->input_buffer != NULL) { 794 idx = -1; 795 b = request->input_buffer; 796 } else { 797 idx = 0; 798 b = request->output_buffers; 799 } 800 do { 801 PrivateStreamInfo *priv = 802 static_cast<PrivateStreamInfo*>(b->stream->priv); 803 if (priv == NULL) { 804 ALOGE("%s: Request %d: Buffer %zu: Unconfigured stream!", 805 __FUNCTION__, frameNumber, idx); 806 return BAD_VALUE; 807 } 808 if (!priv->alive || !priv->registered) { 809 ALOGE("%s: Request %d: Buffer %zu: Unregistered or dead stream!", 810 __FUNCTION__, frameNumber, idx); 811 return BAD_VALUE; 812 } 813 if (b->status != CAMERA3_BUFFER_STATUS_OK) { 814 ALOGE("%s: Request %d: Buffer %zu: Status not OK!", 815 __FUNCTION__, frameNumber, idx); 816 return BAD_VALUE; 817 } 818 if (b->release_fence != -1) { 819 ALOGE("%s: Request %d: Buffer %zu: Has a release fence!", 820 __FUNCTION__, frameNumber, idx); 821 return BAD_VALUE; 822 } 823 if (b->buffer == NULL) { 824 ALOGE("%s: Request %d: Buffer %zu: NULL buffer handle!", 825 __FUNCTION__, frameNumber, idx); 826 return BAD_VALUE; 827 } 828 idx++; 829 b = &(request->output_buffers[idx]); 830 } while (idx < (ssize_t)request->num_output_buffers); 831 832 // TODO: Validate settings parameters 833 834 /** 835 * Start processing this request 836 */ 837 838 mStatus = STATUS_ACTIVE; 839 840 CameraMetadata settings; 841 842 if (request->settings == NULL) { 843 settings.acquire(mPrevSettings); 844 } else { 845 settings = request->settings; 846 } 847 848 res = process3A(settings); 849 if (res != OK) { 850 return res; 851 } 852 853 // TODO: Handle reprocessing 854 855 /** 856 * Get ready for sensor config 857 */ 858 859 nsecs_t exposureTime; 860 nsecs_t frameDuration; 861 uint32_t sensitivity; 862 bool needJpeg = false; 863 864 exposureTime = settings.find(ANDROID_SENSOR_EXPOSURE_TIME).data.i64[0]; 865 frameDuration = settings.find(ANDROID_SENSOR_FRAME_DURATION).data.i64[0]; 866 sensitivity = settings.find(ANDROID_SENSOR_SENSITIVITY).data.i32[0]; 867 868 Buffers *sensorBuffers = new Buffers(); 869 HalBufferVector *buffers = new HalBufferVector(); 870 871 sensorBuffers->setCapacity(request->num_output_buffers); 872 buffers->setCapacity(request->num_output_buffers); 873 874 // Process all the buffers we got for output, constructing internal buffer 875 // structures for them, and lock them for writing. 876 for (size_t i = 0; i < request->num_output_buffers; i++) { 877 const camera3_stream_buffer &srcBuf = request->output_buffers[i]; 878 const cb_handle_t *privBuffer = 879 static_cast<const cb_handle_t*>(*srcBuf.buffer); 880 StreamBuffer destBuf; 881 destBuf.streamId = kGenericStreamId; 882 destBuf.width = srcBuf.stream->width; 883 destBuf.height = srcBuf.stream->height; 884 destBuf.format = privBuffer->format; // Use real private format 885 destBuf.stride = srcBuf.stream->width; // TODO: query from gralloc 886 destBuf.buffer = srcBuf.buffer; 887 888 if (destBuf.format == HAL_PIXEL_FORMAT_BLOB) { 889 needJpeg = true; 890 } 891 892 // Wait on fence 893 sp<Fence> bufferAcquireFence = new Fence(srcBuf.acquire_fence); 894 res = bufferAcquireFence->wait(kFenceTimeoutMs); 895 if (res == TIMED_OUT) { 896 ALOGE("%s: Request %d: Buffer %zu: Fence timed out after %d ms", 897 __FUNCTION__, frameNumber, i, kFenceTimeoutMs); 898 } 899 if (res == OK) { 900 // Lock buffer for writing 901 const Rect rect(destBuf.width, destBuf.height); 902 if (srcBuf.stream->format == HAL_PIXEL_FORMAT_YCbCr_420_888) { 903 if (privBuffer->format == HAL_PIXEL_FORMAT_YCrCb_420_SP) { 904 android_ycbcr ycbcr = android_ycbcr(); 905 res = GraphicBufferMapper::get().lockYCbCr( 906 *(destBuf.buffer), 907 GRALLOC_USAGE_HW_CAMERA_WRITE, rect, 908 &ycbcr); 909 // This is only valid because we know that emulator's 910 // YCbCr_420_888 is really contiguous NV21 under the hood 911 destBuf.img = static_cast<uint8_t*>(ycbcr.y); 912 } else { 913 ALOGE("Unexpected private format for flexible YUV: 0x%x", 914 privBuffer->format); 915 res = INVALID_OPERATION; 916 } 917 } else { 918 res = GraphicBufferMapper::get().lock(*(destBuf.buffer), 919 GRALLOC_USAGE_HW_CAMERA_WRITE, rect, 920 (void**)&(destBuf.img)); 921 } 922 if (res != OK) { 923 ALOGE("%s: Request %d: Buffer %zu: Unable to lock buffer", 924 __FUNCTION__, frameNumber, i); 925 } 926 } 927 928 if (res != OK) { 929 // Either waiting or locking failed. Unlock locked buffers and bail 930 // out. 931 for (size_t j = 0; j < i; j++) { 932 GraphicBufferMapper::get().unlock( 933 *(request->output_buffers[i].buffer)); 934 } 935 return NO_INIT; 936 } 937 938 sensorBuffers->push_back(destBuf); 939 buffers->push_back(srcBuf); 940 } 941 942 /** 943 * Wait for JPEG compressor to not be busy, if needed 944 */ 945 if (needJpeg) { 946 bool ready = mJpegCompressor->waitForDone(kFenceTimeoutMs); 947 if (!ready) { 948 ALOGE("%s: Timeout waiting for JPEG compression to complete!", 949 __FUNCTION__); 950 return NO_INIT; 951 } 952 } 953 954 /** 955 * Wait until the in-flight queue has room 956 */ 957 res = mReadoutThread->waitForReadout(); 958 if (res != OK) { 959 ALOGE("%s: Timeout waiting for previous requests to complete!", 960 __FUNCTION__); 961 return NO_INIT; 962 } 963 964 /** 965 * Wait until sensor's ready. This waits for lengthy amounts of time with 966 * mLock held, but the interface spec is that no other calls may by done to 967 * the HAL by the framework while process_capture_request is happening. 968 */ 969 int syncTimeoutCount = 0; 970 while(!mSensor->waitForVSync(kSyncWaitTimeout)) { 971 if (mStatus == STATUS_ERROR) { 972 return NO_INIT; 973 } 974 if (syncTimeoutCount == kMaxSyncTimeoutCount) { 975 ALOGE("%s: Request %d: Sensor sync timed out after %" PRId64 " ms", 976 __FUNCTION__, frameNumber, 977 kSyncWaitTimeout * kMaxSyncTimeoutCount / 1000000); 978 return NO_INIT; 979 } 980 syncTimeoutCount++; 981 } 982 983 /** 984 * Configure sensor and queue up the request to the readout thread 985 */ 986 mSensor->setExposureTime(exposureTime); 987 mSensor->setFrameDuration(frameDuration); 988 mSensor->setSensitivity(sensitivity); 989 mSensor->setDestinationBuffers(sensorBuffers); 990 mSensor->setFrameNumber(request->frame_number); 991 992 ReadoutThread::Request r; 993 r.frameNumber = request->frame_number; 994 r.settings = settings; 995 r.sensorBuffers = sensorBuffers; 996 r.buffers = buffers; 997 998 mReadoutThread->queueCaptureRequest(r); 999 ALOGVV("%s: Queued frame %d", __FUNCTION__, request->frame_number); 1000 1001 // Cache the settings for next time 1002 mPrevSettings.acquire(settings); 1003 1004 return OK; 1005 } 1006 1007 /** Debug methods */ 1008 1009 void EmulatedFakeCamera3::dump(int fd) { 1010 1011 } 1012 1013 /** Tag query methods */ 1014 const char* EmulatedFakeCamera3::getVendorSectionName(uint32_t tag) { 1015 return NULL; 1016 } 1017 1018 const char* EmulatedFakeCamera3::getVendorTagName(uint32_t tag) { 1019 return NULL; 1020 } 1021 1022 int EmulatedFakeCamera3::getVendorTagType(uint32_t tag) { 1023 return 0; 1024 } 1025 1026 /** 1027 * Private methods 1028 */ 1029 1030 status_t EmulatedFakeCamera3::constructStaticInfo() { 1031 1032 CameraMetadata info; 1033 // android.lens 1034 1035 // 5 cm min focus distance for back camera, infinity (fixed focus) for front 1036 const float minFocusDistance = mFacingBack ? 1.0/0.05 : 0.0; 1037 info.update(ANDROID_LENS_INFO_MINIMUM_FOCUS_DISTANCE, 1038 &minFocusDistance, 1); 1039 1040 // 5 m hyperfocal distance for back camera, infinity (fixed focus) for front 1041 const float hyperFocalDistance = mFacingBack ? 1.0/5.0 : 0.0; 1042 info.update(ANDROID_LENS_INFO_HYPERFOCAL_DISTANCE, 1043 &minFocusDistance, 1); 1044 1045 static const float focalLength = 3.30f; // mm 1046 info.update(ANDROID_LENS_INFO_AVAILABLE_FOCAL_LENGTHS, 1047 &focalLength, 1); 1048 static const float aperture = 2.8f; 1049 info.update(ANDROID_LENS_INFO_AVAILABLE_APERTURES, 1050 &aperture, 1); 1051 static const float filterDensity = 0; 1052 info.update(ANDROID_LENS_INFO_AVAILABLE_FILTER_DENSITIES, 1053 &filterDensity, 1); 1054 static const uint8_t availableOpticalStabilization = 1055 ANDROID_LENS_OPTICAL_STABILIZATION_MODE_OFF; 1056 info.update(ANDROID_LENS_INFO_AVAILABLE_OPTICAL_STABILIZATION, 1057 &availableOpticalStabilization, 1); 1058 1059 static const int32_t lensShadingMapSize[] = {1, 1}; 1060 info.update(ANDROID_LENS_INFO_SHADING_MAP_SIZE, lensShadingMapSize, 1061 sizeof(lensShadingMapSize)/sizeof(int32_t)); 1062 1063 uint8_t lensFacing = mFacingBack ? 1064 ANDROID_LENS_FACING_BACK : ANDROID_LENS_FACING_FRONT; 1065 info.update(ANDROID_LENS_FACING, &lensFacing, 1); 1066 1067 float lensPosition[3]; 1068 if (mFacingBack) { 1069 // Back-facing camera is center-top on device 1070 lensPosition[0] = 0; 1071 lensPosition[1] = 20; 1072 lensPosition[2] = -5; 1073 } else { 1074 // Front-facing camera is center-right on device 1075 lensPosition[0] = 20; 1076 lensPosition[1] = 20; 1077 lensPosition[2] = 0; 1078 } 1079 info.update(ANDROID_LENS_POSITION, lensPosition, sizeof(lensPosition)/ 1080 sizeof(float)); 1081 1082 // android.sensor 1083 1084 info.update(ANDROID_SENSOR_INFO_EXPOSURE_TIME_RANGE, 1085 Sensor::kExposureTimeRange, 2); 1086 1087 info.update(ANDROID_SENSOR_INFO_MAX_FRAME_DURATION, 1088 &Sensor::kFrameDurationRange[1], 1); 1089 1090 info.update(ANDROID_SENSOR_INFO_SENSITIVITY_RANGE, 1091 Sensor::kSensitivityRange, 1092 sizeof(Sensor::kSensitivityRange) 1093 /sizeof(int32_t)); 1094 1095 info.update(ANDROID_SENSOR_INFO_COLOR_FILTER_ARRANGEMENT, 1096 &Sensor::kColorFilterArrangement, 1); 1097 1098 static const float sensorPhysicalSize[2] = {3.20f, 2.40f}; // mm 1099 info.update(ANDROID_SENSOR_INFO_PHYSICAL_SIZE, 1100 sensorPhysicalSize, 2); 1101 1102 info.update(ANDROID_SENSOR_INFO_PIXEL_ARRAY_SIZE, 1103 (int32_t*)Sensor::kResolution, 2); 1104 1105 info.update(ANDROID_SENSOR_INFO_ACTIVE_ARRAY_SIZE, 1106 (int32_t*)Sensor::kResolution, 2); 1107 1108 info.update(ANDROID_SENSOR_INFO_WHITE_LEVEL, 1109 (int32_t*)&Sensor::kMaxRawValue, 1); 1110 1111 static const int32_t blackLevelPattern[4] = { 1112 (int32_t)Sensor::kBlackLevel, (int32_t)Sensor::kBlackLevel, 1113 (int32_t)Sensor::kBlackLevel, (int32_t)Sensor::kBlackLevel 1114 }; 1115 info.update(ANDROID_SENSOR_BLACK_LEVEL_PATTERN, 1116 blackLevelPattern, sizeof(blackLevelPattern)/sizeof(int32_t)); 1117 1118 static const int32_t orientation = 0; // unrotated (0 degrees) 1119 info.update(ANDROID_SENSOR_ORIENTATION, &orientation, 1); 1120 1121 //TODO: sensor color calibration fields 1122 1123 // android.flash 1124 static const uint8_t flashAvailable = 0; 1125 info.update(ANDROID_FLASH_INFO_AVAILABLE, &flashAvailable, 1); 1126 1127 static const int64_t flashChargeDuration = 0; 1128 info.update(ANDROID_FLASH_INFO_CHARGE_DURATION, &flashChargeDuration, 1); 1129 1130 // android.tonemap 1131 1132 static const int32_t tonemapCurvePoints = 128; 1133 info.update(ANDROID_TONEMAP_MAX_CURVE_POINTS, &tonemapCurvePoints, 1); 1134 1135 // android.scaler 1136 1137 info.update(ANDROID_SCALER_AVAILABLE_FORMATS, 1138 kAvailableFormats, 1139 sizeof(kAvailableFormats)/sizeof(int32_t)); 1140 1141 info.update(ANDROID_SCALER_AVAILABLE_RAW_SIZES, 1142 (int32_t*)kAvailableRawSizes, 1143 sizeof(kAvailableRawSizes)/sizeof(uint32_t)); 1144 1145 info.update(ANDROID_SCALER_AVAILABLE_RAW_MIN_DURATIONS, 1146 (int64_t*)kAvailableRawMinDurations, 1147 sizeof(kAvailableRawMinDurations)/sizeof(uint64_t)); 1148 1149 if (mFacingBack) { 1150 info.update(ANDROID_SCALER_AVAILABLE_PROCESSED_SIZES, 1151 (int32_t*)kAvailableProcessedSizesBack, 1152 sizeof(kAvailableProcessedSizesBack)/sizeof(uint32_t)); 1153 } else { 1154 info.update(ANDROID_SCALER_AVAILABLE_PROCESSED_SIZES, 1155 (int32_t*)kAvailableProcessedSizesFront, 1156 sizeof(kAvailableProcessedSizesFront)/sizeof(uint32_t)); 1157 } 1158 1159 info.update(ANDROID_SCALER_AVAILABLE_PROCESSED_MIN_DURATIONS, 1160 (int64_t*)kAvailableProcessedMinDurations, 1161 sizeof(kAvailableProcessedMinDurations)/sizeof(uint64_t)); 1162 1163 if (mFacingBack) { 1164 info.update(ANDROID_SCALER_AVAILABLE_JPEG_SIZES, 1165 (int32_t*)kAvailableJpegSizesBack, 1166 sizeof(kAvailableJpegSizesBack)/sizeof(uint32_t)); 1167 } else { 1168 info.update(ANDROID_SCALER_AVAILABLE_JPEG_SIZES, 1169 (int32_t*)kAvailableJpegSizesFront, 1170 sizeof(kAvailableJpegSizesFront)/sizeof(uint32_t)); 1171 } 1172 1173 info.update(ANDROID_SCALER_AVAILABLE_JPEG_MIN_DURATIONS, 1174 (int64_t*)kAvailableJpegMinDurations, 1175 sizeof(kAvailableJpegMinDurations)/sizeof(uint64_t)); 1176 1177 static const float maxZoom = 10; 1178 info.update(ANDROID_SCALER_AVAILABLE_MAX_DIGITAL_ZOOM, 1179 &maxZoom, 1); 1180 1181 // android.jpeg 1182 1183 static const int32_t jpegThumbnailSizes[] = { 1184 0, 0, 1185 160, 120, 1186 320, 240 1187 }; 1188 info.update(ANDROID_JPEG_AVAILABLE_THUMBNAIL_SIZES, 1189 jpegThumbnailSizes, sizeof(jpegThumbnailSizes)/sizeof(int32_t)); 1190 1191 static const int32_t jpegMaxSize = JpegCompressor::kMaxJpegSize; 1192 info.update(ANDROID_JPEG_MAX_SIZE, &jpegMaxSize, 1); 1193 1194 // android.stats 1195 1196 static const uint8_t availableFaceDetectModes[] = { 1197 ANDROID_STATISTICS_FACE_DETECT_MODE_OFF, 1198 ANDROID_STATISTICS_FACE_DETECT_MODE_SIMPLE, 1199 ANDROID_STATISTICS_FACE_DETECT_MODE_FULL 1200 }; 1201 1202 info.update(ANDROID_STATISTICS_INFO_AVAILABLE_FACE_DETECT_MODES, 1203 availableFaceDetectModes, 1204 sizeof(availableFaceDetectModes)); 1205 1206 static const int32_t maxFaceCount = 8; 1207 info.update(ANDROID_STATISTICS_INFO_MAX_FACE_COUNT, 1208 &maxFaceCount, 1); 1209 1210 static const int32_t histogramSize = 64; 1211 info.update(ANDROID_STATISTICS_INFO_HISTOGRAM_BUCKET_COUNT, 1212 &histogramSize, 1); 1213 1214 static const int32_t maxHistogramCount = 1000; 1215 info.update(ANDROID_STATISTICS_INFO_MAX_HISTOGRAM_COUNT, 1216 &maxHistogramCount, 1); 1217 1218 static const int32_t sharpnessMapSize[2] = {64, 64}; 1219 info.update(ANDROID_STATISTICS_INFO_SHARPNESS_MAP_SIZE, 1220 sharpnessMapSize, sizeof(sharpnessMapSize)/sizeof(int32_t)); 1221 1222 static const int32_t maxSharpnessMapValue = 1000; 1223 info.update(ANDROID_STATISTICS_INFO_MAX_SHARPNESS_MAP_VALUE, 1224 &maxSharpnessMapValue, 1); 1225 1226 // android.control 1227 1228 static const uint8_t availableSceneModes[] = { 1229 ANDROID_CONTROL_SCENE_MODE_DISABLED 1230 }; 1231 info.update(ANDROID_CONTROL_AVAILABLE_SCENE_MODES, 1232 availableSceneModes, sizeof(availableSceneModes)); 1233 1234 static const uint8_t availableEffects[] = { 1235 ANDROID_CONTROL_EFFECT_MODE_OFF 1236 }; 1237 info.update(ANDROID_CONTROL_AVAILABLE_EFFECTS, 1238 availableEffects, sizeof(availableEffects)); 1239 1240 static const int32_t max3aRegions[] = {/*AE*/ 0,/*AWB*/ 0,/*AF*/ 0}; 1241 info.update(ANDROID_CONTROL_MAX_REGIONS, 1242 max3aRegions, sizeof(max3aRegions)/sizeof(max3aRegions[0])); 1243 1244 static const uint8_t availableAeModes[] = { 1245 ANDROID_CONTROL_AE_MODE_OFF, 1246 ANDROID_CONTROL_AE_MODE_ON 1247 }; 1248 info.update(ANDROID_CONTROL_AE_AVAILABLE_MODES, 1249 availableAeModes, sizeof(availableAeModes)); 1250 1251 static const camera_metadata_rational exposureCompensationStep = { 1252 1, 3 1253 }; 1254 info.update(ANDROID_CONTROL_AE_COMPENSATION_STEP, 1255 &exposureCompensationStep, 1); 1256 1257 int32_t exposureCompensationRange[] = {-9, 9}; 1258 info.update(ANDROID_CONTROL_AE_COMPENSATION_RANGE, 1259 exposureCompensationRange, 1260 sizeof(exposureCompensationRange)/sizeof(int32_t)); 1261 1262 static const int32_t availableTargetFpsRanges[] = { 1263 5, 30, 15, 30 1264 }; 1265 info.update(ANDROID_CONTROL_AE_AVAILABLE_TARGET_FPS_RANGES, 1266 availableTargetFpsRanges, 1267 sizeof(availableTargetFpsRanges)/sizeof(int32_t)); 1268 1269 static const uint8_t availableAntibandingModes[] = { 1270 ANDROID_CONTROL_AE_ANTIBANDING_MODE_OFF, 1271 ANDROID_CONTROL_AE_ANTIBANDING_MODE_AUTO 1272 }; 1273 info.update(ANDROID_CONTROL_AE_AVAILABLE_ANTIBANDING_MODES, 1274 availableAntibandingModes, sizeof(availableAntibandingModes)); 1275 1276 static const uint8_t availableAwbModes[] = { 1277 ANDROID_CONTROL_AWB_MODE_OFF, 1278 ANDROID_CONTROL_AWB_MODE_AUTO, 1279 ANDROID_CONTROL_AWB_MODE_INCANDESCENT, 1280 ANDROID_CONTROL_AWB_MODE_FLUORESCENT, 1281 ANDROID_CONTROL_AWB_MODE_DAYLIGHT, 1282 ANDROID_CONTROL_AWB_MODE_SHADE 1283 }; 1284 info.update(ANDROID_CONTROL_AWB_AVAILABLE_MODES, 1285 availableAwbModes, sizeof(availableAwbModes)); 1286 1287 static const uint8_t availableAfModesBack[] = { 1288 ANDROID_CONTROL_AF_MODE_OFF, 1289 ANDROID_CONTROL_AF_MODE_AUTO, 1290 ANDROID_CONTROL_AF_MODE_MACRO, 1291 ANDROID_CONTROL_AF_MODE_CONTINUOUS_VIDEO, 1292 ANDROID_CONTROL_AF_MODE_CONTINUOUS_PICTURE 1293 }; 1294 1295 static const uint8_t availableAfModesFront[] = { 1296 ANDROID_CONTROL_AF_MODE_OFF 1297 }; 1298 1299 if (mFacingBack) { 1300 info.update(ANDROID_CONTROL_AF_AVAILABLE_MODES, 1301 availableAfModesBack, sizeof(availableAfModesBack)); 1302 } else { 1303 info.update(ANDROID_CONTROL_AF_AVAILABLE_MODES, 1304 availableAfModesFront, sizeof(availableAfModesFront)); 1305 } 1306 1307 static const uint8_t availableVstabModes[] = { 1308 ANDROID_CONTROL_VIDEO_STABILIZATION_MODE_OFF 1309 }; 1310 info.update(ANDROID_CONTROL_AVAILABLE_VIDEO_STABILIZATION_MODES, 1311 availableVstabModes, sizeof(availableVstabModes)); 1312 1313 // android.info 1314 const uint8_t supportedHardwareLevel = 1315 mFullMode ? ANDROID_INFO_SUPPORTED_HARDWARE_LEVEL_FULL : 1316 ANDROID_INFO_SUPPORTED_HARDWARE_LEVEL_LIMITED; 1317 info.update(ANDROID_INFO_SUPPORTED_HARDWARE_LEVEL, 1318 &supportedHardwareLevel, 1319 /*count*/1); 1320 1321 mCameraInfo = info.release(); 1322 1323 return OK; 1324 } 1325 1326 status_t EmulatedFakeCamera3::process3A(CameraMetadata &settings) { 1327 /** 1328 * Extract top-level 3A controls 1329 */ 1330 status_t res; 1331 1332 bool facePriority = false; 1333 1334 camera_metadata_entry e; 1335 1336 e = settings.find(ANDROID_CONTROL_MODE); 1337 if (e.count == 0) { 1338 ALOGE("%s: No control mode entry!", __FUNCTION__); 1339 return BAD_VALUE; 1340 } 1341 uint8_t controlMode = e.data.u8[0]; 1342 1343 e = settings.find(ANDROID_CONTROL_SCENE_MODE); 1344 if (e.count == 0) { 1345 ALOGE("%s: No scene mode entry!", __FUNCTION__); 1346 return BAD_VALUE; 1347 } 1348 uint8_t sceneMode = e.data.u8[0]; 1349 1350 if (controlMode == ANDROID_CONTROL_MODE_OFF) { 1351 mAeState = ANDROID_CONTROL_AE_STATE_INACTIVE; 1352 mAfState = ANDROID_CONTROL_AF_STATE_INACTIVE; 1353 mAwbState = ANDROID_CONTROL_AWB_STATE_INACTIVE; 1354 update3A(settings); 1355 return OK; 1356 } else if (controlMode == ANDROID_CONTROL_MODE_USE_SCENE_MODE) { 1357 switch(sceneMode) { 1358 case ANDROID_CONTROL_SCENE_MODE_FACE_PRIORITY: 1359 mFacePriority = true; 1360 break; 1361 default: 1362 ALOGE("%s: Emulator doesn't support scene mode %d", 1363 __FUNCTION__, sceneMode); 1364 return BAD_VALUE; 1365 } 1366 } else { 1367 mFacePriority = false; 1368 } 1369 1370 // controlMode == AUTO or sceneMode = FACE_PRIORITY 1371 // Process individual 3A controls 1372 1373 res = doFakeAE(settings); 1374 if (res != OK) return res; 1375 1376 res = doFakeAF(settings); 1377 if (res != OK) return res; 1378 1379 res = doFakeAWB(settings); 1380 if (res != OK) return res; 1381 1382 update3A(settings); 1383 return OK; 1384 } 1385 1386 status_t EmulatedFakeCamera3::doFakeAE(CameraMetadata &settings) { 1387 camera_metadata_entry e; 1388 1389 e = settings.find(ANDROID_CONTROL_AE_MODE); 1390 if (e.count == 0) { 1391 ALOGE("%s: No AE mode entry!", __FUNCTION__); 1392 return BAD_VALUE; 1393 } 1394 uint8_t aeMode = e.data.u8[0]; 1395 1396 switch (aeMode) { 1397 case ANDROID_CONTROL_AE_MODE_OFF: 1398 // AE is OFF 1399 mAeState = ANDROID_CONTROL_AE_STATE_INACTIVE; 1400 return OK; 1401 case ANDROID_CONTROL_AE_MODE_ON: 1402 // OK for AUTO modes 1403 break; 1404 default: 1405 ALOGE("%s: Emulator doesn't support AE mode %d", 1406 __FUNCTION__, aeMode); 1407 return BAD_VALUE; 1408 } 1409 1410 e = settings.find(ANDROID_CONTROL_AE_LOCK); 1411 if (e.count == 0) { 1412 ALOGE("%s: No AE lock entry!", __FUNCTION__); 1413 return BAD_VALUE; 1414 } 1415 bool aeLocked = (e.data.u8[0] == ANDROID_CONTROL_AE_LOCK_ON); 1416 1417 e = settings.find(ANDROID_CONTROL_AE_PRECAPTURE_TRIGGER); 1418 bool precaptureTrigger = false; 1419 if (e.count != 0) { 1420 precaptureTrigger = 1421 (e.data.u8[0] == ANDROID_CONTROL_AE_PRECAPTURE_TRIGGER_START); 1422 } 1423 1424 if (precaptureTrigger) { 1425 ALOGV("%s: Pre capture trigger = %d", __FUNCTION__, precaptureTrigger); 1426 } else if (e.count > 0) { 1427 ALOGV("%s: Pre capture trigger was present? %zu", 1428 __FUNCTION__, 1429 e.count); 1430 } 1431 1432 // If we have an aePrecaptureTrigger, aePrecaptureId should be set too 1433 if (e.count != 0) { 1434 e = settings.find(ANDROID_CONTROL_AE_PRECAPTURE_ID); 1435 1436 if (e.count == 0) { 1437 ALOGE("%s: When android.control.aePrecaptureTrigger is set " 1438 " in the request, aePrecaptureId needs to be set as well", 1439 __FUNCTION__); 1440 return BAD_VALUE; 1441 } 1442 1443 mAeTriggerId = e.data.i32[0]; 1444 } 1445 1446 if (precaptureTrigger || mAeState == ANDROID_CONTROL_AE_STATE_PRECAPTURE) { 1447 // Run precapture sequence 1448 if (mAeState != ANDROID_CONTROL_AE_STATE_PRECAPTURE) { 1449 mAeCounter = 0; 1450 } 1451 1452 if (mFacePriority) { 1453 mAeTargetExposureTime = kFacePriorityExposureTime; 1454 } else { 1455 mAeTargetExposureTime = kNormalExposureTime; 1456 } 1457 1458 if (mAeCounter > kPrecaptureMinFrames && 1459 (mAeTargetExposureTime - mAeCurrentExposureTime) < 1460 mAeTargetExposureTime / 10) { 1461 // Done with precapture 1462 mAeCounter = 0; 1463 mAeState = aeLocked ? ANDROID_CONTROL_AE_STATE_LOCKED : 1464 ANDROID_CONTROL_AE_STATE_CONVERGED; 1465 } else { 1466 // Converge some more 1467 mAeCurrentExposureTime += 1468 (mAeTargetExposureTime - mAeCurrentExposureTime) * 1469 kExposureTrackRate; 1470 mAeCounter++; 1471 mAeState = ANDROID_CONTROL_AE_STATE_PRECAPTURE; 1472 } 1473 1474 } else if (!aeLocked) { 1475 // Run standard occasional AE scan 1476 switch (mAeState) { 1477 case ANDROID_CONTROL_AE_STATE_CONVERGED: 1478 case ANDROID_CONTROL_AE_STATE_INACTIVE: 1479 mAeCounter++; 1480 if (mAeCounter > kStableAeMaxFrames) { 1481 mAeTargetExposureTime = 1482 mFacePriority ? kFacePriorityExposureTime : 1483 kNormalExposureTime; 1484 float exposureStep = ((double)rand() / RAND_MAX) * 1485 (kExposureWanderMax - kExposureWanderMin) + 1486 kExposureWanderMin; 1487 mAeTargetExposureTime *= std::pow(2, exposureStep); 1488 mAeState = ANDROID_CONTROL_AE_STATE_SEARCHING; 1489 } 1490 break; 1491 case ANDROID_CONTROL_AE_STATE_SEARCHING: 1492 mAeCurrentExposureTime += 1493 (mAeTargetExposureTime - mAeCurrentExposureTime) * 1494 kExposureTrackRate; 1495 if (abs(mAeTargetExposureTime - mAeCurrentExposureTime) < 1496 mAeTargetExposureTime / 10) { 1497 // Close enough 1498 mAeState = ANDROID_CONTROL_AE_STATE_CONVERGED; 1499 mAeCounter = 0; 1500 } 1501 break; 1502 case ANDROID_CONTROL_AE_STATE_LOCKED: 1503 mAeState = ANDROID_CONTROL_AE_STATE_CONVERGED; 1504 mAeCounter = 0; 1505 break; 1506 default: 1507 ALOGE("%s: Emulator in unexpected AE state %d", 1508 __FUNCTION__, mAeState); 1509 return INVALID_OPERATION; 1510 } 1511 } else { 1512 // AE is locked 1513 mAeState = ANDROID_CONTROL_AE_STATE_LOCKED; 1514 } 1515 1516 return OK; 1517 } 1518 1519 status_t EmulatedFakeCamera3::doFakeAF(CameraMetadata &settings) { 1520 camera_metadata_entry e; 1521 1522 e = settings.find(ANDROID_CONTROL_AF_MODE); 1523 if (e.count == 0) { 1524 ALOGE("%s: No AF mode entry!", __FUNCTION__); 1525 return BAD_VALUE; 1526 } 1527 uint8_t afMode = e.data.u8[0]; 1528 1529 e = settings.find(ANDROID_CONTROL_AF_TRIGGER); 1530 typedef camera_metadata_enum_android_control_af_trigger af_trigger_t; 1531 af_trigger_t afTrigger; 1532 // If we have an afTrigger, afTriggerId should be set too 1533 if (e.count != 0) { 1534 afTrigger = static_cast<af_trigger_t>(e.data.u8[0]); 1535 1536 e = settings.find(ANDROID_CONTROL_AF_TRIGGER_ID); 1537 1538 if (e.count == 0) { 1539 ALOGE("%s: When android.control.afTrigger is set " 1540 " in the request, afTriggerId needs to be set as well", 1541 __FUNCTION__); 1542 return BAD_VALUE; 1543 } 1544 1545 mAfTriggerId = e.data.i32[0]; 1546 1547 ALOGV("%s: AF trigger set to 0x%x", __FUNCTION__, afTrigger); 1548 ALOGV("%s: AF trigger ID set to 0x%x", __FUNCTION__, mAfTriggerId); 1549 ALOGV("%s: AF mode is 0x%x", __FUNCTION__, afMode); 1550 } else { 1551 afTrigger = ANDROID_CONTROL_AF_TRIGGER_IDLE; 1552 } 1553 1554 switch (afMode) { 1555 case ANDROID_CONTROL_AF_MODE_OFF: 1556 mAfState = ANDROID_CONTROL_AF_STATE_INACTIVE; 1557 return OK; 1558 case ANDROID_CONTROL_AF_MODE_AUTO: 1559 case ANDROID_CONTROL_AF_MODE_MACRO: 1560 case ANDROID_CONTROL_AF_MODE_CONTINUOUS_VIDEO: 1561 case ANDROID_CONTROL_AF_MODE_CONTINUOUS_PICTURE: 1562 if (!mFacingBack) { 1563 ALOGE("%s: Front camera doesn't support AF mode %d", 1564 __FUNCTION__, afMode); 1565 return BAD_VALUE; 1566 } 1567 // OK, handle transitions lower on 1568 break; 1569 default: 1570 ALOGE("%s: Emulator doesn't support AF mode %d", 1571 __FUNCTION__, afMode); 1572 return BAD_VALUE; 1573 } 1574 1575 bool afModeChanged = mAfMode != afMode; 1576 mAfMode = afMode; 1577 1578 /** 1579 * Simulate AF triggers. Transition at most 1 state per frame. 1580 * - Focusing always succeeds (goes into locked, or PASSIVE_SCAN). 1581 */ 1582 1583 bool afTriggerStart = false; 1584 bool afTriggerCancel = false; 1585 switch (afTrigger) { 1586 case ANDROID_CONTROL_AF_TRIGGER_IDLE: 1587 break; 1588 case ANDROID_CONTROL_AF_TRIGGER_START: 1589 afTriggerStart = true; 1590 break; 1591 case ANDROID_CONTROL_AF_TRIGGER_CANCEL: 1592 afTriggerCancel = true; 1593 // Cancel trigger always transitions into INACTIVE 1594 mAfState = ANDROID_CONTROL_AF_STATE_INACTIVE; 1595 1596 ALOGV("%s: AF State transition to STATE_INACTIVE", __FUNCTION__); 1597 1598 // Stay in 'inactive' until at least next frame 1599 return OK; 1600 default: 1601 ALOGE("%s: Unknown af trigger value %d", __FUNCTION__, afTrigger); 1602 return BAD_VALUE; 1603 } 1604 1605 // If we get down here, we're either in an autofocus mode 1606 // or in a continuous focus mode (and no other modes) 1607 1608 int oldAfState = mAfState; 1609 switch (mAfState) { 1610 case ANDROID_CONTROL_AF_STATE_INACTIVE: 1611 if (afTriggerStart) { 1612 switch (afMode) { 1613 case ANDROID_CONTROL_AF_MODE_AUTO: 1614 // fall-through 1615 case ANDROID_CONTROL_AF_MODE_MACRO: 1616 mAfState = ANDROID_CONTROL_AF_STATE_ACTIVE_SCAN; 1617 break; 1618 case ANDROID_CONTROL_AF_MODE_CONTINUOUS_VIDEO: 1619 // fall-through 1620 case ANDROID_CONTROL_AF_MODE_CONTINUOUS_PICTURE: 1621 mAfState = ANDROID_CONTROL_AF_STATE_NOT_FOCUSED_LOCKED; 1622 break; 1623 } 1624 } else { 1625 // At least one frame stays in INACTIVE 1626 if (!afModeChanged) { 1627 switch (afMode) { 1628 case ANDROID_CONTROL_AF_MODE_CONTINUOUS_VIDEO: 1629 // fall-through 1630 case ANDROID_CONTROL_AF_MODE_CONTINUOUS_PICTURE: 1631 mAfState = ANDROID_CONTROL_AF_STATE_PASSIVE_SCAN; 1632 break; 1633 } 1634 } 1635 } 1636 break; 1637 case ANDROID_CONTROL_AF_STATE_PASSIVE_SCAN: 1638 /** 1639 * When the AF trigger is activated, the algorithm should finish 1640 * its PASSIVE_SCAN if active, and then transition into AF_FOCUSED 1641 * or AF_NOT_FOCUSED as appropriate 1642 */ 1643 if (afTriggerStart) { 1644 // Randomly transition to focused or not focused 1645 if (rand() % 3) { 1646 mAfState = ANDROID_CONTROL_AF_STATE_FOCUSED_LOCKED; 1647 } else { 1648 mAfState = ANDROID_CONTROL_AF_STATE_NOT_FOCUSED_LOCKED; 1649 } 1650 } 1651 /** 1652 * When the AF trigger is not involved, the AF algorithm should 1653 * start in INACTIVE state, and then transition into PASSIVE_SCAN 1654 * and PASSIVE_FOCUSED states 1655 */ 1656 else if (!afTriggerCancel) { 1657 // Randomly transition to passive focus 1658 if (rand() % 3 == 0) { 1659 mAfState = ANDROID_CONTROL_AF_STATE_PASSIVE_FOCUSED; 1660 } 1661 } 1662 1663 break; 1664 case ANDROID_CONTROL_AF_STATE_PASSIVE_FOCUSED: 1665 if (afTriggerStart) { 1666 // Randomly transition to focused or not focused 1667 if (rand() % 3) { 1668 mAfState = ANDROID_CONTROL_AF_STATE_FOCUSED_LOCKED; 1669 } else { 1670 mAfState = ANDROID_CONTROL_AF_STATE_NOT_FOCUSED_LOCKED; 1671 } 1672 } 1673 // TODO: initiate passive scan (PASSIVE_SCAN) 1674 break; 1675 case ANDROID_CONTROL_AF_STATE_ACTIVE_SCAN: 1676 // Simulate AF sweep completing instantaneously 1677 1678 // Randomly transition to focused or not focused 1679 if (rand() % 3) { 1680 mAfState = ANDROID_CONTROL_AF_STATE_FOCUSED_LOCKED; 1681 } else { 1682 mAfState = ANDROID_CONTROL_AF_STATE_NOT_FOCUSED_LOCKED; 1683 } 1684 break; 1685 case ANDROID_CONTROL_AF_STATE_FOCUSED_LOCKED: 1686 if (afTriggerStart) { 1687 switch (afMode) { 1688 case ANDROID_CONTROL_AF_MODE_AUTO: 1689 // fall-through 1690 case ANDROID_CONTROL_AF_MODE_MACRO: 1691 mAfState = ANDROID_CONTROL_AF_STATE_ACTIVE_SCAN; 1692 break; 1693 case ANDROID_CONTROL_AF_MODE_CONTINUOUS_VIDEO: 1694 // fall-through 1695 case ANDROID_CONTROL_AF_MODE_CONTINUOUS_PICTURE: 1696 // continuous autofocus => trigger start has no effect 1697 break; 1698 } 1699 } 1700 break; 1701 case ANDROID_CONTROL_AF_STATE_NOT_FOCUSED_LOCKED: 1702 if (afTriggerStart) { 1703 switch (afMode) { 1704 case ANDROID_CONTROL_AF_MODE_AUTO: 1705 // fall-through 1706 case ANDROID_CONTROL_AF_MODE_MACRO: 1707 mAfState = ANDROID_CONTROL_AF_STATE_ACTIVE_SCAN; 1708 break; 1709 case ANDROID_CONTROL_AF_MODE_CONTINUOUS_VIDEO: 1710 // fall-through 1711 case ANDROID_CONTROL_AF_MODE_CONTINUOUS_PICTURE: 1712 // continuous autofocus => trigger start has no effect 1713 break; 1714 } 1715 } 1716 break; 1717 default: 1718 ALOGE("%s: Bad af state %d", __FUNCTION__, mAfState); 1719 } 1720 1721 { 1722 char afStateString[100] = {0,}; 1723 camera_metadata_enum_snprint(ANDROID_CONTROL_AF_STATE, 1724 oldAfState, 1725 afStateString, 1726 sizeof(afStateString)); 1727 1728 char afNewStateString[100] = {0,}; 1729 camera_metadata_enum_snprint(ANDROID_CONTROL_AF_STATE, 1730 mAfState, 1731 afNewStateString, 1732 sizeof(afNewStateString)); 1733 ALOGVV("%s: AF state transitioned from %s to %s", 1734 __FUNCTION__, afStateString, afNewStateString); 1735 } 1736 1737 1738 return OK; 1739 } 1740 1741 status_t EmulatedFakeCamera3::doFakeAWB(CameraMetadata &settings) { 1742 camera_metadata_entry e; 1743 1744 e = settings.find(ANDROID_CONTROL_AWB_MODE); 1745 if (e.count == 0) { 1746 ALOGE("%s: No AWB mode entry!", __FUNCTION__); 1747 return BAD_VALUE; 1748 } 1749 uint8_t awbMode = e.data.u8[0]; 1750 1751 // TODO: Add white balance simulation 1752 1753 switch (awbMode) { 1754 case ANDROID_CONTROL_AWB_MODE_OFF: 1755 mAwbState = ANDROID_CONTROL_AWB_STATE_INACTIVE; 1756 return OK; 1757 case ANDROID_CONTROL_AWB_MODE_AUTO: 1758 case ANDROID_CONTROL_AWB_MODE_INCANDESCENT: 1759 case ANDROID_CONTROL_AWB_MODE_FLUORESCENT: 1760 case ANDROID_CONTROL_AWB_MODE_DAYLIGHT: 1761 case ANDROID_CONTROL_AWB_MODE_SHADE: 1762 // OK 1763 break; 1764 default: 1765 ALOGE("%s: Emulator doesn't support AWB mode %d", 1766 __FUNCTION__, awbMode); 1767 return BAD_VALUE; 1768 } 1769 1770 return OK; 1771 } 1772 1773 1774 void EmulatedFakeCamera3::update3A(CameraMetadata &settings) { 1775 if (mAeState != ANDROID_CONTROL_AE_STATE_INACTIVE) { 1776 settings.update(ANDROID_SENSOR_EXPOSURE_TIME, 1777 &mAeCurrentExposureTime, 1); 1778 settings.update(ANDROID_SENSOR_SENSITIVITY, 1779 &mAeCurrentSensitivity, 1); 1780 } 1781 1782 settings.update(ANDROID_CONTROL_AE_STATE, 1783 &mAeState, 1); 1784 settings.update(ANDROID_CONTROL_AF_STATE, 1785 &mAfState, 1); 1786 settings.update(ANDROID_CONTROL_AWB_STATE, 1787 &mAwbState, 1); 1788 /** 1789 * TODO: Trigger IDs need a think-through 1790 */ 1791 settings.update(ANDROID_CONTROL_AE_PRECAPTURE_ID, 1792 &mAeTriggerId, 1); 1793 settings.update(ANDROID_CONTROL_AF_TRIGGER_ID, 1794 &mAfTriggerId, 1); 1795 } 1796 1797 void EmulatedFakeCamera3::signalReadoutIdle() { 1798 Mutex::Autolock l(mLock); 1799 // Need to chek isIdle again because waiting on mLock may have allowed 1800 // something to be placed in the in-flight queue. 1801 if (mStatus == STATUS_ACTIVE && mReadoutThread->isIdle()) { 1802 ALOGV("Now idle"); 1803 mStatus = STATUS_READY; 1804 } 1805 } 1806 1807 void EmulatedFakeCamera3::onSensorEvent(uint32_t frameNumber, Event e, 1808 nsecs_t timestamp) { 1809 switch(e) { 1810 case Sensor::SensorListener::EXPOSURE_START: { 1811 ALOGVV("%s: Frame %d: Sensor started exposure at %lld", 1812 __FUNCTION__, frameNumber, timestamp); 1813 // Trigger shutter notify to framework 1814 camera3_notify_msg_t msg; 1815 msg.type = CAMERA3_MSG_SHUTTER; 1816 msg.message.shutter.frame_number = frameNumber; 1817 msg.message.shutter.timestamp = timestamp; 1818 sendNotify(&msg); 1819 break; 1820 } 1821 default: 1822 ALOGW("%s: Unexpected sensor event %d at %" PRId64, __FUNCTION__, 1823 e, timestamp); 1824 break; 1825 } 1826 } 1827 1828 EmulatedFakeCamera3::ReadoutThread::ReadoutThread(EmulatedFakeCamera3 *parent) : 1829 mParent(parent), mJpegWaiting(false) { 1830 } 1831 1832 EmulatedFakeCamera3::ReadoutThread::~ReadoutThread() { 1833 for (List<Request>::iterator i = mInFlightQueue.begin(); 1834 i != mInFlightQueue.end(); i++) { 1835 delete i->buffers; 1836 delete i->sensorBuffers; 1837 } 1838 } 1839 1840 void EmulatedFakeCamera3::ReadoutThread::queueCaptureRequest(const Request &r) { 1841 Mutex::Autolock l(mLock); 1842 1843 mInFlightQueue.push_back(r); 1844 mInFlightSignal.signal(); 1845 } 1846 1847 bool EmulatedFakeCamera3::ReadoutThread::isIdle() { 1848 Mutex::Autolock l(mLock); 1849 return mInFlightQueue.empty() && !mThreadActive; 1850 } 1851 1852 status_t EmulatedFakeCamera3::ReadoutThread::waitForReadout() { 1853 status_t res; 1854 Mutex::Autolock l(mLock); 1855 int loopCount = 0; 1856 while (mInFlightQueue.size() >= kMaxQueueSize) { 1857 res = mInFlightSignal.waitRelative(mLock, kWaitPerLoop); 1858 if (res != OK && res != TIMED_OUT) { 1859 ALOGE("%s: Error waiting for in-flight queue to shrink", 1860 __FUNCTION__); 1861 return INVALID_OPERATION; 1862 } 1863 if (loopCount == kMaxWaitLoops) { 1864 ALOGE("%s: Timed out waiting for in-flight queue to shrink", 1865 __FUNCTION__); 1866 return TIMED_OUT; 1867 } 1868 loopCount++; 1869 } 1870 return OK; 1871 } 1872 1873 bool EmulatedFakeCamera3::ReadoutThread::threadLoop() { 1874 status_t res; 1875 1876 ALOGVV("%s: ReadoutThread waiting for request", __FUNCTION__); 1877 1878 // First wait for a request from the in-flight queue 1879 1880 if (mCurrentRequest.settings.isEmpty()) { 1881 Mutex::Autolock l(mLock); 1882 if (mInFlightQueue.empty()) { 1883 res = mInFlightSignal.waitRelative(mLock, kWaitPerLoop); 1884 if (res == TIMED_OUT) { 1885 ALOGVV("%s: ReadoutThread: Timed out waiting for request", 1886 __FUNCTION__); 1887 return true; 1888 } else if (res != NO_ERROR) { 1889 ALOGE("%s: Error waiting for capture requests: %d", 1890 __FUNCTION__, res); 1891 return false; 1892 } 1893 } 1894 mCurrentRequest.frameNumber = mInFlightQueue.begin()->frameNumber; 1895 mCurrentRequest.settings.acquire(mInFlightQueue.begin()->settings); 1896 mCurrentRequest.buffers = mInFlightQueue.begin()->buffers; 1897 mCurrentRequest.sensorBuffers = mInFlightQueue.begin()->sensorBuffers; 1898 mInFlightQueue.erase(mInFlightQueue.begin()); 1899 mInFlightSignal.signal(); 1900 mThreadActive = true; 1901 ALOGVV("%s: Beginning readout of frame %d", __FUNCTION__, 1902 mCurrentRequest.frameNumber); 1903 } 1904 1905 // Then wait for it to be delivered from the sensor 1906 ALOGVV("%s: ReadoutThread: Wait for frame to be delivered from sensor", 1907 __FUNCTION__); 1908 1909 nsecs_t captureTime; 1910 bool gotFrame = 1911 mParent->mSensor->waitForNewFrame(kWaitPerLoop, &captureTime); 1912 if (!gotFrame) { 1913 ALOGVV("%s: ReadoutThread: Timed out waiting for sensor frame", 1914 __FUNCTION__); 1915 return true; 1916 } 1917 1918 ALOGVV("Sensor done with readout for frame %d, captured at %lld ", 1919 mCurrentRequest.frameNumber, captureTime); 1920 1921 // Check if we need to JPEG encode a buffer, and send it for async 1922 // compression if so. Otherwise prepare the buffer for return. 1923 bool needJpeg = false; 1924 HalBufferVector::iterator buf = mCurrentRequest.buffers->begin(); 1925 while(buf != mCurrentRequest.buffers->end()) { 1926 bool goodBuffer = true; 1927 if ( buf->stream->format == 1928 HAL_PIXEL_FORMAT_BLOB) { 1929 Mutex::Autolock jl(mJpegLock); 1930 if (mJpegWaiting) { 1931 // This shouldn't happen, because processCaptureRequest should 1932 // be stalling until JPEG compressor is free. 1933 ALOGE("%s: Already processing a JPEG!", __FUNCTION__); 1934 goodBuffer = false; 1935 } 1936 if (goodBuffer) { 1937 // Compressor takes ownership of sensorBuffers here 1938 res = mParent->mJpegCompressor->start(mCurrentRequest.sensorBuffers, 1939 this); 1940 goodBuffer = (res == OK); 1941 } 1942 if (goodBuffer) { 1943 needJpeg = true; 1944 1945 mJpegHalBuffer = *buf; 1946 mJpegFrameNumber = mCurrentRequest.frameNumber; 1947 mJpegWaiting = true; 1948 1949 mCurrentRequest.sensorBuffers = NULL; 1950 buf = mCurrentRequest.buffers->erase(buf); 1951 1952 continue; 1953 } 1954 ALOGE("%s: Error compressing output buffer: %s (%d)", 1955 __FUNCTION__, strerror(-res), res); 1956 // fallthrough for cleanup 1957 } 1958 GraphicBufferMapper::get().unlock(*(buf->buffer)); 1959 1960 buf->status = goodBuffer ? CAMERA3_BUFFER_STATUS_OK : 1961 CAMERA3_BUFFER_STATUS_ERROR; 1962 buf->acquire_fence = -1; 1963 buf->release_fence = -1; 1964 1965 ++buf; 1966 } // end while 1967 1968 // Construct result for all completed buffers and results 1969 1970 camera3_capture_result result; 1971 1972 mCurrentRequest.settings.update(ANDROID_SENSOR_TIMESTAMP, 1973 &captureTime, 1); 1974 1975 result.frame_number = mCurrentRequest.frameNumber; 1976 result.result = mCurrentRequest.settings.getAndLock(); 1977 result.num_output_buffers = mCurrentRequest.buffers->size(); 1978 result.output_buffers = mCurrentRequest.buffers->array(); 1979 1980 // Go idle if queue is empty, before sending result 1981 bool signalIdle = false; 1982 { 1983 Mutex::Autolock l(mLock); 1984 if (mInFlightQueue.empty()) { 1985 mThreadActive = false; 1986 signalIdle = true; 1987 } 1988 } 1989 if (signalIdle) mParent->signalReadoutIdle(); 1990 1991 // Send it off to the framework 1992 ALOGVV("%s: ReadoutThread: Send result to framework", 1993 __FUNCTION__); 1994 mParent->sendCaptureResult(&result); 1995 1996 // Clean up 1997 mCurrentRequest.settings.unlock(result.result); 1998 1999 delete mCurrentRequest.buffers; 2000 mCurrentRequest.buffers = NULL; 2001 if (!needJpeg) { 2002 delete mCurrentRequest.sensorBuffers; 2003 mCurrentRequest.sensorBuffers = NULL; 2004 } 2005 mCurrentRequest.settings.clear(); 2006 2007 return true; 2008 } 2009 2010 void EmulatedFakeCamera3::ReadoutThread::onJpegDone( 2011 const StreamBuffer &jpegBuffer, bool success) { 2012 Mutex::Autolock jl(mJpegLock); 2013 2014 GraphicBufferMapper::get().unlock(*(jpegBuffer.buffer)); 2015 2016 mJpegHalBuffer.status = success ? 2017 CAMERA3_BUFFER_STATUS_OK : CAMERA3_BUFFER_STATUS_ERROR; 2018 mJpegHalBuffer.acquire_fence = -1; 2019 mJpegHalBuffer.release_fence = -1; 2020 mJpegWaiting = false; 2021 2022 camera3_capture_result result; 2023 result.frame_number = mJpegFrameNumber; 2024 result.result = NULL; 2025 result.num_output_buffers = 1; 2026 result.output_buffers = &mJpegHalBuffer; 2027 2028 if (!success) { 2029 ALOGE("%s: Compression failure, returning error state buffer to" 2030 " framework", __FUNCTION__); 2031 } else { 2032 ALOGV("%s: Compression complete, returning buffer to framework", 2033 __FUNCTION__); 2034 } 2035 2036 mParent->sendCaptureResult(&result); 2037 } 2038 2039 void EmulatedFakeCamera3::ReadoutThread::onJpegInputDone( 2040 const StreamBuffer &inputBuffer) { 2041 // Should never get here, since the input buffer has to be returned 2042 // by end of processCaptureRequest 2043 ALOGE("%s: Unexpected input buffer from JPEG compressor!", __FUNCTION__); 2044 } 2045 2046 2047 }; // namespace android 2048