Index: webrtc/api/androidtests/src/org/webrtc/CameraVideoCapturerTestFixtures.java |
diff --git a/webrtc/api/androidtests/src/org/webrtc/CameraVideoCapturerTestFixtures.java b/webrtc/api/androidtests/src/org/webrtc/CameraVideoCapturerTestFixtures.java |
deleted file mode 100644 |
index 299114fe9e830b0099de1bd49a71221627ed35b2..0000000000000000000000000000000000000000 |
--- a/webrtc/api/androidtests/src/org/webrtc/CameraVideoCapturerTestFixtures.java |
+++ /dev/null |
@@ -1,733 +0,0 @@ |
-/* |
- * Copyright 2015 The WebRTC project authors. All Rights Reserved. |
- * |
- * Use of this source code is governed by a BSD-style license |
- * that can be found in the LICENSE file in the root of the source |
- * tree. An additional intellectual property rights grant can be found |
- * in the file PATENTS. All contributing project authors may |
- * be found in the AUTHORS file in the root of the source tree. |
- */ |
-package org.webrtc; |
- |
-import static junit.framework.Assert.*; |
- |
-import org.webrtc.CameraEnumerationAndroid.CaptureFormat; |
-import org.webrtc.VideoRenderer.I420Frame; |
- |
-import android.content.Context; |
- |
-import java.util.ArrayList; |
-import java.util.List; |
-import java.util.concurrent.CountDownLatch; |
- |
-class CameraVideoCapturerTestFixtures { |
- static final String TAG = "CameraVideoCapturerTestFixtures"; |
- // Default values used for starting capturing |
- static final int DEFAULT_WIDTH = 640; |
- static final int DEFAULT_HEIGHT = 480; |
- static final int DEFAULT_FPS = 15; |
- |
- static private class RendererCallbacks implements VideoRenderer.Callbacks { |
- private int framesRendered = 0; |
- private Object frameLock = 0; |
- private int width = 0; |
- private int height = 0; |
- |
- @Override |
- public void renderFrame(I420Frame frame) { |
- synchronized (frameLock) { |
- ++framesRendered; |
- width = frame.rotatedWidth(); |
- height = frame.rotatedHeight(); |
- frameLock.notify(); |
- } |
- VideoRenderer.renderFrameDone(frame); |
- } |
- |
- public int frameWidth() { |
- synchronized (frameLock) { |
- return width; |
- } |
- } |
- |
- public int frameHeight() { |
- synchronized (frameLock) { |
- return height; |
- } |
- } |
- |
- public int waitForNextFrameToRender() throws InterruptedException { |
- Logging.d(TAG, "Waiting for the next frame to render"); |
- synchronized (frameLock) { |
- frameLock.wait(); |
- return framesRendered; |
- } |
- } |
- } |
- |
- static private class FakeAsyncRenderer implements VideoRenderer.Callbacks { |
- private final List<I420Frame> pendingFrames = new ArrayList<I420Frame>(); |
- |
- @Override |
- public void renderFrame(I420Frame frame) { |
- synchronized (pendingFrames) { |
- pendingFrames.add(frame); |
- pendingFrames.notifyAll(); |
- } |
- } |
- |
- // Wait until at least one frame have been received, before returning them. |
- public List<I420Frame> waitForPendingFrames() throws InterruptedException { |
- Logging.d(TAG, "Waiting for pending frames"); |
- synchronized (pendingFrames) { |
- while (pendingFrames.isEmpty()) { |
- pendingFrames.wait(); |
- } |
- return new ArrayList<I420Frame>(pendingFrames); |
- } |
- } |
- } |
- |
- static private class FakeCapturerObserver implements CameraVideoCapturer.CapturerObserver { |
- private int framesCaptured = 0; |
- private int frameSize = 0; |
- private int frameWidth = 0; |
- private int frameHeight = 0; |
- final private Object frameLock = new Object(); |
- final private Object capturerStartLock = new Object(); |
- private boolean capturerStartResult = false; |
- final private List<Long> timestamps = new ArrayList<Long>(); |
- |
- @Override |
- public void onCapturerStarted(boolean success) { |
- Logging.d(TAG, "onCapturerStarted: " + success); |
- |
- synchronized (capturerStartLock) { |
- capturerStartResult = success; |
- capturerStartLock.notifyAll(); |
- } |
- } |
- |
- @Override |
- public void onCapturerStopped() { |
- Logging.d(TAG, "onCapturerStopped"); |
- } |
- |
- @Override |
- public void onByteBufferFrameCaptured( |
- byte[] frame, int width, int height, int rotation, long timeStamp) { |
- synchronized (frameLock) { |
- ++framesCaptured; |
- frameSize = frame.length; |
- frameWidth = width; |
- frameHeight = height; |
- timestamps.add(timeStamp); |
- frameLock.notify(); |
- } |
- } |
- @Override |
- public void onTextureFrameCaptured(int width, int height, int oesTextureId, |
- float[] transformMatrix, int rotation, long timeStamp) { |
- synchronized (frameLock) { |
- ++framesCaptured; |
- frameWidth = width; |
- frameHeight = height; |
- frameSize = 0; |
- timestamps.add(timeStamp); |
- frameLock.notify(); |
- } |
- } |
- |
- public boolean waitForCapturerToStart() throws InterruptedException { |
- Logging.d(TAG, "Waiting for the capturer to start"); |
- synchronized (capturerStartLock) { |
- capturerStartLock.wait(); |
- return capturerStartResult; |
- } |
- } |
- |
- public int waitForNextCapturedFrame() throws InterruptedException { |
- Logging.d(TAG, "Waiting for the next captured frame"); |
- synchronized (frameLock) { |
- frameLock.wait(); |
- return framesCaptured; |
- } |
- } |
- |
- int frameSize() { |
- synchronized (frameLock) { |
- return frameSize; |
- } |
- } |
- |
- int frameWidth() { |
- synchronized (frameLock) { |
- return frameWidth; |
- } |
- } |
- |
- int frameHeight() { |
- synchronized (frameLock) { |
- return frameHeight; |
- } |
- } |
- |
- List<Long> getCopyAndResetListOftimeStamps() { |
- synchronized (frameLock) { |
- ArrayList<Long> list = new ArrayList<Long>(timestamps); |
- timestamps.clear(); |
- return list; |
- } |
- } |
- } |
- |
- static class CameraEvents implements CameraVideoCapturer.CameraEventsHandler { |
- public boolean onCameraOpeningCalled; |
- public boolean onFirstFrameAvailableCalled; |
- public final Object onCameraFreezedLock = new Object(); |
- private String onCameraFreezedDescription; |
- public final Object cameraClosedLock = new Object(); |
- private boolean cameraClosed = true; |
- |
- @Override |
- public void onCameraError(String errorDescription) { |
- Logging.w(TAG, "Camera error: " + errorDescription); |
- cameraClosed = true; |
- } |
- |
- @Override |
- public void onCameraDisconnected() {} |
- |
- @Override |
- public void onCameraFreezed(String errorDescription) { |
- synchronized (onCameraFreezedLock) { |
- onCameraFreezedDescription = errorDescription; |
- onCameraFreezedLock.notifyAll(); |
- } |
- } |
- |
- @Override |
- public void onCameraOpening(String cameraName) { |
- onCameraOpeningCalled = true; |
- synchronized (cameraClosedLock) { |
- cameraClosed = false; |
- } |
- } |
- |
- @Override |
- public void onFirstFrameAvailable() { |
- onFirstFrameAvailableCalled = true; |
- } |
- |
- @Override |
- public void onCameraClosed() { |
- synchronized (cameraClosedLock) { |
- cameraClosed = true; |
- cameraClosedLock.notifyAll(); |
- } |
- } |
- |
- public String waitForCameraFreezed() throws InterruptedException { |
- Logging.d(TAG, "Waiting for the camera to freeze"); |
- synchronized (onCameraFreezedLock) { |
- onCameraFreezedLock.wait(); |
- return onCameraFreezedDescription; |
- } |
- } |
- |
- public void waitForCameraClosed() throws InterruptedException { |
- synchronized (cameraClosedLock) { |
- while (!cameraClosed) { |
- Logging.d(TAG, "Waiting for the camera to close."); |
- cameraClosedLock.wait(); |
- } |
- } |
- } |
- } |
- |
- /** |
- * Class to collect all classes related to single capturer instance. |
- */ |
- static private class CapturerInstance { |
- public CameraVideoCapturer capturer; |
- public CameraEvents cameraEvents; |
- public SurfaceTextureHelper surfaceTextureHelper; |
- public FakeCapturerObserver observer; |
- public List<CaptureFormat> supportedFormats; |
- public CaptureFormat format; |
- } |
- |
- /** |
- * Class used for collecting a VideoSource, a VideoTrack and a renderer. The class |
- * is used for testing local rendering from a capturer. |
- */ |
- static private class VideoTrackWithRenderer { |
- public VideoSource source; |
- public VideoTrack track; |
- public RendererCallbacks rendererCallbacks; |
- public FakeAsyncRenderer fakeAsyncRenderer; |
- } |
- |
- public abstract static class TestObjectFactory { |
- final CameraEnumerator cameraEnumerator; |
- |
- TestObjectFactory() { |
- cameraEnumerator = getCameraEnumerator(); |
- } |
- |
- public CameraVideoCapturer createCapturer( |
- String name, CameraVideoCapturer.CameraEventsHandler eventsHandler) { |
- return cameraEnumerator.createCapturer(name, eventsHandler); |
- } |
- |
- public String getNameOfFrontFacingDevice() { |
- for (String deviceName : cameraEnumerator.getDeviceNames()) { |
- if (cameraEnumerator.isFrontFacing(deviceName)) { |
- return deviceName; |
- } |
- } |
- |
- return null; |
- } |
- |
- public String getNameOfBackFacingDevice() { |
- for (String deviceName : cameraEnumerator.getDeviceNames()) { |
- if (cameraEnumerator.isBackFacing(deviceName)) { |
- return deviceName; |
- } |
- } |
- |
- return null; |
- } |
- |
- public boolean haveTwoCameras() { |
- return cameraEnumerator.getDeviceNames().length >= 2; |
- } |
- |
- public boolean isCapturingToTexture() { |
- // In the future, we plan to only support capturing to texture, so default to true |
- return true; |
- } |
- |
- abstract public CameraEnumerator getCameraEnumerator(); |
- abstract public Context getAppContext(); |
- |
- // CameraVideoCapturer API is too slow for some of our tests where we need to open a competing |
- // camera. These methods are used instead. |
- abstract public Object rawOpenCamera(String cameraName); |
- abstract public void rawCloseCamera(Object camera); |
- } |
- |
- private PeerConnectionFactory peerConnectionFactory; |
- private TestObjectFactory testObjectFactory; |
- |
- CameraVideoCapturerTestFixtures(TestObjectFactory testObjectFactory) { |
- PeerConnectionFactory.initializeAndroidGlobals( |
- testObjectFactory.getAppContext(), true, true, true); |
- |
- this.peerConnectionFactory = new PeerConnectionFactory(null /* options */); |
- this.testObjectFactory = testObjectFactory; |
- } |
- |
- public void dispose() { |
- this.peerConnectionFactory.dispose(); |
- } |
- |
- // Internal helper methods |
- private CapturerInstance createCapturer(String name, boolean initialize) { |
- CapturerInstance instance = new CapturerInstance(); |
- instance.cameraEvents = new CameraEvents(); |
- instance.capturer = testObjectFactory.createCapturer(name, instance.cameraEvents); |
- instance.surfaceTextureHelper = SurfaceTextureHelper.create( |
- "SurfaceTextureHelper test" /* threadName */, null /* sharedContext */); |
- instance.observer = new FakeCapturerObserver(); |
- if (initialize) { |
- instance.capturer.initialize( |
- instance.surfaceTextureHelper, testObjectFactory.getAppContext(), instance.observer); |
- } |
- instance.supportedFormats = testObjectFactory.cameraEnumerator.getSupportedFormats(name); |
- return instance; |
- } |
- |
- private CapturerInstance createCapturer(boolean initialize) { |
- String name = testObjectFactory.cameraEnumerator.getDeviceNames()[0]; |
- return createCapturer(name, initialize); |
- } |
- |
- private void startCapture(CapturerInstance instance) { |
- startCapture(instance, 0); |
- } |
- |
- private void startCapture(CapturerInstance instance, int formatIndex) { |
- final CameraEnumerationAndroid.CaptureFormat format = |
- instance.supportedFormats.get(formatIndex); |
- |
- instance.capturer.startCapture(format.width, format.height, format.framerate.max); |
- instance.format = format; |
- } |
- |
- private void disposeCapturer(CapturerInstance instance) throws InterruptedException { |
- instance.capturer.stopCapture(); |
- instance.cameraEvents.waitForCameraClosed(); |
- instance.capturer.dispose(); |
- instance.surfaceTextureHelper.returnTextureFrame(); |
- instance.surfaceTextureHelper.dispose(); |
- } |
- |
- private VideoTrackWithRenderer createVideoTrackWithRenderer( |
- CameraVideoCapturer capturer, VideoRenderer.Callbacks rendererCallbacks) { |
- VideoTrackWithRenderer videoTrackWithRenderer = new VideoTrackWithRenderer(); |
- videoTrackWithRenderer.source = peerConnectionFactory.createVideoSource(capturer); |
- capturer.startCapture(DEFAULT_WIDTH, DEFAULT_HEIGHT, DEFAULT_FPS); |
- videoTrackWithRenderer.track = |
- peerConnectionFactory.createVideoTrack("dummy", videoTrackWithRenderer.source); |
- videoTrackWithRenderer.track.addRenderer(new VideoRenderer(rendererCallbacks)); |
- return videoTrackWithRenderer; |
- } |
- |
- private VideoTrackWithRenderer createVideoTrackWithRenderer(CameraVideoCapturer capturer) { |
- RendererCallbacks rendererCallbacks = new RendererCallbacks(); |
- VideoTrackWithRenderer videoTrackWithRenderer = |
- createVideoTrackWithRenderer(capturer, rendererCallbacks); |
- videoTrackWithRenderer.rendererCallbacks = rendererCallbacks; |
- return videoTrackWithRenderer; |
- } |
- |
- private VideoTrackWithRenderer createVideoTrackWithFakeAsyncRenderer( |
- CameraVideoCapturer capturer) { |
- FakeAsyncRenderer fakeAsyncRenderer = new FakeAsyncRenderer(); |
- VideoTrackWithRenderer videoTrackWithRenderer = |
- createVideoTrackWithRenderer(capturer, fakeAsyncRenderer); |
- videoTrackWithRenderer.fakeAsyncRenderer = fakeAsyncRenderer; |
- return videoTrackWithRenderer; |
- } |
- |
- private void disposeVideoTrackWithRenderer(VideoTrackWithRenderer videoTrackWithRenderer) { |
- videoTrackWithRenderer.track.dispose(); |
- videoTrackWithRenderer.source.dispose(); |
- } |
- |
- private void waitUntilIdle(CapturerInstance capturerInstance) throws InterruptedException { |
- final CountDownLatch barrier = new CountDownLatch(1); |
- capturerInstance.surfaceTextureHelper.getHandler().post(new Runnable() { |
- @Override |
- public void run() { |
- barrier.countDown(); |
- } |
- }); |
- barrier.await(); |
- } |
- |
- private void createCapturerAndRender(String name) throws InterruptedException { |
- if (name == null) { |
- Logging.w(TAG, "Skipping video capturer test because device name is null."); |
- return; |
- } |
- |
- final CapturerInstance capturerInstance = createCapturer(name, false /* initialize */); |
- final VideoTrackWithRenderer videoTrackWithRenderer = |
- createVideoTrackWithRenderer(capturerInstance.capturer); |
- assertTrue(videoTrackWithRenderer.rendererCallbacks.waitForNextFrameToRender() > 0); |
- disposeCapturer(capturerInstance); |
- disposeVideoTrackWithRenderer(videoTrackWithRenderer); |
- } |
- |
- // Test methods |
- public void createCapturerAndDispose() throws InterruptedException { |
- disposeCapturer(createCapturer(true /* initialize */)); |
- } |
- |
- public void createNonExistingCamera() throws InterruptedException { |
- try { |
- disposeCapturer(createCapturer("non-existing camera", false /* initialize */)); |
- } catch (IllegalArgumentException e) { |
- return; |
- } |
- |
- fail("Expected illegal argument exception when creating non-existing camera."); |
- } |
- |
- public void createCapturerAndRender() throws InterruptedException { |
- String name = testObjectFactory.cameraEnumerator.getDeviceNames()[0]; |
- createCapturerAndRender(name); |
- } |
- |
- public void createFrontFacingCapturerAndRender() throws InterruptedException { |
- createCapturerAndRender(testObjectFactory.getNameOfFrontFacingDevice()); |
- } |
- |
- public void createBackFacingCapturerAndRender() throws InterruptedException { |
- createCapturerAndRender(testObjectFactory.getNameOfBackFacingDevice()); |
- } |
- |
- public void switchCamera() throws InterruptedException { |
- if (!testObjectFactory.haveTwoCameras()) { |
- Logging.w( |
- TAG, "Skipping test switch video capturer because the device doesn't have two cameras."); |
- return; |
- } |
- |
- final CapturerInstance capturerInstance = createCapturer(false /* initialize */); |
- final VideoTrackWithRenderer videoTrackWithRenderer = |
- createVideoTrackWithRenderer(capturerInstance.capturer); |
- // Wait for the camera to start so we can switch it |
- assertTrue(videoTrackWithRenderer.rendererCallbacks.waitForNextFrameToRender() > 0); |
- |
- // Array with one element to avoid final problem in nested classes. |
- final boolean[] cameraSwitchSuccessful = new boolean[1]; |
- final CountDownLatch barrier = new CountDownLatch(1); |
- capturerInstance.capturer.switchCamera(new CameraVideoCapturer.CameraSwitchHandler() { |
- @Override |
- public void onCameraSwitchDone(boolean isFrontCamera) { |
- cameraSwitchSuccessful[0] = true; |
- barrier.countDown(); |
- } |
- @Override |
- public void onCameraSwitchError(String errorDescription) { |
- cameraSwitchSuccessful[0] = false; |
- barrier.countDown(); |
- } |
- }); |
- // Wait until the camera has been switched. |
- barrier.await(); |
- |
- // Check result. |
- assertTrue(cameraSwitchSuccessful[0]); |
- // Ensure that frames are received. |
- assertTrue(videoTrackWithRenderer.rendererCallbacks.waitForNextFrameToRender() > 0); |
- disposeCapturer(capturerInstance); |
- disposeVideoTrackWithRenderer(videoTrackWithRenderer); |
- } |
- |
- public void cameraEventsInvoked() throws InterruptedException { |
- final CapturerInstance capturerInstance = createCapturer(true /* initialize */); |
- startCapture(capturerInstance); |
- // Make sure camera is started and first frame is received and then stop it. |
- assertTrue(capturerInstance.observer.waitForCapturerToStart()); |
- capturerInstance.observer.waitForNextCapturedFrame(); |
- disposeCapturer(capturerInstance); |
- |
- assertTrue(capturerInstance.cameraEvents.onCameraOpeningCalled); |
- assertTrue(capturerInstance.cameraEvents.onFirstFrameAvailableCalled); |
- } |
- |
- public void cameraCallsAfterStop() throws InterruptedException { |
- final CapturerInstance capturerInstance = createCapturer(true /* initialize */); |
- startCapture(capturerInstance); |
- // Make sure camera is started and then stop it. |
- assertTrue(capturerInstance.observer.waitForCapturerToStart()); |
- capturerInstance.capturer.stopCapture(); |
- capturerInstance.surfaceTextureHelper.returnTextureFrame(); |
- |
- // We can't change |capturer| at this point, but we should not crash. |
- capturerInstance.capturer.switchCamera(null /* switchEventsHandler */); |
- capturerInstance.capturer.changeCaptureFormat(DEFAULT_WIDTH, DEFAULT_HEIGHT, DEFAULT_FPS); |
- |
- disposeCapturer(capturerInstance); |
- } |
- |
- public void stopRestartVideoSource() throws InterruptedException { |
- final CapturerInstance capturerInstance = createCapturer(false /* initialize */); |
- final VideoTrackWithRenderer videoTrackWithRenderer = |
- createVideoTrackWithRenderer(capturerInstance.capturer); |
- |
- assertTrue(videoTrackWithRenderer.rendererCallbacks.waitForNextFrameToRender() > 0); |
- assertEquals(MediaSource.State.LIVE, videoTrackWithRenderer.source.state()); |
- |
- capturerInstance.capturer.stopCapture(); |
- assertEquals(MediaSource.State.ENDED, videoTrackWithRenderer.source.state()); |
- |
- startCapture(capturerInstance); |
- assertTrue(videoTrackWithRenderer.rendererCallbacks.waitForNextFrameToRender() > 0); |
- assertEquals(MediaSource.State.LIVE, videoTrackWithRenderer.source.state()); |
- |
- disposeCapturer(capturerInstance); |
- disposeVideoTrackWithRenderer(videoTrackWithRenderer); |
- } |
- |
- public void startStopWithDifferentResolutions() throws InterruptedException { |
- final CapturerInstance capturerInstance = createCapturer(true /* initialize */); |
- |
- for (int i = 0; i < 3; ++i) { |
- startCapture(capturerInstance, i); |
- assertTrue(capturerInstance.observer.waitForCapturerToStart()); |
- capturerInstance.observer.waitForNextCapturedFrame(); |
- |
- // Check the frame size. The actual width and height depend on how the capturer is mounted. |
- final boolean identicalResolution = |
- (capturerInstance.observer.frameWidth() == capturerInstance.format.width |
- && capturerInstance.observer.frameHeight() == capturerInstance.format.height); |
- final boolean flippedResolution = |
- (capturerInstance.observer.frameWidth() == capturerInstance.format.height |
- && capturerInstance.observer.frameHeight() == capturerInstance.format.width); |
- if (!identicalResolution && !flippedResolution) { |
- fail("Wrong resolution, got: " + capturerInstance.observer.frameWidth() + "x" |
- + capturerInstance.observer.frameHeight() + " expected: " |
- + capturerInstance.format.width + "x" + capturerInstance.format.height + " or " |
- + capturerInstance.format.height + "x" + capturerInstance.format.width); |
- } |
- |
- if (testObjectFactory.isCapturingToTexture()) { |
- assertEquals(0, capturerInstance.observer.frameSize()); |
- } else { |
- assertTrue(capturerInstance.format.frameSize() <= capturerInstance.observer.frameSize()); |
- } |
- capturerInstance.capturer.stopCapture(); |
- capturerInstance.surfaceTextureHelper.returnTextureFrame(); |
- } |
- disposeCapturer(capturerInstance); |
- } |
- |
- public void returnBufferLate() throws InterruptedException { |
- final CapturerInstance capturerInstance = createCapturer(true /* initialize */); |
- startCapture(capturerInstance); |
- assertTrue(capturerInstance.observer.waitForCapturerToStart()); |
- |
- capturerInstance.observer.waitForNextCapturedFrame(); |
- capturerInstance.capturer.stopCapture(); |
- List<Long> listOftimestamps = capturerInstance.observer.getCopyAndResetListOftimeStamps(); |
- assertTrue(listOftimestamps.size() >= 1); |
- |
- startCapture(capturerInstance, 1); |
- capturerInstance.observer.waitForCapturerToStart(); |
- capturerInstance.surfaceTextureHelper.returnTextureFrame(); |
- |
- capturerInstance.observer.waitForNextCapturedFrame(); |
- capturerInstance.capturer.stopCapture(); |
- |
- listOftimestamps = capturerInstance.observer.getCopyAndResetListOftimeStamps(); |
- assertTrue(listOftimestamps.size() >= 1); |
- |
- disposeCapturer(capturerInstance); |
- } |
- |
- public void returnBufferLateEndToEnd() throws InterruptedException { |
- final CapturerInstance capturerInstance = createCapturer(false /* initialize */); |
- final VideoTrackWithRenderer videoTrackWithRenderer = |
- createVideoTrackWithFakeAsyncRenderer(capturerInstance.capturer); |
- // Wait for at least one frame that has not been returned. |
- assertFalse(videoTrackWithRenderer.fakeAsyncRenderer.waitForPendingFrames().isEmpty()); |
- |
- capturerInstance.capturer.stopCapture(); |
- |
- // Dispose everything. |
- disposeCapturer(capturerInstance); |
- disposeVideoTrackWithRenderer(videoTrackWithRenderer); |
- |
- // Return the frame(s), on a different thread out of spite. |
- final List<I420Frame> pendingFrames = |
- videoTrackWithRenderer.fakeAsyncRenderer.waitForPendingFrames(); |
- final Thread returnThread = new Thread(new Runnable() { |
- @Override |
- public void run() { |
- for (I420Frame frame : pendingFrames) { |
- VideoRenderer.renderFrameDone(frame); |
- } |
- } |
- }); |
- returnThread.start(); |
- returnThread.join(); |
- } |
- |
- public void cameraFreezedEventOnBufferStarvation() throws InterruptedException { |
- final CapturerInstance capturerInstance = createCapturer(true /* initialize */); |
- startCapture(capturerInstance); |
- // Make sure camera is started. |
- assertTrue(capturerInstance.observer.waitForCapturerToStart()); |
- // Since we don't return the buffer, we should get a starvation message if we are |
- // capturing to a texture. |
- assertEquals("Camera failure. Client must return video buffers.", |
- capturerInstance.cameraEvents.waitForCameraFreezed()); |
- |
- capturerInstance.capturer.stopCapture(); |
- disposeCapturer(capturerInstance); |
- } |
- |
- public void scaleCameraOutput() throws InterruptedException { |
- final CapturerInstance capturerInstance = createCapturer(false /* initialize */); |
- final VideoTrackWithRenderer videoTrackWithRenderer = |
- createVideoTrackWithRenderer(capturerInstance.capturer); |
- assertTrue(videoTrackWithRenderer.rendererCallbacks.waitForNextFrameToRender() > 0); |
- |
- final int startWidth = videoTrackWithRenderer.rendererCallbacks.frameWidth(); |
- final int startHeight = videoTrackWithRenderer.rendererCallbacks.frameHeight(); |
- final int frameRate = 30; |
- final int scaledWidth = startWidth / 2; |
- final int scaledHeight = startHeight / 2; |
- |
- // Request the captured frames to be scaled. |
- videoTrackWithRenderer.source.adaptOutputFormat(scaledWidth, scaledHeight, frameRate); |
- |
- boolean gotExpectedResolution = false; |
- int numberOfInspectedFrames = 0; |
- |
- do { |
- videoTrackWithRenderer.rendererCallbacks.waitForNextFrameToRender(); |
- ++numberOfInspectedFrames; |
- |
- gotExpectedResolution = (videoTrackWithRenderer.rendererCallbacks.frameWidth() == scaledWidth |
- && videoTrackWithRenderer.rendererCallbacks.frameHeight() == scaledHeight); |
- } while (!gotExpectedResolution && numberOfInspectedFrames < 30); |
- |
- disposeCapturer(capturerInstance); |
- disposeVideoTrackWithRenderer(videoTrackWithRenderer); |
- |
- assertTrue(gotExpectedResolution); |
- } |
- |
- public void startWhileCameraIsAlreadyOpen() throws InterruptedException { |
- final String cameraName = testObjectFactory.getNameOfBackFacingDevice(); |
- // At this point camera is not actually opened. |
- final CapturerInstance capturerInstance = createCapturer(cameraName, true /* initialize */); |
- |
- final Object competingCamera = testObjectFactory.rawOpenCamera(cameraName); |
- |
- startCapture(capturerInstance); |
- |
- if (android.os.Build.VERSION.SDK_INT > android.os.Build.VERSION_CODES.LOLLIPOP_MR1) { |
- // The first opened camera client will be evicted. |
- assertTrue(capturerInstance.observer.waitForCapturerToStart()); |
- } else { |
- assertFalse(capturerInstance.observer.waitForCapturerToStart()); |
- } |
- |
- testObjectFactory.rawCloseCamera(competingCamera); |
- disposeCapturer(capturerInstance); |
- } |
- |
- public void startWhileCameraIsAlreadyOpenAndCloseCamera() throws InterruptedException { |
- final String cameraName = testObjectFactory.getNameOfBackFacingDevice(); |
- // At this point camera is not actually opened. |
- final CapturerInstance capturerInstance = createCapturer(cameraName, false /* initialize */); |
- |
- Logging.d(TAG, "startWhileCameraIsAlreadyOpenAndCloseCamera: Opening competing camera."); |
- final Object competingCamera = testObjectFactory.rawOpenCamera(cameraName); |
- |
- Logging.d(TAG, "startWhileCameraIsAlreadyOpenAndCloseCamera: Opening camera."); |
- final VideoTrackWithRenderer videoTrackWithRenderer = |
- createVideoTrackWithRenderer(capturerInstance.capturer); |
- waitUntilIdle(capturerInstance); |
- |
- Logging.d(TAG, "startWhileCameraIsAlreadyOpenAndCloseCamera: Closing competing camera."); |
- testObjectFactory.rawCloseCamera(competingCamera); |
- |
- // Make sure camera is started and first frame is received and then stop it. |
- Logging.d(TAG, "startWhileCameraIsAlreadyOpenAndCloseCamera: Waiting for capture to start."); |
- videoTrackWithRenderer.rendererCallbacks.waitForNextFrameToRender(); |
- Logging.d(TAG, "startWhileCameraIsAlreadyOpenAndCloseCamera: Stopping capture."); |
- disposeCapturer(capturerInstance); |
- } |
- |
- public void startWhileCameraIsAlreadyOpenAndStop() throws InterruptedException { |
- final String cameraName = testObjectFactory.getNameOfBackFacingDevice(); |
- // At this point camera is not actually opened. |
- final CapturerInstance capturerInstance = createCapturer(cameraName, true /* initialize */); |
- |
- final Object competingCamera = testObjectFactory.rawOpenCamera(cameraName); |
- |
- startCapture(capturerInstance); |
- disposeCapturer(capturerInstance); |
- |
- testObjectFactory.rawCloseCamera(competingCamera); |
- } |
-} |