status_t Camera3Stream::returnBuffer(const camera3_stream_buffer &buffer, nsecs_t timestamp) { ATRACE_CALL(); Mutex::Autolock l(mLock); // Check if this buffer is outstanding. if (!isOutstandingBuffer(buffer)) { ALOGE("%s: Stream %d: Returning an unknown buffer.", __FUNCTION__, mId); return BAD_VALUE; } /** * TODO: Check that the state is valid first. * * <HAL3.2 IN_CONFIG and IN_RECONFIG in addition to CONFIGURED. * >= HAL3.2 CONFIGURED only * * Do this for getBuffer as well. */ status_t res = returnBufferLocked(buffer, timestamp); if (res == OK) { fireBufferListenersLocked(buffer, /*acquired*/false, /*output*/true); } // Even if returning the buffer failed, we still want to signal whoever is waiting for the // buffer to be returned. mOutputBufferReturnedSignal.signal(); removeOutstandingBuffer(buffer); return res; }
status_t Camera3Stream::returnInputBuffer(const camera3_stream_buffer &buffer) { ATRACE_CALL(); Mutex::Autolock l(mLock); status_t res = returnInputBufferLocked(buffer); if (res == OK) { fireBufferListenersLocked(buffer, /*acquired*/false, /*output*/false); } return res; }
status_t Camera3Stream::getBuffer(camera3_stream_buffer *buffer) { ATRACE_CALL(); Mutex::Autolock l(mLock); status_t res = getBufferLocked(buffer); if (res == OK) { fireBufferListenersLocked(*buffer, /*acquired*/true, /*output*/true); } return res; }
status_t Camera3Stream::returnInputBuffer(const camera3_stream_buffer &buffer) { ATRACE_CALL(); Mutex::Autolock l(mLock); // Check if this buffer is outstanding. if (!isOutstandingBuffer(buffer)) { ALOGE("%s: Stream %d: Returning an unknown buffer.", __FUNCTION__, mId); return BAD_VALUE; } status_t res = returnInputBufferLocked(buffer); if (res == OK) { fireBufferListenersLocked(buffer, /*acquired*/false, /*output*/false); mInputBufferReturnedSignal.signal(); } removeOutstandingBuffer(buffer); return res; }
status_t Camera3Stream::getBuffer(camera3_stream_buffer *buffer) { ATRACE_CALL(); Mutex::Autolock l(mLock); status_t res = OK; // This function should be only called when the stream is configured already. if (mState != STATE_CONFIGURED) { ALOGE("%s: Stream %d: Can't get buffers if stream is not in CONFIGURED state %d", __FUNCTION__, mId, mState); return INVALID_OPERATION; } // Wait for new buffer returned back if we are running into the limit. if (getHandoutOutputBufferCountLocked() == camera3_stream::max_buffers) { ALOGV("%s: Already dequeued max output buffers (%d), wait for next returned one.", __FUNCTION__, camera3_stream::max_buffers); res = mOutputBufferReturnedSignal.waitRelative(mLock, kWaitForBufferDuration); if (res != OK) { if (res == TIMED_OUT) { ALOGE("%s: wait for output buffer return timed out after %lldms (max_buffers %d)", __FUNCTION__, kWaitForBufferDuration / 1000000LL, camera3_stream::max_buffers); } return res; } } res = getBufferLocked(buffer); if (res == OK) { fireBufferListenersLocked(*buffer, /*acquired*/true, /*output*/true); if (buffer->buffer) { mOutstandingBuffers.push_back(*buffer->buffer); } } return res; }