Home | History | Annotate | Download | only in commands
      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.one.v2.commands;
     18 
     19 import android.hardware.camera2.CameraAccessException;
     20 
     21 import com.android.camera.one.v2.camera2proxy.CameraCaptureSessionClosedException;
     22 import com.android.camera.one.v2.core.FrameServer;
     23 import com.android.camera.one.v2.core.FrameServer.RequestType;
     24 import com.android.camera.one.v2.core.Request;
     25 import com.android.camera.one.v2.core.RequestBuilder;
     26 import com.android.camera.one.v2.core.ResourceAcquisitionFailedException;
     27 import com.android.camera.util.ApiHelper;
     28 
     29 import java.util.ArrayList;
     30 import java.util.Arrays;
     31 import java.util.List;
     32 import java.util.concurrent.atomic.AtomicBoolean;
     33 
     34 /**
     35  * Delegate the first run of a frameserver command to a different
     36  * camera command than subsequent executions.
     37  */
     38 public class ZslPreviewCommand implements CameraCommand {
     39     private final FrameServer mFrameServer;
     40     private final RequestBuilder.Factory mPreviewWarmupRequestBuilder;
     41     private final int mPreviewWarmupRequestType;
     42     private final RequestBuilder.Factory mZslRequestBuilder;
     43     private final int mZslRequestType;
     44     private final RequestBuilder.Factory mZslAndPreviewRequestBuilder;
     45     private final int mZslAndPreviewRequestType;
     46     private final int mWarmupBurstSize;
     47     private final AtomicBoolean mIsFirstRun;
     48 
     49     /**
     50      * Constructs a Preview. Note that it is the responsiblity of the
     51      * {@link RequestBuilder.Factory} to attach the relevant
     52      * {@link com.android.camera.one.v2.core.CaptureStream}s, such as the
     53      * viewfinder surface.
     54      */
     55     public ZslPreviewCommand(FrameServer frameServer,
     56           RequestBuilder.Factory previewWarmupRequestBuilder,
     57           int previewWarmupRequestType,
     58           RequestBuilder.Factory zslRequestBuilder,
     59           int zslRequestType,
     60           RequestBuilder.Factory zslAndPreviewRequestBuilder,
     61           int zslAndPreviewRequestType,
     62           int warmupBurstSize) {
     63         mFrameServer = frameServer;
     64         mPreviewWarmupRequestBuilder = previewWarmupRequestBuilder;
     65         mPreviewWarmupRequestType = previewWarmupRequestType;
     66         mZslRequestBuilder = zslRequestBuilder;
     67         mZslRequestType = zslRequestType;
     68         mZslAndPreviewRequestBuilder = zslAndPreviewRequestBuilder;
     69         mZslAndPreviewRequestType = zslAndPreviewRequestType;
     70         mWarmupBurstSize = warmupBurstSize;
     71         mIsFirstRun = new AtomicBoolean(true);
     72     }
     73 
     74     public void run() throws InterruptedException, CameraAccessException,
     75           CameraCaptureSessionClosedException, ResourceAcquisitionFailedException {
     76         try (FrameServer.Session session = mFrameServer.createExclusiveSession()) {
     77             if (mIsFirstRun.getAndSet(false)) {
     78                 if (ApiHelper.isLorLMr1() && ApiHelper.IS_NEXUS_6) {
     79                     // This is the work around of the face detection failure in b/20724126.
     80                     // We need to request a single preview frame followed by a burst of 5-frame ZSL
     81                     // before requesting the repeating preview and ZSL requests. We do it only for
     82                     // L, Nexus 6 and Haleakala.
     83                     List<Request> previewWarming = createWarmupBurst(mPreviewWarmupRequestBuilder,
     84                             mPreviewWarmupRequestType, 1);
     85                     session.submitRequest(previewWarming, RequestType.NON_REPEATING);
     86                 }
     87 
     88                 // Only run a warmup burst the first time this command is executed.
     89                 List<Request> zslWarmingBurst =
     90                       createWarmupBurst(mZslRequestBuilder, mZslRequestType, mWarmupBurstSize);
     91                 session.submitRequest(zslWarmingBurst, RequestType.NON_REPEATING);
     92             }
     93 
     94             // Build the zsl + preview repeating request.
     95             RequestBuilder zslAndPreviewRequest = mZslAndPreviewRequestBuilder.create(
     96                   mZslAndPreviewRequestType);
     97             List<Request> zslAndPreviewRepeating = Arrays.asList(zslAndPreviewRequest.build());
     98 
     99             // Submit the normal repeating request.
    100             session.submitRequest(zslAndPreviewRepeating, RequestType.REPEATING);
    101         }
    102     }
    103 
    104     private List<Request> createWarmupBurst(RequestBuilder.Factory builder, int type, int size)
    105           throws CameraAccessException {
    106         RequestBuilder zslRequest = builder.create(type);
    107         Request zslWarmingRequest = zslRequest.build();
    108         List<Request> zslWarmingBurst = new ArrayList<>(size);
    109         for (int i = 0; i < size; i++) {
    110             zslWarmingBurst.add(zslWarmingRequest);
    111         }
    112         return zslWarmingBurst;
    113     }
    114 }
    115