Camera2: Synchronize mode changes and triggers
Make sure that changes to various parameters have reached the HAL
before triggering asynchronous events like autofocus or precapture
metering.
Bug: 7107220
Change-Id: I3c50038de1671968eb32004ce538435121934e7e
diff --git a/services/camera/libcameraservice/camera2/CaptureSequencer.cpp b/services/camera/libcameraservice/camera2/CaptureSequencer.cpp
index d56af64..a849246 100644
--- a/services/camera/libcameraservice/camera2/CaptureSequencer.cpp
+++ b/services/camera/libcameraservice/camera2/CaptureSequencer.cpp
@@ -44,7 +44,7 @@
mCaptureState(IDLE),
mTriggerId(0),
mTimeoutCount(0),
- mCaptureId(Camera2Client::kFirstCaptureRequestId) {
+ mCaptureId(Camera2Client::kCaptureRequestIdStart) {
ALOGV("%s", __FUNCTION__);
}
@@ -84,12 +84,12 @@
}
void CaptureSequencer::onFrameAvailable(int32_t frameId,
- CameraMetadata &frame) {
+ const CameraMetadata &frame) {
ALOGV("%s: Listener found new frame", __FUNCTION__);
ATRACE_CALL();
Mutex::Autolock l(mInputMutex);
mNewFrameId = frameId;
- mNewFrame.acquire(frame);
+ mNewFrame = frame;
if (!mNewFrameReceived) {
mNewFrameReceived = true;
mNewFrameSignal.signal();
@@ -203,7 +203,9 @@
status_t res = OK;
ATRACE_CALL();
mCaptureId++;
-
+ if (mCaptureId >= Camera2Client::kCaptureRequestIdEnd) {
+ mCaptureId = Camera2Client::kCaptureRequestIdStart;
+ }
{
Mutex::Autolock l(mInputMutex);
mBusy = false;
@@ -286,7 +288,7 @@
return DONE;
}
- client->registerFrameListener(mCaptureId,
+ client->registerFrameListener(mCaptureId, mCaptureId + 1,
this);
// TODO: Actually select the right thing here.
@@ -326,7 +328,7 @@
CaptureSequencer::CaptureState CaptureSequencer::manageStandardStart(
sp<Camera2Client> &client) {
ATRACE_CALL();
- client->registerFrameListener(mCaptureId,
+ client->registerFrameListener(mCaptureId, mCaptureId + 1,
this);
{
SharedParameters::Lock l(client->getParameters());
@@ -421,7 +423,7 @@
}
if (l.mParameters.state == Parameters::STILL_CAPTURE) {
- res = client->getCameraDevice()->clearStreamingRequest();
+ res = client->stopStream();
if (res != OK) {
ALOGE("%s: Camera %d: Unable to stop preview for still capture: "
"%s (%d)",
@@ -482,7 +484,7 @@
ALOGW("Mismatched capture timestamps: Metadata frame %lld,"
" captured buffer %lld", entry.data.i64[0], mCaptureTimestamp);
}
- client->removeFrameListener(mCaptureId);
+ client->removeFrameListener(mCaptureId, mCaptureId + 1, this);
mNewFrameReceived = false;
mNewCaptureReceived = false;