Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(752)

Unified Diff: webrtc/api/androidtests/src/org/webrtc/SurfaceTextureHelperTest.java

Issue 1755573002: Android SurfaceTextureHelper: Add stopListening() function (Closed) Base URL: https://chromium.googlesource.com/external/webrtc.git@master
Patch Set: Change name from disconnect() to dispose() Created 4 years, 10 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
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();
}
}

Powered by Google App Engine
This is Rietveld 408576698