Merge "Camera: Quit extension handler thread during release"
This commit is contained in:
@@ -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();
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user