diff options
author | Jay Wang <jaywang@codeaurora.org> | 2016-04-29 17:24:03 -0700 |
---|---|---|
committer | Gerrit - the friendly Code Review server <code-review@localhost> | 2016-05-17 16:28:20 -0700 |
commit | 59a4753d5ccbc21ac9ad9ac4a82bc99e4734778c (patch) | |
tree | 36686ea4338aba5d0cbf917cd4dbdc61673dc28e /src/org/codeaurora/snapcam/filter/ClearSightImageProcessor.java | |
parent | d3383e87fce92ecfde2a8916d121def3fe101566 (diff) | |
download | android_packages_apps_Snap-59a4753d5ccbc21ac9ad9ac4a82bc99e4734778c.tar.gz android_packages_apps_Snap-59a4753d5ccbc21ac9ad9ac4a82bc99e4734778c.tar.bz2 android_packages_apps_Snap-59a4753d5ccbc21ac9ad9ac4a82bc99e4734778c.zip |
SnapdragonCamera: add OTP calib data support and fix AE state
Add support to receive, parse, and send OTP calibration data
from HAL to ClearSight library and add check for AE convergence
state.
CRs-Fixed: 993611
Change-Id: I52d6b71dc7bde4e08342afee7aa9d41bb9a4dde6
Diffstat (limited to 'src/org/codeaurora/snapcam/filter/ClearSightImageProcessor.java')
-rw-r--r-- | src/org/codeaurora/snapcam/filter/ClearSightImageProcessor.java | 69 |
1 files changed, 48 insertions, 21 deletions
diff --git a/src/org/codeaurora/snapcam/filter/ClearSightImageProcessor.java b/src/org/codeaurora/snapcam/filter/ClearSightImageProcessor.java index 45856c752..141d8e412 100644 --- a/src/org/codeaurora/snapcam/filter/ClearSightImageProcessor.java +++ b/src/org/codeaurora/snapcam/filter/ClearSightImageProcessor.java @@ -35,16 +35,21 @@ import java.util.ArrayDeque; import java.util.ArrayList; import java.util.List; +import org.codeaurora.snapcam.filter.ClearSightNativeEngine.CamSystemCalibrationData; +import org.codeaurora.snapcam.filter.ClearSightNativeEngine.ClearsightImage; + +import android.content.Context; import android.graphics.ImageFormat; import android.graphics.Rect; import android.graphics.YuvImage; import android.hardware.camera2.CameraAccessException; import android.hardware.camera2.CameraCaptureSession; import android.hardware.camera2.CameraCaptureSession.CaptureCallback; +import android.hardware.camera2.CameraCharacteristics; import android.hardware.camera2.CameraDevice; +import android.hardware.camera2.CameraManager; import android.hardware.camera2.CaptureFailure; import android.hardware.camera2.CaptureRequest; -import android.hardware.camera2.CaptureResult; import android.hardware.camera2.TotalCaptureResult; import android.hardware.camera2.params.InputConfiguration; import android.media.Image; @@ -63,7 +68,6 @@ import android.view.Surface; import com.android.camera.MediaSaveService; import com.android.camera.PhotoModule.NamedImages; import com.android.camera.PhotoModule.NamedImages.NamedEntity; -import org.codeaurora.snapcam.filter.ClearSightNativeEngine.ClearsightImage; public class ClearSightImageProcessor { private static final String TAG = "ClearSightImageProcessor"; @@ -82,10 +86,10 @@ public class ClearSightImageProcessor { private static final int CAM_TYPE_MONO = 1; private static final int NUM_CAM = 2; - private static CaptureResult.Key<Byte> OTP_CALIB_BLOB = - new CaptureResult.Key<>( + private static CameraCharacteristics.Key<byte[]> OTP_CALIB_BLOB = + new CameraCharacteristics.Key<>( "org.codeaurora.qcamera3.dualcam_calib_meta_data.dualcam_calib_meta_data_blob", - Byte.class); + byte[].class); private NamedImages mNamedImages; private ImageReader[] mImageReader = new ImageReader[NUM_CAM]; @@ -131,7 +135,7 @@ public class ClearSightImageProcessor { return mInstance; } - public void init(int width, int height) { + public void init(int width, int height, Context context) { mImageProcessThread = new HandlerThread("CameraImageProcess"); mImageProcessThread.start(); mImageReprocessThread = new HandlerThread("CameraImageReprocess"); @@ -144,6 +148,15 @@ public class ClearSightImageProcessor { mImageReader[CAM_TYPE_MONO] = createImageReader(CAM_TYPE_MONO, width, height); mReprocessImageReader[CAM_TYPE_BAYER] = createReprocImageReader(CAM_TYPE_BAYER, width, height); mReprocessImageReader[CAM_TYPE_MONO] = createReprocImageReader(CAM_TYPE_MONO, width, height); + + CameraManager cm = (CameraManager) context.getSystemService(Context.CAMERA_SERVICE); + try { + CameraCharacteristics cc = cm.getCameraCharacteristics("0"); + byte[] blob = cc.get(OTP_CALIB_BLOB); + ClearSightNativeEngine.setOtpCalibData(CamSystemCalibrationData.createFromBytes(blob)); + } catch (CameraAccessException e) { + e.printStackTrace(); + } } public void close() { @@ -419,12 +432,17 @@ public class ClearSightImageProcessor { // if timestamps are within threshold, keep frames if (Math.abs(bayer.mImage.getTimestamp() - mono.mImage.getTimestamp()) > mTimestampThresholdNs) { - Log.d(TAG, "checkForValidFramePair - toss pair"); - // no match, toss - bayer = mBayerFrames.poll(); - mono = mMonoFrames.poll(); - bayer.mImage.close(); - mono.mImage.close(); + if(bayer.mImage.getTimestamp() > mono.mImage.getTimestamp()) { + Log.d(TAG, "checkForValidFramePair - toss mono"); + // no match, toss + mono = mMonoFrames.poll(); + mono.mImage.close(); + } else { + Log.d(TAG, "checkForValidFramePair - toss bayer"); + // no match, toss + bayer = mBayerFrames.poll(); + bayer.mImage.close(); + } } } } @@ -447,16 +465,17 @@ public class ClearSightImageProcessor { private void processReprocess() { if(mCallback != null) { - if (mBayerFrames.size() != mMonoFrames.size() + if (mMonoFrames.isEmpty() || mBayerFrames.isEmpty()) { - Log.d(TAG, "processReprocess - frame size mismatch or empty"); + Log.d(TAG, "processReprocess - frames are empty"); releaseBayerFrames(); releaseMonoFrames(); mCallback.onClearSightFailure(null, null); return; } else { - sendReprocessRequests(CAM_TYPE_BAYER); - sendReprocessRequests(CAM_TYPE_MONO); + int frameCount = Math.min(mMonoFrames.size(), mBayerFrames.size()); + sendReprocessRequests(CAM_TYPE_BAYER, frameCount); + sendReprocessRequests(CAM_TYPE_MONO, frameCount); } } else { releaseBayerFrames(); @@ -464,7 +483,7 @@ public class ClearSightImageProcessor { } } - private void sendReprocessRequests(final int camId) { + private void sendReprocessRequests(final int camId, int frameCount) { CameraCaptureSession session = mCallback.onReprocess(camId == CAM_TYPE_BAYER); CameraDevice device = session.getDevice(); @@ -476,11 +495,12 @@ public class ClearSightImageProcessor { frameQueue = mMonoFrames; } Log.d(TAG, "sendReprocessRequests - start cam: " + camId - + " num frames: " + frameQueue.size()); + + " num frames: " + frameQueue.size() + + " frameCount: " + frameCount); ArrayList<CaptureRequest> reprocRequests = new ArrayList<CaptureRequest>( frameQueue.size()); - while (!frameQueue.isEmpty()) { + while (reprocRequests.size() < frameCount) { ReprocessableImage reprocImg = frameQueue.poll(); CaptureRequest.Builder reprocRequest = device @@ -492,6 +512,15 @@ public class ClearSightImageProcessor { mImageWriter[camId].queueInputImage(reprocImg.mImage); } + if(!frameQueue.isEmpty()) { + // clear remaining frames + if (camId == CAM_TYPE_BAYER) { + releaseBayerFrames(); + } else { + releaseMonoFrames(); + } + } + mImageReprocessHandler.obtainMessage(MSG_START_CAPTURE, camId, reprocRequests.size()).sendToTarget(); session.captureBurst(reprocRequests, @@ -504,8 +533,6 @@ public class ClearSightImageProcessor { super.onCaptureCompleted(session, request, result); Log.d(TAG, "reprocess - onCaptureCompleted: " + camId); - // TODO: parse OTP Calib data to be used in final CS - // result.get(OTP_CALIB_BLOB); } @Override |