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