| Index: webrtc/api/androidtests/src/org/webrtc/SurfaceTextureHelperTest.java
|
| diff --git a/webrtc/api/androidtests/src/org/webrtc/SurfaceTextureHelperTest.java b/webrtc/api/androidtests/src/org/webrtc/SurfaceTextureHelperTest.java
|
| index f2a8a6fc660a5a9a10d288ca87a5dbeb49dc51af..8343772c1c98d0c75debe70226dae6fb43408517 100644
|
| --- a/webrtc/api/androidtests/src/org/webrtc/SurfaceTextureHelperTest.java
|
| +++ b/webrtc/api/androidtests/src/org/webrtc/SurfaceTextureHelperTest.java
|
| @@ -17,6 +17,7 @@ import android.test.suitebuilder.annotation.MediumTest;
|
| import android.test.suitebuilder.annotation.SmallTest;
|
|
|
| import java.nio.ByteBuffer;
|
| +import java.util.concurrent.CountDownLatch;
|
|
|
| public final class SurfaceTextureHelperTest extends ActivityTestCase {
|
| /**
|
| @@ -104,7 +105,7 @@ public final class SurfaceTextureHelperTest extends ActivityTestCase {
|
| final SurfaceTextureHelper surfaceTextureHelper =
|
| SurfaceTextureHelper.create(eglBase.getEglBaseContext());
|
| final MockTextureListener listener = new MockTextureListener();
|
| - surfaceTextureHelper.setListener(listener);
|
| + surfaceTextureHelper.startListening(listener);
|
| surfaceTextureHelper.getSurfaceTexture().setDefaultBufferSize(width, height);
|
|
|
| // Create resources for stubbing an OES texture producer. |eglOesBase| has the SurfaceTexture in
|
| @@ -150,12 +151,12 @@ public final class SurfaceTextureHelperTest extends ActivityTestCase {
|
| }
|
|
|
| drawer.release();
|
| - surfaceTextureHelper.disconnect();
|
| + surfaceTextureHelper.dispose();
|
| eglBase.release();
|
| }
|
|
|
| /**
|
| - * Test disconnecting the SurfaceTextureHelper while holding a pending texture frame. The pending
|
| + * Test disposing the SurfaceTextureHelper while holding a pending texture frame. The pending
|
| * texture frame should still be valid, and this is tested by drawing the texture frame to a pixel
|
| * buffer and reading it back with glReadPixels().
|
| */
|
| @@ -171,7 +172,7 @@ public final class SurfaceTextureHelperTest extends ActivityTestCase {
|
| final SurfaceTextureHelper surfaceTextureHelper =
|
| SurfaceTextureHelper.create(eglBase.getEglBaseContext());
|
| final MockTextureListener listener = new MockTextureListener();
|
| - surfaceTextureHelper.setListener(listener);
|
| + surfaceTextureHelper.startListening(listener);
|
| surfaceTextureHelper.getSurfaceTexture().setDefaultBufferSize(width, height);
|
|
|
| // Create resources for stubbing an OES texture producer. |eglOesBase| has the SurfaceTexture in
|
| @@ -196,7 +197,7 @@ public final class SurfaceTextureHelperTest extends ActivityTestCase {
|
| // Wait for OES texture frame.
|
| listener.waitForNewFrame();
|
| // Diconnect while holding the frame.
|
| - surfaceTextureHelper.disconnect();
|
| + surfaceTextureHelper.dispose();
|
|
|
| // Draw the pending texture frame onto the pixel buffer.
|
| eglBase.makeCurrent();
|
| @@ -217,21 +218,21 @@ public final class SurfaceTextureHelperTest extends ActivityTestCase {
|
| assertEquals(rgbaData.get() & 0xFF, blue);
|
| assertEquals(rgbaData.get() & 0xFF, 255);
|
| }
|
| - // Late frame return after everything has been disconnected and released.
|
| + // Late frame return after everything has been disposed and released.
|
| surfaceTextureHelper.returnTextureFrame();
|
| }
|
|
|
| /**
|
| - * Test disconnecting the SurfaceTextureHelper, but keep trying to produce more texture frames. No
|
| + * Test disposing the SurfaceTextureHelper, but keep trying to produce more texture frames. No
|
| * frames should be delivered to the listener.
|
| */
|
| @MediumTest
|
| - public static void testDisconnect() throws InterruptedException {
|
| + public static void testDispose() throws InterruptedException {
|
| // Create SurfaceTextureHelper and listener.
|
| final SurfaceTextureHelper surfaceTextureHelper =
|
| SurfaceTextureHelper.create(null);
|
| final MockTextureListener listener = new MockTextureListener();
|
| - surfaceTextureHelper.setListener(listener);
|
| + surfaceTextureHelper.startListening(listener);
|
| // Create EglBase with the SurfaceTexture as target EGLSurface.
|
| final EglBase eglBase = EglBase.create(null, EglBase.CONFIG_PLAIN);
|
| eglBase.createSurface(surfaceTextureHelper.getSurfaceTexture());
|
| @@ -245,13 +246,13 @@ public final class SurfaceTextureHelperTest extends ActivityTestCase {
|
| listener.waitForNewFrame();
|
| surfaceTextureHelper.returnTextureFrame();
|
|
|
| - // Disconnect - we should not receive any textures after this.
|
| - surfaceTextureHelper.disconnect();
|
| + // Dispose - we should not receive any textures after this.
|
| + surfaceTextureHelper.dispose();
|
|
|
| // Draw one frame.
|
| GLES20.glClear(GLES20.GL_COLOR_BUFFER_BIT);
|
| eglBase.swapBuffers();
|
| - // swapBuffers() should not trigger onTextureFrameAvailable() because we are disconnected.
|
| + // swapBuffers() should not trigger onTextureFrameAvailable() because disposed has been called.
|
| // Assert that no OES texture was delivered.
|
| assertFalse(listener.waitForNewFrame(500));
|
|
|
| @@ -259,14 +260,125 @@ public final class SurfaceTextureHelperTest extends ActivityTestCase {
|
| }
|
|
|
| /**
|
| - * Test disconnecting the SurfaceTextureHelper immediately after is has been setup to use a
|
| + * Test disposing the SurfaceTextureHelper immediately after is has been setup to use a
|
| * shared context. No frames should be delivered to the listener.
|
| */
|
| @SmallTest
|
| - public static void testDisconnectImmediately() {
|
| + public static void testDisposeImmediately() {
|
| final SurfaceTextureHelper surfaceTextureHelper =
|
| SurfaceTextureHelper.create(null);
|
| - surfaceTextureHelper.disconnect();
|
| + surfaceTextureHelper.dispose();
|
| + }
|
| +
|
| + // Helper method to call stopListening() on correct thread.
|
| + private static void stopListeningOnHandlerThread(final SurfaceTextureHelper surfaceTextureHelper)
|
| + throws InterruptedException {
|
| + final CountDownLatch barrier = new CountDownLatch(1);
|
| + surfaceTextureHelper.getHandler().post(new Runnable() {
|
| + @Override
|
| + public void run() {
|
| + surfaceTextureHelper.stopListening();
|
| + barrier.countDown();
|
| + }
|
| + });
|
| + barrier.await();
|
| + }
|
| +
|
| + /**
|
| + * Call stopListening(), but keep trying to produce more texture frames. No frames should be
|
| + * delivered to the listener.
|
| + */
|
| + @MediumTest
|
| + public static void testStopListening() throws InterruptedException {
|
| + // Create SurfaceTextureHelper and listener.
|
| + final SurfaceTextureHelper surfaceTextureHelper =
|
| + SurfaceTextureHelper.create(null);
|
| + final MockTextureListener listener = new MockTextureListener();
|
| + surfaceTextureHelper.startListening(listener);
|
| + // Create EglBase with the SurfaceTexture as target EGLSurface.
|
| + final EglBase eglBase = EglBase.create(null, EglBase.CONFIG_PLAIN);
|
| + eglBase.createSurface(surfaceTextureHelper.getSurfaceTexture());
|
| + eglBase.makeCurrent();
|
| + // Assert no frame has been received yet.
|
| + assertFalse(listener.waitForNewFrame(1));
|
| + // Draw and wait for one frame.
|
| + GLES20.glClear(GLES20.GL_COLOR_BUFFER_BIT);
|
| + // swapBuffers() will ultimately trigger onTextureFrameAvailable().
|
| + eglBase.swapBuffers();
|
| + listener.waitForNewFrame();
|
| + surfaceTextureHelper.returnTextureFrame();
|
| +
|
| + // Stop listening - we should not receive any textures after this.
|
| + stopListeningOnHandlerThread(surfaceTextureHelper);
|
| +
|
| + // Draw one frame.
|
| + GLES20.glClear(GLES20.GL_COLOR_BUFFER_BIT);
|
| + eglBase.swapBuffers();
|
| + // swapBuffers() should not trigger onTextureFrameAvailable() because disposed has been called.
|
| + // Assert that no OES texture was delivered.
|
| + assertFalse(listener.waitForNewFrame(500));
|
| +
|
| + surfaceTextureHelper.dispose();
|
| + eglBase.release();
|
| + }
|
| +
|
| + /**
|
| + * Test stopListening() immediately after the SurfaceTextureHelper has been setup.
|
| + */
|
| + @SmallTest
|
| + public static void testStopListeningImmediately() throws InterruptedException {
|
| + final SurfaceTextureHelper surfaceTextureHelper =
|
| + SurfaceTextureHelper.create(null);
|
| + final MockTextureListener listener = new MockTextureListener();
|
| + surfaceTextureHelper.startListening(listener);
|
| + stopListeningOnHandlerThread(surfaceTextureHelper);
|
| + surfaceTextureHelper.dispose();
|
| + }
|
| +
|
| + /**
|
| + * Test calling startListening() with a new listener after stopListening() has been called.
|
| + */
|
| + @MediumTest
|
| + public static void testRestartListeningWithNewListener() throws InterruptedException {
|
| + // Create SurfaceTextureHelper and listener.
|
| + final SurfaceTextureHelper surfaceTextureHelper =
|
| + SurfaceTextureHelper.create(null);
|
| + final MockTextureListener listener1 = new MockTextureListener();
|
| + surfaceTextureHelper.startListening(listener1);
|
| + // Create EglBase with the SurfaceTexture as target EGLSurface.
|
| + final EglBase eglBase = EglBase.create(null, EglBase.CONFIG_PLAIN);
|
| + eglBase.createSurface(surfaceTextureHelper.getSurfaceTexture());
|
| + eglBase.makeCurrent();
|
| + // Assert no frame has been received yet.
|
| + assertFalse(listener1.waitForNewFrame(1));
|
| + // Draw and wait for one frame.
|
| + GLES20.glClear(GLES20.GL_COLOR_BUFFER_BIT);
|
| + // swapBuffers() will ultimately trigger onTextureFrameAvailable().
|
| + eglBase.swapBuffers();
|
| + listener1.waitForNewFrame();
|
| + surfaceTextureHelper.returnTextureFrame();
|
| +
|
| + // Stop listening - |listener1| should not receive any textures after this.
|
| + stopListeningOnHandlerThread(surfaceTextureHelper);
|
| +
|
| + // Connect different listener.
|
| + final MockTextureListener listener2 = new MockTextureListener();
|
| + surfaceTextureHelper.startListening(listener2);
|
| + // Assert no frame has been received yet.
|
| + assertFalse(listener2.waitForNewFrame(1));
|
| +
|
| + // Draw one frame.
|
| + GLES20.glClear(GLES20.GL_COLOR_BUFFER_BIT);
|
| + eglBase.swapBuffers();
|
| +
|
| + // Check that |listener2| received the frame, and not |listener1|.
|
| + listener2.waitForNewFrame();
|
| + assertFalse(listener1.waitForNewFrame(1));
|
| +
|
| + surfaceTextureHelper.returnTextureFrame();
|
| +
|
| + surfaceTextureHelper.dispose();
|
| + eglBase.release();
|
| }
|
|
|
| @MediumTest
|
| @@ -280,7 +392,7 @@ public final class SurfaceTextureHelperTest extends ActivityTestCase {
|
| final SurfaceTextureHelper surfaceTextureHelper =
|
| SurfaceTextureHelper.create(eglBase.getEglBaseContext());
|
| final MockTextureListener listener = new MockTextureListener();
|
| - surfaceTextureHelper.setListener(listener);
|
| + surfaceTextureHelper.startListening(listener);
|
| surfaceTextureHelper.getSurfaceTexture().setDefaultBufferSize(width, height);
|
|
|
| // Create resources for stubbing an OES texture producer. |eglBase| has the SurfaceTexture in
|
| @@ -342,7 +454,7 @@ public final class SurfaceTextureHelperTest extends ActivityTestCase {
|
| }
|
| }
|
|
|
| - surfaceTextureHelper.disconnect();
|
| + surfaceTextureHelper.dispose();
|
| eglBase.release();
|
| }
|
| }
|
|
|