camera: Drop pending preview for enableZsl shots

If the device support ZSL, drop pending preview buffers to reduce
the chance the rendering preview frames newer than the still frame
during takePicture().

Test: CTS
Bug: 67497723
Change-Id: I5f253a402a6302d31777ad4ca2878ef0d0d1ae44
(cherry picked from commit c75eb9b126b2c6b7fc8f47d8ae4e4ac15f6a176e)
gugelfrei
Chien-Yu Chen 7 years ago committed by Trevor Bunker
parent 7e94f95482
commit a936ac2646

@ -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