diff --git a/extensions/vp9/src/androidTest/java/com/google/android/exoplayer2/ext/vp9/VpxPlaybackTest.java b/extensions/vp9/src/androidTest/java/com/google/android/exoplayer2/ext/vp9/VpxPlaybackTest.java index d4e0795293..ff5d60a74a 100644 --- a/extensions/vp9/src/androidTest/java/com/google/android/exoplayer2/ext/vp9/VpxPlaybackTest.java +++ b/extensions/vp9/src/androidTest/java/com/google/android/exoplayer2/ext/vp9/VpxPlaybackTest.java @@ -31,6 +31,7 @@ import com.google.android.exoplayer2.source.MediaSource; import com.google.android.exoplayer2.source.ProgressiveMediaSource; import com.google.android.exoplayer2.upstream.DefaultDataSourceFactory; import com.google.android.exoplayer2.util.Log; +import com.google.android.exoplayer2.video.VideoDecoderSurfaceView; import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; @@ -122,7 +123,7 @@ public class VpxPlaybackTest { player .createMessage(videoRenderer) .setType(LibvpxVideoRenderer.MSG_SET_OUTPUT_BUFFER_RENDERER) - .setPayload(new VpxVideoSurfaceView(context)) + .setPayload(new VideoDecoderSurfaceView(context)) .send(); player.prepare(mediaSource); player.setPlayWhenReady(true); diff --git a/extensions/vp9/src/main/java/com/google/android/exoplayer2/ext/vp9/LibvpxVideoRenderer.java b/extensions/vp9/src/main/java/com/google/android/exoplayer2/ext/vp9/LibvpxVideoRenderer.java index 13f020031c..79d1d2e66f 100644 --- a/extensions/vp9/src/main/java/com/google/android/exoplayer2/ext/vp9/LibvpxVideoRenderer.java +++ b/extensions/vp9/src/main/java/com/google/android/exoplayer2/ext/vp9/LibvpxVideoRenderer.java @@ -35,6 +35,7 @@ import com.google.android.exoplayer2.video.SimpleDecoderVideoRenderer; import com.google.android.exoplayer2.video.VideoDecoderException; import com.google.android.exoplayer2.video.VideoDecoderInputBuffer; import com.google.android.exoplayer2.video.VideoDecoderOutputBuffer; +import com.google.android.exoplayer2.video.VideoDecoderOutputBufferRenderer; import com.google.android.exoplayer2.video.VideoFrameMetadataListener; import com.google.android.exoplayer2.video.VideoRendererEventListener; @@ -48,8 +49,8 @@ import com.google.android.exoplayer2.video.VideoRendererEventListener; *
  • Message with type {@link C#MSG_SET_SURFACE} to set the output surface. The message payload * should be the target {@link Surface}, or null. *
  • Message with type {@link #MSG_SET_OUTPUT_BUFFER_RENDERER} to set the output buffer - * renderer. The message payload should be the target {@link VpxOutputBufferRenderer}, or - * null. + * renderer. The message payload should be the target {@link + * VideoDecoderOutputBufferRenderer}, or null. * */ public class LibvpxVideoRenderer extends SimpleDecoderVideoRenderer { @@ -57,7 +58,7 @@ public class LibvpxVideoRenderer extends SimpleDecoderVideoRenderer { /** * The type of a message that can be passed to an instance of this class via {@link * ExoPlayer#createMessage(Target)}. The message payload should be the target {@link - * VpxOutputBufferRenderer}, or null. + * VideoDecoderOutputBufferRenderer}, or null. */ public static final int MSG_SET_OUTPUT_BUFFER_RENDERER = C.MSG_CUSTOM_BASE; @@ -79,11 +80,11 @@ public class LibvpxVideoRenderer extends SimpleDecoderVideoRenderer { private final int threads; private Surface surface; - private VpxOutputBufferRenderer outputBufferRenderer; + private VideoDecoderOutputBufferRenderer outputBufferRenderer; @C.VideoOutputMode private int outputMode; private VpxDecoder decoder; - private VpxOutputBuffer outputBuffer; + private VideoDecoderOutputBuffer outputBuffer; private VideoFrameMetadataListener frameMetadataListener; @@ -298,7 +299,7 @@ public class LibvpxVideoRenderer extends SimpleDecoderVideoRenderer { if (messageType == C.MSG_SET_SURFACE) { setOutput((Surface) message, null); } else if (messageType == MSG_SET_OUTPUT_BUFFER_RENDERER) { - setOutput(null, (VpxOutputBufferRenderer) message); + setOutput(null, (VideoDecoderOutputBufferRenderer) message); } else if (messageType == C.MSG_SET_VIDEO_FRAME_METADATA_LISTENER) { frameMetadataListener = (VideoFrameMetadataListener) message; } else { @@ -309,7 +310,7 @@ public class LibvpxVideoRenderer extends SimpleDecoderVideoRenderer { // Internal methods. private void setOutput( - @Nullable Surface surface, @Nullable VpxOutputBufferRenderer outputBufferRenderer) { + @Nullable Surface surface, @Nullable VideoDecoderOutputBufferRenderer outputBufferRenderer) { // At most one output may be non-null. Both may be null if the output is being cleared. Assertions.checkState(surface == null || outputBufferRenderer == null); if (this.surface != surface || this.outputBufferRenderer != outputBufferRenderer) { diff --git a/extensions/vp9/src/main/java/com/google/android/exoplayer2/ext/vp9/VpxDecoder.java b/extensions/vp9/src/main/java/com/google/android/exoplayer2/ext/vp9/VpxDecoder.java index f6b1ddccea..d6ab6efc8d 100644 --- a/extensions/vp9/src/main/java/com/google/android/exoplayer2/ext/vp9/VpxDecoder.java +++ b/extensions/vp9/src/main/java/com/google/android/exoplayer2/ext/vp9/VpxDecoder.java @@ -24,11 +24,12 @@ import com.google.android.exoplayer2.drm.DecryptionException; import com.google.android.exoplayer2.drm.ExoMediaCrypto; import com.google.android.exoplayer2.util.Util; import com.google.android.exoplayer2.video.VideoDecoderInputBuffer; +import com.google.android.exoplayer2.video.VideoDecoderOutputBuffer; import java.nio.ByteBuffer; /** Vpx decoder. */ /* package */ final class VpxDecoder - extends SimpleDecoder { + extends SimpleDecoder { // These constants should match the codes returned from vpxDecode and vpxSecureDecode functions in // https://github.com/google/ExoPlayer/blob/release-v2/extensions/vp9/src/main/jni/vpx_jni.cc. @@ -63,7 +64,9 @@ import java.nio.ByteBuffer; boolean enableRowMultiThreadMode, int threads) throws VpxDecoderException { - super(new VideoDecoderInputBuffer[numInputBuffers], new VpxOutputBuffer[numOutputBuffers]); + super( + new VideoDecoderInputBuffer[numInputBuffers], + new VideoDecoderOutputBuffer[numOutputBuffers]); if (!VpxLibrary.isAvailable()) { throw new VpxDecoderException("Failed to load decoder native libraries."); } @@ -98,12 +101,12 @@ import java.nio.ByteBuffer; } @Override - protected VpxOutputBuffer createOutputBuffer() { - return new VpxOutputBuffer(this); + protected VideoDecoderOutputBuffer createOutputBuffer() { + return new VideoDecoderOutputBuffer(this::releaseOutputBuffer); } @Override - protected void releaseOutputBuffer(VpxOutputBuffer buffer) { + protected void releaseOutputBuffer(VideoDecoderOutputBuffer buffer) { // Decode only frames do not acquire a reference on the internal decoder buffer and thus do not // require a call to vpxReleaseFrame. if (outputMode == C.VIDEO_OUTPUT_MODE_SURFACE_YUV && !buffer.isDecodeOnly()) { @@ -120,7 +123,7 @@ import java.nio.ByteBuffer; @Override @Nullable protected VpxDecoderException decode( - VideoDecoderInputBuffer inputBuffer, VpxOutputBuffer outputBuffer, boolean reset) { + VideoDecoderInputBuffer inputBuffer, VideoDecoderOutputBuffer outputBuffer, boolean reset) { ByteBuffer inputData = Util.castNonNull(inputBuffer.data); int inputSize = inputData.limit(); CryptoInfo cryptoInfo = inputBuffer.cryptoInfo; @@ -163,7 +166,7 @@ import java.nio.ByteBuffer; } /** Renders the outputBuffer to the surface. Used with OUTPUT_MODE_SURFACE_YUV only. */ - public void renderToSurface(VpxOutputBuffer outputBuffer, Surface surface) + public void renderToSurface(VideoDecoderOutputBuffer outputBuffer, Surface surface) throws VpxDecoderException { int getFrameResult = vpxRenderFrame(vpxDecContext, surface, outputBuffer); if (getFrameResult == -1) { @@ -189,19 +192,20 @@ import java.nio.ByteBuffer; int[] numBytesOfClearData, int[] numBytesOfEncryptedData); - private native int vpxGetFrame(long context, VpxOutputBuffer outputBuffer); + private native int vpxGetFrame(long context, VideoDecoderOutputBuffer outputBuffer); /** * Renders the frame to the surface. Used with OUTPUT_MODE_SURFACE_YUV only. Must only be called * if {@link #vpxInit} was called with {@code enableBufferManager = true}. */ - private native int vpxRenderFrame(long context, Surface surface, VpxOutputBuffer outputBuffer); + private native int vpxRenderFrame( + long context, Surface surface, VideoDecoderOutputBuffer outputBuffer); /** * Releases the frame. Used with OUTPUT_MODE_SURFACE_YUV only. Must only be called if {@link * #vpxInit} was called with {@code enableBufferManager = true}. */ - private native int vpxReleaseFrame(long context, VpxOutputBuffer outputBuffer); + private native int vpxReleaseFrame(long context, VideoDecoderOutputBuffer outputBuffer); private native int vpxGetErrorCode(long context); private native String vpxGetErrorMessage(long context); diff --git a/extensions/vp9/src/main/java/com/google/android/exoplayer2/ext/vp9/VpxOutputBuffer.java b/extensions/vp9/src/main/java/com/google/android/exoplayer2/ext/vp9/VpxOutputBuffer.java index 7177cde12e..1c434032d0 100644 --- a/extensions/vp9/src/main/java/com/google/android/exoplayer2/ext/vp9/VpxOutputBuffer.java +++ b/extensions/vp9/src/main/java/com/google/android/exoplayer2/ext/vp9/VpxOutputBuffer.java @@ -17,18 +17,22 @@ package com.google.android.exoplayer2.ext.vp9; import com.google.android.exoplayer2.video.VideoDecoderOutputBuffer; -/** Video output buffer, populated by {@link VpxDecoder}. */ +// TODO(b/139174707): Delete this class once binaries in WVVp9OpusPlaybackTest are updated to depend +// on VideoDecoderOutputBuffer. Also mark VideoDecoderOutputBuffer as final. +/** + * Video output buffer, populated by {@link VpxDecoder}. + * + * @deprecated Use {@link VideoDecoderOutputBuffer} instead. + */ +@Deprecated public final class VpxOutputBuffer extends VideoDecoderOutputBuffer { - private final VpxDecoder owner; - - public VpxOutputBuffer(VpxDecoder owner) { - this.owner = owner; + /** + * Creates VpxOutputBuffer. + * + * @param owner Buffer owner. + */ + public VpxOutputBuffer(VideoDecoderOutputBuffer.Owner owner) { + super(owner); } - - @Override - public void release() { - owner.releaseOutputBuffer(this); - } - } diff --git a/extensions/vp9/src/main/jni/vpx_jni.cc b/extensions/vp9/src/main/jni/vpx_jni.cc index 303672334d..9c4b6d4acf 100644 --- a/extensions/vp9/src/main/jni/vpx_jni.cc +++ b/extensions/vp9/src/main/jni/vpx_jni.cc @@ -38,27 +38,27 @@ #define LOGE(...) ((void)__android_log_print(ANDROID_LOG_ERROR, LOG_TAG, \ __VA_ARGS__)) -#define DECODER_FUNC(RETURN_TYPE, NAME, ...) \ - extern "C" { \ - JNIEXPORT RETURN_TYPE \ - Java_com_google_android_exoplayer2_ext_vp9_VpxDecoder_ ## NAME \ - (JNIEnv* env, jobject thiz, ##__VA_ARGS__);\ - } \ - JNIEXPORT RETURN_TYPE \ - Java_com_google_android_exoplayer2_ext_vp9_VpxDecoder_ ## NAME \ - (JNIEnv* env, jobject thiz, ##__VA_ARGS__)\ +#define DECODER_FUNC(RETURN_TYPE, NAME, ...) \ + extern "C" { \ + JNIEXPORT RETURN_TYPE \ + Java_com_google_android_exoplayer2_ext_vp9_VpxDecoder_##NAME( \ + JNIEnv* env, jobject thiz, ##__VA_ARGS__); \ + } \ + JNIEXPORT RETURN_TYPE \ + Java_com_google_android_exoplayer2_ext_vp9_VpxDecoder_##NAME( \ + JNIEnv* env, jobject thiz, ##__VA_ARGS__) -#define LIBRARY_FUNC(RETURN_TYPE, NAME, ...) \ - extern "C" { \ - JNIEXPORT RETURN_TYPE \ - Java_com_google_android_exoplayer2_ext_vp9_VpxLibrary_ ## NAME \ - (JNIEnv* env, jobject thiz, ##__VA_ARGS__);\ - } \ - JNIEXPORT RETURN_TYPE \ - Java_com_google_android_exoplayer2_ext_vp9_VpxLibrary_ ## NAME \ - (JNIEnv* env, jobject thiz, ##__VA_ARGS__)\ +#define LIBRARY_FUNC(RETURN_TYPE, NAME, ...) \ + extern "C" { \ + JNIEXPORT RETURN_TYPE \ + Java_com_google_android_exoplayer2_ext_vp9_VpxLibrary_##NAME( \ + JNIEnv* env, jobject thiz, ##__VA_ARGS__); \ + } \ + JNIEXPORT RETURN_TYPE \ + Java_com_google_android_exoplayer2_ext_vp9_VpxLibrary_##NAME( \ + JNIEnv* env, jobject thiz, ##__VA_ARGS__) -// JNI references for VpxOutputBuffer class. +// JNI references for VideoDecoderOutputBuffer class. static jmethodID initForYuvFrame; static jmethodID initForPrivateFrame; static jfieldID dataField; @@ -477,7 +477,7 @@ DECODER_FUNC(jlong, vpxInit, jboolean disableLoopFilter, // Populate JNI References. const jclass outputBufferClass = env->FindClass( - "com/google/android/exoplayer2/ext/vp9/VpxOutputBuffer"); + "com/google/android/exoplayer2/video/VideoDecoderOutputBuffer"); initForYuvFrame = env->GetMethodID(outputBufferClass, "initForYuvFrame", "(IIIII)Z"); initForPrivateFrame = diff --git a/library/core/proguard-rules.txt b/library/core/proguard-rules.txt index ab3cc5fccd..67646be956 100644 --- a/library/core/proguard-rules.txt +++ b/library/core/proguard-rules.txt @@ -61,3 +61,8 @@ # Don't warn about checkerframework and Kotlin annotations -dontwarn org.checkerframework.** -dontwarn kotlin.annotations.jvm.** + +# Some members of this class are being accessed from native methods. Keep them unobfuscated. +-keep class com.google.android.exoplayer2.ext.video.VideoDecoderOutputBuffer { + *; +} diff --git a/library/core/src/main/java/com/google/android/exoplayer2/video/VideoDecoderOutputBuffer.java b/library/core/src/main/java/com/google/android/exoplayer2/video/VideoDecoderOutputBuffer.java index a3d3a7d967..299b5656b8 100644 --- a/library/core/src/main/java/com/google/android/exoplayer2/video/VideoDecoderOutputBuffer.java +++ b/library/core/src/main/java/com/google/android/exoplayer2/video/VideoDecoderOutputBuffer.java @@ -21,7 +21,18 @@ import com.google.android.exoplayer2.decoder.OutputBuffer; import java.nio.ByteBuffer; /** Video decoder output buffer containing video frame data. */ -public abstract class VideoDecoderOutputBuffer extends OutputBuffer { +public class VideoDecoderOutputBuffer extends OutputBuffer { + + /** Buffer owner. */ + public interface Owner { + + /** + * Releases the buffer. + * + * @param outputBuffer Output buffer. + */ + public void releaseOutputBuffer(VideoDecoderOutputBuffer outputBuffer); + } // LINT.IfChange public static final int COLORSPACE_UNKNOWN = 0; @@ -54,6 +65,22 @@ public abstract class VideoDecoderOutputBuffer extends OutputBuffer { */ @Nullable public ByteBuffer supplementalData; + private final Owner owner; + + /** + * Creates VideoDecoderOutputBuffer. + * + * @param owner Buffer owner. + */ + public VideoDecoderOutputBuffer(Owner owner) { + this.owner = owner; + } + + @Override + public void release() { + owner.releaseOutputBuffer(this); + } + /** * Initializes the buffer. * diff --git a/extensions/vp9/src/main/java/com/google/android/exoplayer2/ext/vp9/VpxOutputBufferRenderer.java b/library/core/src/main/java/com/google/android/exoplayer2/video/VideoDecoderOutputBufferRenderer.java similarity index 78% rename from extensions/vp9/src/main/java/com/google/android/exoplayer2/ext/vp9/VpxOutputBufferRenderer.java rename to library/core/src/main/java/com/google/android/exoplayer2/video/VideoDecoderOutputBufferRenderer.java index d07e24d920..c57794f454 100644 --- a/extensions/vp9/src/main/java/com/google/android/exoplayer2/ext/vp9/VpxOutputBufferRenderer.java +++ b/library/core/src/main/java/com/google/android/exoplayer2/video/VideoDecoderOutputBufferRenderer.java @@ -13,18 +13,15 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package com.google.android.exoplayer2.ext.vp9; +package com.google.android.exoplayer2.video; -/** - * Renders the {@link VpxOutputBuffer}. - */ -public interface VpxOutputBufferRenderer { +/** Renders the {@link VideoDecoderOutputBuffer}. */ +public interface VideoDecoderOutputBufferRenderer { /** * Sets the output buffer to be rendered. The renderer is responsible for releasing the buffer. * * @param outputBuffer The output buffer to be rendered. */ - void setOutputBuffer(VpxOutputBuffer outputBuffer); - + void setOutputBuffer(VideoDecoderOutputBuffer outputBuffer); } diff --git a/extensions/vp9/src/main/java/com/google/android/exoplayer2/ext/vp9/VpxRenderer.java b/library/core/src/main/java/com/google/android/exoplayer2/video/VideoDecoderRenderer.java similarity index 87% rename from extensions/vp9/src/main/java/com/google/android/exoplayer2/ext/vp9/VpxRenderer.java rename to library/core/src/main/java/com/google/android/exoplayer2/video/VideoDecoderRenderer.java index d82f5a6071..ab338a0af5 100644 --- a/extensions/vp9/src/main/java/com/google/android/exoplayer2/ext/vp9/VpxRenderer.java +++ b/library/core/src/main/java/com/google/android/exoplayer2/video/VideoDecoderRenderer.java @@ -13,7 +13,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package com.google.android.exoplayer2.ext.vp9; +package com.google.android.exoplayer2.video; import android.opengl.GLES20; import android.opengl.GLSurfaceView; @@ -24,10 +24,10 @@ import javax.microedition.khronos.egl.EGLConfig; import javax.microedition.khronos.opengles.GL10; /** - * GLSurfaceView.Renderer implementation that can render YUV Frames returned by libvpx after - * decoding. It does the YUV to RGB color conversion in the Fragment Shader. + * GLSurfaceView.Renderer implementation that can render YUV Frames returned by a video decoder + * after decoding. It does the YUV to RGB color conversion in the Fragment Shader. */ -/* package */ class VpxRenderer implements GLSurfaceView.Renderer { +/* package */ class VideoDecoderRenderer implements GLSurfaceView.Renderer { private static final float[] kColorConversion601 = { 1.164f, 1.164f, 1.164f, @@ -74,7 +74,7 @@ import javax.microedition.khronos.opengles.GL10; private static final FloatBuffer TEXTURE_VERTICES = GlUtil.createBuffer(new float[] {-1.0f, 1.0f, -1.0f, -1.0f, 1.0f, 1.0f, 1.0f, -1.0f}); private final int[] yuvTextures = new int[3]; - private final AtomicReference pendingOutputBufferReference; + private final AtomicReference pendingOutputBufferReference; // Kept in a field rather than a local variable so that it doesn't get garbage collected before // glDrawArrays uses it. @@ -86,9 +86,9 @@ import javax.microedition.khronos.opengles.GL10; private int previousWidth; private int previousStride; - private VpxOutputBuffer renderedOutputBuffer; // Accessed only from the GL thread. + private VideoDecoderOutputBuffer renderedOutputBuffer; // Accessed only from the GL thread. - public VpxRenderer() { + public VideoDecoderRenderer() { previousWidth = -1; previousStride = -1; pendingOutputBufferReference = new AtomicReference<>(); @@ -96,12 +96,13 @@ import javax.microedition.khronos.opengles.GL10; /** * Set a frame to be rendered. This should be followed by a call to - * VpxVideoSurfaceView.requestRender() to actually render the frame. + * VideoDecoderSurfaceView.requestRender() to actually render the frame. * * @param outputBuffer OutputBuffer containing the YUV Frame to be rendered */ - public void setFrame(VpxOutputBuffer outputBuffer) { - VpxOutputBuffer oldPendingOutputBuffer = pendingOutputBufferReference.getAndSet(outputBuffer); + public void setFrame(VideoDecoderOutputBuffer outputBuffer) { + VideoDecoderOutputBuffer oldPendingOutputBuffer = + pendingOutputBufferReference.getAndSet(outputBuffer); if (oldPendingOutputBuffer != null) { // The old pending output buffer will never be used for rendering, so release it now. oldPendingOutputBuffer.release(); @@ -132,7 +133,7 @@ import javax.microedition.khronos.opengles.GL10; @Override public void onDrawFrame(GL10 unused) { - VpxOutputBuffer pendingOutputBuffer = pendingOutputBufferReference.getAndSet(null); + VideoDecoderOutputBuffer pendingOutputBuffer = pendingOutputBufferReference.getAndSet(null); if (pendingOutputBuffer == null && renderedOutputBuffer == null) { // There is no output buffer to render at the moment. return; @@ -143,17 +144,17 @@ import javax.microedition.khronos.opengles.GL10; } renderedOutputBuffer = pendingOutputBuffer; } - VpxOutputBuffer outputBuffer = renderedOutputBuffer; + VideoDecoderOutputBuffer outputBuffer = renderedOutputBuffer; // Set color matrix. Assume BT709 if the color space is unknown. float[] colorConversion = kColorConversion709; switch (outputBuffer.colorspace) { - case VpxOutputBuffer.COLORSPACE_BT601: + case VideoDecoderOutputBuffer.COLORSPACE_BT601: colorConversion = kColorConversion601; break; - case VpxOutputBuffer.COLORSPACE_BT2020: + case VideoDecoderOutputBuffer.COLORSPACE_BT2020: colorConversion = kColorConversion2020; break; - case VpxOutputBuffer.COLORSPACE_BT709: + case VideoDecoderOutputBuffer.COLORSPACE_BT709: default: break; // Do nothing } diff --git a/extensions/vp9/src/main/java/com/google/android/exoplayer2/ext/vp9/VpxVideoSurfaceView.java b/library/core/src/main/java/com/google/android/exoplayer2/video/VideoDecoderSurfaceView.java similarity index 67% rename from extensions/vp9/src/main/java/com/google/android/exoplayer2/ext/vp9/VpxVideoSurfaceView.java rename to library/core/src/main/java/com/google/android/exoplayer2/video/VideoDecoderSurfaceView.java index 9dd2432622..f2a4c2d002 100644 --- a/extensions/vp9/src/main/java/com/google/android/exoplayer2/ext/vp9/VpxVideoSurfaceView.java +++ b/library/core/src/main/java/com/google/android/exoplayer2/video/VideoDecoderSurfaceView.java @@ -13,27 +13,26 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package com.google.android.exoplayer2.ext.vp9; +package com.google.android.exoplayer2.video; import android.content.Context; import android.opengl.GLSurfaceView; import android.util.AttributeSet; import androidx.annotation.Nullable; -/** - * A GLSurfaceView extension that scales itself to the given aspect ratio. - */ -public class VpxVideoSurfaceView extends GLSurfaceView implements VpxOutputBufferRenderer { +/** A GLSurfaceView extension that scales itself to the given aspect ratio. */ +public class VideoDecoderSurfaceView extends GLSurfaceView + implements VideoDecoderOutputBufferRenderer { - private final VpxRenderer renderer; + private final VideoDecoderRenderer renderer; - public VpxVideoSurfaceView(Context context) { + public VideoDecoderSurfaceView(Context context) { this(context, /* attrs= */ null); } - public VpxVideoSurfaceView(Context context, @Nullable AttributeSet attrs) { + public VideoDecoderSurfaceView(Context context, @Nullable AttributeSet attrs) { super(context, attrs); - renderer = new VpxRenderer(); + renderer = new VideoDecoderRenderer(); setPreserveEGLContextOnPause(true); setEGLContextClientVersion(2); setRenderer(renderer); @@ -41,7 +40,7 @@ public class VpxVideoSurfaceView extends GLSurfaceView implements VpxOutputBuffe } @Override - public void setOutputBuffer(VpxOutputBuffer outputBuffer) { + public void setOutputBuffer(VideoDecoderOutputBuffer outputBuffer) { renderer.setFrame(outputBuffer); requestRender(); }