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