1 /* 2 * Copyright (C) 2014 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.processing.imagebackend; 18 19 import com.google.common.base.Optional; 20 21 import com.android.camera.session.CaptureSession; 22 23 import java.util.Set; 24 import java.util.concurrent.Executor; 25 26 import javax.annotation.Nullable; 27 28 /** 29 * Defines interface between an ImageBackend object and a simplified camera 30 * object that merely delivers images to the backend. After the tasks and 31 * Android image is submitted to the ImageConsumer, the responsibility to close 32 * on the Android image object as early as possible is transferred to the 33 * implementation. Whether an image can be submitted again for process is up to 34 * the implementation of the consumer. For integration of Camera Application, we 35 * now pass in the CaptureSession in order to properly update filmstrip and UI. 36 * More generalized versions of functions of this interface allow a Runnable to 37 * be executed when the set of events and any spawned events have completed 38 * processing. 39 */ 40 public interface ImageConsumer { 41 42 /** 43 * ImageTaskFlags specifies the current tasks that will be run with an 44 * image. 45 * <ol> 46 * <li>CREATE_EARLY_FILMSTRIP_PREVIEW: Subsamples a YUV Image and converts 47 * it to an ARGB Image with nearly similar aspect ratio. ONLY Valid when 48 * specified with COMPRESS_TO_JPEG_AND_WRITE_TO_DISK. Otherwise, ignored.</li> 49 * <li>COMPRESS_TO_JPEG_AND_WRITE_TO_DISK: Compresses an YUV/JPEG Image to 50 * JPEG (when necessary), delivers the compressed artifact via the listener, 51 * and writes it to disk.</li> 52 * <li>CONVERT_TO_RGB_PREVIEW: Subsamples a YUV Image and converts the 53 * uncompressed output to ARGB image inset within a circle</li> 54 * <li>BLOCK_UNTIL_ALL_TASKS_RELEASE: Block on ReceiveImage call until image 55 * is released.</li> 56 * <li>CLOSE_ON_ALL_TASKS_RELEASE: Close the ImageProxy on ReceiveImage Call 57 * when all tasks release their image</li> 58 * </ol> 59 */ 60 public enum ImageTaskFlags { 61 CREATE_EARLY_FILMSTRIP_PREVIEW, 62 COMPRESS_TO_JPEG_AND_WRITE_TO_DISK, 63 CONVERT_TO_RGB_PREVIEW, 64 BLOCK_UNTIL_ALL_TASKS_RELEASE, 65 CLOSE_ON_ALL_TASKS_RELEASE 66 } 67 68 /** 69 * Provides the basic functionality of camera processing via an easy-to-use 70 * method call. Feel free to expand this implementation by increasing the 71 * types of common tasks in the enum ImageTaskFlags. This version of the call 72 * also automatically registers at time of task submission and unregisters 73 * the listener at the time when all tasks and associated spawned tasks have 74 * completed their processing. 75 * 76 * @param img image to be processed 77 * @param executor The executor on which to execute events and image close 78 * @param processingFlags {@see ImageTaskFlags} 79 * @param imageProcessorListener Optional listener to automatically register 80 * at task submission and unregister after all tasks are done 81 * @return Whether any tasks were actually added. 82 * @throws InterruptedException occurs when call is set to be blocking and 83 * is interrupted. 84 */ receiveImage(ImageToProcess img, Executor executor, Set<ImageTaskFlags> processingFlags, CaptureSession captureSession, Optional<ImageProcessorListener> imageProcessorListener)85 public boolean receiveImage(ImageToProcess img, Executor executor, 86 Set<ImageTaskFlags> processingFlags, CaptureSession captureSession, 87 Optional<ImageProcessorListener> imageProcessorListener) 88 throws InterruptedException; 89 90 /** 91 * Provides the basic functionality of camera processing via an easy-to-use 92 * method call w/o a listener to be released. 93 * 94 * @param img image to be processed 95 * @param executor executor on which to execute events and image close 96 * @param processingFlags {@see ImageTaskFlags} 97 * @return Whether any tasks were actually added. 98 * @throws InterruptedException occurs when call is set to be blocking and 99 * is interrupted. 100 */ 101 /* 102 public boolean receiveImage(ImageToProcess img, Executor executor, 103 Set<ImageTaskFlags> processingFlags, CaptureSession captureSession) 104 throws InterruptedException; 105 */ 106 107 /** 108 * Provides the basic functionality of camera processing via a more general- 109 * purpose method call. Tasks can be extended off of the TaskImageContainer, 110 * or created from factory method provided by implementation. 111 * 112 * @param img image to be processed 113 * @param sharedTask a single task to be run 114 * @param blockOnImageRelease If true, call blocks until the object img is 115 * no longer referred by any task. If false, call is non-blocking 116 * @param closeOnImageRelease If true, images is closed when the object img 117 * is is no longer referred by any task. If false, 118 * @param runnableWhenDone Optional runnable to be executed when the task is 119 * done. 120 * @return Whether the blocking completed properly. If false, there may be a 121 * need to clean up image closes manually. 122 * @throws InterruptedException occurs when call is set to be blocking and 123 * is interrupted. 124 */ 125 receiveImage(ImageToProcess img, TaskImageContainer sharedTask, boolean blockOnImageRelease, boolean closeOnImageRelease, Optional<Runnable> runnableWhenDone)126 public boolean receiveImage(ImageToProcess img, TaskImageContainer sharedTask, 127 boolean blockOnImageRelease, boolean closeOnImageRelease, 128 Optional<Runnable> runnableWhenDone) 129 throws InterruptedException; 130 131 /** 132 * Provides the basic functionality of camera processing via a more general- 133 * purpose method call w/o a Runnable to be executed when the task is done. 134 * Tasks can be extended off of the TaskImageContainer, or created from 135 * factory method provided by implementation. 136 * 137 * @param img image to be processed. 138 * @param sharedTask a single task to be run. 139 * @param blockOnImageRelease If true, call blocks until the object img is 140 * no longer referred by any task. If false, call is non-blocking 141 * @param closeOnImageRelease If true, images is closed when the object img 142 * is is no longer referred by any task. If false, 143 * @return Whether the blocking completed properly. If false, there may be a 144 * need to clean up image closes manually. 145 * @throws InterruptedException occurs when call is set to be blocking and 146 * is interrupted. 147 */ 148 @Deprecated receiveImage(ImageToProcess img, TaskImageContainer sharedTask, boolean blockOnImageRelease, boolean closeOnImageRelease)149 public boolean receiveImage(ImageToProcess img, TaskImageContainer sharedTask, 150 boolean blockOnImageRelease, boolean closeOnImageRelease) 151 throws InterruptedException; 152 153 /** 154 * Provides the basic functionality of camera processing via the most 155 * general- purpose method call. Tasks can be extended off of the 156 * TaskImageContainer, or created from factory method provided by the 157 * implementation. 158 * 159 * @param img image to be processed. 160 * @param sharedTasks Set of tasks to be run on the given image. 161 * @param blockOnImageRelease If true, call blocks until the object img is 162 * no longer referred by any task. If false, call is non-blocking 163 * @param closeOnImageRelease If true, images is closed when the object img 164 * is is no longer referred by any task. If false, close is not 165 * called on release. 166 * @param runnableWhenDone optional runnable to be executed when the set of 167 * tasks are done. 168 * @return Whether the blocking completed properly. If false, there may be a 169 * need to clean up image closes manually. 170 * @throws InterruptedException occurs when call is set to be blocking and 171 * is interrupted. 172 */ receiveImage(ImageToProcess img, Set<TaskImageContainer> sharedTasks, boolean blockOnImageRelease, boolean closeOnImageRelease, Optional<Runnable> runnableWhenDone)173 public boolean receiveImage(ImageToProcess img, Set<TaskImageContainer> sharedTasks, 174 boolean blockOnImageRelease, boolean closeOnImageRelease, 175 Optional<Runnable> runnableWhenDone) 176 throws InterruptedException; 177 178 /** 179 * Returns the number of images that are currently being referred by the 180 * consumer component. 181 * 182 * @return Number of images that are currently being referred by the 183 * consumer 184 */ getNumberOfReservedOpenImages()185 public int getNumberOfReservedOpenImages(); 186 187 /** 188 * Returns the number of currently outstanding receiveImage calls that are 189 * processing and/or enqueued. 190 * 191 * @return the number of receiveImage calls still running or queued in the 192 * ImageBackend 193 */ getNumberOfOutstandingCalls()194 public int getNumberOfOutstandingCalls(); 195 196 /** 197 * Shutdown all tasks by blocking on tasks to be completed. 198 */ shutdown()199 public void shutdown(); 200 201 /** 202 * Getter to the object that manages the ListenerEvents. Register listeners 203 * to this object. 204 */ getProxyListener()205 public ImageProcessorProxyListener getProxyListener(); 206 207 } 208