diff --git a/webrtc/sdk/android/api/org/webrtc/EglBase.java b/webrtc/sdk/android/api/org/webrtc/EglBase.java index 2a8d4e4bd1..1f905885cf 100644 --- a/webrtc/sdk/android/api/org/webrtc/EglBase.java +++ b/webrtc/sdk/android/api/org/webrtc/EglBase.java @@ -19,8 +19,7 @@ import javax.microedition.khronos.egl.EGL10; * Holds EGL state and utility methods for handling an egl 1.0 EGLContext, an EGLDisplay, * and an EGLSurface. */ -@SuppressWarnings("StaticOrDefaultInterfaceMethod") -public interface EglBase { +public abstract class EglBase { // EGL wrapper for an actual EGLContext. public static class Context {} @@ -141,34 +140,34 @@ public interface EglBase { return new EglBase14(new EglBase14.Context(sharedContext), configAttributes); } - void createSurface(Surface surface); + public abstract void createSurface(Surface surface); // Create EGLSurface from the Android SurfaceTexture. - void createSurface(SurfaceTexture surfaceTexture); + public abstract void createSurface(SurfaceTexture surfaceTexture); // Create dummy 1x1 pixel buffer surface so the context can be made current. - void createDummyPbufferSurface(); + public abstract void createDummyPbufferSurface(); - void createPbufferSurface(int width, int height); + public abstract void createPbufferSurface(int width, int height); - Context getEglBaseContext(); + public abstract Context getEglBaseContext(); - boolean hasSurface(); + public abstract boolean hasSurface(); - int surfaceWidth(); + public abstract int surfaceWidth(); - int surfaceHeight(); + public abstract int surfaceHeight(); - void releaseSurface(); + public abstract void releaseSurface(); - void release(); + public abstract void release(); - void makeCurrent(); + public abstract void makeCurrent(); // Detach the current EGL context, so that it can be made current on another thread. - void detachCurrent(); + public abstract void detachCurrent(); - void swapBuffers(); + public abstract void swapBuffers(); - void swapBuffers(long presentationTimeStampNs); + public abstract void swapBuffers(long presentationTimeStampNs); } diff --git a/webrtc/sdk/android/api/org/webrtc/EglRenderer.java b/webrtc/sdk/android/api/org/webrtc/EglRenderer.java index 08d66a9276..d3c91512c5 100644 --- a/webrtc/sdk/android/api/org/webrtc/EglRenderer.java +++ b/webrtc/sdk/android/api/org/webrtc/EglRenderer.java @@ -622,8 +622,8 @@ public class EglRenderer implements VideoRenderer.Callbacks, VideoSink { drawnFrameHeight, 0, 0, eglBase.surfaceWidth(), eglBase.surfaceHeight()); } else { VideoFrame.TextureBuffer textureBuffer = (VideoFrame.TextureBuffer) buffer; - drawer.drawTexture(textureBuffer, drawMatrix, drawnFrameWidth, drawnFrameHeight, 0, 0, - eglBase.surfaceWidth(), eglBase.surfaceHeight()); + RendererCommon.drawTexture(drawer, textureBuffer, drawMatrix, drawnFrameWidth, + drawnFrameHeight, 0, 0, eglBase.surfaceWidth(), eglBase.surfaceHeight()); } final long swapBuffersStartTimeNs = System.nanoTime(); @@ -689,8 +689,8 @@ public class EglRenderer implements VideoRenderer.Callbacks, VideoSink { frame.getRotatedWidth(), frame.getRotatedHeight(), 0, 0, scaledWidth, scaledHeight); } else { VideoFrame.TextureBuffer textureBuffer = (VideoFrame.TextureBuffer) frame.getBuffer(); - listenerAndParams.drawer.drawTexture(textureBuffer, drawMatrix, frame.getRotatedWidth(), - frame.getRotatedHeight(), 0, 0, scaledWidth, scaledHeight); + RendererCommon.drawTexture(listenerAndParams.drawer, textureBuffer, drawMatrix, + frame.getRotatedWidth(), frame.getRotatedHeight(), 0, 0, scaledWidth, scaledHeight); } final ByteBuffer bitmapBuffer = ByteBuffer.allocateDirect(scaledWidth * scaledHeight * 4); diff --git a/webrtc/sdk/android/api/org/webrtc/MediaCodecVideoEncoder.java b/webrtc/sdk/android/api/org/webrtc/MediaCodecVideoEncoder.java index 5ccf640810..a45e70920c 100644 --- a/webrtc/sdk/android/api/org/webrtc/MediaCodecVideoEncoder.java +++ b/webrtc/sdk/android/api/org/webrtc/MediaCodecVideoEncoder.java @@ -616,8 +616,8 @@ public class MediaCodecVideoEncoder { // TODO(perkj): glClear() shouldn't be necessary since every pixel is covered anyway, // but it's a workaround for bug webrtc:5147. GLES20.glClear(GLES20.GL_COLOR_BUFFER_BIT); - drawer.drawTexture(textureBuffer, new Matrix() /* renderMatrix */, width, height, - 0 /* viewportX */, 0 /* viewportY */, width, height); + RendererCommon.drawTexture(drawer, textureBuffer, new Matrix() /* renderMatrix */, width, + height, 0 /* viewportX */, 0 /* viewportY */, width, height); eglBase.swapBuffers(frame.getTimestampNs()); } else { VideoFrame.I420Buffer i420Buffer = buffer.toI420(); diff --git a/webrtc/sdk/android/api/org/webrtc/RendererCommon.java b/webrtc/sdk/android/api/org/webrtc/RendererCommon.java index 8f8d9fef4c..18d96c22e5 100644 --- a/webrtc/sdk/android/api/org/webrtc/RendererCommon.java +++ b/webrtc/sdk/android/api/org/webrtc/RendererCommon.java @@ -34,7 +34,6 @@ public class RendererCommon { } /** Interface for rendering frames on an EGLSurface. */ - @SuppressWarnings("StaticOrDefaultInterfaceMethod") public static interface GlDrawer { /** * Functions for drawing frames with different sources. The rendering surface target is @@ -49,37 +48,35 @@ public class RendererCommon { int viewportX, int viewportY, int viewportWidth, int viewportHeight); /** - * Draws a VideoFrame.TextureBuffer. Default implementation calls either drawOes or drawRgb - * depending on the type of the buffer. You can supply an additional render matrix. This is - * used multiplied together with the transformation matrix of the frame. (M = renderMatrix * - * transformationMatrix) + * Release all GL resources. This needs to be done manually, otherwise resources may leak. */ - default void - drawTexture(VideoFrame.TextureBuffer buffer, android.graphics.Matrix renderMatrix, - int frameWidth, int frameHeight, int viewportX, int viewportY, int viewportWidth, - int viewportHeight) { - android.graphics.Matrix finalMatrix = - new android.graphics.Matrix(buffer.getTransformMatrix()); - finalMatrix.preConcat(renderMatrix); - float[] finalGlMatrix = convertMatrixFromAndroidGraphicsMatrix(finalMatrix); - switch (buffer.getType()) { - case OES: - drawOes(buffer.getTextureId(), finalGlMatrix, frameWidth, frameHeight, viewportX, - viewportY, viewportWidth, viewportHeight); - break; - case RGB: - drawRgb(buffer.getTextureId(), finalGlMatrix, frameWidth, frameHeight, viewportX, - viewportY, viewportWidth, viewportHeight); - break; - default: - throw new RuntimeException("Unknown texture type."); - } - } + void release(); + } - /** - * Release all GL resources. This needs to be done manually, otherwise resources may leak. - */ - void release(); + /** + * Draws a VideoFrame.TextureBuffer. Calls either drawer.drawOes or drawer.drawRgb + * depending on the type of the buffer. You can supply an additional render matrix. This is + * used multiplied together with the transformation matrix of the frame. (M = renderMatrix * + * transformationMatrix) + */ + static void drawTexture(GlDrawer drawer, VideoFrame.TextureBuffer buffer, + android.graphics.Matrix renderMatrix, int frameWidth, int frameHeight, int viewportX, + int viewportY, int viewportWidth, int viewportHeight) { + android.graphics.Matrix finalMatrix = new android.graphics.Matrix(buffer.getTransformMatrix()); + finalMatrix.preConcat(renderMatrix); + float[] finalGlMatrix = convertMatrixFromAndroidGraphicsMatrix(finalMatrix); + switch (buffer.getType()) { + case OES: + drawer.drawOes(buffer.getTextureId(), finalGlMatrix, frameWidth, frameHeight, viewportX, + viewportY, viewportWidth, viewportHeight); + break; + case RGB: + drawer.drawRgb(buffer.getTextureId(), finalGlMatrix, frameWidth, frameHeight, viewportX, + viewportY, viewportWidth, viewportHeight); + break; + default: + throw new RuntimeException("Unknown texture type."); + } } /** diff --git a/webrtc/sdk/android/src/java/org/webrtc/EglBase10.java b/webrtc/sdk/android/src/java/org/webrtc/EglBase10.java index 70200fa6d1..8f1c5c6815 100644 --- a/webrtc/sdk/android/src/java/org/webrtc/EglBase10.java +++ b/webrtc/sdk/android/src/java/org/webrtc/EglBase10.java @@ -26,7 +26,7 @@ import javax.microedition.khronos.egl.EGLSurface; * Holds EGL state and utility methods for handling an egl 1.0 EGLContext, an EGLDisplay, * and an EGLSurface. */ -class EglBase10 implements EglBase { +class EglBase10 extends EglBase { // This constant is taken from EGL14.EGL_CONTEXT_CLIENT_VERSION. private static final int EGL_CONTEXT_CLIENT_VERSION = 0x3098; diff --git a/webrtc/sdk/android/src/java/org/webrtc/EglBase14.java b/webrtc/sdk/android/src/java/org/webrtc/EglBase14.java index 44d16d5046..92f0958219 100644 --- a/webrtc/sdk/android/src/java/org/webrtc/EglBase14.java +++ b/webrtc/sdk/android/src/java/org/webrtc/EglBase14.java @@ -25,7 +25,7 @@ import android.view.Surface; * and an EGLSurface. */ @TargetApi(18) -class EglBase14 implements EglBase { +class EglBase14 extends EglBase { private static final String TAG = "EglBase14"; private static final int EGLExt_SDK_VERSION = android.os.Build.VERSION_CODES.JELLY_BEAN_MR2; private static final int CURRENT_SDK_VERSION = android.os.Build.VERSION.SDK_INT;