diff options
author | xianming wang <mingwax@codeaurora.org> | 2017-09-14 17:09:37 +0800 |
---|---|---|
committer | xianming wang <mingwax@codeaurora.org> | 2017-11-06 14:10:04 +0800 |
commit | 85076fda04296ed1ba8f41bf1f5bdb4e56716749 (patch) | |
tree | 7f7eb791a5e29b2d60b3b948d1b3172b817ebfb8 /src | |
parent | 92d544bceec39e75ea43b74bb46f0a94537fec2a (diff) | |
download | android_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')
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; + } + } +} |