void ZslProcessor3::onBufferReleased(const BufferInfo& bufferInfo) { Mutex::Autolock l(mInputMutex); // ignore output buffers if (bufferInfo.mOutput) { return; } // TODO: Verify that the buffer is in our queue by looking at timestamp // theoretically unnecessary unless we change the following assumptions: // -- only 1 buffer reprocessed at a time (which is the case now) // Erase entire ZSL queue since we've now completed the capture and preview // is stopped. // // We need to guarantee that if we do two back-to-back captures, // the second won't use a buffer that's older/the same as the first, which // is theoretically possible if we don't clear out the queue and the // selection criteria is something like 'newest'. Clearing out the queue // on a completed capture ensures we'll only use new data. ALOGV("%s: Memory optimization, clearing ZSL queue", __FUNCTION__); clearZslQueueLocked(); // Required so we accept more ZSL requests mState = RUNNING; }
status_t ZslProcessor3::clearZslQueue() { Mutex::Autolock l(mInputMutex); // If in middle of capture, can't clear out queue if (mState == LOCKED) return OK; return clearZslQueueLocked(); }
void ZslProcessor::onBufferReleased(buffer_handle_t *handle) { Mutex::Autolock l(mInputMutex); // Verify that the buffer is in our queue size_t i = 0; for (; i < mZslQueue.size(); i++) { if (&(mZslQueue[i].buffer.mGraphicBuffer->handle) == handle) break; } if (i == mZslQueue.size()) { ALOGW("%s: Released buffer %p not found in queue", __FUNCTION__, handle); } // Erase entire ZSL queue since we've now completed the capture and preview // is stopped. clearZslQueueLocked(); mState = RUNNING; }
status_t ZslProcessor::disconnect() { ATRACE_CALL(); status_t res; Mutex::Autolock l(mInputMutex); if (mZslStreamId != NO_STREAM) { sp<CameraDeviceBase> device = mDevice.promote(); if (device == 0) { ALOGE("%s: Camera %d: Device does not exist", __FUNCTION__, mId); return INVALID_OPERATION; } clearZslQueueLocked(); res = device->deleteReprocessStream(mZslReprocessStreamId); if (res != OK) { ALOGE("%s: Camera %d: Cannot delete ZSL reprocessing stream %d: " "%s (%d)", __FUNCTION__, mId, mZslReprocessStreamId, strerror(-res), res); return res; } mZslReprocessStreamId = NO_STREAM; res = device->deleteStream(mZslStreamId); if (res != OK) { ALOGE("%s: Camera %d: Cannot delete ZSL output stream %d: " "%s (%d)", __FUNCTION__, mId, mZslStreamId, strerror(-res), res); return res; } mZslWindow.clear(); mZslConsumer.clear(); mZslStreamId = NO_STREAM; } return OK; }