|
|
|
@ -54,9 +54,8 @@ Camera3OutputStream::Camera3OutputStream(int id,
|
|
|
|
|
mState = STATE_ERROR;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (setId > CAMERA3_STREAM_SET_ID_INVALID) {
|
|
|
|
|
mBufferReleasedListener = new BufferReleasedListener(this);
|
|
|
|
|
}
|
|
|
|
|
bool needsReleaseNotify = setId > CAMERA3_STREAM_SET_ID_INVALID;
|
|
|
|
|
mBufferProducerListener = new BufferProducerListener(this, needsReleaseNotify);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
Camera3OutputStream::Camera3OutputStream(int id,
|
|
|
|
@ -87,9 +86,8 @@ Camera3OutputStream::Camera3OutputStream(int id,
|
|
|
|
|
mState = STATE_ERROR;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (setId > CAMERA3_STREAM_SET_ID_INVALID) {
|
|
|
|
|
mBufferReleasedListener = new BufferReleasedListener(this);
|
|
|
|
|
}
|
|
|
|
|
bool needsReleaseNotify = setId > CAMERA3_STREAM_SET_ID_INVALID;
|
|
|
|
|
mBufferProducerListener = new BufferProducerListener(this, needsReleaseNotify);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
Camera3OutputStream::Camera3OutputStream(int id,
|
|
|
|
@ -124,10 +122,8 @@ Camera3OutputStream::Camera3OutputStream(int id,
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
mConsumerName = String8("Deferred");
|
|
|
|
|
if (setId > CAMERA3_STREAM_SET_ID_INVALID) {
|
|
|
|
|
mBufferReleasedListener = new BufferReleasedListener(this);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
bool needsReleaseNotify = setId > CAMERA3_STREAM_SET_ID_INVALID;
|
|
|
|
|
mBufferProducerListener = new BufferProducerListener(this, needsReleaseNotify);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
Camera3OutputStream::Camera3OutputStream(int id, camera3_stream_type_t type,
|
|
|
|
@ -151,9 +147,8 @@ Camera3OutputStream::Camera3OutputStream(int id, camera3_stream_type_t type,
|
|
|
|
|
mDropBuffers(false),
|
|
|
|
|
mDequeueBufferLatency(kDequeueLatencyBinSize) {
|
|
|
|
|
|
|
|
|
|
if (setId > CAMERA3_STREAM_SET_ID_INVALID) {
|
|
|
|
|
mBufferReleasedListener = new BufferReleasedListener(this);
|
|
|
|
|
}
|
|
|
|
|
bool needsReleaseNotify = setId > CAMERA3_STREAM_SET_ID_INVALID;
|
|
|
|
|
mBufferProducerListener = new BufferProducerListener(this, needsReleaseNotify);
|
|
|
|
|
|
|
|
|
|
// Subclasses expected to initialize mConsumer themselves
|
|
|
|
|
}
|
|
|
|
@ -261,7 +256,7 @@ status_t Camera3OutputStream::returnBufferCheckedLocked(
|
|
|
|
|
notifyBufferReleased(anwBuffer);
|
|
|
|
|
if (mUseBufferManager) {
|
|
|
|
|
// Return this buffer back to buffer manager.
|
|
|
|
|
mBufferReleasedListener->onBufferReleased();
|
|
|
|
|
mBufferProducerListener->onBufferReleased();
|
|
|
|
|
}
|
|
|
|
|
} else {
|
|
|
|
|
if (mTraceFirstBuffer && (stream_type == CAMERA3_STREAM_OUTPUT)) {
|
|
|
|
@ -387,8 +382,8 @@ status_t Camera3OutputStream::configureConsumerQueueLocked() {
|
|
|
|
|
// Configure consumer-side ANativeWindow interface. The listener may be used
|
|
|
|
|
// to notify buffer manager (if it is used) of the returned buffers.
|
|
|
|
|
res = mConsumer->connect(NATIVE_WINDOW_API_CAMERA,
|
|
|
|
|
/*listener*/mBufferReleasedListener,
|
|
|
|
|
/*reportBufferRemoval*/true);
|
|
|
|
|
/*reportBufferRemoval*/true,
|
|
|
|
|
/*listener*/mBufferProducerListener);
|
|
|
|
|
if (res != OK) {
|
|
|
|
|
ALOGE("%s: Unable to connect to native window for stream %d",
|
|
|
|
|
__FUNCTION__, mId);
|
|
|
|
@ -790,7 +785,7 @@ status_t Camera3OutputStream::updateStream(const std::vector<sp<Surface>> &/*out
|
|
|
|
|
return INVALID_OPERATION;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void Camera3OutputStream::BufferReleasedListener::onBufferReleased() {
|
|
|
|
|
void Camera3OutputStream::BufferProducerListener::onBufferReleased() {
|
|
|
|
|
sp<Camera3OutputStream> stream = mParent.promote();
|
|
|
|
|
if (stream == nullptr) {
|
|
|
|
|
ALOGV("%s: Parent camera3 output stream was destroyed", __FUNCTION__);
|
|
|
|
@ -823,6 +818,25 @@ void Camera3OutputStream::BufferReleasedListener::onBufferReleased() {
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void Camera3OutputStream::BufferProducerListener::onBuffersDiscarded(
|
|
|
|
|
const std::vector<sp<GraphicBuffer>>& buffers) {
|
|
|
|
|
sp<Camera3OutputStream> stream = mParent.promote();
|
|
|
|
|
if (stream == nullptr) {
|
|
|
|
|
ALOGV("%s: Parent camera3 output stream was destroyed", __FUNCTION__);
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (buffers.size() > 0) {
|
|
|
|
|
Mutex::Autolock l(stream->mLock);
|
|
|
|
|
stream->onBuffersRemovedLocked(buffers);
|
|
|
|
|
if (stream->mUseBufferManager) {
|
|
|
|
|
stream->mBufferManager->onBuffersRemoved(stream->getId(),
|
|
|
|
|
stream->getStreamSetId(), buffers.size());
|
|
|
|
|
}
|
|
|
|
|
ALOGV("Stream %d: %zu Buffers discarded.", stream->getId(), buffers.size());
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void Camera3OutputStream::onBuffersRemovedLocked(
|
|
|
|
|
const std::vector<sp<GraphicBuffer>>& removedBuffers) {
|
|
|
|
|
sp<Camera3StreamBufferFreedListener> callback = mBufferFreedListener.promote();
|
|
|
|
|