summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTyler Gunn <tgunn@google.com>2014-08-25 11:25:43 -0700
committerTyler Gunn <tgunn@google.com>2014-08-25 11:25:43 -0700
commit0cd1f191a1645d6abf2b7475d33e531f35c91386 (patch)
tree33f574b90917da1df15cbffb6d495be780ff7608
parent35aec58f4f58006399b22332e8c024d8b154e544 (diff)
Setting SurfaceTexture buffer size for display and preview surfaces.
When setting a surface for the Camera, it is important to ensure the buffer size is set before the surface is created. To fix this: The Surface passed to the Video Telephony layer is not created until the buffer size is set. The display surface buffer size is set when created. Setting the preview buffer size is deferred until the camera dimensions are received from the video provider. Bug: 16012946 Change-Id: I2130c029133ae6e5d670188e8d269ee6ac8bd675
-rw-r--r--InCallUI/src/com/android/incallui/VideoCallFragment.java100
1 files changed, 90 insertions, 10 deletions
diff --git a/InCallUI/src/com/android/incallui/VideoCallFragment.java b/InCallUI/src/com/android/incallui/VideoCallFragment.java
index 8e0b3a398..0b5bb4b23 100644
--- a/InCallUI/src/com/android/incallui/VideoCallFragment.java
+++ b/InCallUI/src/com/android/incallui/VideoCallFragment.java
@@ -36,6 +36,11 @@ public class VideoCallFragment extends BaseFragment<VideoCallPresenter,
VideoCallPresenter.VideoCallUi> implements VideoCallPresenter.VideoCallUi {
/**
+ * Used to indicate that the surface dimensions are not set.
+ */
+ private static final int DIMENSIONS_NOT_SET = -1;
+
+ /**
* Surface ID for the display surface.
*/
public static final int SURFACE_DISPLAY = 1;
@@ -79,6 +84,16 @@ public class VideoCallFragment extends BaseFragment<VideoCallPresenter,
private boolean mIsLandscape;
/**
+ * The width of the surface.
+ */
+ private int mWidth = DIMENSIONS_NOT_SET;
+
+ /**
+ * The height of the surface.
+ */
+ private int mHeight = DIMENSIONS_NOT_SET;
+
+ /**
* Inner-class representing a {@link TextureView} and its associated {@link SurfaceTexture} and
* {@link Surface}. Used to manage the lifecycle of these objects across device orientation
* changes.
@@ -97,7 +112,22 @@ public class VideoCallFragment extends BaseFragment<VideoCallPresenter,
* @param textureView The {@link TextureView} for the surface.
*/
public VideoCallSurface(int surfaceId, TextureView textureView) {
+ this(surfaceId, textureView, DIMENSIONS_NOT_SET, DIMENSIONS_NOT_SET);
+ }
+
+ /**
+ * Creates an instance of a {@link VideoCallSurface}.
+ *
+ * @param surfaceId The surface ID of the surface.
+ * @param textureView The {@link TextureView} for the surface.
+ * @param width The width of the surface.
+ * @param height The height of the surface.
+ */
+ public VideoCallSurface(int surfaceId, TextureView textureView, int width, int height) {
+ mWidth = width;
+ mHeight = height;
mSurfaceId = surfaceId;
+
recreateView(textureView);
}
@@ -128,16 +158,22 @@ public class VideoCallFragment extends BaseFragment<VideoCallPresenter,
@Override
public void onSurfaceTextureAvailable(SurfaceTexture surfaceTexture, int width,
int height) {
+ boolean surfaceCreated;
// Where there is no saved {@link SurfaceTexture} available, use the newly created one.
// If a saved {@link SurfaceTexture} is available, we are re-creating after an
// orientation change.
if (mSavedSurfaceTexture == null) {
mSavedSurfaceTexture = surfaceTexture;
- mSavedSurface = new Surface(mSavedSurfaceTexture);
+ surfaceCreated = createSurface();
+ } else {
+ // A saved SurfaceTexture was found.
+ surfaceCreated = true;
}
// Inform presenter that the surface is available.
- getPresenter().onSurfaceCreated(mSurfaceId);
+ if (surfaceCreated) {
+ getPresenter().onSurfaceCreated(mSurfaceId);
+ }
}
/**
@@ -220,6 +256,35 @@ public class VideoCallFragment extends BaseFragment<VideoCallPresenter,
}
/**
+ * Sets the dimensions of the surface.
+ *
+ * @param width The width of the surface, in pixels.
+ * @param height The height of the surface, in pixels.
+ */
+ public void setSurfaceDimensions(int width, int height) {
+ mWidth = width;
+ mHeight = height;
+
+ if (mSavedSurfaceTexture != null) {
+ createSurface();
+ }
+ }
+
+ /**
+ * Creates the {@link Surface}, adjusting the {@link SurfaceTexture} buffer size.
+ */
+ private boolean createSurface() {
+ if (mWidth != DIMENSIONS_NOT_SET && mHeight != DIMENSIONS_NOT_SET &&
+ mSavedSurfaceTexture != null) {
+
+ mSavedSurfaceTexture.setDefaultBufferSize(mWidth, mHeight);
+ mSavedSurface = new Surface(mSavedSurfaceTexture);
+ return true;
+ }
+ return false;
+ }
+
+ /**
* Handles a user clicking the surface, which is the trigger to toggle the full screen
* Video UI.
*
@@ -460,6 +525,8 @@ public class VideoCallFragment extends BaseFragment<VideoCallPresenter,
params.width = width;
params.height = height;
preview.setLayoutParams(params);
+
+ sPreviewSurface.setSurfaceDimensions(width, height);
}
}
@@ -474,13 +541,16 @@ public class VideoCallFragment extends BaseFragment<VideoCallPresenter,
if (mVideoViews != null) {
TextureView displaySurface = (TextureView) mVideoViews.findViewById(R.id.incomingVideo);
- setSurfaceSizeAndTranslation(displaySurface);
+
+ Point screenSize = getScreenSize();
+ setSurfaceSizeAndTranslation(displaySurface, screenSize);
if (!sVideoSurfacesInUse) {
// Where the video surfaces are not already in use (first time creating them),
// setup new VideoCallSurface instances to track them.
sDisplaySurface = new VideoCallSurface(SURFACE_DISPLAY,
- (TextureView) mVideoViews.findViewById(R.id.incomingVideo));
+ (TextureView) mVideoViews.findViewById(R.id.incomingVideo), screenSize.x,
+ screenSize.y);
sPreviewSurface = new VideoCallSurface(SURFACE_PREVIEW,
(TextureView) mVideoViews.findViewById(R.id.previewVideo));
sVideoSurfacesInUse = true;
@@ -500,13 +570,9 @@ public class VideoCallFragment extends BaseFragment<VideoCallPresenter,
* centered vertically below the call card.
*
* @param textureView The {@link TextureView} to resize and position.
+ * @param size The size of the screen.
*/
- private void setSurfaceSizeAndTranslation(TextureView textureView) {
- // Get current screen size.
- Display display = getActivity().getWindowManager().getDefaultDisplay();
- Point size = new Point();
- display.getSize(size);
-
+ private void setSurfaceSizeAndTranslation(TextureView textureView, Point size) {
// Set the surface to have that size.
ViewGroup.LayoutParams params = textureView.getLayoutParams();
params.width = size.x;
@@ -522,4 +588,18 @@ public class VideoCallFragment extends BaseFragment<VideoCallPresenter,
centerDisplayView(textureView);
}
}
+
+ /**
+ * Determines the size of the device screen.
+ *
+ * @return {@link Point} specifying the width and height of the screen.
+ */
+ private Point getScreenSize() {
+ // Get current screen size.
+ Display display = getActivity().getWindowManager().getDefaultDisplay();
+ Point size = new Point();
+ display.getSize(size);
+
+ return size;
+ }
}