summaryrefslogtreecommitdiffstats
path: root/src/org/codeaurora
diff options
context:
space:
mode:
authorJay Wang <jaywang@codeaurora.org>2016-08-24 17:53:16 -0700
committerGerrit - the friendly Code Review server <code-review@localhost>2016-09-27 11:35:28 -0700
commit2edb34a53f8006cf2030956861b05e8e67673fdb (patch)
tree9467457b8d999aac8bd1dc85b34a28ae5a9cbaf7 /src/org/codeaurora
parent7d9eb158ed637e5cc8fc446fa1266f07ffb04ba9 (diff)
downloadandroid_packages_apps_Snap-2edb34a53f8006cf2030956861b05e8e67673fdb.tar.gz
android_packages_apps_Snap-2edb34a53f8006cf2030956861b05e8e67673fdb.tar.bz2
android_packages_apps_Snap-2edb34a53f8006cf2030956861b05e8e67673fdb.zip
SnapdragonCamera: Ensure smooth quit during cs processing
Ensure a smooth quit transition during Clearsight processing. Move image reader/writer disposal to after handler quit. Don't toast Clearsight success/fail until after all tasks are complete. CRs-Fixed: 1058833 Change-Id: I6cf6733051d1947ea65a003b9bacb9d575c6ef67
Diffstat (limited to 'src/org/codeaurora')
-rw-r--r--src/org/codeaurora/snapcam/filter/ClearSightImageProcessor.java106
1 files changed, 71 insertions, 35 deletions
diff --git a/src/org/codeaurora/snapcam/filter/ClearSightImageProcessor.java b/src/org/codeaurora/snapcam/filter/ClearSightImageProcessor.java
index 0633b0c56..a968e3bc6 100644
--- a/src/org/codeaurora/snapcam/filter/ClearSightImageProcessor.java
+++ b/src/org/codeaurora/snapcam/filter/ClearSightImageProcessor.java
@@ -141,6 +141,7 @@ public class ClearSightImageProcessor {
private int mNumFrameCount;
private boolean mDumpImages;
private boolean mDumpYUV;
+ private boolean mIsClosing;
private static ClearSightImageProcessor mInstance;
@@ -179,6 +180,8 @@ public class ClearSightImageProcessor {
public void init(StreamConfigurationMap map, int width, int height,
Context context, OnMediaSavedListener mediaListener) {
+ Log.d(TAG, "init() start");
+ mIsClosing = false;
mImageProcessThread = new HandlerThread("CameraImageProcess");
mImageProcessThread.start();
mClearsightRegisterThread = new HandlerThread("ClearsightRegister");
@@ -214,26 +217,17 @@ public class ClearSightImageProcessor {
} catch (CameraAccessException e) {
e.printStackTrace();
}
+ Log.d(TAG, "init() done");
}
public void close() {
- for(int i=0; i<mImageReader.length; i++) {
- if (null != mImageReader[i]) {
- mImageReader[i].close();
- mImageReader[i] = null;
- }
- if (null != mEncodeImageReader[i]) {
- mEncodeImageReader[i].close();
- mEncodeImageReader[i] = null;
- }
- if (null != mImageWriter[i]) {
- mImageWriter[i].close();
- mImageWriter[i] = null;
- }
- }
-
+ Log.d(TAG, "close() start");
+ mIsClosing = true;
+ // use quit instead of quitSafely
+ // because we don't want to process any more queued events.
+ // just clean up and exit.
if(mImageProcessThread != null) {
- mImageProcessThread.quitSafely();
+ mImageProcessThread.quit();
try {
mImageProcessThread.join();
@@ -245,7 +239,7 @@ public class ClearSightImageProcessor {
}
if(mClearsightRegisterThread != null) {
- mClearsightRegisterThread.quitSafely();
+ mClearsightRegisterThread.quit();
try {
mClearsightRegisterThread.join();
@@ -257,7 +251,7 @@ public class ClearSightImageProcessor {
}
if(mClearsightProcessThread != null) {
- mClearsightProcessThread.quitSafely();
+ mClearsightProcessThread.quit();
try {
mClearsightProcessThread.join();
@@ -269,7 +263,7 @@ public class ClearSightImageProcessor {
}
if(mImageEncodeThread != null) {
- mImageEncodeThread.quitSafely();
+ mImageEncodeThread.quit();
try {
mImageEncodeThread.join();
@@ -280,11 +274,27 @@ public class ClearSightImageProcessor {
}
}
+ for(int i=0; i<mImageReader.length; i++) {
+ if (null != mImageReader[i]) {
+ mImageReader[i].close();
+ mImageReader[i] = null;
+ }
+ if (null != mEncodeImageReader[i]) {
+ mEncodeImageReader[i].close();
+ mEncodeImageReader[i] = null;
+ }
+ if (null != mImageWriter[i]) {
+ mImageWriter[i].close();
+ mImageWriter[i] = null;
+ }
+ }
+
mCaptureSessions[CAM_TYPE_MONO] = null;
mCaptureSessions[CAM_TYPE_BAYER] = null;
mMediaSaveService = null;
mMediaSavedListener = null;
ClearSightNativeEngine.getInstance().close();
+ Log.d(TAG, "close() done");
}
public void setCallback(Callback callback) {
@@ -337,8 +347,11 @@ public class ClearSightImageProcessor {
CaptureRequest request,
TotalCaptureResult result) {
Log.d(TAG, "captureStillPicture onCaptureCompleted: " + cam);
- mImageProcessHandler.obtainMessage(MSG_NEW_CAPTURE_RESULT,
- cam, 0, result).sendToTarget();
+ if(isClosing())
+ Log.d(TAG, "captureStillPicture onCaptureCompleted - closing");
+ else
+ mImageProcessHandler.obtainMessage(MSG_NEW_CAPTURE_RESULT,
+ cam, 0, result).sendToTarget();
}
@Override
@@ -346,8 +359,11 @@ public class ClearSightImageProcessor {
CaptureRequest request,
CaptureFailure result) {
Log.d(TAG, "captureStillPicture onCaptureFailed: " + cam);
- mImageProcessHandler.obtainMessage(MSG_NEW_CAPTURE_FAIL,
- cam, 0, result).sendToTarget();
+ if(isClosing())
+ Log.d(TAG, "captureStillPicture onCaptureFailed - closing");
+ else
+ mImageProcessHandler.obtainMessage(MSG_NEW_CAPTURE_FAIL,
+ cam, 0, result).sendToTarget();
}
@Override
@@ -369,15 +385,22 @@ public class ClearSightImageProcessor {
session.captureBurst(burstList, captureCallback, captureCallbackHandler);
}
+ private boolean isClosing() {
+ return mIsClosing;
+ }
+
private ImageReader createImageReader(final int cam, int width, int height) {
ImageReader reader = ImageReader.newInstance(width, height,
ImageFormat.YUV_420_888, mNumBurstCount + mNumFrameCount);
reader.setOnImageAvailableListener(new OnImageAvailableListener() {
@Override
public void onImageAvailable(ImageReader reader) {
- Log.d(TAG, "image available for cam: " + cam);
- mImageProcessHandler.obtainMessage(
- MSG_NEW_IMG, cam, 0, reader.acquireNextImage()).sendToTarget();
+ Log.d(TAG, "onImageAvailable for cam: " + cam);
+ if(isClosing())
+ Log.d(TAG, "onImageAvailable - closing");
+ else
+ mImageProcessHandler.obtainMessage(
+ MSG_NEW_IMG, cam, 0, reader.acquireNextImage()).sendToTarget();
}
}, null);
@@ -400,8 +423,9 @@ public class ClearSightImageProcessor {
}
public interface Callback {
- public void onClearSightSuccess();
- public void onClearSightFailure();
+ public void onReleaseShutterLock();
+ public void onClearSightSuccess(byte[] thumnailBytes);
+ public void onClearSightFailure(byte[] thumnailBytes);
}
private static class ReprocessableImage {
@@ -442,6 +466,8 @@ public class ClearSightImageProcessor {
@Override
public void handleMessage(Message msg) {
+ if(isClosing()) return;
+
switch (msg.what) {
case MSG_START_CAPTURE:
mCaptureDone = false;
@@ -454,8 +480,6 @@ public class ClearSightImageProcessor {
mClearsightRegisterHandler.obtainMessage(MSG_START_CAPTURE,
0, 0, mNamedEntity).sendToTarget();
break;
- case MSG_END_CAPTURE:
- break;
case MSG_NEW_IMG:
processImg(msg);
break;
@@ -761,6 +785,8 @@ public class ClearSightImageProcessor {
@Override
public void handleMessage(Message msg) {
+ if(isClosing()) return;
+
switch (msg.what) {
case MSG_START_CAPTURE:
mNamedEntity = (NamedEntity) msg.obj;
@@ -800,6 +826,8 @@ public class ClearSightImageProcessor {
@Override
public void handleMessage(Message msg) {
+ if(isClosing()) return;
+
switch (msg.what) {
case MSG_START_CAPTURE:
processClearSight((NamedEntity) msg.obj);
@@ -819,7 +847,7 @@ public class ClearSightImageProcessor {
if(processInit) {
if(mCallback != null)
- mCallback.onClearSightSuccess();
+ mCallback.onReleaseShutterLock();
Image encodeImage = mImageWriter[CAM_TYPE_BAYER].dequeueInputImage();
ClearSightNativeEngine.ClearsightImage csImage = new ClearsightImage(encodeImage);
@@ -832,9 +860,6 @@ public class ClearSightImageProcessor {
csImage = null;
encodeImage.close();
}
- } else {
- if(mCallback != null)
- mCallback.onClearSightFailure();
}
mImageEncodeHandler.obtainMessage(MSG_END_CAPTURE,
@@ -950,6 +975,8 @@ public class ClearSightImageProcessor {
@Override
public void handleMessage(Message msg) {
+ if(isClosing()) return;
+
switch (msg.what) {
case MSG_END_CAPTURE:
Log.d(TAG, "ImageEncodeEvent - END_CAPTURE");
@@ -1001,12 +1028,21 @@ public class ClearSightImageProcessor {
height = mClearSightImage.getHeight();
}
+ byte[] clearSightBytes = getJpegData(mClearSightImage);
byte[] bayerBytes = getJpegData(mBayerImage);
ExifInterface exif = Exif.getExif(bayerBytes);
int orientation = Exif.getOrientation(exif);
+ if(clearSightBytes != null) {
+ if(mCallback != null) mCallback.onClearSightSuccess(clearSightBytes);
+ } else if (bayerBytes != null) {
+ if(mCallback != null) mCallback.onClearSightFailure(bayerBytes);
+ } else {
+ if(mCallback != null) mCallback.onClearSightFailure(null);
+ }
+
mMediaSaveService.addMpoImage(
- getJpegData(mClearSightImage),
+ clearSightBytes,
bayerBytes,
getJpegData(mMonoImage), width, height, title,
date, null, orientation, mMediaSavedListener,