Allow FPS reduction to be applied to frame listeners.

BUG=None

Review-Url: https://codereview.webrtc.org/2897043002
Cr-Commit-Position: refs/heads/master@{#18346}
This commit is contained in:
sakal
2017-05-31 02:43:10 -07:00
committed by Commit Bot
parent 76e62b0d38
commit 8fdf95728f
2 changed files with 54 additions and 11 deletions

View File

@ -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) {