120 lines
3.9 KiB
Java
120 lines
3.9 KiB
Java
/*
|
|
* Copyright (C) 2019 The Android Open Source Project
|
|
*
|
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
* you may not use this file except in compliance with the License.
|
|
* You may obtain a copy of the License at
|
|
*
|
|
* http://www.apache.org/licenses/LICENSE-2.0
|
|
*
|
|
* Unless required by applicable law or agreed to in writing, software
|
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
* See the License for the specific language governing permissions and
|
|
* limitations under the License.
|
|
*/
|
|
|
|
|
|
package android.hardware.camera2.impl;
|
|
|
|
import android.hardware.camera2.CaptureRequest;
|
|
import android.view.Surface;
|
|
|
|
import java.util.ArrayList;
|
|
import java.util.Collection;
|
|
import java.util.List;
|
|
import java.util.concurrent.Executor;
|
|
|
|
public class CaptureCallbackHolder {
|
|
|
|
private final boolean mRepeating;
|
|
private final CaptureCallback mCallback;
|
|
private final List<CaptureRequest> mRequestList;
|
|
private final Executor mExecutor;
|
|
private final int mSessionId;
|
|
/**
|
|
* <p>Determine if the callback holder is for a constrained high speed request list that
|
|
* expects batched capture results. Capture results will be batched if the request list
|
|
* is interleaved with preview and video requests. Capture results won't be batched if the
|
|
* request list only contains preview requests, or if the request doesn't belong to a
|
|
* constrained high speed list.
|
|
*/
|
|
private final boolean mHasBatchedOutputs;
|
|
|
|
CaptureCallbackHolder(CaptureCallback callback, List<CaptureRequest> requestList,
|
|
Executor executor, boolean repeating, int sessionId) {
|
|
if (callback == null || executor == null) {
|
|
throw new UnsupportedOperationException(
|
|
"Must have a valid handler and a valid callback");
|
|
}
|
|
mRepeating = repeating;
|
|
mExecutor = executor;
|
|
mRequestList = new ArrayList<CaptureRequest>(requestList);
|
|
mCallback = callback;
|
|
mSessionId = sessionId;
|
|
|
|
// Check whether this callback holder is for batched outputs.
|
|
// The logic here should match createHighSpeedRequestList.
|
|
boolean hasBatchedOutputs = true;
|
|
for (int i = 0; i < requestList.size(); i++) {
|
|
CaptureRequest request = requestList.get(i);
|
|
if (!request.isPartOfCRequestList()) {
|
|
hasBatchedOutputs = false;
|
|
break;
|
|
}
|
|
if (i == 0) {
|
|
Collection<Surface> targets = request.getTargets();
|
|
if (targets.size() != 2) {
|
|
hasBatchedOutputs = false;
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
mHasBatchedOutputs = hasBatchedOutputs;
|
|
}
|
|
|
|
public boolean isRepeating() {
|
|
return mRepeating;
|
|
}
|
|
|
|
public CaptureCallback getCallback() {
|
|
return mCallback;
|
|
}
|
|
|
|
public CaptureRequest getRequest(int subsequenceId) {
|
|
if (subsequenceId >= mRequestList.size()) {
|
|
throw new IllegalArgumentException(
|
|
String.format(
|
|
"Requested subsequenceId %d is larger than request list size %d.",
|
|
subsequenceId, mRequestList.size()));
|
|
} else {
|
|
if (subsequenceId < 0) {
|
|
throw new IllegalArgumentException(String.format(
|
|
"Requested subsequenceId %d is negative", subsequenceId));
|
|
} else {
|
|
return mRequestList.get(subsequenceId);
|
|
}
|
|
}
|
|
}
|
|
|
|
public CaptureRequest getRequest() {
|
|
return getRequest(0);
|
|
}
|
|
|
|
public Executor getExecutor() {
|
|
return mExecutor;
|
|
}
|
|
|
|
public int getSessionId() {
|
|
return mSessionId;
|
|
}
|
|
|
|
public int getRequestCount() {
|
|
return mRequestList.size();
|
|
}
|
|
|
|
public boolean hasBatchedOutputs() {
|
|
return mHasBatchedOutputs;
|
|
}
|
|
}
|