1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
|
/*
* 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.CameraCaptureSession;
import android.hardware.camera2.CaptureRequest;
import android.hardware.camera2.utils.SubmitInfo;
import java.util.List;
/**
* This class holds a capture ID and its expected last regular, zslStill, and reprocess
* frame number.
*/
public class RequestLastFrameNumbersHolder {
// request ID
private final int mRequestId;
// The last regular frame number for this request ID. It's
// CaptureCallback.NO_FRAMES_CAPTURED if the request ID has no regular request.
private final long mLastRegularFrameNumber;
// The last reprocess frame number for this request ID. It's
// CaptureCallback.NO_FRAMES_CAPTURED if the request ID has no reprocess request.
private final long mLastReprocessFrameNumber;
// The last ZSL still capture frame number for this request ID. It's
// CaptureCallback.NO_FRAMES_CAPTURED if the request ID has no zsl request.
private final long mLastZslStillFrameNumber;
// Whether the sequence is completed. (only consider capture result)
private boolean mSequenceCompleted;
// Whether the inflight request is completed. (consider result, buffers, and notifies)
private boolean mInflightCompleted;
/**
* Create a request-last-frame-numbers holder with a list of requests, request ID, and
* the last frame number returned by camera service.
*/
public RequestLastFrameNumbersHolder(List<CaptureRequest> requestList, SubmitInfo requestInfo) {
long lastRegularFrameNumber = CameraCaptureSession.CaptureCallback.NO_FRAMES_CAPTURED;
long lastReprocessFrameNumber = CameraCaptureSession.CaptureCallback.NO_FRAMES_CAPTURED;
long lastZslStillFrameNumber = CameraCaptureSession.CaptureCallback.NO_FRAMES_CAPTURED;
long frameNumber = requestInfo.getLastFrameNumber();
if (requestInfo.getLastFrameNumber() < requestList.size() - 1) {
throw new IllegalArgumentException(
"lastFrameNumber: " + requestInfo.getLastFrameNumber() +
" should be at least " + (requestList.size() - 1) + " for the number of " +
" requests in the list: " + requestList.size());
}
// find the last regular, zslStill, and reprocess frame number
for (int i = requestList.size() - 1; i >= 0; i--) {
CaptureRequest request = requestList.get(i);
int requestType = request.getRequestType();
if (requestType == CaptureRequest.REQUEST_TYPE_REPROCESS
&& lastReprocessFrameNumber ==
CameraCaptureSession.CaptureCallback.NO_FRAMES_CAPTURED) {
lastReprocessFrameNumber = frameNumber;
} else if (requestType == CaptureRequest.REQUEST_TYPE_ZSL_STILL
&& lastZslStillFrameNumber ==
CameraCaptureSession.CaptureCallback.NO_FRAMES_CAPTURED) {
lastZslStillFrameNumber = frameNumber;
} else if (requestType == CaptureRequest.REQUEST_TYPE_REGULAR
&& lastRegularFrameNumber ==
CameraCaptureSession.CaptureCallback.NO_FRAMES_CAPTURED) {
lastRegularFrameNumber = frameNumber;
}
if (lastReprocessFrameNumber != CameraCaptureSession.CaptureCallback.NO_FRAMES_CAPTURED
&& lastZslStillFrameNumber !=
CameraCaptureSession.CaptureCallback.NO_FRAMES_CAPTURED
&& lastRegularFrameNumber !=
CameraCaptureSession.CaptureCallback.NO_FRAMES_CAPTURED) {
break;
}
frameNumber--;
}
mLastRegularFrameNumber = lastRegularFrameNumber;
mLastReprocessFrameNumber = lastReprocessFrameNumber;
mLastZslStillFrameNumber = lastZslStillFrameNumber;
mRequestId = requestInfo.getRequestId();
mSequenceCompleted = false;
mInflightCompleted = false;
}
/**
* Create a request-last-frame-numbers holder with a request ID and last regular/ZslStill
* frame number.
*/
RequestLastFrameNumbersHolder(int requestId, long lastFrameNumber,
int[] repeatingRequestTypes) {
long lastRegularFrameNumber = CameraCaptureSession.CaptureCallback.NO_FRAMES_CAPTURED;
long lastZslStillFrameNumber = CameraCaptureSession.CaptureCallback.NO_FRAMES_CAPTURED;
if (repeatingRequestTypes == null) {
throw new IllegalArgumentException(
"repeatingRequest list must not be null");
}
if (lastFrameNumber < repeatingRequestTypes.length - 1) {
throw new IllegalArgumentException(
"lastFrameNumber: " + lastFrameNumber + " should be at least "
+ (repeatingRequestTypes.length - 1)
+ " for the number of requests in the list: "
+ repeatingRequestTypes.length);
}
long frameNumber = lastFrameNumber;
for (int i = repeatingRequestTypes.length - 1; i >= 0; i--) {
if (repeatingRequestTypes[i] == CaptureRequest.REQUEST_TYPE_ZSL_STILL
&& lastZslStillFrameNumber ==
CameraCaptureSession.CaptureCallback.NO_FRAMES_CAPTURED) {
lastZslStillFrameNumber = frameNumber;
} else if (repeatingRequestTypes[i] == CaptureRequest.REQUEST_TYPE_REGULAR
&& lastRegularFrameNumber ==
CameraCaptureSession.CaptureCallback.NO_FRAMES_CAPTURED) {
lastRegularFrameNumber = frameNumber;
}
if (lastZslStillFrameNumber != CameraCaptureSession.CaptureCallback.NO_FRAMES_CAPTURED
&& lastRegularFrameNumber !=
CameraCaptureSession.CaptureCallback.NO_FRAMES_CAPTURED) {
break;
}
frameNumber--;
}
mLastRegularFrameNumber = lastRegularFrameNumber;
mLastZslStillFrameNumber = lastZslStillFrameNumber;
mLastReprocessFrameNumber = CameraCaptureSession.CaptureCallback.NO_FRAMES_CAPTURED;
mRequestId = requestId;
mSequenceCompleted = false;
mInflightCompleted = false;
}
/**
* Return the last regular frame number. Return CaptureCallback.NO_FRAMES_CAPTURED if
* it contains no regular request.
*/
public long getLastRegularFrameNumber() {
return mLastRegularFrameNumber;
}
/**
* Return the last reprocess frame number. Return CaptureCallback.NO_FRAMES_CAPTURED if
* it contains no reprocess request.
*/
public long getLastReprocessFrameNumber() {
return mLastReprocessFrameNumber;
}
/**
* Return the last ZslStill frame number. Return CaptureCallback.NO_FRAMES_CAPTURED if
* it contains no Zsl request.
*/
public long getLastZslStillFrameNumber() {
return mLastZslStillFrameNumber;
}
/**
* Return the last frame number overall.
*/
public long getLastFrameNumber() {
return Math.max(mLastZslStillFrameNumber,
Math.max(mLastRegularFrameNumber, mLastReprocessFrameNumber));
}
/**
* Return the request ID.
*/
public int getRequestId() {
return mRequestId;
}
/**
* Return whether the capture sequence is completed.
*/
public boolean isSequenceCompleted() {
return mSequenceCompleted;
}
/**
* Mark the capture sequence as completed.
*/
public void markSequenceCompleted() {
mSequenceCompleted = true;
}
/**
* Return whether the inflight capture is completed.
*/
public boolean isInflightCompleted() {
return mInflightCompleted;
}
/**
* Mark the inflight capture as completed.
*/
public void markInflightCompleted() {
mInflightCompleted = true;
}
}
|