diff options
-rw-r--r-- | assets/dependency.json | 3 | ||||
-rw-r--r-- | res/values/qcomstrings.xml | 4 | ||||
-rw-r--r-- | src/com/android/camera/CaptureModule.java | 8 | ||||
-rw-r--r-- | src/com/android/camera/CaptureUI.java | 3 | ||||
-rw-r--r-- | src/com/android/camera/PanoCaptureModule.java | 7 | ||||
-rw-r--r-- | src/com/android/camera/PanoCaptureUI.java | 30 | ||||
-rw-r--r-- | src/com/android/camera/imageprocessor/PostProcessor.java | 33 | ||||
-rw-r--r-- | src/com/android/camera/imageprocessor/filter/ChromaflashFilter.java | 57 | ||||
-rw-r--r-- | src/com/android/camera/imageprocessor/filter/UbifocusFilter.java | 10 | ||||
-rw-r--r-- | src/com/android/camera/ui/PanoCaptureProcessView.java | 36 |
10 files changed, 134 insertions, 57 deletions
diff --git a/assets/dependency.json b/assets/dependency.json index bee8f41be..ebb9c6a25 100644 --- a/assets/dependency.json +++ b/assets/dependency.json @@ -48,6 +48,9 @@ {"pref_camera2_clearsight_key":"off", "pref_camera2_mono_preview_key":"off", "pref_camera2_mpo_key":"off"} + , + "105": + {"pref_camera2_flashmode_key":"off"} }, "pref_camera2_clearsight_key": { diff --git a/res/values/qcomstrings.xml b/res/values/qcomstrings.xml index 986ff8b3d..72fab56e0 100644 --- a/res/values/qcomstrings.xml +++ b/res/values/qcomstrings.xml @@ -1046,7 +1046,9 @@ <string name="pref_camera2_timer_value_2sec" translatable="false">2</string> <string name="pref_camera2_timer_value_5sec" translatable="false">5</string> <string name="pref_camera2_timer_value_10sec" translatable="false">10</string> - <string name="panocapture_direction_is_not_determined" translatable="true">Direction is not detected.</string> + <string name="panocapture_direction_is_not_determined" translatable="true">Move constantly in one direciton.</string> + <string name="panocapture_intro" translatable="true">Press camera button to start.</string> + <string name="panocapture_direction_is_changed" translatable="true">Direction is changed. Stopping now...</string> <string name="makeup_ui_title" translatable="true">Please choose the strength of the beautification.</string> <string name="makeup_ui_ok_button" translatable="true">OK</string> <string name="makeup_seekbar_low" translatable="true">low</string> diff --git a/src/com/android/camera/CaptureModule.java b/src/com/android/camera/CaptureModule.java index c800c6e4e..e81a34c6f 100644 --- a/src/com/android/camera/CaptureModule.java +++ b/src/com/android/camera/CaptureModule.java @@ -925,7 +925,7 @@ public class CaptureModule implements CameraModule, PhotoController, public void setFlashModeToPreview(int id, boolean isFlashOn) { Log.d(TAG, "setFlashModeToPreview " + isFlashOn); if(isFlashOn) { - mPreviewRequestBuilder[id].set(CaptureRequest.CONTROL_AE_MODE, CaptureRequest.CONTROL_AE_MODE_ON); + mPreviewRequestBuilder[id].set(CaptureRequest.CONTROL_AE_MODE, CaptureRequest.CONTROL_AE_MODE_ON_ALWAYS_FLASH); mPreviewRequestBuilder[id].set(CaptureRequest.FLASH_MODE, CaptureRequest.FLASH_MODE_SINGLE); } else { mPreviewRequestBuilder[id].set(CaptureRequest.CONTROL_AE_MODE, CaptureRequest.CONTROL_AE_MODE_ON); @@ -1507,6 +1507,7 @@ public class CaptureModule implements CameraModule, PhotoController, }); } mControlAFMode = CaptureRequest.CONTROL_AF_MODE_CONTINUOUS_PICTURE; + applyFlash(mPreviewRequestBuilder[id], id); applySettingsForUnlockExposure(mPreviewRequestBuilder[id], id); setAFModeToPreview(id, mControlAFMode); mTakingPicture[id] = false; @@ -3055,6 +3056,7 @@ public class CaptureModule implements CameraModule, PhotoController, mPreviewRequestBuilder[id].set(CaptureRequest.CONTROL_AF_TRIGGER, CaptureRequest .CONTROL_AF_TRIGGER_IDLE); applyCommonSettings(mPreviewRequestBuilder[id], id); + applyFlash(mPreviewRequestBuilder[id], id); } public float getZoomValue() { @@ -3106,10 +3108,6 @@ public class CaptureModule implements CameraModule, PhotoController, updatePreview = true; applyFaceDetection(mPreviewRequestBuilder[cameraId]); break; - case SettingsManager.KEY_FLASH_MODE: - updatePreview = true; - applyFlash(mPreviewRequestBuilder[cameraId], cameraId); - break; } return updatePreview; } diff --git a/src/com/android/camera/CaptureUI.java b/src/com/android/camera/CaptureUI.java index ffec736b8..1710dc975 100644 --- a/src/com/android/camera/CaptureUI.java +++ b/src/com/android/camera/CaptureUI.java @@ -248,7 +248,6 @@ public class CaptureUI implements FocusOverlayManager.FocusUI, mSceneModeSwitcher = mRootView.findViewById(R.id.scene_mode_switcher); mFrontBackSwitcher = mRootView.findViewById(R.id.front_back_switcher); mMakeupButton = (ImageView) mRootView.findViewById(R.id.ts_makeup_switcher); - setMakeupButtonIcon(); mMakeupSeekBarLayout = mRootView.findViewById(R.id.makeup_seekbar_layout); mSeekbarBody = mRootView.findViewById(R.id.seekbar_body); mSeekbarToggleButton = (Button) mRootView.findViewById(R.id.seekbar_toggle); @@ -282,6 +281,7 @@ public class CaptureUI implements FocusOverlayManager.FocusUI, toggleMakeup(); } }); + setMakeupButtonIcon(); mFlashButton = (FlashToggleButton) mRootView.findViewById(R.id.flash_button); initFilterModeButton(); initSceneModeButton(); @@ -388,6 +388,7 @@ public class CaptureUI implements FocusOverlayManager.FocusUI, public void run() { if(value != null && !value.equals("0")) { mMakeupButton.setImageResource(R.drawable.beautify_on); + mMakeupSeekBarLayout.setVisibility(View.VISIBLE); } else { mMakeupButton.setImageResource(R.drawable.beautify); } diff --git a/src/com/android/camera/PanoCaptureModule.java b/src/com/android/camera/PanoCaptureModule.java index 4821c9774..ff5715e20 100644 --- a/src/com/android/camera/PanoCaptureModule.java +++ b/src/com/android/camera/PanoCaptureModule.java @@ -278,12 +278,7 @@ public class PanoCaptureModule implements CameraModule, PhotoController { } public void changePanoStatus(boolean newStatus, boolean isCancelling) { - if(newStatus) { - mUI.setThumbnailVisibility(View.GONE); - } else { - mUI.setThumbnailVisibility(View.VISIBLE); - } - + mUI.onPanoStatusChange(newStatus); if(mFrameProcessor != null) { mFrameProcessor.changePanoStatus(newStatus, isCancelling); } diff --git a/src/com/android/camera/PanoCaptureUI.java b/src/com/android/camera/PanoCaptureUI.java index 4a3a1bb94..3ab43f915 100644 --- a/src/com/android/camera/PanoCaptureUI.java +++ b/src/com/android/camera/PanoCaptureUI.java @@ -91,15 +91,27 @@ public class PanoCaptureUI implements mPreviewProcessView.onFrameAvailable(bitmap, isCancelling); } - public void setThumbnailVisibility(final int visibility) { - if(mThumbnail != null) { - mActivity.runOnUiThread(new Runnable() { - @Override - public void run() { - mThumbnail.setVisibility(visibility); + public void onPanoStatusChange(final boolean isStarting) { + mActivity.runOnUiThread(new Runnable() { + @Override + public void run() { + if(isStarting) { + if (mThumbnail != null) { + mThumbnail.setVisibility(View.GONE); + } + if (mShutterButton != null) { + mShutterButton.setImageResource(R.drawable.shutter_button_video_stop); + } + } else { + if (mThumbnail != null) { + mThumbnail.setVisibility(View.VISIBLE); + } + if (mShutterButton != null) { + mShutterButton.setImageResource(R.drawable.btn_new_shutter_panorama); + } } - }); - } + } + }); } /* @@ -329,7 +341,7 @@ public class PanoCaptureUI implements public void onResume() { mPreviewProcessView.onResume(); - setThumbnailVisibility(View.VISIBLE); + onPanoStatusChange(false); mCameraControls.getPanoramaExitButton().setVisibility(View.VISIBLE); mCameraControls.getPanoramaExitButton().setOnClickListener(new OnClickListener() { @Override diff --git a/src/com/android/camera/imageprocessor/PostProcessor.java b/src/com/android/camera/imageprocessor/PostProcessor.java index 75dfa6ac7..228c0816f 100644 --- a/src/com/android/camera/imageprocessor/PostProcessor.java +++ b/src/com/android/camera/imageprocessor/PostProcessor.java @@ -129,6 +129,8 @@ public class PostProcessor{ private HandlerThread mZSLHandlerThread; private ImageHandlerTask mImageHandlerTask; private LinkedList<TotalCaptureResult> mTotalCaptureResultList = new LinkedList<TotalCaptureResult>(); + private TotalCaptureResult mZSLFallOffResult = null; + private boolean mIsZSLFallOffForFlash = false; public boolean isZSLEnabled() { return mUseZSL; @@ -173,6 +175,19 @@ public class PostProcessor{ public void onImageAvailable(ImageReader reader) { try { if(mUseZSL) { + if(mIsZSLFallOffForFlash && mZSLFallOffResult != null) { + Image image = reader.acquireNextImage(); + if((mZSLFallOffResult.get(CaptureResult.SENSOR_TIMESTAMP)).longValue() <= image.getTimestamp()) { + Log.d(TAG,"ZSL fall off for flash image"); + mIsZSLFallOffForFlash = false; + reprocessImage(image, mZSLFallOffResult); + mZSLFallOffResult = null; + } else { + image.close(); + } + return; + } + Image image = reader.acquireLatestImage(); if (image == null) { return; @@ -200,6 +215,8 @@ public class PostProcessor{ } } catch (IllegalStateException e) { Log.e(TAG, "Max images has been already acquired. "); + mIsZSLFallOffForFlash = false; + mZSLFallOffResult = null; } } @@ -234,7 +251,11 @@ public class PostProcessor{ if(mTotalCaptureResultList.size() <= PostProcessor.MAX_REQUIRED_IMAGE_NUM) { mTotalCaptureResultList.add(result); } - onMetaAvailable(result); + if(mIsZSLFallOffForFlash) { + mZSLFallOffResult = result; + } else { + onMetaAvailable(result); + } } @Override @@ -246,7 +267,9 @@ public class PostProcessor{ @Override public void onCaptureSequenceCompleted(CameraCaptureSession session, int sequenceId, long frameNumber) { - mController.unlockFocus(mController.getMainCameraId()); + if(!isFilterOn()) { + mController.unlockFocus(mController.getMainCameraId()); + } } }; @@ -275,6 +298,7 @@ public class PostProcessor{ 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"); + mIsZSLFallOffForFlash = true; imageItem = null; } if (mController.isSelfieFlash()) { @@ -286,7 +310,9 @@ public class PostProcessor{ return true; } else { if(DEBUG_ZSL) Log.d(TAG, "No good item in queue, register the request for the future"); - mZSLQueue.addPictureRequest(); + if(!mIsZSLFallOffForFlash) { + mZSLQueue.addPictureRequest(); + } return false; } } @@ -325,6 +351,7 @@ public class PostProcessor{ private void onImageToProcess(Image image) { addImage(image); if (isReadyToProcess()) { + mController.unlockFocus(mController.getMainCameraId()); long captureStartTime = System.currentTimeMillis(); mNamedImages.nameNewImage(captureStartTime); PhotoModule.NamedImages.NamedEntity name = mNamedImages.getNextNameEntity(); diff --git a/src/com/android/camera/imageprocessor/filter/ChromaflashFilter.java b/src/com/android/camera/imageprocessor/filter/ChromaflashFilter.java index ad4c9933a..e244c1040 100644 --- a/src/com/android/camera/imageprocessor/filter/ChromaflashFilter.java +++ b/src/com/android/camera/imageprocessor/filter/ChromaflashFilter.java @@ -44,7 +44,7 @@ import java.util.ArrayList; import java.util.List; public class ChromaflashFilter implements ImageFilter{ - public static final int NUM_REQUIRED_IMAGE = 3; + public static final int NUM_REQUIRED_IMAGE = 6; private int mWidth; private int mHeight; private int mStrideY; @@ -105,6 +105,10 @@ public class ChromaflashFilter implements ImageFilter{ @Override public void addImage(ByteBuffer bY, ByteBuffer bVU, int imageNum, Object param) { Log("addImage"); + if(imageNum == 1 || imageNum == 2 || imageNum == 4) { + mImageNum = imageNum; + return; + } int yActualSize = bY.remaining(); int vuActualSize = bVU.remaining(); mImageNum = imageNum; @@ -143,19 +147,46 @@ public class ChromaflashFilter implements ImageFilter{ } @Override - public void manualCapture(CaptureRequest.Builder builder, CameraCaptureSession captureSession, - CameraCaptureSession.CaptureCallback callback, Handler handler) throws CameraAccessException { - for(int i=0; i < NUM_REQUIRED_IMAGE; i++) { - if(i == 1) { - mModule.setFlashModeToPreview(mModule.getMainCameraId(), true); - builder.set(CaptureRequest.CONTROL_AE_MODE, CaptureRequest.CONTROL_AE_MODE_ON); - builder.set(CaptureRequest.FLASH_MODE, CaptureRequest.FLASH_MODE_SINGLE); - } else { - mModule.setFlashModeToPreview(mModule.getMainCameraId(), false); - builder.set(CaptureRequest.CONTROL_AE_MODE, CaptureRequest.CONTROL_AE_MODE_ON); - builder.set(CaptureRequest.FLASH_MODE, CaptureRequest.FLASH_MODE_OFF); + public void manualCapture(final CaptureRequest.Builder builder, final CameraCaptureSession captureSession, + final CameraCaptureSession.CaptureCallback callback, final Handler handler) throws CameraAccessException { + new Thread() { + public void run() { + try { + for (int i = 0; i < NUM_REQUIRED_IMAGE; i++) { + if (i == 0) { + captureSession.capture(builder.build(), callback, handler); + } else if (i == 1) { //To change the setting + builder.set(CaptureRequest.CONTROL_AE_LOCK, Boolean.FALSE); + captureSession.capture(builder.build(), callback, handler); + waitForImage(i); + } else if (i == 2) { //To change the setting + builder.set(CaptureRequest.CONTROL_AE_MODE, CaptureRequest.CONTROL_AE_MODE_ON); + builder.set(CaptureRequest.FLASH_MODE, CaptureRequest.FLASH_MODE_SINGLE); + builder.set(CaptureRequest.CONTROL_AE_LOCK, Boolean.TRUE); + captureSession.capture(builder.build(), callback, handler); + waitForImage(i); + } else if (i == 3) { + captureSession.capture(builder.build(), callback, handler); + } else if (i == 4) { //To change the setting + builder.set(CaptureRequest.FLASH_MODE, CaptureRequest.FLASH_MODE_OFF); + captureSession.capture(builder.build(), callback, handler); + waitForImage(i); + } else if (i == 5) { + captureSession.capture(builder.build(), callback, handler); + } + } + } catch(CameraAccessException e) {} + + } + }.start(); + } + + private void waitForImage(int index) { + try { + while(mImageNum < index) { + Thread.sleep(50); } - captureSession.capture(builder.build(), callback, handler); + } catch (InterruptedException e) { } } diff --git a/src/com/android/camera/imageprocessor/filter/UbifocusFilter.java b/src/com/android/camera/imageprocessor/filter/UbifocusFilter.java index 57da5c441..f32832dd8 100644 --- a/src/com/android/camera/imageprocessor/filter/UbifocusFilter.java +++ b/src/com/android/camera/imageprocessor/filter/UbifocusFilter.java @@ -64,7 +64,7 @@ public class UbifocusFilter implements ImageFilter { private int mStrideVU; private static String TAG = "UbifocusFilter"; private static final boolean DEBUG = false; - private static final int FOCUS_ADJUST_TIME_OUT = 200; + private static final int FOCUS_ADJUST_TIME_OUT = 400; private static final int META_BYTES_SIZE = 25; private int temp; private static boolean mIsSupported = true; @@ -206,6 +206,8 @@ public class UbifocusFilter implements ImageFilter { float value = (i * step); mModule.setAFModeToPreview(mModule.getMainCameraId(), CaptureRequest.CONTROL_AF_MODE_OFF); mModule.setFocusDistanceToPreview(mModule.getMainCameraId(), value); + Log("Request: " + value); + float focusDistance; try { int count = FOCUS_ADJUST_TIME_OUT; do { @@ -214,15 +216,15 @@ public class UbifocusFilter implements ImageFilter { if(count <= 0) { break; } - } while(Math.abs(mModule.getPreviewCaptureResult().get(CaptureResult.LENS_FOCUS_DISTANCE) - - value) >= 0.5f); + focusDistance = mModule.getPreviewCaptureResult().get(CaptureResult.LENS_FOCUS_DISTANCE); + Log("Taken focus value :"+focusDistance); + } while(Math.abs(focusDistance - value) >= 1f); } catch (InterruptedException e) { } catch (NullPointerException e) { } builder.set(CaptureRequest.CONTROL_AF_MODE, CaptureRequest.CONTROL_AF_MODE_OFF); builder.set(CaptureRequest.LENS_FOCUS_DISTANCE, value); captureSession.capture(builder.build(), callback, handler); - Log.d(TAG, "Request: " + value); } } diff --git a/src/com/android/camera/ui/PanoCaptureProcessView.java b/src/com/android/camera/ui/PanoCaptureProcessView.java index e73dc9604..2b37fd61e 100644 --- a/src/com/android/camera/ui/PanoCaptureProcessView.java +++ b/src/com/android/camera/ui/PanoCaptureProcessView.java @@ -144,6 +144,7 @@ public class PanoCaptureProcessView extends View implements SensorEventListener private ProgressDialog mProgressDialog; private String mCompleteSentence = ""; private String mProgressSentence = ""; + private String mIntroSentence = ""; private Paint mCompleteSentencePaint = new Paint(); private int mFinalDoneLength; @@ -327,10 +328,11 @@ public class PanoCaptureProcessView extends View implements SensorEventListener mCenterRectPaint.setStrokeWidth(2f); mCenterRectPaint.setStyle(Paint.Style.STROKE); mCompleteSentencePaint.setColor(Color.WHITE); - mCompleteSentencePaint.setTextSize(60f); + mCompleteSentencePaint.setTextSize(45f); mQueueProcessor = new PanoQueueProcessor(); mQueueProcessor.start(); mHandler = new Handler(); + mIntroSentence = mActivity.getResources().getString(R.string.panocapture_intro); } public void onPause() { @@ -371,24 +373,24 @@ public class PanoCaptureProcessView extends View implements SensorEventListener @Override protected void onDraw(Canvas canvas) { + if (mOrientation == 0 || mOrientation == 180) { + rectF.left = canvas.getWidth() / 2 - mPreviewThumbWidth; + rectF.right = canvas.getWidth() / 2 + mPreviewThumbWidth; + rectF.top = canvas.getHeight() / 2 - mPreviewThumbHeight; + rectF.bottom = canvas.getHeight() / 2 + mPreviewThumbHeight; + } else { + rectF.left = canvas.getWidth() / 2 - mPreviewThumbHeight; + rectF.right = canvas.getWidth() / 2 + mPreviewThumbHeight; + rectF.top = canvas.getHeight() / 2 - mPreviewThumbWidth; + rectF.bottom = canvas.getHeight() / 2 + mPreviewThumbWidth; + } + if(mPanoStatus != PANO_STATUS.INACTIVE) { canvas.rotate(-mOrientation, canvas.getWidth() / 2, canvas.getHeight() / 2); - if (mOrientation == 0 || mOrientation == 180) { - rectF.left = canvas.getWidth() / 2 - mPreviewThumbWidth; - rectF.right = canvas.getWidth() / 2 + mPreviewThumbWidth; - rectF.top = canvas.getHeight() / 2 - mPreviewThumbHeight; - rectF.bottom = canvas.getHeight() / 2 + mPreviewThumbHeight; - } else { - rectF.left = canvas.getWidth() / 2 - mPreviewThumbHeight; - rectF.right = canvas.getWidth() / 2 + mPreviewThumbHeight; - rectF.top = canvas.getHeight() / 2 - mPreviewThumbWidth; - rectF.bottom = canvas.getHeight() / 2 + mPreviewThumbWidth; - } - if(!mProgressSentence.equals("")) { int textWidth = (int) mCompleteSentencePaint.measureText(mProgressSentence); - canvas.drawText(mProgressSentence, rectF.centerX() - textWidth / 2, canvas.getHeight()/4, mCompleteSentencePaint); + canvas.drawText(mProgressSentence, rectF.centerX() - textWidth / 2, canvas.getHeight()*4/5, mCompleteSentencePaint); } if(mPanoStatus == PANO_STATUS.COMPLETING) { @@ -412,6 +414,10 @@ public class PanoCaptureProcessView extends View implements SensorEventListener } } } + } else { + canvas.rotate(-mPendingOrientation, canvas.getWidth()/2, canvas.getHeight()/2); + int textWidth = (int) mCompleteSentencePaint.measureText(mIntroSentence); + canvas.drawText(mIntroSentence, rectF.centerX() - textWidth / 2, canvas.getHeight()*4/5, mCompleteSentencePaint); } } @@ -513,7 +519,7 @@ public class PanoCaptureProcessView extends View implements SensorEventListener bitmapTask.x, bitmapTask.y, 0, bitmapTask.dir); if(rtv < 0) { mShouldFinish = true; - stopPano(false, "The direction is changed. Stopping."); + stopPano(false, mActivity.getResources().getString(R.string.panocapture_direction_is_changed)); Log.w(TAG, "Keyframe return value: "+rtv); } bitmapTask.clear(); |