diff options
-rw-r--r-- | src/com/android/camera/CaptureModule.java | 30 | ||||
-rw-r--r-- | src/com/android/camera/imageprocessor/PostProcessor.java | 12 | ||||
-rw-r--r-- | src/com/android/camera/util/VendorTagUtil.java | 134 | ||||
-rwxr-xr-x | src/org/codeaurora/snapcam/filter/ClearSightImageProcessor.java | 10 |
4 files changed, 152 insertions, 34 deletions
diff --git a/src/com/android/camera/CaptureModule.java b/src/com/android/camera/CaptureModule.java index 6b9c6869e..7fbabfb95 100644 --- a/src/com/android/camera/CaptureModule.java +++ b/src/com/android/camera/CaptureModule.java @@ -105,11 +105,12 @@ import com.android.camera.ui.CountDownView; import com.android.camera.ui.ModuleSwitcher; import com.android.camera.ui.RotateTextToast; import com.android.camera.ui.TrackingFocusRenderer; +import com.android.camera.util.ApiHelper; import com.android.camera.util.CameraUtil; import com.android.camera.util.PersistUtil; import com.android.camera.util.SettingTranslation; -import com.android.camera.util.ApiHelper; import com.android.camera.util.AccessibilityUtils; +import com.android.camera.util.VendorTagUtil; import com.android.internal.util.MemInfoReader; import org.codeaurora.snapcam.R; @@ -210,26 +211,9 @@ public class CaptureModule implements CameraModule, PhotoController, CaptureRequest.Key<Integer> BayerMonoLinkSessionIdKey = new CaptureRequest.Key<>("org.codeaurora.qcamera3.dualcam_link_meta_data" + ".related_camera_id", Integer.class); - public static CaptureRequest.Key<Integer> CdsModeKey = - new CaptureRequest.Key<>("org.codeaurora.qcamera3.CDS.cds_mode", Integer.class); - public static CaptureRequest.Key<Byte> JpegCropEnableKey = - new CaptureRequest.Key<>("org.codeaurora.qcamera3.jpeg_encode_crop.enable", - Byte.class); - public static CaptureRequest.Key<int[]> JpegCropRectKey = - new CaptureRequest.Key<>("org.codeaurora.qcamera3.jpeg_encode_crop.rect", - int[].class); - public static CaptureRequest.Key<int[]> JpegRoiRectKey = - new CaptureRequest.Key<>("org.codeaurora.qcamera3.jpeg_encode_crop.roi", - int[].class); public static CameraCharacteristics.Key<Byte> MetaDataMonoOnlyKey = new CameraCharacteristics.Key<>("org.codeaurora.qcamera3.sensor_meta_data.is_mono_only", Byte.class); - public static CaptureRequest.Key<Integer> SELECT_PRIORITY = - new CaptureRequest.Key<>("org.codeaurora.qcamera3.iso_exp_priority.select_priority", - Integer.class); - public static CaptureRequest.Key<Long> ISO_EXP = - new CaptureRequest.Key<>("org.codeaurora.qcamera3.iso_exp_priority.use_iso_exp_priority", - Long.class); public static CameraCharacteristics.Key<int[]> InstantAecAvailableModes = new CameraCharacteristics.Key<>("org.codeaurora.qcamera3.instant_aec.instant_aec_available_modes", int[].class); public static final CaptureRequest.Key<Integer> INSTANT_AEC_MODE = @@ -1525,7 +1509,7 @@ public class CaptureModule implements CameraModule, PhotoController, addPreviewSurface(captureBuilder, null, id); captureBuilder.set(CaptureRequest.CONTROL_AF_MODE, mControlAFMode); captureBuilder.set(CaptureRequest.CONTROL_AF_TRIGGER, CaptureRequest.CONTROL_AF_TRIGGER_IDLE); - captureBuilder.set(CdsModeKey, 2); // CDS 0-OFF, 1-ON, 2-AUTO + VendorTagUtil.setCdsMode(captureBuilder, 2);// CDS 0-OFF, 1-ON, 2-AUTO applySettingsForCapture(captureBuilder, id); if(csEnabled) { @@ -4157,8 +4141,8 @@ public class CaptureModule implements CameraModule, PhotoController, String value = mSettingsManager.getValue(SettingsManager.KEY_ISO); if (value == null) return; if (value.equals("auto")) { - request.set(SELECT_PRIORITY, 0); - request.set(ISO_EXP, 0L); + VendorTagUtil.setIsoExpPrioritySelectPriority(request, 0); + VendorTagUtil.setIsoExpPriority(request, 0L); if (request.get(CaptureRequest.SENSOR_EXPOSURE_TIME) == null) { request.set(CaptureRequest.SENSOR_EXPOSURE_TIME, mIsoExposureTime); } @@ -4167,8 +4151,8 @@ public class CaptureModule implements CameraModule, PhotoController, } } else { long intValue = SettingsManager.KEY_ISO_INDEX.get(value); - request.set(SELECT_PRIORITY, 0); - request.set(ISO_EXP, intValue); + VendorTagUtil.setIsoExpPrioritySelectPriority(request, 0); + VendorTagUtil.setIsoExpPriority(request, intValue); if (request.get(CaptureRequest.SENSOR_EXPOSURE_TIME) != null) { mIsoExposureTime = request.get(CaptureRequest.SENSOR_EXPOSURE_TIME); } diff --git a/src/com/android/camera/imageprocessor/PostProcessor.java b/src/com/android/camera/imageprocessor/PostProcessor.java index 62aa75a4a..751007f41 100644 --- a/src/com/android/camera/imageprocessor/PostProcessor.java +++ b/src/com/android/camera/imageprocessor/PostProcessor.java @@ -77,14 +77,14 @@ import java.nio.ByteBuffer; import java.util.ArrayList; import java.util.LinkedList; import java.util.List; +import android.util.Size; import java.util.TimeZone; import java.util.concurrent.Semaphore; import com.android.camera.imageprocessor.filter.ImageFilter; import com.android.camera.util.CameraUtil; import com.android.camera.util.PersistUtil; - -import android.util.Size; +import com.android.camera.util.VendorTagUtil; public class PostProcessor{ @@ -526,8 +526,8 @@ public class PostProcessor{ CaptureRequest.EDGE_MODE_HIGH_QUALITY); builder.set(CaptureRequest.NOISE_REDUCTION_MODE, CaptureRequest.NOISE_REDUCTION_MODE_HIGH_QUALITY); - builder.set(CaptureModule.CdsModeKey, 2); // CDS 0-OFF, 1-ON, 2-AUTO - builder.set(CaptureModule.JpegCropEnableKey, (byte)1); + VendorTagUtil.setCdsMode(builder, 2); // CDS 0-OFF, 1-ON, 2-AUTO + VendorTagUtil.setJpegCropEnable(builder, (byte)1); Rect cropRect = image.getCropRect(); if(cropRect == null || cropRect.isEmpty()) { @@ -539,9 +539,9 @@ public class PostProcessor{ float targetRatio = (float)targetWidth / (float)targetHeight; cropRect = CameraUtil.getFinalCropRect(cropRect, targetRatio); // has crop rect. apply to jpeg request - builder.set(CaptureModule.JpegCropRectKey, + VendorTagUtil.setJpegCropRect(builder, new int[] {cropRect.left, cropRect.top, cropRect.width(), cropRect.height()}); - builder.set(CaptureModule.JpegRoiRectKey, + VendorTagUtil.setJpegRoiRect(builder, new int[] {0, 0, targetWidth, targetHeight}); Location location = mController.getLocationManager().getCurrentLocation(); diff --git a/src/com/android/camera/util/VendorTagUtil.java b/src/com/android/camera/util/VendorTagUtil.java new file mode 100644 index 000000000..9c2f6cc1c --- /dev/null +++ b/src/com/android/camera/util/VendorTagUtil.java @@ -0,0 +1,134 @@ +/* + * 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.util; + +import android.hardware.camera2.CaptureRequest; +import android.util.Log; + +public class VendorTagUtil { + private static final String TAG = "VendorTagUtil"; + + private static CaptureRequest.Key<Integer> CdsModeKey = + new CaptureRequest.Key<>("org.codeaurora.qcamera3.CDS.cds_mode", + Integer.class); + private static CaptureRequest.Key<Byte> JpegCropEnableKey = + new CaptureRequest.Key<>("org.codeaurora.qcamera3.jpeg_encode_crop.enable", + Byte.class); + private static CaptureRequest.Key<int[]> JpegCropRectKey = + new CaptureRequest.Key<>("org.codeaurora.qcamera3.jpeg_encode_crop.rect", + int[].class); + private static CaptureRequest.Key<int[]> JpegRoiRectKey = + new CaptureRequest.Key<>("org.codeaurora.qcamera3.jpeg_encode_crop.roi", + int[].class); + private static CaptureRequest.Key<Integer> SELECT_PRIORITY = + new CaptureRequest.Key<>("org.codeaurora.qcamera3.iso_exp_priority.select_priority", + Integer.class); + private static CaptureRequest.Key<Long> ISO_EXP = + new CaptureRequest.Key<>("org.codeaurora.qcamera3.iso_exp_priority.use_iso_exp_priority", + Long.class); + + + private static boolean isSupported(CaptureRequest.Builder builder, + CaptureRequest.Key<?> key) { + boolean supported = true; + try { + builder.get(key); + }catch(IllegalArgumentException exception){ + supported = false; + Log.d(TAG, "vendor tag " + key.getName() + " is not supported"); + } + if ( supported ) { + Log.d(TAG, "vendor tag " + key.getName() + " is supported"); + } + return supported; + } + + // value=0:OFF + // value=1:ON + // value=2:AUTO + public static void setCdsMode(CaptureRequest.Builder builder, Integer value) { + if ( isCdsModeSupported(builder) ) { + builder.set(CdsModeKey, value); + } + } + + private static boolean isCdsModeSupported(CaptureRequest.Builder builder) { + return isSupported(builder, CdsModeKey); + } + + public static void setJpegCropEnable(CaptureRequest.Builder builder, Byte value) { + if ( isJpegCropEnableSupported(builder) ) { + builder.set(JpegCropEnableKey, value); + } + } + + private static boolean isJpegCropEnableSupported(CaptureRequest.Builder builder) { + return isSupported(builder, JpegCropEnableKey); + } + + public static void setJpegCropRect(CaptureRequest.Builder builder, int[] value) { + if ( isJpegCropRectSupported(builder) ) { + builder.set(JpegCropRectKey, value); + } + } + + private static boolean isJpegCropRectSupported(CaptureRequest.Builder builder) { + return isSupported(builder, JpegCropRectKey); + } + + public static void setJpegRoiRect(CaptureRequest.Builder builder, int[] value) { + if ( isJpegRoiRectSupported(builder) ) { + builder.set(JpegRoiRectKey, value); + } + } + + private static boolean isJpegRoiRectSupported(CaptureRequest.Builder builder) { + return isSupported(builder, JpegRoiRectKey); + } + + public static void setIsoExpPrioritySelectPriority(CaptureRequest.Builder builder, + Integer value) { + if ( isIsoExpPrioritySelectPrioritySupported(builder) ) { + builder.set(SELECT_PRIORITY, value); + } + } + private static boolean isIsoExpPrioritySelectPrioritySupported(CaptureRequest.Builder builder) { + return isSupported(builder, SELECT_PRIORITY); + } + + public static void setIsoExpPriority(CaptureRequest.Builder builder,Long value) { + if ( isIsoExpPrioritySupported(builder) ) { + builder.set(ISO_EXP, value); + } + } + private static boolean isIsoExpPrioritySupported(CaptureRequest.Builder builder) { + return isSupported(builder, ISO_EXP); + } + +} diff --git a/src/org/codeaurora/snapcam/filter/ClearSightImageProcessor.java b/src/org/codeaurora/snapcam/filter/ClearSightImageProcessor.java index e51273673..a5521bed2 100755 --- a/src/org/codeaurora/snapcam/filter/ClearSightImageProcessor.java +++ b/src/org/codeaurora/snapcam/filter/ClearSightImageProcessor.java @@ -87,7 +87,7 @@ import com.android.camera.PhotoModule.NamedImages.NamedEntity; import com.android.camera.SettingsManager; import com.android.camera.Storage; import com.android.camera.util.CameraUtil; - +import com.android.camera.util.VendorTagUtil; public class ClearSightImageProcessor { private static final String TAG = "ClearSightImageProcessor"; @@ -1082,7 +1082,7 @@ public class ClearSightImageProcessor { private void sendReprocessRequest(CaptureRequest.Builder reprocRequest, Image image, final int camType) { try { - reprocRequest.set(CaptureModule.JpegCropEnableKey, (byte)1); + VendorTagUtil.setJpegCropEnable(reprocRequest, (byte)1); Rect cropRect = image.getCropRect(); if(cropRect == null || @@ -1093,14 +1093,14 @@ public class ClearSightImageProcessor { cropRect = getFinalCropRect(cropRect); // has crop rect. apply to jpeg request - reprocRequest.set(CaptureModule.JpegCropRectKey, + VendorTagUtil.setJpegCropRect(reprocRequest, new int[] {cropRect.left, cropRect.top, cropRect.width(), cropRect.height()}); if(camType == CAM_TYPE_MONO) { - reprocRequest.set(CaptureModule.JpegRoiRectKey, + VendorTagUtil.setJpegRoiRect(reprocRequest, new int[] {0, 0, mFinalMonoSize.getWidth(), mFinalMonoSize.getHeight()}); } else { - reprocRequest.set(CaptureModule.JpegRoiRectKey, + VendorTagUtil.setJpegRoiRect(reprocRequest, new int[] {0, 0, mFinalPictureSize.getWidth(), mFinalPictureSize.getHeight()}); } |