summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorEmilian Peev <epeev@google.com>2017-01-16 16:11:58 -0800
committerEmilian Peev <epeev@google.com>2017-02-16 20:28:10 +0000
commit90fdbf7460fbd255194455331c6a38a7b8f41dd2 (patch)
tree9b33f11b6631259cb3079ea0840cf2434eea45d0
parent773266c09d8df8db35c50f5b726445c7b130b85c (diff)
downloadDevCamera-oreo-cts-release.tar.gz
Add experimental depth stream supportandroid-wear-p-preview-2android-wear-9.0.0_r9android-wear-9.0.0_r8android-wear-9.0.0_r7android-wear-9.0.0_r6android-wear-9.0.0_r5android-wear-9.0.0_r4android-wear-9.0.0_r34android-wear-9.0.0_r33android-wear-9.0.0_r32android-wear-9.0.0_r31android-wear-9.0.0_r30android-wear-9.0.0_r3android-wear-9.0.0_r29android-wear-9.0.0_r28android-wear-9.0.0_r27android-wear-9.0.0_r26android-wear-9.0.0_r25android-wear-9.0.0_r24android-wear-9.0.0_r23android-wear-9.0.0_r22android-wear-9.0.0_r21android-wear-9.0.0_r20android-wear-9.0.0_r2android-wear-9.0.0_r19android-wear-9.0.0_r18android-wear-9.0.0_r17android-wear-9.0.0_r16android-wear-9.0.0_r15android-wear-9.0.0_r14android-wear-9.0.0_r13android-wear-9.0.0_r12android-wear-9.0.0_r11android-wear-9.0.0_r10android-wear-9.0.0_r1android-wear-8.1.0_r1android-wear-8.0.0_r2android-wear-8.0.0_r1android-vts-9.0_r9android-vts-9.0_r8android-vts-9.0_r7android-vts-9.0_r6android-vts-9.0_r5android-vts-9.0_r4android-vts-9.0_r19android-vts-9.0_r18android-vts-9.0_r17android-vts-9.0_r16android-vts-9.0_r15android-vts-9.0_r14android-vts-9.0_r13android-vts-9.0_r12android-vts-9.0_r11android-vts-9.0_r10android-vts-8.1_r9android-vts-8.1_r8android-vts-8.1_r7android-vts-8.1_r6android-vts-8.1_r5android-vts-8.1_r4android-vts-8.1_r3android-vts-8.1_r14android-vts-8.1_r13android-vts-8.1_r12android-vts-8.1_r11android-vts-8.1_r10android-vts-8.0_r9android-vts-8.0_r8android-vts-8.0_r7android-vts-8.0_r6android-vts-8.0_r2android-vts-8.0_r13android-vts-8.0_r12android-vts-8.0_r11android-vts-8.0_r10android-vts-8.0_r1android-security-9.0.0_r76android-security-9.0.0_r75android-security-9.0.0_r74android-security-9.0.0_r73android-security-9.0.0_r72android-security-9.0.0_r71android-security-9.0.0_r70android-security-9.0.0_r69android-security-9.0.0_r68android-security-9.0.0_r67android-security-9.0.0_r66android-security-9.0.0_r65android-security-9.0.0_r64android-security-9.0.0_r63android-security-9.0.0_r62android-security-8.1.0_r93android-security-8.1.0_r92android-security-8.1.0_r91android-security-8.1.0_r90android-security-8.1.0_r89android-security-8.1.0_r88android-security-8.1.0_r87android-security-8.1.0_r86android-security-8.1.0_r85android-security-8.1.0_r84android-security-8.1.0_r83android-security-8.1.0_r82android-security-8.0.0_r54android-security-8.0.0_r53android-security-8.0.0_r52android-p-preview-5android-p-preview-4android-p-preview-3android-p-preview-2android-p-preview-1android-o-mr1-preview-2android-o-mr1-preview-1android-o-mr1-iot-release-smart-display-r9android-o-mr1-iot-release-smart-display-r8android-o-mr1-iot-release-smart-display-r5android-o-mr1-iot-release-smart-display-r40.1Jandroid-o-mr1-iot-release-smart-display-r4android-o-mr1-iot-release-smart-display-r39android-o-mr1-iot-release-smart-display-r30android-o-mr1-iot-release-smart-display-r3android-o-mr1-iot-release-smart-display-r22android-o-mr1-iot-release-smart-display-r14android-o-mr1-iot-release-smart-clock-r6android-o-mr1-iot-release-smart-clock-r2android-o-mr1-iot-release-smart-clock-fsiandroid-o-mr1-iot-release-smart-clock-fcsandroid-o-mr1-iot-release-cube_r2android-o-mr1-iot-release-cube-fsiandroid-o-mr1-iot-release-cube-fcsandroid-o-mr1-iot-release-1.0.5android-o-mr1-iot-release-1.0.4android-o-mr1-iot-release-1.0.3android-o-mr1-iot-release-1.0.2android-o-mr1-iot-release-1.0.1android-o-mr1-iot-release-1.0.0android-o-mr1-iot-preview-8android-o-mr1-iot-preview-7android-o-mr1-iot-preview-6android-n-iot-release-smart-display-r2android-n-iot-release-smart-displayandroid-n-iot-release-polk-at1android-n-iot-release-lg-thinq-wk7android-n-iot-release-ihome-igv1android-cts-9.0_r9android-cts-9.0_r8android-cts-9.0_r7android-cts-9.0_r6android-cts-9.0_r5android-cts-9.0_r4android-cts-9.0_r3android-cts-9.0_r20android-cts-9.0_r2android-cts-9.0_r19android-cts-9.0_r18android-cts-9.0_r17android-cts-9.0_r16android-cts-9.0_r15android-cts-9.0_r14android-cts-9.0_r13android-cts-9.0_r12android-cts-9.0_r11android-cts-9.0_r10android-cts-9.0_r1android-cts-8.1_r9android-cts-8.1_r8android-cts-8.1_r7android-cts-8.1_r6android-cts-8.1_r5android-cts-8.1_r4android-cts-8.1_r3android-cts-8.1_r25android-cts-8.1_r24android-cts-8.1_r23android-cts-8.1_r22android-cts-8.1_r21android-cts-8.1_r20android-cts-8.1_r2android-cts-8.1_r19android-cts-8.1_r18android-cts-8.1_r17android-cts-8.1_r16android-cts-8.1_r15android-cts-8.1_r14android-cts-8.1_r13android-cts-8.1_r12android-cts-8.1_r11android-cts-8.1_r10android-cts-8.1_r1android-cts-8.0_r9android-cts-8.0_r8android-cts-8.0_r7android-cts-8.0_r6android-cts-8.0_r5android-cts-8.0_r4android-cts-8.0_r3android-cts-8.0_r26android-cts-8.0_r25android-cts-8.0_r24android-cts-8.0_r23android-cts-8.0_r22android-cts-8.0_r21android-cts-8.0_r20android-cts-8.0_r2android-cts-8.0_r19android-cts-8.0_r18android-cts-8.0_r17android-cts-8.0_r16android-cts-8.0_r15android-cts-8.0_r14android-cts-8.0_r13android-cts-8.0_r12android-cts-8.0_r11android-cts-8.0_r10android-cts-8.0_r1android-9.0.0_r9android-9.0.0_r8android-9.0.0_r7android-9.0.0_r61android-9.0.0_r60android-9.0.0_r6android-9.0.0_r59android-9.0.0_r58android-9.0.0_r57android-9.0.0_r56android-9.0.0_r55android-9.0.0_r54android-9.0.0_r53android-9.0.0_r52android-9.0.0_r51android-9.0.0_r50android-9.0.0_r5android-9.0.0_r49android-9.0.0_r48android-9.0.0_r47android-9.0.0_r46android-9.0.0_r45android-9.0.0_r44android-9.0.0_r43android-9.0.0_r42android-9.0.0_r41android-9.0.0_r40android-9.0.0_r39android-9.0.0_r38android-9.0.0_r37android-9.0.0_r36android-9.0.0_r35android-9.0.0_r34android-9.0.0_r33android-9.0.0_r32android-9.0.0_r31android-9.0.0_r30android-9.0.0_r3android-9.0.0_r22android-9.0.0_r21android-9.0.0_r20android-9.0.0_r2android-9.0.0_r19android-9.0.0_r18android-9.0.0_r17android-9.0.0_r16android-9.0.0_r12android-9.0.0_r11android-9.0.0_r10android-9.0.0_r1android-8.1.0_r9android-8.1.0_r81android-8.1.0_r80android-8.1.0_r8android-8.1.0_r79android-8.1.0_r78android-8.1.0_r77android-8.1.0_r76android-8.1.0_r75android-8.1.0_r74android-8.1.0_r73android-8.1.0_r72android-8.1.0_r71android-8.1.0_r70android-8.1.0_r7android-8.1.0_r69android-8.1.0_r68android-8.1.0_r67android-8.1.0_r66android-8.1.0_r65android-8.1.0_r64android-8.1.0_r63android-8.1.0_r62android-8.1.0_r61android-8.1.0_r60android-8.1.0_r6android-8.1.0_r53android-8.1.0_r52android-8.1.0_r51android-8.1.0_r50android-8.1.0_r5android-8.1.0_r48android-8.1.0_r47android-8.1.0_r46android-8.1.0_r45android-8.1.0_r43android-8.1.0_r42android-8.1.0_r41android-8.1.0_r40android-8.1.0_r4android-8.1.0_r39android-8.1.0_r38android-8.1.0_r37android-8.1.0_r36android-8.1.0_r35android-8.1.0_r33android-8.1.0_r32android-8.1.0_r31android-8.1.0_r30android-8.1.0_r3android-8.1.0_r29android-8.1.0_r28android-8.1.0_r27android-8.1.0_r26android-8.1.0_r25android-8.1.0_r23android-8.1.0_r22android-8.1.0_r21android-8.1.0_r20android-8.1.0_r2android-8.1.0_r19android-8.1.0_r18android-8.1.0_r17android-8.1.0_r16android-8.1.0_r15android-8.1.0_r14android-8.1.0_r13android-8.1.0_r12android-8.1.0_r11android-8.1.0_r10android-8.1.0_r1android-8.0.0_r9android-8.0.0_r7android-8.0.0_r51android-8.0.0_r50android-8.0.0_r49android-8.0.0_r48android-8.0.0_r47android-8.0.0_r46android-8.0.0_r45android-8.0.0_r44android-8.0.0_r43android-8.0.0_r42android-8.0.0_r41android-8.0.0_r40android-8.0.0_r4android-8.0.0_r39android-8.0.0_r38android-8.0.0_r37android-8.0.0_r36android-8.0.0_r35android-8.0.0_r34android-8.0.0_r33android-8.0.0_r32android-8.0.0_r31android-8.0.0_r30android-8.0.0_r3android-8.0.0_r29android-8.0.0_r28android-8.0.0_r27android-8.0.0_r26android-8.0.0_r25android-8.0.0_r24android-8.0.0_r23android-8.0.0_r22android-8.0.0_r21android-8.0.0_r2android-8.0.0_r17android-8.0.0_r16android-8.0.0_r15android-8.0.0_r13android-8.0.0_r12android-8.0.0_r11android-8.0.0_r10android-8.0.0_r1security-pi-releasesecurity-oc-releasesecurity-oc-mr1-releasepie-vts-releasepie-security-releasepie-s2-releasepie-release-2pie-releasepie-r2-s2-releasepie-r2-s1-releasepie-r2-releasepie-qpr3-s1-releasepie-qpr3-releasepie-qpr3-b-releasepie-qpr2-releasepie-qpr1-s3-releasepie-qpr1-s2-releasepie-qpr1-s1-releasepie-qpr1-releasepie-platform-releasepie-gsipie-dr1-releasepie-dr1-devpie-devpie-cuttlefish-testingpie-cts-releasepie-b4s4-releasepie-b4s4-devoreo-vts-releaseoreo-security-releaseoreo-releaseoreo-r6-releaseoreo-r5-releaseoreo-r4-releaseoreo-r3-releaseoreo-r2-releaseoreo-mr1-wear-releaseoreo-mr1-vts-releaseoreo-mr1-security-releaseoreo-mr1-s1-releaseoreo-mr1-releaseoreo-mr1-devoreo-mr1-cuttlefish-testingoreo-mr1-cts-releaseoreo-mr1-1.2-iot-releaseoreo-m8-releaseoreo-m7-releaseoreo-m6-s4-releaseoreo-m6-s3-releaseoreo-m6-s2-releaseoreo-m5-releaseoreo-m4-s9-releaseoreo-m4-s8-releaseoreo-m4-s7-releaseoreo-m4-s6-releaseoreo-m4-s5-releaseoreo-m4-s4-releaseoreo-m4-s3-releaseoreo-m4-s2-releaseoreo-m4-s12-releaseoreo-m4-s11-releaseoreo-m4-s10-releaseoreo-m4-s1-releaseoreo-m3-releaseoreo-m2-s5-releaseoreo-m2-s4-releaseoreo-m2-s3-releaseoreo-m2-s2-releaseoreo-m2-s1-releaseoreo-m2-releaseoreo-dr3-releaseoreo-dr2-releaseoreo-dr1-releaseoreo-dr1-devoreo-devoreo-cts-releaseo-mr1-iot-preview-8o-mr1-iot-preview-7o-mr1-iot-preview-6nougat-iot-releasemaster-cuttlefish-testing-release
Configure one depth cloud stream in case the camera supports it. In order to avoid possible performance degrations the depth stream will only get enabled and start streaming when all additional YUV/RAW streams are disabled. Every N-th depth cloud buffer could be stored on the sd card if the storage flag is enabled. This is an experimental feature that could be used as reference on how to work with and access data from depth cloud streams. Bug: 33833999 Test: Manual Change-Id: I7bb84b038fd444a235910c46fae0e37d799b6fff
-rw-r--r--src/com/android/devcamera/Api2Camera.java56
-rw-r--r--src/com/android/devcamera/CameraInfoCache.java8
-rw-r--r--src/com/android/devcamera/MediaSaver.java51
3 files changed, 110 insertions, 5 deletions
diff --git a/src/com/android/devcamera/Api2Camera.java b/src/com/android/devcamera/Api2Camera.java
index 73e5c87..40b9be6 100644
--- a/src/com/android/devcamera/Api2Camera.java
+++ b/src/com/android/devcamera/Api2Camera.java
@@ -41,8 +41,11 @@ import android.os.SystemClock;
import android.util.Log;
import android.util.Size;
import android.view.Surface;
+import android.media.Image.Plane;
import java.nio.ByteBuffer;
+import java.nio.BufferUnderflowException;
+import java.lang.IndexOutOfBoundsException;
import java.util.ArrayList;
import java.util.LinkedList;
import java.util.List;
@@ -120,6 +123,11 @@ public class Api2Camera implements CameraInterface, SurfaceTexture.OnFrameAvaila
private int mYuv2ImageCounter;
private ImageReader mRawImageReader;
private int mRawImageCounter;
+ private boolean mIsDepthCloudSupported = false;
+ private ImageReader mDepthCloudImageReader;
+ private int mDepthCloudImageCounter = 0;
+ private static int STORE_NTH_DEPTH_CLOUD = 30;
+ private static boolean DEPTH_CLOUD_STORE_ENABLED = false;
// Starting the preview requires each of these 3 to be true/non-null:
volatile private Surface mPreviewSurface;
@@ -175,6 +183,10 @@ public class Api2Camera implements CameraInterface, SurfaceTexture.OnFrameAvaila
mReprocessingNoiseMode = CameraCharacteristics.NOISE_REDUCTION_MODE_HIGH_QUALITY;
mReprocessingEdgeMode = CameraCharacteristics.EDGE_MODE_HIGH_QUALITY;
}
+
+ if (null != mCameraInfoCache.getDepthCloudSize()) {
+ mIsDepthCloudSupported = true;
+ }
}
// Ugh, why is this stuff so slow?
@@ -201,6 +213,14 @@ public class Api2Camera implements CameraInterface, SurfaceTexture.OnFrameAvaila
YUV1_IMAGEREADER_SIZE);
mYuv1ImageReader.setOnImageAvailableListener(mYuv1ImageListener, mOpsHandler);
+ if (mIsDepthCloudSupported) {
+ mDepthCloudImageReader = ImageReader.newInstance(
+ mCameraInfoCache.getDepthCloudSize().getWidth(),
+ mCameraInfoCache.getDepthCloudSize().getHeight(),
+ ImageFormat.DEPTH_POINT_CLOUD, 2);
+ mDepthCloudImageReader.setOnImageAvailableListener(mDepthCloudImageListener, mOpsHandler);
+ }
+
if (SECOND_YUV_IMAGEREADER_STREAM) {
// Create ImageReader to receive YUV image buffers.
mYuv2ImageReader = ImageReader.newInstance(
@@ -382,7 +402,7 @@ public class Api2Camera implements CameraInterface, SurfaceTexture.OnFrameAvaila
CameraTimer.t_session_go = SystemClock.elapsedRealtime();
Log.v(TAG, "Configuring session..");
- List<Surface> outputSurfaces = new ArrayList<Surface>(3);
+ List<Surface> outputSurfaces = new ArrayList<Surface>(4);
outputSurfaces.add(mPreviewSurface);
Log.v(TAG, " .. added SurfaceView " + mCameraInfoCache.getPreviewSize().getWidth() +
@@ -392,6 +412,11 @@ public class Api2Camera implements CameraInterface, SurfaceTexture.OnFrameAvaila
Log.v(TAG, " .. added YUV ImageReader " + mCameraInfoCache.getYuvStream1Size().getWidth() +
" x " + mCameraInfoCache.getYuvStream1Size().getHeight());
+ if (mIsDepthCloudSupported) {
+ outputSurfaces.add(mDepthCloudImageReader.getSurface());
+ Log.v(TAG, " .. added Depth cloud ImageReader");
+ }
+
if (SECOND_YUV_IMAGEREADER_STREAM) {
outputSurfaces.add(mYuv2ImageReader.getSurface());
Log.v(TAG, " .. added YUV ImageReader " + mCameraInfoCache.getYuvStream2Size().getWidth() +
@@ -531,6 +556,10 @@ public class Api2Camera implements CameraInterface, SurfaceTexture.OnFrameAvaila
b1.addTarget(mPreviewSurface);
+ if (mIsDepthCloudSupported && !mCaptureYuv1 && !mCaptureYuv2 && !mCaptureRaw) {
+ b1.addTarget(mDepthCloudImageReader.getSurface());
+ }
+
if (mCaptureYuv2) {
if (SECOND_SURFACE_TEXTURE_STREAM) {
b1.addTarget(mSurfaceTextureSurface);
@@ -601,6 +630,31 @@ public class Api2Camera implements CameraInterface, SurfaceTexture.OnFrameAvaila
}
};
+ ImageReader.OnImageAvailableListener mDepthCloudImageListener =
+ new ImageReader.OnImageAvailableListener() {
+ @Override
+ public void onImageAvailable(ImageReader reader)
+ throws BufferUnderflowException, IndexOutOfBoundsException {
+ Image img = reader.acquireLatestImage();
+ if (img == null) {
+ Log.e(TAG, "Null image returned Depth");
+ return;
+ }
+ Plane[] planes = img.getPlanes();
+ if (0 < planes.length) {
+ if (DEPTH_CLOUD_STORE_ENABLED) {
+ if ((mDepthCloudImageCounter % STORE_NTH_DEPTH_CLOUD) == 0) {
+ ByteBuffer b = planes[0].getBuffer();
+ MediaSaver.saveDepth(mContext, b);
+ }
+ }
+ } else {
+ Log.e(TAG, "Depth buffer with empty planes!");
+ }
+ img.close();
+ mDepthCloudImageCounter++;
+ }
+ };
ImageReader.OnImageAvailableListener mJpegImageListener =
new ImageReader.OnImageAvailableListener() {
diff --git a/src/com/android/devcamera/CameraInfoCache.java b/src/com/android/devcamera/CameraInfoCache.java
index 699fd97..7b97a4e 100644
--- a/src/com/android/devcamera/CameraInfoCache.java
+++ b/src/com/android/devcamera/CameraInfoCache.java
@@ -49,6 +49,7 @@ public class CameraInfoCache {
private Integer mRawFormat;
private int mBestFaceMode;
private int mHardwareLevel;
+ private Size mDepthCloudSize = null;
/**
* Constructor.
@@ -95,6 +96,10 @@ public class CameraInfoCache {
lowestStall = stall;
}
}
+ if (formats[i] == ImageFormat.DEPTH_POINT_CLOUD) {
+ Size size = returnLargestSize(map.getOutputSizes(formats[i]));
+ mDepthCloudSize = size;
+ }
}
mActiveArea = mCameraCharacteristics.get(CameraCharacteristics.SENSOR_INFO_ACTIVE_ARRAY_SIZE);
@@ -288,4 +293,7 @@ public class CameraInfoCache {
return mRawSize;
}
+ public Size getDepthCloudSize() {
+ return mDepthCloudSize;
+ }
}
diff --git a/src/com/android/devcamera/MediaSaver.java b/src/com/android/devcamera/MediaSaver.java
index 4929e33..bf1ddba 100644
--- a/src/com/android/devcamera/MediaSaver.java
+++ b/src/com/android/devcamera/MediaSaver.java
@@ -27,6 +27,8 @@ import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStream;
+import java.nio.ByteBuffer;
+import java.nio.channels.FileChannel;
/**
* This class has methods required to save a JPEG to disk as well as update the
@@ -42,17 +44,58 @@ public class MediaSaver {
private static final boolean UDPATE_MEDIA_STORE = true;
- public static int getNextInt(Context context) {
+ public static int getNextInt(Context context, String id) {
SharedPreferences prefs = context.getSharedPreferences(MY_PREFS_NAME, Context.MODE_PRIVATE);
- int i = prefs.getInt("counter", 1);
+ int i = prefs.getInt(id, 1);
SharedPreferences.Editor editor = prefs.edit();
- editor.putInt("counter", i+1);
+ editor.putInt(id, i+1);
editor.commit();
return i;
}
/**
* @param context Application context.
+ * @param depthCloudData Depth cloud byte buffer.
+ */
+ public static String saveDepth(Context context, ByteBuffer depthCloudData) {
+ String filename = "";
+ try {
+ File file;
+ int i = getNextInt(context, "depthCounter");
+ filename = String.format("/sdcard/DCIM/Depth_%05d.img", i);
+ file = new File(filename);
+ if (!file.createNewFile()) {
+ throw new IOException(filename);
+ }
+
+ long t0 = SystemClock.uptimeMillis();
+ FileOutputStream fos = new FileOutputStream(file);
+ FileChannel channel = fos.getChannel();
+ int bytesWritten = 0;
+ int byteCount = 0;
+ while (depthCloudData.hasRemaining()) {
+ byteCount = channel.write(depthCloudData);
+ if (0 == byteCount) {
+ throw new IOException(filename);
+ } else {
+ bytesWritten += byteCount;
+ }
+ }
+ channel.close();
+ fos.flush();
+ fos.close();
+ long t1 = SystemClock.uptimeMillis();
+
+ Log.v(TAG, String.format("Wrote Depth %d bytes as %s in %.3f seconds",
+ bytesWritten, file, (t1 - t0) * 0.001));
+ } catch (IOException e) {
+ Log.e(TAG, "Error creating new file: ", e);
+ }
+ return filename;
+ }
+
+ /**
+ * @param context Application context.
* @param jpegData JPEG byte stream.
*/
public static String saveJpeg(Context context, byte[] jpegData, ContentResolver resolver) {
@@ -60,7 +103,7 @@ public class MediaSaver {
try {
File file;
while (true) {
- int i = getNextInt(context);
+ int i = getNextInt(context, "counter");
filename = String.format("/sdcard/DCIM/Camera/SNAP_%05d.JPG", i);
file = new File(filename);
if (file.createNewFile()) {