summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--core/java/android/view/TextureView.java46
1 files changed, 30 insertions, 16 deletions
diff --git a/core/java/android/view/TextureView.java b/core/java/android/view/TextureView.java
index ab4aed3783e3..0c0cd7629eea 100644
--- a/core/java/android/view/TextureView.java
+++ b/core/java/android/view/TextureView.java
@@ -78,7 +78,7 @@ import android.util.Log;
* }
*
* public void onSurfaceTextureUpdated(SurfaceTexture surface) {
- * // Ignored
+ * // Invoked every time there's a new Camera preview frame
* }
* }
* </pre>
@@ -102,12 +102,9 @@ public class TextureView extends View {
private boolean mOpaque = true;
- private final Runnable mUpdateLayerAction = new Runnable() {
- @Override
- public void run() {
- updateLayer();
- }
- };
+ private final Object[] mLock = new Object[0];
+ private boolean mUpdateLayer;
+
private SurfaceTexture.OnFrameAvailableListener mUpdateListener;
/**
@@ -170,7 +167,7 @@ public class TextureView extends View {
public void setOpaque(boolean opaque) {
if (opaque != mOpaque) {
mOpaque = opaque;
- if (mLayer != null) updateLayer();
+ updateLayer();
}
}
@@ -243,6 +240,7 @@ public class TextureView extends View {
*/
@Override
public final void draw(Canvas canvas) {
+ applyUpdate();
}
/**
@@ -268,11 +266,11 @@ public class TextureView extends View {
@Override
HardwareLayer getHardwareLayer() {
- if (mAttachInfo == null || mAttachInfo.mHardwareRenderer == null) {
- return null;
- }
-
if (mLayer == null) {
+ if (mAttachInfo == null || mAttachInfo.mHardwareRenderer == null) {
+ return null;
+ }
+
mLayer = mAttachInfo.mHardwareRenderer.createHardwareLayer(mOpaque);
mSurface = mAttachInfo.mHardwareRenderer.createSurfaceTexture(mLayer);
nSetDefaultBufferSize(mSurface, getWidth(), getHeight());
@@ -282,7 +280,10 @@ public class TextureView extends View {
public void onFrameAvailable(SurfaceTexture surfaceTexture) {
// Per SurfaceTexture's documentation, the callback may be invoked
// from an arbitrary thread
- post(mUpdateLayerAction);
+ synchronized (mLock) {
+ mUpdateLayer = true;
+ }
+ postInvalidateDelayed(0);
}
};
mSurface.setOnFrameAvailableListener(mUpdateListener);
@@ -292,6 +293,8 @@ public class TextureView extends View {
}
}
+ applyUpdate();
+
return mLayer;
}
@@ -313,17 +316,28 @@ public class TextureView extends View {
}
private void updateLayer() {
- if (mAttachInfo == null || mAttachInfo.mHardwareRenderer == null) {
+ mUpdateLayer = true;
+ invalidate();
+ }
+
+ private void applyUpdate() {
+ if (mLayer == null) {
return;
}
+ synchronized (mLock) {
+ if (mUpdateLayer) {
+ mUpdateLayer = false;
+ } else {
+ return;
+ }
+ }
+
mLayer.update(getWidth(), getHeight(), mOpaque);
if (mListener != null) {
mListener.onSurfaceTextureUpdated(mSurface);
}
-
- invalidate();
}
/**