diff options
-rw-r--r--[-rwxr-xr-x] | src/com/android/camera/AndroidCameraManagerImpl.java | 20 | ||||
-rw-r--r--[-rwxr-xr-x] | src/com/android/camera/CameraManager.java | 14 | ||||
-rwxr-xr-x | src/com/android/camera/PhotoModule.java | 69 | ||||
-rw-r--r--[-rwxr-xr-x] | src_wrapper/org/codeaurora/snapcam/wrapper/CameraWrapper.java | 36 |
4 files changed, 139 insertions, 0 deletions
diff --git a/src/com/android/camera/AndroidCameraManagerImpl.java b/src/com/android/camera/AndroidCameraManagerImpl.java index e16d37e86..cad136cde 100755..100644 --- a/src/com/android/camera/AndroidCameraManagerImpl.java +++ b/src/com/android/camera/AndroidCameraManagerImpl.java @@ -39,6 +39,8 @@ import android.os.Looper; 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; import java.lang.reflect.Method; @@ -93,6 +95,7 @@ class AndroidCameraManagerImpl implements CameraManager { private static final int ENABLE_SHUTTER_SOUND = 501; private static final int SET_DISPLAY_ORIENTATION = 502; // Histogram + private static final int SET_HISTOGRAM_MODE = 601; private static final int SEND_HISTOGRAM_DATA = 602; //LONGSHOT private static final int SET_LONGSHOT = 701; @@ -387,6 +390,10 @@ class AndroidCameraManagerImpl implements CameraManager { mParametersIsDirty = true; return; + case SET_HISTOGRAM_MODE: + CameraWrapper.setHistogramMode(mCamera, (CameraDataCallback) msg.obj); + break; + case SEND_HISTOGRAM_DATA: CameraWrapper.sendHistogramData(mCamera); break; @@ -395,6 +402,10 @@ class AndroidCameraManagerImpl implements CameraManager { CameraWrapper.setLongshot(mCamera, (Boolean) msg.obj); break; + case SET_AUTO_HDR_MODE: + CameraWrapper.setMetadataCb(mCamera, (CameraMetaDataCallback) msg.obj); + break; + default: throw new RuntimeException("Invalid CameraProxy message=" + msg.what); } @@ -493,6 +504,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(); } @@ -647,6 +663,10 @@ class AndroidCameraManagerImpl implements CameraManager { } @Override + public void setHistogramMode(CameraDataCallback cb) { + mCameraHandler.obtainMessage(SET_HISTOGRAM_MODE, cb).sendToTarget(); + } + @Override public void sendHistogramData() { mCameraHandler.sendEmptyMessage(SEND_HISTOGRAM_DATA); } diff --git a/src/com/android/camera/CameraManager.java b/src/com/android/camera/CameraManager.java index d3ef9293d..b93e7182b 100755..100644 --- a/src/com/android/camera/CameraManager.java +++ b/src/com/android/camera/CameraManager.java @@ -25,6 +25,8 @@ import android.hardware.Camera.Parameters; 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. * @@ -173,6 +175,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() * @@ -359,6 +367,12 @@ public interface CameraManager { */ public void enableShutterSound(boolean enable); /** + * Set histogram Mode + * + * @param cb cameraDataCallback to use + */ + public void setHistogramMode(CameraDataCallback cb); + /** * Send the Histogram Data. * */ diff --git a/src/com/android/camera/PhotoModule.java b/src/com/android/camera/PhotoModule.java index e84c32872..672b973d0 100755 --- a/src/com/android/camera/PhotoModule.java +++ b/src/com/android/camera/PhotoModule.java @@ -324,6 +324,8 @@ public class PhotoModule : null; 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; @@ -1142,6 +1144,69 @@ public class PhotoModule } } } + private final class StatsCallback + implements android.hardware.Camera.CameraDataCallback { + @Override + public void onCameraData(int [] data, android.hardware.Camera camera) { + //if(!mPreviewing || !mHiston || !mFirstTimeInitialized){ + if(!mHiston || !mFirstTimeInitialized){ + return; + } + /*The first element in the array stores max hist value . Stats data begin from second value*/ + synchronized(statsdata) { + System.arraycopy(data,0,statsdata,0,STATS_DATA); + } + mActivity.runOnUiThread(new Runnable() { + public void run() { + if(mGraphView != null) + mGraphView.PreviewChanged(); + } + }); + } + } + + 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); + } + /* Checking if the meta data is for auto HDR */ + if (metadata[0] == 3) { + 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 { @@ -1641,6 +1706,7 @@ public class PhotoModule if(mHiston) { if (mSnapshotMode != CameraInfoWrapper.CAMERA_SUPPORT_MODE_ZSL) { mHiston = false; + mCameraDevice.setHistogramMode(null); } mActivity.runOnUiThread(new Runnable() { public void run() { @@ -3513,6 +3579,7 @@ public class PhotoModule } }); mParameters.setSceneMode("asd"); + mCameraDevice.setMetadataCb(mMetaDataCallback); } else { mAutoHdrEnable = false; @@ -3614,6 +3681,7 @@ public class PhotoModule } } }); + mCameraDevice.setHistogramMode(mStatsCallback); mHiston = true; } else { mHiston = false; @@ -3623,6 +3691,7 @@ public class PhotoModule mGraphView.setVisibility(View.INVISIBLE); } }); + mCameraDevice.setHistogramMode(null); } } diff --git a/src_wrapper/org/codeaurora/snapcam/wrapper/CameraWrapper.java b/src_wrapper/org/codeaurora/snapcam/wrapper/CameraWrapper.java index 8078a38b8..6739686e9 100755..100644 --- a/src_wrapper/org/codeaurora/snapcam/wrapper/CameraWrapper.java +++ b/src_wrapper/org/codeaurora/snapcam/wrapper/CameraWrapper.java @@ -46,9 +46,45 @@ import android.hardware.Camera.ShutterCallback; import android.util.Log; import android.view.SurfaceHolder; +import android.hardware.Camera.CameraMetaDataCallback; +import android.hardware.Camera.CameraDataCallback; + public class CameraWrapper extends Wrapper{ private static Method method_setMetadataCb = null; + public static final void setMetadataCb(Camera camera, CameraMetaDataCallback cb){ + if ( DEBUG ){ + Log.e(TAG, "" + Camera.class + " no setMetadataCb"); + return; + } + try{ + if ( method_setMetadataCb == null ){ + method_setMetadataCb = Camera.class.getMethod("setMetadataCb", + android.hardware.Camera.CameraMetaDataCallback.class); + } + method_setMetadataCb.invoke(camera, cb); + }catch (Exception exception){ + exception.printStackTrace(); + } + } + + + private static Method method_setHistogramMode = null; + public static final void setHistogramMode(Camera camera, CameraDataCallback cb) { + if ( DEBUG ){ + Log.e(TAG, "" + Camera.class + " no setHistogramMode"); + return; + } + try{ + if ( method_setHistogramMode == null ){ + method_setHistogramMode = Camera.class.getMethod("setHistogramMode", + CameraDataCallback.class); + } + method_setHistogramMode.invoke(camera, cb); + }catch (Exception exception){ + exception.printStackTrace(); + } + } private static Method method_sendHistogramData = null; public static final void sendHistogramData(Camera camera){ |