summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorxianming wang <mingwax@codeaurora.org>2017-09-14 17:09:37 +0800
committerxianming wang <mingwax@codeaurora.org>2017-11-06 14:10:04 +0800
commit85076fda04296ed1ba8f41bf1f5bdb4e56716749 (patch)
tree7f7eb791a5e29b2d60b3b948d1b3172b817ebfb8 /src
parent92d544bceec39e75ea43b74bb46f0a94537fec2a (diff)
downloadandroid_packages_apps_Snap-85076fda04296ed1ba8f41bf1f5bdb4e56716749.tar.gz
android_packages_apps_Snap-85076fda04296ed1ba8f41bf1f5bdb4e56716749.tar.bz2
android_packages_apps_Snap-85076fda04296ed1ba8f41bf1f5bdb4e56716749.zip
SnapdragonCamera: Complete the function of DeepZoom
Complete the function of DeepZoom, only support the 32 bit library. Does`t support the 64 bit library. CRs-Fixed: 2116533 Change-Id: If1dcf83080fe54a551140f80a85f84475a12ae74
Diffstat (limited to 'src')
-rwxr-xr-xsrc/com/android/camera/CaptureModule.java13
-rwxr-xr-xsrc/com/android/camera/SettingsManager.java3
-rw-r--r--src/com/android/camera/imageprocessor/PostProcessor.java7
-rwxr-xr-xsrc/com/android/camera/imageprocessor/filter/DeepZoomFilter.java178
4 files changed, 200 insertions, 1 deletions
diff --git a/src/com/android/camera/CaptureModule.java b/src/com/android/camera/CaptureModule.java
index 06d1974f0..6296cdcba 100755
--- a/src/com/android/camera/CaptureModule.java
+++ b/src/com/android/camera/CaptureModule.java
@@ -2340,6 +2340,8 @@ public class CaptureModule implements CameraModule, PhotoController,
return PostProcessor.FILTER_SHARPSHOOTER;
} else if (mode == SettingsManager.SCENE_MODE_BESTPICTURE_INT) {
return PostProcessor.FILTER_BESTPICTURE;
+ } else if (mode == SettingsManager.SCENE_MODE_DEEPZOOM_INT) {
+ return PostProcessor.FILTER_DEEPZOOM;
}
return PostProcessor.FILTER_NONE;
}
@@ -4637,6 +4639,17 @@ public class CaptureModule implements CameraModule, PhotoController,
return false;
}
+ private boolean isDeepZoom(String value) {
+ try {
+ int mode = Integer.parseInt(value);
+ if(mode == SettingsManager.SCENE_MODE_DEEPZOOM_INT) {
+ return true;
+ }
+ } catch(Exception e) {
+ }
+ return false;
+ }
+
private void updateFaceDetection() {
final String value = mSettingsManager.getValue(SettingsManager.KEY_FACE_DETECTION);
mActivity.runOnUiThread(new Runnable() {
diff --git a/src/com/android/camera/SettingsManager.java b/src/com/android/camera/SettingsManager.java
index c99702708..70d8a4ed0 100755
--- a/src/com/android/camera/SettingsManager.java
+++ b/src/com/android/camera/SettingsManager.java
@@ -57,6 +57,7 @@ import com.android.camera.imageprocessor.filter.SharpshooterFilter;
import com.android.camera.imageprocessor.filter.StillmoreFilter;
import com.android.camera.imageprocessor.filter.TrackingFocusFrameListener;
import com.android.camera.imageprocessor.filter.UbifocusFilter;
+import com.android.camera.imageprocessor.filter.DeepZoomFilter;
import com.android.camera.ui.ListMenu;
import com.android.camera.ui.PanoCaptureProcessView;
import com.android.camera.ui.TrackingFocusRenderer;
@@ -97,6 +98,7 @@ public class SettingsManager implements ListMenu.SettingsListener {
public static final int SCENE_MODE_SHARPSHOOTER_INT = SCENE_MODE_CUSTOM_START + 7;
public static final int SCENE_MODE_TRACKINGFOCUS_INT = SCENE_MODE_CUSTOM_START + 8;
public static final int SCENE_MODE_PROMODE_INT = SCENE_MODE_CUSTOM_START + 9;
+ public static final int SCENE_MODE_DEEPZOOM_INT = SCENE_MODE_CUSTOM_START + 10;
public static final String SCENE_MODE_DUAL_STRING = "100";
public static final String KEY_CAMERA_SAVEPATH = "pref_camera2_savepath_key";
public static final String KEY_RECORD_LOCATION = "pref_camera2_recordlocation_key";
@@ -1305,6 +1307,7 @@ public class SettingsManager implements ListMenu.SettingsListener {
if (BlurbusterFilter.isSupportedStatic()) modes.add(SCENE_MODE_BLURBUSTER_INT + "");
if (SharpshooterFilter.isSupportedStatic()) modes.add(SCENE_MODE_SHARPSHOOTER_INT + "");
if (TrackingFocusFrameListener.isSupportedStatic()) modes.add(SCENE_MODE_TRACKINGFOCUS_INT + "");
+ if (DeepZoomFilter.isSupportedStatic()) modes.add(SCENE_MODE_DEEPZOOM_INT + "");
modes.add("" + SCENE_MODE_PROMODE_INT);
for (int mode : sceneModes) {
modes.add("" + mode);
diff --git a/src/com/android/camera/imageprocessor/PostProcessor.java b/src/com/android/camera/imageprocessor/PostProcessor.java
index d70743be9..d0ce4a6a1 100644
--- a/src/com/android/camera/imageprocessor/PostProcessor.java
+++ b/src/com/android/camera/imageprocessor/PostProcessor.java
@@ -68,6 +68,7 @@ import com.android.camera.imageprocessor.filter.OptizoomFilter;
import com.android.camera.imageprocessor.filter.SharpshooterFilter;
import com.android.camera.imageprocessor.filter.StillmoreFilter;
import com.android.camera.imageprocessor.filter.UbifocusFilter;
+import com.android.camera.imageprocessor.filter.DeepZoomFilter;
import com.android.camera.ui.RotateTextToast;
import java.io.ByteArrayOutputStream;
@@ -99,7 +100,8 @@ public class PostProcessor{
public static final int FILTER_BESTPICTURE = 5;
public static final int FILTER_CHROMAFLASH = 6;
public static final int FILTER_BLURBUSTER = 7;
- public static final int FILTER_MAX = 8;
+ public static final int FILTER_DEEPZOOM = 8;
+ public static final int FILTER_MAX = 9;
//BestPicture requires 10 which is the biggest among filters
private static final int MAX_REQUIRED_IMAGE_NUM = 11;
@@ -875,6 +877,9 @@ public class PostProcessor{
case FILTER_CHROMAFLASH:
mFilter = new ChromaflashFilter(mController);
break;
+ case FILTER_DEEPZOOM:
+ mFilter = new DeepZoomFilter(mController);
+ break;
}
}
diff --git a/src/com/android/camera/imageprocessor/filter/DeepZoomFilter.java b/src/com/android/camera/imageprocessor/filter/DeepZoomFilter.java
new file mode 100755
index 000000000..003b4582f
--- /dev/null
+++ b/src/com/android/camera/imageprocessor/filter/DeepZoomFilter.java
@@ -0,0 +1,178 @@
+/*
+Copyright (c) 2017, The Linux Foundation. All rights reserved.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are
+met:
+ * Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+ * Redistributions in binary form must reproduce the above
+ copyright notice, this list of conditions and the following
+ disclaimer in the documentation and/or other materials provided
+ with the distribution.
+ * Neither the name of The Linux Foundation nor the names of its
+ contributors may be used to endorse or promote products derived
+ from this software without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED
+WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT
+ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS
+BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
+BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
+WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
+OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
+IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+package com.android.camera.imageprocessor.filter;
+
+import android.graphics.Rect;
+import android.hardware.camera2.CameraAccessException;
+import android.hardware.camera2.CameraCaptureSession;
+import android.hardware.camera2.CameraCharacteristics;
+import android.hardware.camera2.CameraDevice;
+import android.hardware.camera2.CaptureRequest;
+import android.hardware.camera2.CaptureResult;
+import android.hardware.camera2.TotalCaptureResult;
+import android.os.Handler;
+import android.util.Log;
+
+import com.android.camera.CaptureModule;
+
+import java.nio.ByteBuffer;
+import java.util.ArrayList;
+import java.util.List;
+
+public class DeepZoomFilter implements ImageFilter{
+ public static final int NUM_REQUIRED_IMAGE = 1;
+ private int mWidth;
+ private int mHeight;
+ private int mStrideY;
+ private int mStrideVU;
+ private static String TAG = "DeepZoomFilter";
+
+ private static boolean mIsSupported = false;
+ private ByteBuffer mOutBuf;
+ private CaptureModule mModule;
+ private int mImageNum = -1;
+
+ private static void Log(String msg) {
+ if(DEBUG) {
+ Log.d(TAG, msg);
+ }
+ }
+
+ public DeepZoomFilter(CaptureModule module) {
+ mModule = module;
+ }
+
+ @Override
+ public List<CaptureRequest> setRequiredImages(CaptureRequest.Builder builder) {
+ List<CaptureRequest> list = new ArrayList<CaptureRequest>();
+ for(int i=0; i < NUM_REQUIRED_IMAGE; i++) {
+ list.add(builder.build());
+ }
+ return list;
+ }
+
+ @Override
+ public String getStringName() {
+ return TAG;
+ }
+
+ @Override
+ public int getNumRequiredImage() {
+ return NUM_REQUIRED_IMAGE;
+ }
+
+ @Override
+ public void init(int width, int height, int strideY, int strideVU) {
+ Log("init");
+ mWidth = width/2*2;
+ mHeight = height/2*2;
+ mStrideY = strideY/2*2;
+ mStrideVU = strideVU/2*2;
+ mOutBuf = ByteBuffer.allocate(mStrideY*mHeight*3/2);
+ mImageNum = -1;
+ Log("width: "+mWidth+" height: "+mHeight+" strideY: "+mStrideY+" strideVU: "+mStrideVU);
+ nativeInit(mWidth, mHeight, mStrideY, mStrideVU,
+ 0, 0, mWidth, mHeight, NUM_REQUIRED_IMAGE);
+ }
+
+ @Override
+ public void deinit() {
+ Log("deinit");
+ mOutBuf = null;
+ mImageNum = -1;
+ nativeDeinit();
+ }
+
+ @Override
+ public void addImage(ByteBuffer bY, ByteBuffer bVU, int imageNum, Object param) {
+ Log("addImage imageNum :" + imageNum);
+ int yActualSize = bY.remaining();
+ int vuActualSize = bVU.remaining();
+ mImageNum = imageNum;
+ int status = nativeAddImage(bY, bVU, yActualSize, vuActualSize, imageNum);
+ Log("addImage status :" + status);
+ if(status != 0) {
+ Log.e(TAG, "Fail to add image");
+ }
+ }
+
+ @Override
+ public ResultImage processImage() {
+ float zoomValue = mModule.getZoomValue();
+ Log("processImage zoomValue :" + zoomValue);
+ int[] roi = new int[4];
+ int status = nativeProcessImage(mOutBuf.array(), zoomValue, roi);
+ Log("processImage done status :" + status);
+ mImageNum = -1;
+ if(status < 0) { //In failure case, library will return the first image as it is.
+ Log.w(TAG, "Fail to process the image.");
+ }
+ return new ResultImage(mOutBuf, new Rect(roi[0], roi[1], roi[0]+roi[2], roi[1] + roi[3]), mWidth, mHeight, mStrideY);
+ }
+
+ @Override
+ public boolean isSupported() {
+ return mIsSupported;
+ }
+
+ @Override
+ public boolean isFrameListener() {
+ return false;
+ }
+
+ @Override
+ public boolean isManualMode() {
+ return false;
+ }
+
+ @Override
+ public void manualCapture(final CaptureRequest.Builder builder, final CameraCaptureSession captureSession,
+ final CameraCaptureSession.CaptureCallback callback, final Handler handler) throws CameraAccessException {
+ }
+
+ public static boolean isSupportedStatic() {
+ return mIsSupported;
+ }
+
+ private native int nativeInit(int width, int height, int yStride, int vuStride,
+ int roiX, int roiY, int roiW, int roiH, int numImages);
+ private native int nativeDeinit();
+ private native int nativeAddImage(ByteBuffer yB, ByteBuffer vuB, int ySize, int vuSize, int imageNum);
+ private native int nativeProcessImage(byte[] buffer, float zoomValue, int[] roi);
+
+ static {
+ try {
+ System.loadLibrary("jni_deepzoom");
+ mIsSupported = true;
+ }catch(UnsatisfiedLinkError e) {
+ Log.d(TAG, e.toString());
+ mIsSupported = false;
+ }
+ }
+}