RequestHolder.java revision 385f9e2146d2600ae9fd20053aab8ee5abcac9a6
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
44385f9e2146d2600ae9fd20053aab8ee5abcac9a6Eino-Ville Talvala    private final Collection<Long> mJpegSurfaceIds;
45385f9e2146d2600ae9fd20053aab8ee5abcac9a6Eino-Ville Talvala
46d1f113d0f0ce5099f8efba40a88398f7945bb5e0Ruben Brunk    /**
47d1f113d0f0ce5099f8efba40a88398f7945bb5e0Ruben Brunk     * A builder class for {@link RequestHolder} objects.
48d1f113d0f0ce5099f8efba40a88398f7945bb5e0Ruben Brunk     *
49d1f113d0f0ce5099f8efba40a88398f7945bb5e0Ruben Brunk     * <p>
50d1f113d0f0ce5099f8efba40a88398f7945bb5e0Ruben Brunk     * This allows per-request queries to be cached for repeating {@link CaptureRequest} objects.
51d1f113d0f0ce5099f8efba40a88398f7945bb5e0Ruben Brunk     * </p>
52d1f113d0f0ce5099f8efba40a88398f7945bb5e0Ruben Brunk     */
53d1f113d0f0ce5099f8efba40a88398f7945bb5e0Ruben Brunk    public final static class Builder {
54d1f113d0f0ce5099f8efba40a88398f7945bb5e0Ruben Brunk        private final int mRequestId;
55d1f113d0f0ce5099f8efba40a88398f7945bb5e0Ruben Brunk        private final int mSubsequenceId;
56d1f113d0f0ce5099f8efba40a88398f7945bb5e0Ruben Brunk        private final CaptureRequest mRequest;
57d1f113d0f0ce5099f8efba40a88398f7945bb5e0Ruben Brunk        private final boolean mRepeating;
58e663cb77281c4c76241b820f6126543f1c2d859fRuben Brunk        private final int mNumJpegTargets;
59e663cb77281c4c76241b820f6126543f1c2d859fRuben Brunk        private final int mNumPreviewTargets;
600fd198ad89ec9c600bb1761b10d938146c28bb98Ruben Brunk        private final Collection<Long> mJpegSurfaceIds;
61d1f113d0f0ce5099f8efba40a88398f7945bb5e0Ruben Brunk
62d1f113d0f0ce5099f8efba40a88398f7945bb5e0Ruben Brunk        /**
63d1f113d0f0ce5099f8efba40a88398f7945bb5e0Ruben Brunk         * Construct a new {@link Builder} to generate {@link RequestHolder} objects.
64d1f113d0f0ce5099f8efba40a88398f7945bb5e0Ruben Brunk         *
65d1f113d0f0ce5099f8efba40a88398f7945bb5e0Ruben Brunk         * @param requestId the ID to set in {@link RequestHolder} objects.
66d1f113d0f0ce5099f8efba40a88398f7945bb5e0Ruben Brunk         * @param subsequenceId the sequence ID to set in {@link RequestHolder} objects.
67d1f113d0f0ce5099f8efba40a88398f7945bb5e0Ruben Brunk         * @param request the original {@link CaptureRequest} to set in {@link RequestHolder}
68d1f113d0f0ce5099f8efba40a88398f7945bb5e0Ruben Brunk         *                objects.
69d1f113d0f0ce5099f8efba40a88398f7945bb5e0Ruben Brunk         * @param repeating {@code true} if the request is repeating.
70d1f113d0f0ce5099f8efba40a88398f7945bb5e0Ruben Brunk         */
71d1f113d0f0ce5099f8efba40a88398f7945bb5e0Ruben Brunk        public Builder(int requestId, int subsequenceId, CaptureRequest request,
720fd198ad89ec9c600bb1761b10d938146c28bb98Ruben Brunk                       boolean repeating, Collection<Long> jpegSurfaceIds) {
73d1f113d0f0ce5099f8efba40a88398f7945bb5e0Ruben Brunk            checkNotNull(request, "request must not be null");
74d1f113d0f0ce5099f8efba40a88398f7945bb5e0Ruben Brunk            mRequestId = requestId;
75d1f113d0f0ce5099f8efba40a88398f7945bb5e0Ruben Brunk            mSubsequenceId = subsequenceId;
76d1f113d0f0ce5099f8efba40a88398f7945bb5e0Ruben Brunk            mRequest = request;
77d1f113d0f0ce5099f8efba40a88398f7945bb5e0Ruben Brunk            mRepeating = repeating;
780fd198ad89ec9c600bb1761b10d938146c28bb98Ruben Brunk            mJpegSurfaceIds = jpegSurfaceIds;
79e663cb77281c4c76241b820f6126543f1c2d859fRuben Brunk            mNumJpegTargets = numJpegTargets(mRequest);
80e663cb77281c4c76241b820f6126543f1c2d859fRuben Brunk            mNumPreviewTargets = numPreviewTargets(mRequest);
81d1f113d0f0ce5099f8efba40a88398f7945bb5e0Ruben Brunk        }
82feb50af361e4305a25758966b6b5df2738c00259Ruben Brunk
83d1f113d0f0ce5099f8efba40a88398f7945bb5e0Ruben Brunk        /**
840fd198ad89ec9c600bb1761b10d938146c28bb98Ruben Brunk         * Returns true if the given surface requires jpeg buffers.
850fd198ad89ec9c600bb1761b10d938146c28bb98Ruben Brunk         *
860fd198ad89ec9c600bb1761b10d938146c28bb98Ruben Brunk         * @param s a {@link android.view.Surface} to check.
870fd198ad89ec9c600bb1761b10d938146c28bb98Ruben Brunk         * @return true if the surface requires a jpeg buffer.
880fd198ad89ec9c600bb1761b10d938146c28bb98Ruben Brunk         */
890fd198ad89ec9c600bb1761b10d938146c28bb98Ruben Brunk        private boolean jpegType(Surface s)
900fd198ad89ec9c600bb1761b10d938146c28bb98Ruben Brunk                throws LegacyExceptionUtils.BufferQueueAbandonedException {
910fd198ad89ec9c600bb1761b10d938146c28bb98Ruben Brunk            return LegacyCameraDevice.containsSurfaceId(s, mJpegSurfaceIds);
920fd198ad89ec9c600bb1761b10d938146c28bb98Ruben Brunk        }
930fd198ad89ec9c600bb1761b10d938146c28bb98Ruben Brunk
940fd198ad89ec9c600bb1761b10d938146c28bb98Ruben Brunk        /**
950fd198ad89ec9c600bb1761b10d938146c28bb98Ruben Brunk         * Returns true if the given surface requires non-jpeg buffer types.
960fd198ad89ec9c600bb1761b10d938146c28bb98Ruben Brunk         *
970fd198ad89ec9c600bb1761b10d938146c28bb98Ruben Brunk         * <p>
980fd198ad89ec9c600bb1761b10d938146c28bb98Ruben Brunk         * "Jpeg buffer" refers to the buffers returned in the jpeg
990fd198ad89ec9c600bb1761b10d938146c28bb98Ruben Brunk         * {@link android.hardware.Camera.PictureCallback}.  Non-jpeg buffers are created using a tee
1000fd198ad89ec9c600bb1761b10d938146c28bb98Ruben Brunk         * of the preview stream drawn to the surface
1010fd198ad89ec9c600bb1761b10d938146c28bb98Ruben Brunk         * set via {@link android.hardware.Camera#setPreviewDisplay(android.view.SurfaceHolder)} or
1020fd198ad89ec9c600bb1761b10d938146c28bb98Ruben Brunk         * equivalent methods.
1030fd198ad89ec9c600bb1761b10d938146c28bb98Ruben Brunk         * </p>
1040fd198ad89ec9c600bb1761b10d938146c28bb98Ruben Brunk         * @param s a {@link android.view.Surface} to check.
1050fd198ad89ec9c600bb1761b10d938146c28bb98Ruben Brunk         * @return true if the surface requires a non-jpeg buffer type.
1060fd198ad89ec9c600bb1761b10d938146c28bb98Ruben Brunk         */
1070fd198ad89ec9c600bb1761b10d938146c28bb98Ruben Brunk        private boolean previewType(Surface s)
1080fd198ad89ec9c600bb1761b10d938146c28bb98Ruben Brunk                throws LegacyExceptionUtils.BufferQueueAbandonedException {
1090fd198ad89ec9c600bb1761b10d938146c28bb98Ruben Brunk            return !jpegType(s);
1100fd198ad89ec9c600bb1761b10d938146c28bb98Ruben Brunk        }
1110fd198ad89ec9c600bb1761b10d938146c28bb98Ruben Brunk
1120fd198ad89ec9c600bb1761b10d938146c28bb98Ruben Brunk        /**
1130fd198ad89ec9c600bb1761b10d938146c28bb98Ruben Brunk         * Returns the number of surfaces targeted by the request that require jpeg buffers.
1140fd198ad89ec9c600bb1761b10d938146c28bb98Ruben Brunk         */
1150fd198ad89ec9c600bb1761b10d938146c28bb98Ruben Brunk        private int numJpegTargets(CaptureRequest request) {
1160fd198ad89ec9c600bb1761b10d938146c28bb98Ruben Brunk            int count = 0;
1170fd198ad89ec9c600bb1761b10d938146c28bb98Ruben Brunk            for (Surface s : request.getTargets()) {
1180fd198ad89ec9c600bb1761b10d938146c28bb98Ruben Brunk                try {
1190fd198ad89ec9c600bb1761b10d938146c28bb98Ruben Brunk                    if (jpegType(s)) {
1200fd198ad89ec9c600bb1761b10d938146c28bb98Ruben Brunk                        ++count;
1210fd198ad89ec9c600bb1761b10d938146c28bb98Ruben Brunk                    }
1220fd198ad89ec9c600bb1761b10d938146c28bb98Ruben Brunk                } catch (LegacyExceptionUtils.BufferQueueAbandonedException e) {
1230fd198ad89ec9c600bb1761b10d938146c28bb98Ruben Brunk                    Log.d(TAG, "Surface abandoned, skipping...", e);
1240fd198ad89ec9c600bb1761b10d938146c28bb98Ruben Brunk                }
1250fd198ad89ec9c600bb1761b10d938146c28bb98Ruben Brunk            }
1260fd198ad89ec9c600bb1761b10d938146c28bb98Ruben Brunk            return count;
1270fd198ad89ec9c600bb1761b10d938146c28bb98Ruben Brunk        }
1280fd198ad89ec9c600bb1761b10d938146c28bb98Ruben Brunk
1290fd198ad89ec9c600bb1761b10d938146c28bb98Ruben Brunk        /**
1300fd198ad89ec9c600bb1761b10d938146c28bb98Ruben Brunk         * Returns the number of surfaces targeted by the request that require non-jpeg buffers.
1310fd198ad89ec9c600bb1761b10d938146c28bb98Ruben Brunk         */
1320fd198ad89ec9c600bb1761b10d938146c28bb98Ruben Brunk        private int numPreviewTargets(CaptureRequest request) {
1330fd198ad89ec9c600bb1761b10d938146c28bb98Ruben Brunk            int count = 0;
1340fd198ad89ec9c600bb1761b10d938146c28bb98Ruben Brunk            for (Surface s : request.getTargets()) {
1350fd198ad89ec9c600bb1761b10d938146c28bb98Ruben Brunk                try {
1360fd198ad89ec9c600bb1761b10d938146c28bb98Ruben Brunk                    if (previewType(s)) {
1370fd198ad89ec9c600bb1761b10d938146c28bb98Ruben Brunk                        ++count;
1380fd198ad89ec9c600bb1761b10d938146c28bb98Ruben Brunk                    }
1390fd198ad89ec9c600bb1761b10d938146c28bb98Ruben Brunk                } catch (LegacyExceptionUtils.BufferQueueAbandonedException e) {
1400fd198ad89ec9c600bb1761b10d938146c28bb98Ruben Brunk                    Log.d(TAG, "Surface abandoned, skipping...", e);
1410fd198ad89ec9c600bb1761b10d938146c28bb98Ruben Brunk                }
1420fd198ad89ec9c600bb1761b10d938146c28bb98Ruben Brunk            }
1430fd198ad89ec9c600bb1761b10d938146c28bb98Ruben Brunk            return count;
1440fd198ad89ec9c600bb1761b10d938146c28bb98Ruben Brunk        }
1450fd198ad89ec9c600bb1761b10d938146c28bb98Ruben Brunk
1460fd198ad89ec9c600bb1761b10d938146c28bb98Ruben Brunk        /**
147d1f113d0f0ce5099f8efba40a88398f7945bb5e0Ruben Brunk         * Build a new {@link RequestHolder} using with parameters generated from this
148d1f113d0f0ce5099f8efba40a88398f7945bb5e0Ruben Brunk         *      {@link Builder}.
149d1f113d0f0ce5099f8efba40a88398f7945bb5e0Ruben Brunk         *
150d1f113d0f0ce5099f8efba40a88398f7945bb5e0Ruben Brunk         * @param frameNumber the {@code framenumber} to generate in the {@link RequestHolder}.
151d1f113d0f0ce5099f8efba40a88398f7945bb5e0Ruben Brunk         * @return a {@link RequestHolder} constructed with the {@link Builder}'s parameters.
152d1f113d0f0ce5099f8efba40a88398f7945bb5e0Ruben Brunk         */
153d1f113d0f0ce5099f8efba40a88398f7945bb5e0Ruben Brunk        public RequestHolder build(long frameNumber) {
154d1f113d0f0ce5099f8efba40a88398f7945bb5e0Ruben Brunk            return new RequestHolder(mRequestId, mSubsequenceId, mRequest, mRepeating, frameNumber,
155385f9e2146d2600ae9fd20053aab8ee5abcac9a6Eino-Ville Talvala                    mNumJpegTargets, mNumPreviewTargets, mJpegSurfaceIds);
156d1f113d0f0ce5099f8efba40a88398f7945bb5e0Ruben Brunk        }
157d1f113d0f0ce5099f8efba40a88398f7945bb5e0Ruben Brunk    }
158d1f113d0f0ce5099f8efba40a88398f7945bb5e0Ruben Brunk
159d1f113d0f0ce5099f8efba40a88398f7945bb5e0Ruben Brunk    private RequestHolder(int requestId, int subsequenceId, CaptureRequest request,
160e663cb77281c4c76241b820f6126543f1c2d859fRuben Brunk                          boolean repeating, long frameNumber, int numJpegTargets,
161385f9e2146d2600ae9fd20053aab8ee5abcac9a6Eino-Ville Talvala                          int numPreviewTargets, Collection<Long> jpegSurfaceIds) {
162feb50af361e4305a25758966b6b5df2738c00259Ruben Brunk        mRepeating = repeating;
163feb50af361e4305a25758966b6b5df2738c00259Ruben Brunk        mRequest = request;
164feb50af361e4305a25758966b6b5df2738c00259Ruben Brunk        mRequestId = requestId;
165feb50af361e4305a25758966b6b5df2738c00259Ruben Brunk        mSubsequeceId = subsequenceId;
166feb50af361e4305a25758966b6b5df2738c00259Ruben Brunk        mFrameNumber = frameNumber;
167e663cb77281c4c76241b820f6126543f1c2d859fRuben Brunk        mNumJpegTargets = numJpegTargets;
168e663cb77281c4c76241b820f6126543f1c2d859fRuben Brunk        mNumPreviewTargets = numPreviewTargets;
169385f9e2146d2600ae9fd20053aab8ee5abcac9a6Eino-Ville Talvala        mJpegSurfaceIds = jpegSurfaceIds;
170feb50af361e4305a25758966b6b5df2738c00259Ruben Brunk    }
171feb50af361e4305a25758966b6b5df2738c00259Ruben Brunk
172feb50af361e4305a25758966b6b5df2738c00259Ruben Brunk    /**
173feb50af361e4305a25758966b6b5df2738c00259Ruben Brunk     * Return the request id for the contained {@link CaptureRequest}.
174feb50af361e4305a25758966b6b5df2738c00259Ruben Brunk     */
175feb50af361e4305a25758966b6b5df2738c00259Ruben Brunk    public int getRequestId() {
176feb50af361e4305a25758966b6b5df2738c00259Ruben Brunk        return mRequestId;
177feb50af361e4305a25758966b6b5df2738c00259Ruben Brunk    }
178feb50af361e4305a25758966b6b5df2738c00259Ruben Brunk
179feb50af361e4305a25758966b6b5df2738c00259Ruben Brunk    /**
180feb50af361e4305a25758966b6b5df2738c00259Ruben Brunk     * Returns true if the contained request is repeating.
181feb50af361e4305a25758966b6b5df2738c00259Ruben Brunk     */
182feb50af361e4305a25758966b6b5df2738c00259Ruben Brunk    public boolean isRepeating() {
183feb50af361e4305a25758966b6b5df2738c00259Ruben Brunk        return mRepeating;
184feb50af361e4305a25758966b6b5df2738c00259Ruben Brunk    }
185feb50af361e4305a25758966b6b5df2738c00259Ruben Brunk
186feb50af361e4305a25758966b6b5df2738c00259Ruben Brunk    /**
187feb50af361e4305a25758966b6b5df2738c00259Ruben Brunk     * Return the subsequence id for this request.
188feb50af361e4305a25758966b6b5df2738c00259Ruben Brunk     */
189feb50af361e4305a25758966b6b5df2738c00259Ruben Brunk    public int getSubsequeceId() {
190feb50af361e4305a25758966b6b5df2738c00259Ruben Brunk        return mSubsequeceId;
191feb50af361e4305a25758966b6b5df2738c00259Ruben Brunk    }
192feb50af361e4305a25758966b6b5df2738c00259Ruben Brunk
193feb50af361e4305a25758966b6b5df2738c00259Ruben Brunk    /**
194feb50af361e4305a25758966b6b5df2738c00259Ruben Brunk     * Returns the frame number for this request.
195feb50af361e4305a25758966b6b5df2738c00259Ruben Brunk     */
196feb50af361e4305a25758966b6b5df2738c00259Ruben Brunk    public long getFrameNumber() {
197feb50af361e4305a25758966b6b5df2738c00259Ruben Brunk        return mFrameNumber;
198feb50af361e4305a25758966b6b5df2738c00259Ruben Brunk    }
199feb50af361e4305a25758966b6b5df2738c00259Ruben Brunk
200feb50af361e4305a25758966b6b5df2738c00259Ruben Brunk    /**
201feb50af361e4305a25758966b6b5df2738c00259Ruben Brunk     * Returns the contained request.
202feb50af361e4305a25758966b6b5df2738c00259Ruben Brunk     */
203feb50af361e4305a25758966b6b5df2738c00259Ruben Brunk    public CaptureRequest getRequest() {
204feb50af361e4305a25758966b6b5df2738c00259Ruben Brunk        return mRequest;
205feb50af361e4305a25758966b6b5df2738c00259Ruben Brunk    }
206feb50af361e4305a25758966b6b5df2738c00259Ruben Brunk
207feb50af361e4305a25758966b6b5df2738c00259Ruben Brunk    /**
208feb50af361e4305a25758966b6b5df2738c00259Ruben Brunk     * Returns a read-only collection of the surfaces targeted by the contained request.
209feb50af361e4305a25758966b6b5df2738c00259Ruben Brunk     */
210feb50af361e4305a25758966b6b5df2738c00259Ruben Brunk    public Collection<Surface> getHolderTargets() {
211feb50af361e4305a25758966b6b5df2738c00259Ruben Brunk        return getRequest().getTargets();
212feb50af361e4305a25758966b6b5df2738c00259Ruben Brunk    }
213feb50af361e4305a25758966b6b5df2738c00259Ruben Brunk
214feb50af361e4305a25758966b6b5df2738c00259Ruben Brunk    /**
215feb50af361e4305a25758966b6b5df2738c00259Ruben Brunk     * Returns true if any of the surfaces targeted by the contained request require jpeg buffers.
216feb50af361e4305a25758966b6b5df2738c00259Ruben Brunk     */
217feb50af361e4305a25758966b6b5df2738c00259Ruben Brunk    public boolean hasJpegTargets() {
218e663cb77281c4c76241b820f6126543f1c2d859fRuben Brunk        return mNumJpegTargets > 0;
219feb50af361e4305a25758966b6b5df2738c00259Ruben Brunk    }
220feb50af361e4305a25758966b6b5df2738c00259Ruben Brunk
221feb50af361e4305a25758966b6b5df2738c00259Ruben Brunk    /**
222feb50af361e4305a25758966b6b5df2738c00259Ruben Brunk     * Returns true if any of the surfaces targeted by the contained request require a
223feb50af361e4305a25758966b6b5df2738c00259Ruben Brunk     * non-jpeg buffer type.
224feb50af361e4305a25758966b6b5df2738c00259Ruben Brunk     */
225d1f113d0f0ce5099f8efba40a88398f7945bb5e0Ruben Brunk    public boolean hasPreviewTargets(){
226e663cb77281c4c76241b820f6126543f1c2d859fRuben Brunk        return mNumPreviewTargets > 0;
227e663cb77281c4c76241b820f6126543f1c2d859fRuben Brunk    }
228e663cb77281c4c76241b820f6126543f1c2d859fRuben Brunk
229e663cb77281c4c76241b820f6126543f1c2d859fRuben Brunk    /**
230e663cb77281c4c76241b820f6126543f1c2d859fRuben Brunk     * Return the number of jpeg-type surfaces targeted by this request.
231e663cb77281c4c76241b820f6126543f1c2d859fRuben Brunk     */
232e663cb77281c4c76241b820f6126543f1c2d859fRuben Brunk    public int numJpegTargets() {
233e663cb77281c4c76241b820f6126543f1c2d859fRuben Brunk        return mNumJpegTargets;
234e663cb77281c4c76241b820f6126543f1c2d859fRuben Brunk    }
235e663cb77281c4c76241b820f6126543f1c2d859fRuben Brunk
236e663cb77281c4c76241b820f6126543f1c2d859fRuben Brunk    /**
237e663cb77281c4c76241b820f6126543f1c2d859fRuben Brunk     * Return the number of non-jpeg-type surfaces targeted by this request.
238e663cb77281c4c76241b820f6126543f1c2d859fRuben Brunk     */
239e663cb77281c4c76241b820f6126543f1c2d859fRuben Brunk    public int numPreviewTargets() {
240e663cb77281c4c76241b820f6126543f1c2d859fRuben Brunk        return mNumPreviewTargets;
241e663cb77281c4c76241b820f6126543f1c2d859fRuben Brunk    }
242e663cb77281c4c76241b820f6126543f1c2d859fRuben Brunk
243e663cb77281c4c76241b820f6126543f1c2d859fRuben Brunk    /**
244385f9e2146d2600ae9fd20053aab8ee5abcac9a6Eino-Ville Talvala     * Returns true if the given surface requires jpeg buffers.
245385f9e2146d2600ae9fd20053aab8ee5abcac9a6Eino-Ville Talvala     *
246385f9e2146d2600ae9fd20053aab8ee5abcac9a6Eino-Ville Talvala     * @param s a {@link android.view.Surface} to check.
247385f9e2146d2600ae9fd20053aab8ee5abcac9a6Eino-Ville Talvala     * @return true if the surface requires a jpeg buffer.
248385f9e2146d2600ae9fd20053aab8ee5abcac9a6Eino-Ville Talvala     */
249385f9e2146d2600ae9fd20053aab8ee5abcac9a6Eino-Ville Talvala    public boolean jpegType(Surface s)
250385f9e2146d2600ae9fd20053aab8ee5abcac9a6Eino-Ville Talvala            throws LegacyExceptionUtils.BufferQueueAbandonedException {
251385f9e2146d2600ae9fd20053aab8ee5abcac9a6Eino-Ville Talvala        return LegacyCameraDevice.containsSurfaceId(s, mJpegSurfaceIds);
252385f9e2146d2600ae9fd20053aab8ee5abcac9a6Eino-Ville Talvala    }
253385f9e2146d2600ae9fd20053aab8ee5abcac9a6Eino-Ville Talvala
254385f9e2146d2600ae9fd20053aab8ee5abcac9a6Eino-Ville Talvala    /**
255e663cb77281c4c76241b820f6126543f1c2d859fRuben Brunk     * Mark this request as failed.
256e663cb77281c4c76241b820f6126543f1c2d859fRuben Brunk     */
257e663cb77281c4c76241b820f6126543f1c2d859fRuben Brunk    public void failRequest() {
258e663cb77281c4c76241b820f6126543f1c2d859fRuben Brunk        Log.w(TAG, "Capture failed for request: " + getRequestId());
259e663cb77281c4c76241b820f6126543f1c2d859fRuben Brunk        mFailed = true;
260e663cb77281c4c76241b820f6126543f1c2d859fRuben Brunk    }
261e663cb77281c4c76241b820f6126543f1c2d859fRuben Brunk
262e663cb77281c4c76241b820f6126543f1c2d859fRuben Brunk    /**
263e663cb77281c4c76241b820f6126543f1c2d859fRuben Brunk     * Return {@code true} if this request failed.
264e663cb77281c4c76241b820f6126543f1c2d859fRuben Brunk     */
265e663cb77281c4c76241b820f6126543f1c2d859fRuben Brunk    public boolean requestFailed() {
266e663cb77281c4c76241b820f6126543f1c2d859fRuben Brunk        return mFailed;
267feb50af361e4305a25758966b6b5df2738c00259Ruben Brunk    }
268feb50af361e4305a25758966b6b5df2738c00259Ruben Brunk
269feb50af361e4305a25758966b6b5df2738c00259Ruben Brunk}
270