diff options
author | Yin-Chia Yeh <yinchiayeh@google.com> | 2017-03-30 15:06:20 -0700 |
---|---|---|
committer | Yin-Chia Yeh <yinchiayeh@google.com> | 2017-04-03 14:41:23 -0700 |
commit | 28eebbfc41f5114eae3a8d0234c1f1fcedffdf1a (patch) | |
tree | ab8a9e52f1d81e91789585d460aa667129db6b22 /camera/device/3.2/default/CameraDeviceSession.cpp | |
parent | 3368520bbc9e2886ee155fe9521e9bfa7527f4f7 (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.cpp | 26 |
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++) { |