diff options
author | Daniel Xie <dxie@google.com> | 2015-10-07 22:34:15 +0000 |
---|---|---|
committer | android-build-merger <android-build-merger@google.com> | 2015-10-07 22:34:15 +0000 |
commit | 8d991c50f104abc11dc5ea93c23cd8aa1a05c9a0 (patch) | |
tree | ea8d88d2f7fa6b17f581babe957db504d0a23160 | |
parent | cad62c356ee1f2b8f15cbb9ca7ed3be8f57cf11d (diff) | |
parent | b0f423d161389e49ea343d6fc916cccdbda1551d (diff) | |
download | cts-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
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); |