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