Merge "Camera: Quit extension handler thread during release" into udc-dev

This commit is contained in:
Treehugger Robot
2023-05-16 17:17:04 +00:00
committed by Android (Google) Code Review

View File

@@ -851,7 +851,7 @@ public final class CameraExtensionSessionImpl extends CameraExtensionSession {
synchronized (mInterfaceLock) {
mInternalRepeatingRequestEnabled = false;
mHandlerThread.quitSafely();
mHandlerThread.quit();
try {
mPreviewExtender.onDeInit();
@@ -1393,88 +1393,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;
}
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();
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;
}
} 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) {
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);
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);
}
if (entry.first != null) {
entry.first.close();
}
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();
}
}