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 package android.hardware; 17 18 import android.hardware.camera2.CameraMetadata; 19 import android.hardware.camera2.params.DynamicRangeProfiles; 20 import android.os.Parcel; 21 import android.os.Parcelable; 22 import android.util.Log; 23 24 /** 25 * The camera stream statistics used for passing camera stream information from 26 * camera service to camera service proxy. 27 * 28 * Include camera stream configuration, request/error counts, startup latency, 29 * and latency/jitter histograms. 30 * 31 * @hide 32 */ 33 public class CameraStreamStats implements Parcelable { 34 public static final int HISTOGRAM_TYPE_UNKNOWN = 0; 35 public static final int HISTOGRAM_TYPE_CAPTURE_LATENCY = 1; 36 37 private int mWidth; 38 private int mHeight; 39 private int mFormat; 40 private float mMaxPreviewFps; 41 private int mDataSpace; 42 private long mUsage; 43 private long mRequestCount; 44 private long mErrorCount; 45 private int mStartLatencyMs; 46 private int mMaxHalBuffers; 47 private int mMaxAppBuffers; 48 private int mHistogramType; 49 private float[] mHistogramBins; 50 private long[] mHistogramCounts; 51 private long mDynamicRangeProfile; 52 private long mStreamUseCase; 53 54 private static final String TAG = "CameraStreamStats"; 55 CameraStreamStats()56 public CameraStreamStats() { 57 mWidth = 0; 58 mHeight = 0; 59 mFormat = 0; 60 mMaxPreviewFps = 0; 61 mDataSpace = 0; 62 mUsage = 0; 63 mRequestCount = 0; 64 mErrorCount = 0; 65 mStartLatencyMs = 0; 66 mMaxHalBuffers = 0; 67 mMaxAppBuffers = 0; 68 mHistogramType = HISTOGRAM_TYPE_UNKNOWN; 69 mDynamicRangeProfile = DynamicRangeProfiles.STANDARD; 70 mStreamUseCase = CameraMetadata.SCALER_AVAILABLE_STREAM_USE_CASES_DEFAULT; 71 } 72 CameraStreamStats(int width, int height, int format, float maxPreviewFps, int dataSpace, long usage, long requestCount, long errorCount, int startLatencyMs, int maxHalBuffers, int maxAppBuffers, long dynamicRangeProfile, long streamUseCase)73 public CameraStreamStats(int width, int height, int format, float maxPreviewFps, 74 int dataSpace, long usage, long requestCount, long errorCount, 75 int startLatencyMs, int maxHalBuffers, int maxAppBuffers, long dynamicRangeProfile, 76 long streamUseCase) { 77 mWidth = width; 78 mHeight = height; 79 mFormat = format; 80 mMaxPreviewFps = maxPreviewFps; 81 mDataSpace = dataSpace; 82 mUsage = usage; 83 mRequestCount = requestCount; 84 mErrorCount = errorCount; 85 mStartLatencyMs = startLatencyMs; 86 mMaxHalBuffers = maxHalBuffers; 87 mMaxAppBuffers = maxAppBuffers; 88 mHistogramType = HISTOGRAM_TYPE_UNKNOWN; 89 mDynamicRangeProfile = dynamicRangeProfile; 90 mStreamUseCase = streamUseCase; 91 } 92 93 public static final @android.annotation.NonNull Parcelable.Creator<CameraStreamStats> CREATOR = 94 new Parcelable.Creator<CameraStreamStats>() { 95 @Override 96 public CameraStreamStats createFromParcel(Parcel in) { 97 try { 98 CameraStreamStats streamStats = new CameraStreamStats(in); 99 return streamStats; 100 } catch (Exception e) { 101 Log.e(TAG, "Exception creating CameraStreamStats from parcel", e); 102 return null; 103 } 104 } 105 106 @Override 107 public CameraStreamStats[] newArray(int size) { 108 return new CameraStreamStats[size]; 109 } 110 }; 111 CameraStreamStats(Parcel in)112 private CameraStreamStats(Parcel in) { 113 readFromParcel(in); 114 } 115 116 @Override describeContents()117 public int describeContents() { 118 return 0; 119 } 120 121 @Override writeToParcel(Parcel dest, int flags)122 public void writeToParcel(Parcel dest, int flags) { 123 dest.writeInt(mWidth); 124 dest.writeInt(mHeight); 125 dest.writeInt(mFormat); 126 dest.writeFloat(mMaxPreviewFps); 127 dest.writeInt(mDataSpace); 128 dest.writeLong(mUsage); 129 dest.writeLong(mRequestCount); 130 dest.writeLong(mErrorCount); 131 dest.writeInt(mStartLatencyMs); 132 dest.writeInt(mMaxHalBuffers); 133 dest.writeInt(mMaxAppBuffers); 134 dest.writeInt(mHistogramType); 135 dest.writeFloatArray(mHistogramBins); 136 dest.writeLongArray(mHistogramCounts); 137 dest.writeLong(mDynamicRangeProfile); 138 dest.writeLong(mStreamUseCase); 139 } 140 readFromParcel(Parcel in)141 public void readFromParcel(Parcel in) { 142 mWidth = in.readInt(); 143 mHeight = in.readInt(); 144 mFormat = in.readInt(); 145 mMaxPreviewFps = in.readFloat(); 146 mDataSpace = in.readInt(); 147 mUsage = in.readLong(); 148 mRequestCount = in.readLong(); 149 mErrorCount = in.readLong(); 150 mStartLatencyMs = in.readInt(); 151 mMaxHalBuffers = in.readInt(); 152 mMaxAppBuffers = in.readInt(); 153 mHistogramType = in.readInt(); 154 mHistogramBins = in.createFloatArray(); 155 mHistogramCounts = in.createLongArray(); 156 mDynamicRangeProfile = in.readLong(); 157 mStreamUseCase = in.readLong(); 158 } 159 getWidth()160 public int getWidth() { 161 return mWidth; 162 } 163 getHeight()164 public int getHeight() { 165 return mHeight; 166 } 167 getFormat()168 public int getFormat() { 169 return mFormat; 170 } 171 getMaxPreviewFps()172 public float getMaxPreviewFps() { 173 return mMaxPreviewFps; 174 } 175 getDataSpace()176 public int getDataSpace() { 177 return mDataSpace; 178 } 179 getUsage()180 public long getUsage() { 181 return mUsage; 182 } 183 getRequestCount()184 public long getRequestCount() { 185 return mRequestCount; 186 } 187 getErrorCount()188 public long getErrorCount() { 189 return mErrorCount; 190 } 191 getStartLatencyMs()192 public int getStartLatencyMs() { 193 return mStartLatencyMs; 194 } 195 getMaxHalBuffers()196 public int getMaxHalBuffers() { 197 return mMaxHalBuffers; 198 } 199 getMaxAppBuffers()200 public int getMaxAppBuffers() { 201 return mMaxAppBuffers; 202 } 203 getHistogramType()204 public int getHistogramType() { 205 return mHistogramType; 206 } 207 getHistogramBins()208 public float[] getHistogramBins() { 209 return mHistogramBins; 210 } 211 getHistogramCounts()212 public long[] getHistogramCounts() { 213 return mHistogramCounts; 214 } 215 getDynamicRangeProfile()216 public long getDynamicRangeProfile() { 217 return mDynamicRangeProfile; 218 } 219 getStreamUseCase()220 public long getStreamUseCase() { 221 return mStreamUseCase; 222 } 223 } 224