Index: talk/app/webrtc/androidtests/src/org/webrtc/VideoCapturerAndroidTestFixtures.java |
diff --git a/talk/app/webrtc/androidtests/src/org/webrtc/VideoCapturerAndroidTestFixtures.java b/talk/app/webrtc/androidtests/src/org/webrtc/VideoCapturerAndroidTestFixtures.java |
index da450281aab5a38a3907532ca678419286f8fbd8..c05d2d598ddeecc469a4b966883aae2c59ff970f 100644 |
--- a/talk/app/webrtc/androidtests/src/org/webrtc/VideoCapturerAndroidTestFixtures.java |
+++ b/talk/app/webrtc/androidtests/src/org/webrtc/VideoCapturerAndroidTestFixtures.java |
@@ -43,16 +43,32 @@ public class VideoCapturerAndroidTestFixtures { |
static 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.width; |
magjed_webrtc
2015/11/25 13:38:28
Maybe use frame.rotatedWidth(), because you don't
perkj_webrtc
2015/11/25 20:56:20
Done.
|
+ height = frame.height; |
frameLock.notify(); |
} |
VideoRenderer.renderFrameDone(frame); |
} |
+ public int frameWidth() { |
+ synchronized (frameLock) { |
+ return width; |
+ } |
+ } |
+ |
+ public int frameHeight() { |
+ synchronized (frameLock) { |
+ return height; |
+ } |
+ } |
+ |
public int WaitForNextFrameToRender() throws InterruptedException { |
synchronized (frameLock) { |
frameLock.wait(); |
@@ -541,4 +557,47 @@ public class VideoCapturerAndroidTestFixtures { |
capturer.dispose(); |
assertTrue(capturer.isReleased()); |
} |
+ |
+ static public void scaleCameraOutput(VideoCapturerAndroid capturer) throws InterruptedException { |
+ PeerConnectionFactory factory = new PeerConnectionFactory(); |
+ VideoSource source = |
+ factory.createVideoSource(capturer, new MediaConstraints()); |
+ VideoTrack track = factory.createVideoTrack("dummy", source); |
+ RendererCallbacks renderer = new RendererCallbacks(); |
+ track.addRenderer(new VideoRenderer(renderer)); |
+ assertTrue(renderer.WaitForNextFrameToRender() > 0); |
+ |
+ final int startWidth = renderer.frameWidth(); |
+ final int startHeight = renderer.frameHeight(); |
+ final int frameRate = 30; |
+ final int scaledWidth = startWidth / 2; |
+ final int scaledHeight = startHeight / 2; |
+ |
+ // Request the captured frames to be scaled. |
+ capturer.onOutputFormatRequest(scaledWidth, scaledHeight, frameRate); |
+ |
+ boolean gotExpectedResolution = false; |
+ int numberOfInspectedFrames = 0; |
+ |
+ do { |
+ renderer.WaitForNextFrameToRender(); |
+ ++numberOfInspectedFrames; |
+ // Check the frame size. The actual width and height depend on how the capturer is mounted. |
+ final boolean identicalResolution = (renderer.frameWidth() == scaledWidth |
+ && renderer.frameHeight() == scaledHeight); |
+ final boolean flippedResolution = (renderer.frameWidth() == scaledHeight |
+ && renderer.frameHeight() == scaledWidth); |
+ |
+ gotExpectedResolution = identicalResolution || flippedResolution; |
+ } while (!gotExpectedResolution && numberOfInspectedFrames < 30); |
+ |
+ source.stop(); |
+ track.dispose(); |
+ source.dispose(); |
+ factory.dispose(); |
+ assertTrue(capturer.isReleased()); |
+ |
+ assertTrue(gotExpectedResolution); |
+ } |
+ |
} |