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