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..6c9d0b7b5c11e9cfa28d1c41a76154abdb3f548f 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,35 @@ 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); |
+ HardwareVideoDecoderFactory decoderFactory = |
+ new HardwareVideoDecoderFactory(eglBase.getEglBaseContext()); |
+ |
+ VideoDecoder decoder = decoderFactory.createDecoder(supportedCodecs[0].name); |
+ assertEquals(decoder.initDecode(SETTINGS, null), VideoCodecStatus.OK); |
+ assertEquals(decoder.release(), VideoCodecStatus.OK); |
+ |
+ eglBase.release(); |
+ } |
+ |
@Test |
@MediumTest |
public void testDecode() throws InterruptedException { |
@@ -63,7 +87,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; |
@@ -74,6 +98,7 @@ public final class HardwareVideoDecoderTest { |
VideoDecoder.Callback decodeCallback = new VideoDecoder.Callback() { |
@Override |
public void onDecodedFrame(VideoFrame frame, Integer decodeTimeMs, Integer qp) { |
+ frame.retain(); |
decoded.set(frame); |
decodeDone.countDown(); |
} |
@@ -97,7 +122,7 @@ public final class HardwareVideoDecoderTest { |
VideoCodecStatus.OK); |
// First, encode a frame. |
- VideoFrame.I420Buffer buffer = new I420BufferImpl(SETTINGS.width, SETTINGS.height); |
+ VideoFrame.I420Buffer buffer = I420BufferImpl.allocate(SETTINGS.width, SETTINGS.height); |
VideoFrame frame = |
new VideoFrame(buffer, rotation, presentationTimestampUs * 1000, new Matrix()); |
VideoEncoder.EncodeInfo info = new VideoEncoder.EncodeInfo( |
@@ -120,7 +145,92 @@ public final class HardwareVideoDecoderTest { |
assertEquals(frame.getWidth(), SETTINGS.width); |
assertEquals(frame.getHeight(), SETTINGS.height); |
+ frame.release(); |
+ 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); |
+ HardwareVideoDecoderFactory decoderFactory = |
+ new HardwareVideoDecoderFactory(eglBase.getEglBaseContext()); |
+ 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) { |
+ frame.retain(); |
+ decoded.set(frame); |
+ 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 = I420BufferImpl.allocate(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); |
+ |
+ frame.release(); |
+ eglBase.release(); |
} |
} |