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