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

Unified Diff: talk/app/webrtc/androidtests/src/org/webrtc/VideoCapturerAndroidTestFixtures.java

Issue 1383413002: Add support to Capture to a texture in VideoCapturerAndroid (Closed) Base URL: https://chromium.googlesource.com/external/webrtc.git@master
Patch Set: Removed @Supress since its not supported by bots. Created 5 years, 2 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: talk/app/webrtc/androidtests/src/org/webrtc/VideoCapturerAndroidTestFixtures.java
diff --git a/talk/app/webrtc/androidtests/src/org/webrtc/VideoCapturerAndroidTest.java b/talk/app/webrtc/androidtests/src/org/webrtc/VideoCapturerAndroidTestFixtures.java
similarity index 62%
copy from talk/app/webrtc/androidtests/src/org/webrtc/VideoCapturerAndroidTest.java
copy to talk/app/webrtc/androidtests/src/org/webrtc/VideoCapturerAndroidTestFixtures.java
index 0fe827d1f9c658151dd05cb10edf0106e218700d..7e24f8c0dc0c1f4ffe64febfd913822cb7a4e121 100644
--- a/talk/app/webrtc/androidtests/src/org/webrtc/VideoCapturerAndroidTest.java
+++ b/talk/app/webrtc/androidtests/src/org/webrtc/VideoCapturerAndroidTestFixtures.java
@@ -26,23 +26,19 @@
*/
package org.webrtc;
+import android.content.Context;
import android.hardware.Camera;
-import android.test.ActivityTestCase;
-import android.test.suitebuilder.annotation.SmallTest;
-import android.test.suitebuilder.annotation.MediumTest;
-import android.util.Size;
import org.webrtc.CameraEnumerationAndroid.CaptureFormat;
import org.webrtc.VideoRenderer.I420Frame;
import java.util.ArrayList;
-import java.util.HashSet;
import java.util.List;
-import java.util.Set;
import java.util.concurrent.CountDownLatch;
-@SuppressWarnings("deprecation")
-public class VideoCapturerAndroidTest extends ActivityTestCase {
+import static junit.framework.Assert.*;
+
+public class VideoCapturerAndroidTestFixtures {
static class RendererCallbacks implements VideoRenderer.Callbacks {
private int framesRendered = 0;
private Object frameLock = 0;
@@ -90,13 +86,15 @@ public class VideoCapturerAndroidTest extends ActivityTestCase {
VideoCapturerAndroid.CapturerObserver {
private int framesCaptured = 0;
private int frameSize = 0;
+ private int frameWidth = 0;
+ private int frameHeight = 0;
private Object frameLock = 0;
private Object capturerStartLock = 0;
private boolean captureStartResult = false;
private List<Long> timestamps = new ArrayList<Long>();
@Override
- public void OnCapturerStarted(boolean success) {
+ public void onCapturerStarted(boolean success) {
synchronized (capturerStartLock) {
captureStartResult = success;
capturerStartLock.notify();
@@ -104,18 +102,32 @@ public class VideoCapturerAndroidTest extends ActivityTestCase {
}
@Override
- public void OnFrameCaptured(byte[] frame, int length, int width, int height,
+ public void onByteBufferFrameCaptured(byte[] frame, int length, int width, int height,
int rotation, long timeStamp) {
synchronized (frameLock) {
++framesCaptured;
frameSize = length;
+ frameWidth = width;
+ frameHeight = height;
+ timestamps.add(timeStamp);
+ frameLock.notify();
+ }
+ }
+ @Override
+ public void onTextureFrameCaptured(
+ int width, int height, int oesTextureId, float[] transformMatrix, long timeStamp) {
+ synchronized (frameLock) {
+ ++framesCaptured;
+ frameWidth = width;
+ frameHeight = height;
+ frameSize = 0;
timestamps.add(timeStamp);
frameLock.notify();
}
}
@Override
- public void OnOutputFormatRequest(int width, int height, int fps) {}
+ public void onOutputFormatRequest(int width, int height, int fps) {}
public boolean WaitForCapturerToStart() throws InterruptedException {
synchronized (capturerStartLock) {
@@ -137,6 +149,18 @@ public class VideoCapturerAndroidTest extends ActivityTestCase {
}
}
+ int frameWidth() {
+ synchronized (frameLock) {
+ return frameWidth;
+ }
+ }
+
+ int frameHeight() {
+ synchronized (frameLock) {
+ return frameHeight;
+ }
+ }
+
List<Long> getCopyAndResetListOftimeStamps() {
synchronized (frameLock) {
ArrayList<Long> list = new ArrayList<Long>(timestamps);
@@ -148,14 +172,19 @@ public class VideoCapturerAndroidTest extends ActivityTestCase {
// Return true if the device under test have at least two cameras.
@SuppressWarnings("deprecation")
- boolean HaveTwoCameras() {
+ static public boolean HaveTwoCameras() {
return (Camera.getNumberOfCameras() >= 2);
}
- void startCapturerAndRender(String deviceName) throws InterruptedException {
+ static public void release(VideoCapturerAndroid capturer) {
+ assertNotNull(capturer);
+ capturer.dispose();
+ assertTrue(capturer.isReleased());
+ }
+
+ static public void startCapturerAndRender(VideoCapturerAndroid capturer)
+ throws InterruptedException {
PeerConnectionFactory factory = new PeerConnectionFactory();
- VideoCapturerAndroid capturer =
- VideoCapturerAndroid.create(deviceName, null);
VideoSource source =
factory.createVideoSource(capturer, new MediaConstraints());
VideoTrack track = factory.createVideoTrack("dummy", source);
@@ -168,92 +197,8 @@ public class VideoCapturerAndroidTest extends ActivityTestCase {
assertTrue(capturer.isReleased());
}
- @Override
- protected void setUp() {
- assertTrue(PeerConnectionFactory.initializeAndroidGlobals(
- getInstrumentation().getContext(), true, true, true));
- }
-
- @SmallTest
- // Test that enumerating formats using android.hardware.camera2 will give the same formats as
- // android.hardware.camera in the range 320x240 to 1280x720. Often the camera2 API may contain
- // some high resolutions that are not supported in camera1, but it may also be the other way
- // around in some cases. Supported framerates may also differ, so don't compare those.
- public void testCamera2Enumerator() {
- if (!Camera2Enumerator.isSupported()) {
- return;
- }
- final CameraEnumerationAndroid.Enumerator camera1Enumerator = new CameraEnumerator();
- final CameraEnumerationAndroid.Enumerator camera2Enumerator =
- new Camera2Enumerator(getInstrumentation().getContext());
-
- for (int i = 0; i < CameraEnumerationAndroid.getDeviceCount(); ++i) {
- final Set<Size> resolutions1 = new HashSet<Size>();
- for (CaptureFormat format : camera1Enumerator.getSupportedFormats(i)) {
- resolutions1.add(new Size(format.width, format.height));
- }
- final Set<Size> resolutions2 = new HashSet<Size>();
- for (CaptureFormat format : camera2Enumerator.getSupportedFormats(i)) {
- resolutions2.add(new Size(format.width, format.height));
- }
- for (Size size : resolutions1) {
- if (size.getWidth() >= 320 && size.getHeight() >= 240
- && size.getWidth() <= 1280 && size.getHeight() <= 720) {
- assertTrue(resolutions2.contains(size));
- }
- }
- }
- }
-
- @SmallTest
- public void testCreateAndRelease() throws Exception {
- VideoCapturerAndroid capturer = VideoCapturerAndroid.create("", null);
- assertNotNull(capturer);
- capturer.dispose();
- assertTrue(capturer.isReleased());
- }
-
- @SmallTest
- public void testCreateNonExistingCamera() throws Exception {
- VideoCapturerAndroid capturer = VideoCapturerAndroid.create(
- "non-existing camera", null);
- assertNull(capturer);
- }
-
- @SmallTest
- // This test that the camera can be started and that the frames are forwarded
- // to a Java video renderer using a "default" capturer.
- // It tests both the Java and the C++ layer.
- public void testStartVideoCapturer() throws Exception {
- startCapturerAndRender("");
- }
-
- @SmallTest
- // This test that the camera can be started and that the frames are forwarded
- // to a Java video renderer using the front facing video capturer.
- // It tests both the Java and the C++ layer.
- public void testStartFrontFacingVideoCapturer() throws Exception {
- startCapturerAndRender(CameraEnumerationAndroid.getNameOfFrontFacingDevice());
- }
-
- @SmallTest
- // This test that the camera can be started and that the frames are forwarded
- // to a Java video renderer using the back facing video capturer.
- // It tests both the Java and the C++ layer.
- public void testStartBackFacingVideoCapturer() throws Exception {
- if (!HaveTwoCameras()) {
- return;
- }
- startCapturerAndRender(CameraEnumerationAndroid.getNameOfBackFacingDevice());
- }
-
- @SmallTest
- // This test that the default camera can be started and that the camera can
- // later be switched to another camera.
- // It tests both the Java and the C++ layer.
- public void testSwitchVideoCapturer() throws Exception {
+ static public void switchCamera(VideoCapturerAndroid capturer) throws InterruptedException {
PeerConnectionFactory factory = new PeerConnectionFactory();
- VideoCapturerAndroid capturer = VideoCapturerAndroid.create("", null);
VideoSource source =
factory.createVideoSource(capturer, new MediaConstraints());
VideoTrack track = factory.createVideoTrack("dummy", source);
@@ -292,17 +237,14 @@ public class VideoCapturerAndroidTest extends ActivityTestCase {
assertTrue(capturer.isReleased());
}
- @MediumTest
- // Test what happens when attempting to call e.g. switchCamera() after camera has been stopped.
- public void testCameraCallsAfterStop() throws InterruptedException {
- final String deviceName = CameraEnumerationAndroid.getDeviceName(0);
- final VideoCapturerAndroid capturer = VideoCapturerAndroid.create(deviceName, null);
- final List<CaptureFormat> formats = CameraEnumerationAndroid.getSupportedFormats(0);
+ static public void cameraCallsAfterStop(
+ VideoCapturerAndroid capturer, Context appContext) throws InterruptedException {
+ final List<CaptureFormat> formats = capturer.getSupportedFormats();
final CameraEnumerationAndroid.CaptureFormat format = formats.get(0);
final FakeCapturerObserver observer = new FakeCapturerObserver();
capturer.startCapture(format.width, format.height, format.maxFramerate,
- getInstrumentation().getContext(), observer);
+ appContext, observer);
// Make sure camera is started and then stop it.
assertTrue(observer.WaitForCapturerToStart());
capturer.stopCapture();
@@ -318,12 +260,9 @@ public class VideoCapturerAndroidTest extends ActivityTestCase {
assertTrue(capturer.isReleased());
}
- @SmallTest
- // This test that the VideoSource that the VideoCapturer is connected to can
- // be stopped and restarted. It tests both the Java and the C++ layer.
- public void testStopRestartVideoSource() throws Exception {
+ static public void stopRestartVideoSource(VideoCapturerAndroid capturer)
+ throws InterruptedException {
PeerConnectionFactory factory = new PeerConnectionFactory();
- VideoCapturerAndroid capturer = VideoCapturerAndroid.create("", null);
VideoSource source =
factory.createVideoSource(capturer, new MediaConstraints());
VideoTrack track = factory.createVideoTrack("dummy", source);
@@ -344,25 +283,34 @@ public class VideoCapturerAndroidTest extends ActivityTestCase {
assertTrue(capturer.isReleased());
}
- @SmallTest
- // This test that the camera can be started at different resolutions.
- // It does not test or use the C++ layer.
- public void testStartStopWithDifferentResolutions() throws Exception {
+ static public void startStopWithDifferentResolutions(VideoCapturerAndroid capturer,
+ Context appContext) throws InterruptedException {
FakeCapturerObserver observer = new FakeCapturerObserver();
-
- String deviceName = CameraEnumerationAndroid.getDeviceName(0);
- List<CaptureFormat> formats = CameraEnumerationAndroid.getSupportedFormats(0);
- VideoCapturerAndroid capturer =
- VideoCapturerAndroid.create(deviceName, null);
+ List<CaptureFormat> formats = capturer.getSupportedFormats();
for(int i = 0; i < 3 ; ++i) {
CameraEnumerationAndroid.CaptureFormat format = formats.get(i);
capturer.startCapture(format.width, format.height, format.maxFramerate,
- getInstrumentation().getContext(), observer);
+ appContext, observer);
assertTrue(observer.WaitForCapturerToStart());
observer.WaitForNextCapturedFrame();
- // Check the frame size.
- assertEquals(format.frameSize(), observer.frameSize());
+
+ // Check the frame size. The actual width and height depend on how the capturer is mounted.
+ final boolean identicalResolution = (observer.frameWidth() == format.width
+ && observer.frameHeight() == format.height);
+ final boolean flippedResolution = (observer.frameWidth() == format.height
+ && observer.frameHeight() == format.width);
+ if (!identicalResolution && !flippedResolution) {
+ fail("Wrong resolution, got: " + observer.frameWidth() + "x" + observer.frameHeight()
+ + " expected: " + format.width + "x" + format.height + " or " + format.height + "x"
+ + format.width);
+ }
+
+ if (capturer.isCapturingToTexture()) {
+ assertEquals(0, observer.frameSize());
+ } else {
+ assertEquals(format.frameSize(), observer.frameSize());
+ }
capturer.stopCapture();
for (long timestamp : observer.getCopyAndResetListOftimeStamps()) {
capturer.returnBuffer(timestamp);
@@ -372,20 +320,14 @@ public class VideoCapturerAndroidTest extends ActivityTestCase {
assertTrue(capturer.isReleased());
}
- @SmallTest
- // This test what happens if buffers are returned after the capturer have
- // been stopped and restarted. It does not test or use the C++ layer.
- public void testReturnBufferLate() throws Exception {
+ static public void returnBufferLate(VideoCapturerAndroid capturer,
+ Context appContext) throws InterruptedException {
FakeCapturerObserver observer = new FakeCapturerObserver();
- String deviceName = CameraEnumerationAndroid.getDeviceName(0);
- List<CaptureFormat> formats = CameraEnumerationAndroid.getSupportedFormats(0);
- VideoCapturerAndroid capturer =
- VideoCapturerAndroid.create(deviceName, null);
-
+ List<CaptureFormat> formats = capturer.getSupportedFormats();
CameraEnumerationAndroid.CaptureFormat format = formats.get(0);
capturer.startCapture(format.width, format.height, format.maxFramerate,
- getInstrumentation().getContext(), observer);
+ appContext, observer);
assertTrue(observer.WaitForCapturerToStart());
observer.WaitForNextCapturedFrame();
@@ -395,9 +337,8 @@ public class VideoCapturerAndroidTest extends ActivityTestCase {
format = formats.get(1);
capturer.startCapture(format.width, format.height, format.maxFramerate,
- getInstrumentation().getContext(), observer);
+ appContext, observer);
observer.WaitForCapturerToStart();
- observer.WaitForNextCapturedFrame();
for (Long timeStamp : listOftimestamps) {
capturer.returnBuffer(timeStamp);
@@ -407,7 +348,7 @@ public class VideoCapturerAndroidTest extends ActivityTestCase {
capturer.stopCapture();
listOftimestamps = observer.getCopyAndResetListOftimeStamps();
- assertTrue(listOftimestamps.size() >= 2);
+ assertTrue(listOftimestamps.size() >= 1);
for (Long timeStamp : listOftimestamps) {
capturer.returnBuffer(timeStamp);
}
@@ -415,12 +356,8 @@ public class VideoCapturerAndroidTest extends ActivityTestCase {
assertTrue(capturer.isReleased());
}
- @MediumTest
- // This test that we can capture frames, keep the frames in a local renderer, stop capturing,
- // and then return the frames. The difference between the test testReturnBufferLate() is that we
- // also test the JNI and C++ AndroidVideoCapturer parts.
- public void testReturnBufferLateEndToEnd() throws InterruptedException {
- final VideoCapturerAndroid capturer = VideoCapturerAndroid.create("", null);
+ static public void returnBufferLateEndToEnd(VideoCapturerAndroid capturer)
+ throws InterruptedException {
final PeerConnectionFactory factory = new PeerConnectionFactory();
final VideoSource source = factory.createVideoSource(capturer, new MediaConstraints());
final VideoTrack track = factory.createVideoTrack("dummy", source);

Powered by Google App Engine
This is Rietveld 408576698