summaryrefslogtreecommitdiff
path: root/camera/device/3.2/default/CameraDeviceSession.cpp
diff options
context:
space:
mode:
authorYin-Chia Yeh <yinchiayeh@google.com>2017-03-30 15:06:20 -0700
committerYin-Chia Yeh <yinchiayeh@google.com>2017-04-03 14:41:23 -0700
commit28eebbfc41f5114eae3a8d0234c1f1fcedffdf1a (patch)
treeab8a9e52f1d81e91789585d460aa667129db6b22 /camera/device/3.2/default/CameraDeviceSession.cpp
parent3368520bbc9e2886ee155fe9521e9bfa7527f4f7 (diff)
Camera: add interface to evict obsolete buffer caches
Test: fix CTS ReprocessCaptureTest Bug: 34461678 Change-Id: Icde654b0c8423c31d7d39d180913ffa374e7de3c
Diffstat (limited to 'camera/device/3.2/default/CameraDeviceSession.cpp')
-rw-r--r--camera/device/3.2/default/CameraDeviceSession.cpp26
1 files changed, 25 insertions, 1 deletions
diff --git a/camera/device/3.2/default/CameraDeviceSession.cpp b/camera/device/3.2/default/CameraDeviceSession.cpp
index fb1d1ff7c1..5b3024b238 100644
--- a/camera/device/3.2/default/CameraDeviceSession.cpp
+++ b/camera/device/3.2/default/CameraDeviceSession.cpp
@@ -678,8 +678,32 @@ void CameraDeviceSession::cleanupBuffersLocked(int id) {
mCirculatingBuffers.erase(id);
}
+void CameraDeviceSession::updateBufferCaches(const hidl_vec<BufferCache>& cachesToRemove) {
+ Mutex::Autolock _l(mInflightLock);
+ for (auto& cache : cachesToRemove) {
+ auto cbsIt = mCirculatingBuffers.find(cache.streamId);
+ if (cbsIt == mCirculatingBuffers.end()) {
+ // The stream could have been removed
+ continue;
+ }
+ CirculatingBuffers& cbs = cbsIt->second;
+ auto it = cbs.find(cache.bufferId);
+ if (it != cbs.end()) {
+ sHandleImporter.freeBuffer(it->second);
+ cbs.erase(it);
+ } else {
+ ALOGE("%s: stream %d buffer %" PRIu64 " is not cached",
+ __FUNCTION__, cache.streamId, cache.bufferId);
+ }
+ }
+}
+
Return<void> CameraDeviceSession::processCaptureRequest(
- const hidl_vec<CaptureRequest>& requests, processCaptureRequest_cb _hidl_cb) {
+ const hidl_vec<CaptureRequest>& requests,
+ const hidl_vec<BufferCache>& cachesToRemove,
+ processCaptureRequest_cb _hidl_cb) {
+ updateBufferCaches(cachesToRemove);
+
uint32_t numRequestProcessed = 0;
Status s = Status::OK;
for (size_t i = 0; i < requests.size(); i++, numRequestProcessed++) {