Home | History | Annotate | Download | only in imagesaver
      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.imagesaver;
     18 
     19 import com.android.camera.app.OrientationManager;
     20 import com.android.camera.async.SafeCloseable;
     21 import com.android.camera.one.OneCamera;
     22 import com.android.camera.one.v2.camera2proxy.ImageProxy;
     23 import com.android.camera.one.v2.camera2proxy.TotalCaptureResultProxy;
     24 import com.android.camera.session.CaptureSession;
     25 import com.google.common.util.concurrent.ListenableFuture;
     26 
     27 import javax.annotation.ParametersAreNonnullByDefault;
     28 import javax.annotation.concurrent.NotThreadSafe;
     29 import javax.annotation.concurrent.ThreadSafe;
     30 
     31 /**
     32  * An ImageSaver represents a single transaction which may involve processing
     33  * one or more full-size and thumbnail images of varying formats resulting from
     34  * a burst.
     35  * <p>
     36  * Methods will be called on the same thread according to the following state
     37  * machine:<br>
     38  * (addThumbnail | addFullSizeImage)* close
     39  * <p>
     40  * ImageSaver instances will never be reused after close.
     41  * <p>
     42  * ImageSaver does not have to be thread-safe because instances are confined to
     43  * the thread they are created on.
     44  */
     45 @ParametersAreNonnullByDefault
     46 @NotThreadSafe
     47 public interface ImageSaver extends SafeCloseable {
     48     /**
     49      * Creates ImageSaver instances.
     50      * <p>
     51      * The same builder may be used simultaneously on multiple threads, so it
     52      * must be thread-safe. However, ImageSaver instances are confined to the
     53      * thread they are created on, so they do not need to be thread-safe.
     54      */
     55     @ThreadSafe
     56     public interface Builder {
     57         /**
     58          * Creates a new ImageSaver which will be used to process and save a
     59          * single set of images.
     60          */
     61         public ImageSaver build(
     62                 OneCamera.PictureSaverCallback pictureSaverCallback,
     63                 OrientationManager.DeviceOrientation orientation,
     64                 CaptureSession session);
     65     }
     66 
     67     /**
     68      * Adds a thumbnail image to be processed.
     69      * <p>
     70      * Implementations must eventually close the image and must tolerate
     71      * duplicate and out-of-order images.
     72      */
     73     public void addThumbnail(ImageProxy imageProxy);
     74 
     75     /**
     76      * Adds a full-size image to be processed along with a future to its
     77      * metadata. Note that the metadata future may be cancelled or result in an
     78      * exception if the camera system is being closed or the hardware reports an
     79      * error.
     80      * <p>
     81      * Implementations must eventually close the image and must tolerate
     82      * duplicate and out-of-order images.
     83      */
     84     public void addFullSizeImage(ImageProxy imageProxy, ListenableFuture<TotalCaptureResultProxy>
     85             metadata);
     86 
     87     /**
     88      * Indicates that no more images will be added.
     89      */
     90     public void close();
     91 }
     92