summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorMonika Alekhya <malekh@codeaurora.org>2013-07-26 16:15:12 +0530
committerSteve Kondik <shade@chemlab.org>2013-10-18 15:54:49 -0700
commit18ff2a5a30715ea1a6bbbc53a994e00226a5513a (patch)
treeb9daeb9b49632d4f6b3ab39d805f88e19f4c21d2 /src
parente9643f7d46dca93634afffcd32908793eb231041 (diff)
downloadandroid_packages_apps_Gallery2-18ff2a5a30715ea1a6bbbc53a994e00226a5513a.tar.gz
android_packages_apps_Gallery2-18ff2a5a30715ea1a6bbbc53a994e00226a5513a.tar.bz2
android_packages_apps_Gallery2-18ff2a5a30715ea1a6bbbc53a994e00226a5513a.zip
Camera: Fix for stretched preview in camera and camcorder.
Stretched preview is observed due to camera sensor's mount angle. So resize the preview frame using aspect ratios to avoid this. Change-Id: Ie8a9e062782aa6caaa80ddab705c937da6b0761e CRs-fixed: 510295
Diffstat (limited to 'src')
-rw-r--r--src/com/android/camera/PhotoModule.java29
-rw-r--r--src/com/android/camera/PhotoUI.java10
-rw-r--r--src/com/android/camera/PreviewFrameLayout.java46
-rw-r--r--src/com/android/camera/VideoModule.java14
-rw-r--r--src/com/android/camera/VideoUI.java4
-rw-r--r--src/com/android/camera/ui/PieRenderer.java4
6 files changed, 99 insertions, 8 deletions
diff --git a/src/com/android/camera/PhotoModule.java b/src/com/android/camera/PhotoModule.java
index 11842b31d..0df8994a5 100644
--- a/src/com/android/camera/PhotoModule.java
+++ b/src/com/android/camera/PhotoModule.java
@@ -524,8 +524,10 @@ public class PhotoModule
View root = mUI.getRootView();
// These depend on camera parameters.
- int width = root.getWidth();
- int height = root.getHeight();
+ int width = mUI.mPreviewFrameLayout.getWidth();
+ int height = mUI.mPreviewFrameLayout.getHeight();
+ openCameraCommon();
+ resizeForPreviewAspectRatio();
mFocusManager.setPreviewSize(width, height);
// Full-screen screennail
if (Util.getDisplayRotation(mActivity) % 180 == 0) {
@@ -535,7 +537,6 @@ public class PhotoModule
}
// Set touch focus listener.
mActivity.setSingleTapUpListener(root);
- openCameraCommon();
onFullScreenChanged(mActivity.isInCameraApp());
}
@@ -572,6 +573,7 @@ public class PhotoModule
mFocusManager.setMirror(mirror);
mFocusManager.setParameters(mInitialParams);
setupPreview();
+ resizeForPreviewAspectRatio();
openCameraCommon();
@@ -1355,6 +1357,24 @@ public class PhotoModule
}
}
+ void setPreviewFrameLayoutCameraOrientation(){
+ CameraInfo info = CameraHolder.instance().getCameraInfo()[mCameraId];
+ //if camera mount angle is 0 or 180, we want to resize preview
+ if(info.orientation % 180 == 0){
+ mUI.mPreviewFrameLayout.setRenderer(mUI.mPieRenderer);
+ mUI.mPreviewFrameLayout.cameraOrientationPreviewResize(true);
+ } else{
+ mUI.mPreviewFrameLayout.cameraOrientationPreviewResize(false);
+ }
+ }
+
+ private void resizeForPreviewAspectRatio() {
+ setPreviewFrameLayoutCameraOrientation();
+ Size size = mParameters.getPictureSize();
+ Log.e(TAG,"Width = "+ size.width+ "Height = "+size.height);
+ mUI.setAspectRatio((double) size.width / size.height);
+ }
+
@Override
public void installIntentFilter() {
}
@@ -1527,6 +1547,7 @@ public class PhotoModule
}
setDisplayOrientation();
+ resizeForPreviewAspectRatio();
}
@Override
@@ -2017,6 +2038,7 @@ public class PhotoModule
} else if (isCameraIdle()) {
if (mRestartPreview) {
Log.d(TAG, "Restarting preview");
+ resizeForPreviewAspectRatio();
startPreview();
mRestartPreview = false;
}
@@ -2074,6 +2096,7 @@ public class PhotoModule
}
setCameraParametersWhenIdle(UPDATE_PARAM_PREFERENCE);
+ resizeForPreviewAspectRatio();
mUI.updateOnScreenIndicators(mParameters, mPreferenceGroup, mPreferences);
}
diff --git a/src/com/android/camera/PhotoUI.java b/src/com/android/camera/PhotoUI.java
index 68507f461..a26e1a088 100644
--- a/src/com/android/camera/PhotoUI.java
+++ b/src/com/android/camera/PhotoUI.java
@@ -64,6 +64,7 @@ public class PhotoUI implements PieListener,
private PreviewGestures mGestures;
private View mRootView;
+ protected PreviewFrameLayout mPreviewFrameLayout;
private Object mSurfaceTexture;
private volatile SurfaceHolder mSurfaceHolder;
@@ -83,7 +84,7 @@ public class PhotoUI implements PieListener,
private OnScreenIndicators mOnScreenIndicators;
- private PieRenderer mPieRenderer;
+ protected PieRenderer mPieRenderer;
private ZoomRenderer mZoomRenderer;
private Toast mNotSelectableToast;
@@ -127,7 +128,8 @@ public class PhotoUI implements PieListener,
initIndicators();
mCountDownView = (CountDownView) (mRootView.findViewById(R.id.count_down_to_capture));
mCountDownView.setCountDownFinishedListener((OnCountDownFinishedListener) mController);
-
+ mPreviewFrameLayout = (PreviewFrameLayout) mRootView.findViewById(R.id.frame);
+ mPreviewFrameLayout.setOnLayoutChangeListener(mActivity);
if (ApiHelper.HAS_FACE_DETECTION) {
ViewStub faceViewStub = (ViewStub) mRootView
.findViewById(R.id.face_view_stub);
@@ -190,6 +192,10 @@ public class PhotoUI implements PieListener,
updateOnScreenIndicators(params, prefGroup, prefs);
}
+ public void setAspectRatio(double ratio) {
+ mPreviewFrameLayout.setAspectRatio(ratio);
+ }
+
private void openMenu() {
if (mPieRenderer != null) {
// If autofocus is not finished, cancel autofocus so that the
diff --git a/src/com/android/camera/PreviewFrameLayout.java b/src/com/android/camera/PreviewFrameLayout.java
index 03ef91c60..c37ebf27e 100644
--- a/src/com/android/camera/PreviewFrameLayout.java
+++ b/src/com/android/camera/PreviewFrameLayout.java
@@ -22,9 +22,9 @@ import android.util.AttributeSet;
import android.view.View;
import android.view.ViewStub;
import android.widget.RelativeLayout;
-
import com.android.camera.ui.LayoutChangeHelper;
import com.android.camera.ui.LayoutChangeNotifier;
+import com.android.camera.ui.PieRenderer;
import com.android.gallery3d.R;
import com.android.gallery3d.common.ApiHelper;
@@ -44,11 +44,16 @@ public class PreviewFrameLayout extends RelativeLayout implements LayoutChangeNo
private View mBorder;
private OnSizeChangedListener mListener;
private LayoutChangeHelper mLayoutChangeHelper;
+ private boolean mOrientationResize;
+ private boolean mPrevOrientationResize;
+ private PieRenderer mPieRenderer;
public PreviewFrameLayout(Context context, AttributeSet attrs) {
super(context, attrs);
setAspectRatio(4.0 / 3.0);
mLayoutChangeHelper = new LayoutChangeHelper(this);
+ mOrientationResize = false;
+ mPrevOrientationResize = false;
}
@Override
@@ -56,13 +61,27 @@ public class PreviewFrameLayout extends RelativeLayout implements LayoutChangeNo
mBorder = findViewById(R.id.preview_border);
}
+ public void cameraOrientationPreviewResize(boolean orientation){
+ mPrevOrientationResize = mOrientationResize;
+ mOrientationResize = orientation;
+ }
+
public void setAspectRatio(double ratio) {
if (ratio <= 0.0) throw new IllegalArgumentException();
+ if (getResources().getConfiguration().orientation
+ == Configuration.ORIENTATION_PORTRAIT) {
+ ratio = 1 / ratio;
+ }
+
if (mAspectRatio != ratio) {
mAspectRatio = ratio;
requestLayout();
}
+ if(mOrientationResize != mPrevOrientationResize) {
+ requestLayout();
+ }
+
}
public void showBorder(boolean enabled) {
@@ -73,10 +92,16 @@ public class PreviewFrameLayout extends RelativeLayout implements LayoutChangeNo
Util.fadeOut(mBorder);
}
+ public void setRenderer(PieRenderer renderer) {
+ mPieRenderer = renderer;
+ }
+
@Override
protected void onMeasure(int widthSpec, int heightSpec) {
int previewWidth = MeasureSpec.getSize(widthSpec);
int previewHeight = MeasureSpec.getSize(heightSpec);
+ int originalWidth = previewWidth;
+ int originalHeight = previewHeight;
if (!ApiHelper.HAS_SURFACE_TEXTURE) {
// Get the padding of the border background.
@@ -108,6 +133,25 @@ public class PreviewFrameLayout extends RelativeLayout implements LayoutChangeNo
previewHeight += vPadding;
}
+ if (mOrientationResize) {
+ previewHeight = (int) (previewWidth * mAspectRatio);
+
+ if (previewHeight > originalHeight) {
+ previewWidth = (int)(((double)originalHeight / (double)previewHeight) * previewWidth);
+ previewHeight = originalHeight;
+ }
+ /* If the preview size of frame is small e.g. less than options menu size,
+ then the later appears cropped. This is because the child views use the parent
+ dimensions for layout sizes. Hence for now as a workaround the preview sizes are
+ updated to atleast match the options menu dimensions. This will result in a slight
+ stretch of preview images */
+ if(mPieRenderer != null) {
+ int settingsDiameter = mPieRenderer.getDiameter();
+ if(previewWidth < settingsDiameter) previewWidth = settingsDiameter;
+ else if(previewHeight < settingsDiameter) previewHeight = settingsDiameter;
+ }
+ }
+
// Ask children to follow the new preview dimension.
super.onMeasure(MeasureSpec.makeMeasureSpec(previewWidth, MeasureSpec.EXACTLY),
MeasureSpec.makeMeasureSpec(previewHeight, MeasureSpec.EXACTLY));
diff --git a/src/com/android/camera/VideoModule.java b/src/com/android/camera/VideoModule.java
index 9a58985ab..cdd2a000d 100644
--- a/src/com/android/camera/VideoModule.java
+++ b/src/com/android/camera/VideoModule.java
@@ -853,7 +853,20 @@ public class VideoModule implements CameraModule,
". mDesiredPreviewHeight=" + mDesiredPreviewHeight);
}
+ void setPreviewFrameLayoutCameraOrientation(){
+ CameraInfo info = CameraHolder.instance().getCameraInfo()[mCameraId];
+
+ //if camera mount angle is 0 or 180, we want to resize preview
+ if(info.orientation % 180 == 0){
+ mUI.mPreviewFrameLayout.setRenderer(mUI.mPieRenderer);
+ mUI.mPreviewFrameLayout.cameraOrientationPreviewResize(true);
+ } else{
+ mUI.mPreviewFrameLayout.cameraOrientationPreviewResize(false);
+ }
+ }
+
private void resizeForPreviewAspectRatio() {
+ setPreviewFrameLayoutCameraOrientation();
mUI.setAspectRatio(
(double) mProfile.videoFrameWidth / mProfile.videoFrameHeight);
}
@@ -2228,6 +2241,7 @@ public class VideoModule implements CameraModule,
public void onConfigurationChanged(Configuration newConfig) {
Log.v(TAG, "onConfigurationChanged");
setDisplayOrientation();
+ resizeForPreviewAspectRatio();
}
@Override
diff --git a/src/com/android/camera/VideoUI.java b/src/com/android/camera/VideoUI.java
index 5ab9ec006..99cad8743 100644
--- a/src/com/android/camera/VideoUI.java
+++ b/src/com/android/camera/VideoUI.java
@@ -54,7 +54,7 @@ public class VideoUI implements SurfaceHolder.Callback, PieRenderer.PieListener,
// module fields
private CameraActivity mActivity;
private View mRootView;
- private PreviewFrameLayout mPreviewFrameLayout;
+ protected PreviewFrameLayout mPreviewFrameLayout;
private boolean mSurfaceViewReady;
private PreviewSurfaceView mPreviewSurfaceView;
// An review image having same size as preview. It is displayed when
@@ -69,7 +69,7 @@ public class VideoUI implements SurfaceHolder.Callback, PieRenderer.PieListener,
private LinearLayout mLabelsLinearLayout;
private View mTimeLapseLabel;
private RenderOverlay mRenderOverlay;
- private PieRenderer mPieRenderer;
+ protected PieRenderer mPieRenderer;
private VideoMenu mVideoMenu;
private AbstractSettingPopup mPopup;
private ZoomRenderer mZoomRenderer;
diff --git a/src/com/android/camera/ui/PieRenderer.java b/src/com/android/camera/ui/PieRenderer.java
index 61abc3717..eaf91b037 100644
--- a/src/com/android/camera/ui/PieRenderer.java
+++ b/src/com/android/camera/ui/PieRenderer.java
@@ -897,6 +897,10 @@ public class PieRenderer extends OverlayRenderer
return 2 * mCircleSize;
}
+ public int getDiameter() {
+ return (mArcRadius + mRadiusInc + (mRadiusInc / 4));
+ }
+
private int getRandomRange() {
return (int)(-60 + 120 * Math.random());
}