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,6 +1252,7 @@ public final class CameraExtensionSessionImpl extends CameraExtensionSession {
@Override @Override
public void onImageAvailable(ImageReader reader) { public void onImageAvailable(ImageReader reader) {
Image img; Image img;
synchronized (mInterfaceLock) {
try { try {
img = reader.acquireNextImage(); img = reader.acquireNextImage();
} catch (IllegalStateException e) { } catch (IllegalStateException e) {
@@ -1266,7 +1267,8 @@ public final class CameraExtensionSessionImpl extends CameraExtensionSession {
Long timestamp = img.getTimestamp(); Long timestamp = img.getTimestamp();
if (mImageListenerMap.containsKey(timestamp)) { if (mImageListenerMap.containsKey(timestamp)) {
Pair<Image, OnImageAvailableListener> entry = mImageListenerMap.remove(timestamp); Pair<Image, OnImageAvailableListener> entry = mImageListenerMap.remove(
timestamp);
if (entry.second != null) { if (entry.second != null) {
entry.second.onImageAvailable(reader, img); entry.second.onImageAvailable(reader, img);
} else { } else {
@@ -1274,13 +1276,15 @@ public final class CameraExtensionSessionImpl extends CameraExtensionSession {
img.close(); img.close();
} }
} else { } else {
mImageListenerMap.put(img.getTimestamp(), new Pair<>(img, null)); mImageListenerMap.put(timestamp, new Pair<>(img, null));
} }
notifyDroppedImages(timestamp); notifyDroppedImages(timestamp);
} }
}
private void notifyDroppedImages(long timestamp) { private void notifyDroppedImages(long timestamp) {
synchronized (mInterfaceLock) {
Set<Long> timestamps = mImageListenerMap.keySet(); Set<Long> timestamps = mImageListenerMap.keySet();
ArrayList<Long> removedTs = new ArrayList<>(); ArrayList<Long> removedTs = new ArrayList<>();
for (long ts : timestamps) { for (long ts : timestamps) {
@@ -1300,10 +1304,13 @@ public final class CameraExtensionSessionImpl extends CameraExtensionSession {
mImageListenerMap.remove(ts); mImageListenerMap.remove(ts);
} }
} }
}
public void registerListener(Long timestamp, OnImageAvailableListener listener) { public void registerListener(Long timestamp, OnImageAvailableListener listener) {
synchronized (mInterfaceLock) {
if (mImageListenerMap.containsKey(timestamp)) { if (mImageListenerMap.containsKey(timestamp)) {
Pair<Image, OnImageAvailableListener> entry = mImageListenerMap.remove(timestamp); Pair<Image, OnImageAvailableListener> entry = mImageListenerMap.remove(
timestamp);
if (entry.first != null) { if (entry.first != null) {
listener.onImageAvailable(mImageReader, entry.first); listener.onImageAvailable(mImageReader, entry.first);
if (mOutOfBuffers) { if (mOutOfBuffers) {
@@ -1319,9 +1326,11 @@ public final class CameraExtensionSessionImpl extends CameraExtensionSession {
mImageListenerMap.put(timestamp, new Pair<>(null, listener)); mImageListenerMap.put(timestamp, new Pair<>(null, listener));
} }
} }
}
@Override @Override
public void close() { public void close() {
synchronized (mInterfaceLock) {
for (Pair<Image, OnImageAvailableListener> entry : mImageListenerMap.values()) { for (Pair<Image, OnImageAvailableListener> entry : mImageListenerMap.values()) {
if (entry.first != null) { if (entry.first != null) {
entry.first.close(); entry.first.close();
@@ -1336,6 +1345,7 @@ public final class CameraExtensionSessionImpl extends CameraExtensionSession {
mImageListenerMap.clear(); mImageListenerMap.clear();
} }
} }
}
private class CloseRequestHandler extends CameraCaptureSession.CaptureCallback { private class CloseRequestHandler extends CameraCaptureSession.CaptureCallback {
private final CameraOutputImageCallback mImageCallback; private final CameraOutputImageCallback mImageCallback;