Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(929)

Unified Diff: webrtc/sdk/android/api/org/webrtc/EglRenderer.java

Issue 3008423002: Android: Add helper class VideoFrameDrawer that can render VideoFrames (Closed)
Patch Set: similarity=10 Created 3 years, 3 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « webrtc/sdk/android/BUILD.gn ('k') | webrtc/sdk/android/api/org/webrtc/MediaCodecVideoEncoder.java » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: webrtc/sdk/android/api/org/webrtc/EglRenderer.java
diff --git a/webrtc/sdk/android/api/org/webrtc/EglRenderer.java b/webrtc/sdk/android/api/org/webrtc/EglRenderer.java
index d3c91512c53e7714c34809e36c980e5416680090..16e89f4d21394dd543d6b9433852779b10f9e1f9 100644
--- a/webrtc/sdk/android/api/org/webrtc/EglRenderer.java
+++ b/webrtc/sdk/android/api/org/webrtc/EglRenderer.java
@@ -96,8 +96,9 @@ public class EglRenderer implements VideoRenderer.Callbacks, VideoSink {
// EGL and GL resources for drawing YUV/OES textures. After initilization, these are only accessed
// from the render thread.
private EglBase eglBase;
- private final RendererCommon.YuvUploader yuvUploader = new RendererCommon.YuvUploader();
+ private final VideoFrameDrawer frameDrawer = new VideoFrameDrawer();
private RendererCommon.GlDrawer drawer;
+ private final Matrix drawMatrix = new Matrix();
// Pending frame to render. Serves as a queue with size 1. Synchronized on |frameLock|.
private final Object frameLock = new Object();
@@ -227,7 +228,7 @@ public class EglRenderer implements VideoRenderer.Callbacks, VideoSink {
drawer.release();
drawer = null;
}
- yuvUploader.release();
+ frameDrawer.release();
if (bitmapTextureFramebuffer != null) {
bitmapTextureFramebuffer.release();
bitmapTextureFramebuffer = null;
@@ -560,35 +561,6 @@ public class EglRenderer implements VideoRenderer.Callbacks, VideoSink {
drawnAspectRatio = layoutAspectRatio != 0f ? layoutAspectRatio : frameAspectRatio;
}
- VideoFrame.Buffer buffer = frame.getBuffer();
- final boolean isYuvBuffer;
- if (buffer instanceof VideoFrame.TextureBuffer) {
- isYuvBuffer = false;
- } else {
- isYuvBuffer = true;
- VideoFrame.Buffer oldBuffer = buffer;
- buffer = buffer.toI420();
- oldBuffer.release();
- }
- boolean shouldUploadYuvTextures = false;
- if (isYuvBuffer) {
- shouldUploadYuvTextures = shouldRenderFrame;
- // Check if there are frame listeners that we want to render a bitmap for regardless of if the
- // frame was rendered. This is the case when there are frameListeners with scale != 0f.
- if (!shouldUploadYuvTextures) {
- for (FrameListenerAndParams listenerAndParams : frameListeners) {
- if (listenerAndParams.scale != 0f
- && (shouldRenderFrame || !listenerAndParams.applyFpsReduction)) {
- shouldUploadYuvTextures = true;
- break;
- }
- }
- }
- }
- final int[] yuvTextures = shouldUploadYuvTextures
- ? yuvUploader.uploadFromBuffer((VideoFrame.I420Buffer) buffer)
- : null;
-
final float scaleX;
final float scaleY;
@@ -600,14 +572,8 @@ public class EglRenderer implements VideoRenderer.Callbacks, VideoSink {
scaleY = frameAspectRatio / drawnAspectRatio;
}
- final int drawnFrameWidth = (int) (scaleX * frame.getRotatedWidth());
- final int drawnFrameHeight = (int) (scaleY * frame.getRotatedHeight());
-
- final Matrix drawMatrix = new Matrix();
+ drawMatrix.reset();
drawMatrix.preTranslate(0.5f, 0.5f);
- if (isYuvBuffer)
- drawMatrix.preScale(1f, -1f); // I420-frames are upside down
- drawMatrix.preRotate(frame.getRotation());
if (mirror)
drawMatrix.preScale(-1f, 1f);
drawMatrix.preScale(scaleX, scaleY);
@@ -616,15 +582,8 @@ public class EglRenderer implements VideoRenderer.Callbacks, VideoSink {
if (shouldRenderFrame) {
GLES20.glClearColor(0 /* red */, 0 /* green */, 0 /* blue */, 0 /* alpha */);
GLES20.glClear(GLES20.GL_COLOR_BUFFER_BIT);
- if (isYuvBuffer) {
- drawer.drawYuv(yuvTextures,
- RendererCommon.convertMatrixFromAndroidGraphicsMatrix(drawMatrix), drawnFrameWidth,
- drawnFrameHeight, 0, 0, eglBase.surfaceWidth(), eglBase.surfaceHeight());
- } else {
- VideoFrame.TextureBuffer textureBuffer = (VideoFrame.TextureBuffer) buffer;
- RendererCommon.drawTexture(drawer, textureBuffer, drawMatrix, drawnFrameWidth,
- drawnFrameHeight, 0, 0, eglBase.surfaceWidth(), eglBase.surfaceHeight());
- }
+ frameDrawer.drawFrame(frame, drawer, drawMatrix, 0 /* viewportX */, 0 /* viewportY */,
+ eglBase.surfaceWidth(), eglBase.surfaceHeight());
final long swapBuffersStartTimeNs = System.nanoTime();
eglBase.swapBuffers();
@@ -637,20 +596,16 @@ public class EglRenderer implements VideoRenderer.Callbacks, VideoSink {
}
}
- notifyCallbacks(frame, isYuvBuffer, yuvTextures, shouldRenderFrame);
- buffer.release();
+ notifyCallbacks(frame, shouldRenderFrame);
+ frame.release();
}
- private void notifyCallbacks(
- VideoFrame frame, boolean isYuvBuffer, int[] yuvTextures, boolean wasRendered) {
+ private void notifyCallbacks(VideoFrame frame, boolean wasRendered) {
if (frameListeners.isEmpty())
return;
- final Matrix drawMatrix = new Matrix();
+ drawMatrix.reset();
drawMatrix.preTranslate(0.5f, 0.5f);
- if (isYuvBuffer)
- drawMatrix.preScale(1f, -1f); // I420-frames are upside down
- drawMatrix.preRotate(frame.getRotation());
if (mirror)
drawMatrix.preScale(-1f, 1f);
drawMatrix.preScale(1f, -1f); // We want the output to be upside down for Bitmap.
@@ -683,15 +638,8 @@ public class EglRenderer implements VideoRenderer.Callbacks, VideoSink {
GLES20.glClearColor(0 /* red */, 0 /* green */, 0 /* blue */, 0 /* alpha */);
GLES20.glClear(GLES20.GL_COLOR_BUFFER_BIT);
- if (isYuvBuffer) {
- listenerAndParams.drawer.drawYuv(yuvTextures,
- RendererCommon.convertMatrixFromAndroidGraphicsMatrix(drawMatrix),
- frame.getRotatedWidth(), frame.getRotatedHeight(), 0, 0, scaledWidth, scaledHeight);
- } else {
- VideoFrame.TextureBuffer textureBuffer = (VideoFrame.TextureBuffer) frame.getBuffer();
- RendererCommon.drawTexture(listenerAndParams.drawer, textureBuffer, drawMatrix,
- frame.getRotatedWidth(), frame.getRotatedHeight(), 0, 0, scaledWidth, scaledHeight);
- }
+ frameDrawer.drawFrame(frame, listenerAndParams.drawer, drawMatrix, 0 /* viewportX */,
+ 0 /* viewportY */, scaledWidth, scaledHeight);
final ByteBuffer bitmapBuffer = ByteBuffer.allocateDirect(scaledWidth * scaledHeight * 4);
GLES20.glViewport(0, 0, scaledWidth, scaledHeight);
« no previous file with comments | « webrtc/sdk/android/BUILD.gn ('k') | webrtc/sdk/android/api/org/webrtc/MediaCodecVideoEncoder.java » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698