Bug: b/148146536 Change-Id: I030c7c6c2a1a9d002bcc60f45c8d6025bd0935b8 Reviewed-on: https://webrtc-review.googlesource.com/c/src/+/167301 Reviewed-by: Sami Kalliomäki <sakal@webrtc.org> Reviewed-by: Magnus Jedvert <magjed@webrtc.org> Commit-Queue: Danil Chapovalov <danilchap@webrtc.org> Cr-Commit-Position: refs/heads/master@{#30751}
127 lines
4.6 KiB
Java
127 lines
4.6 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.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(
|
|
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(
|
|
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(
|
|
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(
|
|
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(
|
|
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();
|
|
}
|
|
}
|