1 /* 2 * Copyright (C) 2015 The Android Open Source Project 3 * 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 7 * 8 * http://www.apache.org/licenses/LICENSE-2.0 9 * 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. 15 */ 16 17 package com.android.camera.burst; 18 19 import android.view.Surface; 20 21 import com.android.camera.async.Lifetime; 22 import com.android.camera.async.MainThread; 23 import com.android.camera.one.v2.commands.CameraCommandExecutor; 24 import com.android.camera.one.v2.core.FrameServer; 25 import com.android.camera.one.v2.core.Request; 26 import com.android.camera.one.v2.core.RequestBuilder; 27 import com.android.camera.one.v2.sharedimagereader.ManagedImageReader; 28 import com.google.common.base.Preconditions; 29 30 import javax.annotation.Nullable; 31 import javax.annotation.ParametersAreNonnullByDefault; 32 33 @ParametersAreNonnullByDefault 34 public class BurstTakerImpl implements BurstTaker { 35 36 private final CameraCommandExecutor mCameraCommandExecutor; 37 private final FrameServer mFrameServer; 38 private final ManagedImageReader mImageFactory; 39 private final RequestBuilder.Factory mRequestBuilder; 40 private final Surface mBurstInputSurface; 41 private final Runnable mRestorePreviewCommand; 42 private final int mMaxImageCount; 43 /** 44 * The lifetime of the burst, the burst stops capturing images once the 45 * lifetime is closed 46 */ 47 @Nullable 48 private Lifetime mBurstLifetime; 49 50 /** 51 * Creates an instance for burst taker. 52 * <p/> 53 * 54 * @param cameraCommandExecutor the executor to use for executing 55 * {@link BurstCaptureCommand} 56 * @param frameServer the {@link FrameServer} instance for creating session 57 * @param builder factory to use for creating the {@link Request} for burst 58 * capture 59 * @param imageFactory the factory to use for creating a stream of images 60 * @param burstInputSurface the input surface to use for streaming preview 61 * frames to burst 62 * @param restorePreviewCommand the command to run to restore the preview, 63 * once burst capture is complete 64 * @param maxImageCount the maximum number of images supported by the image 65 * reader 66 */ 67 public BurstTakerImpl(CameraCommandExecutor cameraCommandExecutor, 68 FrameServer frameServer, RequestBuilder.Factory builder, 69 ManagedImageReader imageFactory, Surface burstInputSurface, 70 Runnable restorePreviewCommand, 71 int maxImageCount) { 72 mCameraCommandExecutor = cameraCommandExecutor; 73 mFrameServer = frameServer; 74 mRequestBuilder = builder; 75 mImageFactory = imageFactory; 76 mBurstInputSurface = burstInputSurface; 77 mRestorePreviewCommand = restorePreviewCommand; 78 mMaxImageCount = maxImageCount; 79 } 80 81 @Override 82 public void startBurst(EvictionHandler evictionHandler, 83 BurstController burstController) { 84 MainThread.checkMainThread(); 85 Preconditions.checkState(mBurstLifetime == null, 86 "Burst cannot be started, while another is running."); 87 mBurstLifetime = new Lifetime(); 88 BurstCaptureCommand burstCommand = new BurstCaptureCommand( 89 mFrameServer, mRequestBuilder, 90 mImageFactory, mBurstInputSurface, 91 mBurstLifetime, evictionHandler, burstController, mRestorePreviewCommand, 92 mMaxImageCount); 93 94 mCameraCommandExecutor.execute(burstCommand); 95 } 96 97 @Override 98 public synchronized void stopBurst() { 99 MainThread.checkMainThread(); 100 if (mBurstLifetime != null) { 101 mBurstLifetime.close(); 102 mBurstLifetime = null; 103 } 104 } 105 } 106