diff options
author | Jay Wang <jaywang@codeaurora.org> | 2016-08-24 17:53:16 -0700 |
---|---|---|
committer | Gerrit - the friendly Code Review server <code-review@localhost> | 2016-09-27 11:35:28 -0700 |
commit | 2edb34a53f8006cf2030956861b05e8e67673fdb (patch) | |
tree | 9467457b8d999aac8bd1dc85b34a28ae5a9cbaf7 | |
parent | 7d9eb158ed637e5cc8fc446fa1266f07ffb04ba9 (diff) | |
download | android_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
-rw-r--r-- | src/com/android/camera/CaptureModule.java | 16 | ||||
-rw-r--r-- | src/org/codeaurora/snapcam/filter/ClearSightImageProcessor.java | 106 |
2 files changed, 82 insertions, 40 deletions
diff --git a/src/com/android/camera/CaptureModule.java b/src/com/android/camera/CaptureModule.java index a8df9feb1..da4f131c5 100644 --- a/src/com/android/camera/CaptureModule.java +++ b/src/com/android/camera/CaptureModule.java @@ -3430,8 +3430,16 @@ public class CaptureModule implements CameraModule, PhotoController, } @Override - public void onClearSightSuccess() { + public void onReleaseShutterLock() { + Log.d(TAG, "onReleaseShutterLock"); + unlockFocus(BAYER_ID); + unlockFocus(MONO_ID); + } + + @Override + public void onClearSightSuccess(byte[] thumbnailBytes) { Log.d(TAG, "onClearSightSuccess"); + if(thumbnailBytes != null) mActivity.updateThumbnail(thumbnailBytes); mActivity.runOnUiThread(new Runnable() { @Override public void run() { @@ -3439,14 +3447,12 @@ public class CaptureModule implements CameraModule, PhotoController, Toast.LENGTH_SHORT).show(); } }); - - unlockFocus(BAYER_ID); - unlockFocus(MONO_ID); } @Override - public void onClearSightFailure() { + public void onClearSightFailure(byte[] thumbnailBytes) { Log.d(TAG, "onClearSightFailure"); + if(thumbnailBytes != null) mActivity.updateThumbnail(thumbnailBytes); mActivity.runOnUiThread(new Runnable() { @Override public void run() { 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, |