diff options
author | Abhishek Pant <apant@codeaurora.org> | 2013-12-04 15:51:48 +0530 |
---|---|---|
committer | Abhishek Pant <apant@codeaurora.org> | 2014-06-06 18:57:35 +0530 |
commit | cb4748b2c5e264fc5185005d366cbdf5db140674 (patch) | |
tree | e66e3261880f96876eac62390562806fec0c2ddd /src | |
parent | ae531060071669eb4fcb10f04420f941bc04115c (diff) | |
download | android_packages_apps_Snap-cb4748b2c5e264fc5185005d366cbdf5db140674.tar.gz android_packages_apps_Snap-cb4748b2c5e264fc5185005d366cbdf5db140674.tar.bz2 android_packages_apps_Snap-cb4748b2c5e264fc5185005d366cbdf5db140674.zip |
Camera2: Adding support for Auto HDR
Adding support for Auto HDR for camera application.
CRs-fixed: 629556
Change-Id: I02cdc2accb3e9fd4a9039b7f632ba3eb04fcc798
Diffstat (limited to 'src')
-rw-r--r-- | src/com/android/camera/AndroidCameraManagerImpl.java | 12 | ||||
-rw-r--r-- | src/com/android/camera/CameraManager.java | 7 | ||||
-rw-r--r-- | src/com/android/camera/CameraSettings.java | 3 | ||||
-rw-r--r-- | src/com/android/camera/PhotoMenu.java | 11 | ||||
-rw-r--r-- | src/com/android/camera/PhotoModule.java | 121 | ||||
-rw-r--r-- | src/com/android/camera/util/CameraUtil.java | 4 |
6 files changed, 150 insertions, 8 deletions
diff --git a/src/com/android/camera/AndroidCameraManagerImpl.java b/src/com/android/camera/AndroidCameraManagerImpl.java index f833cb279..75f127a68 100644 --- a/src/com/android/camera/AndroidCameraManagerImpl.java +++ b/src/com/android/camera/AndroidCameraManagerImpl.java @@ -40,6 +40,7 @@ import android.os.Message; import android.util.Log; import android.view.SurfaceHolder; import android.hardware.Camera.CameraDataCallback; +import android.hardware.Camera.CameraMetaDataCallback; import com.android.camera.util.ApiHelper; import android.os.ConditionVariable; @@ -94,7 +95,7 @@ class AndroidCameraManagerImpl implements CameraManager { private static final int SEND_HISTOGRAM_DATA = 602; //LONGSHOT private static final int SET_LONGSHOT = 701; - + private static final int SET_AUTO_HDR_MODE = 801; private CameraHandler mCameraHandler; private android.hardware.Camera mCamera; @@ -343,6 +344,10 @@ class AndroidCameraManagerImpl implements CameraManager { mCamera.setLongshot((Boolean) msg.obj); break; + case SET_AUTO_HDR_MODE: + mCamera.setMetadataCb((CameraMetaDataCallback) msg.obj); + break; + default: throw new RuntimeException("Invalid CameraProxy message=" + msg.what); } @@ -435,6 +440,11 @@ class AndroidCameraManagerImpl implements CameraManager { } @Override + public void setMetadataCb(CameraMetaDataCallback cb){ + mCameraHandler.obtainMessage(SET_AUTO_HDR_MODE, cb).sendToTarget(); + } + + @Override public void setPreviewTexture(SurfaceTexture surfaceTexture) { mCameraHandler.obtainMessage(SET_PREVIEW_TEXTURE_ASYNC, surfaceTexture).sendToTarget(); } diff --git a/src/com/android/camera/CameraManager.java b/src/com/android/camera/CameraManager.java index 8ad0d52d6..1856ec85c 100644 --- a/src/com/android/camera/CameraManager.java +++ b/src/com/android/camera/CameraManager.java @@ -26,6 +26,7 @@ import android.os.Build; import android.os.Handler; import android.view.SurfaceHolder; import android.hardware.Camera.CameraDataCallback; +import android.hardware.Camera.CameraMetaDataCallback; /** * An interface which provides possible camera device operations. @@ -166,6 +167,12 @@ public interface CameraManager { public void release(); /** + * Sets the metadata cb + * @cb Metadata callback object + */ + public void setMetadataCb (CameraMetaDataCallback cb); + + /** * Reconnects to the camera device. * @see android.hardware.Camera#reconnect() * diff --git a/src/com/android/camera/CameraSettings.java b/src/com/android/camera/CameraSettings.java index c70ee9909..481677cc6 100644 --- a/src/com/android/camera/CameraSettings.java +++ b/src/com/android/camera/CameraSettings.java @@ -127,6 +127,8 @@ public class CameraSettings { private static final String TRUE = "true"; private static final String FALSE = "false"; + public static final String KEY_AUTO_HDR = "pref_camera_auto_hdr_key"; + //for flip public static final String KEY_QC_PREVIEW_FLIP = "preview-flip"; public static final String KEY_QC_VIDEO_FLIP = "video-flip"; @@ -351,6 +353,7 @@ public class CameraSettings { ListPreference pictureFormat = group.findPreference(KEY_PICTURE_FORMAT); ListPreference hfr = group.findPreference(KEY_VIDEO_HIGH_FRAME_RATE); ListPreference longShot = group.findPreference(KEY_LONGSHOT); + ListPreference auto_hdr = group.findPreference(KEY_AUTO_HDR); if (touchAfAec != null) { filterUnsupportedOptions(group, diff --git a/src/com/android/camera/PhotoMenu.java b/src/com/android/camera/PhotoMenu.java index a9526962b..c80a49835 100644 --- a/src/com/android/camera/PhotoMenu.java +++ b/src/com/android/camera/PhotoMenu.java @@ -104,7 +104,8 @@ public class PhotoMenu extends PieController CameraSettings.KEY_TIMER, CameraSettings.KEY_TIMER_SOUND_EFFECTS, CameraSettings.KEY_CAMERA_SAVEPATH, - CameraSettings.KEY_LONGSHOT + CameraSettings.KEY_LONGSHOT, + CameraSettings.KEY_AUTO_HDR }; mOtherKeys2 = new String[] { @@ -252,7 +253,10 @@ public class PhotoMenu extends PieController String faceDetection = (pref != null) ? pref.getValue() : null; pref = mPreferenceGroup.findPreference(CameraSettings.KEY_ZSL); String zsl = (pref != null) ? pref.getValue() : null; - if ((sceneMode != null) && !Parameters.SCENE_MODE_AUTO.equals(sceneMode)){ + pref = mPreferenceGroup.findPreference (CameraSettings.KEY_AUTO_HDR); + String autohdr = (pref != null) ? pref.getValue() : null; + if (((sceneMode != null) && !Parameters.SCENE_MODE_AUTO.equals(sceneMode)) + || ((autohdr != null) && autohdr.equals("enable"))) { popup3.setPreferenceEnabled(CameraSettings.KEY_FOCUS_MODE,false); popup2.setPreferenceEnabled(CameraSettings.KEY_AUTOEXPOSURE,false); popup2.setPreferenceEnabled(CameraSettings.KEY_TOUCH_AF_AEC,false); @@ -264,6 +268,9 @@ public class PhotoMenu extends PieController popup3.setPreferenceEnabled(CameraSettings.KEY_WHITE_BALANCE,false); popup3.setPreferenceEnabled(CameraSettings.KEY_EXPOSURE,false); } + if ((autohdr != null) && autohdr.equals("enable")) { + popup1.setPreferenceEnabled(CameraSettings.KEY_SCENE_MODE,false); + } if ((zsl != null) && Parameters.ZSL_ON.equals(zsl)) { popup3.setPreferenceEnabled(CameraSettings.KEY_FOCUS_MODE,false); } diff --git a/src/com/android/camera/PhotoModule.java b/src/com/android/camera/PhotoModule.java index a6f8fb239..7803bad04 100644 --- a/src/com/android/camera/PhotoModule.java +++ b/src/com/android/camera/PhotoModule.java @@ -112,7 +112,7 @@ public class PhotoModule private int mBurstSnapNum = 1; private int mReceivedSnapNum = 0; public boolean mFaceDetectionEnabled = false; - + private DrawAutoHDR mDrawAutoHDR; /*Histogram variables*/ private GraphView mGraphView; private static final int STATS_DATA = 257; @@ -158,6 +158,7 @@ public class PhotoModule private PhotoUI mUI; + public boolean mAutoHdrEnable; // The activity is going to switch to the specified camera id. This is // needed because texture copy is done in GL thread. -1 means camera is not // switching. @@ -278,7 +279,7 @@ public class PhotoModule private final CameraErrorCallback mErrorCallback = new CameraErrorCallback(); private final StatsCallback mStatsCallback = new StatsCallback(); - + private final MetaDataCallback mMetaDataCallback = new MetaDataCallback(); private long mFocusStartTime; private long mShutterCallbackTime; private long mPostViewPictureCallbackTime; @@ -712,11 +713,13 @@ public class PhotoModule } mNamedImages = new NamedImages(); - mGraphView = (GraphView)mRootView.findViewById(R.id.graph_view); - if(mGraphView == null){ - Log.e(TAG, "mGraphView is null"); + mGraphView = (GraphView)mRootView.findViewById(R.id.graph_view); + mDrawAutoHDR = (DrawAutoHDR )mRootView.findViewById(R.id.autohdr_view); + if (mGraphView == null || mDrawAutoHDR == null){ + Log.e(TAG, "mGraphView or mDrawAutoHDR is null"); } else{ mGraphView.setPhotoModuleObject(this); + mDrawAutoHDR.setPhotoModuleObject(this); } mFirstTimeInitialized = true; @@ -874,6 +877,47 @@ public class PhotoModule }); } } + + private final class MetaDataCallback + implements android.hardware.Camera.CameraMetaDataCallback{ + @Override + public void onCameraMetaData (byte[] data, android.hardware.Camera camera) { + int metadata[] = new int[3]; + if (data.length <= 12) { + for (int i =0;i<3;i++) { + metadata[i] = byteToInt( (byte []) data, i*4); + } + if (metadata[2] == 1) { + mAutoHdrEnable = true; + mActivity.runOnUiThread(new Runnable() { + public void run() { + if (mDrawAutoHDR != null) + mDrawAutoHDR.AutoHDR(); + } + }); + } + else { + mAutoHdrEnable = false; + mActivity.runOnUiThread(new Runnable() { + public void run() { + if (mDrawAutoHDR != null) + mDrawAutoHDR.AutoHDR(); + } + }); + } + } + } + + private int byteToInt (byte[] b, int offset) { + int value = 0; + for (int i = 0; i < 4; i++) { + int shift = (4 - 1 - i) * 8; + value += (b[(3-i) + offset] & 0x000000FF) << shift; + } + return value; + } + } + private final class PostViewPictureCallback implements CameraPictureCallback { @Override @@ -2528,6 +2572,32 @@ public class PhotoModule String zsl = mPreferences.getString(CameraSettings.KEY_ZSL, mActivity.getString(R.string.pref_camera_zsl_default)); + String auto_hdr = mPreferences.getString(CameraSettings.KEY_AUTO_HDR, + mActivity.getString(R.string.pref_camera_hdr_default)); + if (CameraUtil.isAutoHDRSupported(mParameters)) { + mParameters.setAutoHDRMode(auto_hdr); + if (auto_hdr.equals("enable")) { + mActivity.runOnUiThread(new Runnable() { + public void run() { + if (mDrawAutoHDR != null) { + mDrawAutoHDR.setVisibility(View.VISIBLE); + } + } + }); + mParameters.setSceneMode("asd"); + mCameraDevice.setMetadataCb(mMetaDataCallback); + } + else { + mAutoHdrEnable = false; + mActivity.runOnUiThread( new Runnable() { + public void run () { + if (mDrawAutoHDR != null) { + mDrawAutoHDR.setVisibility (View.INVISIBLE); + } + } + }); + } + } mParameters.setZSLMode(zsl); if(zsl.equals("on")) { //Switch on ZSL Camera mode @@ -3411,3 +3481,44 @@ class GraphView extends View { mPhotoModule = photoModule; } } + +class DrawAutoHDR extends View{ + + private static final String TAG = "AutoHdrView"; + private PhotoModule mPhotoModule; + + public DrawAutoHDR (Context context, AttributeSet attrs) { + super(context,attrs); + } + + @Override + protected void onDraw (Canvas canvas) { + if (mPhotoModule == null) + return; + if (mPhotoModule.mAutoHdrEnable) { + Paint AutoHDRPaint = new Paint(); + AutoHDRPaint.setColor(Color.WHITE); + AutoHDRPaint.setAlpha (0); + canvas.drawPaint(AutoHDRPaint); + AutoHDRPaint.setStyle(Paint.Style.STROKE); + AutoHDRPaint.setColor(Color.MAGENTA); + AutoHDRPaint.setStrokeWidth(1); + AutoHDRPaint.setTextSize(16); + AutoHDRPaint.setAlpha (255); + canvas.drawText("HDR On",200,100,AutoHDRPaint); + } + else { + super.onDraw(canvas); + return; + } + } + + public void AutoHDR () { + invalidate(); + } + + public void setPhotoModuleObject (PhotoModule photoModule) { + mPhotoModule = photoModule; + } + +} diff --git a/src/com/android/camera/util/CameraUtil.java b/src/com/android/camera/util/CameraUtil.java index 68211d648..d90b52552 100644 --- a/src/com/android/camera/util/CameraUtil.java +++ b/src/com/android/camera/util/CameraUtil.java @@ -108,6 +108,7 @@ public class CameraUtil { private static final String AUTO_EXPOSURE_LOCK_SUPPORTED = "auto-exposure-lock-supported"; private static final String AUTO_WHITE_BALANCE_LOCK_SUPPORTED = "auto-whitebalance-lock-supported"; private static final String VIDEO_SNAPSHOT_SUPPORTED = "video-snapshot-supported"; + private static final String AUTO_HDR_SUPPORTED = "auto-hdr-supported"; public static final String SCENE_MODE_HDR = "hdr"; public static final String TRUE = "true"; public static final String FALSE = "false"; @@ -127,6 +128,9 @@ public class CameraUtil { return TRUE.equals(params.get(AUTO_EXPOSURE_LOCK_SUPPORTED)); } + public static boolean isAutoHDRSupported(Parameters params) { + return TRUE.equals(params.get(AUTO_HDR_SUPPORTED)); + } public static boolean isAutoWhiteBalanceLockSupported(Parameters params) { return TRUE.equals(params.get(AUTO_WHITE_BALANCE_LOCK_SUPPORTED)); } |