Merge "Camera: extend getBuffer wait timeout"

am: a8fb86eb97

Change-Id: Icd507ea88bafeec83f9df9c942d2dbf628179954
gugelfrei
Yin-Chia Yeh 6 years ago committed by android-build-merger
commit 453a3787f9

@ -4854,6 +4854,15 @@ status_t Camera3Device::RequestThread::prepareHalRequests() {
captureRequest->mOutputStreams.size()); captureRequest->mOutputStreams.size());
halRequest->output_buffers = outputBuffers->array(); halRequest->output_buffers = outputBuffers->array();
std::set<String8> requestedPhysicalCameras; std::set<String8> requestedPhysicalCameras;
sp<Camera3Device> parent = mParent.promote();
if (parent == NULL) {
// Should not happen, and nowhere to send errors to, so just log it
CLOGE("RequestThread: Parent is gone");
return INVALID_OPERATION;
}
nsecs_t waitDuration = kBaseGetBufferWait + parent->getExpectedInFlightDuration();
for (size_t j = 0; j < captureRequest->mOutputStreams.size(); j++) { for (size_t j = 0; j < captureRequest->mOutputStreams.size(); j++) {
sp<Camera3OutputStreamInterface> outputStream = captureRequest->mOutputStreams.editItemAt(j); sp<Camera3OutputStreamInterface> outputStream = captureRequest->mOutputStreams.editItemAt(j);
@ -4874,6 +4883,7 @@ status_t Camera3Device::RequestThread::prepareHalRequests() {
} }
res = outputStream->getBuffer(&outputBuffers->editItemAt(j), res = outputStream->getBuffer(&outputBuffers->editItemAt(j),
waitDuration,
captureRequest->mOutputSurfaces[j]); captureRequest->mOutputSurfaces[j]);
if (res != OK) { if (res != OK) {
// Can't get output buffer from gralloc queue - this could be due to // Can't get output buffer from gralloc queue - this could be due to
@ -4900,13 +4910,6 @@ status_t Camera3Device::RequestThread::prepareHalRequests() {
totalNumBuffers += halRequest->num_output_buffers; totalNumBuffers += halRequest->num_output_buffers;
// Log request in the in-flight queue // Log request in the in-flight queue
sp<Camera3Device> parent = mParent.promote();
if (parent == NULL) {
// Should not happen, and nowhere to send errors to, so just log it
CLOGE("RequestThread: Parent is gone");
return INVALID_OPERATION;
}
// If this request list is for constrained high speed recording (not // If this request list is for constrained high speed recording (not
// preview), and the current request is not the last one in the batch, // preview), and the current request is not the last one in the batch,
// do not send callback to the app. // do not send callback to the app.

@ -221,6 +221,7 @@ class Camera3Device :
static const size_t kInFlightWarnLimitHighSpeed = 256; // batch size 32 * pipe depth 8 static const size_t kInFlightWarnLimitHighSpeed = 256; // batch size 32 * pipe depth 8
static const nsecs_t kDefaultExpectedDuration = 100000000; // 100 ms static const nsecs_t kDefaultExpectedDuration = 100000000; // 100 ms
static const nsecs_t kMinInflightDuration = 5000000000; // 5 s static const nsecs_t kMinInflightDuration = 5000000000; // 5 s
static const nsecs_t kBaseGetBufferWait = 3000000000; // 3 sec.
// SCHED_FIFO priority for request submission thread in HFR mode // SCHED_FIFO priority for request submission thread in HFR mode
static const int kRequestThreadPriority = 1; static const int kRequestThreadPriority = 1;

@ -569,6 +569,7 @@ status_t Camera3Stream::tearDown() {
} }
status_t Camera3Stream::getBuffer(camera3_stream_buffer *buffer, status_t Camera3Stream::getBuffer(camera3_stream_buffer *buffer,
nsecs_t waitBufferTimeout,
const std::vector<size_t>& surface_ids) { const std::vector<size_t>& surface_ids) {
ATRACE_CALL(); ATRACE_CALL();
Mutex::Autolock l(mLock); Mutex::Autolock l(mLock);
@ -586,13 +587,16 @@ status_t Camera3Stream::getBuffer(camera3_stream_buffer *buffer,
ALOGV("%s: Already dequeued max output buffers (%d), wait for next returned one.", ALOGV("%s: Already dequeued max output buffers (%d), wait for next returned one.",
__FUNCTION__, camera3_stream::max_buffers); __FUNCTION__, camera3_stream::max_buffers);
nsecs_t waitStart = systemTime(SYSTEM_TIME_MONOTONIC); nsecs_t waitStart = systemTime(SYSTEM_TIME_MONOTONIC);
res = mOutputBufferReturnedSignal.waitRelative(mLock, kWaitForBufferDuration); if (waitBufferTimeout < kWaitForBufferDuration) {
waitBufferTimeout = kWaitForBufferDuration;
}
res = mOutputBufferReturnedSignal.waitRelative(mLock, waitBufferTimeout);
nsecs_t waitEnd = systemTime(SYSTEM_TIME_MONOTONIC); nsecs_t waitEnd = systemTime(SYSTEM_TIME_MONOTONIC);
mBufferLimitLatency.add(waitStart, waitEnd); mBufferLimitLatency.add(waitStart, waitEnd);
if (res != OK) { if (res != OK) {
if (res == TIMED_OUT) { if (res == TIMED_OUT) {
ALOGE("%s: wait for output buffer return timed out after %lldms (max_buffers %d)", ALOGE("%s: wait for output buffer return timed out after %lldms (max_buffers %d)",
__FUNCTION__, kWaitForBufferDuration / 1000000LL, __FUNCTION__, waitBufferTimeout / 1000000LL,
camera3_stream::max_buffers); camera3_stream::max_buffers);
} }
return res; return res;

@ -311,6 +311,7 @@ class Camera3Stream :
* *
*/ */
status_t getBuffer(camera3_stream_buffer *buffer, status_t getBuffer(camera3_stream_buffer *buffer,
nsecs_t waitBufferTimeout,
const std::vector<size_t>& surface_ids = std::vector<size_t>()); const std::vector<size_t>& surface_ids = std::vector<size_t>());
/** /**

@ -237,6 +237,7 @@ class Camera3StreamInterface : public virtual RefBase {
* *
*/ */
virtual status_t getBuffer(camera3_stream_buffer *buffer, virtual status_t getBuffer(camera3_stream_buffer *buffer,
nsecs_t waitBufferTimeout,
const std::vector<size_t>& surface_ids = std::vector<size_t>()) = 0; const std::vector<size_t>& surface_ids = std::vector<size_t>()) = 0;
/** /**

Loading…
Cancel
Save