1 /* Copyright (c) 2014-2016, The Linux Foundation. All rights reserved. 2 * 3 * Redistribution and use in source and binary forms, with or without 4 * modification, are permitted provided that the following conditions are 5 * met: 6 * * Redistributions of source code must retain the above copyright 7 * notice, this list of conditions and the following disclaimer. 8 * * Redistributions in binary form must reproduce the above 9 * copyright notice, this list of conditions and the following 10 * disclaimer in the documentation and/or other materials provided 11 * with the distribution. 12 * * Neither the name of The Linux Foundation nor the names of its 13 * contributors may be used to endorse or promote products derived 14 * from this software without specific prior written permission. 15 * 16 * THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED 17 * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF 18 * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT 19 * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS 20 * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 21 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 22 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR 23 * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, 24 * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE 25 * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN 26 * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 27 * 28 */ 29 30 #define LOG_TAG "QCamera3VendorTags" 31 32 // Camera dependencies 33 #include "QCamera3HWI.h" 34 #include "QCamera3VendorTags.h" 35 36 extern "C" { 37 #include "mm_camera_dbg.h" 38 } 39 40 using namespace android; 41 42 namespace qcamera { 43 44 enum qcamera3_ext_tags qcamera3_ext3_section_bounds[QCAMERA3_SECTIONS_END - 45 VENDOR_SECTION] = { 46 QCAMERA3_PRIVATEDATA_END, 47 QCAMERA3_CDS_END, 48 QCAMERA3_OPAQUE_RAW_END, 49 QCAMERA3_CROP_END, 50 QCAMERA3_TUNING_META_DATA_END, 51 QCAMERA3_TEMPORAL_DENOISE_END, 52 QCAMERA3_AV_TIMER_END, 53 QCAMERA3_SENSOR_META_DATA_END, 54 NEXUS_EXPERIMENTAL_2016_END, 55 QCAMERA3_DUALCAM_LINK_META_DATA_END, 56 QCAMERA3_DUALCAM_CALIB_META_DATA_END 57 } ; 58 59 typedef struct vendor_tag_info { 60 const char *tag_name; 61 uint8_t tag_type; 62 } vendor_tag_info_t; 63 64 const char *qcamera3_ext_section_names[QCAMERA3_SECTIONS_END - 65 VENDOR_SECTION] = { 66 "org.codeaurora.qcamera3.privatedata", 67 "org.codeaurora.qcamera3.CDS", 68 "org.codeaurora.qcamera3.opaque_raw", 69 "org.codeaurora.qcamera3.crop", 70 "org.codeaurora.qcamera3.tuning_meta_data", 71 "org.codeaurora.qcamera3.temporal_denoise", 72 "org.codeaurora.qcamera3.av_timer", 73 "org.codeaurora.qcamera3.sensor_meta_data", 74 "com.google.nexus.experimental2016", 75 "org.codeaurora.qcamera3.dualcam_link_meta_data", 76 "org.codeaurora.qcamera3.dualcam_calib_meta_data" 77 }; 78 79 vendor_tag_info_t qcamera3_privatedata[QCAMERA3_PRIVATEDATA_END - QCAMERA3_PRIVATEDATA_START] = { 80 { "privatedata_reprocess", TYPE_INT32 } 81 }; 82 83 vendor_tag_info_t qcamera3_cds[QCAMERA3_CDS_END - QCAMERA3_CDS_START] = { 84 { "cds_mode", TYPE_INT32 }, 85 { "cds_info", TYPE_BYTE } 86 }; 87 88 vendor_tag_info_t qcamera3_opaque_raw[QCAMERA3_OPAQUE_RAW_END - 89 QCAMERA3_OPAQUE_RAW_START] = { 90 { "opaque_raw_strides", TYPE_INT32 }, 91 { "opaque_raw_format", TYPE_BYTE } 92 }; 93 94 vendor_tag_info_t qcamera3_crop[QCAMERA3_CROP_END- QCAMERA3_CROP_START] = { 95 { "count", TYPE_INT32 }, 96 { "data", TYPE_INT32}, 97 { "roimap", TYPE_INT32 } 98 }; 99 100 vendor_tag_info_t qcamera3_tuning_meta_data[QCAMERA3_TUNING_META_DATA_END - 101 QCAMERA3_TUNING_META_DATA_START] = { 102 { "tuning_meta_data_blob", TYPE_INT32 } 103 }; 104 105 vendor_tag_info_t qcamera3_temporal_denoise[QCAMERA3_TEMPORAL_DENOISE_END - 106 QCAMERA3_TEMPORAL_DENOISE_START] = { 107 { "enable", TYPE_BYTE }, 108 { "process_type", TYPE_INT32 } 109 }; 110 111 vendor_tag_info qcamera3_av_timer[QCAMERA3_AV_TIMER_END - 112 QCAMERA3_AV_TIMER_START] = { 113 {"use_av_timer", TYPE_BYTE } 114 }; 115 116 vendor_tag_info qcamera3_sensor_meta_data[QCAMERA3_SENSOR_META_DATA_END - 117 QCAMERA3_SENSOR_META_DATA_START] = { 118 {"dynamic_black_level_pattern", TYPE_FLOAT }, 119 {"is_mono_only", TYPE_BYTE } 120 }; 121 122 vendor_tag_info_t nexus_experimental_2016[NEXUS_EXPERIMENTAL_2016_END - 123 NEXUS_EXPERIMENTAL_2016_START] = { 124 {"3a.hybrid_ae_enable", TYPE_BYTE }, 125 {"control.af_scene_change", TYPE_BYTE }, 126 // DevCamDebug vendor tag 127 { "devcamdebug_meta_enable", TYPE_BYTE }, 128 // DevCamDebug vendor tag AF 129 { "devcamdebug_af_lens_position", TYPE_INT32 }, 130 { "devcamdebug_af_tof_confidence", TYPE_INT32 }, 131 { "devcamdebug_af_tof_distance", TYPE_INT32 }, 132 { "devcamdebug_af_luma", TYPE_INT32 }, 133 { "devcamdebug_af_haf_state", TYPE_INT32 }, 134 { "devcamdebug_af_monitor_pdaf_target_pos", TYPE_INT32 }, 135 { "devcamdebug_af_monitor_pdaf_confidence", TYPE_INT32 }, 136 { "devcamdebug_af_monitor_pdaf_refocus", TYPE_INT32 }, 137 { "devcamdebug_af_monitor_tof_target_pos", TYPE_INT32 }, 138 { "devcamdebug_af_monitor_tof_confidence", TYPE_INT32 }, 139 { "devcamdebug_af_monitor_tof_refocus", TYPE_INT32 }, 140 { "devcamdebug_af_monitor_type_select", TYPE_INT32 }, 141 { "devcamdebug_af_monitor_refocus", TYPE_INT32 }, 142 { "devcamdebug_af_monitor_target_pos", TYPE_INT32 }, 143 { "devcamdebug_af_search_pdaf_target_pos", TYPE_INT32 }, 144 { "devcamdebug_af_search_pdaf_next_pos", TYPE_INT32 }, 145 { "devcamdebug_af_search_pdaf_near_pos", TYPE_INT32 }, 146 { "devcamdebug_af_search_pdaf_far_pos", TYPE_INT32 }, 147 { "devcamdebug_af_search_pdaf_confidence", TYPE_INT32 }, 148 { "devcamdebug_af_search_tof_target_pos", TYPE_INT32 }, 149 { "devcamdebug_af_search_tof_next_pos", TYPE_INT32 }, 150 { "devcamdebug_af_search_tof_near_pos", TYPE_INT32 }, 151 { "devcamdebug_af_search_tof_far_pos", TYPE_INT32 }, 152 { "devcamdebug_af_search_tof_confidence", TYPE_INT32 }, 153 { "devcamdebug_af_search_type_select", TYPE_INT32 }, 154 { "devcamdebug_af_search_next_pos", TYPE_INT32 }, 155 { "devcamdebug_af_search_target_pos", TYPE_INT32 }, 156 // DevCamDebug vendor tag AEC 157 { "devcamdebug_aec_target_luma", TYPE_INT32 }, 158 { "devcamdebug_aec_comp_luma", TYPE_INT32 }, 159 { "devcamdebug_aec_avg_luma", TYPE_INT32 }, 160 { "devcamdebug_aec_cur_luma", TYPE_INT32 }, 161 { "devcamdebug_aec_linecount", TYPE_INT32 }, 162 { "devcamdebug_aec_real_gain", TYPE_FLOAT }, 163 { "devcamdebug_aec_exp_index", TYPE_INT32 }, 164 { "devcamdebug_aec_lux_idx", TYPE_FLOAT }, 165 // DevCamDebug vendor tag AWB 166 { "devcamdebug_awb_r_gain", TYPE_FLOAT }, 167 { "devcamdebug_awb_g_gain", TYPE_FLOAT }, 168 { "devcamdebug_awb_b_gain", TYPE_FLOAT }, 169 { "devcamdebug_awb_cct", TYPE_INT32 }, 170 { "devcamdebug_awb_decision", TYPE_INT32 }, 171 }; 172 173 vendor_tag_info_t 174 qcamera3_dualcam_link_meta_data[QCAMERA3_DUALCAM_LINK_META_DATA_END - 175 QCAMERA3_DUALCAM_LINK_META_DATA_START] = { 176 { "enable", TYPE_BYTE }, 177 { "is_main", TYPE_BYTE }, 178 { "related_camera_id", TYPE_BYTE } 179 }; 180 181 vendor_tag_info_t 182 qcamera3_dualcam_calib_meta_data[QCAMERA3_DUALCAM_CALIB_META_DATA_END - 183 QCAMERA3_DUALCAM_CALIB_META_DATA_START] = { 184 { "dualcam_calib_meta_data_blob", TYPE_BYTE } 185 }; 186 187 vendor_tag_info_t *qcamera3_tag_info[QCAMERA3_SECTIONS_END - 188 VENDOR_SECTION] = { 189 qcamera3_privatedata, 190 qcamera3_cds, 191 qcamera3_opaque_raw, 192 qcamera3_crop, 193 qcamera3_tuning_meta_data, 194 qcamera3_temporal_denoise, 195 qcamera3_av_timer, 196 qcamera3_sensor_meta_data, 197 nexus_experimental_2016, 198 qcamera3_dualcam_link_meta_data, 199 qcamera3_dualcam_calib_meta_data 200 }; 201 202 uint32_t qcamera3_all_tags[] = { 203 // QCAMERA3_PRIVATEDATA 204 (uint32_t)QCAMERA3_PRIVATEDATA_REPROCESS, 205 206 // QCAMERA3_CDS 207 (uint32_t)QCAMERA3_CDS_MODE, 208 (uint32_t)QCAMERA3_CDS_INFO, 209 210 // QCAMERA3_OPAQUE_RAW 211 (uint32_t)QCAMERA3_OPAQUE_RAW_STRIDES, 212 (uint32_t)QCAMERA3_OPAQUE_RAW_FORMAT, 213 214 // QCAMERA3_CROP 215 (uint32_t)QCAMERA3_CROP_COUNT_REPROCESS, 216 (uint32_t)QCAMERA3_CROP_REPROCESS, 217 (uint32_t)QCAMERA3_CROP_ROI_MAP_REPROCESS, 218 219 // QCAMERA3_TUNING_META_DATA 220 (uint32_t)QCAMERA3_TUNING_META_DATA_BLOB, 221 222 // QCAMERA3_TEMPORAL_DENOISE 223 (uint32_t)QCAMERA3_TEMPORAL_DENOISE_ENABLE, 224 (uint32_t)QCAMERA3_TEMPORAL_DENOISE_PROCESS_TYPE, 225 //QCAMERA3_AVTIMER 226 (uint32_t)QCAMERA3_USE_AV_TIMER, 227 228 //QCAMERA3_SENSOR_META_DATA 229 (uint32_t)QCAMERA3_SENSOR_DYNAMIC_BLACK_LEVEL_PATTERN, 230 (uint32_t)QCAMERA3_SENSOR_IS_MONO_ONLY, 231 232 //NEXUS_EXPERIMENTAL_2016 233 (uint32_t)NEXUS_EXPERIMENTAL_2016_HYBRID_AE_ENABLE, 234 (uint32_t)NEXUS_EXPERIMENTAL_2016_AF_SCENE_CHANGE, 235 // DEVCAMDEBUG 236 (uint32_t)DEVCAMDEBUG_META_ENABLE, 237 // DEVCAMDEBUG AF 238 (uint32_t)DEVCAMDEBUG_AF_LENS_POSITION, 239 (uint32_t)DEVCAMDEBUG_AF_TOF_CONFIDENCE, 240 (uint32_t)DEVCAMDEBUG_AF_TOF_DISTANCE, 241 (uint32_t)DEVCAMDEBUG_AF_LUMA, 242 (uint32_t)DEVCAMDEBUG_AF_HAF_STATE, 243 (uint32_t)DEVCAMDEBUG_AF_MONITOR_PDAF_TARGET_POS, 244 (uint32_t)DEVCAMDEBUG_AF_MONITOR_PDAF_CONFIDENCE, 245 (uint32_t)DEVCAMDEBUG_AF_MONITOR_PDAF_REFOCUS, 246 (uint32_t)DEVCAMDEBUG_AF_MONITOR_TOF_TARGET_POS, 247 (uint32_t)DEVCAMDEBUG_AF_MONITOR_TOF_CONFIDENCE, 248 (uint32_t)DEVCAMDEBUG_AF_MONITOR_TOF_REFOCUS, 249 (uint32_t)DEVCAMDEBUG_AF_MONITOR_TYPE_SELECT, 250 (uint32_t)DEVCAMDEBUG_AF_MONITOR_REFOCUS, 251 (uint32_t)DEVCAMDEBUG_AF_MONITOR_TARGET_POS, 252 (uint32_t)DEVCAMDEBUG_AF_SEARCH_PDAF_TARGET_POS, 253 (uint32_t)DEVCAMDEBUG_AF_SEARCH_PDAF_NEXT_POS, 254 (uint32_t)DEVCAMDEBUG_AF_SEARCH_PDAF_NEAR_POS, 255 (uint32_t)DEVCAMDEBUG_AF_SEARCH_PDAF_FAR_POS, 256 (uint32_t)DEVCAMDEBUG_AF_SEARCH_PDAF_CONFIDENCE, 257 (uint32_t)DEVCAMDEBUG_AF_SEARCH_TOF_TARGET_POS, 258 (uint32_t)DEVCAMDEBUG_AF_SEARCH_TOF_NEXT_POS, 259 (uint32_t)DEVCAMDEBUG_AF_SEARCH_TOF_NEAR_POS, 260 (uint32_t)DEVCAMDEBUG_AF_SEARCH_TOF_FAR_POS, 261 (uint32_t)DEVCAMDEBUG_AF_SEARCH_TOF_CONFIDENCE, 262 (uint32_t)DEVCAMDEBUG_AF_SEARCH_TYPE_SELECT, 263 (uint32_t)DEVCAMDEBUG_AF_SEARCH_NEXT_POS, 264 (uint32_t)DEVCAMDEBUG_AF_SEARCH_TARGET_POS, 265 // DEVCAMDEBUG AEC 266 (uint32_t)DEVCAMDEBUG_AEC_TARGET_LUMA, 267 (uint32_t)DEVCAMDEBUG_AEC_COMP_LUMA, 268 (uint32_t)DEVCAMDEBUG_AEC_AVG_LUMA, 269 (uint32_t)DEVCAMDEBUG_AEC_CUR_LUMA, 270 (uint32_t)DEVCAMDEBUG_AEC_LINECOUNT, 271 (uint32_t)DEVCAMDEBUG_AEC_REAL_GAIN, 272 (uint32_t)DEVCAMDEBUG_AEC_EXP_INDEX, 273 (uint32_t)DEVCAMDEBUG_AEC_LUX_IDX, 274 // DEVCAMDEBUG AWB 275 (uint32_t)DEVCAMDEBUG_AWB_R_GAIN, 276 (uint32_t)DEVCAMDEBUG_AWB_G_GAIN, 277 (uint32_t)DEVCAMDEBUG_AWB_B_GAIN, 278 (uint32_t)DEVCAMDEBUG_AWB_CCT, 279 (uint32_t)DEVCAMDEBUG_AWB_DECISION, 280 // DEVCAMDEBUG END 281 282 // QCAMERA3_DUALCAM_LINK_META_DATA 283 (uint32_t)QCAMERA3_DUALCAM_LINK_ENABLE, 284 (uint32_t)QCAMERA3_DUALCAM_LINK_IS_MAIN, 285 (uint32_t)QCAMERA3_DUALCAM_LINK_RELATED_CAMERA_ID, 286 287 // QCAMERA3_DUALCAM_CALIB_META_DATA 288 (uint32_t)QCAMERA3_DUALCAM_CALIB_META_DATA_BLOB, 289 }; 290 291 const vendor_tag_ops_t* QCamera3VendorTags::Ops = NULL; 292 293 /*=========================================================================== 294 * FUNCTION : get_vendor_tag_ops 295 * 296 * DESCRIPTION: Get the metadata vendor tag function pointers 297 * 298 * PARAMETERS : 299 * @ops : function pointer table to be filled by HAL 300 * 301 * 302 * RETURN : NONE 303 *==========================================================================*/ 304 void QCamera3VendorTags::get_vendor_tag_ops( 305 vendor_tag_ops_t* ops) 306 { 307 LOGL("E"); 308 309 Ops = ops; 310 311 ops->get_tag_count = get_tag_count; 312 ops->get_all_tags = get_all_tags; 313 ops->get_section_name = get_section_name; 314 ops->get_tag_name = get_tag_name; 315 ops->get_tag_type = get_tag_type; 316 ops->reserved[0] = NULL; 317 318 LOGL("X"); 319 return; 320 } 321 322 /*=========================================================================== 323 * FUNCTION : get_tag_count 324 * 325 * DESCRIPTION: Get number of vendor tags supported 326 * 327 * PARAMETERS : 328 * @ops : Vendor tag ops data structure 329 * 330 * 331 * RETURN : Number of vendor tags supported 332 *==========================================================================*/ 333 334 int QCamera3VendorTags::get_tag_count( 335 const vendor_tag_ops_t * ops) 336 { 337 size_t count = 0; 338 if (ops == Ops) 339 count = sizeof(qcamera3_all_tags)/sizeof(qcamera3_all_tags[0]); 340 341 LOGL("count is %d", count); 342 return (int)count; 343 } 344 345 /*=========================================================================== 346 * FUNCTION : get_all_tags 347 * 348 * DESCRIPTION: Fill array with all supported vendor tags 349 * 350 * PARAMETERS : 351 * @ops : Vendor tag ops data structure 352 * @tag_array: array of metadata tags 353 * 354 * RETURN : Success: the section name of the specific tag 355 * Failure: NULL 356 *==========================================================================*/ 357 void QCamera3VendorTags::get_all_tags( 358 const vendor_tag_ops_t * ops, 359 uint32_t *g_array) 360 { 361 if (ops != Ops) 362 return; 363 364 for (size_t i = 0; 365 i < sizeof(qcamera3_all_tags)/sizeof(qcamera3_all_tags[0]); 366 i++) { 367 g_array[i] = qcamera3_all_tags[i]; 368 LOGD("g_array[%d] is %d", i, g_array[i]); 369 } 370 } 371 372 /*=========================================================================== 373 * FUNCTION : get_section_name 374 * 375 * DESCRIPTION: Get section name for vendor tag 376 * 377 * PARAMETERS : 378 * @ops : Vendor tag ops structure 379 * @tag : Vendor specific tag 380 * 381 * 382 * RETURN : Success: the section name of the specific tag 383 * Failure: NULL 384 *==========================================================================*/ 385 386 const char* QCamera3VendorTags::get_section_name( 387 const vendor_tag_ops_t * ops, 388 uint32_t tag) 389 { 390 LOGL("E"); 391 if (ops != Ops) 392 return NULL; 393 394 const char *ret; 395 uint32_t section = tag >> 16; 396 397 if (section < VENDOR_SECTION || section >= QCAMERA3_SECTIONS_END) 398 ret = NULL; 399 else 400 ret = qcamera3_ext_section_names[section - VENDOR_SECTION]; 401 402 if (ret) 403 LOGL("section_name[%d] is %s", tag, ret); 404 LOGL("X"); 405 return ret; 406 } 407 408 /*=========================================================================== 409 * FUNCTION : get_tag_name 410 * 411 * DESCRIPTION: Get name of a vendor specific tag 412 * 413 * PARAMETERS : 414 * @tag : Vendor specific tag 415 * 416 * 417 * RETURN : Success: the name of the specific tag 418 * Failure: NULL 419 *==========================================================================*/ 420 const char* QCamera3VendorTags::get_tag_name( 421 const vendor_tag_ops_t * ops, 422 uint32_t tag) 423 { 424 LOGL("E"); 425 const char *ret; 426 uint32_t section = tag >> 16; 427 uint32_t section_index = section - VENDOR_SECTION; 428 uint32_t tag_index = tag & 0xFFFF; 429 430 if (ops != Ops) { 431 ret = NULL; 432 goto done; 433 } 434 435 if (section < VENDOR_SECTION || section >= QCAMERA3_SECTIONS_END) 436 ret = NULL; 437 else if (tag >= (uint32_t)qcamera3_ext3_section_bounds[section_index]) 438 ret = NULL; 439 else 440 ret = qcamera3_tag_info[section_index][tag_index].tag_name; 441 442 if (ret) 443 LOGL("tag name for tag %d is %s", tag, ret); 444 LOGL("X"); 445 446 done: 447 return ret; 448 } 449 450 /*=========================================================================== 451 * FUNCTION : get_tag_type 452 * 453 * DESCRIPTION: Get type of a vendor specific tag 454 * 455 * PARAMETERS : 456 * @tag : Vendor specific tag 457 * 458 * 459 * RETURN : Success: the type of the specific tag 460 * Failure: -1 461 *==========================================================================*/ 462 int QCamera3VendorTags::get_tag_type( 463 const vendor_tag_ops_t *ops, 464 uint32_t tag) 465 { 466 LOGL("E"); 467 int ret; 468 uint32_t section = tag >> 16; 469 uint32_t section_index = section - VENDOR_SECTION; 470 uint32_t tag_index = tag & 0xFFFF; 471 472 if (ops != Ops) { 473 ret = -1; 474 goto done; 475 } 476 if (section < VENDOR_SECTION || section >= QCAMERA3_SECTIONS_END) 477 ret = -1; 478 else if (tag >= (uint32_t )qcamera3_ext3_section_bounds[section_index]) 479 ret = -1; 480 else 481 ret = qcamera3_tag_info[section_index][tag_index].tag_type; 482 483 LOGL("tag type for tag %d is %d", tag, ret); 484 LOGL("X"); 485 done: 486 return ret; 487 } 488 489 }; //end namespace qcamera 490