camera3_stream* Camera3Stream::startConfiguration() { ATRACE_CALL(); Mutex::Autolock l(mLock); status_t res; switch (mState) { case STATE_ERROR: ALOGE("%s: In error state", __FUNCTION__); return NULL; case STATE_CONSTRUCTED: // OK break; case STATE_IN_CONFIG: case STATE_IN_RECONFIG: // Can start config again with no trouble; but don't redo // oldUsage/oldMaxBuffers return this; case STATE_CONFIGURED: if (stream_type == CAMERA3_STREAM_INPUT) { ALOGE("%s: Cannot configure an input stream twice", __FUNCTION__); return NULL; } else if (hasOutstandingBuffersLocked()) { ALOGE("%s: Cannot configure stream; has outstanding buffers", __FUNCTION__); return NULL; } break; default: ALOGE("%s: Unknown state %d", __FUNCTION__, mState); return NULL; } oldUsage = camera3_stream::usage; oldMaxBuffers = camera3_stream::max_buffers; res = getEndpointUsage(&(camera3_stream::usage)); if (res != OK) { ALOGE("%s: Cannot query consumer endpoint usage!", __FUNCTION__); return NULL; } // Stop tracking if currently doing so if (mStatusId != StatusTracker::NO_STATUS_ID) { sp<StatusTracker> statusTracker = mStatusTracker.promote(); if (statusTracker != 0) { statusTracker->removeComponent(mStatusId); } mStatusId = StatusTracker::NO_STATUS_ID; } if (mState == STATE_CONSTRUCTED) { mState = STATE_IN_CONFIG; } else { // mState == STATE_CONFIGURED mState = STATE_IN_RECONFIG; } return this; }
bool Camera3Stream::hasOutstandingBuffers() const { ATRACE_CALL(); Mutex::Autolock l(mLock); return hasOutstandingBuffersLocked(); }