diff options
-rw-r--r-- | src/com/android/camera/SurfaceTextureRenderer.java | 42 | ||||
-rw-r--r-- | src/com/android/camera/VideoModule.java | 21 |
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(); } |