summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--src/com/android/camera/SurfaceTextureRenderer.java42
-rw-r--r--src/com/android/camera/VideoModule.java21
2 files changed, 29 insertions, 34 deletions
diff --git a/src/com/android/camera/SurfaceTextureRenderer.java b/src/com/android/camera/SurfaceTextureRenderer.java
index 69897cad8..ee557f88b 100644
--- a/src/com/android/camera/SurfaceTextureRenderer.java
+++ b/src/com/android/camera/SurfaceTextureRenderer.java
@@ -44,6 +44,8 @@ public class SurfaceTextureRenderer {
private EGL10 mEgl;
private GL10 mGl;
+ private volatile boolean mDrawPending = false;
+
private final Handler mEglHandler;
private final FrameDrawer mFrameDrawer;
@@ -55,32 +57,13 @@ public class SurfaceTextureRenderer {
if (mEglDisplay != null && mEglSurface != null) {
mFrameDrawer.onDrawFrame(mGl);
mEgl.eglSwapBuffers(mEglDisplay, mEglSurface);
+ mDrawPending = false;
}
mRenderLock.notifyAll();
}
}
};
- public class RenderThread extends Thread {
- private Boolean mRenderStopped = false;
-
- @Override
- public void run() {
- while (true) {
- synchronized (mRenderStopped) {
- if (mRenderStopped) return;
- }
- draw(true);
- }
- }
-
- public void stopRender() {
- synchronized (mRenderStopped) {
- mRenderStopped = true;
- }
- }
- }
-
public SurfaceTextureRenderer(SurfaceTexture tex,
Handler handler, FrameDrawer renderer) {
mEglHandler = handler;
@@ -89,10 +72,6 @@ public class SurfaceTextureRenderer {
initialize(tex);
}
- public RenderThread createRenderThread() {
- return new RenderThread();
- }
-
public void release() {
mEglHandler.post(new Runnable() {
@Override
@@ -116,12 +95,15 @@ public class SurfaceTextureRenderer {
*/
public void draw(boolean sync) {
synchronized (mRenderLock) {
- mEglHandler.post(mRenderTask);
- if (sync) {
- try {
- mRenderLock.wait();
- } catch (InterruptedException ex) {
- Log.v(TAG, "RenderLock.wait() interrupted");
+ if (!mDrawPending) {
+ mEglHandler.post(mRenderTask);
+ mDrawPending = true;
+ if (sync) {
+ try {
+ mRenderLock.wait();
+ } catch (InterruptedException ex) {
+ Log.v(TAG, "RenderLock.wait() interrupted");
+ }
}
}
}
diff --git a/src/com/android/camera/VideoModule.java b/src/com/android/camera/VideoModule.java
index f855d952c..73e5548ec 100644
--- a/src/com/android/camera/VideoModule.java
+++ b/src/com/android/camera/VideoModule.java
@@ -699,7 +699,9 @@ public class VideoModule extends CameraModule
startVideoRecording();
}
mAppController.setShutterEnabled(false);
- mFocusManager.onShutterUp(mCameraSettings.getCurrentFocusMode());
+ if (mCameraSettings != null) {
+ mFocusManager.onShutterUp(mCameraSettings.getCurrentFocusMode());
+ }
// Keep the shutter button disabled when in video capture intent
// mode and recording is stopped. It'll be re-enabled when
@@ -950,9 +952,16 @@ public class VideoModule extends CameraModule
@Override
public void stopPreview() {
- if (!mPreviewing || mCameraDevice == null) {
+ if (!mPreviewing) {
+ Log.v(TAG, "Skip stopPreview since it's not mPreviewing");
+ return;
+ }
+ if (mCameraDevice == null) {
+ Log.v(TAG, "Skip stopPreview since mCameraDevice is null");
return;
}
+
+ Log.v(TAG, "stopPreview");
mCameraDevice.stopPreview();
if (mFocusManager != null) {
mFocusManager.onPreviewStopped();
@@ -1400,14 +1409,14 @@ public class VideoModule extends CameraModule
}
private boolean stopVideoRecording() {
- Log.i(TAG, "stopVideoRecording");
-
// Do nothing if camera device is still capturing photo. Monkey test can trigger app crashes
// (b/17313985) without this check. Crash could also be reproduced by continuously tapping
// on shutter button and preview with two fingers.
if (mSnapshotInProgress) {
+ Log.v(TAG, "Skip stopVideoRecording since snapshot in progress");
return true;
}
+ Log.v(TAG, "stopVideoRecording");
mUI.setSwipingEnabled(true);
mUI.showFocusUI(true);
@@ -1438,6 +1447,10 @@ public class VideoModule extends CameraModule
// during recording. Release the camera as soon as possible because
// face unlock or other applications may need to use the camera.
if (mPaused) {
+ // b/16300704: Monkey is fast so it could pause the module while recording.
+ // stopPreview should definitely be called before switching off.
+ stopPreview();
+
closeCamera();
}