summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--assets/dependency.json12
-rw-r--r--res/values/camera2arrays.xml11
-rw-r--r--res/values/qcomstrings.xml12
-rw-r--r--res/xml/capture_preferences.xml7
-rw-r--r--src/com/android/camera/CaptureModule.java125
-rw-r--r--src/com/android/camera/CaptureUI.java1
-rw-r--r--src/com/android/camera/SettingsManager.java3
7 files changed, 152 insertions, 19 deletions
diff --git a/assets/dependency.json b/assets/dependency.json
index bf567a0ab..04abb25dd 100644
--- a/assets/dependency.json
+++ b/assets/dependency.json
@@ -35,7 +35,8 @@
"pref_camera2_whitebalance_key":"1",
"pref_camera2_exposure_key":"0",
"pref_camera2_clearsight_key":"off",
- "pref_camera2_mono_preview_key":"off"}
+ "pref_camera2_mono_preview_key":"off",
+ "pref_camera2_mpo_key":"off"}
,
"100":
{"pref_camera2_longshot_key":"off",
@@ -43,6 +44,13 @@
,
"0":
{"pref_camera2_clearsight_key":"off",
- "pref_camera2_mono_preview_key":"off"}
+ "pref_camera2_mono_preview_key":"off",
+ "pref_camera2_mpo_key":"off"}
+ },
+ "pref_camera2_clearsight_key":
+ {
+ "off":{},
+ "on":
+ {"pref_camera2_mpo_key":"on"}
}
} \ No newline at end of file
diff --git a/res/values/camera2arrays.xml b/res/values/camera2arrays.xml
index bee116425..2548887c0 100644
--- a/res/values/camera2arrays.xml
+++ b/res/values/camera2arrays.xml
@@ -90,6 +90,17 @@
<item>@string/pref_camera2_clearsight_value_on</item>
</string-array>
+ <string-array name="pref_camera2_mpo_entries" translatable="true">
+ <item>@string/pref_camera2_mpo_entry_off</item>
+ <item>@string/pref_camera2_mpo_entry_on</item>
+ </string-array>
+
+ <string-array name="pref_camera2_mpo_entryvalues" translatable="false">
+ <item>@string/pref_camera2_mpo_value_off</item>
+ <item>@string/pref_camera2_mpo_value_on</item>
+ </string-array>
+
+
<!-- Refer to CONTROL_SCENE_MODE of Camera2 API for values
-1 refers to ones not supported in Camera2 API
0 is special case added for auto (meaning off)
diff --git a/res/values/qcomstrings.xml b/res/values/qcomstrings.xml
index 371c03ac8..b60099e2b 100644
--- a/res/values/qcomstrings.xml
+++ b/res/values/qcomstrings.xml
@@ -567,8 +567,8 @@
<string name="pref_camera2_clearsight_title" translatable="true">ClearSight</string>
<string name="pref_camera2_clearsight_default" translatable="false">on</string>
- <string name="pref_camera2_clearsight_entry_on" translatable="false">On</string>
- <string name="pref_camera2_clearsight_entry_off" translatable="false">Off</string>
+ <string name="pref_camera2_clearsight_entry_on" translatable="true">On</string>
+ <string name="pref_camera2_clearsight_entry_off" translatable="true">Off</string>
<string name="pref_camera2_clearsight_value_on" translatable="false">on</string>
<string name="pref_camera2_clearsight_value_off" translatable="false">off</string>
@@ -576,6 +576,14 @@
<string name="clearsight_capture_success">ClearSight capture successful</string>
<string name="clearsight_capture_fail">ClearSight capture failed</string>
+ <string name="pref_camera2_mpo_title" translatable="true">MPO Format</string>
+ <string name="pref_camera2_mpo_default" translatable="false">off</string>
+ <string name="pref_camera2_mpo_entry_on" translatable="true">On</string>
+ <string name="pref_camera2_mpo_entry_off" translatable="true">Off</string>
+
+ <string name="pref_camera2_mpo_value_on" translatable="false">on</string>
+ <string name="pref_camera2_mpo_value_off" translatable="false">off</string>
+
<string name="pref_camera2_scenemode_default" translatable="false">0</string>
<string name="pref_camera2_whitebalance_default" translatable="false">1</string>
<string name="pref_camera2_coloreffect_default" translatable="false">0</string>
diff --git a/res/xml/capture_preferences.xml b/res/xml/capture_preferences.xml
index a71ce6d14..298d9cc9f 100644
--- a/res/xml/capture_preferences.xml
+++ b/res/xml/capture_preferences.xml
@@ -107,6 +107,13 @@
camera:key="pref_camera2_clearsight_key"
camera:title="@string/pref_camera2_clearsight_title"/>
+ <ListPreference
+ camera:defaultValue="@string/pref_camera2_mpo_default"
+ camera:entries="@array/pref_camera2_mpo_entries"
+ camera:entryValues="@array/pref_camera2_mpo_entryvalues"
+ camera:key="pref_camera2_mpo_key"
+ camera:title="@string/pref_camera2_mpo_title"/>
+
<IconListPreference
camera:defaultValue="@string/pref_camera2_coloreffect_default"
camera:entries="@array/pref_camera2_coloreffect_entries"
diff --git a/src/com/android/camera/CaptureModule.java b/src/com/android/camera/CaptureModule.java
index 73d157f5a..b35da5d06 100644
--- a/src/com/android/camera/CaptureModule.java
+++ b/src/com/android/camera/CaptureModule.java
@@ -216,6 +216,7 @@ public class CaptureModule implements CameraModule, PhotoController,
private HandlerThread mCameraThread;
private HandlerThread mImageAvailableThread;
private HandlerThread mCaptureCallbackThread;
+ private HandlerThread mMpoSaveThread;
/**
* A {@link Handler} for running tasks in the background.
@@ -230,6 +231,7 @@ public class CaptureModule implements CameraModule, PhotoController,
private Handler mCameraHandler;
private Handler mImageAvailableHandler;
private Handler mCaptureCallbackHandler;
+ private Handler mMpoSaveHandler;
/**
* An {@link ImageReader} that handles still image capture.
@@ -608,6 +610,12 @@ public class CaptureModule implements CameraModule, PhotoController,
return isBackCamera() && getCameraMode() == DUAL_MODE && value.equals("on");
}
+ private boolean isMpoOn() {
+ String value = mSettingsManager.getValue(SettingsManager.KEY_MPO);
+ if (value == null) return false;
+ return isBackCamera() && getCameraMode() == DUAL_MODE && value.equals("on");
+ }
+
public static int getQualityNumber(String jpegQuality) {
try {
int qualityPercentile = Integer.parseInt(jpegQuality);
@@ -1080,6 +1088,11 @@ public class CaptureModule implements CameraModule, PhotoController,
}
}, mCaptureCallbackHandler);
} else {
+ if(isMpoOn()) {
+ mCaptureStartTime = System.currentTimeMillis();
+ mMpoSaveHandler.obtainMessage(MpoSaveHandler.MSG_CONFIGURE,
+ Long.valueOf(mCaptureStartTime)).sendToTarget();
+ }
mCaptureSession[id].capture(captureBuilder.build(),
new CameraCaptureSession.CaptureCallback() {
@@ -1275,21 +1288,25 @@ public class CaptureModule implements CameraModule, PhotoController,
public void onImageAvailable(ImageReader reader) {
Log.d(TAG, "image available for cam: " + mCamId);
Image image = reader.acquireNextImage();
- mCaptureStartTime = System.currentTimeMillis();
- mNamedImages.nameNewImage(mCaptureStartTime);
- NamedEntity name = mNamedImages.getNextNameEntity();
- String title = (name == null) ? null : name.title;
- long date = (name == null) ? -1 : name.date;
-
- ByteBuffer buffer = image.getPlanes()[0].getBuffer();
- byte[] bytes = new byte[buffer.remaining()];
- mLastJpegData = bytes;
- buffer.get(bytes);
-
- mActivity.getMediaSaveService().addImage(bytes, title, date,
- null, image.getWidth(), image.getHeight(), 0, null,
- mOnMediaSavedListener, mContentResolver, "jpeg");
- image.close();
+
+ if(isMpoOn()) {
+ mMpoSaveHandler.obtainMessage(
+ MpoSaveHandler.MSG_NEW_IMG, mCamId, 0, image).sendToTarget();
+ } else {
+ mCaptureStartTime = System.currentTimeMillis();
+ mNamedImages.nameNewImage(mCaptureStartTime);
+ NamedEntity name = mNamedImages.getNextNameEntity();
+ String title = (name == null) ? null : name.title;
+ long date = (name == null) ? -1 : name.date;
+
+ byte[] bytes = getJpegData(image);
+ mLastJpegData = bytes;
+
+ mActivity.getMediaSaveService().addImage(bytes, title, date,
+ null, image.getWidth(), image.getHeight(), 0, null,
+ mOnMediaSavedListener, mContentResolver, "jpeg");
+ image.close();
+ }
}
}, mImageAvailableHandler);
}
@@ -1509,10 +1526,13 @@ public class CaptureModule implements CameraModule, PhotoController,
mImageAvailableThread.start();
mCaptureCallbackThread = new HandlerThread("CameraCaptureCallback");
mCaptureCallbackThread.start();
+ mMpoSaveThread = new HandlerThread("MpoSaveHandler");
+ mMpoSaveThread.start();
mCameraHandler = new MyCameraHandler(mCameraThread.getLooper());
mImageAvailableHandler = new Handler(mImageAvailableThread.getLooper());
mCaptureCallbackHandler = new Handler(mCaptureCallbackThread.getLooper());
+ mMpoSaveHandler = new MpoSaveHandler(mMpoSaveThread.getLooper());
}
/**
@@ -1522,6 +1542,7 @@ public class CaptureModule implements CameraModule, PhotoController,
mCameraThread.quitSafely();
mImageAvailableThread.quitSafely();
mCaptureCallbackThread.quitSafely();
+ mMpoSaveThread.quitSafely();
try {
mCameraThread.join();
@@ -1544,6 +1565,13 @@ public class CaptureModule implements CameraModule, PhotoController,
} catch (InterruptedException e) {
e.printStackTrace();
}
+ try {
+ mMpoSaveThread.join();
+ mMpoSaveThread = null;
+ mMpoSaveHandler = null;
+ } catch (InterruptedException e) {
+ e.printStackTrace();
+ }
}
private void openCamera(int id) {
@@ -3084,6 +3112,66 @@ public class CaptureModule implements CameraModule, PhotoController,
}
}
+ private class MpoSaveHandler extends Handler {
+ static final int MSG_CONFIGURE = 0;
+ static final int MSG_NEW_IMG = 1;
+
+ private Image monoImage;
+ private Image bayerImage;
+ private Long captureStartTime;
+
+ public MpoSaveHandler(Looper looper) {
+ super(looper);
+ }
+
+ @Override
+ public void handleMessage(Message msg) {
+ switch (msg.what) {
+ case MSG_CONFIGURE:
+ captureStartTime = (Long) msg.obj;
+ break;
+ case MSG_NEW_IMG:
+ processNewImage(msg);
+ break;
+ }
+ }
+
+ private void processNewImage(Message msg) {
+ Log.d(TAG, "MpoSaveHandler:processNewImage for cam id: " + msg.arg1);
+ if(msg.arg1 == MONO_ID) {
+ monoImage = (Image)msg.obj;
+ } else if(bayerImage == null){
+ bayerImage = (Image)msg.obj;
+ }
+
+ if(monoImage != null && bayerImage != null) {
+ saveMpoImage();
+ }
+ }
+
+ private void saveMpoImage() {
+ mNamedImages.nameNewImage(captureStartTime);
+ NamedEntity namedEntity = mNamedImages.getNextNameEntity();
+ String title = (namedEntity == null) ? null : namedEntity.title;
+ long date = (namedEntity == null) ? -1 : namedEntity.date;
+ int width = bayerImage.getWidth();
+ int height = bayerImage.getHeight();
+ byte[] bayerBytes = getJpegData(bayerImage);
+ byte[] monoBytes = getJpegData(monoImage);
+
+ mLastJpegData = bayerBytes;
+ mActivity.getMediaSaveService().addMpoImage(
+ null, bayerBytes, monoBytes, width, height, title,
+ date, null, 0, mOnMediaSavedListener, mContentResolver, "jpeg");
+
+ bayerImage.close();
+ bayerImage = null;
+ monoImage.close();
+ monoImage = null;
+ namedEntity = null;
+ }
+ }
+
@Override
public void onClearSightSuccess() {
Log.d(TAG, "onClearSightSuccess");
@@ -3137,4 +3225,11 @@ public class CaptureModule implements CameraModule, PhotoController,
public void onErrorListener(int error) {
enableRecordingLocation(false);
}
+
+ private byte[] getJpegData(Image image) {
+ ByteBuffer buffer = image.getPlanes()[0].getBuffer();
+ byte[] bytes = new byte[buffer.remaining()];
+ buffer.get(bytes);
+ return bytes;
+ }
}
diff --git a/src/com/android/camera/CaptureUI.java b/src/com/android/camera/CaptureUI.java
index c07c3cf3e..9633f05e5 100644
--- a/src/com/android/camera/CaptureUI.java
+++ b/src/com/android/camera/CaptureUI.java
@@ -104,6 +104,7 @@ public class CaptureUI implements
SettingsManager.KEY_MONO_ONLY,
SettingsManager.KEY_CLEARSIGHT,
SettingsManager.KEY_MONO_PREVIEW,
+ SettingsManager.KEY_MPO,
SettingsManager.KEY_NOISE_REDUCTION,
SettingsManager.KEY_DIS,
SettingsManager.KEY_VIDEO_ENCODER,
diff --git a/src/com/android/camera/SettingsManager.java b/src/com/android/camera/SettingsManager.java
index e78a3605b..971a22771 100644
--- a/src/com/android/camera/SettingsManager.java
+++ b/src/com/android/camera/SettingsManager.java
@@ -83,6 +83,7 @@ public class SettingsManager implements ListMenu.SettingsListener {
public static final String KEY_MONO_ONLY = "pref_camera2_mono_only_key";
public static final String KEY_MONO_PREVIEW = "pref_camera2_mono_preview_key";
public static final String KEY_CLEARSIGHT = "pref_camera2_clearsight_key";
+ public static final String KEY_MPO = "pref_camera2_mpo_key";
public static final String KEY_FILTER_MODE = "pref_camera2_filter_mode_key";
public static final String KEY_COLOR_EFFECT = "pref_camera2_coloreffect_key";
public static final String KEY_SCENE_MODE = "pref_camera2_scenemode_key";
@@ -459,6 +460,7 @@ public class SettingsManager implements ListMenu.SettingsListener {
ListPreference clearsight = mPreferenceGroup.findPreference(KEY_CLEARSIGHT);
ListPreference monoPreview = mPreferenceGroup.findPreference(KEY_MONO_PREVIEW);
ListPreference monoOnly = mPreferenceGroup.findPreference(KEY_MONO_ONLY);
+ ListPreference mpo = mPreferenceGroup.findPreference(KEY_MPO);
ListPreference redeyeReduction = mPreferenceGroup.findPreference(KEY_REDEYE_REDUCTION);
ListPreference videoQuality = mPreferenceGroup.findPreference(KEY_VIDEO_QUALITY);
ListPreference videoEncoder = mPreferenceGroup.findPreference(KEY_VIDEO_ENCODER);
@@ -510,6 +512,7 @@ public class SettingsManager implements ListMenu.SettingsListener {
if (clearsight != null) removePreference(mPreferenceGroup, KEY_CLEARSIGHT);
if (monoPreview != null) removePreference(mPreferenceGroup, KEY_MONO_PREVIEW);
if (monoOnly != null) removePreference(mPreferenceGroup, KEY_MONO_ONLY);
+ if (mpo != null) removePreference(mPreferenceGroup, KEY_MPO);
}
if (redeyeReduction != null) {