RequestHolder.java revision 0fd198ad89ec9c600bb1761b10d938146c28bb98
1feb50af361e4305a25758966b6b5df2738c00259Ruben Brunk/*
2feb50af361e4305a25758966b6b5df2738c00259Ruben Brunk * Copyright (C) 2014 The Android Open Source Project
3feb50af361e4305a25758966b6b5df2738c00259Ruben Brunk *
4feb50af361e4305a25758966b6b5df2738c00259Ruben Brunk * Licensed under the Apache License, Version 2.0 (the "License");
5feb50af361e4305a25758966b6b5df2738c00259Ruben Brunk * you may not use this file except in compliance with the License.
6feb50af361e4305a25758966b6b5df2738c00259Ruben Brunk * You may obtain a copy of the License at
7feb50af361e4305a25758966b6b5df2738c00259Ruben Brunk *
8feb50af361e4305a25758966b6b5df2738c00259Ruben Brunk *      http://www.apache.org/licenses/LICENSE-2.0
9feb50af361e4305a25758966b6b5df2738c00259Ruben Brunk *
10feb50af361e4305a25758966b6b5df2738c00259Ruben Brunk * Unless required by applicable law or agreed to in writing, software
11feb50af361e4305a25758966b6b5df2738c00259Ruben Brunk * distributed under the License is distributed on an "AS IS" BASIS,
12feb50af361e4305a25758966b6b5df2738c00259Ruben Brunk * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13feb50af361e4305a25758966b6b5df2738c00259Ruben Brunk * See the License for the specific language governing permissions and
14feb50af361e4305a25758966b6b5df2738c00259Ruben Brunk * limitations under the License.
15feb50af361e4305a25758966b6b5df2738c00259Ruben Brunk */
16feb50af361e4305a25758966b6b5df2738c00259Ruben Brunk
17feb50af361e4305a25758966b6b5df2738c00259Ruben Brunkpackage android.hardware.camera2.legacy;
18feb50af361e4305a25758966b6b5df2738c00259Ruben Brunk
19feb50af361e4305a25758966b6b5df2738c00259Ruben Brunkimport android.hardware.camera2.CaptureRequest;
20feb50af361e4305a25758966b6b5df2738c00259Ruben Brunkimport android.hardware.camera2.impl.CameraMetadataNative;
21ef14da32804b06bac872c9e0e14ce0e52120a0bdRuben Brunkimport android.util.Log;
22feb50af361e4305a25758966b6b5df2738c00259Ruben Brunkimport android.view.Surface;
23feb50af361e4305a25758966b6b5df2738c00259Ruben Brunk
24feb50af361e4305a25758966b6b5df2738c00259Ruben Brunkimport java.util.Collection;
25feb50af361e4305a25758966b6b5df2738c00259Ruben Brunk
26d1f113d0f0ce5099f8efba40a88398f7945bb5e0Ruben Brunkimport static com.android.internal.util.Preconditions.*;
27d1f113d0f0ce5099f8efba40a88398f7945bb5e0Ruben Brunk
28feb50af361e4305a25758966b6b5df2738c00259Ruben Brunk/**
29e663cb77281c4c76241b820f6126543f1c2d859fRuben Brunk * Semi-immutable container for a single capture request and associated information,
30e663cb77281c4c76241b820f6126543f1c2d859fRuben Brunk * the only mutable characteristic of this container is whether or not is has been
31e663cb77281c4c76241b820f6126543f1c2d859fRuben Brunk * marked as "failed" using {@code #failRequest}.
32feb50af361e4305a25758966b6b5df2738c00259Ruben Brunk */
33feb50af361e4305a25758966b6b5df2738c00259Ruben Brunkpublic class RequestHolder {
34ef14da32804b06bac872c9e0e14ce0e52120a0bdRuben Brunk    private static final String TAG = "RequestHolder";
35feb50af361e4305a25758966b6b5df2738c00259Ruben Brunk
36feb50af361e4305a25758966b6b5df2738c00259Ruben Brunk    private final boolean mRepeating;
37feb50af361e4305a25758966b6b5df2738c00259Ruben Brunk    private final CaptureRequest mRequest;
38feb50af361e4305a25758966b6b5df2738c00259Ruben Brunk    private final int mRequestId;
39feb50af361e4305a25758966b6b5df2738c00259Ruben Brunk    private final int mSubsequeceId;
40feb50af361e4305a25758966b6b5df2738c00259Ruben Brunk    private final long mFrameNumber;
41e663cb77281c4c76241b820f6126543f1c2d859fRuben Brunk    private final int mNumJpegTargets;
42e663cb77281c4c76241b820f6126543f1c2d859fRuben Brunk    private final int mNumPreviewTargets;
43e663cb77281c4c76241b820f6126543f1c2d859fRuben Brunk    private volatile boolean mFailed = false;
44d1f113d0f0ce5099f8efba40a88398f7945bb5e0Ruben Brunk
45d1f113d0f0ce5099f8efba40a88398f7945bb5e0Ruben Brunk    /**
46d1f113d0f0ce5099f8efba40a88398f7945bb5e0Ruben Brunk     * A builder class for {@link RequestHolder} objects.
47d1f113d0f0ce5099f8efba40a88398f7945bb5e0Ruben Brunk     *
48d1f113d0f0ce5099f8efba40a88398f7945bb5e0Ruben Brunk     * <p>
49d1f113d0f0ce5099f8efba40a88398f7945bb5e0Ruben Brunk     * This allows per-request queries to be cached for repeating {@link CaptureRequest} objects.
50d1f113d0f0ce5099f8efba40a88398f7945bb5e0Ruben Brunk     * </p>
51d1f113d0f0ce5099f8efba40a88398f7945bb5e0Ruben Brunk     */
52d1f113d0f0ce5099f8efba40a88398f7945bb5e0Ruben Brunk    public final static class Builder {
53d1f113d0f0ce5099f8efba40a88398f7945bb5e0Ruben Brunk        private final int mRequestId;
54d1f113d0f0ce5099f8efba40a88398f7945bb5e0Ruben Brunk        private final int mSubsequenceId;
55d1f113d0f0ce5099f8efba40a88398f7945bb5e0Ruben Brunk        private final CaptureRequest mRequest;
56d1f113d0f0ce5099f8efba40a88398f7945bb5e0Ruben Brunk        private final boolean mRepeating;
57e663cb77281c4c76241b820f6126543f1c2d859fRuben Brunk        private final int mNumJpegTargets;
58e663cb77281c4c76241b820f6126543f1c2d859fRuben Brunk        private final int mNumPreviewTargets;
590fd198ad89ec9c600bb1761b10d938146c28bb98Ruben Brunk        private final Collection<Long> mJpegSurfaceIds;
60d1f113d0f0ce5099f8efba40a88398f7945bb5e0Ruben Brunk
61d1f113d0f0ce5099f8efba40a88398f7945bb5e0Ruben Brunk        /**
62d1f113d0f0ce5099f8efba40a88398f7945bb5e0Ruben Brunk         * Construct a new {@link Builder} to generate {@link RequestHolder} objects.
63d1f113d0f0ce5099f8efba40a88398f7945bb5e0Ruben Brunk         *
64d1f113d0f0ce5099f8efba40a88398f7945bb5e0Ruben Brunk         * @param requestId the ID to set in {@link RequestHolder} objects.
65d1f113d0f0ce5099f8efba40a88398f7945bb5e0Ruben Brunk         * @param subsequenceId the sequence ID to set in {@link RequestHolder} objects.
66d1f113d0f0ce5099f8efba40a88398f7945bb5e0Ruben Brunk         * @param request the original {@link CaptureRequest} to set in {@link RequestHolder}
67d1f113d0f0ce5099f8efba40a88398f7945bb5e0Ruben Brunk         *                objects.
68d1f113d0f0ce5099f8efba40a88398f7945bb5e0Ruben Brunk         * @param repeating {@code true} if the request is repeating.
69d1f113d0f0ce5099f8efba40a88398f7945bb5e0Ruben Brunk         */
70d1f113d0f0ce5099f8efba40a88398f7945bb5e0Ruben Brunk        public Builder(int requestId, int subsequenceId, CaptureRequest request,
710fd198ad89ec9c600bb1761b10d938146c28bb98Ruben Brunk                       boolean repeating, Collection<Long> jpegSurfaceIds) {
72d1f113d0f0ce5099f8efba40a88398f7945bb5e0Ruben Brunk            checkNotNull(request, "request must not be null");
73d1f113d0f0ce5099f8efba40a88398f7945bb5e0Ruben Brunk            mRequestId = requestId;
74d1f113d0f0ce5099f8efba40a88398f7945bb5e0Ruben Brunk            mSubsequenceId = subsequenceId;
75d1f113d0f0ce5099f8efba40a88398f7945bb5e0Ruben Brunk            mRequest = request;
76d1f113d0f0ce5099f8efba40a88398f7945bb5e0Ruben Brunk            mRepeating = repeating;
770fd198ad89ec9c600bb1761b10d938146c28bb98Ruben Brunk            mJpegSurfaceIds = jpegSurfaceIds;
78e663cb77281c4c76241b820f6126543f1c2d859fRuben Brunk            mNumJpegTargets = numJpegTargets(mRequest);
79e663cb77281c4c76241b820f6126543f1c2d859fRuben Brunk            mNumPreviewTargets = numPreviewTargets(mRequest);
80d1f113d0f0ce5099f8efba40a88398f7945bb5e0Ruben Brunk        }
81feb50af361e4305a25758966b6b5df2738c00259Ruben Brunk
82d1f113d0f0ce5099f8efba40a88398f7945bb5e0Ruben Brunk        /**
830fd198ad89ec9c600bb1761b10d938146c28bb98Ruben Brunk         * Returns true if the given surface requires jpeg buffers.
840fd198ad89ec9c600bb1761b10d938146c28bb98Ruben Brunk         *
850fd198ad89ec9c600bb1761b10d938146c28bb98Ruben Brunk         * @param s a {@link android.view.Surface} to check.
860fd198ad89ec9c600bb1761b10d938146c28bb98Ruben Brunk         * @return true if the surface requires a jpeg buffer.
870fd198ad89ec9c600bb1761b10d938146c28bb98Ruben Brunk         */
880fd198ad89ec9c600bb1761b10d938146c28bb98Ruben Brunk        private boolean jpegType(Surface s)
890fd198ad89ec9c600bb1761b10d938146c28bb98Ruben Brunk                throws LegacyExceptionUtils.BufferQueueAbandonedException {
900fd198ad89ec9c600bb1761b10d938146c28bb98Ruben Brunk            return LegacyCameraDevice.containsSurfaceId(s, mJpegSurfaceIds);
910fd198ad89ec9c600bb1761b10d938146c28bb98Ruben Brunk        }
920fd198ad89ec9c600bb1761b10d938146c28bb98Ruben Brunk
930fd198ad89ec9c600bb1761b10d938146c28bb98Ruben Brunk        /**
940fd198ad89ec9c600bb1761b10d938146c28bb98Ruben Brunk         * Returns true if the given surface requires non-jpeg buffer types.
950fd198ad89ec9c600bb1761b10d938146c28bb98Ruben Brunk         *
960fd198ad89ec9c600bb1761b10d938146c28bb98Ruben Brunk         * <p>
970fd198ad89ec9c600bb1761b10d938146c28bb98Ruben Brunk         * "Jpeg buffer" refers to the buffers returned in the jpeg
980fd198ad89ec9c600bb1761b10d938146c28bb98Ruben Brunk         * {@link android.hardware.Camera.PictureCallback}.  Non-jpeg buffers are created using a tee
990fd198ad89ec9c600bb1761b10d938146c28bb98Ruben Brunk         * of the preview stream drawn to the surface
1000fd198ad89ec9c600bb1761b10d938146c28bb98Ruben Brunk         * set via {@link android.hardware.Camera#setPreviewDisplay(android.view.SurfaceHolder)} or
1010fd198ad89ec9c600bb1761b10d938146c28bb98Ruben Brunk         * equivalent methods.
1020fd198ad89ec9c600bb1761b10d938146c28bb98Ruben Brunk         * </p>
1030fd198ad89ec9c600bb1761b10d938146c28bb98Ruben Brunk         * @param s a {@link android.view.Surface} to check.
1040fd198ad89ec9c600bb1761b10d938146c28bb98Ruben Brunk         * @return true if the surface requires a non-jpeg buffer type.
1050fd198ad89ec9c600bb1761b10d938146c28bb98Ruben Brunk         */
1060fd198ad89ec9c600bb1761b10d938146c28bb98Ruben Brunk        private boolean previewType(Surface s)
1070fd198ad89ec9c600bb1761b10d938146c28bb98Ruben Brunk                throws LegacyExceptionUtils.BufferQueueAbandonedException {
1080fd198ad89ec9c600bb1761b10d938146c28bb98Ruben Brunk            return !jpegType(s);
1090fd198ad89ec9c600bb1761b10d938146c28bb98Ruben Brunk        }
1100fd198ad89ec9c600bb1761b10d938146c28bb98Ruben Brunk
1110fd198ad89ec9c600bb1761b10d938146c28bb98Ruben Brunk        /**
1120fd198ad89ec9c600bb1761b10d938146c28bb98Ruben Brunk         * Returns the number of surfaces targeted by the request that require jpeg buffers.
1130fd198ad89ec9c600bb1761b10d938146c28bb98Ruben Brunk         */
1140fd198ad89ec9c600bb1761b10d938146c28bb98Ruben Brunk        private int numJpegTargets(CaptureRequest request) {
1150fd198ad89ec9c600bb1761b10d938146c28bb98Ruben Brunk            int count = 0;
1160fd198ad89ec9c600bb1761b10d938146c28bb98Ruben Brunk            for (Surface s : request.getTargets()) {
1170fd198ad89ec9c600bb1761b10d938146c28bb98Ruben Brunk                try {
1180fd198ad89ec9c600bb1761b10d938146c28bb98Ruben Brunk                    if (jpegType(s)) {
1190fd198ad89ec9c600bb1761b10d938146c28bb98Ruben Brunk                        ++count;
1200fd198ad89ec9c600bb1761b10d938146c28bb98Ruben Brunk                    }
1210fd198ad89ec9c600bb1761b10d938146c28bb98Ruben Brunk                } catch (LegacyExceptionUtils.BufferQueueAbandonedException e) {
1220fd198ad89ec9c600bb1761b10d938146c28bb98Ruben Brunk                    Log.d(TAG, "Surface abandoned, skipping...", e);
1230fd198ad89ec9c600bb1761b10d938146c28bb98Ruben Brunk                }
1240fd198ad89ec9c600bb1761b10d938146c28bb98Ruben Brunk            }
1250fd198ad89ec9c600bb1761b10d938146c28bb98Ruben Brunk            return count;
1260fd198ad89ec9c600bb1761b10d938146c28bb98Ruben Brunk        }
1270fd198ad89ec9c600bb1761b10d938146c28bb98Ruben Brunk
1280fd198ad89ec9c600bb1761b10d938146c28bb98Ruben Brunk        /**
1290fd198ad89ec9c600bb1761b10d938146c28bb98Ruben Brunk         * Returns the number of surfaces targeted by the request that require non-jpeg buffers.
1300fd198ad89ec9c600bb1761b10d938146c28bb98Ruben Brunk         */
1310fd198ad89ec9c600bb1761b10d938146c28bb98Ruben Brunk        private int numPreviewTargets(CaptureRequest request) {
1320fd198ad89ec9c600bb1761b10d938146c28bb98Ruben Brunk            int count = 0;
1330fd198ad89ec9c600bb1761b10d938146c28bb98Ruben Brunk            for (Surface s : request.getTargets()) {
1340fd198ad89ec9c600bb1761b10d938146c28bb98Ruben Brunk                try {
1350fd198ad89ec9c600bb1761b10d938146c28bb98Ruben Brunk                    if (previewType(s)) {
1360fd198ad89ec9c600bb1761b10d938146c28bb98Ruben Brunk                        ++count;
1370fd198ad89ec9c600bb1761b10d938146c28bb98Ruben Brunk                    }
1380fd198ad89ec9c600bb1761b10d938146c28bb98Ruben Brunk                } catch (LegacyExceptionUtils.BufferQueueAbandonedException e) {
1390fd198ad89ec9c600bb1761b10d938146c28bb98Ruben Brunk                    Log.d(TAG, "Surface abandoned, skipping...", e);
1400fd198ad89ec9c600bb1761b10d938146c28bb98Ruben Brunk                }
1410fd198ad89ec9c600bb1761b10d938146c28bb98Ruben Brunk            }
1420fd198ad89ec9c600bb1761b10d938146c28bb98Ruben Brunk            return count;
1430fd198ad89ec9c600bb1761b10d938146c28bb98Ruben Brunk        }
1440fd198ad89ec9c600bb1761b10d938146c28bb98Ruben Brunk
1450fd198ad89ec9c600bb1761b10d938146c28bb98Ruben Brunk        /**
146d1f113d0f0ce5099f8efba40a88398f7945bb5e0Ruben Brunk         * Build a new {@link RequestHolder} using with parameters generated from this
147d1f113d0f0ce5099f8efba40a88398f7945bb5e0Ruben Brunk         *      {@link Builder}.
148d1f113d0f0ce5099f8efba40a88398f7945bb5e0Ruben Brunk         *
149d1f113d0f0ce5099f8efba40a88398f7945bb5e0Ruben Brunk         * @param frameNumber the {@code framenumber} to generate in the {@link RequestHolder}.
150d1f113d0f0ce5099f8efba40a88398f7945bb5e0Ruben Brunk         * @return a {@link RequestHolder} constructed with the {@link Builder}'s parameters.
151d1f113d0f0ce5099f8efba40a88398f7945bb5e0Ruben Brunk         */
152d1f113d0f0ce5099f8efba40a88398f7945bb5e0Ruben Brunk        public RequestHolder build(long frameNumber) {
153d1f113d0f0ce5099f8efba40a88398f7945bb5e0Ruben Brunk            return new RequestHolder(mRequestId, mSubsequenceId, mRequest, mRepeating, frameNumber,
154e663cb77281c4c76241b820f6126543f1c2d859fRuben Brunk                    mNumJpegTargets, mNumPreviewTargets);
155d1f113d0f0ce5099f8efba40a88398f7945bb5e0Ruben Brunk        }
156d1f113d0f0ce5099f8efba40a88398f7945bb5e0Ruben Brunk    }
157d1f113d0f0ce5099f8efba40a88398f7945bb5e0Ruben Brunk
158d1f113d0f0ce5099f8efba40a88398f7945bb5e0Ruben Brunk    private RequestHolder(int requestId, int subsequenceId, CaptureRequest request,
159e663cb77281c4c76241b820f6126543f1c2d859fRuben Brunk                          boolean repeating, long frameNumber, int numJpegTargets,
160e663cb77281c4c76241b820f6126543f1c2d859fRuben Brunk                          int numPreviewTargets) {
161feb50af361e4305a25758966b6b5df2738c00259Ruben Brunk        mRepeating = repeating;
162feb50af361e4305a25758966b6b5df2738c00259Ruben Brunk        mRequest = request;
163feb50af361e4305a25758966b6b5df2738c00259Ruben Brunk        mRequestId = requestId;
164feb50af361e4305a25758966b6b5df2738c00259Ruben Brunk        mSubsequeceId = subsequenceId;
165feb50af361e4305a25758966b6b5df2738c00259Ruben Brunk        mFrameNumber = frameNumber;
166e663cb77281c4c76241b820f6126543f1c2d859fRuben Brunk        mNumJpegTargets = numJpegTargets;
167e663cb77281c4c76241b820f6126543f1c2d859fRuben Brunk        mNumPreviewTargets = numPreviewTargets;
168feb50af361e4305a25758966b6b5df2738c00259Ruben Brunk    }
169feb50af361e4305a25758966b6b5df2738c00259Ruben Brunk
170feb50af361e4305a25758966b6b5df2738c00259Ruben Brunk    /**
171feb50af361e4305a25758966b6b5df2738c00259Ruben Brunk     * Return the request id for the contained {@link CaptureRequest}.
172feb50af361e4305a25758966b6b5df2738c00259Ruben Brunk     */
173feb50af361e4305a25758966b6b5df2738c00259Ruben Brunk    public int getRequestId() {
174feb50af361e4305a25758966b6b5df2738c00259Ruben Brunk        return mRequestId;
175feb50af361e4305a25758966b6b5df2738c00259Ruben Brunk    }
176feb50af361e4305a25758966b6b5df2738c00259Ruben Brunk
177feb50af361e4305a25758966b6b5df2738c00259Ruben Brunk    /**
178feb50af361e4305a25758966b6b5df2738c00259Ruben Brunk     * Returns true if the contained request is repeating.
179feb50af361e4305a25758966b6b5df2738c00259Ruben Brunk     */
180feb50af361e4305a25758966b6b5df2738c00259Ruben Brunk    public boolean isRepeating() {
181feb50af361e4305a25758966b6b5df2738c00259Ruben Brunk        return mRepeating;
182feb50af361e4305a25758966b6b5df2738c00259Ruben Brunk    }
183feb50af361e4305a25758966b6b5df2738c00259Ruben Brunk
184feb50af361e4305a25758966b6b5df2738c00259Ruben Brunk    /**
185feb50af361e4305a25758966b6b5df2738c00259Ruben Brunk     * Return the subsequence id for this request.
186feb50af361e4305a25758966b6b5df2738c00259Ruben Brunk     */
187feb50af361e4305a25758966b6b5df2738c00259Ruben Brunk    public int getSubsequeceId() {
188feb50af361e4305a25758966b6b5df2738c00259Ruben Brunk        return mSubsequeceId;
189feb50af361e4305a25758966b6b5df2738c00259Ruben Brunk    }
190feb50af361e4305a25758966b6b5df2738c00259Ruben Brunk
191feb50af361e4305a25758966b6b5df2738c00259Ruben Brunk    /**
192feb50af361e4305a25758966b6b5df2738c00259Ruben Brunk     * Returns the frame number for this request.
193feb50af361e4305a25758966b6b5df2738c00259Ruben Brunk     */
194feb50af361e4305a25758966b6b5df2738c00259Ruben Brunk    public long getFrameNumber() {
195feb50af361e4305a25758966b6b5df2738c00259Ruben Brunk        return mFrameNumber;
196feb50af361e4305a25758966b6b5df2738c00259Ruben Brunk    }
197feb50af361e4305a25758966b6b5df2738c00259Ruben Brunk
198feb50af361e4305a25758966b6b5df2738c00259Ruben Brunk    /**
199feb50af361e4305a25758966b6b5df2738c00259Ruben Brunk     * Returns the contained request.
200feb50af361e4305a25758966b6b5df2738c00259Ruben Brunk     */
201feb50af361e4305a25758966b6b5df2738c00259Ruben Brunk    public CaptureRequest getRequest() {
202feb50af361e4305a25758966b6b5df2738c00259Ruben Brunk        return mRequest;
203feb50af361e4305a25758966b6b5df2738c00259Ruben Brunk    }
204feb50af361e4305a25758966b6b5df2738c00259Ruben Brunk
205feb50af361e4305a25758966b6b5df2738c00259Ruben Brunk    /**
206feb50af361e4305a25758966b6b5df2738c00259Ruben Brunk     * Returns a read-only collection of the surfaces targeted by the contained request.
207feb50af361e4305a25758966b6b5df2738c00259Ruben Brunk     */
208feb50af361e4305a25758966b6b5df2738c00259Ruben Brunk    public Collection<Surface> getHolderTargets() {
209feb50af361e4305a25758966b6b5df2738c00259Ruben Brunk        return getRequest().getTargets();
210feb50af361e4305a25758966b6b5df2738c00259Ruben Brunk    }
211feb50af361e4305a25758966b6b5df2738c00259Ruben Brunk
212feb50af361e4305a25758966b6b5df2738c00259Ruben Brunk    /**
213feb50af361e4305a25758966b6b5df2738c00259Ruben Brunk     * Returns true if any of the surfaces targeted by the contained request require jpeg buffers.
214feb50af361e4305a25758966b6b5df2738c00259Ruben Brunk     */
215feb50af361e4305a25758966b6b5df2738c00259Ruben Brunk    public boolean hasJpegTargets() {
216e663cb77281c4c76241b820f6126543f1c2d859fRuben Brunk        return mNumJpegTargets > 0;
217feb50af361e4305a25758966b6b5df2738c00259Ruben Brunk    }
218feb50af361e4305a25758966b6b5df2738c00259Ruben Brunk
219feb50af361e4305a25758966b6b5df2738c00259Ruben Brunk    /**
220feb50af361e4305a25758966b6b5df2738c00259Ruben Brunk     * Returns true if any of the surfaces targeted by the contained request require a
221feb50af361e4305a25758966b6b5df2738c00259Ruben Brunk     * non-jpeg buffer type.
222feb50af361e4305a25758966b6b5df2738c00259Ruben Brunk     */
223d1f113d0f0ce5099f8efba40a88398f7945bb5e0Ruben Brunk    public boolean hasPreviewTargets(){
224e663cb77281c4c76241b820f6126543f1c2d859fRuben Brunk        return mNumPreviewTargets > 0;
225e663cb77281c4c76241b820f6126543f1c2d859fRuben Brunk    }
226e663cb77281c4c76241b820f6126543f1c2d859fRuben Brunk
227e663cb77281c4c76241b820f6126543f1c2d859fRuben Brunk    /**
228e663cb77281c4c76241b820f6126543f1c2d859fRuben Brunk     * Return the number of jpeg-type surfaces targeted by this request.
229e663cb77281c4c76241b820f6126543f1c2d859fRuben Brunk     */
230e663cb77281c4c76241b820f6126543f1c2d859fRuben Brunk    public int numJpegTargets() {
231e663cb77281c4c76241b820f6126543f1c2d859fRuben Brunk        return mNumJpegTargets;
232e663cb77281c4c76241b820f6126543f1c2d859fRuben Brunk    }
233e663cb77281c4c76241b820f6126543f1c2d859fRuben Brunk
234e663cb77281c4c76241b820f6126543f1c2d859fRuben Brunk    /**
235e663cb77281c4c76241b820f6126543f1c2d859fRuben Brunk     * Return the number of non-jpeg-type surfaces targeted by this request.
236e663cb77281c4c76241b820f6126543f1c2d859fRuben Brunk     */
237e663cb77281c4c76241b820f6126543f1c2d859fRuben Brunk    public int numPreviewTargets() {
238e663cb77281c4c76241b820f6126543f1c2d859fRuben Brunk        return mNumPreviewTargets;
239e663cb77281c4c76241b820f6126543f1c2d859fRuben Brunk    }
240e663cb77281c4c76241b820f6126543f1c2d859fRuben Brunk
241e663cb77281c4c76241b820f6126543f1c2d859fRuben Brunk    /**
242e663cb77281c4c76241b820f6126543f1c2d859fRuben Brunk     * Mark this request as failed.
243e663cb77281c4c76241b820f6126543f1c2d859fRuben Brunk     */
244e663cb77281c4c76241b820f6126543f1c2d859fRuben Brunk    public void failRequest() {
245e663cb77281c4c76241b820f6126543f1c2d859fRuben Brunk        Log.w(TAG, "Capture failed for request: " + getRequestId());
246e663cb77281c4c76241b820f6126543f1c2d859fRuben Brunk        mFailed = true;
247e663cb77281c4c76241b820f6126543f1c2d859fRuben Brunk    }
248e663cb77281c4c76241b820f6126543f1c2d859fRuben Brunk
249e663cb77281c4c76241b820f6126543f1c2d859fRuben Brunk    /**
250e663cb77281c4c76241b820f6126543f1c2d859fRuben Brunk     * Return {@code true} if this request failed.
251e663cb77281c4c76241b820f6126543f1c2d859fRuben Brunk     */
252e663cb77281c4c76241b820f6126543f1c2d859fRuben Brunk    public boolean requestFailed() {
253e663cb77281c4c76241b820f6126543f1c2d859fRuben Brunk        return mFailed;
254feb50af361e4305a25758966b6b5df2738c00259Ruben Brunk    }
255feb50af361e4305a25758966b6b5df2738c00259Ruben Brunk
256feb50af361e4305a25758966b6b5df2738c00259Ruben Brunk}
257