2 * Copyright (C) 2015 The Android Open Source Project
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
8 * http://www.apache.org/licenses/LICENSE-2.0
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
17 package com.android.camera.captureintent.resource;
19 import com.android.camera.async.MainThread;
20 import com.android.camera.async.RefCountBase;
21 import com.android.camera.captureintent.PreviewTransformCalculator;
22 import com.android.camera.debug.Log;
23 import com.android.camera.util.Size;
25 import android.graphics.Matrix;
26 import android.graphics.SurfaceTexture;
27 import android.view.Surface;
29 import javax.annotation.ParametersAreNonnullByDefault;
31 @ParametersAreNonnullByDefault
32 public class ResourceSurfaceTextureImpl implements ResourceSurfaceTexture {
33 private static final Log.Tag TAG = new Log.Tag("ResSurfaceTexture");
35 private final RefCountBase<ResourceConstructed> mResourceConstructed;
37 /** The surface texture. */
38 private final SurfaceTexture mSurfaceTexture;
40 /** The preview stream size. */
41 private Size mPreviewSize;
43 /** The preview layout size. */
44 private Size mPreviewLayoutSize;
46 /** The default buffer size in SurfaceTexture. */
47 private Size mSurfaceTextureDefaultBufferSize;
49 private final PreviewTransformCalculator mPreviewTransformCalculator;
52 * Creates a reference counted {@link ResourceSurfaceTextureImpl} object.
54 public static RefCountBase<ResourceSurfaceTexture> create(
55 RefCountBase<ResourceConstructed> resourceConstructed,
56 SurfaceTexture surfaceTexture) {
57 ResourceSurfaceTexture resourceSurfaceTexture = new ResourceSurfaceTextureImpl(
60 new PreviewTransformCalculator(resourceConstructed.get().getOrientationManager()));
61 return new RefCountBase<>(resourceSurfaceTexture);
64 protected ResourceSurfaceTextureImpl(
65 RefCountBase<ResourceConstructed> resourceConstructed,
66 SurfaceTexture surfaceTexture,
67 PreviewTransformCalculator previewTransformCalculator) {
68 mResourceConstructed = resourceConstructed;
69 mResourceConstructed.addRef();
70 mSurfaceTexture = surfaceTexture;
71 mPreviewTransformCalculator = previewTransformCalculator;
72 mPreviewSize = new Size(0, 0);
73 mPreviewLayoutSize = new Size(0, 0);
74 mSurfaceTextureDefaultBufferSize = new Size(0, 0);
77 public RefCountBase<ResourceConstructed> getResourceConstructed() {
78 return mResourceConstructed;
82 public Surface createPreviewSurface() {
83 return new Surface(mSurfaceTexture);
87 public Size getPreviewSize() {
92 public Size getPreviewLayoutSize() {
93 return mPreviewLayoutSize;
97 public void setPreviewSize(Size previewSize) {
98 // Update preview transform when preview stream size is changed.
99 mPreviewSize = previewSize;
101 // Update surface texture's default buffer size. See b/17286155.
102 mSurfaceTexture.setDefaultBufferSize(mPreviewSize.width(), mPreviewSize.height());
106 public void setPreviewLayoutSize(Size previewLayoutSize) {
107 MainThread.checkMainThread();
109 // Update preview transform when preview layout size is changed.
110 if (!mPreviewLayoutSize.equals(previewLayoutSize)) {
111 mPreviewLayoutSize = previewLayoutSize;
112 updatePreviewTransform();
117 * Updates the default buffer size in SurfaceTexture with the configured
118 * preview stream size.
120 protected void updateSurfaceTextureDefaultBufferSize(Size defaultBufferSize) {
121 mSurfaceTexture.setDefaultBufferSize(defaultBufferSize.width(), defaultBufferSize.height());
125 public void updatePreviewTransform() {
126 MainThread.checkMainThread();
127 if (mPreviewSize.getWidth() == 0 || mPreviewSize.getHeight() == 0 ||
128 mPreviewLayoutSize.getWidth() == 0 || mPreviewLayoutSize.getHeight() == 0) {
131 Matrix transformMatrix = mPreviewTransformCalculator.toTransformMatrix(
132 mPreviewLayoutSize, mPreviewSize);
133 mResourceConstructed.get().getModuleUI().updatePreviewTransform(transformMatrix);
137 public void close() {
138 mResourceConstructed.close();