Index: webrtc/api/android/java/src/org/webrtc/EglRenderer.java |
diff --git a/webrtc/api/android/java/src/org/webrtc/EglRenderer.java b/webrtc/api/android/java/src/org/webrtc/EglRenderer.java |
index d3bb13a7e8899bc57c8c64250c7576ecfd5fd108..284a1b1c08f8347c2f35078b8a45674579e85d15 100644 |
--- a/webrtc/api/android/java/src/org/webrtc/EglRenderer.java |
+++ b/webrtc/api/android/java/src/org/webrtc/EglRenderer.java |
@@ -35,13 +35,16 @@ public class EglRenderer implements VideoRenderer.Callbacks { |
public interface FrameListener { void onFrame(Bitmap frame); } |
- private static class ScaleAndFrameListener { |
- public final float scale; |
+ private static class FrameListenerAndParams { |
public final FrameListener listener; |
+ public final float scale; |
+ public final RendererCommon.GlDrawer drawer; |
- public ScaleAndFrameListener(float scale, FrameListener listener) { |
- this.scale = scale; |
+ public FrameListenerAndParams( |
+ FrameListener listener, float scale, RendererCommon.GlDrawer drawer) { |
this.listener = listener; |
+ this.scale = scale; |
+ this.drawer = drawer; |
} |
} |
@@ -76,7 +79,7 @@ public class EglRenderer implements VideoRenderer.Callbacks { |
private final Object handlerLock = new Object(); |
private Handler renderThreadHandler; |
- private final ArrayList<ScaleAndFrameListener> frameListeners = new ArrayList<>(); |
+ private final ArrayList<FrameListenerAndParams> frameListeners = new ArrayList<>(); |
// Variables for fps reduction. |
private final Object fpsReductionLock = new Object(); |
@@ -357,7 +360,8 @@ public class EglRenderer implements VideoRenderer.Callbacks { |
} |
/** |
- * Register a callback to be invoked when a new video frame has been received. |
+ * Register a callback to be invoked when a new video frame has been received. This version uses |
+ * the drawer of the EglRenderer that was passed in init. |
* |
* @param listener The callback to be invoked. |
* @param scale The scale of the Bitmap passed to the callback, or 0 if no Bitmap is |
@@ -367,7 +371,25 @@ public class EglRenderer implements VideoRenderer.Callbacks { |
postToRenderThread(new Runnable() { |
@Override |
public void run() { |
- frameListeners.add(new ScaleAndFrameListener(scale, listener)); |
+ frameListeners.add(new FrameListenerAndParams(listener, scale, drawer)); |
+ } |
+ }); |
+ } |
+ |
+ /** |
+ * Register a callback to be invoked when a new video frame has been received. |
+ * |
+ * @param listener The callback to be invoked. |
+ * @param scale The scale of the Bitmap passed to the callback, or 0 if no Bitmap is |
+ * required. |
+ * @param drawer Custom drawer to use for this frame listener. |
+ */ |
+ public void addFrameListener( |
+ final FrameListener listener, final float scale, final RendererCommon.GlDrawer drawer) { |
+ postToRenderThread(new Runnable() { |
+ @Override |
+ public void run() { |
+ frameListeners.add(new FrameListenerAndParams(listener, scale, drawer)); |
} |
}); |
} |
@@ -385,7 +407,7 @@ public class EglRenderer implements VideoRenderer.Callbacks { |
@Override |
public void run() { |
latch.countDown(); |
- final Iterator<ScaleAndFrameListener> iter = frameListeners.iterator(); |
+ final Iterator<FrameListenerAndParams> iter = frameListeners.iterator(); |
while (iter.hasNext()) { |
if (iter.next().listener == listener) { |
iter.remove(); |
@@ -589,7 +611,7 @@ public class EglRenderer implements VideoRenderer.Callbacks { |
private void notifyCallbacks(VideoRenderer.I420Frame frame, float[] texMatrix) { |
// Make temporary copy of callback list to avoid ConcurrentModificationException, in case |
// callbacks call addFramelistener or removeFrameListener. |
- final ArrayList<ScaleAndFrameListener> tmpList; |
+ final ArrayList<FrameListenerAndParams> tmpList; |
if (frameListeners.isEmpty()) |
return; |
tmpList = new ArrayList<>(frameListeners); |
@@ -600,12 +622,12 @@ public class EglRenderer implements VideoRenderer.Callbacks { |
mirror ? RendererCommon.horizontalFlipMatrix() : RendererCommon.identityMatrix()), |
RendererCommon.verticalFlipMatrix()); |
- for (ScaleAndFrameListener scaleAndListener : tmpList) { |
- final int scaledWidth = (int) (scaleAndListener.scale * frame.rotatedWidth()); |
- final int scaledHeight = (int) (scaleAndListener.scale * frame.rotatedHeight()); |
+ for (FrameListenerAndParams listenerAndParams : tmpList) { |
+ final int scaledWidth = (int) (listenerAndParams.scale * frame.rotatedWidth()); |
+ final int scaledHeight = (int) (listenerAndParams.scale * frame.rotatedHeight()); |
if (scaledWidth == 0 || scaledHeight == 0) { |
- scaleAndListener.listener.onFrame(null); |
+ listenerAndParams.listener.onFrame(null); |
continue; |
} |
@@ -619,11 +641,11 @@ public class EglRenderer implements VideoRenderer.Callbacks { |
GLES20.GL_TEXTURE_2D, bitmapTextureFramebuffer.getTextureId(), 0); |
if (frame.yuvFrame) { |
- drawer.drawYuv(yuvTextures, bitmapMatrix, frame.rotatedWidth(), frame.rotatedHeight(), |
- 0 /* viewportX */, 0 /* viewportY */, scaledWidth, scaledHeight); |
+ listenerAndParams.drawer.drawYuv(yuvTextures, bitmapMatrix, frame.rotatedWidth(), |
+ frame.rotatedHeight(), 0 /* viewportX */, 0 /* viewportY */, scaledWidth, scaledHeight); |
} else { |
- drawer.drawOes(frame.textureId, bitmapMatrix, frame.rotatedWidth(), frame.rotatedHeight(), |
- 0 /* viewportX */, 0 /* viewportY */, scaledWidth, scaledHeight); |
+ listenerAndParams.drawer.drawOes(frame.textureId, bitmapMatrix, frame.rotatedWidth(), |
+ frame.rotatedHeight(), 0 /* viewportX */, 0 /* viewportY */, scaledWidth, scaledHeight); |
} |
final ByteBuffer bitmapBuffer = ByteBuffer.allocateDirect(scaledWidth * scaledHeight * 4); |
@@ -636,7 +658,7 @@ public class EglRenderer implements VideoRenderer.Callbacks { |
final Bitmap bitmap = Bitmap.createBitmap(scaledWidth, scaledHeight, Bitmap.Config.ARGB_8888); |
bitmap.copyPixelsFromBuffer(bitmapBuffer); |
- scaleAndListener.listener.onFrame(bitmap); |
+ listenerAndParams.listener.onFrame(bitmap); |
} |
} |