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

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

Issue 2897043002: Allow FPS reduction to be applied to frame listeners. (Closed)
Patch Set: Changes according to magjed's comments. Created 3 years, 7 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 | « no previous file | webrtc/sdk/android/instrumentationtests/src/org/webrtc/EglRendererTest.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 3d65b72b90930ccaa8933cd12b713275c5da0629..d0458ed6eb8de0d48e73e10cc96675a4544778b8 100644
--- a/webrtc/sdk/android/api/org/webrtc/EglRenderer.java
+++ b/webrtc/sdk/android/api/org/webrtc/EglRenderer.java
@@ -40,12 +40,14 @@ public class EglRenderer implements VideoRenderer.Callbacks {
public final FrameListener listener;
public final float scale;
public final RendererCommon.GlDrawer drawer;
+ public final boolean applyFpsReduction;
- public FrameListenerAndParams(
- FrameListener listener, float scale, RendererCommon.GlDrawer drawer) {
+ public FrameListenerAndParams(FrameListener listener, float scale,
+ RendererCommon.GlDrawer drawer, boolean applyFpsReduction) {
this.listener = listener;
this.scale = scale;
this.drawer = drawer;
+ this.applyFpsReduction = applyFpsReduction;
}
}
@@ -365,7 +367,7 @@ public class EglRenderer implements VideoRenderer.Callbacks {
* required.
*/
public void addFrameListener(final FrameListener listener, final float scale) {
- addFrameListener(listener, scale, null);
+ addFrameListener(listener, scale, null, false /* applyFpsReduction */);
}
/**
@@ -379,11 +381,28 @@ public class EglRenderer implements VideoRenderer.Callbacks {
*/
public void addFrameListener(
final FrameListener listener, final float scale, final RendererCommon.GlDrawer drawerParam) {
+ addFrameListener(listener, scale, drawerParam, false /* applyFpsReduction */);
+ }
+
+ /**
+ * Register a callback to be invoked when a new video frame has been received.
+ *
+ * @param listener The callback to be invoked. The callback will be invoked on the render thread.
+ * It should be lightweight and must not call removeFrameListener.
+ * @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 or null to use the default one.
+ * @param applyFpsReduction This callback will not be called for frames that have been dropped by
+ * FPS reduction.
+ */
+ public void addFrameListener(final FrameListener listener, final float scale,
+ final RendererCommon.GlDrawer drawerParam, final boolean applyFpsReduction) {
postToRenderThread(new Runnable() {
@Override
public void run() {
final RendererCommon.GlDrawer listenerDrawer = drawerParam == null ? drawer : drawerParam;
- frameListeners.add(new FrameListenerAndParams(listener, scale, listenerDrawer));
+ frameListeners.add(
+ new FrameListenerAndParams(listener, scale, listenerDrawer, applyFpsReduction));
}
});
}
@@ -593,7 +612,8 @@ public class EglRenderer implements VideoRenderer.Callbacks {
// frame was rendered. This is the case when there are frameListeners with scale != 0f.
if (!shouldUploadYuvTextures) {
for (FrameListenerAndParams listenerAndParams : frameListeners) {
- if (listenerAndParams.scale != 0f) {
+ if (listenerAndParams.scale != 0f
+ && (shouldRenderFrame || !listenerAndParams.applyFpsReduction)) {
shouldUploadYuvTextures = true;
break;
}
@@ -626,12 +646,12 @@ public class EglRenderer implements VideoRenderer.Callbacks {
}
}
- notifyCallbacks(frame, yuvTextures, texMatrix);
+ notifyCallbacks(frame, yuvTextures, texMatrix, shouldRenderFrame);
VideoRenderer.renderFrameDone(frame);
}
private void notifyCallbacks(
- VideoRenderer.I420Frame frame, int[] yuvTextures, float[] texMatrix) {
+ VideoRenderer.I420Frame frame, int[] yuvTextures, float[] texMatrix, boolean wasRendered) {
if (frameListeners.isEmpty())
return;
@@ -640,7 +660,14 @@ public class EglRenderer implements VideoRenderer.Callbacks {
mirror ? RendererCommon.horizontalFlipMatrix() : RendererCommon.identityMatrix()),
RendererCommon.verticalFlipMatrix());
- for (FrameListenerAndParams listenerAndParams : frameListeners) {
+ Iterator<FrameListenerAndParams> it = frameListeners.iterator();
+ while (it.hasNext()) {
+ FrameListenerAndParams listenerAndParams = it.next();
+ if (!wasRendered && listenerAndParams.applyFpsReduction) {
+ continue;
+ }
+ it.remove();
+
final int scaledWidth = (int) (listenerAndParams.scale * frame.rotatedWidth());
final int scaledHeight = (int) (listenerAndParams.scale * frame.rotatedHeight());
@@ -680,7 +707,6 @@ public class EglRenderer implements VideoRenderer.Callbacks {
bitmap.copyPixelsFromBuffer(bitmapBuffer);
listenerAndParams.listener.onFrame(bitmap);
}
- frameListeners.clear();
}
private String averageTimeAsString(long sumTimeNs, int count) {
« no previous file with comments | « no previous file | webrtc/sdk/android/instrumentationtests/src/org/webrtc/EglRendererTest.java » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698