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