summaryrefslogtreecommitdiffstats
path: root/src/com/android/camera/imageprocessor
diff options
context:
space:
mode:
authorjunjiez <junjiez@codeaurora.org>2016-11-15 09:28:35 +0800
committerjunjiez <junjiez@codeaurora.org>2017-01-06 10:21:50 +0800
commit9d924d9ca95ece1686a8cdca8c46607078f44618 (patch)
treeeec3b238c191052f858ecfbd90d2c073b2a6a373 /src/com/android/camera/imageprocessor
parent15f6d966c807c371a12f68bf9f5f4e7447a9ba8e (diff)
downloadandroid_packages_apps_Snap-9d924d9ca95ece1686a8cdca8c46607078f44618.tar.gz
android_packages_apps_Snap-9d924d9ca95ece1686a8cdca8c46607078f44618.tar.bz2
android_packages_apps_Snap-9d924d9ca95ece1686a8cdca8c46607078f44618.zip
SnapdragonCamera:Add Raw capture to developer option
Add raving as Raw option to the developer options, and save both JPEG and RAW data when it't turned on Change-Id: Id2462d0bacc3f2acdf3610b2ca8054079dc40b85 CRs-Fixed: 1087490
Diffstat (limited to 'src/com/android/camera/imageprocessor')
-rwxr-xr-xsrc/com/android/camera/imageprocessor/PostProcessor.java137
-rwxr-xr-x[-rw-r--r--]src/com/android/camera/imageprocessor/ZSLQueue.java24
2 files changed, 131 insertions, 30 deletions
diff --git a/src/com/android/camera/imageprocessor/PostProcessor.java b/src/com/android/camera/imageprocessor/PostProcessor.java
index 73a0049d4..546485675 100755
--- a/src/com/android/camera/imageprocessor/PostProcessor.java
+++ b/src/com/android/camera/imageprocessor/PostProcessor.java
@@ -130,6 +130,7 @@ public class PostProcessor{
private ImageReader mImageReader;
private ImageReader mZSLReprocessImageReader;
private boolean mUseZSL = true;
+ private boolean mSaveRaw = false;
private Handler mZSLHandler;
private HandlerThread mZSLHandlerThread;
private Handler mSavingHander;
@@ -139,7 +140,7 @@ public class PostProcessor{
private TotalCaptureResult mZSLFallOffResult = null;
private boolean mIsZSLFallOff = false;
private TotalCaptureResult mLatestResultForLongShot = null;
- private LinkedList<Image> mFallOffImages = new LinkedList<Image>();
+ private LinkedList<ZSLQueue.ImageItem> mFallOffImages = new LinkedList<ZSLQueue.ImageItem>();
private int mPendingContinuousRequestCount = 0;
public int mMaxRequiredImageNum;
@@ -165,10 +166,18 @@ public class PostProcessor{
private class ImageWrapper {
Image mImage;
+ Image mRawImage;
boolean mIsTaken;
public ImageWrapper(Image image) {
mImage = image;
+ mRawImage = null;
+ mIsTaken = false;
+ }
+
+ public ImageWrapper(Image image, Image rawImage) {
+ mImage = image;
+ mRawImage = rawImage;
mIsTaken = false;
}
@@ -180,23 +189,31 @@ public class PostProcessor{
mIsTaken = true;
return mImage;
}
+
+ public Image getRawImage() {
+ return mRawImage;
+ }
}
private void clearFallOffImage() {
- for(Image im: mFallOffImages ) {
+ for(ZSLQueue.ImageItem item: mFallOffImages ) {
try {
- im.close();
+ item.getImage().close();
+ Image raw = item.getRawImage();
+ if (raw != null) {
+ raw.close();
+ }
} catch(Exception e) {
}
}
mFallOffImages.clear();
}
- private Image findFallOffImage(long timestamp) {
- Image foundImage = null;
- for(Image im: mFallOffImages ) {
- if(im.getTimestamp() == timestamp) {
- foundImage = im;
+ private ZSLQueue.ImageItem findFallOffImage(long timestamp) {
+ ZSLQueue.ImageItem foundImage = null;
+ for(ZSLQueue.ImageItem item: mFallOffImages ) {
+ if(item.getImage().getTimestamp() == timestamp) {
+ foundImage = item;
break;
}
}
@@ -206,12 +223,16 @@ public class PostProcessor{
return foundImage;
}
- private void addFallOffImage(Image image) {
- mFallOffImages.add(image);
+ private void addFallOffImage(ZSLQueue.ImageItem item) {
+ mFallOffImages.add(item);
if(mFallOffImages.size() >= MAX_REQUIRED_IMAGE_NUM - 1) {
- Image im = mFallOffImages.getFirst();
+ ZSLQueue.ImageItem it = mFallOffImages.getFirst();
try {
- im.close();
+ it.getImage().close();
+ Image raw = item.getRawImage();
+ if (raw != null) {
+ raw.close();
+ }
} catch(Exception e) {
}
mFallOffImages.removeFirst();
@@ -220,6 +241,7 @@ public class PostProcessor{
class ImageHandlerTask implements Runnable, ImageReader.OnImageAvailableListener {
private ImageWrapper mImageWrapper = null;
+ private ImageReader mRawImageReader = null;
Semaphore mMutureLock = new Semaphore(1);
@Override
@@ -228,24 +250,42 @@ public class PostProcessor{
if(mUseZSL) {
if(mController.isLongShotActive() && mPendingContinuousRequestCount > 0) {
Image image = reader.acquireNextImage();
+ Image rawImage = null;
+ if (mSaveRaw && mRawImageReader != null) {
+ rawImage = mRawImageReader.acquireNextImage();
+ }
ZSLQueue.ImageItem item = new ZSLQueue.ImageItem();
- item.setImage(image);
+ item.setImage(image, rawImage);
if(onContinuousZSLImage(item, true)) {
image.close();
+ if (rawImage != null) {
+ rawImage.close();
+ }
}
return;
}
if(mIsZSLFallOff) {
Image image = reader.acquireNextImage();
+ Image rawImage = null;
+ if (mSaveRaw && mRawImageReader != null) {
+ rawImage = mRawImageReader.acquireNextImage();
+ }
+ ZSLQueue.ImageItem imageItem = new ZSLQueue.ImageItem();
+ imageItem.setImage(image,rawImage);
if(mZSLFallOffResult == null) {
- addFallOffImage(image);
+ addFallOffImage(imageItem);
return;
}
- addFallOffImage(image);
- Image foundImage = findFallOffImage(mZSLFallOffResult.get(CaptureResult.SENSOR_TIMESTAMP).longValue());
- if(foundImage != null) {
+ addFallOffImage(imageItem);
+ ZSLQueue.ImageItem foundImage = findFallOffImage(
+ mZSLFallOffResult.get(CaptureResult.SENSOR_TIMESTAMP).longValue());
+ if(foundImage != null && foundImage.getImage() != null) {
Log.d(TAG,"ZSL fall off image is found");
- reprocessImage(foundImage, mZSLFallOffResult);
+ reprocessImage(foundImage.getImage(), mZSLFallOffResult);
+ Image raw = foundImage.getRawImage();
+ if (raw != null) {
+ onRawImageToProcess(raw);
+ }
mIsZSLFallOff = false;
clearFallOffImage();
mZSLFallOffResult = null;
@@ -256,18 +296,33 @@ public class PostProcessor{
}
Image image = reader.acquireLatestImage();
+ Image rawImage = null;
+ if (mSaveRaw && mRawImageReader != null) {
+ rawImage = mRawImageReader.acquireLatestImage();
+ }
+
if (image == null) {
return;
}
if (!mMutureLock.tryAcquire()) {
image.close();
+ if (rawImage != null) {
+ rawImage.close();
+ }
return;
}
if (mImageWrapper == null || mImageWrapper.isTaken()) {
- mImageWrapper = new ImageWrapper(image);
+ if (mSaveRaw && rawImage != null) {
+ mImageWrapper = new ImageWrapper(image, rawImage);
+ } else {
+ mImageWrapper = new ImageWrapper(image);
+ }
mMutureLock.release();
} else {
image.close();
+ if (rawImage != null) {
+ rawImage.close();
+ }
mMutureLock.release();
return;
}
@@ -276,8 +331,15 @@ public class PostProcessor{
}
} else { //Non ZSL case
Image image = reader.acquireNextImage();
+ Image rawImage = null;
if(image != null) {
onImageToProcess(image);
+ if (mSaveRaw && mRawImageReader != null) {
+ rawImage = mRawImageReader.acquireNextImage();
+ }
+ if (rawImage != null) {
+ onRawImageToProcess(rawImage);
+ }
}
}
} catch (IllegalStateException e) {
@@ -290,18 +352,27 @@ public class PostProcessor{
@Override
public void run() { //Only ZSL case
- Image image = mImageWrapper.getImage();
+ Image image = mImageWrapper.getImage();
+ Image rawImage = mImageWrapper.getRawImage();
try {
mMutureLock.acquire();
if (mUseZSL) {
if (mZSLQueue != null) {
- mZSLQueue.add(image);
+ mZSLQueue.add(image, rawImage);
}
}
mMutureLock.release();
} catch (InterruptedException e) {
}
}
+
+ public void setRawImageReader(ImageReader rawImageReader) {
+ mRawImageReader = rawImageReader;
+ }
+ }
+
+ public void setRawImageReader(ImageReader rawImageReader) {
+ mImageHandlerTask.setRawImageReader(rawImageReader);
}
public void onMetaAvailable(TotalCaptureResult metadata) {
@@ -379,6 +450,9 @@ public class PostProcessor{
if (imageItem != null) {
if(DEBUG_ZSL) Log.d(TAG,"Got the item from the queue");
reprocessImage(imageItem.getImage(), imageItem.getMetadata());
+ if (mSaveRaw && imageItem.getRawImage() != null) {
+ onRawImageToProcess(imageItem.getRawImage());
+ }
return true;
} else {
if(DEBUG_ZSL) Log.d(TAG, "No good item in queue, register the request for the future");
@@ -397,11 +471,17 @@ public class PostProcessor{
if(isLongShotRequest) {
if(mLatestResultForLongShot != null) {
reprocessImage(imageItem.getImage(), mLatestResultForLongShot);
+ if (imageItem.getRawImage() != null) {
+ onRawImageToProcess(imageItem.getRawImage());
+ }
mPendingContinuousRequestCount--;
return true;
}
} else {
reprocessImage(imageItem.getImage(), imageItem.getMetadata());
+ if (imageItem.getRawImage() != null) {
+ onRawImageToProcess(imageItem.getRawImage());
+ }
return true;
}
@@ -509,6 +589,17 @@ public class PostProcessor{
}
}
+ private void onRawImageToProcess(Image image) {
+ ByteBuffer buffer = image.getPlanes()[0].getBuffer();
+ byte[] data = new byte[buffer.remaining()];
+ buffer.get(data);
+ long captureStartTime = System.currentTimeMillis();
+ mNamedImages.nameNewImage(captureStartTime);
+ PhotoModule.NamedImages.NamedEntity name = mNamedImages.getNextNameEntity();
+ String title = (name == null) ? null : name.title;
+ mActivity.getMediaSaveService().addRawImage(data, title, "raw");
+ }
+
enum STATUS {
DEINIT,
INIT,
@@ -574,9 +665,9 @@ public class PostProcessor{
return false;
}
- public void onOpen(int postFilterId, boolean isFlashModeOn, boolean isTrackingFocusOn, boolean isMakeupOn, boolean isSelfieMirrorOn) {
+ public void onOpen(int postFilterId, boolean isFlashModeOn, boolean isTrackingFocusOn, boolean isMakeupOn, boolean isSelfieMirrorOn, boolean isSaveRaw) {
mImageHandlerTask = new ImageHandlerTask();
-
+ mSaveRaw = isSaveRaw;
if(setFilter(postFilterId) || isFlashModeOn || isTrackingFocusOn || isMakeupOn || isSelfieMirrorOn
|| PersistUtil.getCameraZSLDisabled()
|| SettingsManager.getInstance().isCamera2HDRSupport()) {
diff --git a/src/com/android/camera/imageprocessor/ZSLQueue.java b/src/com/android/camera/imageprocessor/ZSLQueue.java
index f50858a35..b9dea4e51 100644..100755
--- a/src/com/android/camera/imageprocessor/ZSLQueue.java
+++ b/src/com/android/camera/imageprocessor/ZSLQueue.java
@@ -87,7 +87,7 @@ public class ZSLQueue {
return -1;
}
- public void add(Image image) {
+ public void add(Image image, Image rawImage) {
int lastIndex = -1;
synchronized (mLock) {
if(mBuffer == null)
@@ -99,7 +99,7 @@ public class ZSLQueue {
}
if(mBuffer[mImageHead].getMetadata() != null) {
if((mBuffer[mImageHead].getMetadata().get(CaptureResult.SENSOR_TIMESTAMP)).longValue() == image.getTimestamp()) {
- mBuffer[mImageHead].setImage(image);
+ mBuffer[mImageHead].setImage(image,rawImage);
lastIndex = mImageHead;
mImageHead = (mImageHead + 1) % mBuffer.length;
} else if((mBuffer[mImageHead].getMetadata().get(CaptureResult.SENSOR_TIMESTAMP)).longValue() > image.getTimestamp()) {
@@ -107,17 +107,17 @@ public class ZSLQueue {
} else {
int i = findMeta(image.getTimestamp(), mImageHead);
if(i == -1) {
- mBuffer[mImageHead].setImage(image);
+ mBuffer[mImageHead].setImage(image, rawImage);
mBuffer[mImageHead].setMetadata(null);
mImageHead = (mImageHead + 1) % mBuffer.length;
} else {
lastIndex = mImageHead = i;
- mBuffer[mImageHead].setImage(image);
+ mBuffer[mImageHead].setImage(image, rawImage);
mImageHead = (mImageHead + 1) % mBuffer.length;
}
}
} else {
- mBuffer[mImageHead].setImage(image);
+ mBuffer[mImageHead].setImage(image, rawImage);
lastIndex = mImageHead;
mImageHead = (mImageHead + 1) % mBuffer.length;
}
@@ -156,7 +156,7 @@ public class ZSLQueue {
} else {
int i = findImage(timestamp, mMetaHead);
if(i == -1) {
- mBuffer[mMetaHead].setImage(null);
+ mBuffer[mMetaHead].setImage(null, null);
mBuffer[mMetaHead].setMetadata(metadata);
mMetaHead = (mMetaHead + 1) % mBuffer.length;
} else {
@@ -238,17 +238,24 @@ public class ZSLQueue {
static class ImageItem {
private Image mImage = null;
+ private Image mRawImage = null;
private TotalCaptureResult mMetadata = null;
public Image getImage() {
return mImage;
}
- public void setImage(Image image) {
+ public Image getRawImage() {return mRawImage;}
+
+ public void setImage(Image image, Image rawImage) {
if(mImage != null) {
mImage.close();
}
+ if(mRawImage != null) {
+ mRawImage.close();
+ }
mImage = image;
+ mRawImage =rawImage;
}
public TotalCaptureResult getMetadata() {
@@ -263,6 +270,9 @@ public class ZSLQueue {
if(mImage != null) {
mImage.close();
}
+ if(mRawImage != null) {
+ mRawImage.close();
+ }
mImage = null;
}