Merge "camera: Drop pending preview for enableZsl shots"

gugelfrei
TreeHugger Robot 7 years ago committed by Android (Google) Code Review
commit 62b3e7a87d

@ -859,6 +859,12 @@ status_t Camera2Client::startPreviewL(Parameters &params, bool restart) {
outputStreams.push(getPreviewStreamId());
if (params.isDeviceZslSupported) {
// If device ZSL is supported, resume preview buffers that may be paused
// during last takePicture().
mDevice->dropStreamBuffers(false, getPreviewStreamId());
}
if (!params.recordingHint) {
if (!restart) {
res = mStreamingProcessor->updatePreviewRequest(params);

@ -553,6 +553,12 @@ CaptureSequencer::CaptureState CaptureSequencer::manageStandardCapture(
return DONE;
}
if (l.mParameters.isDeviceZslSupported) {
// If device ZSL is supported, drop all pending preview buffers to reduce the chance of
// rendering preview frames newer than the still frame.
client->getCameraDevice()->dropStreamBuffers(true, client->getPreviewStreamId());
}
/**
* Clear the streaming request for still-capture pictures
* (as opposed to i.e. video snapshots)

@ -359,6 +359,12 @@ class CameraDeviceBase : public virtual RefBase {
const std::vector<android::camera3::OutputStreamInfo> &outputInfo,
const std::vector<size_t> &removedSurfaceIds,
KeyedVector<sp<Surface>, size_t> *outputMap/*out*/) = 0;
/**
* Drop buffers for stream of streamId if dropping is true. If dropping is false, do not
* drop buffers for stream of streamId.
*/
virtual status_t dropStreamBuffers(bool /*dropping*/, int /*streamId*/) = 0;
};
}; // namespace android

@ -2039,6 +2039,20 @@ status_t Camera3Device::updateStream(int streamId, const std::vector<sp<Surface>
return res;
}
status_t Camera3Device::dropStreamBuffers(bool dropping, int streamId) {
Mutex::Autolock il(mInterfaceLock);
Mutex::Autolock l(mLock);
int idx = mOutputStreams.indexOfKey(streamId);
if (idx == NAME_NOT_FOUND) {
ALOGE("%s: Stream %d is not found.", __FUNCTION__, streamId);
return BAD_VALUE;
}
sp<Camera3OutputStreamInterface> stream = mOutputStreams.editValueAt(idx);
return stream->dropBuffers(dropping);
}
/**
* Camera3Device private methods
*/

@ -192,6 +192,12 @@ class Camera3Device :
const std::vector<size_t> &removedSurfaceIds,
KeyedVector<sp<Surface>, size_t> *outputMap/*out*/);
/**
* Drop buffers for stream of streamId if dropping is true. If dropping is false, do not
* drop buffers for stream of streamId.
*/
status_t dropStreamBuffers(bool dropping, int streamId) override;
private:
// internal typedefs

@ -108,6 +108,10 @@ bool Camera3DummyStream::isConsumerConfigurationDeferred(size_t /*surface_id*/)
return false;
}
status_t Camera3DummyStream::dropBuffers(bool /*dropping*/) {
return OK;
}
status_t Camera3DummyStream::setConsumers(const std::vector<sp<Surface>>& /*consumers*/) {
ALOGE("%s: Stream %d: Dummy stream doesn't support set consumer surface!",
__FUNCTION__, mId);

@ -56,6 +56,12 @@ class Camera3DummyStream :
virtual status_t detachBuffer(sp<GraphicBuffer>* buffer, int* fenceFd);
/**
* Drop buffers for stream of streamId if dropping is true. If dropping is false, do not
* drop buffers for stream of streamId.
*/
virtual status_t dropBuffers(bool /*dropping*/) override;
/**
* Return if this output stream is for video encoding.
*/

@ -44,6 +44,7 @@ Camera3OutputStream::Camera3OutputStream(int id,
mUseBufferManager(false),
mTimestampOffset(timestampOffset),
mConsumerUsage(0),
mDropBuffers(false),
mDequeueBufferLatency(kDequeueLatencyBinSize) {
if (mConsumer == NULL) {
@ -70,6 +71,7 @@ Camera3OutputStream::Camera3OutputStream(int id,
mUseBufferManager(false),
mTimestampOffset(timestampOffset),
mConsumerUsage(0),
mDropBuffers(false),
mDequeueBufferLatency(kDequeueLatencyBinSize) {
if (format != HAL_PIXEL_FORMAT_BLOB && format != HAL_PIXEL_FORMAT_RAW_OPAQUE) {
@ -100,6 +102,7 @@ Camera3OutputStream::Camera3OutputStream(int id,
mUseBufferManager(false),
mTimestampOffset(timestampOffset),
mConsumerUsage(consumerUsage),
mDropBuffers(false),
mDequeueBufferLatency(kDequeueLatencyBinSize) {
// Deferred consumer only support preview surface format now.
if (format != HAL_PIXEL_FORMAT_IMPLEMENTATION_DEFINED) {
@ -139,6 +142,7 @@ Camera3OutputStream::Camera3OutputStream(int id, camera3_stream_type_t type,
mUseBufferManager(false),
mTimestampOffset(timestampOffset),
mConsumerUsage(consumerUsage),
mDropBuffers(false),
mDequeueBufferLatency(kDequeueLatencyBinSize) {
if (setId > CAMERA3_STREAM_SET_ID_INVALID) {
@ -227,9 +231,14 @@ status_t Camera3OutputStream::returnBufferCheckedLocked(
/**
* Return buffer back to ANativeWindow
*/
if (buffer.status == CAMERA3_BUFFER_STATUS_ERROR) {
if (buffer.status == CAMERA3_BUFFER_STATUS_ERROR || mDropBuffers) {
// Cancel buffer
ALOGW("A frame is dropped for stream %d", mId);
if (mDropBuffers) {
ALOGV("%s: Dropping a frame for stream %d.", __FUNCTION__, mId);
} else {
ALOGW("%s: A frame is dropped for stream %d due to buffer error.", __FUNCTION__, mId);
}
res = currentConsumer->cancelBuffer(currentConsumer.get(),
anwBuffer,
anwReleaseFence);
@ -785,6 +794,12 @@ status_t Camera3OutputStream::detachBufferLocked(sp<GraphicBuffer>* buffer, int*
return res;
}
status_t Camera3OutputStream::dropBuffers(bool dropping) {
Mutex::Autolock l(mLock);
mDropBuffers = dropping;
return OK;
}
status_t Camera3OutputStream::notifyBufferReleased(ANativeWindowBuffer* /*anwBuffer*/) {
return OK;
}

@ -165,6 +165,11 @@ class Camera3OutputStream :
*/
virtual status_t notifyBufferReleased(ANativeWindowBuffer *anwBuffer);
/**
* Drop buffers if dropping is true. If dropping is false, do not drop buffers.
*/
virtual status_t dropBuffers(bool dropping) override;
/**
* Set the graphic buffer manager to get/return the stream buffers.
*
@ -260,6 +265,9 @@ class Camera3OutputStream :
*/
uint64_t mConsumerUsage;
// Whether to drop valid buffers.
bool mDropBuffers;
/**
* Internal Camera3Stream interface
*/

@ -73,6 +73,11 @@ class Camera3OutputStreamInterface : public virtual Camera3StreamInterface {
const std::vector<OutputStreamInfo> &outputInfo,
const std::vector<size_t> &removedSurfaceIds,
KeyedVector<sp<Surface>, size_t> *outputMap/*out*/) = 0;
/**
* Drop buffers if dropping is true. If dropping is false, do not drop buffers.
*/
virtual status_t dropBuffers(bool /*dropping*/) = 0;
};
} // namespace camera3

Loading…
Cancel
Save