Chromium Code Reviews| 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); |
| + } |
| + |
| } |