TaskImageContainer.java revision ed68932f91b4b4ad6766e4e38732deb8be772426
1ed68932f91b4b4ad6766e4e38732deb8be772426I-Jong Lin/* 2ed68932f91b4b4ad6766e4e38732deb8be772426I-Jong Lin * Copyright (C) 2014 The Android Open Source Project 3ed68932f91b4b4ad6766e4e38732deb8be772426I-Jong Lin * 4ed68932f91b4b4ad6766e4e38732deb8be772426I-Jong Lin * Licensed under the Apache License, Version 2.0 (the "License"); 5ed68932f91b4b4ad6766e4e38732deb8be772426I-Jong Lin * you may not use this file except in compliance with the License. 6ed68932f91b4b4ad6766e4e38732deb8be772426I-Jong Lin * You may obtain a copy of the License at 7ed68932f91b4b4ad6766e4e38732deb8be772426I-Jong Lin * 8ed68932f91b4b4ad6766e4e38732deb8be772426I-Jong Lin * http://www.apache.org/licenses/LICENSE-2.0 9ed68932f91b4b4ad6766e4e38732deb8be772426I-Jong Lin * 10ed68932f91b4b4ad6766e4e38732deb8be772426I-Jong Lin * Unless required by applicable law or agreed to in writing, software 11ed68932f91b4b4ad6766e4e38732deb8be772426I-Jong Lin * distributed under the License is distributed on an "AS IS" BASIS, 12ed68932f91b4b4ad6766e4e38732deb8be772426I-Jong Lin * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13ed68932f91b4b4ad6766e4e38732deb8be772426I-Jong Lin * See the License for the specific language governing permissions and 14ed68932f91b4b4ad6766e4e38732deb8be772426I-Jong Lin * limitations under the License. 15ed68932f91b4b4ad6766e4e38732deb8be772426I-Jong Lin */ 16ed68932f91b4b4ad6766e4e38732deb8be772426I-Jong Lin 17ed68932f91b4b4ad6766e4e38732deb8be772426I-Jong Linpackage com.android.camera.processing; 18ed68932f91b4b4ad6766e4e38732deb8be772426I-Jong Lin 19ed68932f91b4b4ad6766e4e38732deb8be772426I-Jong Linimport com.android.camera.app.OrientationManager; 20ed68932f91b4b4ad6766e4e38732deb8be772426I-Jong Linimport com.android.camera.debug.Log; 21ed68932f91b4b4ad6766e4e38732deb8be772426I-Jong Linimport com.android.camera.one.v2.camera2proxy.ImageProxy; 22ed68932f91b4b4ad6766e4e38732deb8be772426I-Jong Lin 23ed68932f91b4b4ad6766e4e38732deb8be772426I-Jong Linimport java.util.concurrent.Executor; 24ed68932f91b4b4ad6766e4e38732deb8be772426I-Jong Lin 25ed68932f91b4b4ad6766e4e38732deb8be772426I-Jong Lin/** 26ed68932f91b4b4ad6766e4e38732deb8be772426I-Jong Lin * TaskImageContainer are the base class of tasks that wish to run with the ImageBackend class. It 27ed68932f91b4b4ad6766e4e38732deb8be772426I-Jong Lin * contains the basic information required to interact with the ImageBackend class and the ability 28ed68932f91b4b4ad6766e4e38732deb8be772426I-Jong Lin * to identify itself to the UI backend for updates on its progress. 29ed68932f91b4b4ad6766e4e38732deb8be772426I-Jong Lin */ 30ed68932f91b4b4ad6766e4e38732deb8be772426I-Jong Linpublic abstract class TaskImageContainer implements Runnable { 31ed68932f91b4b4ad6766e4e38732deb8be772426I-Jong Lin 32ed68932f91b4b4ad6766e4e38732deb8be772426I-Jong Lin 33ed68932f91b4b4ad6766e4e38732deb8be772426I-Jong Lin /** 34ed68932f91b4b4ad6766e4e38732deb8be772426I-Jong Lin * Simple helper class to encapsulate uncompressed payloads. Could be more complex in 35ed68932f91b4b4ad6766e4e38732deb8be772426I-Jong Lin * the future. 36ed68932f91b4b4ad6766e4e38732deb8be772426I-Jong Lin */ 37ed68932f91b4b4ad6766e4e38732deb8be772426I-Jong Lin static public class UncompressedPayload { 38ed68932f91b4b4ad6766e4e38732deb8be772426I-Jong Lin final public int [] data; 39ed68932f91b4b4ad6766e4e38732deb8be772426I-Jong Lin UncompressedPayload(int [] passData) { 40ed68932f91b4b4ad6766e4e38732deb8be772426I-Jong Lin data = passData; 41ed68932f91b4b4ad6766e4e38732deb8be772426I-Jong Lin } 42ed68932f91b4b4ad6766e4e38732deb8be772426I-Jong Lin } 43ed68932f91b4b4ad6766e4e38732deb8be772426I-Jong Lin 44ed68932f91b4b4ad6766e4e38732deb8be772426I-Jong Lin 45ed68932f91b4b4ad6766e4e38732deb8be772426I-Jong Lin /** 46ed68932f91b4b4ad6766e4e38732deb8be772426I-Jong Lin * Simple helper class to encapsulate compressed payloads. Could be more complex in 47ed68932f91b4b4ad6766e4e38732deb8be772426I-Jong Lin * the future. 48ed68932f91b4b4ad6766e4e38732deb8be772426I-Jong Lin */ 49ed68932f91b4b4ad6766e4e38732deb8be772426I-Jong Lin static public class CompressedPayload { 50ed68932f91b4b4ad6766e4e38732deb8be772426I-Jong Lin final public byte [] data; 51ed68932f91b4b4ad6766e4e38732deb8be772426I-Jong Lin CompressedPayload(byte [] passData) { 52ed68932f91b4b4ad6766e4e38732deb8be772426I-Jong Lin data = passData; 53ed68932f91b4b4ad6766e4e38732deb8be772426I-Jong Lin } 54ed68932f91b4b4ad6766e4e38732deb8be772426I-Jong Lin } 55ed68932f91b4b4ad6766e4e38732deb8be772426I-Jong Lin 56ed68932f91b4b4ad6766e4e38732deb8be772426I-Jong Lin /** 57ed68932f91b4b4ad6766e4e38732deb8be772426I-Jong Lin * Simple helper class to encapsulate all necessary image information that is carried with the 58ed68932f91b4b4ad6766e4e38732deb8be772426I-Jong Lin * data to processing, so that tasks derived off of TaskImageContainer can properly coordinate 59ed68932f91b4b4ad6766e4e38732deb8be772426I-Jong Lin * and optimize its computation. 60ed68932f91b4b4ad6766e4e38732deb8be772426I-Jong Lin */ 61ed68932f91b4b4ad6766e4e38732deb8be772426I-Jong Lin static public class TaskImage { 62ed68932f91b4b4ad6766e4e38732deb8be772426I-Jong Lin // Addendum to Android-defined image-format 63ed68932f91b4b4ad6766e4e38732deb8be772426I-Jong Lin public final static int EXTRA_USER_DEFINED_FORMAT_ARGB_8888 = -1; 64ed68932f91b4b4ad6766e4e38732deb8be772426I-Jong Lin 65ed68932f91b4b4ad6766e4e38732deb8be772426I-Jong Lin // Minimal required knowledge for the image specification. 66ed68932f91b4b4ad6766e4e38732deb8be772426I-Jong Lin final OrientationManager.DeviceOrientation orientation; 67ed68932f91b4b4ad6766e4e38732deb8be772426I-Jong Lin 68ed68932f91b4b4ad6766e4e38732deb8be772426I-Jong Lin final int height; 69ed68932f91b4b4ad6766e4e38732deb8be772426I-Jong Lin 70ed68932f91b4b4ad6766e4e38732deb8be772426I-Jong Lin final int width; 71ed68932f91b4b4ad6766e4e38732deb8be772426I-Jong Lin 72ed68932f91b4b4ad6766e4e38732deb8be772426I-Jong Lin final int format; 73ed68932f91b4b4ad6766e4e38732deb8be772426I-Jong Lin 74ed68932f91b4b4ad6766e4e38732deb8be772426I-Jong Lin TaskImage(OrientationManager.DeviceOrientation anOrientation, int aWidth, int aHeight, 75ed68932f91b4b4ad6766e4e38732deb8be772426I-Jong Lin int aFormat) { 76ed68932f91b4b4ad6766e4e38732deb8be772426I-Jong Lin orientation = anOrientation; 77ed68932f91b4b4ad6766e4e38732deb8be772426I-Jong Lin height = aWidth; 78ed68932f91b4b4ad6766e4e38732deb8be772426I-Jong Lin width = aHeight; 79ed68932f91b4b4ad6766e4e38732deb8be772426I-Jong Lin format = aFormat; 80ed68932f91b4b4ad6766e4e38732deb8be772426I-Jong Lin } 81ed68932f91b4b4ad6766e4e38732deb8be772426I-Jong Lin 82ed68932f91b4b4ad6766e4e38732deb8be772426I-Jong Lin } 83ed68932f91b4b4ad6766e4e38732deb8be772426I-Jong Lin 84ed68932f91b4b4ad6766e4e38732deb8be772426I-Jong Lin /** 85ed68932f91b4b4ad6766e4e38732deb8be772426I-Jong Lin * Simple helper class to encapsulate input and resultant image specification. 86ed68932f91b4b4ad6766e4e38732deb8be772426I-Jong Lin * TasksImageContainer classes can be uniquely identified by triplet of its content (currently, 87ed68932f91b4b4ad6766e4e38732deb8be772426I-Jong Lin * the global timestamp of when the object was taken), the image specification of the input and 88ed68932f91b4b4ad6766e4e38732deb8be772426I-Jong Lin * the desired output image specification. 89ed68932f91b4b4ad6766e4e38732deb8be772426I-Jong Lin */ 90ed68932f91b4b4ad6766e4e38732deb8be772426I-Jong Lin static public class TaskInfo { 91ed68932f91b4b4ad6766e4e38732deb8be772426I-Jong Lin // The unique Id of the image being processed. 92ed68932f91b4b4ad6766e4e38732deb8be772426I-Jong Lin public final long contentId; 93ed68932f91b4b4ad6766e4e38732deb8be772426I-Jong Lin 94ed68932f91b4b4ad6766e4e38732deb8be772426I-Jong Lin public final TaskImage input; 95ed68932f91b4b4ad6766e4e38732deb8be772426I-Jong Lin 96ed68932f91b4b4ad6766e4e38732deb8be772426I-Jong Lin public final TaskImage result; 97ed68932f91b4b4ad6766e4e38732deb8be772426I-Jong Lin 98ed68932f91b4b4ad6766e4e38732deb8be772426I-Jong Lin TaskInfo(long aContentId, TaskImage inputSpec, TaskImage outputSpec) { 99ed68932f91b4b4ad6766e4e38732deb8be772426I-Jong Lin contentId = aContentId; 100ed68932f91b4b4ad6766e4e38732deb8be772426I-Jong Lin input = inputSpec; 101ed68932f91b4b4ad6766e4e38732deb8be772426I-Jong Lin result = outputSpec; 102ed68932f91b4b4ad6766e4e38732deb8be772426I-Jong Lin } 103ed68932f91b4b4ad6766e4e38732deb8be772426I-Jong Lin 104ed68932f91b4b4ad6766e4e38732deb8be772426I-Jong Lin } 105ed68932f91b4b4ad6766e4e38732deb8be772426I-Jong Lin 106ed68932f91b4b4ad6766e4e38732deb8be772426I-Jong Lin public enum ProcessingPriority { 107ed68932f91b4b4ad6766e4e38732deb8be772426I-Jong Lin FAST, SLOW 108ed68932f91b4b4ad6766e4e38732deb8be772426I-Jong Lin } 109ed68932f91b4b4ad6766e4e38732deb8be772426I-Jong Lin 110ed68932f91b4b4ad6766e4e38732deb8be772426I-Jong Lin protected final static Log.Tag TAG = new Log.Tag("TaskImgContain"); 111ed68932f91b4b4ad6766e4e38732deb8be772426I-Jong Lin 112ed68932f91b4b4ad6766e4e38732deb8be772426I-Jong Lin final protected ImageBackend mImageBackend; 113ed68932f91b4b4ad6766e4e38732deb8be772426I-Jong Lin 114ed68932f91b4b4ad6766e4e38732deb8be772426I-Jong Lin final protected Executor mExecutor; 115ed68932f91b4b4ad6766e4e38732deb8be772426I-Jong Lin 116ed68932f91b4b4ad6766e4e38732deb8be772426I-Jong Lin final protected long mId; 117ed68932f91b4b4ad6766e4e38732deb8be772426I-Jong Lin 118ed68932f91b4b4ad6766e4e38732deb8be772426I-Jong Lin final protected ProcessingPriority mProcessingPriority; 119ed68932f91b4b4ad6766e4e38732deb8be772426I-Jong Lin 120ed68932f91b4b4ad6766e4e38732deb8be772426I-Jong Lin final protected ImageProxy mImageProxy; 121ed68932f91b4b4ad6766e4e38732deb8be772426I-Jong Lin 122ed68932f91b4b4ad6766e4e38732deb8be772426I-Jong Lin /** 123ed68932f91b4b4ad6766e4e38732deb8be772426I-Jong Lin * Constructor when releasing the image reference. 124ed68932f91b4b4ad6766e4e38732deb8be772426I-Jong Lin * 125ed68932f91b4b4ad6766e4e38732deb8be772426I-Jong Lin * @param otherTask the original task that is spawning this task. 126ed68932f91b4b4ad6766e4e38732deb8be772426I-Jong Lin * @param processingPriority Priority that the derived task will run at. 127ed68932f91b4b4ad6766e4e38732deb8be772426I-Jong Lin */ 128ed68932f91b4b4ad6766e4e38732deb8be772426I-Jong Lin public TaskImageContainer(TaskImageContainer otherTask, ProcessingPriority processingPriority) { 129ed68932f91b4b4ad6766e4e38732deb8be772426I-Jong Lin this.mId = otherTask.mId; 130ed68932f91b4b4ad6766e4e38732deb8be772426I-Jong Lin this.mExecutor = otherTask.mExecutor; 131ed68932f91b4b4ad6766e4e38732deb8be772426I-Jong Lin this.mImageBackend = otherTask.mImageBackend; 132ed68932f91b4b4ad6766e4e38732deb8be772426I-Jong Lin this.mProcessingPriority = processingPriority; 133ed68932f91b4b4ad6766e4e38732deb8be772426I-Jong Lin mImageProxy = null; 134ed68932f91b4b4ad6766e4e38732deb8be772426I-Jong Lin } 135ed68932f91b4b4ad6766e4e38732deb8be772426I-Jong Lin 136ed68932f91b4b4ad6766e4e38732deb8be772426I-Jong Lin /** 137ed68932f91b4b4ad6766e4e38732deb8be772426I-Jong Lin * Constructor to use when keeping the image reference. 138ed68932f91b4b4ad6766e4e38732deb8be772426I-Jong Lin * 139ed68932f91b4b4ad6766e4e38732deb8be772426I-Jong Lin * @param image Image reference that needs to be released. 140ed68932f91b4b4ad6766e4e38732deb8be772426I-Jong Lin * @param Executor Executor to run the event handling 141ed68932f91b4b4ad6766e4e38732deb8be772426I-Jong Lin * @param imageBackend a reference to the ImageBackend, in case, you need to spawn other tasks 142ed68932f91b4b4ad6766e4e38732deb8be772426I-Jong Lin * @param preferredLane Priority that the derived task will run at 143ed68932f91b4b4ad6766e4e38732deb8be772426I-Jong Lin */ 144ed68932f91b4b4ad6766e4e38732deb8be772426I-Jong Lin public TaskImageContainer(ImageProxy image, Executor Executor, ImageBackend imageBackend, 145ed68932f91b4b4ad6766e4e38732deb8be772426I-Jong Lin ProcessingPriority preferredLane) { 146ed68932f91b4b4ad6766e4e38732deb8be772426I-Jong Lin mImageProxy = image; 147ed68932f91b4b4ad6766e4e38732deb8be772426I-Jong Lin this.mId = image.getTimestamp(); 148ed68932f91b4b4ad6766e4e38732deb8be772426I-Jong Lin this.mExecutor = Executor; 149ed68932f91b4b4ad6766e4e38732deb8be772426I-Jong Lin this.mImageBackend = imageBackend; 150ed68932f91b4b4ad6766e4e38732deb8be772426I-Jong Lin this.mProcessingPriority = preferredLane; 151ed68932f91b4b4ad6766e4e38732deb8be772426I-Jong Lin } 152ed68932f91b4b4ad6766e4e38732deb8be772426I-Jong Lin 153ed68932f91b4b4ad6766e4e38732deb8be772426I-Jong Lin /** 154ed68932f91b4b4ad6766e4e38732deb8be772426I-Jong Lin * Basic listener function to signal ImageBackend that task has started. 155ed68932f91b4b4ad6766e4e38732deb8be772426I-Jong Lin * 156ed68932f91b4b4ad6766e4e38732deb8be772426I-Jong Lin * @param id Id for image content 157ed68932f91b4b4ad6766e4e38732deb8be772426I-Jong Lin * @param input Image specification for task input 158ed68932f91b4b4ad6766e4e38732deb8be772426I-Jong Lin * @param result Image specification for task result 159ed68932f91b4b4ad6766e4e38732deb8be772426I-Jong Lin */ 160ed68932f91b4b4ad6766e4e38732deb8be772426I-Jong Lin public void onStart(long id, TaskImage input, TaskImage result) { 161ed68932f91b4b4ad6766e4e38732deb8be772426I-Jong Lin TaskInfo job = new TaskInfo(id, input, result); 162ed68932f91b4b4ad6766e4e38732deb8be772426I-Jong Lin final ImageProcessorListener listener = mImageBackend.getProxyListener(); 163ed68932f91b4b4ad6766e4e38732deb8be772426I-Jong Lin listener.onStart(job); 164ed68932f91b4b4ad6766e4e38732deb8be772426I-Jong Lin } 165ed68932f91b4b4ad6766e4e38732deb8be772426I-Jong Lin 166ed68932f91b4b4ad6766e4e38732deb8be772426I-Jong Lin /** 167ed68932f91b4b4ad6766e4e38732deb8be772426I-Jong Lin * Getter for Processing Priority 168ed68932f91b4b4ad6766e4e38732deb8be772426I-Jong Lin * 169ed68932f91b4b4ad6766e4e38732deb8be772426I-Jong Lin * @return Processing Priority associated with the task. 170ed68932f91b4b4ad6766e4e38732deb8be772426I-Jong Lin */ 171ed68932f91b4b4ad6766e4e38732deb8be772426I-Jong Lin public ProcessingPriority getProcessingPriority() { 172ed68932f91b4b4ad6766e4e38732deb8be772426I-Jong Lin return mProcessingPriority; 173ed68932f91b4b4ad6766e4e38732deb8be772426I-Jong Lin } 174ed68932f91b4b4ad6766e4e38732deb8be772426I-Jong Lin} 175