• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (C) 2020 The Android Open Source Project
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  *      http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16 
17 // #define LOG_NDEBUG 0
18 #define LOG_TAG "CameraSessionStats"
19 #include <utils/Log.h>
20 #include <utils/String16.h>
21 
22 #include <camera/CameraSessionStats.h>
23 
24 #include <binder/Parcel.h>
25 
26 namespace android {
27 namespace hardware {
28 
readFromParcel(const android::Parcel * parcel)29 status_t CameraStreamStats::readFromParcel(const android::Parcel* parcel) {
30     if (parcel == NULL) {
31         ALOGE("%s: Null parcel", __FUNCTION__);
32         return BAD_VALUE;
33     }
34 
35     status_t err = OK;
36 
37     int width = 0;
38     if ((err = parcel->readInt32(&width)) != OK) {
39         ALOGE("%s: Failed to read width from parcel", __FUNCTION__);
40         return err;
41     }
42 
43     int height = 0;
44     if ((err = parcel->readInt32(&height)) != OK) {
45         ALOGE("%s: Failed to read height from parcel", __FUNCTION__);
46         return err;
47     }
48 
49     int format = 0;
50     if ((err = parcel->readInt32(&format)) != OK) {
51         ALOGE("%s: Failed to read format from parcel", __FUNCTION__);
52         return err;
53     }
54 
55     int dataSpace = 0;
56     if ((err = parcel->readInt32(&dataSpace)) != OK) {
57         ALOGE("%s: Failed to read dataSpace from parcel", __FUNCTION__);
58         return err;
59     }
60 
61     int64_t usage = 0;
62     if ((err = parcel->readInt64(&usage)) != OK) {
63         ALOGE("%s: Failed to read usage from parcel", __FUNCTION__);
64         return err;
65     }
66 
67     int64_t requestCount = 0;
68     if ((err = parcel->readInt64(&requestCount)) != OK) {
69         ALOGE("%s: Failed to read request count from parcel", __FUNCTION__);
70         return err;
71     }
72 
73     int64_t errorCount = 0;
74     if ((err = parcel->readInt64(&errorCount)) != OK) {
75         ALOGE("%s: Failed to read error count from parcel", __FUNCTION__);
76         return err;
77     }
78 
79     int startLatencyMs = 0;
80     if ((err = parcel->readInt32(&startLatencyMs)) != OK) {
81         ALOGE("%s: Failed to read start latency from parcel", __FUNCTION__);
82         return err;
83     }
84 
85     int maxHalBuffers = 0;
86     if ((err = parcel->readInt32(&maxHalBuffers)) != OK) {
87         ALOGE("%s: Failed to read max Hal buffers from parcel", __FUNCTION__);
88         return err;
89     }
90 
91     int maxAppBuffers = 0;
92     if ((err = parcel->readInt32(&maxAppBuffers)) != OK) {
93         ALOGE("%s: Failed to read max app buffers from parcel", __FUNCTION__);
94         return err;
95     }
96 
97     int histogramType = HISTOGRAM_TYPE_UNKNOWN;
98     if ((err = parcel->readInt32(&histogramType)) != OK) {
99         ALOGE("%s: Failed to read histogram type from parcel", __FUNCTION__);
100         return err;
101     }
102 
103     std::vector<float> histogramBins;
104     if ((err = parcel->readFloatVector(&histogramBins)) != OK) {
105         ALOGE("%s: Failed to read histogram bins from parcel", __FUNCTION__);
106         return err;
107     }
108 
109     std::vector<int64_t> histogramCounts;
110     if ((err = parcel->readInt64Vector(&histogramCounts)) != OK) {
111         ALOGE("%s: Failed to read histogram counts from parcel", __FUNCTION__);
112         return err;
113     }
114 
115     mWidth = width;
116     mHeight = height;
117     mFormat = format;
118     mDataSpace = dataSpace;
119     mUsage = usage;
120     mRequestCount = requestCount;
121     mErrorCount = errorCount;
122     mStartLatencyMs = startLatencyMs;
123     mMaxHalBuffers = maxHalBuffers;
124     mMaxAppBuffers = maxAppBuffers;
125     mHistogramType = histogramType;
126     mHistogramBins = std::move(histogramBins);
127     mHistogramCounts = std::move(histogramCounts);
128 
129     return OK;
130 }
131 
writeToParcel(android::Parcel * parcel) const132 status_t CameraStreamStats::writeToParcel(android::Parcel* parcel) const {
133     if (parcel == NULL) {
134         ALOGE("%s: Null parcel", __FUNCTION__);
135         return BAD_VALUE;
136     }
137 
138     status_t err = OK;
139 
140     if ((err = parcel->writeInt32(mWidth)) != OK) {
141         ALOGE("%s: Failed to write stream width!", __FUNCTION__);
142         return err;
143     }
144 
145     if ((err = parcel->writeInt32(mHeight)) != OK) {
146         ALOGE("%s: Failed to write stream height!", __FUNCTION__);
147         return err;
148     }
149 
150     if ((err = parcel->writeInt32(mFormat)) != OK) {
151         ALOGE("%s: Failed to write stream format!", __FUNCTION__);
152         return err;
153     }
154 
155     if ((err = parcel->writeInt32(mDataSpace)) != OK) {
156         ALOGE("%s: Failed to write stream dataSpace!", __FUNCTION__);
157         return err;
158     }
159 
160     if ((err = parcel->writeInt64(mUsage)) != OK) {
161         ALOGE("%s: Failed to write stream usage!", __FUNCTION__);
162         return err;
163     }
164 
165     if ((err = parcel->writeInt64(mRequestCount)) != OK) {
166         ALOGE("%s: Failed to write stream request count!", __FUNCTION__);
167         return err;
168     }
169 
170     if ((err = parcel->writeInt64(mErrorCount)) != OK) {
171         ALOGE("%s: Failed to write stream error count!", __FUNCTION__);
172         return err;
173     }
174 
175     if ((err = parcel->writeInt32(mStartLatencyMs)) != OK) {
176         ALOGE("%s: Failed to write stream start latency!", __FUNCTION__);
177         return err;
178     }
179 
180     if ((err = parcel->writeInt32(mMaxHalBuffers)) != OK) {
181         ALOGE("%s: Failed to write max hal buffers", __FUNCTION__);
182         return err;
183     }
184 
185     if ((err = parcel->writeInt32(mMaxAppBuffers)) != OK) {
186         ALOGE("%s: Failed to write max app buffers", __FUNCTION__);
187         return err;
188     }
189 
190     if ((err = parcel->writeInt32(mHistogramType)) != OK) {
191         ALOGE("%s: Failed to write histogram type", __FUNCTION__);
192         return err;
193     }
194 
195     if ((err = parcel->writeFloatVector(mHistogramBins)) != OK) {
196         ALOGE("%s: Failed to write histogram bins!", __FUNCTION__);
197         return err;
198     }
199 
200     if ((err = parcel->writeInt64Vector(mHistogramCounts)) != OK) {
201         ALOGE("%s: Failed to write histogram counts!", __FUNCTION__);
202         return err;
203     }
204 
205     return OK;
206 }
207 
208 const int CameraSessionStats::CAMERA_STATE_OPEN = 0;
209 const int CameraSessionStats::CAMERA_STATE_ACTIVE = 1;
210 const int CameraSessionStats::CAMERA_STATE_IDLE = 2;
211 const int CameraSessionStats::CAMERA_STATE_CLOSED = 3;
212 
213 const int CameraSessionStats::CAMERA_FACING_BACK = 0;
214 const int CameraSessionStats::CAMERA_FACING_FRONT = 1;
215 const int CameraSessionStats::CAMERA_FACING_EXTERNAL = 2;
216 
217 const int CameraSessionStats::CAMERA_API_LEVEL_1 = 1;
218 const int CameraSessionStats::CAMERA_API_LEVEL_2 = 2;
219 
CameraSessionStats()220 CameraSessionStats::CameraSessionStats() :
221         mFacing(CAMERA_FACING_BACK),
222         mNewCameraState(CAMERA_STATE_CLOSED),
223         mApiLevel(0),
224         mIsNdk(false),
225         mLatencyMs(-1),
226         mSessionType(0),
227         mInternalReconfigure(0),
228         mRequestCount(0),
229         mResultErrorCount(0),
230         mDeviceError(false) {}
231 
CameraSessionStats(const String16 & cameraId,int facing,int newCameraState,const String16 & clientName,int apiLevel,bool isNdk,int32_t latencyMs)232 CameraSessionStats::CameraSessionStats(const String16& cameraId,
233         int facing, int newCameraState, const String16& clientName,
234         int apiLevel, bool isNdk, int32_t latencyMs) :
235                 mCameraId(cameraId),
236                 mFacing(facing),
237                 mNewCameraState(newCameraState),
238                 mClientName(clientName),
239                 mApiLevel(apiLevel),
240                 mIsNdk(isNdk),
241                 mLatencyMs(latencyMs),
242                 mSessionType(0),
243                 mInternalReconfigure(0),
244                 mRequestCount(0),
245                 mResultErrorCount(0),
246                 mDeviceError(0) {}
247 
readFromParcel(const android::Parcel * parcel)248 status_t CameraSessionStats::readFromParcel(const android::Parcel* parcel) {
249     if (parcel == NULL) {
250         ALOGE("%s: Null parcel", __FUNCTION__);
251         return BAD_VALUE;
252     }
253 
254     status_t err = OK;
255 
256     String16 id;
257     if ((err = parcel->readString16(&id)) != OK) {
258         ALOGE("%s: Failed to read camera id!", __FUNCTION__);
259         return BAD_VALUE;
260     }
261 
262     int facing = 0;
263     if ((err = parcel->readInt32(&facing)) != OK) {
264         ALOGE("%s: Failed to read camera facing from parcel", __FUNCTION__);
265         return err;
266     }
267 
268     int32_t newCameraState;
269     if ((err = parcel->readInt32(&newCameraState)) != OK) {
270         ALOGE("%s: Failed to read new camera state from parcel", __FUNCTION__);
271         return err;
272     }
273 
274     String16 clientName;
275     if ((err = parcel->readString16(&clientName)) != OK) {
276         ALOGE("%s: Failed to read client name!", __FUNCTION__);
277         return BAD_VALUE;
278     }
279 
280     int32_t apiLevel;
281     if ((err = parcel->readInt32(&apiLevel)) != OK) {
282         ALOGE("%s: Failed to read api level from parcel", __FUNCTION__);
283         return err;
284     }
285 
286     bool isNdk;
287     if ((err = parcel->readBool(&isNdk)) != OK) {
288         ALOGE("%s: Failed to read isNdk flag from parcel", __FUNCTION__);
289         return err;
290     }
291 
292     int32_t latencyMs;
293     if ((err = parcel->readInt32(&latencyMs)) != OK) {
294         ALOGE("%s: Failed to read latencyMs from parcel", __FUNCTION__);
295         return err;
296     }
297 
298     int32_t sessionType;
299     if ((err = parcel->readInt32(&sessionType)) != OK) {
300         ALOGE("%s: Failed to read session type from parcel", __FUNCTION__);
301         return err;
302     }
303 
304     int32_t internalReconfigure;
305     if ((err = parcel->readInt32(&internalReconfigure)) != OK) {
306         ALOGE("%s: Failed to read internal reconfigure count from parcel", __FUNCTION__);
307         return err;
308     }
309 
310     int64_t requestCount;
311     if ((err = parcel->readInt64(&requestCount)) != OK) {
312         ALOGE("%s: Failed to read request count from parcel", __FUNCTION__);
313         return err;
314     }
315 
316     int64_t resultErrorCount;
317     if ((err = parcel->readInt64(&resultErrorCount)) != OK) {
318         ALOGE("%s: Failed to read result error count from parcel", __FUNCTION__);
319         return err;
320     }
321 
322     bool deviceError;
323     if ((err = parcel->readBool(&deviceError)) != OK) {
324         ALOGE("%s: Failed to read device error flag from parcel", __FUNCTION__);
325         return err;
326     }
327 
328     std::vector<CameraStreamStats> streamStats;
329     if ((err = parcel->readParcelableVector(&streamStats)) != OK) {
330         ALOGE("%s: Failed to read stream state from parcel", __FUNCTION__);
331         return err;
332     }
333 
334     mCameraId = id;
335     mFacing = facing;
336     mNewCameraState = newCameraState;
337     mClientName = clientName;
338     mApiLevel = apiLevel;
339     mIsNdk = isNdk;
340     mLatencyMs = latencyMs;
341     mSessionType = sessionType;
342     mInternalReconfigure = internalReconfigure;
343     mRequestCount = requestCount;
344     mResultErrorCount = resultErrorCount;
345     mDeviceError = deviceError;
346     mStreamStats = std::move(streamStats);
347 
348     return OK;
349 }
350 
writeToParcel(android::Parcel * parcel) const351 status_t CameraSessionStats::writeToParcel(android::Parcel* parcel) const {
352     if (parcel == NULL) {
353         ALOGE("%s: Null parcel", __FUNCTION__);
354         return BAD_VALUE;
355     }
356 
357     status_t err = OK;
358 
359     if ((err = parcel->writeString16(mCameraId)) != OK) {
360         ALOGE("%s: Failed to write camera id!", __FUNCTION__);
361         return err;
362     }
363 
364     if ((err = parcel->writeInt32(mFacing)) != OK) {
365         ALOGE("%s: Failed to write camera facing!", __FUNCTION__);
366         return err;
367     }
368 
369     if ((err = parcel->writeInt32(mNewCameraState)) != OK) {
370         ALOGE("%s: Failed to write new camera state!", __FUNCTION__);
371         return err;
372     }
373 
374     if ((err = parcel->writeString16(mClientName)) != OK) {
375         ALOGE("%s: Failed to write client name!", __FUNCTION__);
376         return err;
377     }
378 
379     if ((err = parcel->writeInt32(mApiLevel)) != OK) {
380         ALOGE("%s: Failed to write api level!", __FUNCTION__);
381         return err;
382     }
383 
384     if ((err = parcel->writeBool(mIsNdk)) != OK) {
385         ALOGE("%s: Failed to write isNdk flag!", __FUNCTION__);
386         return err;
387     }
388 
389     if ((err = parcel->writeInt32(mLatencyMs)) != OK) {
390         ALOGE("%s: Failed to write latency in Ms!", __FUNCTION__);
391         return err;
392     }
393 
394     if ((err = parcel->writeInt32(mSessionType)) != OK) {
395         ALOGE("%s: Failed to write session type!", __FUNCTION__);
396         return err;
397     }
398 
399     if ((err = parcel->writeInt32(mInternalReconfigure)) != OK) {
400         ALOGE("%s: Failed to write internal reconfigure count!", __FUNCTION__);
401         return err;
402     }
403 
404     if ((err = parcel->writeInt64(mRequestCount)) != OK) {
405         ALOGE("%s: Failed to write request count!", __FUNCTION__);
406         return err;
407     }
408 
409     if ((err = parcel->writeInt64(mResultErrorCount)) != OK) {
410         ALOGE("%s: Failed to write result error count!", __FUNCTION__);
411         return err;
412     }
413 
414     if ((err = parcel->writeBool(mDeviceError)) != OK) {
415         ALOGE("%s: Failed to write device error flag!", __FUNCTION__);
416         return err;
417     }
418 
419     if ((err = parcel->writeParcelableVector(mStreamStats)) != OK) {
420         ALOGE("%s: Failed to write stream states!", __FUNCTION__);
421         return err;
422     }
423 
424     return OK;
425 }
426 
427 } // namespace hardware
428 } // namesmpace android
429