| Index: webrtc/api/android/java/src/org/webrtc/SurfaceViewRenderer.java
|
| diff --git a/webrtc/api/android/java/src/org/webrtc/SurfaceViewRenderer.java b/webrtc/api/android/java/src/org/webrtc/SurfaceViewRenderer.java
|
| index eaaf24b17374ccca6d5445b44461504d11df0dc8..5b19c431794602c1c045c74bb2df68124a4f438e 100644
|
| --- a/webrtc/api/android/java/src/org/webrtc/SurfaceViewRenderer.java
|
| +++ b/webrtc/api/android/java/src/org/webrtc/SurfaceViewRenderer.java
|
| @@ -77,11 +77,12 @@ public class SurfaceViewRenderer
|
| // |isSurfaceCreated| keeps track of the current status in surfaceCreated()/surfaceDestroyed().
|
| private boolean isSurfaceCreated;
|
| // Last rendered frame dimensions, or 0 if no frame has been rendered yet.
|
| - private int frameWidth;
|
| - private int frameHeight;
|
| + private int rotatedFrameWidth;
|
| + private int rotatedFrameHeight;
|
| private int frameRotation;
|
| - // |scalingType| determines how the video will fill the allowed layout area in onMeasure().
|
| - private RendererCommon.ScalingType scalingType = RendererCommon.ScalingType.SCALE_ASPECT_BALANCED;
|
| + private final RendererCommon.VideoLayoutMeasure videoLayoutMeasure =
|
| + new RendererCommon.VideoLayoutMeasure();
|
| +
|
| // If true, mirrors the video stream horizontally.
|
| private boolean mirror;
|
| // Callback for reporting renderer events.
|
| @@ -243,8 +244,8 @@ public class SurfaceViewRenderer
|
| renderThread = null;
|
| // Reset statistics and event reporting.
|
| synchronized (layoutLock) {
|
| - frameWidth = 0;
|
| - frameHeight = 0;
|
| + rotatedFrameWidth = 0;
|
| + rotatedFrameHeight = 0;
|
| frameRotation = 0;
|
| rendererEvents = null;
|
| }
|
| @@ -278,9 +279,14 @@ public class SurfaceViewRenderer
|
| * Set how the video will fill the allowed layout area.
|
| */
|
| public void setScalingType(RendererCommon.ScalingType scalingType) {
|
| - synchronized (layoutLock) {
|
| - this.scalingType = scalingType;
|
| - }
|
| + ThreadUtils.checkIsOnMainThread();
|
| + videoLayoutMeasure.setScalingType(scalingType);
|
| + }
|
| +
|
| + public void setScalingType(RendererCommon.ScalingType scalingTypeMatchOrientation,
|
| + RendererCommon.ScalingType scalingTypeMismatchOrientation) {
|
| + ThreadUtils.checkIsOnMainThread();
|
| + videoLayoutMeasure.setScalingType(scalingTypeMatchOrientation, scalingTypeMismatchOrientation);
|
| }
|
|
|
| // VideoRenderer.Callbacks interface.
|
| @@ -309,33 +315,14 @@ public class SurfaceViewRenderer
|
| }
|
| }
|
|
|
| - // Returns desired layout size given current measure specification and video aspect ratio.
|
| - private Point getDesiredLayoutSize(int widthSpec, int heightSpec) {
|
| - synchronized (layoutLock) {
|
| - final int maxWidth = getDefaultSize(Integer.MAX_VALUE, widthSpec);
|
| - final int maxHeight = getDefaultSize(Integer.MAX_VALUE, heightSpec);
|
| - final Point size =
|
| - RendererCommon.getDisplaySize(scalingType, frameAspectRatio(), maxWidth, maxHeight);
|
| - if (MeasureSpec.getMode(widthSpec) == MeasureSpec.EXACTLY) {
|
| - size.x = maxWidth;
|
| - }
|
| - if (MeasureSpec.getMode(heightSpec) == MeasureSpec.EXACTLY) {
|
| - size.y = maxHeight;
|
| - }
|
| - return size;
|
| - }
|
| - }
|
| -
|
| // View layout interface.
|
| @Override
|
| protected void onMeasure(int widthSpec, int heightSpec) {
|
| + ThreadUtils.checkIsOnMainThread();
|
| final boolean isNewSize;
|
| synchronized (layoutLock) {
|
| - if (frameWidth == 0 || frameHeight == 0) {
|
| - super.onMeasure(widthSpec, heightSpec);
|
| - return;
|
| - }
|
| - desiredLayoutSize = getDesiredLayoutSize(widthSpec, heightSpec);
|
| + desiredLayoutSize =
|
| + videoLayoutMeasure.measure(widthSpec, heightSpec, rotatedFrameWidth, rotatedFrameHeight);
|
| isNewSize =
|
| (desiredLayoutSize.x != getMeasuredWidth() || desiredLayoutSize.y != getMeasuredHeight());
|
| setMeasuredDimension(desiredLayoutSize.x, desiredLayoutSize.y);
|
| @@ -487,8 +474,9 @@ public class SurfaceViewRenderer
|
| synchronized (layoutLock) {
|
| final float[] rotatedSamplingMatrix =
|
| RendererCommon.rotateTextureMatrix(frame.samplingMatrix, frame.rotationDegree);
|
| - final float[] layoutMatrix = RendererCommon.getLayoutMatrix(
|
| - mirror, frameAspectRatio(), (float) layoutSize.x / layoutSize.y);
|
| + final float[] layoutMatrix = RendererCommon.getLayoutMatrix(mirror,
|
| + frame.rotatedWidth() / (float) frame.rotatedHeight(),
|
| + layoutSize.x / (float) layoutSize.y);
|
| texMatrix = RendererCommon.multiplyMatrices(rotatedSamplingMatrix, layoutMatrix);
|
| }
|
|
|
| @@ -532,29 +520,18 @@ public class SurfaceViewRenderer
|
| }
|
| }
|
|
|
| - // Return current frame aspect ratio, taking rotation into account.
|
| - private float frameAspectRatio() {
|
| - synchronized (layoutLock) {
|
| - if (frameWidth == 0 || frameHeight == 0) {
|
| - return 0.0f;
|
| - }
|
| - return (frameRotation % 180 == 0) ? (float) frameWidth / frameHeight
|
| - : (float) frameHeight / frameWidth;
|
| - }
|
| - }
|
| -
|
| // Update frame dimensions and report any changes to |rendererEvents|.
|
| private void updateFrameDimensionsAndReportEvents(VideoRenderer.I420Frame frame) {
|
| synchronized (layoutLock) {
|
| - if (frameWidth != frame.width || frameHeight != frame.height
|
| + if (rotatedFrameWidth != frame.rotatedWidth() || rotatedFrameHeight != frame.rotatedHeight()
|
| || frameRotation != frame.rotationDegree) {
|
| Logging.d(TAG, getResourceName() + "Reporting frame resolution changed to " + frame.width
|
| + "x" + frame.height + " with rotation " + frame.rotationDegree);
|
| if (rendererEvents != null) {
|
| rendererEvents.onFrameResolutionChanged(frame.width, frame.height, frame.rotationDegree);
|
| }
|
| - frameWidth = frame.width;
|
| - frameHeight = frame.height;
|
| + rotatedFrameWidth = frame.rotatedWidth();
|
| + rotatedFrameHeight = frame.rotatedHeight();
|
| frameRotation = frame.rotationDegree;
|
| post(new Runnable() {
|
| @Override
|
|
|