OLD | NEW |
---|---|
1 /* | 1 /* |
2 * Copyright 2017 The WebRTC project authors. All Rights Reserved. | 2 * Copyright 2017 The WebRTC project authors. All Rights Reserved. |
3 * | 3 * |
4 * Use of this source code is governed by a BSD-style license | 4 * Use of this source code is governed by a BSD-style license |
5 * that can be found in the LICENSE file in the root of the source | 5 * that can be found in the LICENSE file in the root of the source |
6 * tree. An additional intellectual property rights grant can be found | 6 * tree. An additional intellectual property rights grant can be found |
7 * in the file PATENTS. All contributing project authors may | 7 * in the file PATENTS. All contributing project authors may |
8 * be found in the AUTHORS file in the root of the source tree. | 8 * be found in the AUTHORS file in the root of the source tree. |
9 */ | 9 */ |
10 | 10 |
11 package org.webrtc; | 11 package org.webrtc; |
12 | 12 |
13 import static org.junit.Assert.assertEquals; | 13 import static org.junit.Assert.assertEquals; |
14 import static org.junit.Assert.assertTrue; | 14 import static org.junit.Assert.assertTrue; |
15 | 15 |
16 import android.annotation.TargetApi; | 16 import android.annotation.TargetApi; |
17 import android.graphics.Matrix; | 17 import android.graphics.Matrix; |
18 import android.opengl.GLES11Ext; | |
19 import android.opengl.GLES20; | |
18 import android.support.test.filters.SmallTest; | 20 import android.support.test.filters.SmallTest; |
19 import android.util.Log; | 21 import android.util.Log; |
20 import java.nio.ByteBuffer; | 22 import java.nio.ByteBuffer; |
21 import java.util.concurrent.CountDownLatch; | 23 import java.util.concurrent.CountDownLatch; |
22 import org.chromium.base.test.BaseJUnit4ClassRunner; | 24 import org.chromium.base.test.BaseJUnit4ClassRunner; |
23 import org.junit.Test; | 25 import org.junit.Test; |
24 import org.junit.runner.RunWith; | 26 import org.junit.runner.RunWith; |
25 | 27 |
26 @TargetApi(16) | 28 @TargetApi(16) |
27 @RunWith(BaseJUnit4ClassRunner.class) | 29 @RunWith(BaseJUnit4ClassRunner.class) |
28 public class HardwareVideoEncoderTest { | 30 public class HardwareVideoEncoderTest { |
29 final static String TAG = "MediaCodecVideoEncoderTest"; | 31 final static String TAG = "MediaCodecVideoEncoderTest"; |
30 | 32 |
31 private static final boolean ENABLE_INTEL_VP8_ENCODER = true; | 33 private static final boolean ENABLE_INTEL_VP8_ENCODER = true; |
32 private static final boolean ENABLE_H264_HIGH_PROFILE = true; | 34 private static final boolean ENABLE_H264_HIGH_PROFILE = true; |
33 private static final VideoEncoder.Settings SETTINGS = new VideoEncoder.Setting s( | 35 private static final VideoEncoder.Settings SETTINGS = new VideoEncoder.Setting s( |
34 1 /* core */, 640 /* width */, 480 /* height */, 300 /* kbps */, 30 /* fps */); | 36 1 /* core */, 640 /* width */, 480 /* height */, 300 /* kbps */, 30 /* fps */); |
35 | 37 |
36 @Test | 38 @Test |
37 @SmallTest | 39 @SmallTest |
38 public void testInitializeUsingYuvBuffer() { | 40 public void testInitializeUsingYuvBuffer() { |
39 HardwareVideoEncoderFactory factory = | 41 HardwareVideoEncoderFactory factory = |
40 new HardwareVideoEncoderFactory(ENABLE_INTEL_VP8_ENCODER, ENABLE_H264_HI GH_PROFILE); | 42 new HardwareVideoEncoderFactory(ENABLE_INTEL_VP8_ENCODER, ENABLE_H264_HI GH_PROFILE); |
41 VideoCodecInfo[] supportedCodecs = factory.getSupportedCodecs(); | 43 VideoCodecInfo[] supportedCodecs = factory.getSupportedCodecs(); |
42 if (supportedCodecs.length == 0) { | 44 if (supportedCodecs.length == 0) { |
43 Log.w(TAG, "No hardware encoding support, skipping testInitializeUsingYuvB uffer"); | 45 Log.w(TAG, "No hardware encoding support, skipping testInitializeUsingYuvB uffer"); |
44 return; | 46 return; |
45 } | 47 } |
46 VideoEncoder encoder = factory.createEncoder(supportedCodecs[0]); | 48 VideoEncoder encoder = factory.createEncoder(supportedCodecs[0]); |
47 assertEquals(encoder.initEncode(SETTINGS, null), VideoCodecStatus.OK); | 49 assertEquals(VideoCodecStatus.OK, encoder.initEncode(SETTINGS, null)); |
48 assertEquals(encoder.release(), VideoCodecStatus.OK); | 50 assertEquals(VideoCodecStatus.OK, encoder.release()); |
49 } | 51 } |
50 | 52 |
51 @Test | 53 @Test |
54 @SmallTest | |
55 public void testInitializeUsingTextures() { | |
56 EglBase14 eglBase = new EglBase14(null, EglBase.CONFIG_PLAIN); | |
57 HardwareVideoEncoderFactory factory = new HardwareVideoEncoderFactory( | |
58 eglBase.getEglBaseContext(), ENABLE_INTEL_VP8_ENCODER, ENABLE_H264_HIGH_ PROFILE); | |
59 VideoCodecInfo[] supportedCodecs = factory.getSupportedCodecs(); | |
60 if (supportedCodecs.length == 0) { | |
61 Log.w(TAG, "No hardware encoding support, skipping testInitializeUsingText ures"); | |
62 return; | |
63 } | |
64 VideoEncoder encoder = factory.createEncoder(supportedCodecs[0]); | |
65 assertEquals(VideoCodecStatus.OK, encoder.initEncode(SETTINGS, null)); | |
66 assertEquals(VideoCodecStatus.OK, encoder.release()); | |
67 eglBase.release(); | |
68 } | |
69 | |
70 @Test | |
52 @SmallTest | 71 @SmallTest |
53 public void testEncodeYuvBuffer() throws InterruptedException { | 72 public void testEncodeYuvBuffer() throws InterruptedException { |
54 HardwareVideoEncoderFactory factory = | 73 HardwareVideoEncoderFactory factory = |
55 new HardwareVideoEncoderFactory(ENABLE_INTEL_VP8_ENCODER, ENABLE_H264_HI GH_PROFILE); | 74 new HardwareVideoEncoderFactory(ENABLE_INTEL_VP8_ENCODER, ENABLE_H264_HI GH_PROFILE); |
56 VideoCodecInfo[] supportedCodecs = factory.getSupportedCodecs(); | 75 VideoCodecInfo[] supportedCodecs = factory.getSupportedCodecs(); |
57 if (supportedCodecs.length == 0) { | 76 if (supportedCodecs.length == 0) { |
58 Log.w(TAG, "No hardware encoding support, skipping testEncodeYuvBuffer"); | 77 Log.w(TAG, "No hardware encoding support, skipping testEncodeYuvBuffer"); |
59 return; | 78 return; |
60 } | 79 } |
61 | 80 |
(...skipping 24 matching lines...) Expand all Loading... | |
86 new VideoFrame(buffer, 0 /* rotation */, presentationTimestampUs * 1000, new Matrix()); | 105 new VideoFrame(buffer, 0 /* rotation */, presentationTimestampUs * 1000, new Matrix()); |
87 VideoEncoder.EncodeInfo info = new VideoEncoder.EncodeInfo( | 106 VideoEncoder.EncodeInfo info = new VideoEncoder.EncodeInfo( |
88 new EncodedImage.FrameType[] {EncodedImage.FrameType.VideoFrameKey}); | 107 new EncodedImage.FrameType[] {EncodedImage.FrameType.VideoFrameKey}); |
89 | 108 |
90 assertEquals(encoder.encode(frame, info), VideoCodecStatus.OK); | 109 assertEquals(encoder.encode(frame, info), VideoCodecStatus.OK); |
91 | 110 |
92 ThreadUtils.awaitUninterruptibly(encodeDone); | 111 ThreadUtils.awaitUninterruptibly(encodeDone); |
93 | 112 |
94 assertEquals(encoder.release(), VideoCodecStatus.OK); | 113 assertEquals(encoder.release(), VideoCodecStatus.OK); |
95 } | 114 } |
115 | |
116 @Test | |
117 @SmallTest | |
118 public void testEncodeTextures() throws InterruptedException { | |
119 final EglBase14 eglOesBase = new EglBase14(null, EglBase.CONFIG_PIXEL_BUFFER ); | |
120 HardwareVideoEncoderFactory factory = new HardwareVideoEncoderFactory( | |
121 eglOesBase.getEglBaseContext(), ENABLE_INTEL_VP8_ENCODER, ENABLE_H264_HI GH_PROFILE); | |
122 VideoCodecInfo[] supportedCodecs = factory.getSupportedCodecs(); | |
123 if (supportedCodecs.length == 0) { | |
124 Log.w(TAG, "No hardware encoding support, skipping testEncodeYuvBuffer"); | |
sakal
2017/07/18 08:46:13
testEncodeYuvBuffer -> testEncodeTextures
mellem
2017/07/18 17:11:57
Done.
| |
125 return; | |
126 } | |
127 | |
128 eglOesBase.createDummyPbufferSurface(); | |
129 eglOesBase.makeCurrent(); | |
130 final int oesTextureId = GlUtil.generateTexture(GLES11Ext.GL_TEXTURE_EXTERNA L_OES); | |
131 | |
132 VideoEncoder encoder = factory.createEncoder(supportedCodecs[0]); | |
133 | |
134 final long presentationTimestampUs = 20000; | |
135 final CountDownLatch encodeDone = new CountDownLatch(1); | |
136 | |
137 VideoEncoder.Callback callback = new VideoEncoder.Callback() { | |
138 @Override | |
139 public void onEncodedFrame(EncodedImage image, VideoEncoder.CodecSpecificI nfo info) { | |
140 assertTrue(image.buffer.capacity() > 0); | |
141 assertEquals(image.encodedWidth, SETTINGS.width); | |
142 assertEquals(image.encodedHeight, SETTINGS.height); | |
143 assertEquals(image.captureTimeMs, presentationTimestampUs / 1000); | |
144 assertEquals(image.frameType, EncodedImage.FrameType.VideoFrameKey); | |
145 assertEquals(image.rotation, 0); | |
146 assertTrue(image.completeFrame); | |
147 | |
148 encodeDone.countDown(); | |
149 } | |
150 }; | |
151 | |
152 assertEquals(encoder.initEncode(SETTINGS, callback), VideoCodecStatus.OK); | |
153 | |
154 VideoFrame.TextureBuffer buffer = new VideoFrame.TextureBuffer() { | |
155 @Override | |
156 public VideoFrame.TextureBuffer.Type getType() { | |
157 return VideoFrame.TextureBuffer.Type.OES; | |
158 } | |
159 | |
160 @Override | |
161 public int getTextureId() { | |
162 return oesTextureId; | |
163 } | |
164 | |
165 @Override | |
166 public int getWidth() { | |
167 return SETTINGS.width; | |
168 } | |
169 | |
170 @Override | |
171 public int getHeight() { | |
172 return SETTINGS.height; | |
173 } | |
174 | |
175 @Override | |
176 public VideoFrame.I420Buffer toI420() { | |
177 return null; | |
178 } | |
179 | |
180 @Override | |
181 public void retain() {} | |
182 | |
183 @Override | |
184 public void release() {} | |
185 }; | |
186 VideoFrame frame = | |
187 new VideoFrame(buffer, 0 /* rotation */, presentationTimestampUs * 1000, new Matrix()); | |
188 VideoEncoder.EncodeInfo info = new VideoEncoder.EncodeInfo( | |
189 new EncodedImage.FrameType[] {EncodedImage.FrameType.VideoFrameKey}); | |
190 | |
191 assertEquals(encoder.encode(frame, info), VideoCodecStatus.OK); | |
192 GlUtil.checkNoGLES2Error("encodeTexture"); | |
193 | |
194 // It should be Ok to delete the texture after calling encodeTexture. | |
195 GLES20.glDeleteTextures(1, new int[] {oesTextureId}, 0); | |
196 | |
197 ThreadUtils.awaitUninterruptibly(encodeDone); | |
198 | |
199 assertEquals(encoder.release(), VideoCodecStatus.OK); | |
200 eglOesBase.release(); | |
201 } | |
96 } | 202 } |
OLD | NEW |