1 /* 2 * Copyright (C) 2012 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 /** 18 * Fake vendor extensions for testing 19 */ 20 21 #ifndef TESTING_CAMERA_METADATA_FAKEVENDOR_H 22 #define TESTING_CAMERA_METADATA_FAKEVENDOR_H 23 24 enum vendor_extension_section { 25 FAKEVENDOR_SENSOR = VENDOR_SECTION, 26 FAKEVENDOR_SENSOR_INFO, 27 FAKEVENDOR_COLORCORRECTION, 28 FAKEVENDOR_SCALER, 29 FAKEVENDOR_SECTION_END 30 }; 31 32 const int FAKEVENDOR_SECTION_COUNT = FAKEVENDOR_SECTION_END - VENDOR_SECTION; 33 34 enum vendor_extension_section_ranges { 35 FAKEVENDOR_SENSOR_START = FAKEVENDOR_SENSOR << 16, 36 FAKEVENDOR_SENSOR_I_START = FAKEVENDOR_SENSOR_INFO << 16, 37 FAKEVENDOR_COLORCORRECTION_START = FAKEVENDOR_COLORCORRECTION << 16, 38 FAKEVENDOR_SCALER_START = FAKEVENDOR_SCALER << 16 39 }; 40 41 enum vendor_extension_tags { 42 FAKEVENDOR_SENSOR_SUPERMODE = FAKEVENDOR_SENSOR_START, 43 FAKEVENDOR_SENSOR_DOUBLE_EXPOSURE, 44 FAKEVENDOR_SENSOR_END, 45 46 FAKEVENDOR_SENSOR_AVAILABLE_SUPERMODES = FAKEVENDOR_SENSOR_I_START, 47 FAKEVENDOR_SENSOR_I_END, 48 49 FAKEVENDOR_COLORCORRECTION_3DLUT_MODE = FAKEVENDOR_COLORCORRECTION_START, 50 FAKEVENDOR_COLORCORRECTION_3DLUT_TABLES, 51 FAKEVENDOR_COLORCORRECTION_END, 52 53 FAKEVENDOR_SCALER_DOWNSCALE_MODE = FAKEVENDOR_SCALER_START, 54 FAKEVENDOR_SCALER_DOWNSCALE_COEFF, 55 FAKEVENDOR_SCALER_END 56 }; 57 58 typedef struct vendor_tag_info { 59 const char *tag_name; 60 uint8_t tag_type; 61 } vendor_tag_info_t; 62 63 const char *fakevendor_section_names[FAKEVENDOR_SECTION_COUNT] = { 64 "com.fakevendor.sensor", 65 "com.fakevendor.sensor.info", 66 "com.fakevendor.colorCorrection", 67 "com.fakevendor.scaler" 68 }; 69 70 unsigned int fakevendor_section_bounds[FAKEVENDOR_SECTION_COUNT][2] = { 71 { FAKEVENDOR_SENSOR_START, FAKEVENDOR_SENSOR_END }, 72 { FAKEVENDOR_SENSOR_I_START, FAKEVENDOR_SENSOR_I_END }, 73 { FAKEVENDOR_COLORCORRECTION_START, FAKEVENDOR_COLORCORRECTION_END }, 74 { FAKEVENDOR_SCALER_START, FAKEVENDOR_SCALER_END} 75 }; 76 77 vendor_tag_info_t fakevendor_sensor[FAKEVENDOR_SENSOR_END - 78 FAKEVENDOR_SENSOR_START] = { 79 { "superMode", TYPE_BYTE }, 80 { "doubleExposure", TYPE_INT64 } 81 }; 82 83 vendor_tag_info_t fakevendor_sensor_info[FAKEVENDOR_SENSOR_I_END - 84 FAKEVENDOR_SENSOR_I_START] = { 85 { "availableSuperModes", TYPE_BYTE } 86 }; 87 88 vendor_tag_info_t fakevendor_color_correction[FAKEVENDOR_COLORCORRECTION_END - 89 FAKEVENDOR_COLORCORRECTION_START] = { 90 { "3dLutMode", TYPE_BYTE }, 91 { "3dLutTables", TYPE_FLOAT } 92 }; 93 94 vendor_tag_info_t fakevendor_scaler[FAKEVENDOR_SCALER_END - 95 FAKEVENDOR_SCALER_START] = { 96 { "downscaleMode", TYPE_BYTE }, 97 { "downscaleCoefficients", TYPE_FLOAT } 98 }; 99 100 vendor_tag_info_t *fakevendor_tag_info[FAKEVENDOR_SECTION_COUNT] = { 101 fakevendor_sensor, 102 fakevendor_sensor_info, 103 fakevendor_color_correction, 104 fakevendor_scaler 105 }; 106 107 const char *get_fakevendor_section_name(const vendor_tag_query_ops_t *v, 108 uint32_t tag); 109 const char *get_fakevendor_tag_name(const vendor_tag_query_ops_t *v, 110 uint32_t tag); 111 int get_fakevendor_tag_type(const vendor_tag_query_ops_t *v, 112 uint32_t tag); 113 int get_fakevendor_tag_count(const vendor_tag_query_ops_t *v); 114 void get_fakevendor_tags(const vendor_tag_query_ops_t *v, uint32_t *tag_array); 115 116 static const vendor_tag_query_ops_t fakevendor_query_ops = { 117 get_fakevendor_section_name, 118 get_fakevendor_tag_name, 119 get_fakevendor_tag_type, 120 get_fakevendor_tag_count, 121 get_fakevendor_tags 122 }; 123 124 const char *get_fakevendor_section_name(const vendor_tag_query_ops_t *v, 125 uint32_t tag) { 126 if (v != &fakevendor_query_ops) return NULL; 127 int tag_section = (tag >> 16) - VENDOR_SECTION; 128 if (tag_section < 0 || 129 tag_section >= FAKEVENDOR_SECTION_COUNT) return NULL; 130 131 return fakevendor_section_names[tag_section]; 132 } 133 134 const char *get_fakevendor_tag_name(const vendor_tag_query_ops_t *v, 135 uint32_t tag) { 136 if (v != &fakevendor_query_ops) return NULL; 137 int tag_section = (tag >> 16) - VENDOR_SECTION; 138 if (tag_section < 0 139 || tag_section >= FAKEVENDOR_SECTION_COUNT 140 || tag >= fakevendor_section_bounds[tag_section][1]) return NULL; 141 int tag_index = tag & 0xFFFF; 142 return fakevendor_tag_info[tag_section][tag_index].tag_name; 143 } 144 145 int get_fakevendor_tag_type(const vendor_tag_query_ops_t *v, 146 uint32_t tag) { 147 if (v != &fakevendor_query_ops) return -1; 148 int tag_section = (tag >> 16) - VENDOR_SECTION; 149 if (tag_section < 0 150 || tag_section >= FAKEVENDOR_SECTION_COUNT 151 || tag >= fakevendor_section_bounds[tag_section][1]) return -1; 152 int tag_index = tag & 0xFFFF; 153 return fakevendor_tag_info[tag_section][tag_index].tag_type; 154 } 155 156 int get_fakevendor_tag_count(const vendor_tag_query_ops_t *v) { 157 int section; 158 unsigned int start, end; 159 int count = 0; 160 161 if (v != &fakevendor_query_ops) return -1; 162 for (section = 0; section < FAKEVENDOR_SECTION_COUNT; section++) { 163 start = fakevendor_section_bounds[section][0]; 164 end = fakevendor_section_bounds[section][1]; 165 count += end - start; 166 } 167 return count; 168 } 169 170 void get_fakevendor_tags(const vendor_tag_query_ops_t *v, uint32_t *tag_array) { 171 int section; 172 unsigned int start, end, tag; 173 174 if (v != &fakevendor_query_ops || tag_array == NULL) return; 175 for (section = 0; section < FAKEVENDOR_SECTION_COUNT; section++) { 176 start = fakevendor_section_bounds[section][0]; 177 end = fakevendor_section_bounds[section][1]; 178 for (tag = start; tag < end; tag++) { 179 *tag_array++ = tag; 180 } 181 } 182 } 183 184 #endif 185