Merge "Camera: Quit extension handler thread during release"

This commit is contained in:
Treehugger Robot
2023-06-06 01:36:36 +00:00
committed by Gerrit Code Review

View File

@@ -716,7 +716,7 @@ public final class CameraExtensionSessionImpl extends CameraExtensionSession {
synchronized (mInterfaceLock) { synchronized (mInterfaceLock) {
mInternalRepeatingRequestEnabled = false; mInternalRepeatingRequestEnabled = false;
mHandlerThread.quitSafely(); mHandlerThread.quit();
try { try {
mPreviewExtender.onDeInit(); mPreviewExtender.onDeInit();
@@ -1252,88 +1252,98 @@ public final class CameraExtensionSessionImpl extends CameraExtensionSession {
@Override @Override
public void onImageAvailable(ImageReader reader) { public void onImageAvailable(ImageReader reader) {
Image img; Image img;
try { synchronized (mInterfaceLock) {
img = reader.acquireNextImage(); try {
} catch (IllegalStateException e) { img = reader.acquireNextImage();
Log.e(TAG, "Failed to acquire image, too many images pending!"); } catch (IllegalStateException e) {
mOutOfBuffers = true; Log.e(TAG, "Failed to acquire image, too many images pending!");
return; mOutOfBuffers = true;
} return;
if (img == null) { }
Log.e(TAG, "Invalid image!"); if (img == null) {
return; 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);
} else {
Log.w(TAG, "Invalid image listener, dropping frame!");
img.close();
} }
} else {
mImageListenerMap.put(img.getTimestamp(), new Pair<>(img, null));
}
notifyDroppedImages(timestamp); 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 {
mImageListenerMap.put(timestamp, new Pair<>(img, null));
}
notifyDroppedImages(timestamp);
}
} }
private void notifyDroppedImages(long timestamp) { private void notifyDroppedImages(long timestamp) {
Set<Long> timestamps = mImageListenerMap.keySet(); synchronized (mInterfaceLock) {
ArrayList<Long> removedTs = new ArrayList<>(); Set<Long> timestamps = mImageListenerMap.keySet();
for (long ts : timestamps) { ArrayList<Long> removedTs = new ArrayList<>();
if (ts < timestamp) { for (long ts : timestamps) {
Log.e(TAG, "Dropped image with ts: " + ts); if (ts < timestamp) {
Pair<Image, OnImageAvailableListener> entry = mImageListenerMap.get(ts); Log.e(TAG, "Dropped image with ts: " + ts);
if (entry.second != null) { Pair<Image, OnImageAvailableListener> entry = mImageListenerMap.get(ts);
entry.second.onImageDropped(ts); if (entry.second != null) {
entry.second.onImageDropped(ts);
}
if (entry.first != null) {
entry.first.close();
}
removedTs.add(ts);
} }
if (entry.first != null) {
entry.first.close();
}
removedTs.add(ts);
} }
} for (long ts : removedTs) {
for (long ts : removedTs) { mImageListenerMap.remove(ts);
mImageListenerMap.remove(ts); }
} }
} }
public void registerListener(Long timestamp, OnImageAvailableListener listener) { public void registerListener(Long timestamp, OnImageAvailableListener listener) {
if (mImageListenerMap.containsKey(timestamp)) { synchronized (mInterfaceLock) {
Pair<Image, OnImageAvailableListener> entry = mImageListenerMap.remove(timestamp); if (mImageListenerMap.containsKey(timestamp)) {
if (entry.first != null) { Pair<Image, OnImageAvailableListener> entry = mImageListenerMap.remove(
listener.onImageAvailable(mImageReader, entry.first); timestamp);
if (mOutOfBuffers) { if (entry.first != null) {
mOutOfBuffers = false; listener.onImageAvailable(mImageReader, entry.first);
Log.w(TAG,"Out of buffers, retry!"); if (mOutOfBuffers) {
onImageAvailable(mImageReader); 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 { } else {
Log.w(TAG, "No valid image for listener with ts: " + mImageListenerMap.put(timestamp, new Pair<>(null, listener));
timestamp.longValue());
} }
} else {
mImageListenerMap.put(timestamp, new Pair<>(null, listener));
} }
} }
@Override @Override
public void close() { public void close() {
for (Pair<Image, OnImageAvailableListener> entry : mImageListenerMap.values()) { synchronized (mInterfaceLock) {
if (entry.first != null) { for (Pair<Image, OnImageAvailableListener> entry : mImageListenerMap.values()) {
entry.first.close(); if (entry.first != null) {
entry.first.close();
}
} }
} for (long timestamp : mImageListenerMap.keySet()) {
for (long timestamp : mImageListenerMap.keySet()) { Pair<Image, OnImageAvailableListener> entry = mImageListenerMap.get(timestamp);
Pair<Image, OnImageAvailableListener> entry = mImageListenerMap.get(timestamp); if (entry.second != null) {
if (entry.second != null) { entry.second.onImageDropped(timestamp);
entry.second.onImageDropped(timestamp); }
} }
mImageListenerMap.clear();
} }
mImageListenerMap.clear();
} }
} }