CaptureSequencer.cpp revision d5087f91357a9218580596b466926ab750bc8ea7
1/* 2 * Copyright (C) 2012 The Android Open Source Project 3 * 4 * Licensed under the Apache License, Version 2.0 (the "License"); 5 * you may not use this file except in compliance with the License. 6 * You may obtain a copy of the License at 7 * 8 * http://www.apache.org/licenses/LICENSE-2.0 9 * 10 * Unless required by applicable law or agreed to in writing, software 11 * distributed under the License is distributed on an "AS IS" BASIS, 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 * See the License for the specific language governing permissions and 14 * limitations under the License. 15 */ 16 17#define LOG_TAG "Camera2-CaptureSequencer" 18#define ATRACE_TAG ATRACE_TAG_CAMERA 19//#define LOG_NDEBUG 0 20 21#include <utils/Log.h> 22#include <utils/Trace.h> 23#include <utils/Vector.h> 24 25#include "CaptureSequencer.h" 26#include "BurstCapture.h" 27#include "../Camera2Device.h" 28#include "../Camera2Client.h" 29#include "Parameters.h" 30 31namespace android { 32namespace camera2 { 33 34/** Public members */ 35 36CaptureSequencer::CaptureSequencer(wp<Camera2Client> client): 37 Thread(false), 38 mStartCapture(false), 39 mBusy(false), 40 mNewAEState(false), 41 mNewFrameReceived(false), 42 mNewCaptureReceived(false), 43 mClient(client), 44 mCaptureState(IDLE), 45 mTriggerId(0), 46 mTimeoutCount(0), 47 mCaptureId(Camera2Client::kCaptureRequestIdStart) { 48 ALOGV("%s", __FUNCTION__); 49} 50 51CaptureSequencer::~CaptureSequencer() { 52 ALOGV("%s: Exit", __FUNCTION__); 53} 54 55void CaptureSequencer::setZslProcessor(wp<ZslProcessor> processor) { 56 Mutex::Autolock l(mInputMutex); 57 mZslProcessor = processor; 58} 59 60status_t CaptureSequencer::startCapture() { 61 ALOGV("%s", __FUNCTION__); 62 ATRACE_CALL(); 63 Mutex::Autolock l(mInputMutex); 64 if (mBusy) { 65 ALOGE("%s: Already busy capturing!", __FUNCTION__); 66 return INVALID_OPERATION; 67 } 68 if (!mStartCapture) { 69 mStartCapture = true; 70 mStartCaptureSignal.signal(); 71 } 72 return OK; 73} 74 75status_t CaptureSequencer::waitUntilIdle(nsecs_t timeout) { 76 ATRACE_CALL(); 77 ALOGV("%s: Waiting for idle", __FUNCTION__); 78 Mutex::Autolock l(mStateMutex); 79 status_t res = -1; 80 while (mCaptureState != IDLE) { 81 nsecs_t startTime = systemTime(); 82 83 res = mStateChanged.waitRelative(mStateMutex, timeout); 84 if (res != OK) return res; 85 86 timeout -= (systemTime() - startTime); 87 } 88 ALOGV("%s: Now idle", __FUNCTION__); 89 return OK; 90} 91 92void CaptureSequencer::notifyAutoExposure(uint8_t newState, int triggerId) { 93 ATRACE_CALL(); 94 Mutex::Autolock l(mInputMutex); 95 mAEState = newState; 96 mAETriggerId = triggerId; 97 if (!mNewAEState) { 98 mNewAEState = true; 99 mNewNotifySignal.signal(); 100 } 101} 102 103void CaptureSequencer::onFrameAvailable(int32_t frameId, 104 const CameraMetadata &frame) { 105 ALOGV("%s: Listener found new frame", __FUNCTION__); 106 ATRACE_CALL(); 107 Mutex::Autolock l(mInputMutex); 108 mNewFrameId = frameId; 109 mNewFrame = frame; 110 if (!mNewFrameReceived) { 111 mNewFrameReceived = true; 112 mNewFrameSignal.signal(); 113 } 114} 115 116void CaptureSequencer::onCaptureAvailable(nsecs_t timestamp, 117 sp<MemoryBase> captureBuffer) { 118 ATRACE_CALL(); 119 ALOGV("%s", __FUNCTION__); 120 Mutex::Autolock l(mInputMutex); 121 mCaptureTimestamp = timestamp; 122 mCaptureBuffer = captureBuffer; 123 if (!mNewCaptureReceived) { 124 mNewCaptureReceived = true; 125 mNewCaptureSignal.signal(); 126 } 127} 128 129 130void CaptureSequencer::dump(int fd, const Vector<String16>& args) { 131 String8 result; 132 if (mCaptureRequest.entryCount() != 0) { 133 result = " Capture request:\n"; 134 write(fd, result.string(), result.size()); 135 mCaptureRequest.dump(fd, 2, 6); 136 } else { 137 result = " Capture request: undefined\n"; 138 write(fd, result.string(), result.size()); 139 } 140 result = String8::format(" Current capture state: %s\n", 141 kStateNames[mCaptureState]); 142 result.append(" Latest captured frame:\n"); 143 write(fd, result.string(), result.size()); 144 mNewFrame.dump(fd, 2, 6); 145} 146 147/** Private members */ 148 149const char* CaptureSequencer::kStateNames[CaptureSequencer::NUM_CAPTURE_STATES+1] = 150{ 151 "IDLE", 152 "START", 153 "ZSL_START", 154 "ZSL_WAITING", 155 "ZSL_REPROCESSING", 156 "STANDARD_START", 157 "STANDARD_PRECAPTURE_WAIT", 158 "STANDARD_CAPTURE", 159 "STANDARD_CAPTURE_WAIT", 160 "BURST_CAPTURE_START", 161 "BURST_CAPTURE_WAIT", 162 "DONE", 163 "ERROR", 164 "UNKNOWN" 165}; 166 167const CaptureSequencer::StateManager 168 CaptureSequencer::kStateManagers[CaptureSequencer::NUM_CAPTURE_STATES-1] = { 169 &CaptureSequencer::manageIdle, 170 &CaptureSequencer::manageStart, 171 &CaptureSequencer::manageZslStart, 172 &CaptureSequencer::manageZslWaiting, 173 &CaptureSequencer::manageZslReprocessing, 174 &CaptureSequencer::manageStandardStart, 175 &CaptureSequencer::manageStandardPrecaptureWait, 176 &CaptureSequencer::manageStandardCapture, 177 &CaptureSequencer::manageStandardCaptureWait, 178 &CaptureSequencer::manageBurstCaptureStart, 179 &CaptureSequencer::manageBurstCaptureWait, 180 &CaptureSequencer::manageDone, 181}; 182 183bool CaptureSequencer::threadLoop() { 184 status_t res; 185 186 sp<Camera2Client> client = mClient.promote(); 187 if (client == 0) return false; 188 189 CaptureState currentState; 190 { 191 Mutex::Autolock l(mStateMutex); 192 currentState = mCaptureState; 193 } 194 195 currentState = (this->*kStateManagers[currentState])(client); 196 197 Mutex::Autolock l(mStateMutex); 198 if (currentState != mCaptureState) { 199 mCaptureState = currentState; 200 ATRACE_INT("cam2_capt_state", mCaptureState); 201 ALOGV("Camera %d: New capture state %s", 202 client->getCameraId(), kStateNames[mCaptureState]); 203 mStateChanged.signal(); 204 } 205 206 if (mCaptureState == ERROR) { 207 ALOGE("Camera %d: Stopping capture sequencer due to error", 208 client->getCameraId()); 209 return false; 210 } 211 212 return true; 213} 214 215CaptureSequencer::CaptureState CaptureSequencer::manageIdle(sp<Camera2Client> &client) { 216 status_t res; 217 Mutex::Autolock l(mInputMutex); 218 while (!mStartCapture) { 219 res = mStartCaptureSignal.waitRelative(mInputMutex, 220 kWaitDuration); 221 if (res == TIMED_OUT) break; 222 } 223 if (mStartCapture) { 224 mStartCapture = false; 225 mBusy = true; 226 return START; 227 } 228 return IDLE; 229} 230 231CaptureSequencer::CaptureState CaptureSequencer::manageDone(sp<Camera2Client> &client) { 232 status_t res = OK; 233 ATRACE_CALL(); 234 mCaptureId++; 235 if (mCaptureId >= Camera2Client::kCaptureRequestIdEnd) { 236 mCaptureId = Camera2Client::kCaptureRequestIdStart; 237 } 238 { 239 Mutex::Autolock l(mInputMutex); 240 mBusy = false; 241 } 242 243 { 244 SharedParameters::Lock l(client->getParameters()); 245 switch (l.mParameters.state) { 246 case Parameters::DISCONNECTED: 247 ALOGW("%s: Camera %d: Discarding image data during shutdown ", 248 __FUNCTION__, client->getCameraId()); 249 res = INVALID_OPERATION; 250 break; 251 case Parameters::STILL_CAPTURE: 252 l.mParameters.state = Parameters::STOPPED; 253 break; 254 case Parameters::VIDEO_SNAPSHOT: 255 l.mParameters.state = Parameters::RECORD; 256 break; 257 default: 258 ALOGE("%s: Camera %d: Still image produced unexpectedly " 259 "in state %s!", 260 __FUNCTION__, client->getCameraId(), 261 Parameters::getStateName(l.mParameters.state)); 262 res = INVALID_OPERATION; 263 } 264 } 265 sp<ZslProcessor> processor = mZslProcessor.promote(); 266 if (processor != 0) { 267 processor->clearZslQueue(); 268 } 269 270 if (mCaptureBuffer != 0 && res == OK) { 271 Camera2Client::SharedCameraClient::Lock l(client->mSharedCameraClient); 272 ALOGV("%s: Sending still image to client", __FUNCTION__); 273 if (l.mCameraClient != 0) { 274 l.mCameraClient->dataCallback(CAMERA_MSG_COMPRESSED_IMAGE, 275 mCaptureBuffer, NULL); 276 } else { 277 ALOGV("%s: No client!", __FUNCTION__); 278 } 279 } 280 mCaptureBuffer.clear(); 281 282 return IDLE; 283} 284 285CaptureSequencer::CaptureState CaptureSequencer::manageStart( 286 sp<Camera2Client> &client) { 287 ALOGV("%s", __FUNCTION__); 288 status_t res; 289 ATRACE_CALL(); 290 SharedParameters::Lock l(client->getParameters()); 291 CaptureState nextState = DONE; 292 293 res = updateCaptureRequest(l.mParameters, client); 294 if (res != OK ) { 295 ALOGE("%s: Camera %d: Can't update still image capture request: %s (%d)", 296 __FUNCTION__, client->getCameraId(), strerror(-res), res); 297 return DONE; 298 } 299 300 if(l.mParameters.lightFx != Parameters::LIGHTFX_NONE && 301 l.mParameters.state == Parameters::STILL_CAPTURE) { 302 nextState = BURST_CAPTURE_START; 303 } 304 else if (l.mParameters.zslMode && 305 l.mParameters.state == Parameters::STILL_CAPTURE && 306 l.mParameters.flashMode != Parameters::FLASH_MODE_ON) { 307 nextState = ZSL_START; 308 } else { 309 nextState = STANDARD_START; 310 } 311 312 return nextState; 313} 314 315CaptureSequencer::CaptureState CaptureSequencer::manageZslStart( 316 sp<Camera2Client> &client) { 317 ALOGV("%s", __FUNCTION__); 318 status_t res; 319 sp<ZslProcessor> processor = mZslProcessor.promote(); 320 if (processor == 0) { 321 ALOGE("%s: No ZSL queue to use!", __FUNCTION__); 322 return DONE; 323 } 324 325 client->registerFrameListener(mCaptureId, mCaptureId + 1, 326 this); 327 328 // TODO: Actually select the right thing here. 329 res = processor->pushToReprocess(mCaptureId); 330 if (res != OK) { 331 if (res == NOT_ENOUGH_DATA) { 332 ALOGV("%s: Camera %d: ZSL queue doesn't have good frame, " 333 "falling back to normal capture", __FUNCTION__, 334 client->getCameraId()); 335 } else { 336 ALOGE("%s: Camera %d: Error in ZSL queue: %s (%d)", 337 __FUNCTION__, client->getCameraId(), strerror(-res), res); 338 } 339 return STANDARD_START; 340 } 341 342 SharedParameters::Lock l(client->getParameters()); 343 /* warning: this also locks a SharedCameraClient */ 344 shutterNotifyLocked(l.mParameters, client); 345 346 mTimeoutCount = kMaxTimeoutsForCaptureEnd; 347 return STANDARD_CAPTURE_WAIT; 348} 349 350CaptureSequencer::CaptureState CaptureSequencer::manageZslWaiting( 351 sp<Camera2Client> &client) { 352 ALOGV("%s", __FUNCTION__); 353 return DONE; 354} 355 356CaptureSequencer::CaptureState CaptureSequencer::manageZslReprocessing( 357 sp<Camera2Client> &client) { 358 ALOGV("%s", __FUNCTION__); 359 return START; 360} 361 362CaptureSequencer::CaptureState CaptureSequencer::manageStandardStart( 363 sp<Camera2Client> &client) { 364 ATRACE_CALL(); 365 client->registerFrameListener(mCaptureId, mCaptureId + 1, 366 this); 367 { 368 SharedParameters::Lock l(client->getParameters()); 369 mTriggerId = l.mParameters.precaptureTriggerCounter++; 370 } 371 client->getCameraDevice()->triggerPrecaptureMetering(mTriggerId); 372 373 mAeInPrecapture = false; 374 mTimeoutCount = kMaxTimeoutsForPrecaptureStart; 375 return STANDARD_PRECAPTURE_WAIT; 376} 377 378CaptureSequencer::CaptureState CaptureSequencer::manageStandardPrecaptureWait( 379 sp<Camera2Client> &client) { 380 status_t res; 381 ATRACE_CALL(); 382 Mutex::Autolock l(mInputMutex); 383 while (!mNewAEState) { 384 res = mNewNotifySignal.waitRelative(mInputMutex, kWaitDuration); 385 if (res == TIMED_OUT) { 386 mTimeoutCount--; 387 break; 388 } 389 } 390 if (mTimeoutCount <= 0) { 391 ALOGW("Timed out waiting for precapture %s", 392 mAeInPrecapture ? "end" : "start"); 393 return STANDARD_CAPTURE; 394 } 395 if (mNewAEState) { 396 if (!mAeInPrecapture) { 397 // Waiting to see PRECAPTURE state 398 if (mAETriggerId == mTriggerId && 399 mAEState == ANDROID_CONTROL_AE_STATE_PRECAPTURE) { 400 ALOGV("%s: Got precapture start", __FUNCTION__); 401 mAeInPrecapture = true; 402 mTimeoutCount = kMaxTimeoutsForPrecaptureEnd; 403 } 404 } else { 405 // Waiting to see PRECAPTURE state end 406 if (mAETriggerId == mTriggerId && 407 mAEState != ANDROID_CONTROL_AE_STATE_PRECAPTURE) { 408 ALOGV("%s: Got precapture end", __FUNCTION__); 409 return STANDARD_CAPTURE; 410 } 411 } 412 mNewAEState = false; 413 } 414 return STANDARD_PRECAPTURE_WAIT; 415} 416 417CaptureSequencer::CaptureState CaptureSequencer::manageStandardCapture( 418 sp<Camera2Client> &client) { 419 status_t res; 420 ATRACE_CALL(); 421 SharedParameters::Lock l(client->getParameters()); 422 Vector<uint8_t> outputStreams; 423 424 outputStreams.push(client->getPreviewStreamId()); 425 outputStreams.push(client->getCaptureStreamId()); 426 427 if (l.mParameters.previewCallbackFlags & 428 CAMERA_FRAME_CALLBACK_FLAG_ENABLE_MASK) { 429 outputStreams.push(client->getCallbackStreamId()); 430 } 431 432 if (l.mParameters.state == Parameters::VIDEO_SNAPSHOT) { 433 outputStreams.push(client->getRecordingStreamId()); 434 } 435 436 res = mCaptureRequest.update(ANDROID_REQUEST_OUTPUT_STREAMS, 437 outputStreams); 438 if (res == OK) { 439 res = mCaptureRequest.update(ANDROID_REQUEST_ID, 440 &mCaptureId, 1); 441 } 442 if (res == OK) { 443 res = mCaptureRequest.sort(); 444 } 445 446 if (res != OK) { 447 ALOGE("%s: Camera %d: Unable to set up still capture request: %s (%d)", 448 __FUNCTION__, client->getCameraId(), strerror(-res), res); 449 return DONE; 450 } 451 452 CameraMetadata captureCopy = mCaptureRequest; 453 if (captureCopy.entryCount() == 0) { 454 ALOGE("%s: Camera %d: Unable to copy capture request for HAL device", 455 __FUNCTION__, client->getCameraId()); 456 return DONE; 457 } 458 459 if (l.mParameters.state == Parameters::STILL_CAPTURE) { 460 res = client->stopStream(); 461 if (res != OK) { 462 ALOGE("%s: Camera %d: Unable to stop preview for still capture: " 463 "%s (%d)", 464 __FUNCTION__, client->getCameraId(), strerror(-res), res); 465 return DONE; 466 } 467 } 468 // TODO: Capture should be atomic with setStreamingRequest here 469 res = client->getCameraDevice()->capture(captureCopy); 470 if (res != OK) { 471 ALOGE("%s: Camera %d: Unable to submit still image capture request: " 472 "%s (%d)", 473 __FUNCTION__, client->getCameraId(), strerror(-res), res); 474 return DONE; 475 } 476 477 /* warning: this also locks a SharedCameraClient */ 478 shutterNotifyLocked(l.mParameters, client); 479 480 mTimeoutCount = kMaxTimeoutsForCaptureEnd; 481 return STANDARD_CAPTURE_WAIT; 482} 483 484CaptureSequencer::CaptureState CaptureSequencer::manageStandardCaptureWait( 485 sp<Camera2Client> &client) { 486 status_t res; 487 ATRACE_CALL(); 488 Mutex::Autolock l(mInputMutex); 489 while (!mNewFrameReceived) { 490 res = mNewFrameSignal.waitRelative(mInputMutex, kWaitDuration); 491 if (res == TIMED_OUT) { 492 mTimeoutCount--; 493 break; 494 } 495 } 496 while (!mNewCaptureReceived) { 497 res = mNewCaptureSignal.waitRelative(mInputMutex, kWaitDuration); 498 if (res == TIMED_OUT) { 499 mTimeoutCount--; 500 break; 501 } 502 } 503 if (mTimeoutCount <= 0) { 504 ALOGW("Timed out waiting for capture to complete"); 505 return DONE; 506 } 507 if (mNewFrameReceived && mNewCaptureReceived) { 508 if (mNewFrameId != mCaptureId) { 509 ALOGW("Mismatched capture frame IDs: Expected %d, got %d", 510 mCaptureId, mNewFrameId); 511 } 512 camera_metadata_entry_t entry; 513 entry = mNewFrame.find(ANDROID_SENSOR_TIMESTAMP); 514 if (entry.count == 0) { 515 ALOGE("No timestamp field in capture frame!"); 516 } 517 if (entry.data.i64[0] != mCaptureTimestamp) { 518 ALOGW("Mismatched capture timestamps: Metadata frame %lld," 519 " captured buffer %lld", entry.data.i64[0], mCaptureTimestamp); 520 } 521 client->removeFrameListener(mCaptureId, mCaptureId + 1, this); 522 523 mNewFrameReceived = false; 524 mNewCaptureReceived = false; 525 return DONE; 526 } 527 return STANDARD_CAPTURE_WAIT; 528} 529 530CaptureSequencer::CaptureState CaptureSequencer::manageBurstCaptureStart( 531 sp<Camera2Client> &client) { 532 ALOGV("%s", __FUNCTION__); 533 status_t res; 534 ATRACE_CALL(); 535 536 // check which burst mode is set, create respective burst object 537 { 538 SharedParameters::Lock l(client->getParameters()); 539 540 res = updateCaptureRequest(l.mParameters, client); 541 if(res != OK) { 542 return DONE; 543 } 544 545 // 546 // check for burst mode type in mParameters here 547 // 548 mBurstCapture = new BurstCapture(client, this); 549 } 550 551 res = mCaptureRequest.update(ANDROID_REQUEST_ID, &mCaptureId, 1); 552 if (res == OK) { 553 res = mCaptureRequest.sort(); 554 } 555 if (res != OK) { 556 ALOGE("%s: Camera %d: Unable to set up still capture request: %s (%d)", 557 __FUNCTION__, client->getCameraId(), strerror(-res), res); 558 return DONE; 559 } 560 561 CameraMetadata captureCopy = mCaptureRequest; 562 if (captureCopy.entryCount() == 0) { 563 ALOGE("%s: Camera %d: Unable to copy capture request for HAL device", 564 __FUNCTION__, client->getCameraId()); 565 return DONE; 566 } 567 568 Vector<CameraMetadata> requests; 569 requests.push(mCaptureRequest); 570 res = mBurstCapture->start(requests, mCaptureId); 571 mTimeoutCount = kMaxTimeoutsForCaptureEnd * 10; 572 return BURST_CAPTURE_WAIT; 573} 574 575CaptureSequencer::CaptureState CaptureSequencer::manageBurstCaptureWait( 576 sp<Camera2Client> &client) { 577 status_t res; 578 ATRACE_CALL(); 579 580 while (!mNewCaptureReceived) { 581 res = mNewCaptureSignal.waitRelative(mInputMutex, kWaitDuration); 582 if (res == TIMED_OUT) { 583 mTimeoutCount--; 584 break; 585 } 586 } 587 588 if (mTimeoutCount <= 0) { 589 ALOGW("Timed out waiting for burst capture to complete"); 590 return DONE; 591 } 592 if (mNewCaptureReceived) { 593 mNewCaptureReceived = false; 594 // TODO: update mCaptureId to last burst's capture ID + 1? 595 return DONE; 596 } 597 598 return BURST_CAPTURE_WAIT; 599} 600 601status_t CaptureSequencer::updateCaptureRequest(const Parameters ¶ms, 602 sp<Camera2Client> &client) { 603 ATRACE_CALL(); 604 status_t res; 605 if (mCaptureRequest.entryCount() == 0) { 606 res = client->getCameraDevice()->createDefaultRequest( 607 CAMERA2_TEMPLATE_STILL_CAPTURE, 608 &mCaptureRequest); 609 if (res != OK) { 610 ALOGE("%s: Camera %d: Unable to create default still image request:" 611 " %s (%d)", __FUNCTION__, client->getCameraId(), 612 strerror(-res), res); 613 return res; 614 } 615 } 616 617 res = params.updateRequest(&mCaptureRequest); 618 if (res != OK) { 619 ALOGE("%s: Camera %d: Unable to update common entries of capture " 620 "request: %s (%d)", __FUNCTION__, client->getCameraId(), 621 strerror(-res), res); 622 return res; 623 } 624 625 res = params.updateRequestJpeg(&mCaptureRequest); 626 if (res != OK) { 627 ALOGE("%s: Camera %d: Unable to update JPEG entries of capture " 628 "request: %s (%d)", __FUNCTION__, client->getCameraId(), 629 strerror(-res), res); 630 return res; 631 } 632 633 return OK; 634} 635 636/*static*/ void CaptureSequencer::shutterNotifyLocked(const Parameters ¶ms, 637 sp<Camera2Client> client) { 638 ATRACE_CALL(); 639 640 if (params.state == Parameters::STILL_CAPTURE && params.playShutterSound) { 641 client->getCameraService()->playSound(CameraService::SOUND_SHUTTER); 642 } 643 644 { 645 Camera2Client::SharedCameraClient::Lock l(client->mSharedCameraClient); 646 647 ALOGV("%s: Notifying of shutter close to client", __FUNCTION__); 648 if (l.mCameraClient != 0) { 649 // ShutterCallback 650 l.mCameraClient->notifyCallback(CAMERA_MSG_SHUTTER, 651 /*ext1*/0, /*ext2*/0); 652 653 // RawCallback with null buffer 654 l.mCameraClient->notifyCallback(CAMERA_MSG_RAW_IMAGE_NOTIFY, 655 /*ext1*/0, /*ext2*/0); 656 } else { 657 ALOGV("%s: No client!", __FUNCTION__); 658 } 659 } 660} 661 662 663}; // namespace camera2 664}; // namespace android 665