summaryrefslogtreecommitdiffstats
path: root/src/com/android/camera/imageprocessor
diff options
context:
space:
mode:
authorJack Yoo <jyoo@codeaurora.org>2016-09-06 10:00:42 -0700
committerJay Wang <jaywang@codeaurora.org>2016-09-27 15:54:47 -0700
commit6b4a36b3b4f55c8dd2e18d8f84c4106ce0590f50 (patch)
tree04b8eb0f8ec8871658bd15e1443390b653bc790b /src/com/android/camera/imageprocessor
parent21576c048827ed0f376d25a9487d43a0d6ca475f (diff)
downloadandroid_packages_apps_Snap-6b4a36b3b4f55c8dd2e18d8f84c4106ce0590f50.tar.gz
android_packages_apps_Snap-6b4a36b3b4f55c8dd2e18d8f84c4106ce0590f50.tar.bz2
android_packages_apps_Snap-6b4a36b3b4f55c8dd2e18d8f84c4106ce0590f50.zip
SnapdragonCamera: Init optimization and concurrency fixes
1. Frameprocessor init call to be in parallel. 2. Fix concurrency issue on filters with background saving feature. 3. Various other capture module concurrency issue fixes. Change-Id: Icce713b0d6e4ea1c15bbe9ac2cfb3977b0a9c1d7 CRs-Fixed: 1067848
Diffstat (limited to 'src/com/android/camera/imageprocessor')
-rw-r--r--src/com/android/camera/imageprocessor/FrameProcessor.java35
-rw-r--r--src/com/android/camera/imageprocessor/PostProcessor.java17
-rw-r--r--src/com/android/camera/imageprocessor/filter/BestpictureFilter.java15
-rw-r--r--src/com/android/camera/imageprocessor/filter/UbifocusFilter.java44
4 files changed, 81 insertions, 30 deletions
diff --git a/src/com/android/camera/imageprocessor/FrameProcessor.java b/src/com/android/camera/imageprocessor/FrameProcessor.java
index 4bee19194..193e8ee17 100644
--- a/src/com/android/camera/imageprocessor/FrameProcessor.java
+++ b/src/com/android/camera/imageprocessor/FrameProcessor.java
@@ -90,6 +90,7 @@ public class FrameProcessor {
public static final int LISTENER_TRACKING_FOCUS = 2;
private CaptureModule mModule;
private boolean mIsVideoOn = false;
+ private boolean mIsInitialized = false;
public FrameProcessor(Activity activity, CaptureModule module) {
mActivity = activity;
@@ -98,7 +99,7 @@ public class FrameProcessor {
mFinalFilters = new ArrayList<ImageFilter>();
}
- public void init(Size previewDim) {
+ private void init(Size previewDim) {
mIsActive = true;
mSize = previewDim;
synchronized (mAllocationLock) {
@@ -135,6 +136,7 @@ public class FrameProcessor {
mTask = new ProcessingTask();
mInputImageReader.setOnImageAvailableListener(mTask, mProcessingHandler);
mIsAllocationEverUsed = false;
+ mIsInitialized = true;
}
}
@@ -177,13 +179,22 @@ public class FrameProcessor {
mFinalFilters = new ArrayList<ImageFilter>();
}
- public void onOpen(ArrayList<Integer> filterIds) {
+ public void onOpen(ArrayList<Integer> filterIds, final Size size) {
cleanFilterSet();
if (filterIds != null) {
for (Integer i : filterIds) {
addFilter(i.intValue());
}
}
+ if(isFrameFilterEnabled() || isFrameListnerEnabled()) {
+ new Thread() {
+ public void run() {
+ init(size);
+ }
+ }.start();
+ } else {
+ mIsInitialized = true;
+ }
}
private void addFilter(int filterId) {
@@ -203,8 +214,18 @@ public class FrameProcessor {
}
+ private void waitForInitialization() {
+ while(!mIsInitialized) {
+ try {
+ Thread.sleep(10);
+ } catch(InterruptedException e) {
+ }
+ }
+ }
+
public void onClose() {
mIsActive = false;
+ waitForInitialization();
synchronized (mAllocationLock) {
if (mIsAllocationEverUsed) {
if (mInputAllocation != null) {
@@ -228,6 +249,7 @@ public class FrameProcessor {
mOutputAllocation = null;
mInputAllocation = null;
mVideoOutputAllocation = null;
+ mIsInitialized = false;
}
if (mProcessingThread != null) {
mProcessingThread.quitSafely();
@@ -299,7 +321,15 @@ public class FrameProcessor {
return true;
}
+ public boolean isFrameListnerEnabled() {
+ if (mPreviewFilters.size() == 0) {
+ return false;
+ }
+ return true;
+ }
+
public void setOutputSurface(Surface surface) {
+ waitForInitialization();
mSurfaceAsItIs = surface;
if (mFinalFilters.size() != 0) {
mOutputAllocation.setSurface(surface);
@@ -307,6 +337,7 @@ public class FrameProcessor {
}
public void setVideoOutputSurface(Surface surface) {
+ waitForInitialization();
if (surface == null) {
synchronized (mAllocationLock) {
if (mVideoOutputAllocation != null) {
diff --git a/src/com/android/camera/imageprocessor/PostProcessor.java b/src/com/android/camera/imageprocessor/PostProcessor.java
index 6a6265316..817ea246d 100644
--- a/src/com/android/camera/imageprocessor/PostProcessor.java
+++ b/src/com/android/camera/imageprocessor/PostProcessor.java
@@ -214,7 +214,8 @@ public class PostProcessor{
mImageReader = imageReader;
}
ZSLQueue.ImageItem imageItem = mZSLQueue.tryToGetMatchingItem();
- if(mController.getPreviewCaptureResult().get(CaptureResult.CONTROL_AE_STATE) == CameraMetadata.CONTROL_AE_STATE_FLASH_REQUIRED) {
+ if(mController.getPreviewCaptureResult() == null ||
+ mController.getPreviewCaptureResult().get(CaptureResult.CONTROL_AE_STATE) == CameraMetadata.CONTROL_AE_STATE_FLASH_REQUIRED) {
if(DEBUG_ZSL) Log.d(TAG, "Flash required image");
imageItem = null;
}
@@ -226,7 +227,7 @@ public class PostProcessor{
reprocessImage(imageItem);
return true;
} else {
- if(DEBUG_ZSL) Log.d(TAG, "No good item in queue, reigster the request for the future");
+ if(DEBUG_ZSL) Log.d(TAG, "No good item in queue, register the request for the future");
mZSLQueue.addPictureRequest();
return false;
}
@@ -332,8 +333,12 @@ public class PostProcessor{
}
public void manualCapture(CaptureRequest.Builder builder, CameraCaptureSession captureSession,
- CameraCaptureSession.CaptureCallback callback, Handler handler) throws CameraAccessException {
- mFilter.manualCapture(builder, captureSession, callback, handler);
+ CameraCaptureSession.CaptureCallback callback, Handler handler) throws CameraAccessException{
+ try {
+ mFilter.manualCapture(builder, captureSession, callback, handler);
+ } catch(IllegalStateException e) {
+ Log.w(TAG, "Session is closed while taking manual pictures ");
+ }
}
public boolean isFilterOn() {
@@ -580,7 +585,7 @@ public class PostProcessor{
mHandler.post(new Runnable() {
public void run() {
synchronized (lock) {
- if(!handler.isRunning) {
+ if(!handler.isRunning || mStatus != STATUS.BUSY) {
return;
}
ByteBuffer yBuf = image.getPlanes()[0].getBuffer();
@@ -630,7 +635,7 @@ public class PostProcessor{
private void processImage(final String title, final long date,
final MediaSaveService.OnMediaSavedListener mediaSavedListener,
final ContentResolver contentResolver) {
- if(mHandler == null || !mHandler.isRunning) {
+ if(mHandler == null || !mHandler.isRunning || mStatus != STATUS.BUSY) {
return;
}
final ProcessorHandler handler = mHandler;
diff --git a/src/com/android/camera/imageprocessor/filter/BestpictureFilter.java b/src/com/android/camera/imageprocessor/filter/BestpictureFilter.java
index 638d037ce..d9c9f5cb8 100644
--- a/src/com/android/camera/imageprocessor/filter/BestpictureFilter.java
+++ b/src/com/android/camera/imageprocessor/filter/BestpictureFilter.java
@@ -78,6 +78,8 @@ public class BestpictureFilter implements ImageFilter {
private PhotoModule.NamedImages mNamedImages;
private ByteBuffer mBY;
private ByteBuffer mBVU;
+ private Object mClosingLock = new Object();
+ private boolean mIsOn = false;
private static void Log(String msg) {
if (DEBUG) {
@@ -117,12 +119,16 @@ public class BestpictureFilter implements ImageFilter {
mHeight = height/2*2;
mStrideY = strideY/2*2;
mStrideVU = strideVU / 2 * 2;
+ mIsOn = true;
Log("width: " + mWidth + " height: " + mHeight + " strideY: " + mStrideY + " strideVU: " + mStrideVU);
}
@Override
public void deinit() {
Log("deinit");
+ synchronized (mClosingLock) {
+ mIsOn = false;
+ }
}
@Override
@@ -136,8 +142,13 @@ public class BestpictureFilter implements ImageFilter {
}
new Thread() {
public void run() {
- saveToPrivateFile(imageNum, nv21ToJpeg(bY, bVU, new Rect(0, 0, mWidth, mHeight), mOrientation));
- mSavedCount++;
+ synchronized (mClosingLock) {
+ if (!mIsOn) {
+ return;
+ }
+ saveToPrivateFile(imageNum, nv21ToJpeg(bY, bVU, new Rect(0, 0, mWidth, mHeight), mOrientation));
+ mSavedCount++;
+ }
}
}.start();
}
diff --git a/src/com/android/camera/imageprocessor/filter/UbifocusFilter.java b/src/com/android/camera/imageprocessor/filter/UbifocusFilter.java
index c68b5091e..37ee1dc27 100644
--- a/src/com/android/camera/imageprocessor/filter/UbifocusFilter.java
+++ b/src/com/android/camera/imageprocessor/filter/UbifocusFilter.java
@@ -73,6 +73,7 @@ public class UbifocusFilter implements ImageFilter {
private CameraActivity mActivity;
private int mOrientation = 0;
private float mMinFocusDistance = -1f;
+ private Object mClosingLock = new Object();
final String[] NAMES = {"00.jpg", "01.jpg", "02.jpg", "03.jpg",
"04.jpg", "DepthMapImage.y", "AllFocusImage.jpg"};
@@ -119,8 +120,10 @@ public class UbifocusFilter implements ImageFilter {
@Override
public void deinit() {
Log("deinit");
- mOutBuf = null;
- nativeDeinit();
+ synchronized (mClosingLock) {
+ mOutBuf = null;
+ nativeDeinit();
+ }
}
@Override
@@ -138,8 +141,13 @@ public class UbifocusFilter implements ImageFilter {
}
new Thread() {
public void run() {
- saveToPrivateFile(imageNum, nv21ToJpeg(bY, bVU, new Rect(0, 0, mWidth, mHeight), mOrientation));
- mSavedCount++;
+ synchronized (mClosingLock) {
+ if(mOutBuf == null) {
+ return;
+ }
+ saveToPrivateFile(imageNum, nv21ToJpeg(bY, bVU, new Rect(0, 0, mWidth, mHeight), mOrientation));
+ mSavedCount++;
+ }
}
}.start();
}
@@ -247,22 +255,18 @@ public class UbifocusFilter implements ImageFilter {
}
private void saveToPrivateFile(final int index, final byte[] bytes) {
- new Thread() {
- public void run() {
- String filesPath = mActivity.getFilesDir()+"/Ubifocus";
- File file = new File(filesPath);
- if(!file.exists()) {
- file.mkdir();
- }
- file = new File(filesPath+"/"+NAMES[index]);
- try {
- FileOutputStream out = new FileOutputStream(file);
- out.write(bytes, 0, bytes.length);
- out.close();
- } catch (Exception e) {
- }
- }
- }.start();
+ String filesPath = mActivity.getFilesDir()+"/Ubifocus";
+ File file = new File(filesPath);
+ if(!file.exists()) {
+ file.mkdir();
+ }
+ file = new File(filesPath+"/"+NAMES[index]);
+ try {
+ FileOutputStream out = new FileOutputStream(file);
+ out.write(bytes, 0, bytes.length);
+ out.close();
+ } catch (Exception e) {
+ }
}
private native int nativeInit(int width, int height, int yStride, int vuStride, int numImages);