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 | |
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
-rw-r--r-- | res/layout/photo_module.xml | 6 | ||||
-rw-r--r-- | res/values/qcomarrays.xml | 11 | ||||
-rw-r--r-- | res/values/qcomstrings.xml | 10 | ||||
-rw-r--r-- | res/xml/camera_preferences.xml | 6 | ||||
-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 |
10 files changed, 183 insertions, 8 deletions
diff --git a/res/layout/photo_module.xml b/res/layout/photo_module.xml index c59d74300..89bc1ff39 100644 --- a/res/layout/photo_module.xml +++ b/res/layout/photo_module.xml @@ -56,6 +56,12 @@ android:layout_height="200dip" android:layout_marginTop="60dip" android:layout_marginLeft="90dip" /> + <com.android.camera.DrawAutoHDR + android:id="@+id/autohdr_view" + android:layout_width="200dip" + android:layout_height="200dip" + android:layout_marginTop="15dip" + android:layout_marginLeft="15dip" /> <TableLayout android:id="@+id/relative_seek" android:layout_width="match_parent" diff --git a/res/values/qcomarrays.xml b/res/values/qcomarrays.xml index c19bd673c..bd808fed3 100644 --- a/res/values/qcomarrays.xml +++ b/res/values/qcomarrays.xml @@ -590,5 +590,16 @@ <item>@string/setting_on_value</item> </string-array> + <!-- AUTO HDR dialog box entries --> + <string-array name="pref_camera_auto_hdr_entries" translatable="false"> + <item>@string/pref_camera_auto_hdr_entry_enable</item> + <item>@string/pref_camera_auto_hdr_entry_disable</item> + </string-array> + + <string-array name="pref_camera_auto_hdr_entryvalues" translatable="false"> + <item>@string/pref_camera_auto_hdr_value_enable</item> + <item>@string/pref_camera_auto_hdr_value_disable</item> + </string-array> + </resources> diff --git a/res/values/qcomstrings.xml b/res/values/qcomstrings.xml index ab5381451..b54fb1f91 100644 --- a/res/values/qcomstrings.xml +++ b/res/values/qcomstrings.xml @@ -666,5 +666,15 @@ <!-- Toast showing non-supported functionality for flash in AE bracket --> <string name="flash_aebracket_message">Flash is not supported in AE-Bracket Mode</string> + <!-- Settings screen, setting title text for Auto HDR--> + <string name="pref_camera_auto_hdr_title">AUTO HDR</string> + <string name="pref_camera_auto_hdr_default" translatable="false"> + disable</string> + + <!-- Settings screen, Auto HDR location dialog choices --> + <string name="pref_camera_auto_hdr_entry_enable">Enable</string> + <string name="pref_camera_auto_hdr_entry_disable">Disable</string> + <string name="pref_camera_auto_hdr_value_enable">enable</string> + <string name="pref_camera_auto_hdr_value_disable">disable</string> </resources> diff --git a/res/xml/camera_preferences.xml b/res/xml/camera_preferences.xml index db56927a7..f1d16fda5 100644 --- a/res/xml/camera_preferences.xml +++ b/res/xml/camera_preferences.xml @@ -250,4 +250,10 @@ camera:entries="@array/pref_camera_longshot_entries" camera:entryValues="@array/pref_camera_longshot_entryvalues" /> + <ListPreference + camera:key="pref_camera_auto_hdr_key" + camera:defaultValue="@string/pref_camera_auto_hdr_default" + camera:title="@string/pref_camera_auto_hdr_title" + camera:entries="@array/pref_camera_auto_hdr_entries" + camera:entryValues="@array/pref_camera_auto_hdr_entryvalues" /> </PreferenceGroup> 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)); } |