diff options
author | Yin-Chia Yeh <yinchiayeh@google.com> | 2014-06-20 21:57:51 +0000 |
---|---|---|
committer | Android (Google) Code Review <android-gerrit@google.com> | 2014-06-20 02:09:17 +0000 |
commit | fc2aa4c228aa3f2d85fe15faa959dbacc85b731a (patch) | |
tree | a0a105804b6423bc7cefa6b37617f3d8a9b20f98 /services | |
parent | fcd58351b6d7fcd62a0fe65b425723dd53d10e5e (diff) | |
parent | 8684b7f7977f535260367040931c1fd994cca3b4 (diff) | |
download | frameworks_av-fc2aa4c228aa3f2d85fe15faa959dbacc85b731a.zip frameworks_av-fc2aa4c228aa3f2d85fe15faa959dbacc85b731a.tar.gz frameworks_av-fc2aa4c228aa3f2d85fe15faa959dbacc85b731a.tar.bz2 |
Merge "Camera2: Fix lastFrameNumber counter in flush case"
Diffstat (limited to 'services')
-rw-r--r-- | services/camera/libcameraservice/device3/Camera3Device.cpp | 23 | ||||
-rw-r--r-- | services/camera/libcameraservice/device3/Camera3Device.h | 3 |
2 files changed, 26 insertions, 0 deletions
diff --git a/services/camera/libcameraservice/device3/Camera3Device.cpp b/services/camera/libcameraservice/device3/Camera3Device.cpp index 16d6f42..a5839ae 100644 --- a/services/camera/libcameraservice/device3/Camera3Device.cpp +++ b/services/camera/libcameraservice/device3/Camera3Device.cpp @@ -2126,6 +2126,17 @@ status_t Camera3Device::RequestThread::setRepeatingRequests( return OK; } +bool Camera3Device::RequestThread::isRepeatingRequestLocked(const sp<CaptureRequest> requestIn) { + if (mRepeatingRequests.empty()) { + return false; + } + int32_t requestId = requestIn->mResultExtras.requestId; + const RequestList &repeatRequests = mRepeatingRequests; + // All repeating requests are guaranteed to have same id so only check first quest + const sp<CaptureRequest> firstRequest = *repeatRequests.begin(); + return (firstRequest->mResultExtras.requestId == requestId); +} + status_t Camera3Device::RequestThread::clearRepeatingRequests(/*out*/int64_t *lastFrameNumber) { Mutex::Autolock l(mRequestLock); mRepeatingRequests.clear(); @@ -2140,6 +2151,18 @@ status_t Camera3Device::RequestThread::clear(/*out*/int64_t *lastFrameNumber) { Mutex::Autolock l(mRequestLock); ALOGV("RequestThread::%s:", __FUNCTION__); mRepeatingRequests.clear(); + + // Decrement repeating frame count for those requests never sent to device + // TODO: Remove this after we have proper error handling so these requests + // will generate an error callback. This might be the only place calling + // isRepeatingRequestLocked. If so, isRepeatingRequestLocked should also be removed. + const RequestList &requests = mRequestQueue; + for (RequestList::const_iterator it = requests.begin(); + it != requests.end(); ++it) { + if (isRepeatingRequestLocked(*it)) { + mRepeatingLastFrameNumber--; + } + } mRequestQueue.clear(); mTriggerMap.clear(); if (lastFrameNumber != NULL) { diff --git a/services/camera/libcameraservice/device3/Camera3Device.h b/services/camera/libcameraservice/device3/Camera3Device.h index 00ae771..8e238e5 100644 --- a/services/camera/libcameraservice/device3/Camera3Device.h +++ b/services/camera/libcameraservice/device3/Camera3Device.h @@ -430,6 +430,9 @@ class Camera3Device : // Relay error to parent device object setErrorState void setErrorState(const char *fmt, ...); + // If the input request is in mRepeatingRequests. Must be called with mRequestLock hold + bool isRepeatingRequestLocked(const sp<CaptureRequest>); + wp<Camera3Device> mParent; wp<camera3::StatusTracker> mStatusTracker; camera3_device_t *mHal3Device; |