Chromium Code Reviews| Index: webrtc/sdk/android/instrumentationtests/src/org/webrtc/HardwareVideoDecoderTest.java |
| diff --git a/webrtc/sdk/android/instrumentationtests/src/org/webrtc/HardwareVideoDecoderTest.java b/webrtc/sdk/android/instrumentationtests/src/org/webrtc/HardwareVideoDecoderTest.java |
| index bb889de3dfd57bd4ccfb3458c3532c8308876e0a..8dc4ee98f5f3881147ef8b35880ed02f1ce830d2 100644 |
| --- a/webrtc/sdk/android/instrumentationtests/src/org/webrtc/HardwareVideoDecoderTest.java |
| +++ b/webrtc/sdk/android/instrumentationtests/src/org/webrtc/HardwareVideoDecoderTest.java |
| @@ -11,6 +11,8 @@ |
| package org.webrtc; |
| import static org.junit.Assert.assertEquals; |
| +import static org.junit.Assert.assertNotNull; |
| +import static org.junit.Assert.assertTrue; |
| import android.annotation.TargetApi; |
| import android.graphics.Matrix; |
| @@ -44,13 +46,39 @@ public final class HardwareVideoDecoderTest { |
| return; |
| } |
| - HardwareVideoDecoderFactory decoderFactory = new HardwareVideoDecoderFactory(); |
| + HardwareVideoDecoderFactory decoderFactory = new HardwareVideoDecoderFactory(null); |
| VideoDecoder decoder = decoderFactory.createDecoder(supportedCodecs[0].name); |
| assertEquals(decoder.initDecode(SETTINGS, null), VideoCodecStatus.OK); |
| assertEquals(decoder.release(), VideoCodecStatus.OK); |
| } |
| + @Test |
| + @MediumTest |
| + public void testInitializeUsingTextures() { |
| + HardwareVideoEncoderFactory encoderFactory = |
| + new HardwareVideoEncoderFactory(ENABLE_INTEL_VP8_ENCODER, ENABLE_H264_HIGH_PROFILE); |
| + VideoCodecInfo[] supportedCodecs = encoderFactory.getSupportedCodecs(); |
| + if (supportedCodecs.length == 0) { |
| + Log.i(TAG, "No hardware encoding support, skipping testInitialize"); |
| + return; |
| + } |
| + |
| + EglBase14 eglBase = new EglBase14(null, EglBase.CONFIG_PLAIN); |
| + SurfaceTextureHelper surfaceTextureHelper = |
| + SurfaceTextureHelper.create("texture-thread", eglBase.getEglBaseContext()); |
| + |
| + HardwareVideoDecoderFactory decoderFactory = |
| + new HardwareVideoDecoderFactory(surfaceTextureHelper); |
| + |
| + VideoDecoder decoder = decoderFactory.createDecoder(supportedCodecs[0].name); |
| + assertEquals(decoder.initDecode(SETTINGS, null), VideoCodecStatus.OK); |
| + assertEquals(decoder.release(), VideoCodecStatus.OK); |
| + |
| + surfaceTextureHelper.dispose(); |
| + eglBase.release(); |
| + } |
| + |
| @Test |
| @MediumTest |
| public void testDecode() throws InterruptedException { |
| @@ -63,7 +91,7 @@ public final class HardwareVideoDecoderTest { |
| } |
| // Set up the decoder. |
| - HardwareVideoDecoderFactory decoderFactory = new HardwareVideoDecoderFactory(); |
| + HardwareVideoDecoderFactory decoderFactory = new HardwareVideoDecoderFactory(null); |
| VideoDecoder decoder = decoderFactory.createDecoder(supportedCodecs[0].name); |
| final long presentationTimestampUs = 20000; |
| @@ -123,4 +151,90 @@ public final class HardwareVideoDecoderTest { |
| assertEquals(decoder.release(), VideoCodecStatus.OK); |
| assertEquals(encoder.release(), VideoCodecStatus.OK); |
| } |
| + |
| + @Test |
| + @MediumTest |
| + public void testDecodeUsingTextures() throws InterruptedException { |
| + HardwareVideoEncoderFactory encoderFactory = |
| + new HardwareVideoEncoderFactory(ENABLE_INTEL_VP8_ENCODER, ENABLE_H264_HIGH_PROFILE); |
| + VideoCodecInfo[] supportedCodecs = encoderFactory.getSupportedCodecs(); |
| + if (supportedCodecs.length == 0) { |
| + Log.i(TAG, "No hardware encoding support, skipping testEncodeYuvBuffer"); |
| + return; |
| + } |
| + |
| + // Set up the decoder. |
| + EglBase14 eglBase = new EglBase14(null, EglBase.CONFIG_PLAIN); |
| + SurfaceTextureHelper surfaceTextureHelper = |
| + SurfaceTextureHelper.create("texture-thread", eglBase.getEglBaseContext()); |
| + |
| + HardwareVideoDecoderFactory decoderFactory = |
| + new HardwareVideoDecoderFactory(surfaceTextureHelper); |
| + VideoDecoder decoder = decoderFactory.createDecoder(supportedCodecs[0].name); |
| + |
| + final long presentationTimestampUs = 20000; |
| + final int rotation = 270; |
| + |
| + final CountDownLatch decodeDone = new CountDownLatch(1); |
| + final AtomicReference<VideoFrame> decoded = new AtomicReference<>(); |
| + VideoDecoder.Callback decodeCallback = new VideoDecoder.Callback() { |
| + @Override |
| + public void onDecodedFrame(VideoFrame frame, Integer decodeTimeMs, Integer qp) { |
| + decoded.set(frame); |
|
sakal
2017/07/17 13:44:56
I think we should retain the frame here and releas
mellem
2017/07/17 21:57:15
Done.
|
| + decodeDone.countDown(); |
| + } |
| + }; |
| + assertEquals(decoder.initDecode(SETTINGS, decodeCallback), VideoCodecStatus.OK); |
| + |
| + // Set up an encoder to produce a valid encoded frame. |
| + VideoEncoder encoder = encoderFactory.createEncoder(supportedCodecs[0]); |
| + final CountDownLatch encodeDone = new CountDownLatch(1); |
| + final AtomicReference<EncodedImage> encoded = new AtomicReference<>(); |
| + VideoEncoder.Callback encodeCallback = new VideoEncoder.Callback() { |
| + @Override |
| + public void onEncodedFrame(EncodedImage image, VideoEncoder.CodecSpecificInfo info) { |
| + encoded.set(image); |
| + encodeDone.countDown(); |
| + } |
| + }; |
| + assertEquals( |
| + encoder.initEncode( |
| + new VideoEncoder.Settings(1, SETTINGS.width, SETTINGS.height, 300, 30), encodeCallback), |
| + VideoCodecStatus.OK); |
| + |
| + // First, encode a frame. |
| + VideoFrame.I420Buffer buffer = new I420BufferImpl(SETTINGS.width, SETTINGS.height); |
| + VideoFrame frame = |
| + new VideoFrame(buffer, rotation, presentationTimestampUs * 1000, new Matrix()); |
| + VideoEncoder.EncodeInfo info = new VideoEncoder.EncodeInfo( |
| + new EncodedImage.FrameType[] {EncodedImage.FrameType.VideoFrameKey}); |
| + |
| + assertEquals(encoder.encode(frame, info), VideoCodecStatus.OK); |
| + |
| + ThreadUtils.awaitUninterruptibly(encodeDone); |
| + |
| + // Now decode the frame. |
| + assertEquals( |
| + decoder.decode(encoded.get(), new VideoDecoder.DecodeInfo(false, 0)), VideoCodecStatus.OK); |
| + |
| + ThreadUtils.awaitUninterruptibly(decodeDone); |
| + |
| + frame = decoded.get(); |
| + assertEquals(frame.getRotation(), rotation); |
| + assertEquals(frame.getTimestampNs(), presentationTimestampUs * 1000); |
| + // TODO(mellem): Compare the matrix to whatever we expect to get back? |
| + assertNotNull(frame.getTransformMatrix()); |
| + assertEquals(frame.getWidth(), SETTINGS.width); |
| + assertEquals(frame.getHeight(), SETTINGS.height); |
| + |
| + assertTrue(frame.getBuffer() instanceof VideoFrame.TextureBuffer); |
| + VideoFrame.TextureBuffer textureBuffer = (VideoFrame.TextureBuffer) frame.getBuffer(); |
| + assertEquals(textureBuffer.getType(), VideoFrame.TextureBuffer.Type.OES); |
| + |
| + assertEquals(decoder.release(), VideoCodecStatus.OK); |
| + assertEquals(encoder.release(), VideoCodecStatus.OK); |
| + |
| + surfaceTextureHelper.dispose(); |
| + eglBase.release(); |
| + } |
| } |