summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDaniel Xie <dxie@google.com>2015-10-07 22:34:15 +0000
committerandroid-build-merger <android-build-merger@google.com>2015-10-07 22:34:15 +0000
commit8d991c50f104abc11dc5ea93c23cd8aa1a05c9a0 (patch)
treeea8d88d2f7fa6b17f581babe957db504d0a23160
parentcad62c356ee1f2b8f15cbb9ca7ed3be8f57cf11d (diff)
parentb0f423d161389e49ea343d6fc916cccdbda1551d (diff)
downloadcts-8d991c50f104abc11dc5ea93c23cd8aa1a05c9a0.tar.gz
Merge "Camera: improve Image allocation in camera CTS" into marshmallow-cts-dev
am: b0f423d161 * commit 'b0f423d161389e49ea343d6fc916cccdbda1551d': Camera: improve Image allocation in camera CTS
-rw-r--r--tests/tests/hardware/src/android/hardware/camera2/cts/BurstCaptureRawTest.java1
-rw-r--r--tests/tests/hardware/src/android/hardware/camera2/cts/CameraTestUtils.java2
-rw-r--r--tests/tests/hardware/src/android/hardware/camera2/cts/CaptureResultTest.java20
-rw-r--r--tests/tests/hardware/src/android/hardware/camera2/cts/ImageReaderTest.java6
-rw-r--r--tests/tests/hardware/src/android/hardware/camera2/cts/MultiViewTest.java10
-rw-r--r--tests/tests/hardware/src/android/hardware/camera2/cts/PerformanceTest.java39
6 files changed, 58 insertions, 20 deletions
diff --git a/tests/tests/hardware/src/android/hardware/camera2/cts/BurstCaptureRawTest.java b/tests/tests/hardware/src/android/hardware/camera2/cts/BurstCaptureRawTest.java
index 75de9c0eac1..41e20459f13 100644
--- a/tests/tests/hardware/src/android/hardware/camera2/cts/BurstCaptureRawTest.java
+++ b/tests/tests/hardware/src/android/hardware/camera2/cts/BurstCaptureRawTest.java
@@ -714,6 +714,7 @@ public class BurstCaptureRawTest extends Camera2SurfaceViewTestCase {
// clear out the surface and camera session
stopPreviewAndClearSurface(previewBuilder, rawBurstBuilder);
+ rawReaderListener.drain();
closeImageReader();
}
} finally {
diff --git a/tests/tests/hardware/src/android/hardware/camera2/cts/CameraTestUtils.java b/tests/tests/hardware/src/android/hardware/camera2/cts/CameraTestUtils.java
index c5eb27b724c..d78b3b549e3 100644
--- a/tests/tests/hardware/src/android/hardware/camera2/cts/CameraTestUtils.java
+++ b/tests/tests/hardware/src/android/hardware/camera2/cts/CameraTestUtils.java
@@ -337,7 +337,7 @@ public class CameraTestUtils extends Assert {
*
*/
public void drain() {
- for (int i = 0; i < mQueue.size(); i++) {
+ while (!mQueue.isEmpty()) {
Image image = mQueue.poll();
assertNotNull("Unable to get an image", image);
image.close();
diff --git a/tests/tests/hardware/src/android/hardware/camera2/cts/CaptureResultTest.java b/tests/tests/hardware/src/android/hardware/camera2/cts/CaptureResultTest.java
index dc499ba9b4e..2ae29c302e0 100644
--- a/tests/tests/hardware/src/android/hardware/camera2/cts/CaptureResultTest.java
+++ b/tests/tests/hardware/src/android/hardware/camera2/cts/CaptureResultTest.java
@@ -316,18 +316,24 @@ public class CaptureResultTest extends Camera2AndroidTestCase {
session, previewBuilder.build(), mHandler);
// Check if all timestamps are the same
+ Image prevImage = prevListener.getImage(CAPTURE_IMAGE_TIMEOUT_MS);
validateTimestamps("Result 1", result.first,
- prevListener.getImage(CAPTURE_IMAGE_TIMEOUT_MS), result.second);
+ prevImage, result.second);
+ prevImage.close();
// Capture targeting both jpeg and preview
Pair<TotalCaptureResult, Long> result2 = captureAndVerifyResult(mockCaptureCallback,
session, multiBuilder.build(), mHandler);
// Check if all timestamps are the same
+ prevImage = prevListener.getImage(CAPTURE_IMAGE_TIMEOUT_MS);
+ Image jpegImage = jpegListener.getImage(CAPTURE_IMAGE_TIMEOUT_MS);
validateTimestamps("Result 2 Preview", result2.first,
- prevListener.getImage(CAPTURE_IMAGE_TIMEOUT_MS), result2.second);
+ prevImage, result2.second);
validateTimestamps("Result 2 Jpeg", result2.first,
- jpegListener.getImage(CAPTURE_IMAGE_TIMEOUT_MS), result2.second);
+ jpegImage, result2.second);
+ prevImage.close();
+ jpegImage.close();
// Check if timestamps are increasing
mCollector.expectGreater("Timestamps must be increasing.", result.second,
@@ -343,10 +349,14 @@ public class CaptureResultTest extends Camera2AndroidTestCase {
long resultDiff = result4.second - result3.second;
// Check if all timestamps are the same
+ prevImage = prevListener.getImage(CAPTURE_IMAGE_TIMEOUT_MS);
validateTimestamps("Result 3", result3.first,
- prevListener.getImage(CAPTURE_IMAGE_TIMEOUT_MS), result3.second);
+ prevImage, result3.second);
+ prevImage.close();
+ prevImage = prevListener.getImage(CAPTURE_IMAGE_TIMEOUT_MS);
validateTimestamps("Result 4", result4.first,
- prevListener.getImage(CAPTURE_IMAGE_TIMEOUT_MS), result4.second);
+ prevImage, result4.second);
+ prevImage.close();
// Check that the timestamps monotonically increase at a reasonable rate
mCollector.expectGreaterOrEqual("Timestamps increase faster than system clock.",
diff --git a/tests/tests/hardware/src/android/hardware/camera2/cts/ImageReaderTest.java b/tests/tests/hardware/src/android/hardware/camera2/cts/ImageReaderTest.java
index 7c80c7d34ff..155f9dd7bc3 100644
--- a/tests/tests/hardware/src/android/hardware/camera2/cts/ImageReaderTest.java
+++ b/tests/tests/hardware/src/android/hardware/camera2/cts/ImageReaderTest.java
@@ -460,6 +460,10 @@ public class ImageReaderTest extends Camera2AndroidTestCase {
// Stop capture, delete the streams.
stopCapture(/*fast*/false);
+ yuvImage.close();
+ jpegImage.close();
+ yuvListener.drain();
+ jpegListener.drain();
} finally {
closeImageReader(jpegReader);
jpegReader = null;
@@ -645,6 +649,8 @@ public class ImageReaderTest extends Camera2AndroidTestCase {
maxYuvSz.getHeight(), ImageFormat.YUV_420_888, /*filePath*/null);
CameraTestUtils.validateImage(captureImage, captureSz.getWidth(),
captureSz.getHeight(), format, /*filePath*/null);
+ yuvImage.close();
+ captureImage.close();
}
// Stop capture, delete the streams.
diff --git a/tests/tests/hardware/src/android/hardware/camera2/cts/MultiViewTest.java b/tests/tests/hardware/src/android/hardware/camera2/cts/MultiViewTest.java
index dfba587f183..2795bde0c6e 100644
--- a/tests/tests/hardware/src/android/hardware/camera2/cts/MultiViewTest.java
+++ b/tests/tests/hardware/src/android/hardware/camera2/cts/MultiViewTest.java
@@ -78,7 +78,7 @@ public class MultiViewTest extends Camera2MultiViewTestCase {
Exception prior = null;
ImageVerifierListener yuvListener;
- ImageReader yuvReader;
+ ImageReader yuvReader = null;
try {
openCamera(cameraId);
@@ -102,6 +102,9 @@ public class MultiViewTest extends Camera2MultiViewTestCase {
prior = e;
} finally {
try {
+ if (yuvReader != null) {
+ yuvReader.close();
+ }
closeCamera(cameraId);
} catch (Exception e) {
if (prior != null) {
@@ -151,7 +154,7 @@ public class MultiViewTest extends Camera2MultiViewTestCase {
Exception prior = null;
ImageVerifierListener yuvListener;
- ImageReader yuvReader;
+ ImageReader yuvReader = null;
try {
openCamera(cameraId);
@@ -175,6 +178,9 @@ public class MultiViewTest extends Camera2MultiViewTestCase {
prior = e;
} finally {
try {
+ if (yuvReader != null) {
+ yuvReader.close();
+ }
closeCamera(cameraId);
} catch (Exception e) {
if (prior != null) {
diff --git a/tests/tests/hardware/src/android/hardware/camera2/cts/PerformanceTest.java b/tests/tests/hardware/src/android/hardware/camera2/cts/PerformanceTest.java
index 2e001c7c6ac..39eb1dc594d 100644
--- a/tests/tests/hardware/src/android/hardware/camera2/cts/PerformanceTest.java
+++ b/tests/tests/hardware/src/android/hardware/camera2/cts/PerformanceTest.java
@@ -71,8 +71,7 @@ public class PerformanceTest extends Camera2SurfaceViewTestCase {
private final int MAX_INPUT_IMAGES = MAX_REPROCESS_IMAGES;
// ZSL queue depth should be bigger than the max simultaneous reprocessing capture request
// count to maintain reasonable number of candidate image for the worse-case.
- // Here we want to make sure we at most dequeue half of the queue max images for the worst-case.
- private final int MAX_ZSL_IMAGES = MAX_REPROCESS_IMAGES * 2;
+ private final int MAX_ZSL_IMAGES = MAX_REPROCESS_IMAGES * 3 / 2;
private final double REPROCESS_STALL_MARGIN = 0.1;
private DeviceReportLog mReportLog;
@@ -434,7 +433,7 @@ public class PerformanceTest extends Camera2SurfaceViewTestCase {
// Wait for reprocess output jpeg and result come back.
reprocessResultListener.getCaptureResultForRequest(reprocessRequest,
CameraTestUtils.CAPTURE_RESULT_TIMEOUT_MS);
- mJpegListener.getImage(CameraTestUtils.CAPTURE_IMAGE_TIMEOUT_MS);
+ mJpegListener.getImage(CameraTestUtils.CAPTURE_IMAGE_TIMEOUT_MS).close();
long numFramesMaybeStalled = mZslResultListener.getTotalNumFrames();
assertTrue("Reprocess capture result should be returned in "
+ MAX_REPROCESS_RETURN_FRAME_COUNT + " frames",
@@ -475,6 +474,8 @@ public class PerformanceTest extends Camera2SurfaceViewTestCase {
maxCaptureGapsMs[i] = maxTimestampGapMs;
}
+ stopZslStreaming();
+
String reprocessType = " YUV reprocessing ";
if (reprocessInputFormat == ImageFormat.PRIVATE) {
reprocessType = " opaque reprocessing ";
@@ -539,24 +540,34 @@ public class PerformanceTest extends Camera2SurfaceViewTestCase {
// Get images
startTimeMs = SystemClock.elapsedRealtime();
+ Image jpegImages[] = new Image[MAX_REPROCESS_IMAGES];
for (int i = 0; i < MAX_REPROCESS_IMAGES; i++) {
- mJpegListener.getImage(CameraTestUtils.CAPTURE_IMAGE_TIMEOUT_MS);
+ jpegImages[i] = mJpegListener.getImage(CameraTestUtils.CAPTURE_IMAGE_TIMEOUT_MS);
getImageLatenciesMs[i] = SystemClock.elapsedRealtime() - startTimeMs;
startTimeMs = SystemClock.elapsedRealtime();
}
+ for (Image i : jpegImages) {
+ i.close();
+ }
} else {
// sync capture: issue reprocess request one by one, only submit next one when
// the previous capture image is returned. This is to test the back to back capture
// performance.
+ Image jpegImages[] = new Image[MAX_REPROCESS_IMAGES];
for (int i = 0; i < MAX_REPROCESS_IMAGES; i++) {
startTimeMs = SystemClock.elapsedRealtime();
mWriter.queueInputImage(inputImages[i]);
mSession.capture(reprocessReqs[i].build(), null, null);
- mJpegListener.getImage(CameraTestUtils.CAPTURE_IMAGE_TIMEOUT_MS);
+ jpegImages[i] = mJpegListener.getImage(CameraTestUtils.CAPTURE_IMAGE_TIMEOUT_MS);
getImageLatenciesMs[i] = SystemClock.elapsedRealtime() - startTimeMs;
}
+ for (Image i : jpegImages) {
+ i.close();
+ }
}
+ stopZslStreaming();
+
String reprocessType = " YUV reprocessing ";
if (reprocessInputFormat == ImageFormat.PRIVATE) {
reprocessType = " opaque reprocessing ";
@@ -591,6 +602,12 @@ public class PerformanceTest extends Camera2SurfaceViewTestCase {
mSession.setRepeatingRequest(zslBuilder.build(), mZslResultListener, mHandler);
}
+ private void stopZslStreaming() throws Exception {
+ mSession.stopRepeating();
+ mSessionListener.getStateWaiter().waitForState(
+ BlockingSessionCallback.SESSION_READY, CameraTestUtils.CAMERA_IDLE_TIMEOUT_MS);
+ }
+
/**
* Wait for a certain number of frames, the images and results will be drained from the
* listeners to make sure that next reprocessing can get matched results and images.
@@ -598,24 +615,22 @@ public class PerformanceTest extends Camera2SurfaceViewTestCase {
* @param numFrameWait The number of frames to wait before return, 0 means that
* this call returns immediately after streaming on.
*/
- private void waitForFrames(int numFrameWait) {
+ private void waitForFrames(int numFrameWait) throws Exception {
if (numFrameWait < 0) {
throw new IllegalArgumentException("numFrameWait " + numFrameWait +
" should be non-negative");
}
- if (numFrameWait == 0) {
- // Let is stream out for a while
- waitForNumResults(mZslResultListener, numFrameWait);
- // Drain the pending images, to ensure that all future images have an associated
- // capture result available.
- mCameraZslImageListener.drain();
+ for (int i = 0; i < numFrameWait; i++) {
+ mCameraZslImageListener.getImage(CameraTestUtils.CAPTURE_IMAGE_TIMEOUT_MS).close();
}
}
private void closeReaderWriters() {
+ mCameraZslImageListener.drain();
CameraTestUtils.closeImageReader(mCameraZslReader);
mCameraZslReader = null;
+ mJpegListener.drain();
CameraTestUtils.closeImageReader(mJpegReader);
mJpegReader = null;
CameraTestUtils.closeImageWriter(mWriter);