1 /* 2 * Copyright 2024 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 #ifndef ANDROID_SERVERS_CAMERA_SHAREDSESSIONCONFIGUTILS_H_ 18 #define ANDROID_SERVERS_CAMERA_SHAREDSESSIONCONFIGUTILS_H_ 19 20 #define SHARED_SESSION_FILE_PATH "system_ext/etc/" 21 #define SHARED_SESSION_FILE_NAME "shared_session_config.xml" 22 23 #include <android/hardware_buffer.h> 24 #include <camera/camera2/OutputConfiguration.h> 25 #include <system/camera_metadata.h> 26 #include <system/graphics.h> 27 28 #include <set> 29 #include <string> 30 #include "tinyxml2.h" 31 #include <vector> 32 33 using tinyxml2::XMLElement; 34 namespace android { 35 36 enum ErrorCode : uint8_t { 37 // OK status. 38 STATUS_OK = 0, 39 40 // Error status. Cannot read the config file (config file missing or not 41 // accessible) 42 ERROR_READ_CONFIG_FILE = 1, 43 44 // Error status. Config file format doesn't match. 45 ERROR_CONFIG_FILE_FORMAT = 2, 46 47 // Error status. Config reader hasn't been initialized. 48 ERROR_CONFIG_READER_UNINITIALIZED = 3, 49 50 // Error status. Bad parameter. 51 ERROR_BAD_PARAMETER = 4, 52 }; 53 54 inline const std::set<int64_t> VALID_COLOR_SPACES = { 55 ANDROID_REQUEST_AVAILABLE_COLOR_SPACE_PROFILES_MAP_UNSPECIFIED, 56 ANDROID_REQUEST_AVAILABLE_COLOR_SPACE_PROFILES_MAP_SRGB, 57 ANDROID_REQUEST_AVAILABLE_COLOR_SPACE_PROFILES_MAP_DISPLAY_P3, 58 ANDROID_REQUEST_AVAILABLE_COLOR_SPACE_PROFILES_MAP_BT2020_HLG, 59 }; 60 61 inline const std::set<int64_t> VALID_SURFACE_TYPES = { 62 OutputConfiguration::SURFACE_TYPE_SURFACE_VIEW, 63 OutputConfiguration::SURFACE_TYPE_SURFACE_TEXTURE, 64 OutputConfiguration::SURFACE_TYPE_MEDIA_RECORDER, 65 OutputConfiguration::SURFACE_TYPE_MEDIA_CODEC, 66 OutputConfiguration::SURFACE_TYPE_IMAGE_READER, 67 }; 68 69 inline const std::set<int64_t> VALID_STREAM_USE_CASES = { 70 ANDROID_SCALER_AVAILABLE_STREAM_USE_CASES_DEFAULT, 71 ANDROID_SCALER_AVAILABLE_STREAM_USE_CASES_PREVIEW, 72 ANDROID_SCALER_AVAILABLE_STREAM_USE_CASES_STILL_CAPTURE, 73 ANDROID_SCALER_AVAILABLE_STREAM_USE_CASES_VIDEO_RECORD, 74 ANDROID_SCALER_AVAILABLE_STREAM_USE_CASES_PREVIEW_VIDEO_STILL, 75 ANDROID_SCALER_AVAILABLE_STREAM_USE_CASES_VIDEO_CALL, 76 ANDROID_SCALER_AVAILABLE_STREAM_USE_CASES_CROPPED_RAW, 77 ANDROID_SCALER_AVAILABLE_STREAM_USE_CASES_VENDOR_START, 78 }; 79 80 inline const std::set<int64_t> VALID_TIMESTAMP_BASES = { 81 OutputConfiguration::TIMESTAMP_BASE_DEFAULT, 82 OutputConfiguration::TIMESTAMP_BASE_SENSOR, 83 OutputConfiguration::TIMESTAMP_BASE_MONOTONIC, 84 OutputConfiguration::TIMESTAMP_BASE_REALTIME, 85 OutputConfiguration::TIMESTAMP_BASE_CHOREOGRAPHER_SYNCED, 86 OutputConfiguration::TIMESTAMP_BASE_MAX, 87 }; 88 89 inline const std::set<int64_t> VALID_MIRROR_MODES = { 90 OutputConfiguration::MIRROR_MODE_AUTO, 91 OutputConfiguration::MIRROR_MODE_NONE, 92 OutputConfiguration::MIRROR_MODE_H, 93 OutputConfiguration::MIRROR_MODE_V, 94 }; 95 96 inline const std::set<int64_t> VALID_FORMATS = { 97 HAL_PIXEL_FORMAT_RGBA_8888, 98 HAL_PIXEL_FORMAT_RGBX_8888, 99 HAL_PIXEL_FORMAT_RGB_888, 100 HAL_PIXEL_FORMAT_RGB_565, 101 HAL_PIXEL_FORMAT_BGRA_8888, 102 HAL_PIXEL_FORMAT_YCBCR_422_SP, 103 HAL_PIXEL_FORMAT_YCRCB_420_SP, 104 HAL_PIXEL_FORMAT_YCBCR_422_I, 105 HAL_PIXEL_FORMAT_RGBA_FP16, 106 HAL_PIXEL_FORMAT_RAW16, 107 HAL_PIXEL_FORMAT_BLOB, 108 HAL_PIXEL_FORMAT_IMPLEMENTATION_DEFINED, 109 HAL_PIXEL_FORMAT_YCBCR_420_888, 110 HAL_PIXEL_FORMAT_RAW_OPAQUE, 111 HAL_PIXEL_FORMAT_RAW10, 112 HAL_PIXEL_FORMAT_RAW12, 113 HAL_PIXEL_FORMAT_RGBA_1010102, 114 HAL_PIXEL_FORMAT_Y8, 115 HAL_PIXEL_FORMAT_Y16, 116 HAL_PIXEL_FORMAT_YV12, 117 HAL_PIXEL_FORMAT_DEPTH_16, 118 HAL_PIXEL_FORMAT_DEPTH_24, 119 HAL_PIXEL_FORMAT_DEPTH_24_STENCIL_8, 120 HAL_PIXEL_FORMAT_DEPTH_32F, 121 HAL_PIXEL_FORMAT_DEPTH_32F_STENCIL_8, 122 HAL_PIXEL_FORMAT_STENCIL_8, 123 HAL_PIXEL_FORMAT_YCBCR_P010, 124 HAL_PIXEL_FORMAT_HSV_888, 125 }; 126 127 inline const std::set<int64_t> VALID_USAGES = { 128 AHARDWAREBUFFER_USAGE_CPU_READ_NEVER, 129 AHARDWAREBUFFER_USAGE_CPU_READ_RARELY, 130 AHARDWAREBUFFER_USAGE_CPU_READ_OFTEN, 131 AHARDWAREBUFFER_USAGE_CPU_WRITE_NEVER, 132 AHARDWAREBUFFER_USAGE_CPU_WRITE_RARELY, 133 AHARDWAREBUFFER_USAGE_CPU_WRITE_OFTEN, 134 AHARDWAREBUFFER_USAGE_GPU_FRAMEBUFFER, 135 AHARDWAREBUFFER_USAGE_GPU_COLOR_OUTPUT, 136 AHARDWAREBUFFER_USAGE_COMPOSER_OVERLAY, 137 AHARDWAREBUFFER_USAGE_PROTECTED_CONTENT, 138 AHARDWAREBUFFER_USAGE_VIDEO_ENCODE, 139 AHARDWAREBUFFER_USAGE_SENSOR_DIRECT_DATA, 140 AHARDWAREBUFFER_USAGE_GPU_DATA_BUFFER, 141 AHARDWAREBUFFER_USAGE_GPU_CUBE_MAP, 142 AHARDWAREBUFFER_USAGE_GPU_MIPMAP_COMPLETE, 143 AHARDWAREBUFFER_USAGE_FRONT_BUFFER, 144 AHARDWAREBUFFER_USAGE_VENDOR_0, 145 AHARDWAREBUFFER_USAGE_VENDOR_1, 146 AHARDWAREBUFFER_USAGE_VENDOR_2, 147 AHARDWAREBUFFER_USAGE_VENDOR_3, 148 AHARDWAREBUFFER_USAGE_VENDOR_4, 149 AHARDWAREBUFFER_USAGE_VENDOR_5, 150 AHARDWAREBUFFER_USAGE_VENDOR_6, 151 AHARDWAREBUFFER_USAGE_VENDOR_7, 152 AHARDWAREBUFFER_USAGE_VENDOR_8, 153 AHARDWAREBUFFER_USAGE_VENDOR_9, 154 AHARDWAREBUFFER_USAGE_VENDOR_10, 155 AHARDWAREBUFFER_USAGE_VENDOR_11, 156 AHARDWAREBUFFER_USAGE_VENDOR_12, 157 AHARDWAREBUFFER_USAGE_VENDOR_13, 158 AHARDWAREBUFFER_USAGE_VENDOR_14, 159 AHARDWAREBUFFER_USAGE_VENDOR_15, 160 AHARDWAREBUFFER_USAGE_VENDOR_16, 161 AHARDWAREBUFFER_USAGE_VENDOR_17, 162 AHARDWAREBUFFER_USAGE_VENDOR_18, 163 }; 164 165 inline const std::set<int64_t> VALID_DATA_SPACES = { 166 HAL_DATASPACE_UNKNOWN, 167 HAL_DATASPACE_ARBITRARY, 168 HAL_DATASPACE_STANDARD_UNSPECIFIED, 169 HAL_DATASPACE_STANDARD_BT709, 170 HAL_DATASPACE_STANDARD_BT601_625, 171 HAL_DATASPACE_STANDARD_BT601_625_UNADJUSTED, 172 HAL_DATASPACE_STANDARD_BT601_525, 173 HAL_DATASPACE_STANDARD_BT601_525_UNADJUSTED, 174 HAL_DATASPACE_STANDARD_BT2020, 175 HAL_DATASPACE_STANDARD_BT2020_CONSTANT_LUMINANCE, 176 HAL_DATASPACE_STANDARD_BT470M, 177 HAL_DATASPACE_STANDARD_FILM, 178 HAL_DATASPACE_STANDARD_DCI_P3, 179 HAL_DATASPACE_STANDARD_ADOBE_RGB, 180 HAL_DATASPACE_TRANSFER_UNSPECIFIED, 181 HAL_DATASPACE_TRANSFER_LINEAR, 182 HAL_DATASPACE_TRANSFER_SRGB, 183 HAL_DATASPACE_TRANSFER_SMPTE_170M, 184 HAL_DATASPACE_TRANSFER_GAMMA2_2, 185 HAL_DATASPACE_TRANSFER_GAMMA2_6, 186 HAL_DATASPACE_TRANSFER_GAMMA2_8, 187 HAL_DATASPACE_TRANSFER_ST2084, 188 HAL_DATASPACE_TRANSFER_HLG, 189 HAL_DATASPACE_RANGE_UNSPECIFIED, 190 HAL_DATASPACE_RANGE_FULL, 191 HAL_DATASPACE_RANGE_LIMITED, 192 HAL_DATASPACE_RANGE_EXTENDED, 193 HAL_DATASPACE_SRGB_LINEAR, 194 HAL_DATASPACE_V0_SRGB_LINEAR, 195 HAL_DATASPACE_V0_SCRGB_LINEAR, 196 HAL_DATASPACE_SRGB, 197 HAL_DATASPACE_V0_SRGB, 198 HAL_DATASPACE_V0_SCRGB, 199 HAL_DATASPACE_JFIF, 200 HAL_DATASPACE_V0_JFIF, 201 HAL_DATASPACE_BT601_625, 202 HAL_DATASPACE_V0_BT601_625, 203 HAL_DATASPACE_BT601_525, 204 HAL_DATASPACE_V0_BT601_525, 205 HAL_DATASPACE_BT709, 206 HAL_DATASPACE_V0_BT709, 207 HAL_DATASPACE_DCI_P3_LINEAR, 208 HAL_DATASPACE_DCI_P3, 209 HAL_DATASPACE_DISPLAY_P3_LINEAR, 210 HAL_DATASPACE_DISPLAY_P3, 211 HAL_DATASPACE_ADOBE_RGB, 212 HAL_DATASPACE_BT2020_LINEAR, 213 HAL_DATASPACE_BT2020, 214 HAL_DATASPACE_BT2020_PQ, 215 HAL_DATASPACE_DEPTH, 216 HAL_DATASPACE_SENSOR, 217 }; 218 219 class SharedSessionConfigUtils { 220 public: 221 222 // toString function for ErrorCode enum. 223 static const char* toString(ErrorCode errorCode); 224 225 // Convert string representation of colorspace to its int value. 226 static ErrorCode getColorSpaceFromStr(const char* colorSpaceStr, int32_t* colorSpace); 227 228 // Convert string representation of surface type to its int value. 229 static ErrorCode getSurfaceTypeFromXml(const XMLElement* surfaceTypeXml, int64_t* surfaceType); 230 231 // Convert string representation of width to its int value. 232 static ErrorCode getWidthFromXml(const XMLElement* widthXml, int64_t* width); 233 234 // Convert string representation of height to its int value. 235 static ErrorCode getHeightFromXml(const XMLElement* heightXml, int64_t* height); 236 237 // Convert string representation of physical cameraId to its std::string value. 238 static ErrorCode getPhysicalCameraIdFromXml(const XMLElement* physicalCameraIdXml, 239 std::string* physicalCameraId); 240 241 // Convert string representation of stream use case to its int64 value. 242 static ErrorCode getStreamUseCaseFromXml(const XMLElement* streamUseCaseXml, 243 int64_t* streamUseCase); 244 245 // Convert string representation of timestamp base to its int value. 246 static ErrorCode getTimestampBaseFromXml(const XMLElement* timestampBaseXml, 247 int64_t* timestampBase); 248 249 // Convert string representation of mirror mode to its int value. 250 static ErrorCode getMirrorModeFromXml(const XMLElement* mirrorModeXml, int64_t* mirrorMode); 251 252 // Convert string representation of use readout timestamp to its bool value. 253 static ErrorCode getUseReadoutTimestampFromXml(const XMLElement* useReadoutTimestampXml, 254 bool* useReadoutTimestamp); 255 256 // Convert string representation of format to its int value. 257 static ErrorCode getFormatFromXml(const XMLElement* formatXml, int64_t* format, 258 int64_t surfaceType); 259 260 // Convert string representation of usage to its int64 value. 261 static ErrorCode getUsageFromXml(const XMLElement* usageXml, int64_t* usage, 262 int64_t surfaceType); 263 264 // Convert string representation of data space to its int value. 265 static ErrorCode getDataSpaceFromXml(const XMLElement* dataSpaceXml, int64_t* dataSpace); 266 267 static std::vector<std::string> splitString(std::string inputString, char delimiter); 268 269 static std::string setToString(const std::set<int64_t>& s); 270 }; 271 272 } // namespace android 273 274 #endif // ANDROID_SERVERS_CAMERA_SHAREDSESSIONCONFIGUTILS_H_ 275