blob: 26c612af61f499f22970b354f3d6e0cea4dc3e6a [file] [log] [blame]
Shuzhen Wang316781a2020-08-18 18:11:01 -07001/*
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
26namespace android {
27namespace hardware {
28
29status_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
Austin Borger4a870a32022-02-25 01:48:41 +000055 float maxPreviewFps = 0;
56 if ((err = parcel->readFloat(&maxPreviewFps)) != OK) {
57 ALOGE("%s: Failed to read maxPreviewFps from parcel", __FUNCTION__);
58 return err;
59 }
60
Shuzhen Wang316781a2020-08-18 18:11:01 -070061 int dataSpace = 0;
62 if ((err = parcel->readInt32(&dataSpace)) != OK) {
63 ALOGE("%s: Failed to read dataSpace from parcel", __FUNCTION__);
64 return err;
65 }
66
67 int64_t usage = 0;
68 if ((err = parcel->readInt64(&usage)) != OK) {
69 ALOGE("%s: Failed to read usage from parcel", __FUNCTION__);
70 return err;
71 }
72
73 int64_t requestCount = 0;
74 if ((err = parcel->readInt64(&requestCount)) != OK) {
75 ALOGE("%s: Failed to read request count from parcel", __FUNCTION__);
76 return err;
77 }
78
79 int64_t errorCount = 0;
80 if ((err = parcel->readInt64(&errorCount)) != OK) {
81 ALOGE("%s: Failed to read error count from parcel", __FUNCTION__);
82 return err;
83 }
84
85 int startLatencyMs = 0;
86 if ((err = parcel->readInt32(&startLatencyMs)) != OK) {
87 ALOGE("%s: Failed to read start latency from parcel", __FUNCTION__);
88 return err;
89 }
90
91 int maxHalBuffers = 0;
92 if ((err = parcel->readInt32(&maxHalBuffers)) != OK) {
93 ALOGE("%s: Failed to read max Hal buffers from parcel", __FUNCTION__);
94 return err;
95 }
96
97 int maxAppBuffers = 0;
98 if ((err = parcel->readInt32(&maxAppBuffers)) != OK) {
99 ALOGE("%s: Failed to read max app buffers from parcel", __FUNCTION__);
100 return err;
101 }
102
Shuzhen Wangdb8f2782020-10-30 08:43:37 -0700103 int histogramType = HISTOGRAM_TYPE_UNKNOWN;
104 if ((err = parcel->readInt32(&histogramType)) != OK) {
105 ALOGE("%s: Failed to read histogram type from parcel", __FUNCTION__);
106 return err;
107 }
108
109 std::vector<float> histogramBins;
110 if ((err = parcel->readFloatVector(&histogramBins)) != OK) {
111 ALOGE("%s: Failed to read histogram bins from parcel", __FUNCTION__);
112 return err;
113 }
114
115 std::vector<int64_t> histogramCounts;
116 if ((err = parcel->readInt64Vector(&histogramCounts)) != OK) {
117 ALOGE("%s: Failed to read histogram counts from parcel", __FUNCTION__);
118 return err;
119 }
120
Shuzhen Wang8ed1e872022-03-08 16:34:33 -0800121 int64_t dynamicRangeProfile = ANDROID_REQUEST_AVAILABLE_DYNAMIC_RANGE_PROFILES_MAP_STANDARD;
122 if ((err = parcel->readInt64(&dynamicRangeProfile)) != OK) {
Emilian Peev2295df72021-11-12 18:14:10 -0800123 ALOGE("%s: Failed to read dynamic range profile type from parcel", __FUNCTION__);
124 return err;
125 }
126
Shuzhen Wang8ed1e872022-03-08 16:34:33 -0800127 int64_t streamUseCase = ANDROID_SCALER_AVAILABLE_STREAM_USE_CASES_DEFAULT;
128 if ((err = parcel->readInt64(&streamUseCase)) != OK) {
Shuzhen Wangc8ab4522021-12-14 20:12:42 -0800129 ALOGE("%s: Failed to read stream use case from parcel", __FUNCTION__);
130 return err;
131 }
132
Austin Borger9e2b27c2022-07-15 11:27:24 -0700133 int32_t colorSpace = ANDROID_REQUEST_AVAILABLE_COLOR_SPACE_PROFILES_MAP_UNSPECIFIED;
134 if ((err = parcel->readInt32(&colorSpace)) != OK) {
135 ALOGE("%s: Failed to read color space from parcel", __FUNCTION__);
136 return err;
137 }
138
Shuzhen Wang316781a2020-08-18 18:11:01 -0700139 mWidth = width;
140 mHeight = height;
141 mFormat = format;
Austin Borger4a870a32022-02-25 01:48:41 +0000142 mMaxPreviewFps = maxPreviewFps;
Shuzhen Wang316781a2020-08-18 18:11:01 -0700143 mDataSpace = dataSpace;
144 mUsage = usage;
145 mRequestCount = requestCount;
146 mErrorCount = errorCount;
147 mStartLatencyMs = startLatencyMs;
148 mMaxHalBuffers = maxHalBuffers;
149 mMaxAppBuffers = maxAppBuffers;
Shuzhen Wangdb8f2782020-10-30 08:43:37 -0700150 mHistogramType = histogramType;
151 mHistogramBins = std::move(histogramBins);
152 mHistogramCounts = std::move(histogramCounts);
Emilian Peev2295df72021-11-12 18:14:10 -0800153 mDynamicRangeProfile = dynamicRangeProfile;
Shuzhen Wangc8ab4522021-12-14 20:12:42 -0800154 mStreamUseCase = streamUseCase;
Austin Borger9e2b27c2022-07-15 11:27:24 -0700155 mColorSpace = colorSpace;
Shuzhen Wang316781a2020-08-18 18:11:01 -0700156
157 return OK;
158}
159
160status_t CameraStreamStats::writeToParcel(android::Parcel* parcel) const {
161 if (parcel == NULL) {
162 ALOGE("%s: Null parcel", __FUNCTION__);
163 return BAD_VALUE;
164 }
165
166 status_t err = OK;
167
168 if ((err = parcel->writeInt32(mWidth)) != OK) {
169 ALOGE("%s: Failed to write stream width!", __FUNCTION__);
170 return err;
171 }
172
173 if ((err = parcel->writeInt32(mHeight)) != OK) {
174 ALOGE("%s: Failed to write stream height!", __FUNCTION__);
175 return err;
176 }
177
178 if ((err = parcel->writeInt32(mFormat)) != OK) {
179 ALOGE("%s: Failed to write stream format!", __FUNCTION__);
180 return err;
181 }
182
Austin Borger4a870a32022-02-25 01:48:41 +0000183 if ((err = parcel->writeFloat(mMaxPreviewFps)) != OK) {
184 ALOGE("%s: Failed to write stream maxPreviewFps!", __FUNCTION__);
185 return err;
186 }
187
Shuzhen Wang316781a2020-08-18 18:11:01 -0700188 if ((err = parcel->writeInt32(mDataSpace)) != OK) {
189 ALOGE("%s: Failed to write stream dataSpace!", __FUNCTION__);
190 return err;
191 }
192
193 if ((err = parcel->writeInt64(mUsage)) != OK) {
194 ALOGE("%s: Failed to write stream usage!", __FUNCTION__);
195 return err;
196 }
197
198 if ((err = parcel->writeInt64(mRequestCount)) != OK) {
199 ALOGE("%s: Failed to write stream request count!", __FUNCTION__);
200 return err;
201 }
202
203 if ((err = parcel->writeInt64(mErrorCount)) != OK) {
204 ALOGE("%s: Failed to write stream error count!", __FUNCTION__);
205 return err;
206 }
207
208 if ((err = parcel->writeInt32(mStartLatencyMs)) != OK) {
209 ALOGE("%s: Failed to write stream start latency!", __FUNCTION__);
210 return err;
211 }
212
213 if ((err = parcel->writeInt32(mMaxHalBuffers)) != OK) {
214 ALOGE("%s: Failed to write max hal buffers", __FUNCTION__);
215 return err;
216 }
217
218 if ((err = parcel->writeInt32(mMaxAppBuffers)) != OK) {
219 ALOGE("%s: Failed to write max app buffers", __FUNCTION__);
220 return err;
221 }
222
Shuzhen Wangdb8f2782020-10-30 08:43:37 -0700223 if ((err = parcel->writeInt32(mHistogramType)) != OK) {
224 ALOGE("%s: Failed to write histogram type", __FUNCTION__);
225 return err;
226 }
227
228 if ((err = parcel->writeFloatVector(mHistogramBins)) != OK) {
229 ALOGE("%s: Failed to write histogram bins!", __FUNCTION__);
230 return err;
231 }
232
233 if ((err = parcel->writeInt64Vector(mHistogramCounts)) != OK) {
234 ALOGE("%s: Failed to write histogram counts!", __FUNCTION__);
235 return err;
236 }
237
Shuzhen Wang8ed1e872022-03-08 16:34:33 -0800238 if ((err = parcel->writeInt64(mDynamicRangeProfile)) != OK) {
Emilian Peev2295df72021-11-12 18:14:10 -0800239 ALOGE("%s: Failed to write dynamic range profile type", __FUNCTION__);
240 return err;
241 }
242
Shuzhen Wang8ed1e872022-03-08 16:34:33 -0800243 if ((err = parcel->writeInt64(mStreamUseCase)) != OK) {
Shuzhen Wangc8ab4522021-12-14 20:12:42 -0800244 ALOGE("%s: Failed to write stream use case!", __FUNCTION__);
245 return err;
246 }
247
Austin Borger9e2b27c2022-07-15 11:27:24 -0700248 if ((err = parcel->writeInt32(mColorSpace)) != OK) {
249 ALOGE("%s: Failed to write color space", __FUNCTION__);
250 return err;
251 }
252
Shuzhen Wang316781a2020-08-18 18:11:01 -0700253 return OK;
254}
255
Shuzhen Wangbac18d92020-11-19 14:50:30 -0800256const int CameraSessionStats::CAMERA_STATE_OPEN = 0;
257const int CameraSessionStats::CAMERA_STATE_ACTIVE = 1;
258const int CameraSessionStats::CAMERA_STATE_IDLE = 2;
259const int CameraSessionStats::CAMERA_STATE_CLOSED = 3;
260
261const int CameraSessionStats::CAMERA_FACING_BACK = 0;
262const int CameraSessionStats::CAMERA_FACING_FRONT = 1;
263const int CameraSessionStats::CAMERA_FACING_EXTERNAL = 2;
264
265const int CameraSessionStats::CAMERA_API_LEVEL_1 = 1;
266const int CameraSessionStats::CAMERA_API_LEVEL_2 = 2;
267
Shuzhen Wang316781a2020-08-18 18:11:01 -0700268CameraSessionStats::CameraSessionStats() :
269 mFacing(CAMERA_FACING_BACK),
270 mNewCameraState(CAMERA_STATE_CLOSED),
271 mApiLevel(0),
272 mIsNdk(false),
273 mLatencyMs(-1),
Avichal Rakesh88fc5222023-03-03 15:00:59 -0800274 mLogId(0),
Austin Borger4a870a32022-02-25 01:48:41 +0000275 mMaxPreviewFps(0),
Shuzhen Wang316781a2020-08-18 18:11:01 -0700276 mSessionType(0),
277 mInternalReconfigure(0),
278 mRequestCount(0),
279 mResultErrorCount(0),
Shuzhen Wang9372b0b2022-05-11 18:55:19 -0700280 mDeviceError(false),
281 mVideoStabilizationMode(-1) {}
Shuzhen Wang316781a2020-08-18 18:11:01 -0700282
283CameraSessionStats::CameraSessionStats(const String16& cameraId,
284 int facing, int newCameraState, const String16& clientName,
Avichal Rakesh88fc5222023-03-03 15:00:59 -0800285 int apiLevel, bool isNdk, int32_t latencyMs, int64_t logId) :
Shuzhen Wang316781a2020-08-18 18:11:01 -0700286 mCameraId(cameraId),
287 mFacing(facing),
288 mNewCameraState(newCameraState),
289 mClientName(clientName),
290 mApiLevel(apiLevel),
291 mIsNdk(isNdk),
292 mLatencyMs(latencyMs),
Avichal Rakesh88fc5222023-03-03 15:00:59 -0800293 mLogId(logId),
Austin Borger4a870a32022-02-25 01:48:41 +0000294 mMaxPreviewFps(0),
Shuzhen Wang316781a2020-08-18 18:11:01 -0700295 mSessionType(0),
296 mInternalReconfigure(0),
297 mRequestCount(0),
298 mResultErrorCount(0),
Shuzhen Wang9372b0b2022-05-11 18:55:19 -0700299 mDeviceError(0),
300 mVideoStabilizationMode(-1) {}
Shuzhen Wang316781a2020-08-18 18:11:01 -0700301
302status_t CameraSessionStats::readFromParcel(const android::Parcel* parcel) {
303 if (parcel == NULL) {
304 ALOGE("%s: Null parcel", __FUNCTION__);
305 return BAD_VALUE;
306 }
307
308 status_t err = OK;
309
310 String16 id;
311 if ((err = parcel->readString16(&id)) != OK) {
312 ALOGE("%s: Failed to read camera id!", __FUNCTION__);
313 return BAD_VALUE;
314 }
315
316 int facing = 0;
317 if ((err = parcel->readInt32(&facing)) != OK) {
318 ALOGE("%s: Failed to read camera facing from parcel", __FUNCTION__);
319 return err;
320 }
321
322 int32_t newCameraState;
323 if ((err = parcel->readInt32(&newCameraState)) != OK) {
324 ALOGE("%s: Failed to read new camera state from parcel", __FUNCTION__);
325 return err;
326 }
327
328 String16 clientName;
329 if ((err = parcel->readString16(&clientName)) != OK) {
330 ALOGE("%s: Failed to read client name!", __FUNCTION__);
331 return BAD_VALUE;
332 }
333
334 int32_t apiLevel;
335 if ((err = parcel->readInt32(&apiLevel)) != OK) {
336 ALOGE("%s: Failed to read api level from parcel", __FUNCTION__);
337 return err;
338 }
339
340 bool isNdk;
341 if ((err = parcel->readBool(&isNdk)) != OK) {
342 ALOGE("%s: Failed to read isNdk flag from parcel", __FUNCTION__);
343 return err;
344 }
345
346 int32_t latencyMs;
347 if ((err = parcel->readInt32(&latencyMs)) != OK) {
348 ALOGE("%s: Failed to read latencyMs from parcel", __FUNCTION__);
349 return err;
350 }
351
Avichal Rakesh88fc5222023-03-03 15:00:59 -0800352 int64_t logId;
353 if ((err = parcel->readInt64(&logId)) != OK) {
354 ALOGE("%s: Failed to read log ID from parcel", __FUNCTION__);
355 return err;
356 }
357
Austin Borger4a870a32022-02-25 01:48:41 +0000358 float maxPreviewFps;
359 if ((err = parcel->readFloat(&maxPreviewFps)) != OK) {
360 ALOGE("%s: Failed to read maxPreviewFps from parcel", __FUNCTION__);
361 return err;
362 }
363
Shuzhen Wang316781a2020-08-18 18:11:01 -0700364 int32_t sessionType;
365 if ((err = parcel->readInt32(&sessionType)) != OK) {
366 ALOGE("%s: Failed to read session type from parcel", __FUNCTION__);
367 return err;
368 }
369
370 int32_t internalReconfigure;
371 if ((err = parcel->readInt32(&internalReconfigure)) != OK) {
372 ALOGE("%s: Failed to read internal reconfigure count from parcel", __FUNCTION__);
373 return err;
374 }
375
376 int64_t requestCount;
377 if ((err = parcel->readInt64(&requestCount)) != OK) {
378 ALOGE("%s: Failed to read request count from parcel", __FUNCTION__);
379 return err;
380 }
381
382 int64_t resultErrorCount;
383 if ((err = parcel->readInt64(&resultErrorCount)) != OK) {
384 ALOGE("%s: Failed to read result error count from parcel", __FUNCTION__);
385 return err;
386 }
387
388 bool deviceError;
389 if ((err = parcel->readBool(&deviceError)) != OK) {
390 ALOGE("%s: Failed to read device error flag from parcel", __FUNCTION__);
391 return err;
392 }
393
394 std::vector<CameraStreamStats> streamStats;
395 if ((err = parcel->readParcelableVector(&streamStats)) != OK) {
396 ALOGE("%s: Failed to read stream state from parcel", __FUNCTION__);
397 return err;
398 }
399
Shuzhen Wangd26b1862022-03-07 12:05:05 -0800400 String16 userTag;
401 if ((err = parcel->readString16(&userTag)) != OK) {
402 ALOGE("%s: Failed to read user tag!", __FUNCTION__);
403 return BAD_VALUE;
404 }
405
Shuzhen Wang9372b0b2022-05-11 18:55:19 -0700406 int32_t videoStabilizationMode;
407 if ((err = parcel->readInt32(&videoStabilizationMode)) != OK) {
408 ALOGE("%s: Failed to read video stabilization mode from parcel", __FUNCTION__);
409 return err;
410 }
411
Shuzhen Wang316781a2020-08-18 18:11:01 -0700412 mCameraId = id;
413 mFacing = facing;
414 mNewCameraState = newCameraState;
415 mClientName = clientName;
416 mApiLevel = apiLevel;
417 mIsNdk = isNdk;
418 mLatencyMs = latencyMs;
Avichal Rakesh88fc5222023-03-03 15:00:59 -0800419 mLogId = logId;
Austin Borger4a870a32022-02-25 01:48:41 +0000420 mMaxPreviewFps = maxPreviewFps;
Shuzhen Wang316781a2020-08-18 18:11:01 -0700421 mSessionType = sessionType;
422 mInternalReconfigure = internalReconfigure;
423 mRequestCount = requestCount;
424 mResultErrorCount = resultErrorCount;
425 mDeviceError = deviceError;
426 mStreamStats = std::move(streamStats);
Shuzhen Wangd26b1862022-03-07 12:05:05 -0800427 mUserTag = userTag;
Shuzhen Wang9372b0b2022-05-11 18:55:19 -0700428 mVideoStabilizationMode = videoStabilizationMode;
Shuzhen Wang316781a2020-08-18 18:11:01 -0700429
430 return OK;
431}
432
433status_t CameraSessionStats::writeToParcel(android::Parcel* parcel) const {
434 if (parcel == NULL) {
435 ALOGE("%s: Null parcel", __FUNCTION__);
436 return BAD_VALUE;
437 }
438
439 status_t err = OK;
440
441 if ((err = parcel->writeString16(mCameraId)) != OK) {
442 ALOGE("%s: Failed to write camera id!", __FUNCTION__);
443 return err;
444 }
445
446 if ((err = parcel->writeInt32(mFacing)) != OK) {
447 ALOGE("%s: Failed to write camera facing!", __FUNCTION__);
448 return err;
449 }
450
451 if ((err = parcel->writeInt32(mNewCameraState)) != OK) {
452 ALOGE("%s: Failed to write new camera state!", __FUNCTION__);
453 return err;
454 }
455
456 if ((err = parcel->writeString16(mClientName)) != OK) {
457 ALOGE("%s: Failed to write client name!", __FUNCTION__);
458 return err;
459 }
460
461 if ((err = parcel->writeInt32(mApiLevel)) != OK) {
462 ALOGE("%s: Failed to write api level!", __FUNCTION__);
463 return err;
464 }
465
466 if ((err = parcel->writeBool(mIsNdk)) != OK) {
467 ALOGE("%s: Failed to write isNdk flag!", __FUNCTION__);
468 return err;
469 }
470
471 if ((err = parcel->writeInt32(mLatencyMs)) != OK) {
472 ALOGE("%s: Failed to write latency in Ms!", __FUNCTION__);
473 return err;
474 }
475
Avichal Rakesh88fc5222023-03-03 15:00:59 -0800476 if ((err = parcel->writeInt64(mLogId)) != OK) {
477 ALOGE("%s: Failed to write log ID!", __FUNCTION__);
478 return err;
479 }
480
Austin Borger4a870a32022-02-25 01:48:41 +0000481 if ((err = parcel->writeFloat(mMaxPreviewFps)) != OK) {
482 ALOGE("%s: Failed to write maxPreviewFps!", __FUNCTION__);
483 return err;
484 }
485
Shuzhen Wang316781a2020-08-18 18:11:01 -0700486 if ((err = parcel->writeInt32(mSessionType)) != OK) {
487 ALOGE("%s: Failed to write session type!", __FUNCTION__);
488 return err;
489 }
490
491 if ((err = parcel->writeInt32(mInternalReconfigure)) != OK) {
492 ALOGE("%s: Failed to write internal reconfigure count!", __FUNCTION__);
493 return err;
494 }
495
496 if ((err = parcel->writeInt64(mRequestCount)) != OK) {
497 ALOGE("%s: Failed to write request count!", __FUNCTION__);
498 return err;
499 }
500
501 if ((err = parcel->writeInt64(mResultErrorCount)) != OK) {
502 ALOGE("%s: Failed to write result error count!", __FUNCTION__);
503 return err;
504 }
505
506 if ((err = parcel->writeBool(mDeviceError)) != OK) {
507 ALOGE("%s: Failed to write device error flag!", __FUNCTION__);
508 return err;
509 }
510
511 if ((err = parcel->writeParcelableVector(mStreamStats)) != OK) {
512 ALOGE("%s: Failed to write stream states!", __FUNCTION__);
513 return err;
514 }
515
Shuzhen Wangd26b1862022-03-07 12:05:05 -0800516 if ((err = parcel->writeString16(mUserTag)) != OK) {
517 ALOGE("%s: Failed to write user tag!", __FUNCTION__);
518 return err;
519 }
Shuzhen Wang9372b0b2022-05-11 18:55:19 -0700520
521 if ((err = parcel->writeInt32(mVideoStabilizationMode)) != OK) {
522 ALOGE("%s: Failed to write video stabilization mode!", __FUNCTION__);
523 return err;
524 }
Avichal Rakesh88fc5222023-03-03 15:00:59 -0800525
Shuzhen Wang316781a2020-08-18 18:11:01 -0700526 return OK;
527}
528
529} // namespace hardware
530} // namesmpace android