• 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     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 
61     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 
103     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 
121     int64_t dynamicRangeProfile = ANDROID_REQUEST_AVAILABLE_DYNAMIC_RANGE_PROFILES_MAP_STANDARD;
122     if ((err = parcel->readInt64(&dynamicRangeProfile)) != OK) {
123         ALOGE("%s: Failed to read dynamic range profile type from parcel", __FUNCTION__);
124         return err;
125     }
126 
127     int64_t streamUseCase = ANDROID_SCALER_AVAILABLE_STREAM_USE_CASES_DEFAULT;
128     if ((err = parcel->readInt64(&streamUseCase)) != OK) {
129         ALOGE("%s: Failed to read stream use case from parcel", __FUNCTION__);
130         return err;
131     }
132 
133     mWidth = width;
134     mHeight = height;
135     mFormat = format;
136     mMaxPreviewFps = maxPreviewFps;
137     mDataSpace = dataSpace;
138     mUsage = usage;
139     mRequestCount = requestCount;
140     mErrorCount = errorCount;
141     mStartLatencyMs = startLatencyMs;
142     mMaxHalBuffers = maxHalBuffers;
143     mMaxAppBuffers = maxAppBuffers;
144     mHistogramType = histogramType;
145     mHistogramBins = std::move(histogramBins);
146     mHistogramCounts = std::move(histogramCounts);
147     mDynamicRangeProfile = dynamicRangeProfile;
148     mStreamUseCase = streamUseCase;
149 
150     return OK;
151 }
152 
writeToParcel(android::Parcel * parcel) const153 status_t CameraStreamStats::writeToParcel(android::Parcel* parcel) const {
154     if (parcel == NULL) {
155         ALOGE("%s: Null parcel", __FUNCTION__);
156         return BAD_VALUE;
157     }
158 
159     status_t err = OK;
160 
161     if ((err = parcel->writeInt32(mWidth)) != OK) {
162         ALOGE("%s: Failed to write stream width!", __FUNCTION__);
163         return err;
164     }
165 
166     if ((err = parcel->writeInt32(mHeight)) != OK) {
167         ALOGE("%s: Failed to write stream height!", __FUNCTION__);
168         return err;
169     }
170 
171     if ((err = parcel->writeInt32(mFormat)) != OK) {
172         ALOGE("%s: Failed to write stream format!", __FUNCTION__);
173         return err;
174     }
175 
176     if ((err = parcel->writeFloat(mMaxPreviewFps)) != OK) {
177         ALOGE("%s: Failed to write stream maxPreviewFps!", __FUNCTION__);
178         return err;
179     }
180 
181     if ((err = parcel->writeInt32(mDataSpace)) != OK) {
182         ALOGE("%s: Failed to write stream dataSpace!", __FUNCTION__);
183         return err;
184     }
185 
186     if ((err = parcel->writeInt64(mUsage)) != OK) {
187         ALOGE("%s: Failed to write stream usage!", __FUNCTION__);
188         return err;
189     }
190 
191     if ((err = parcel->writeInt64(mRequestCount)) != OK) {
192         ALOGE("%s: Failed to write stream request count!", __FUNCTION__);
193         return err;
194     }
195 
196     if ((err = parcel->writeInt64(mErrorCount)) != OK) {
197         ALOGE("%s: Failed to write stream error count!", __FUNCTION__);
198         return err;
199     }
200 
201     if ((err = parcel->writeInt32(mStartLatencyMs)) != OK) {
202         ALOGE("%s: Failed to write stream start latency!", __FUNCTION__);
203         return err;
204     }
205 
206     if ((err = parcel->writeInt32(mMaxHalBuffers)) != OK) {
207         ALOGE("%s: Failed to write max hal buffers", __FUNCTION__);
208         return err;
209     }
210 
211     if ((err = parcel->writeInt32(mMaxAppBuffers)) != OK) {
212         ALOGE("%s: Failed to write max app buffers", __FUNCTION__);
213         return err;
214     }
215 
216     if ((err = parcel->writeInt32(mHistogramType)) != OK) {
217         ALOGE("%s: Failed to write histogram type", __FUNCTION__);
218         return err;
219     }
220 
221     if ((err = parcel->writeFloatVector(mHistogramBins)) != OK) {
222         ALOGE("%s: Failed to write histogram bins!", __FUNCTION__);
223         return err;
224     }
225 
226     if ((err = parcel->writeInt64Vector(mHistogramCounts)) != OK) {
227         ALOGE("%s: Failed to write histogram counts!", __FUNCTION__);
228         return err;
229     }
230 
231     if ((err = parcel->writeInt64(mDynamicRangeProfile)) != OK) {
232         ALOGE("%s: Failed to write dynamic range profile type", __FUNCTION__);
233         return err;
234     }
235 
236     if ((err = parcel->writeInt64(mStreamUseCase)) != OK) {
237         ALOGE("%s: Failed to write stream use case!", __FUNCTION__);
238         return err;
239     }
240 
241     return OK;
242 }
243 
244 const int CameraSessionStats::CAMERA_STATE_OPEN = 0;
245 const int CameraSessionStats::CAMERA_STATE_ACTIVE = 1;
246 const int CameraSessionStats::CAMERA_STATE_IDLE = 2;
247 const int CameraSessionStats::CAMERA_STATE_CLOSED = 3;
248 
249 const int CameraSessionStats::CAMERA_FACING_BACK = 0;
250 const int CameraSessionStats::CAMERA_FACING_FRONT = 1;
251 const int CameraSessionStats::CAMERA_FACING_EXTERNAL = 2;
252 
253 const int CameraSessionStats::CAMERA_API_LEVEL_1 = 1;
254 const int CameraSessionStats::CAMERA_API_LEVEL_2 = 2;
255 
CameraSessionStats()256 CameraSessionStats::CameraSessionStats() :
257         mFacing(CAMERA_FACING_BACK),
258         mNewCameraState(CAMERA_STATE_CLOSED),
259         mApiLevel(0),
260         mIsNdk(false),
261         mLatencyMs(-1),
262         mMaxPreviewFps(0),
263         mSessionType(0),
264         mInternalReconfigure(0),
265         mRequestCount(0),
266         mResultErrorCount(0),
267         mDeviceError(false),
268         mVideoStabilizationMode(-1) {}
269 
CameraSessionStats(const String16 & cameraId,int facing,int newCameraState,const String16 & clientName,int apiLevel,bool isNdk,int32_t latencyMs)270 CameraSessionStats::CameraSessionStats(const String16& cameraId,
271         int facing, int newCameraState, const String16& clientName,
272         int apiLevel, bool isNdk, int32_t latencyMs) :
273                 mCameraId(cameraId),
274                 mFacing(facing),
275                 mNewCameraState(newCameraState),
276                 mClientName(clientName),
277                 mApiLevel(apiLevel),
278                 mIsNdk(isNdk),
279                 mLatencyMs(latencyMs),
280                 mMaxPreviewFps(0),
281                 mSessionType(0),
282                 mInternalReconfigure(0),
283                 mRequestCount(0),
284                 mResultErrorCount(0),
285                 mDeviceError(0),
286                 mVideoStabilizationMode(-1) {}
287 
readFromParcel(const android::Parcel * parcel)288 status_t CameraSessionStats::readFromParcel(const android::Parcel* parcel) {
289     if (parcel == NULL) {
290         ALOGE("%s: Null parcel", __FUNCTION__);
291         return BAD_VALUE;
292     }
293 
294     status_t err = OK;
295 
296     String16 id;
297     if ((err = parcel->readString16(&id)) != OK) {
298         ALOGE("%s: Failed to read camera id!", __FUNCTION__);
299         return BAD_VALUE;
300     }
301 
302     int facing = 0;
303     if ((err = parcel->readInt32(&facing)) != OK) {
304         ALOGE("%s: Failed to read camera facing from parcel", __FUNCTION__);
305         return err;
306     }
307 
308     int32_t newCameraState;
309     if ((err = parcel->readInt32(&newCameraState)) != OK) {
310         ALOGE("%s: Failed to read new camera state from parcel", __FUNCTION__);
311         return err;
312     }
313 
314     String16 clientName;
315     if ((err = parcel->readString16(&clientName)) != OK) {
316         ALOGE("%s: Failed to read client name!", __FUNCTION__);
317         return BAD_VALUE;
318     }
319 
320     int32_t apiLevel;
321     if ((err = parcel->readInt32(&apiLevel)) != OK) {
322         ALOGE("%s: Failed to read api level from parcel", __FUNCTION__);
323         return err;
324     }
325 
326     bool isNdk;
327     if ((err = parcel->readBool(&isNdk)) != OK) {
328         ALOGE("%s: Failed to read isNdk flag from parcel", __FUNCTION__);
329         return err;
330     }
331 
332     int32_t latencyMs;
333     if ((err = parcel->readInt32(&latencyMs)) != OK) {
334         ALOGE("%s: Failed to read latencyMs from parcel", __FUNCTION__);
335         return err;
336     }
337 
338     float maxPreviewFps;
339     if ((err = parcel->readFloat(&maxPreviewFps)) != OK) {
340         ALOGE("%s: Failed to read maxPreviewFps from parcel", __FUNCTION__);
341         return err;
342     }
343 
344     int32_t sessionType;
345     if ((err = parcel->readInt32(&sessionType)) != OK) {
346         ALOGE("%s: Failed to read session type from parcel", __FUNCTION__);
347         return err;
348     }
349 
350     int32_t internalReconfigure;
351     if ((err = parcel->readInt32(&internalReconfigure)) != OK) {
352         ALOGE("%s: Failed to read internal reconfigure count from parcel", __FUNCTION__);
353         return err;
354     }
355 
356     int64_t requestCount;
357     if ((err = parcel->readInt64(&requestCount)) != OK) {
358         ALOGE("%s: Failed to read request count from parcel", __FUNCTION__);
359         return err;
360     }
361 
362     int64_t resultErrorCount;
363     if ((err = parcel->readInt64(&resultErrorCount)) != OK) {
364         ALOGE("%s: Failed to read result error count from parcel", __FUNCTION__);
365         return err;
366     }
367 
368     bool deviceError;
369     if ((err = parcel->readBool(&deviceError)) != OK) {
370         ALOGE("%s: Failed to read device error flag from parcel", __FUNCTION__);
371         return err;
372     }
373 
374     std::vector<CameraStreamStats> streamStats;
375     if ((err = parcel->readParcelableVector(&streamStats)) != OK) {
376         ALOGE("%s: Failed to read stream state from parcel", __FUNCTION__);
377         return err;
378     }
379 
380     String16 userTag;
381     if ((err = parcel->readString16(&userTag)) != OK) {
382         ALOGE("%s: Failed to read user tag!", __FUNCTION__);
383         return BAD_VALUE;
384     }
385 
386     int32_t videoStabilizationMode;
387     if ((err = parcel->readInt32(&videoStabilizationMode)) != OK) {
388         ALOGE("%s: Failed to read video stabilization mode from parcel", __FUNCTION__);
389         return err;
390     }
391 
392     mCameraId = id;
393     mFacing = facing;
394     mNewCameraState = newCameraState;
395     mClientName = clientName;
396     mApiLevel = apiLevel;
397     mIsNdk = isNdk;
398     mLatencyMs = latencyMs;
399     mMaxPreviewFps = maxPreviewFps;
400     mSessionType = sessionType;
401     mInternalReconfigure = internalReconfigure;
402     mRequestCount = requestCount;
403     mResultErrorCount = resultErrorCount;
404     mDeviceError = deviceError;
405     mStreamStats = std::move(streamStats);
406     mUserTag = userTag;
407     mVideoStabilizationMode = videoStabilizationMode;
408 
409     return OK;
410 }
411 
writeToParcel(android::Parcel * parcel) const412 status_t CameraSessionStats::writeToParcel(android::Parcel* parcel) const {
413     if (parcel == NULL) {
414         ALOGE("%s: Null parcel", __FUNCTION__);
415         return BAD_VALUE;
416     }
417 
418     status_t err = OK;
419 
420     if ((err = parcel->writeString16(mCameraId)) != OK) {
421         ALOGE("%s: Failed to write camera id!", __FUNCTION__);
422         return err;
423     }
424 
425     if ((err = parcel->writeInt32(mFacing)) != OK) {
426         ALOGE("%s: Failed to write camera facing!", __FUNCTION__);
427         return err;
428     }
429 
430     if ((err = parcel->writeInt32(mNewCameraState)) != OK) {
431         ALOGE("%s: Failed to write new camera state!", __FUNCTION__);
432         return err;
433     }
434 
435     if ((err = parcel->writeString16(mClientName)) != OK) {
436         ALOGE("%s: Failed to write client name!", __FUNCTION__);
437         return err;
438     }
439 
440     if ((err = parcel->writeInt32(mApiLevel)) != OK) {
441         ALOGE("%s: Failed to write api level!", __FUNCTION__);
442         return err;
443     }
444 
445     if ((err = parcel->writeBool(mIsNdk)) != OK) {
446         ALOGE("%s: Failed to write isNdk flag!", __FUNCTION__);
447         return err;
448     }
449 
450     if ((err = parcel->writeInt32(mLatencyMs)) != OK) {
451         ALOGE("%s: Failed to write latency in Ms!", __FUNCTION__);
452         return err;
453     }
454 
455     if ((err = parcel->writeFloat(mMaxPreviewFps)) != OK) {
456         ALOGE("%s: Failed to write maxPreviewFps!", __FUNCTION__);
457         return err;
458     }
459 
460     if ((err = parcel->writeInt32(mSessionType)) != OK) {
461         ALOGE("%s: Failed to write session type!", __FUNCTION__);
462         return err;
463     }
464 
465     if ((err = parcel->writeInt32(mInternalReconfigure)) != OK) {
466         ALOGE("%s: Failed to write internal reconfigure count!", __FUNCTION__);
467         return err;
468     }
469 
470     if ((err = parcel->writeInt64(mRequestCount)) != OK) {
471         ALOGE("%s: Failed to write request count!", __FUNCTION__);
472         return err;
473     }
474 
475     if ((err = parcel->writeInt64(mResultErrorCount)) != OK) {
476         ALOGE("%s: Failed to write result error count!", __FUNCTION__);
477         return err;
478     }
479 
480     if ((err = parcel->writeBool(mDeviceError)) != OK) {
481         ALOGE("%s: Failed to write device error flag!", __FUNCTION__);
482         return err;
483     }
484 
485     if ((err = parcel->writeParcelableVector(mStreamStats)) != OK) {
486         ALOGE("%s: Failed to write stream states!", __FUNCTION__);
487         return err;
488     }
489 
490     if ((err = parcel->writeString16(mUserTag)) != OK) {
491         ALOGE("%s: Failed to write user tag!", __FUNCTION__);
492         return err;
493     }
494 
495     if ((err = parcel->writeInt32(mVideoStabilizationMode)) != OK) {
496         ALOGE("%s: Failed to write video stabilization mode!", __FUNCTION__);
497         return err;
498     }
499     return OK;
500 }
501 
502 } // namespace hardware
503 } // namesmpace android
504