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(); |
+ } |
} |