This CL adds a way to extract the underlying android.opengl.EGLContext and javax.microedition.khronos.egl.EGLContext for EglBase14 and EglBase10 respectively. The reason is that clients can't be expected to use only WebRTC's OpenGL code and might need to integrate with their own GL code. Bug: None Change-Id: Ie00a564de45a090683542a52005da7e43c586ced Reviewed-on: https://webrtc-review.googlesource.com/c/src/+/127888 Commit-Queue: Magnus Jedvert <magjed@webrtc.org> Reviewed-by: Sami Kalliomäki <sakal@webrtc.org> Cr-Commit-Position: refs/heads/master@{#27205}
129 lines
4.7 KiB
Java
129 lines
4.7 KiB
Java
/*
|
|
* Copyright 2015 The WebRTC project authors. All Rights Reserved.
|
|
*
|
|
* Use of this source code is governed by a BSD-style license
|
|
* that can be found in the LICENSE file in the root of the source
|
|
* tree. An additional intellectual property rights grant can be found
|
|
* in the file PATENTS. All contributing project authors may
|
|
* be found in the AUTHORS file in the root of the source tree.
|
|
*/
|
|
|
|
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.opengl.GLES11Ext;
|
|
import android.opengl.GLES20;
|
|
import android.os.Build;
|
|
import android.support.test.filters.SmallTest;
|
|
import android.util.Log;
|
|
import java.nio.ByteBuffer;
|
|
import org.chromium.base.test.BaseJUnit4ClassRunner;
|
|
import org.junit.Test;
|
|
import org.junit.runner.RunWith;
|
|
import org.webrtc.MediaCodecVideoEncoder.OutputBufferInfo;
|
|
|
|
@TargetApi(Build.VERSION_CODES.ICE_CREAM_SANDWICH_MR1)
|
|
@RunWith(BaseJUnit4ClassRunner.class)
|
|
public class MediaCodecVideoEncoderTest {
|
|
final static String TAG = "MCVideoEncoderTest";
|
|
final static int profile = MediaCodecVideoEncoder.H264Profile.CONSTRAINED_BASELINE.getValue();
|
|
|
|
@Test
|
|
@SmallTest
|
|
public void testInitializeUsingByteBuffer() {
|
|
if (!MediaCodecVideoEncoder.isVp8HwSupported()) {
|
|
Log.i(TAG, "Hardware does not support VP8 encoding, skipping testInitReleaseUsingByteBuffer");
|
|
return;
|
|
}
|
|
MediaCodecVideoEncoder encoder = new MediaCodecVideoEncoder();
|
|
assertTrue(encoder.initEncode(MediaCodecVideoEncoder.VideoCodecType.VIDEO_CODEC_VP8, profile,
|
|
640, 480, 300, 30, /* useSurface= */ false));
|
|
encoder.release();
|
|
}
|
|
|
|
@Test
|
|
@SmallTest
|
|
public void testInitilizeUsingTextures() {
|
|
if (!MediaCodecVideoEncoder.isVp8HwSupportedUsingTextures()) {
|
|
Log.i(TAG, "hardware does not support VP8 encoding, skipping testEncoderUsingTextures");
|
|
return;
|
|
}
|
|
EglBase14 eglBase = EglBase.createEgl14(EglBase.CONFIG_PLAIN);
|
|
MediaCodecVideoEncoder.setEglContext(eglBase.getEglBaseContext());
|
|
MediaCodecVideoEncoder encoder = new MediaCodecVideoEncoder();
|
|
assertTrue(encoder.initEncode(MediaCodecVideoEncoder.VideoCodecType.VIDEO_CODEC_VP8, profile,
|
|
640, 480, 300, 30, /* useSurface= */ true));
|
|
encoder.release();
|
|
MediaCodecVideoEncoder.disposeEglContext();
|
|
eglBase.release();
|
|
}
|
|
|
|
@Test
|
|
@SmallTest
|
|
public void testInitializeUsingByteBufferReInitilizeUsingTextures() {
|
|
if (!MediaCodecVideoEncoder.isVp8HwSupportedUsingTextures()) {
|
|
Log.i(TAG, "hardware does not support VP8 encoding, skipping testEncoderUsingTextures");
|
|
return;
|
|
}
|
|
MediaCodecVideoEncoder encoder = new MediaCodecVideoEncoder();
|
|
assertTrue(encoder.initEncode(MediaCodecVideoEncoder.VideoCodecType.VIDEO_CODEC_VP8, profile,
|
|
640, 480, 300, 30, /* useSurface= */ false));
|
|
encoder.release();
|
|
EglBase14 eglBase = EglBase.createEgl14(EglBase.CONFIG_PLAIN);
|
|
MediaCodecVideoEncoder.setEglContext(eglBase.getEglBaseContext());
|
|
assertTrue(encoder.initEncode(MediaCodecVideoEncoder.VideoCodecType.VIDEO_CODEC_VP8, profile,
|
|
640, 480, 300, 30, /* useSurface= */ true));
|
|
encoder.release();
|
|
MediaCodecVideoEncoder.disposeEglContext();
|
|
eglBase.release();
|
|
}
|
|
|
|
@Test
|
|
@SmallTest
|
|
public void testEncoderUsingByteBuffer() throws InterruptedException {
|
|
if (!MediaCodecVideoEncoder.isVp8HwSupported()) {
|
|
Log.i(TAG, "Hardware does not support VP8 encoding, skipping testEncoderUsingByteBuffer");
|
|
return;
|
|
}
|
|
|
|
final int width = 640;
|
|
final int height = 480;
|
|
final int min_size = width * height * 3 / 2;
|
|
final long presentationTimestampUs = 2;
|
|
|
|
MediaCodecVideoEncoder encoder = new MediaCodecVideoEncoder();
|
|
|
|
assertTrue(encoder.initEncode(MediaCodecVideoEncoder.VideoCodecType.VIDEO_CODEC_VP8, profile,
|
|
width, height, 300, 30, /* useSurface= */ false));
|
|
ByteBuffer[] inputBuffers = encoder.getInputBuffers();
|
|
assertNotNull(inputBuffers);
|
|
assertTrue(min_size <= inputBuffers[0].capacity());
|
|
|
|
int bufferIndex;
|
|
do {
|
|
Thread.sleep(10);
|
|
bufferIndex = encoder.dequeueInputBuffer();
|
|
} while (bufferIndex == -1); // |-1| is returned when there is no buffer available yet.
|
|
|
|
assertTrue(bufferIndex >= 0);
|
|
assertTrue(bufferIndex < inputBuffers.length);
|
|
assertTrue(encoder.encodeBuffer(true, bufferIndex, min_size, presentationTimestampUs));
|
|
|
|
OutputBufferInfo info;
|
|
do {
|
|
info = encoder.dequeueOutputBuffer();
|
|
Thread.sleep(10);
|
|
} while (info == null);
|
|
assertTrue(info.index >= 0);
|
|
assertEquals(presentationTimestampUs, info.presentationTimestampUs);
|
|
assertTrue(info.buffer.capacity() > 0);
|
|
encoder.releaseOutputBuffer(info.index);
|
|
|
|
encoder.release();
|
|
}
|
|
}
|