Merge "Camera: Quit extension handler thread during release" into udc-dev
This commit is contained in:
committed by
Android (Google) Code Review
commit
f34e90c038
@@ -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();
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user