Set surface view surface size to minimum of the layout size and frame size.

This improves the performance of SurfaceViewRenderer. This feature is added
behind a flag for now because it can be buggy on some devices.

BUG=webrtc:6470

Review-Url: https://codereview.webrtc.org/2510413002
Cr-Commit-Position: refs/heads/master@{#15181}
This commit is contained in:
sakal
2016-11-22 01:54:42 -08:00
committed by Commit bot
parent f6acc2a710
commit b1e6d5efa6
2 changed files with 57 additions and 1 deletions

View File

@ -46,6 +46,11 @@ public class SurfaceViewRenderer
private int rotatedFrameHeight; private int rotatedFrameHeight;
private int frameRotation; private int frameRotation;
// Accessed only on the main thread.
private boolean enableFixedSize;
private int surfaceWidth;
private int surfaceHeight;
/** /**
* Standard View constructor. In order to render something, you must first call init(). * Standard View constructor. In order to render something, you must first call init().
*/ */
@ -103,6 +108,16 @@ public class SurfaceViewRenderer
eglRenderer.release(); eglRenderer.release();
} }
/**
* Enables fixed size for the surface. This provides better performance but might be buggy on some
* devices. By default this is turned off.
*/
public void setEnableHardwareScaler(boolean enabled) {
ThreadUtils.checkIsOnMainThread();
enableFixedSize = enabled;
updateSurfaceSize();
}
/** /**
* Set if the video stream should be mirrored or not. * Set if the video stream should be mirrored or not.
*/ */
@ -148,6 +163,41 @@ public class SurfaceViewRenderer
protected void onLayout(boolean changed, int left, int top, int right, int bottom) { protected void onLayout(boolean changed, int left, int top, int right, int bottom) {
ThreadUtils.checkIsOnMainThread(); ThreadUtils.checkIsOnMainThread();
eglRenderer.setLayoutAspectRatio((right - left) / (float) (bottom - top)); eglRenderer.setLayoutAspectRatio((right - left) / (float) (bottom - top));
updateSurfaceSize();
}
private void updateSurfaceSize() {
ThreadUtils.checkIsOnMainThread();
synchronized (layoutLock) {
if (enableFixedSize && rotatedFrameWidth != 0 && rotatedFrameHeight != 0 && getWidth() != 0
&& getHeight() != 0) {
final float layoutAspectRatio = getWidth() / (float) getHeight();
final float frameAspectRatio = rotatedFrameWidth / (float) rotatedFrameHeight;
final int drawnFrameWidth;
final int drawnFrameHeight;
if (frameAspectRatio > layoutAspectRatio) {
drawnFrameWidth = (int) (rotatedFrameHeight * layoutAspectRatio);
drawnFrameHeight = rotatedFrameHeight;
} else {
drawnFrameWidth = rotatedFrameWidth;
drawnFrameHeight = (int) (rotatedFrameWidth / layoutAspectRatio);
}
// Aspect ratio of the drawn frame and the view is the same.
final int width = Math.min(getWidth(), drawnFrameWidth);
final int height = Math.min(getHeight(), drawnFrameHeight);
logD("updateSurfaceSize. Layout size: " + getWidth() + "x" + getHeight() + ", frame size: "
+ rotatedFrameWidth + "x" + rotatedFrameHeight + ", requested surface size: " + width
+ "x" + height + ", old surface size: " + surfaceWidth + "x" + surfaceHeight);
if (width != surfaceWidth || height != surfaceHeight) {
surfaceWidth = width;
surfaceHeight = height;
getHolder().setFixedSize(width, height);
}
} else {
surfaceWidth = surfaceHeight = 0;
getHolder().setSizeFromLayout();
}
}
} }
// SurfaceHolder.Callback interface. // SurfaceHolder.Callback interface.
@ -155,6 +205,8 @@ public class SurfaceViewRenderer
public void surfaceCreated(final SurfaceHolder holder) { public void surfaceCreated(final SurfaceHolder holder) {
ThreadUtils.checkIsOnMainThread(); ThreadUtils.checkIsOnMainThread();
eglRenderer.createEglSurface(holder.getSurface()); eglRenderer.createEglSurface(holder.getSurface());
surfaceWidth = surfaceHeight = 0;
updateSurfaceSize();
} }
@Override @Override
@ -173,6 +225,7 @@ public class SurfaceViewRenderer
@Override @Override
public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) { public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {
ThreadUtils.checkIsOnMainThread(); ThreadUtils.checkIsOnMainThread();
logD("surfaceChanged: format: " + format + " size: " + width + "x" + height);
eglRenderer.surfaceSizeChanged(width, height); eglRenderer.surfaceSizeChanged(width, height);
} }
@ -207,6 +260,7 @@ public class SurfaceViewRenderer
post(new Runnable() { post(new Runnable() {
@Override @Override
public void run() { public void run() {
updateSurfaceSize();
requestLayout(); requestLayout();
} }
}); });

View File

@ -35,8 +35,8 @@ import java.util.ArrayList;
import java.util.List; import java.util.List;
import org.appspot.apprtc.AppRTCClient.RoomConnectionParameters; import org.appspot.apprtc.AppRTCClient.RoomConnectionParameters;
import org.appspot.apprtc.AppRTCClient.SignalingParameters; import org.appspot.apprtc.AppRTCClient.SignalingParameters;
import org.appspot.apprtc.PeerConnectionClient.PeerConnectionParameters;
import org.appspot.apprtc.PeerConnectionClient.DataChannelParameters; import org.appspot.apprtc.PeerConnectionClient.DataChannelParameters;
import org.appspot.apprtc.PeerConnectionClient.PeerConnectionParameters;
import org.webrtc.Camera1Enumerator; import org.webrtc.Camera1Enumerator;
import org.webrtc.Camera2Enumerator; import org.webrtc.Camera2Enumerator;
import org.webrtc.CameraEnumerator; import org.webrtc.CameraEnumerator;
@ -225,6 +225,8 @@ public class CallActivity extends Activity implements AppRTCClient.SignalingEven
remoteRenderScreen.init(rootEglBase.getEglBaseContext(), null); remoteRenderScreen.init(rootEglBase.getEglBaseContext(), null);
localRender.setZOrderMediaOverlay(true); localRender.setZOrderMediaOverlay(true);
localRender.setEnableHardwareScaler(true /* enabled */);
remoteRenderScreen.setEnableHardwareScaler(true /* enabled */);
updateVideoView(); updateVideoView();
// Check for mandatory permissions. // Check for mandatory permissions.