diff options
| -rw-r--r-- | core/java/android/hardware/camera2/impl/CameraExtensionSessionImpl.java | 128 |
1 files changed, 69 insertions, 59 deletions
diff --git a/core/java/android/hardware/camera2/impl/CameraExtensionSessionImpl.java b/core/java/android/hardware/camera2/impl/CameraExtensionSessionImpl.java index 8e7c7e0cfca8..0bb5046e21df 100644 --- a/core/java/android/hardware/camera2/impl/CameraExtensionSessionImpl.java +++ b/core/java/android/hardware/camera2/impl/CameraExtensionSessionImpl.java @@ -828,7 +828,7 @@ public final class CameraExtensionSessionImpl extends CameraExtensionSession { synchronized (mInterfaceLock) { mInternalRepeatingRequestEnabled = false; - mHandlerThread.quitSafely(); + mHandlerThread.quit(); try { mPreviewExtender.onDeInit(); @@ -1368,88 +1368,98 @@ public final class CameraExtensionSessionImpl extends CameraExtensionSession { @Override public void onImageAvailable(ImageReader reader) { Image img; - try { - img = reader.acquireNextImage(); - } catch (IllegalStateException e) { - Log.e(TAG, "Failed to acquire image, too many images pending!"); - mOutOfBuffers = true; - return; - } - if (img == null) { - Log.e(TAG, "Invalid image!"); - return; - } + synchronized (mInterfaceLock) { + try { + img = reader.acquireNextImage(); + } catch (IllegalStateException e) { + Log.e(TAG, "Failed to acquire image, too many images pending!"); + mOutOfBuffers = true; + return; + } + if (img == null) { + Log.e(TAG, "Invalid image!"); + return; + } - Long timestamp = img.getTimestamp(); - if (mImageListenerMap.containsKey(timestamp)) { - Pair<Image, OnImageAvailableListener> entry = mImageListenerMap.remove(timestamp); - if (entry.second != null) { - entry.second.onImageAvailable(reader, img); + Long timestamp = img.getTimestamp(); + if (mImageListenerMap.containsKey(timestamp)) { + Pair<Image, OnImageAvailableListener> entry = mImageListenerMap.remove( + timestamp); + if (entry.second != null) { + entry.second.onImageAvailable(reader, img); + } else { + Log.w(TAG, "Invalid image listener, dropping frame!"); + img.close(); + } } else { - Log.w(TAG, "Invalid image listener, dropping frame!"); - img.close(); + mImageListenerMap.put(timestamp, new Pair<>(img, null)); } - } else { - mImageListenerMap.put(img.getTimestamp(), new Pair<>(img, null)); - } - notifyDroppedImages(timestamp); + notifyDroppedImages(timestamp); + } } private void notifyDroppedImages(long timestamp) { - Set<Long> timestamps = mImageListenerMap.keySet(); - ArrayList<Long> removedTs = new ArrayList<>(); - for (long ts : timestamps) { - if (ts < timestamp) { - Log.e(TAG, "Dropped image with ts: " + ts); - Pair<Image, OnImageAvailableListener> entry = mImageListenerMap.get(ts); - if (entry.second != null) { - entry.second.onImageDropped(ts); - } - if (entry.first != null) { - entry.first.close(); + synchronized (mInterfaceLock) { + Set<Long> timestamps = mImageListenerMap.keySet(); + ArrayList<Long> removedTs = new ArrayList<>(); + for (long ts : timestamps) { + if (ts < timestamp) { + Log.e(TAG, "Dropped image with ts: " + ts); + Pair<Image, OnImageAvailableListener> entry = mImageListenerMap.get(ts); + if (entry.second != null) { + entry.second.onImageDropped(ts); + } + if (entry.first != null) { + entry.first.close(); + } + removedTs.add(ts); } - removedTs.add(ts); } - } - for (long ts : removedTs) { - mImageListenerMap.remove(ts); + for (long ts : removedTs) { + mImageListenerMap.remove(ts); + } } } public void registerListener(Long timestamp, OnImageAvailableListener listener) { - if (mImageListenerMap.containsKey(timestamp)) { - Pair<Image, OnImageAvailableListener> entry = mImageListenerMap.remove(timestamp); - if (entry.first != null) { - listener.onImageAvailable(mImageReader, entry.first); - if (mOutOfBuffers) { - mOutOfBuffers = false; - Log.w(TAG,"Out of buffers, retry!"); - onImageAvailable(mImageReader); + synchronized (mInterfaceLock) { + if (mImageListenerMap.containsKey(timestamp)) { + Pair<Image, OnImageAvailableListener> entry = mImageListenerMap.remove( + timestamp); + if (entry.first != null) { + listener.onImageAvailable(mImageReader, entry.first); + if (mOutOfBuffers) { + mOutOfBuffers = false; + Log.w(TAG,"Out of buffers, retry!"); + onImageAvailable(mImageReader); + } + } else { + Log.w(TAG, "No valid image for listener with ts: " + + timestamp.longValue()); } } else { - Log.w(TAG, "No valid image for listener with ts: " + - timestamp.longValue()); + mImageListenerMap.put(timestamp, new Pair<>(null, listener)); } - } else { - mImageListenerMap.put(timestamp, new Pair<>(null, listener)); } } @Override public void close() { - for (Pair<Image, OnImageAvailableListener> entry : mImageListenerMap.values()) { - if (entry.first != null) { - entry.first.close(); + synchronized (mInterfaceLock) { + for (Pair<Image, OnImageAvailableListener> entry : mImageListenerMap.values()) { + if (entry.first != null) { + entry.first.close(); + } } - } - for (long timestamp : mImageListenerMap.keySet()) { - Pair<Image, OnImageAvailableListener> entry = mImageListenerMap.get(timestamp); - if (entry.second != null) { - entry.second.onImageDropped(timestamp); + for (long timestamp : mImageListenerMap.keySet()) { + Pair<Image, OnImageAvailableListener> entry = mImageListenerMap.get(timestamp); + if (entry.second != null) { + entry.second.onImageDropped(timestamp); + } } + mImageListenerMap.clear(); } - mImageListenerMap.clear(); } } |