1 /* Copyright (c) 2012-2015, The Linux Foundataion. 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 ATRACE_TAG ATRACE_TAG_CAMERA 31 #define LOG_TAG "QCamera3HWI" 32 //#define LOG_NDEBUG 0 33 34 #define __STDC_LIMIT_MACROS 35 #include <cutils/properties.h> 36 #include <hardware/camera3.h> 37 #include <camera/CameraMetadata.h> 38 #include <stdio.h> 39 #include <stdlib.h> 40 #include <fcntl.h> 41 #include <stdint.h> 42 #include <utils/Log.h> 43 #include <utils/Errors.h> 44 #include <utils/Trace.h> 45 #include <ui/Fence.h> 46 #include <gralloc_priv.h> 47 #include "QCamera3HWI.h" 48 #include "QCamera3Mem.h" 49 #include "QCamera3Channel.h" 50 #include "QCamera3PostProc.h" 51 #include "QCamera3VendorTags.h" 52 53 using namespace android; 54 55 namespace qcamera { 56 57 #define MAX(a, b) ((a) > (b) ? (a) : (b)) 58 59 #define DATA_PTR(MEM_OBJ,INDEX) MEM_OBJ->getPtr( INDEX ) 60 61 #define EMPTY_PIPELINE_DELAY 2 62 #define PARTIAL_RESULT_COUNT 2 63 #define FRAME_SKIP_DELAY 0 64 #define CAM_MAX_SYNC_LATENCY 4 65 66 #define VIDEO_4K_WIDTH 3840 67 #define VIDEO_4K_HEIGHT 2160 68 69 #define MAX_RAW_STREAMS 1 70 #define MAX_STALLING_STREAMS 1 71 #define MAX_PROCESSED_STREAMS 3 72 73 cam_capability_t *gCamCapability[MM_CAMERA_MAX_NUM_SENSORS]; 74 const camera_metadata_t *gStaticMetadata[MM_CAMERA_MAX_NUM_SENSORS]; 75 volatile uint32_t gCamHal3LogLevel = 1; 76 77 const QCamera3HardwareInterface::QCameraPropMap QCamera3HardwareInterface::CDS_MAP [] = { 78 {"On", CAM_CDS_MODE_ON}, 79 {"Off", CAM_CDS_MODE_OFF}, 80 {"Auto",CAM_CDS_MODE_AUTO} 81 }; 82 83 const QCamera3HardwareInterface::QCameraMap QCamera3HardwareInterface::EFFECT_MODES_MAP[] = { 84 { ANDROID_CONTROL_EFFECT_MODE_OFF, CAM_EFFECT_MODE_OFF }, 85 { ANDROID_CONTROL_EFFECT_MODE_MONO, CAM_EFFECT_MODE_MONO }, 86 { ANDROID_CONTROL_EFFECT_MODE_NEGATIVE, CAM_EFFECT_MODE_NEGATIVE }, 87 { ANDROID_CONTROL_EFFECT_MODE_SOLARIZE, CAM_EFFECT_MODE_SOLARIZE }, 88 { ANDROID_CONTROL_EFFECT_MODE_SEPIA, CAM_EFFECT_MODE_SEPIA }, 89 { ANDROID_CONTROL_EFFECT_MODE_POSTERIZE, CAM_EFFECT_MODE_POSTERIZE }, 90 { ANDROID_CONTROL_EFFECT_MODE_WHITEBOARD, CAM_EFFECT_MODE_WHITEBOARD }, 91 { ANDROID_CONTROL_EFFECT_MODE_BLACKBOARD, CAM_EFFECT_MODE_BLACKBOARD }, 92 { ANDROID_CONTROL_EFFECT_MODE_AQUA, CAM_EFFECT_MODE_AQUA } 93 }; 94 95 const QCamera3HardwareInterface::QCameraMap QCamera3HardwareInterface::WHITE_BALANCE_MODES_MAP[] = { 96 { ANDROID_CONTROL_AWB_MODE_OFF, CAM_WB_MODE_OFF }, 97 { ANDROID_CONTROL_AWB_MODE_AUTO, CAM_WB_MODE_AUTO }, 98 { ANDROID_CONTROL_AWB_MODE_INCANDESCENT, CAM_WB_MODE_INCANDESCENT }, 99 { ANDROID_CONTROL_AWB_MODE_FLUORESCENT, CAM_WB_MODE_FLUORESCENT }, 100 { ANDROID_CONTROL_AWB_MODE_WARM_FLUORESCENT,CAM_WB_MODE_WARM_FLUORESCENT}, 101 { ANDROID_CONTROL_AWB_MODE_DAYLIGHT, CAM_WB_MODE_DAYLIGHT }, 102 { ANDROID_CONTROL_AWB_MODE_CLOUDY_DAYLIGHT, CAM_WB_MODE_CLOUDY_DAYLIGHT }, 103 { ANDROID_CONTROL_AWB_MODE_TWILIGHT, CAM_WB_MODE_TWILIGHT }, 104 { ANDROID_CONTROL_AWB_MODE_SHADE, CAM_WB_MODE_SHADE } 105 }; 106 107 const QCamera3HardwareInterface::QCameraMap QCamera3HardwareInterface::SCENE_MODES_MAP[] = { 108 { ANDROID_CONTROL_SCENE_MODE_FACE_PRIORITY, CAM_SCENE_MODE_FACE_PRIORITY }, 109 { ANDROID_CONTROL_SCENE_MODE_ACTION, CAM_SCENE_MODE_ACTION }, 110 { ANDROID_CONTROL_SCENE_MODE_PORTRAIT, CAM_SCENE_MODE_PORTRAIT }, 111 { ANDROID_CONTROL_SCENE_MODE_LANDSCAPE, CAM_SCENE_MODE_LANDSCAPE }, 112 { ANDROID_CONTROL_SCENE_MODE_NIGHT, CAM_SCENE_MODE_NIGHT }, 113 { ANDROID_CONTROL_SCENE_MODE_NIGHT_PORTRAIT, CAM_SCENE_MODE_NIGHT_PORTRAIT }, 114 { ANDROID_CONTROL_SCENE_MODE_THEATRE, CAM_SCENE_MODE_THEATRE }, 115 { ANDROID_CONTROL_SCENE_MODE_BEACH, CAM_SCENE_MODE_BEACH }, 116 { ANDROID_CONTROL_SCENE_MODE_SNOW, CAM_SCENE_MODE_SNOW }, 117 { ANDROID_CONTROL_SCENE_MODE_SUNSET, CAM_SCENE_MODE_SUNSET }, 118 { ANDROID_CONTROL_SCENE_MODE_STEADYPHOTO, CAM_SCENE_MODE_ANTISHAKE }, 119 { ANDROID_CONTROL_SCENE_MODE_FIREWORKS , CAM_SCENE_MODE_FIREWORKS }, 120 { ANDROID_CONTROL_SCENE_MODE_SPORTS , CAM_SCENE_MODE_SPORTS }, 121 { ANDROID_CONTROL_SCENE_MODE_PARTY, CAM_SCENE_MODE_PARTY }, 122 { ANDROID_CONTROL_SCENE_MODE_CANDLELIGHT, CAM_SCENE_MODE_CANDLELIGHT }, 123 { ANDROID_CONTROL_SCENE_MODE_BARCODE, CAM_SCENE_MODE_BARCODE} 124 }; 125 126 const QCamera3HardwareInterface::QCameraMap QCamera3HardwareInterface::FOCUS_MODES_MAP[] = { 127 { ANDROID_CONTROL_AF_MODE_OFF, CAM_FOCUS_MODE_OFF }, 128 { ANDROID_CONTROL_AF_MODE_OFF, CAM_FOCUS_MODE_FIXED }, 129 { ANDROID_CONTROL_AF_MODE_AUTO, CAM_FOCUS_MODE_AUTO }, 130 { ANDROID_CONTROL_AF_MODE_MACRO, CAM_FOCUS_MODE_MACRO }, 131 { ANDROID_CONTROL_AF_MODE_EDOF, CAM_FOCUS_MODE_EDOF }, 132 { ANDROID_CONTROL_AF_MODE_CONTINUOUS_PICTURE, CAM_FOCUS_MODE_CONTINOUS_PICTURE }, 133 { ANDROID_CONTROL_AF_MODE_CONTINUOUS_VIDEO, CAM_FOCUS_MODE_CONTINOUS_VIDEO } 134 }; 135 136 const QCamera3HardwareInterface::QCameraMap QCamera3HardwareInterface::COLOR_ABERRATION_MAP[] = { 137 { ANDROID_COLOR_CORRECTION_ABERRATION_MODE_OFF, 138 CAM_COLOR_CORRECTION_ABERRATION_OFF }, 139 { ANDROID_COLOR_CORRECTION_ABERRATION_MODE_FAST, 140 CAM_COLOR_CORRECTION_ABERRATION_FAST }, 141 { ANDROID_COLOR_CORRECTION_ABERRATION_MODE_HIGH_QUALITY, 142 CAM_COLOR_CORRECTION_ABERRATION_HIGH_QUALITY }, 143 }; 144 145 const QCamera3HardwareInterface::QCameraMap QCamera3HardwareInterface::ANTIBANDING_MODES_MAP[] = { 146 { ANDROID_CONTROL_AE_ANTIBANDING_MODE_OFF, CAM_ANTIBANDING_MODE_OFF }, 147 { ANDROID_CONTROL_AE_ANTIBANDING_MODE_50HZ, CAM_ANTIBANDING_MODE_50HZ }, 148 { ANDROID_CONTROL_AE_ANTIBANDING_MODE_60HZ, CAM_ANTIBANDING_MODE_60HZ }, 149 { ANDROID_CONTROL_AE_ANTIBANDING_MODE_AUTO, CAM_ANTIBANDING_MODE_AUTO } 150 }; 151 152 const QCamera3HardwareInterface::QCameraMap QCamera3HardwareInterface::AE_FLASH_MODE_MAP[] = { 153 { ANDROID_CONTROL_AE_MODE_OFF, CAM_FLASH_MODE_OFF }, 154 { ANDROID_CONTROL_AE_MODE_ON, CAM_FLASH_MODE_OFF }, 155 { ANDROID_CONTROL_AE_MODE_ON_AUTO_FLASH, CAM_FLASH_MODE_AUTO}, 156 { ANDROID_CONTROL_AE_MODE_ON_ALWAYS_FLASH, CAM_FLASH_MODE_ON }, 157 { ANDROID_CONTROL_AE_MODE_ON_AUTO_FLASH_REDEYE, CAM_FLASH_MODE_AUTO} 158 }; 159 160 const QCamera3HardwareInterface::QCameraMap QCamera3HardwareInterface::FLASH_MODES_MAP[] = { 161 { ANDROID_FLASH_MODE_OFF, CAM_FLASH_MODE_OFF }, 162 { ANDROID_FLASH_MODE_SINGLE, CAM_FLASH_MODE_SINGLE }, 163 { ANDROID_FLASH_MODE_TORCH, CAM_FLASH_MODE_TORCH } 164 }; 165 166 const QCamera3HardwareInterface::QCameraMap QCamera3HardwareInterface::FACEDETECT_MODES_MAP[] = { 167 { ANDROID_STATISTICS_FACE_DETECT_MODE_OFF, CAM_FACE_DETECT_MODE_OFF }, 168 { ANDROID_STATISTICS_FACE_DETECT_MODE_FULL, CAM_FACE_DETECT_MODE_FULL } 169 }; 170 171 const QCamera3HardwareInterface::QCameraMap QCamera3HardwareInterface::FOCUS_CALIBRATION_MAP[] = { 172 { ANDROID_LENS_INFO_FOCUS_DISTANCE_CALIBRATION_UNCALIBRATED, 173 CAM_FOCUS_UNCALIBRATED }, 174 { ANDROID_LENS_INFO_FOCUS_DISTANCE_CALIBRATION_APPROXIMATE, 175 CAM_FOCUS_APPROXIMATE }, 176 { ANDROID_LENS_INFO_FOCUS_DISTANCE_CALIBRATION_CALIBRATED, 177 CAM_FOCUS_CALIBRATED } 178 }; 179 180 const int32_t available_thumbnail_sizes[] = {0, 0, 181 176, 144, 182 320, 240, 183 432, 288, 184 480, 288, 185 512, 288, 186 512, 384}; 187 188 const QCamera3HardwareInterface::QCameraMap QCamera3HardwareInterface::TEST_PATTERN_MAP[] = { 189 { ANDROID_SENSOR_TEST_PATTERN_MODE_OFF, CAM_TEST_PATTERN_OFF }, 190 { ANDROID_SENSOR_TEST_PATTERN_MODE_SOLID_COLOR, CAM_TEST_PATTERN_SOLID_COLOR }, 191 { ANDROID_SENSOR_TEST_PATTERN_MODE_COLOR_BARS, CAM_TEST_PATTERN_COLOR_BARS }, 192 { ANDROID_SENSOR_TEST_PATTERN_MODE_COLOR_BARS_FADE_TO_GRAY, CAM_TEST_PATTERN_COLOR_BARS_FADE_TO_GRAY }, 193 { ANDROID_SENSOR_TEST_PATTERN_MODE_PN9, CAM_TEST_PATTERN_PN9 }, 194 }; 195 196 /* Since there is no mapping for all the options some Android enum are not listed. 197 * Also, the order in this list is important because while mapping from HAL to Android it will 198 * traverse from lower to higher index which means that for HAL values that are map to different 199 * Android values, the traverse logic will select the first one found. 200 */ 201 const QCamera3HardwareInterface::QCameraMap QCamera3HardwareInterface::REFERENCE_ILLUMINANT_MAP[] = { 202 { ANDROID_SENSOR_REFERENCE_ILLUMINANT1_FLUORESCENT, CAM_AWB_WARM_FLO}, 203 { ANDROID_SENSOR_REFERENCE_ILLUMINANT1_DAYLIGHT_FLUORESCENT, CAM_AWB_CUSTOM_DAYLIGHT }, 204 { ANDROID_SENSOR_REFERENCE_ILLUMINANT1_COOL_WHITE_FLUORESCENT, CAM_AWB_COLD_FLO }, 205 { ANDROID_SENSOR_REFERENCE_ILLUMINANT1_STANDARD_A, CAM_AWB_A }, 206 { ANDROID_SENSOR_REFERENCE_ILLUMINANT1_D55, CAM_AWB_NOON }, 207 { ANDROID_SENSOR_REFERENCE_ILLUMINANT1_D65, CAM_AWB_D65 }, 208 { ANDROID_SENSOR_REFERENCE_ILLUMINANT1_D75, CAM_AWB_D75 }, 209 { ANDROID_SENSOR_REFERENCE_ILLUMINANT1_D50, CAM_AWB_D50 }, 210 { ANDROID_SENSOR_REFERENCE_ILLUMINANT1_ISO_STUDIO_TUNGSTEN, CAM_AWB_CUSTOM_A}, 211 { ANDROID_SENSOR_REFERENCE_ILLUMINANT1_DAYLIGHT, CAM_AWB_D50 }, 212 { ANDROID_SENSOR_REFERENCE_ILLUMINANT1_TUNGSTEN, CAM_AWB_A }, 213 { ANDROID_SENSOR_REFERENCE_ILLUMINANT1_FINE_WEATHER, CAM_AWB_D50 }, 214 { ANDROID_SENSOR_REFERENCE_ILLUMINANT1_CLOUDY_WEATHER, CAM_AWB_D65 }, 215 { ANDROID_SENSOR_REFERENCE_ILLUMINANT1_SHADE, CAM_AWB_D75 }, 216 { ANDROID_SENSOR_REFERENCE_ILLUMINANT1_DAY_WHITE_FLUORESCENT, CAM_AWB_CUSTOM_DAYLIGHT }, 217 { ANDROID_SENSOR_REFERENCE_ILLUMINANT1_WHITE_FLUORESCENT, CAM_AWB_COLD_FLO}, 218 }; 219 220 camera3_device_ops_t QCamera3HardwareInterface::mCameraOps = { 221 initialize: QCamera3HardwareInterface::initialize, 222 configure_streams: QCamera3HardwareInterface::configure_streams, 223 register_stream_buffers: NULL, 224 construct_default_request_settings: QCamera3HardwareInterface::construct_default_request_settings, 225 process_capture_request: QCamera3HardwareInterface::process_capture_request, 226 get_metadata_vendor_tag_ops: NULL, 227 dump: QCamera3HardwareInterface::dump, 228 flush: QCamera3HardwareInterface::flush, 229 reserved: {0}, 230 }; 231 232 /*=========================================================================== 233 * FUNCTION : QCamera3HardwareInterface 234 * 235 * DESCRIPTION: constructor of QCamera3HardwareInterface 236 * 237 * PARAMETERS : 238 * @cameraId : camera ID 239 * 240 * RETURN : none 241 *==========================================================================*/ 242 QCamera3HardwareInterface::QCamera3HardwareInterface(int cameraId, 243 const camera_module_callbacks_t *callbacks) 244 : mCameraId(cameraId), 245 mCameraHandle(NULL), 246 mCameraOpened(false), 247 mCameraInitialized(false), 248 mCallbackOps(NULL), 249 mInputStream(NULL), 250 mMetadataChannel(NULL), 251 mPictureChannel(NULL), 252 mRawChannel(NULL), 253 mSupportChannel(NULL), 254 mRawDumpChannel(NULL), 255 mFirstRequest(false), 256 mFlush(false), 257 mParamHeap(NULL), 258 mParameters(NULL), 259 m_bIsVideo(false), 260 m_bIs4KVideo(false), 261 mEisEnable(0), 262 mLoopBackResult(NULL), 263 mMinProcessedFrameDuration(0), 264 mMinJpegFrameDuration(0), 265 mMinRawFrameDuration(0), 266 m_pPowerModule(NULL), 267 mMetaFrameCount(0), 268 mCallbacks(callbacks), 269 mCaptureIntent(0) 270 { 271 getLogLevel(); 272 mCameraDevice.common.tag = HARDWARE_DEVICE_TAG; 273 mCameraDevice.common.version = CAMERA_DEVICE_API_VERSION_3_2; 274 mCameraDevice.common.close = close_camera_device; 275 mCameraDevice.ops = &mCameraOps; 276 mCameraDevice.priv = this; 277 gCamCapability[cameraId]->version = CAM_HAL_V3; 278 // TODO: hardcode for now until mctl add support for min_num_pp_bufs 279 //TBD - To see if this hardcoding is needed. Check by printing if this is filled by mctl to 3 280 gCamCapability[cameraId]->min_num_pp_bufs = 3; 281 282 pthread_cond_init(&mRequestCond, NULL); 283 mPendingRequest = 0; 284 mCurrentRequestId = -1; 285 pthread_mutex_init(&mMutex, NULL); 286 287 for (size_t i = 0; i < CAMERA3_TEMPLATE_COUNT; i++) 288 mDefaultMetadata[i] = NULL; 289 290 #ifdef HAS_MULTIMEDIA_HINTS 291 if (hw_get_module(POWER_HARDWARE_MODULE_ID, (const hw_module_t **)&m_pPowerModule)) { 292 ALOGE("%s: %s module not found", __func__, POWER_HARDWARE_MODULE_ID); 293 } 294 #endif 295 296 char prop[PROPERTY_VALUE_MAX]; 297 property_get("persist.camera.raw.dump", prop, "0"); 298 mEnableRawDump = atoi(prop); 299 if (mEnableRawDump) 300 CDBG("%s: Raw dump from Camera HAL enabled", __func__); 301 } 302 303 /*=========================================================================== 304 * FUNCTION : ~QCamera3HardwareInterface 305 * 306 * DESCRIPTION: destructor of QCamera3HardwareInterface 307 * 308 * PARAMETERS : none 309 * 310 * RETURN : none 311 *==========================================================================*/ 312 QCamera3HardwareInterface::~QCamera3HardwareInterface() 313 { 314 CDBG("%s: E", __func__); 315 /* We need to stop all streams before deleting any stream */ 316 317 318 if (mRawDumpChannel) { 319 mRawDumpChannel->stop(); 320 } 321 322 // NOTE: 'camera3_stream_t *' objects are already freed at 323 // this stage by the framework 324 for (List<stream_info_t *>::iterator it = mStreamInfo.begin(); 325 it != mStreamInfo.end(); it++) { 326 QCamera3Channel *channel = (*it)->channel; 327 if (channel) { 328 channel->stop(); 329 } 330 } 331 if (mSupportChannel) 332 mSupportChannel->stop(); 333 334 for (List<stream_info_t *>::iterator it = mStreamInfo.begin(); 335 it != mStreamInfo.end(); it++) { 336 QCamera3Channel *channel = (*it)->channel; 337 if (channel) 338 delete channel; 339 free (*it); 340 } 341 if (mSupportChannel) { 342 delete mSupportChannel; 343 mSupportChannel = NULL; 344 } 345 346 if (mRawDumpChannel) { 347 delete mRawDumpChannel; 348 mRawDumpChannel = NULL; 349 } 350 mPictureChannel = NULL; 351 352 /* Clean up all channels */ 353 if (mCameraInitialized) { 354 if (mMetadataChannel) { 355 mMetadataChannel->stop(); 356 delete mMetadataChannel; 357 mMetadataChannel = NULL; 358 } 359 deinitParameters(); 360 } 361 362 if (mCameraOpened) 363 closeCamera(); 364 365 mPendingBuffersMap.mPendingBufferList.clear(); 366 mPendingRequestsList.clear(); 367 mPendingReprocessResultList.clear(); 368 369 for (size_t i = 0; i < CAMERA3_TEMPLATE_COUNT; i++) 370 if (mDefaultMetadata[i]) 371 free_camera_metadata(mDefaultMetadata[i]); 372 373 pthread_cond_destroy(&mRequestCond); 374 375 pthread_mutex_destroy(&mMutex); 376 CDBG("%s: X", __func__); 377 } 378 379 /*=========================================================================== 380 * FUNCTION : camEvtHandle 381 * 382 * DESCRIPTION: Function registered to mm-camera-interface to handle events 383 * 384 * PARAMETERS : 385 * @camera_handle : interface layer camera handle 386 * @evt : ptr to event 387 * @user_data : user data ptr 388 * 389 * RETURN : none 390 *==========================================================================*/ 391 void QCamera3HardwareInterface::camEvtHandle(uint32_t /*camera_handle*/, 392 mm_camera_event_t *evt, 393 void *user_data) 394 { 395 QCamera3HardwareInterface *obj = (QCamera3HardwareInterface *)user_data; 396 camera3_notify_msg_t notify_msg; 397 if (obj && evt) { 398 switch(evt->server_event_type) { 399 case CAM_EVENT_TYPE_DAEMON_DIED: 400 ALOGE("%s: Fatal, camera daemon died", __func__); 401 memset(¬ify_msg, 0, sizeof(camera3_notify_msg_t)); 402 notify_msg.type = CAMERA3_MSG_ERROR; 403 notify_msg.message.error.error_code = CAMERA3_MSG_ERROR_DEVICE; 404 notify_msg.message.error.error_stream = NULL; 405 notify_msg.message.error.frame_number = 0; 406 obj->mCallbackOps->notify(obj->mCallbackOps, ¬ify_msg); 407 break; 408 409 case CAM_EVENT_TYPE_DAEMON_PULL_REQ: 410 CDBG("%s: HAL got request pull from Daemon", __func__); 411 pthread_mutex_lock(&obj->mMutex); 412 obj->mWokenUpByDaemon = true; 413 obj->unblockRequestIfNecessary(); 414 pthread_mutex_unlock(&obj->mMutex); 415 break; 416 417 default: 418 CDBG_HIGH("%s: Warning: Unhandled event %d", __func__, 419 evt->server_event_type); 420 break; 421 } 422 } else { 423 ALOGE("%s: NULL user_data/evt", __func__); 424 } 425 } 426 427 /*=========================================================================== 428 * FUNCTION : openCamera 429 * 430 * DESCRIPTION: open camera 431 * 432 * PARAMETERS : 433 * @hw_device : double ptr for camera device struct 434 * 435 * RETURN : int32_t type of status 436 * NO_ERROR -- success 437 * none-zero failure code 438 *==========================================================================*/ 439 int QCamera3HardwareInterface::openCamera(struct hw_device_t **hw_device) 440 { 441 int rc = 0; 442 if (mCameraOpened) { 443 *hw_device = NULL; 444 return PERMISSION_DENIED; 445 } 446 447 rc = openCamera(); 448 if (rc == 0) { 449 *hw_device = &mCameraDevice.common; 450 } else 451 *hw_device = NULL; 452 453 #ifdef HAS_MULTIMEDIA_HINTS 454 if (rc == 0) { 455 if (m_pPowerModule) { 456 if (m_pPowerModule->powerHint) { 457 m_pPowerModule->powerHint(m_pPowerModule, POWER_HINT_VIDEO_ENCODE, 458 (void *)"state=1"); 459 } 460 } 461 } 462 #endif 463 return rc; 464 } 465 466 /*=========================================================================== 467 * FUNCTION : openCamera 468 * 469 * DESCRIPTION: open camera 470 * 471 * PARAMETERS : none 472 * 473 * RETURN : int32_t type of status 474 * NO_ERROR -- success 475 * none-zero failure code 476 *==========================================================================*/ 477 int QCamera3HardwareInterface::openCamera() 478 { 479 int rc = 0; 480 481 ATRACE_CALL(); 482 if (mCameraHandle) { 483 ALOGE("Failure: Camera already opened"); 484 return ALREADY_EXISTS; 485 } 486 mCameraHandle = camera_open(mCameraId); 487 if (!mCameraHandle) { 488 ALOGE("camera_open failed."); 489 return UNKNOWN_ERROR; 490 } 491 492 mCameraOpened = true; 493 494 rc = mCameraHandle->ops->register_event_notify(mCameraHandle->camera_handle, 495 camEvtHandle, (void *)this); 496 497 if (rc < 0) { 498 ALOGE("%s: Error, failed to register event callback", __func__); 499 /* Not closing camera here since it is already handled in destructor */ 500 return FAILED_TRANSACTION; 501 } 502 503 return NO_ERROR; 504 } 505 506 /*=========================================================================== 507 * FUNCTION : closeCamera 508 * 509 * DESCRIPTION: close camera 510 * 511 * PARAMETERS : none 512 * 513 * RETURN : int32_t type of status 514 * NO_ERROR -- success 515 * none-zero failure code 516 *==========================================================================*/ 517 int QCamera3HardwareInterface::closeCamera() 518 { 519 ATRACE_CALL(); 520 int rc = NO_ERROR; 521 522 rc = mCameraHandle->ops->close_camera(mCameraHandle->camera_handle); 523 mCameraHandle = NULL; 524 mCameraOpened = false; 525 526 #ifdef HAS_MULTIMEDIA_HINTS 527 if (rc == NO_ERROR) { 528 if (m_pPowerModule) { 529 if (m_pPowerModule->powerHint) { 530 m_pPowerModule->powerHint(m_pPowerModule, POWER_HINT_VIDEO_ENCODE, 531 (void *)"state=0"); 532 } 533 } 534 } 535 #endif 536 537 return rc; 538 } 539 540 /*=========================================================================== 541 * FUNCTION : initialize 542 * 543 * DESCRIPTION: Initialize frameworks callback functions 544 * 545 * PARAMETERS : 546 * @callback_ops : callback function to frameworks 547 * 548 * RETURN : 549 * 550 *==========================================================================*/ 551 int QCamera3HardwareInterface::initialize( 552 const struct camera3_callback_ops *callback_ops) 553 { 554 ATRACE_CALL(); 555 int rc; 556 557 pthread_mutex_lock(&mMutex); 558 559 rc = initParameters(); 560 if (rc < 0) { 561 ALOGE("%s: initParamters failed %d", __func__, rc); 562 goto err1; 563 } 564 mCallbackOps = callback_ops; 565 566 pthread_mutex_unlock(&mMutex); 567 mCameraInitialized = true; 568 return 0; 569 570 err1: 571 pthread_mutex_unlock(&mMutex); 572 return rc; 573 } 574 575 /*=========================================================================== 576 * FUNCTION : validateStreamDimensions 577 * 578 * DESCRIPTION: Check if the configuration requested are those advertised 579 * 580 * PARAMETERS : 581 * @stream_list : streams to be configured 582 * 583 * RETURN : 584 * 585 *==========================================================================*/ 586 int QCamera3HardwareInterface::validateStreamDimensions( 587 camera3_stream_configuration_t *streamList) 588 { 589 int rc = NO_ERROR; 590 int32_t available_processed_sizes[MAX_SIZES_CNT * 2]; 591 int32_t available_jpeg_sizes[MAX_SIZES_CNT * 2]; 592 uint8_t jpeg_sizes_cnt = 0; 593 594 /* 595 * Loop through all streams requested in configuration 596 * Check if unsupported sizes have been requested on any of them 597 */ 598 for (size_t j = 0; j < streamList->num_streams; j++){ 599 bool sizeFound = false; 600 camera3_stream_t *newStream = streamList->streams[j]; 601 602 /* 603 * Sizes are different for each type of stream format check against 604 * appropriate table. 605 */ 606 switch (newStream->format) { 607 case ANDROID_SCALER_AVAILABLE_FORMATS_RAW16: 608 case ANDROID_SCALER_AVAILABLE_FORMATS_RAW_OPAQUE: 609 case HAL_PIXEL_FORMAT_RAW10: 610 for (int i = 0; 611 i < gCamCapability[mCameraId]->supported_raw_dim_cnt; i++){ 612 if (gCamCapability[mCameraId]->raw_dim[i].width 613 == (int32_t) newStream->width 614 && gCamCapability[mCameraId]->raw_dim[i].height 615 == (int32_t) newStream->height) { 616 sizeFound = true; 617 break; 618 } 619 } 620 break; 621 case HAL_PIXEL_FORMAT_BLOB: 622 /* Generate JPEG sizes table */ 623 makeTable(gCamCapability[mCameraId]->picture_sizes_tbl, 624 gCamCapability[mCameraId]->picture_sizes_tbl_cnt, 625 available_processed_sizes); 626 jpeg_sizes_cnt = filterJpegSizes( 627 available_jpeg_sizes, 628 available_processed_sizes, 629 (gCamCapability[mCameraId]->picture_sizes_tbl_cnt) * 2, 630 MAX_SIZES_CNT * 2, 631 gCamCapability[mCameraId]->active_array_size, 632 gCamCapability[mCameraId]->max_downscale_factor); 633 634 /* Verify set size against generated sizes table */ 635 for (int i = 0;i < jpeg_sizes_cnt/2; i++) { 636 if ((int32_t)(newStream->width) == available_jpeg_sizes[i*2] && 637 (int32_t)(newStream->height) == available_jpeg_sizes[i*2+1]) { 638 sizeFound = true; 639 break; 640 } 641 } 642 break; 643 644 645 case HAL_PIXEL_FORMAT_YCbCr_420_888: 646 case HAL_PIXEL_FORMAT_IMPLEMENTATION_DEFINED: 647 default: 648 /* ZSL stream will be full active array size validate that*/ 649 if (newStream->stream_type == CAMERA3_STREAM_BIDIRECTIONAL) { 650 if ((int32_t)(newStream->width) == 651 gCamCapability[mCameraId]->active_array_size.width 652 && (int32_t)(newStream->height) == 653 gCamCapability[mCameraId]->active_array_size.height) { 654 sizeFound = true; 655 } 656 /* We could potentially break here to enforce ZSL stream 657 * set from frameworks always has full active array size 658 * but it is not clear from spec if framework will always 659 * follow that, also we have logic to override to full array 660 * size, so keeping this logic lenient at the moment. 661 */ 662 } 663 664 /* Non ZSL stream still need to conform to advertised sizes*/ 665 for (int i = 0; 666 i < gCamCapability[mCameraId]->picture_sizes_tbl_cnt;i++){ 667 if ((int32_t)(newStream->width) == 668 gCamCapability[mCameraId]->picture_sizes_tbl[i].width 669 && (int32_t)(newStream->height) == 670 gCamCapability[mCameraId]->picture_sizes_tbl[i].height){ 671 sizeFound = true; 672 break; 673 } 674 } 675 break; 676 } /* End of switch(newStream->format) */ 677 678 /* We error out even if a single stream has unsupported size set */ 679 if (!sizeFound) { 680 ALOGE("%s: Error: Unsupported size of %d x %d requested for stream" 681 "type:%d", __func__, newStream->width, newStream->height, 682 newStream->format); 683 rc = -EINVAL; 684 break; 685 } 686 } /* End of for each stream */ 687 return rc; 688 } 689 690 /*============================================================================== 691 * FUNCTION : isSupportChannelNeeded 692 * 693 * DESCRIPTION: Simple heuristic func to determine if support channels is needed 694 * 695 * PARAMETERS : 696 * @stream_list : streams to be configured 697 * 698 * RETURN : Boolen true/false decision 699 * 700 *==========================================================================*/ 701 bool QCamera3HardwareInterface::isSupportChannelNeeded(camera3_stream_configuration_t *streamList) 702 { 703 uint32_t i; 704 705 /* Dummy stream needed if only raw or jpeg streams present */ 706 for (i = 0;i < streamList->num_streams;i++) { 707 switch(streamList->streams[i]->format) { 708 case HAL_PIXEL_FORMAT_RAW_OPAQUE: 709 case HAL_PIXEL_FORMAT_RAW10: 710 case HAL_PIXEL_FORMAT_RAW16: 711 case HAL_PIXEL_FORMAT_BLOB: 712 break; 713 default: 714 return false; 715 } 716 } 717 return true; 718 } 719 720 721 /*=========================================================================== 722 * FUNCTION : configureStreams 723 * 724 * DESCRIPTION: Reset HAL camera device processing pipeline and set up new input 725 * and output streams. 726 * 727 * PARAMETERS : 728 * @stream_list : streams to be configured 729 * 730 * RETURN : 731 * 732 *==========================================================================*/ 733 int QCamera3HardwareInterface::configureStreams( 734 camera3_stream_configuration_t *streamList) 735 { 736 ATRACE_CALL(); 737 int rc = 0; 738 739 // Sanity check stream_list 740 if (streamList == NULL) { 741 ALOGE("%s: NULL stream configuration", __func__); 742 return BAD_VALUE; 743 } 744 if (streamList->streams == NULL) { 745 ALOGE("%s: NULL stream list", __func__); 746 return BAD_VALUE; 747 } 748 749 if (streamList->num_streams < 1) { 750 ALOGE("%s: Bad number of streams requested: %d", __func__, 751 streamList->num_streams); 752 return BAD_VALUE; 753 } 754 755 /* first invalidate all the steams in the mStreamList 756 * if they appear again, they will be validated */ 757 for (List<stream_info_t*>::iterator it = mStreamInfo.begin(); 758 it != mStreamInfo.end(); it++) { 759 QCamera3Channel *channel = (QCamera3Channel*)(*it)->stream->priv; 760 channel->stop(); 761 (*it)->status = INVALID; 762 } 763 764 if (mRawDumpChannel) { 765 mRawDumpChannel->stop(); 766 delete mRawDumpChannel; 767 mRawDumpChannel = NULL; 768 } 769 770 if (mSupportChannel) 771 mSupportChannel->stop(); 772 if (mMetadataChannel) { 773 /* If content of mStreamInfo is not 0, there is metadata stream */ 774 mMetadataChannel->stop(); 775 } 776 777 pthread_mutex_lock(&mMutex); 778 779 /* Check whether we have video stream */ 780 m_bIs4KVideo = false; 781 m_bIsVideo = false; 782 bool isZsl = false; 783 size_t videoWidth = 0; 784 size_t videoHeight = 0; 785 size_t rawStreamCnt = 0; 786 size_t stallStreamCnt = 0; 787 size_t processedStreamCnt = 0; 788 // Number of streams on ISP encoder path 789 size_t numStreamsOnEncoder = 0; 790 cam_dimension_t maxViewfinderSize; 791 bool bJpegExceeds4K = false; 792 bool bUseCommonFeatureMask = false; 793 uint32_t commonFeatureMask = 0; 794 maxViewfinderSize = gCamCapability[mCameraId]->max_viewfinder_size; 795 796 for (size_t i = 0; i < streamList->num_streams; i++) { 797 camera3_stream_t *newStream = streamList->streams[i]; 798 CDBG_HIGH("%s: stream[%d] type = %d, format = %d, width = %d, height = %d", 799 __func__, i, newStream->stream_type, newStream->format, 800 newStream->width, newStream->height); 801 if (newStream->stream_type == CAMERA3_STREAM_BIDIRECTIONAL && 802 newStream->format == HAL_PIXEL_FORMAT_IMPLEMENTATION_DEFINED){ 803 isZsl = true; 804 } 805 if (newStream->format == HAL_PIXEL_FORMAT_BLOB) { 806 if (newStream->width > VIDEO_4K_WIDTH || 807 newStream->height > VIDEO_4K_HEIGHT) 808 bJpegExceeds4K = true; 809 } 810 811 if ((HAL_PIXEL_FORMAT_IMPLEMENTATION_DEFINED == newStream->format) && 812 (newStream->usage & private_handle_t::PRIV_FLAGS_VIDEO_ENCODER)) { 813 m_bIsVideo = true; 814 815 if ((VIDEO_4K_WIDTH <= newStream->width) && 816 (VIDEO_4K_HEIGHT <= newStream->height)) { 817 videoWidth = newStream->width; 818 videoHeight = newStream->height; 819 m_bIs4KVideo = true; 820 } 821 } 822 if (newStream->stream_type == CAMERA3_STREAM_BIDIRECTIONAL || 823 newStream->stream_type == CAMERA3_STREAM_OUTPUT) { 824 switch (newStream->format) { 825 case HAL_PIXEL_FORMAT_BLOB: 826 stallStreamCnt++; 827 if (newStream->width > (uint32_t)maxViewfinderSize.width || 828 newStream->height > (uint32_t)maxViewfinderSize.height) { 829 commonFeatureMask |= CAM_QCOM_FEATURE_NONE; 830 numStreamsOnEncoder++; 831 } 832 break; 833 case HAL_PIXEL_FORMAT_RAW10: 834 case HAL_PIXEL_FORMAT_RAW_OPAQUE: 835 case HAL_PIXEL_FORMAT_RAW16: 836 rawStreamCnt++; 837 break; 838 case HAL_PIXEL_FORMAT_IMPLEMENTATION_DEFINED: 839 processedStreamCnt++; 840 if (newStream->width > (uint32_t)maxViewfinderSize.width || 841 newStream->height > (uint32_t)maxViewfinderSize.height) { 842 if (newStream->stream_type == CAMERA3_STREAM_BIDIRECTIONAL) { 843 commonFeatureMask |= CAM_QCOM_FEATURE_NONE; 844 } else { 845 commonFeatureMask |= CAM_QCOM_FEATURE_PP_SUPERSET; 846 } 847 numStreamsOnEncoder++; 848 } 849 break; 850 case HAL_PIXEL_FORMAT_YCbCr_420_888: 851 default: 852 processedStreamCnt++; 853 if (newStream->width > (uint32_t)maxViewfinderSize.width || 854 newStream->height > (uint32_t)maxViewfinderSize.height) { 855 commonFeatureMask |= CAM_QCOM_FEATURE_PP_SUPERSET; 856 numStreamsOnEncoder++; 857 } 858 break; 859 } 860 861 } 862 } 863 864 /* Check if num_streams is sane */ 865 if (stallStreamCnt > MAX_STALLING_STREAMS || 866 rawStreamCnt > MAX_RAW_STREAMS || 867 processedStreamCnt > MAX_PROCESSED_STREAMS) { 868 ALOGE("%s: Invalid stream configu: stall: %d, raw: %d, processed %d", 869 __func__, stallStreamCnt, rawStreamCnt, processedStreamCnt); 870 pthread_mutex_unlock(&mMutex); 871 return -EINVAL; 872 } 873 /* Check whether we have zsl stream or 4k video case */ 874 if (isZsl && m_bIsVideo) { 875 ALOGE("%s: Currently invalid configuration ZSL&Video!", __func__); 876 pthread_mutex_unlock(&mMutex); 877 return -EINVAL; 878 } 879 /* Check if stream sizes are sane */ 880 if (numStreamsOnEncoder > 2) { 881 ALOGE("%s: Number of streams on ISP encoder path exceeds limits of 2", 882 __func__); 883 pthread_mutex_unlock(&mMutex); 884 return -EINVAL; 885 } else if (1 < numStreamsOnEncoder){ 886 bUseCommonFeatureMask = true; 887 CDBG_HIGH("%s: Multiple streams above max viewfinder size, common mask needed", 888 __func__); 889 } 890 /* Check if BLOB size is greater than 4k in 4k recording case */ 891 if (m_bIs4KVideo && bJpegExceeds4K) { 892 ALOGE("%s: HAL doesn't support Blob size greater than 4k in 4k recording", 893 __func__); 894 pthread_mutex_unlock(&mMutex); 895 return -EINVAL; 896 } 897 898 rc = validateStreamDimensions(streamList); 899 if (rc != NO_ERROR) { 900 ALOGE("%s: Invalid stream configuration requested!", __func__); 901 pthread_mutex_unlock(&mMutex); 902 return rc; 903 } 904 905 camera3_stream_t *inputStream = NULL; 906 camera3_stream_t *jpegStream = NULL; 907 cam_stream_size_info_t stream_config_info; 908 for (size_t i = 0; i < streamList->num_streams; i++) { 909 camera3_stream_t *newStream = streamList->streams[i]; 910 CDBG_HIGH("%s: newStream type = %d, stream format = %d stream size : %d x %d", 911 __func__, newStream->stream_type, newStream->format, 912 newStream->width, newStream->height); 913 //if the stream is in the mStreamList validate it 914 bool stream_exists = false; 915 for (List<stream_info_t*>::iterator it=mStreamInfo.begin(); 916 it != mStreamInfo.end(); it++) { 917 if ((*it)->stream == newStream) { 918 QCamera3Channel *channel = 919 (QCamera3Channel*)(*it)->stream->priv; 920 stream_exists = true; 921 delete channel; 922 (*it)->status = VALID; 923 (*it)->stream->priv = NULL; 924 (*it)->channel = NULL; 925 } 926 } 927 if (!stream_exists) { 928 //new stream 929 stream_info_t* stream_info; 930 stream_info = (stream_info_t* )malloc(sizeof(stream_info_t)); 931 stream_info->stream = newStream; 932 stream_info->status = VALID; 933 stream_info->channel = NULL; 934 mStreamInfo.push_back(stream_info); 935 } 936 if (newStream->stream_type == CAMERA3_STREAM_INPUT 937 || newStream->stream_type == CAMERA3_STREAM_BIDIRECTIONAL ) { 938 if (inputStream != NULL) { 939 ALOGE("%s: Multiple input streams requested!", __func__); 940 pthread_mutex_unlock(&mMutex); 941 return BAD_VALUE; 942 } 943 inputStream = newStream; 944 } 945 if (newStream->format == HAL_PIXEL_FORMAT_BLOB) { 946 jpegStream = newStream; 947 } 948 } 949 mInputStream = inputStream; 950 951 cleanAndSortStreamInfo(); 952 if (mMetadataChannel) { 953 delete mMetadataChannel; 954 mMetadataChannel = NULL; 955 } 956 if (mSupportChannel) { 957 delete mSupportChannel; 958 mSupportChannel = NULL; 959 } 960 961 //Create metadata channel and initialize it 962 mMetadataChannel = new QCamera3MetadataChannel(mCameraHandle->camera_handle, 963 mCameraHandle->ops, captureResultCb, 964 &gCamCapability[mCameraId]->padding_info, CAM_QCOM_FEATURE_NONE, this); 965 if (mMetadataChannel == NULL) { 966 ALOGE("%s: failed to allocate metadata channel", __func__); 967 rc = -ENOMEM; 968 pthread_mutex_unlock(&mMutex); 969 return rc; 970 } 971 rc = mMetadataChannel->initialize(IS_TYPE_NONE, mCaptureIntent); 972 if (rc < 0) { 973 ALOGE("%s: metadata channel initialization failed", __func__); 974 delete mMetadataChannel; 975 mMetadataChannel = NULL; 976 pthread_mutex_unlock(&mMutex); 977 return rc; 978 } 979 980 981 if (isSupportChannelNeeded(streamList)) { 982 mSupportChannel = new QCamera3SupportChannel( 983 mCameraHandle->camera_handle, 984 mCameraHandle->ops, 985 &gCamCapability[mCameraId]->padding_info, 986 CAM_QCOM_FEATURE_NONE, 987 this); 988 if (!mSupportChannel) { 989 ALOGE("%s: dummy channel cannot be created", __func__); 990 pthread_mutex_unlock(&mMutex); 991 return -ENOMEM; 992 } 993 } 994 995 bool isRawStreamRequested = false; 996 /* Allocate channel objects for the requested streams */ 997 for (size_t i = 0; i < streamList->num_streams; i++) { 998 camera3_stream_t *newStream = streamList->streams[i]; 999 uint32_t stream_usage = newStream->usage; 1000 stream_config_info.stream_sizes[i].width = newStream->width; 1001 stream_config_info.stream_sizes[i].height = newStream->height; 1002 if (newStream->stream_type == CAMERA3_STREAM_BIDIRECTIONAL && 1003 newStream->format == HAL_PIXEL_FORMAT_IMPLEMENTATION_DEFINED && jpegStream){ 1004 //for zsl stream the size is jpeg stream size 1005 stream_config_info.stream_sizes[i].width = jpegStream->width; 1006 stream_config_info.stream_sizes[i].height = jpegStream->height; 1007 stream_config_info.type[i] = CAM_STREAM_TYPE_SNAPSHOT; 1008 stream_config_info.postprocess_mask[i] = CAM_QCOM_FEATURE_NONE; 1009 } else { 1010 //for non zsl streams find out the format 1011 switch (newStream->format) { 1012 case HAL_PIXEL_FORMAT_IMPLEMENTATION_DEFINED : 1013 { 1014 if (stream_usage & private_handle_t::PRIV_FLAGS_VIDEO_ENCODER) { 1015 stream_config_info.type[i] = CAM_STREAM_TYPE_VIDEO; 1016 } else { 1017 stream_config_info.type[i] = CAM_STREAM_TYPE_PREVIEW; 1018 } 1019 stream_config_info.postprocess_mask[i] = CAM_QCOM_FEATURE_PP_SUPERSET; 1020 } 1021 break; 1022 case HAL_PIXEL_FORMAT_YCbCr_420_888: 1023 stream_config_info.type[i] = CAM_STREAM_TYPE_CALLBACK; 1024 stream_config_info.postprocess_mask[i] = CAM_QCOM_FEATURE_PP_SUPERSET; 1025 break; 1026 case HAL_PIXEL_FORMAT_BLOB: 1027 stream_config_info.type[i] = CAM_STREAM_TYPE_SNAPSHOT; 1028 if (m_bIs4KVideo && !isZsl) { 1029 stream_config_info.postprocess_mask[i] = CAM_QCOM_FEATURE_PP_SUPERSET; 1030 } else { 1031 if (bUseCommonFeatureMask && 1032 (newStream->width > (uint32_t)maxViewfinderSize.width || 1033 newStream->height > (uint32_t)maxViewfinderSize.height)) { 1034 stream_config_info.postprocess_mask[i] = commonFeatureMask; 1035 } else { 1036 stream_config_info.postprocess_mask[i] = CAM_QCOM_FEATURE_NONE; 1037 } 1038 } 1039 if (m_bIs4KVideo) { 1040 stream_config_info.stream_sizes[i].width = videoWidth; 1041 stream_config_info.stream_sizes[i].height = videoHeight; 1042 } 1043 break; 1044 case HAL_PIXEL_FORMAT_RAW_OPAQUE: 1045 case HAL_PIXEL_FORMAT_RAW16: 1046 case HAL_PIXEL_FORMAT_RAW10: 1047 stream_config_info.type[i] = CAM_STREAM_TYPE_RAW; 1048 isRawStreamRequested = true; 1049 break; 1050 default: 1051 stream_config_info.type[i] = CAM_STREAM_TYPE_DEFAULT; 1052 stream_config_info.postprocess_mask[i] = CAM_QCOM_FEATURE_NONE; 1053 break; 1054 } 1055 } 1056 if (newStream->priv == NULL) { 1057 //New stream, construct channel 1058 switch (newStream->stream_type) { 1059 case CAMERA3_STREAM_INPUT: 1060 newStream->usage = GRALLOC_USAGE_HW_CAMERA_READ; 1061 break; 1062 case CAMERA3_STREAM_BIDIRECTIONAL: 1063 newStream->usage = GRALLOC_USAGE_HW_CAMERA_READ | 1064 GRALLOC_USAGE_HW_CAMERA_WRITE; 1065 break; 1066 case CAMERA3_STREAM_OUTPUT: 1067 /* For video encoding stream, set read/write rarely 1068 * flag so that they may be set to un-cached */ 1069 if (newStream->usage & GRALLOC_USAGE_HW_VIDEO_ENCODER) 1070 newStream->usage = 1071 (GRALLOC_USAGE_SW_READ_RARELY | 1072 GRALLOC_USAGE_SW_WRITE_RARELY | 1073 GRALLOC_USAGE_HW_CAMERA_WRITE); 1074 else 1075 newStream->usage = GRALLOC_USAGE_HW_CAMERA_WRITE; 1076 break; 1077 default: 1078 ALOGE("%s: Invalid stream_type %d", __func__, newStream->stream_type); 1079 break; 1080 } 1081 1082 if (newStream->format == HAL_PIXEL_FORMAT_IMPLEMENTATION_DEFINED && 1083 newStream->stream_type == CAMERA3_STREAM_BIDIRECTIONAL && 1084 jpegStream) { 1085 QCamera3Channel *channel = NULL; 1086 newStream->max_buffers = QCamera3RegularChannel::kMaxBuffers; 1087 channel = new QCamera3RegularChannel(mCameraHandle->camera_handle, 1088 mCameraHandle->ops, captureResultCb, 1089 &gCamCapability[mCameraId]->padding_info, 1090 this, 1091 newStream, 1092 (cam_stream_type_t) stream_config_info.type[i], 1093 stream_config_info.postprocess_mask[i], 1094 jpegStream->width, jpegStream->height); 1095 if (channel == NULL) { 1096 ALOGE("%s: allocation of channel failed", __func__); 1097 pthread_mutex_unlock(&mMutex); 1098 return -ENOMEM; 1099 } 1100 newStream->priv = channel; 1101 } else if (newStream->stream_type == CAMERA3_STREAM_OUTPUT) { 1102 QCamera3Channel *channel = NULL; 1103 switch (newStream->format) { 1104 case HAL_PIXEL_FORMAT_IMPLEMENTATION_DEFINED: 1105 case HAL_PIXEL_FORMAT_YCbCr_420_888: 1106 newStream->max_buffers = QCamera3RegularChannel::kMaxBuffers; 1107 channel = new QCamera3RegularChannel(mCameraHandle->camera_handle, 1108 mCameraHandle->ops, captureResultCb, 1109 &gCamCapability[mCameraId]->padding_info, 1110 this, 1111 newStream, 1112 (cam_stream_type_t) stream_config_info.type[i], 1113 stream_config_info.postprocess_mask[i]); 1114 if (channel == NULL) { 1115 ALOGE("%s: allocation of channel failed", __func__); 1116 pthread_mutex_unlock(&mMutex); 1117 return -ENOMEM; 1118 } 1119 1120 newStream->priv = channel; 1121 break; 1122 case HAL_PIXEL_FORMAT_RAW_OPAQUE: 1123 case HAL_PIXEL_FORMAT_RAW16: 1124 case HAL_PIXEL_FORMAT_RAW10: 1125 newStream->max_buffers = QCamera3RawChannel::kMaxBuffers; 1126 mRawChannel = new QCamera3RawChannel( 1127 mCameraHandle->camera_handle, 1128 mCameraHandle->ops, captureResultCb, 1129 &gCamCapability[mCameraId]->padding_info, 1130 this, newStream, CAM_QCOM_FEATURE_NONE, 1131 (newStream->format == HAL_PIXEL_FORMAT_RAW16)); 1132 if (mRawChannel == NULL) { 1133 ALOGE("%s: allocation of raw channel failed", __func__); 1134 pthread_mutex_unlock(&mMutex); 1135 return -ENOMEM; 1136 } 1137 1138 newStream->priv = (QCamera3Channel*)mRawChannel; 1139 break; 1140 case HAL_PIXEL_FORMAT_BLOB: 1141 newStream->max_buffers = QCamera3PicChannel::kMaxBuffers; 1142 mPictureChannel = new QCamera3PicChannel(mCameraHandle->camera_handle, 1143 mCameraHandle->ops, captureResultCb, 1144 &gCamCapability[mCameraId]->padding_info, this, newStream, 1145 stream_config_info.postprocess_mask[i], 1146 m_bIs4KVideo, mMetadataChannel); 1147 if (mPictureChannel == NULL) { 1148 ALOGE("%s: allocation of channel failed", __func__); 1149 pthread_mutex_unlock(&mMutex); 1150 return -ENOMEM; 1151 } 1152 newStream->priv = (QCamera3Channel*)mPictureChannel; 1153 break; 1154 1155 default: 1156 ALOGE("%s: not a supported format 0x%x", __func__, newStream->format); 1157 break; 1158 } 1159 } 1160 1161 for (List<stream_info_t*>::iterator it=mStreamInfo.begin(); 1162 it != mStreamInfo.end(); it++) { 1163 if ((*it)->stream == newStream) { 1164 (*it)->channel = (QCamera3Channel*) newStream->priv; 1165 break; 1166 } 1167 } 1168 } else { 1169 // Channel already exists for this stream 1170 // Do nothing for now 1171 } 1172 } 1173 1174 if (mPictureChannel && m_bIs4KVideo) { 1175 mPictureChannel->overrideYuvSize(videoWidth, videoHeight); 1176 } 1177 1178 //RAW DUMP channel 1179 if (mEnableRawDump && isRawStreamRequested == false){ 1180 cam_dimension_t rawDumpSize; 1181 rawDumpSize = getMaxRawSize(mCameraId); 1182 mRawDumpChannel = new QCamera3RawDumpChannel(mCameraHandle->camera_handle, 1183 mCameraHandle->ops, 1184 rawDumpSize, 1185 &gCamCapability[mCameraId]->padding_info, 1186 this, CAM_QCOM_FEATURE_NONE); 1187 if (!mRawDumpChannel) { 1188 ALOGE("%s: Raw Dump channel cannot be created", __func__); 1189 pthread_mutex_unlock(&mMutex); 1190 return -ENOMEM; 1191 } 1192 } 1193 1194 1195 stream_config_info.num_streams = streamList->num_streams; 1196 if (mSupportChannel) { 1197 stream_config_info.stream_sizes[stream_config_info.num_streams] = 1198 QCamera3SupportChannel::kDim; 1199 stream_config_info.type[stream_config_info.num_streams] = 1200 CAM_STREAM_TYPE_CALLBACK; 1201 stream_config_info.num_streams++; 1202 } 1203 1204 if (mRawDumpChannel) { 1205 cam_dimension_t rawSize; 1206 rawSize = getMaxRawSize(mCameraId); 1207 stream_config_info.stream_sizes[stream_config_info.num_streams] = 1208 rawSize; 1209 stream_config_info.type[stream_config_info.num_streams] = 1210 CAM_STREAM_TYPE_RAW; 1211 stream_config_info.num_streams++; 1212 } 1213 1214 // settings/parameters don't carry over for new configureStreams 1215 int32_t hal_version = CAM_HAL_V3; 1216 memset(mParameters, 0, sizeof(metadata_buffer_t)); 1217 1218 AddSetParmEntryToBatch(mParameters, CAM_INTF_PARM_HAL_VERSION, 1219 sizeof(hal_version), &hal_version); 1220 1221 AddSetParmEntryToBatch(mParameters, CAM_INTF_META_STREAM_INFO, 1222 sizeof(cam_stream_size_info_t), &stream_config_info); 1223 1224 int32_t tintless_value = 1; 1225 AddSetParmEntryToBatch(mParameters,CAM_INTF_PARM_TINTLESS, 1226 sizeof(tintless_value), &tintless_value); 1227 1228 mCameraHandle->ops->set_parms(mCameraHandle->camera_handle, mParameters); 1229 1230 /* Initialize mPendingRequestInfo and mPendnigBuffersMap */ 1231 mPendingRequestsList.clear(); 1232 mPendingFrameDropList.clear(); 1233 // Initialize/Reset the pending buffers list 1234 mPendingBuffersMap.num_buffers = 0; 1235 mPendingBuffersMap.mPendingBufferList.clear(); 1236 mPendingReprocessResultList.clear(); 1237 1238 mFirstRequest = true; 1239 1240 //Get min frame duration for this streams configuration 1241 deriveMinFrameDuration(); 1242 1243 pthread_mutex_unlock(&mMutex); 1244 return rc; 1245 } 1246 1247 /*=========================================================================== 1248 * FUNCTION : validateCaptureRequest 1249 * 1250 * DESCRIPTION: validate a capture request from camera service 1251 * 1252 * PARAMETERS : 1253 * @request : request from framework to process 1254 * 1255 * RETURN : 1256 * 1257 *==========================================================================*/ 1258 int QCamera3HardwareInterface::validateCaptureRequest( 1259 camera3_capture_request_t *request) 1260 { 1261 ssize_t idx = 0; 1262 const camera3_stream_buffer_t *b; 1263 CameraMetadata meta; 1264 1265 /* Sanity check the request */ 1266 if (request == NULL) { 1267 ALOGE("%s: NULL capture request", __func__); 1268 return BAD_VALUE; 1269 } 1270 1271 if (request->settings == NULL && mFirstRequest) { 1272 /*settings cannot be null for the first request*/ 1273 return BAD_VALUE; 1274 } 1275 1276 uint32_t frameNumber = request->frame_number; 1277 if (request->input_buffer != NULL && 1278 request->input_buffer->stream != mInputStream) { 1279 ALOGE("%s: Request %d: Input buffer not from input stream!", 1280 __FUNCTION__, frameNumber); 1281 return BAD_VALUE; 1282 } 1283 if (request->num_output_buffers < 1 || request->output_buffers == NULL) { 1284 ALOGE("%s: Request %d: No output buffers provided!", 1285 __FUNCTION__, frameNumber); 1286 return BAD_VALUE; 1287 } 1288 if (request->input_buffer != NULL) { 1289 b = request->input_buffer; 1290 QCamera3Channel *channel = 1291 static_cast<QCamera3Channel*>(b->stream->priv); 1292 if (channel == NULL) { 1293 ALOGE("%s: Request %d: Buffer %ld: Unconfigured stream!", 1294 __func__, frameNumber, (long)idx); 1295 return BAD_VALUE; 1296 } 1297 if (b->status != CAMERA3_BUFFER_STATUS_OK) { 1298 ALOGE("%s: Request %d: Buffer %ld: Status not OK!", 1299 __func__, frameNumber, (long)idx); 1300 return BAD_VALUE; 1301 } 1302 if (b->release_fence != -1) { 1303 ALOGE("%s: Request %d: Buffer %ld: Has a release fence!", 1304 __func__, frameNumber, (long)idx); 1305 return BAD_VALUE; 1306 } 1307 if (b->buffer == NULL) { 1308 ALOGE("%s: Request %d: Buffer %ld: NULL buffer handle!", 1309 __func__, frameNumber, (long)idx); 1310 return BAD_VALUE; 1311 } 1312 } 1313 1314 // Validate all buffers 1315 b = request->output_buffers; 1316 do { 1317 QCamera3Channel *channel = 1318 static_cast<QCamera3Channel*>(b->stream->priv); 1319 if (channel == NULL) { 1320 ALOGE("%s: Request %d: Buffer %ld: Unconfigured stream!", 1321 __func__, frameNumber, (long)idx); 1322 return BAD_VALUE; 1323 } 1324 if (b->status != CAMERA3_BUFFER_STATUS_OK) { 1325 ALOGE("%s: Request %d: Buffer %ld: Status not OK!", 1326 __func__, frameNumber, (long)idx); 1327 return BAD_VALUE; 1328 } 1329 if (b->release_fence != -1) { 1330 ALOGE("%s: Request %d: Buffer %ld: Has a release fence!", 1331 __func__, frameNumber, (long)idx); 1332 return BAD_VALUE; 1333 } 1334 if (b->buffer == NULL) { 1335 ALOGE("%s: Request %d: Buffer %ld: NULL buffer handle!", 1336 __func__, frameNumber, (long)idx); 1337 return BAD_VALUE; 1338 } 1339 if (*(b->buffer) == NULL) { 1340 ALOGE("%s: Request %d: Buffer %ld: NULL private handle!", 1341 __func__, frameNumber, (long)idx); 1342 return BAD_VALUE; 1343 } 1344 idx++; 1345 b = request->output_buffers + idx; 1346 } while (idx < (ssize_t)request->num_output_buffers); 1347 1348 return NO_ERROR; 1349 } 1350 1351 /*=========================================================================== 1352 * FUNCTION : deriveMinFrameDuration 1353 * 1354 * DESCRIPTION: derive mininum processed, jpeg, and raw frame durations based 1355 * on currently configured streams. 1356 * 1357 * PARAMETERS : NONE 1358 * 1359 * RETURN : NONE 1360 * 1361 *==========================================================================*/ 1362 void QCamera3HardwareInterface::deriveMinFrameDuration() 1363 { 1364 int32_t maxJpegDim, maxProcessedDim, maxRawDim; 1365 1366 maxJpegDim = 0; 1367 maxProcessedDim = 0; 1368 maxRawDim = 0; 1369 1370 // Figure out maximum jpeg, processed, and raw dimensions 1371 for (List<stream_info_t*>::iterator it = mStreamInfo.begin(); 1372 it != mStreamInfo.end(); it++) { 1373 1374 // Input stream doesn't have valid stream_type 1375 if ((*it)->stream->stream_type == CAMERA3_STREAM_INPUT) 1376 continue; 1377 1378 int32_t dimension = (*it)->stream->width * (*it)->stream->height; 1379 if ((*it)->stream->format == HAL_PIXEL_FORMAT_BLOB) { 1380 if (dimension > maxJpegDim) 1381 maxJpegDim = dimension; 1382 } else if ((*it)->stream->format == HAL_PIXEL_FORMAT_RAW_OPAQUE || 1383 (*it)->stream->format == HAL_PIXEL_FORMAT_RAW10 || 1384 (*it)->stream->format == HAL_PIXEL_FORMAT_RAW16) { 1385 if (dimension > maxRawDim) 1386 maxRawDim = dimension; 1387 } else { 1388 if (dimension > maxProcessedDim) 1389 maxProcessedDim = dimension; 1390 } 1391 } 1392 1393 //Assume all jpeg dimensions are in processed dimensions. 1394 if (maxJpegDim > maxProcessedDim) 1395 maxProcessedDim = maxJpegDim; 1396 //Find the smallest raw dimension that is greater or equal to jpeg dimension 1397 if (maxProcessedDim > maxRawDim) { 1398 maxRawDim = INT32_MAX; 1399 for (int i = 0; i < gCamCapability[mCameraId]->supported_raw_dim_cnt; 1400 i++) { 1401 1402 int32_t dimension = 1403 gCamCapability[mCameraId]->raw_dim[i].width * 1404 gCamCapability[mCameraId]->raw_dim[i].height; 1405 1406 if (dimension >= maxProcessedDim && dimension < maxRawDim) 1407 maxRawDim = dimension; 1408 } 1409 } 1410 1411 //Find minimum durations for processed, jpeg, and raw 1412 for (int i = 0; i < gCamCapability[mCameraId]->supported_raw_dim_cnt; 1413 i++) { 1414 if (maxRawDim == gCamCapability[mCameraId]->raw_dim[i].width * 1415 gCamCapability[mCameraId]->raw_dim[i].height) { 1416 mMinRawFrameDuration = gCamCapability[mCameraId]->raw_min_duration[i]; 1417 break; 1418 } 1419 } 1420 for (int i = 0; i < gCamCapability[mCameraId]->picture_sizes_tbl_cnt; i++) { 1421 if (maxProcessedDim == 1422 gCamCapability[mCameraId]->picture_sizes_tbl[i].width * 1423 gCamCapability[mCameraId]->picture_sizes_tbl[i].height) { 1424 mMinProcessedFrameDuration = gCamCapability[mCameraId]->picture_min_duration[i]; 1425 mMinJpegFrameDuration = gCamCapability[mCameraId]->picture_min_duration[i]; 1426 break; 1427 } 1428 } 1429 } 1430 1431 /*=========================================================================== 1432 * FUNCTION : getMinFrameDuration 1433 * 1434 * DESCRIPTION: get minimum frame draution based on the current maximum frame durations 1435 * and current request configuration. 1436 * 1437 * PARAMETERS : @request: requset sent by the frameworks 1438 * 1439 * RETURN : min farme duration for a particular request 1440 * 1441 *==========================================================================*/ 1442 int64_t QCamera3HardwareInterface::getMinFrameDuration(const camera3_capture_request_t *request) 1443 { 1444 bool hasJpegStream = false; 1445 bool hasRawStream = false; 1446 for (uint32_t i = 0; i < request->num_output_buffers; i ++) { 1447 const camera3_stream_t *stream = request->output_buffers[i].stream; 1448 if (stream->format == HAL_PIXEL_FORMAT_BLOB) 1449 hasJpegStream = true; 1450 else if (stream->format == HAL_PIXEL_FORMAT_RAW_OPAQUE || 1451 stream->format == HAL_PIXEL_FORMAT_RAW10 || 1452 stream->format == HAL_PIXEL_FORMAT_RAW16) 1453 hasRawStream = true; 1454 } 1455 1456 if (!hasJpegStream) 1457 return MAX(mMinRawFrameDuration, mMinProcessedFrameDuration); 1458 else 1459 return MAX(MAX(mMinRawFrameDuration, mMinProcessedFrameDuration), mMinJpegFrameDuration); 1460 } 1461 1462 /*=========================================================================== 1463 * FUNCTION : handlePendingReprocResults 1464 * 1465 * DESCRIPTION: check and notify on any pending reprocess results 1466 * 1467 * PARAMETERS : 1468 * @frame_number : Pending request frame number 1469 * 1470 * RETURN : int32_t type of status 1471 * NO_ERROR -- success 1472 * none-zero failure code 1473 *==========================================================================*/ 1474 int32_t QCamera3HardwareInterface::handlePendingReprocResults(uint32_t frame_number) 1475 { 1476 for (List<PendingReprocessResult>::iterator j = mPendingReprocessResultList.begin(); 1477 j != mPendingReprocessResultList.end(); j++) { 1478 if (j->frame_number == frame_number) { 1479 mCallbackOps->notify(mCallbackOps, &j->notify_msg); 1480 1481 CDBG("%s: Delayed reprocess notify %d", __func__, 1482 frame_number); 1483 1484 for (List<PendingRequestInfo>::iterator k = mPendingRequestsList.begin(); 1485 k != mPendingRequestsList.end(); k++) { 1486 1487 if (k->frame_number == j->frame_number) { 1488 CDBG("%s: Found reprocess frame number %d in pending reprocess List " 1489 "Take it out!!", __func__, 1490 k->frame_number); 1491 1492 camera3_capture_result result; 1493 memset(&result, 0, sizeof(camera3_capture_result)); 1494 result.frame_number = frame_number; 1495 result.num_output_buffers = 1; 1496 result.output_buffers = &j->buffer; 1497 result.input_buffer = k->input_buffer; 1498 result.result = k->settings; 1499 result.partial_result = PARTIAL_RESULT_COUNT; 1500 mCallbackOps->process_capture_result(mCallbackOps, &result); 1501 1502 mPendingRequestsList.erase(k); 1503 mPendingRequest--; 1504 break; 1505 } 1506 } 1507 mPendingReprocessResultList.erase(j); 1508 break; 1509 } 1510 } 1511 return NO_ERROR; 1512 } 1513 1514 /*=========================================================================== 1515 * FUNCTION : handleMetadataWithLock 1516 * 1517 * DESCRIPTION: Handles metadata buffer callback with mMutex lock held. 1518 * 1519 * PARAMETERS : @metadata_buf: metadata buffer 1520 * 1521 * RETURN : 1522 * 1523 *==========================================================================*/ 1524 void QCamera3HardwareInterface::handleMetadataWithLock( 1525 mm_camera_super_buf_t *metadata_buf) 1526 { 1527 ATRACE_CALL(); 1528 metadata_buffer_t *metadata = (metadata_buffer_t *)metadata_buf->bufs[0]->buffer; 1529 int32_t frame_number_valid = *(int32_t *) 1530 POINTER_OF_META(CAM_INTF_META_FRAME_NUMBER_VALID, metadata); 1531 uint32_t frame_number = *(uint32_t *) 1532 POINTER_OF_META(CAM_INTF_META_FRAME_NUMBER, metadata); 1533 nsecs_t capture_time = *(int64_t *) 1534 POINTER_OF_META(CAM_INTF_META_SENSOR_TIMESTAMP, metadata); 1535 cam_frame_dropped_t cam_frame_drop = *(cam_frame_dropped_t *) 1536 POINTER_OF_META(CAM_INTF_META_FRAME_DROPPED, metadata); 1537 camera3_notify_msg_t notify_msg; 1538 1539 int32_t urgent_frame_number_valid = *(int32_t *) 1540 POINTER_OF_META(CAM_INTF_META_URGENT_FRAME_NUMBER_VALID, metadata); 1541 uint32_t urgent_frame_number = *(uint32_t *) 1542 POINTER_OF_META(CAM_INTF_META_URGENT_FRAME_NUMBER, metadata); 1543 1544 if (urgent_frame_number_valid) { 1545 CDBG("%s: valid urgent frame_number = %d, capture_time = %lld", 1546 __func__, urgent_frame_number, capture_time); 1547 1548 //Recieved an urgent Frame Number, handle it 1549 //using partial results 1550 for (List<PendingRequestInfo>::iterator i = 1551 mPendingRequestsList.begin(); i != mPendingRequestsList.end(); i++) { 1552 CDBG("%s: Iterator Frame = %d urgent frame = %d", 1553 __func__, i->frame_number, urgent_frame_number); 1554 1555 if (i->frame_number < urgent_frame_number && 1556 i->partial_result_cnt == 0) { 1557 ALOGE("%s: Error: HAL missed urgent metadata for frame number %d", 1558 __func__, i->frame_number); 1559 } 1560 1561 if (i->frame_number == urgent_frame_number && 1562 i->bUrgentReceived == 0) { 1563 1564 camera3_capture_result_t result; 1565 memset(&result, 0, sizeof(camera3_capture_result_t)); 1566 1567 i->partial_result_cnt++; 1568 i->bUrgentReceived = 1; 1569 // Extract 3A metadata 1570 result.result = 1571 translateCbUrgentMetadataToResultMetadata(metadata); 1572 // Populate metadata result 1573 result.frame_number = urgent_frame_number; 1574 result.num_output_buffers = 0; 1575 result.output_buffers = NULL; 1576 result.partial_result = i->partial_result_cnt; 1577 1578 mCallbackOps->process_capture_result(mCallbackOps, &result); 1579 CDBG("%s: urgent frame_number = %d, capture_time = %lld", 1580 __func__, result.frame_number, capture_time); 1581 free_camera_metadata((camera_metadata_t *)result.result); 1582 break; 1583 } 1584 } 1585 } 1586 1587 if (!frame_number_valid) { 1588 CDBG("%s: Not a valid normal frame number, used as SOF only", __func__); 1589 mMetadataChannel->bufDone(metadata_buf); 1590 free(metadata_buf); 1591 goto done_metadata; 1592 } 1593 CDBG("%s: valid frame_number = %d, capture_time = %lld", __func__, 1594 frame_number, capture_time); 1595 1596 // Go through the pending requests info and send shutter/results to frameworks 1597 for (List<PendingRequestInfo>::iterator i = mPendingRequestsList.begin(); 1598 i != mPendingRequestsList.end() && i->frame_number <= frame_number;) { 1599 camera3_capture_result_t result; 1600 memset(&result, 0, sizeof(camera3_capture_result_t)); 1601 1602 CDBG("%s: frame_number in the list is %d", __func__, i->frame_number); 1603 i->partial_result_cnt++; 1604 result.partial_result = i->partial_result_cnt; 1605 1606 // Flush out all entries with less or equal frame numbers. 1607 mPendingRequest--; 1608 1609 // Check whether any stream buffer corresponding to this is dropped or not 1610 // If dropped, then send the ERROR_BUFFER for the corresponding stream 1611 if (cam_frame_drop.frame_dropped) { 1612 camera3_notify_msg_t notify_msg; 1613 for (List<RequestedBufferInfo>::iterator j = i->buffers.begin(); 1614 j != i->buffers.end(); j++) { 1615 QCamera3Channel *channel = (QCamera3Channel *)j->stream->priv; 1616 uint32_t streamID = channel->getStreamID(channel->getStreamTypeMask()); 1617 for (uint32_t k = 0; k < cam_frame_drop.cam_stream_ID.num_streams; k++) { 1618 if (streamID == cam_frame_drop.cam_stream_ID.streamID[k]) { 1619 // Send Error notify to frameworks with CAMERA3_MSG_ERROR_BUFFER 1620 CDBG("%s: Start of reporting error frame#=%d, streamID=%d", 1621 __func__, i->frame_number, streamID); 1622 notify_msg.type = CAMERA3_MSG_ERROR; 1623 notify_msg.message.error.frame_number = i->frame_number; 1624 notify_msg.message.error.error_code = CAMERA3_MSG_ERROR_BUFFER ; 1625 notify_msg.message.error.error_stream = j->stream; 1626 mCallbackOps->notify(mCallbackOps, ¬ify_msg); 1627 CDBG("%s: End of reporting error frame#=%d, streamID=%d", 1628 __func__, i->frame_number, streamID); 1629 PendingFrameDropInfo PendingFrameDrop; 1630 PendingFrameDrop.frame_number=i->frame_number; 1631 PendingFrameDrop.stream_ID = streamID; 1632 // Add the Frame drop info to mPendingFrameDropList 1633 mPendingFrameDropList.push_back(PendingFrameDrop); 1634 } 1635 } 1636 } 1637 } 1638 1639 // Send empty metadata with already filled buffers for dropped metadata 1640 // and send valid metadata with already filled buffers for current metadata 1641 if (i->frame_number < frame_number) { 1642 camera3_notify_msg_t notify_msg; 1643 notify_msg.type = CAMERA3_MSG_SHUTTER; 1644 notify_msg.message.shutter.frame_number = i->frame_number; 1645 notify_msg.message.shutter.timestamp = capture_time - 1646 (urgent_frame_number - i->frame_number) * NSEC_PER_33MSEC; 1647 mCallbackOps->notify(mCallbackOps, ¬ify_msg); 1648 i->timestamp = notify_msg.message.shutter.timestamp; 1649 CDBG("%s: Support notification !!!! notify frame_number = %d, capture_time = %lld", 1650 __func__, i->frame_number, notify_msg.message.shutter.timestamp); 1651 1652 CameraMetadata dummyMetadata; 1653 dummyMetadata.update(ANDROID_SENSOR_TIMESTAMP, 1654 &i->timestamp, 1); 1655 dummyMetadata.update(ANDROID_REQUEST_ID, 1656 &(i->request_id), 1); 1657 result.result = dummyMetadata.release(); 1658 } else { 1659 1660 // Send shutter notify to frameworks 1661 notify_msg.type = CAMERA3_MSG_SHUTTER; 1662 notify_msg.message.shutter.frame_number = i->frame_number; 1663 notify_msg.message.shutter.timestamp = capture_time; 1664 mCallbackOps->notify(mCallbackOps, ¬ify_msg); 1665 1666 i->timestamp = capture_time; 1667 1668 result.result = translateFromHalMetadata(metadata, 1669 i->timestamp, i->request_id, i->jpegMetadata, i->pipeline_depth, 1670 i->capture_intent); 1671 1672 if (i->blob_request) { 1673 { 1674 //Dump tuning metadata if enabled and available 1675 char prop[PROPERTY_VALUE_MAX]; 1676 memset(prop, 0, sizeof(prop)); 1677 property_get("persist.camera.dumpmetadata", prop, "0"); 1678 int32_t enabled = atoi(prop); 1679 if (enabled && metadata->is_tuning_params_valid) { 1680 dumpMetadataToFile(metadata->tuning_params, 1681 mMetaFrameCount, 1682 enabled, 1683 "Snapshot", 1684 frame_number); 1685 } 1686 } 1687 1688 1689 mPictureChannel->queueReprocMetadata(metadata_buf); 1690 } else { 1691 // Return metadata buffer 1692 mMetadataChannel->bufDone(metadata_buf); 1693 free(metadata_buf); 1694 } 1695 } 1696 if (!result.result) { 1697 ALOGE("%s: metadata is NULL", __func__); 1698 } 1699 result.frame_number = i->frame_number; 1700 result.num_output_buffers = 0; 1701 result.output_buffers = NULL; 1702 for (List<RequestedBufferInfo>::iterator j = i->buffers.begin(); 1703 j != i->buffers.end(); j++) { 1704 if (j->buffer) { 1705 result.num_output_buffers++; 1706 } 1707 } 1708 1709 if (result.num_output_buffers > 0) { 1710 camera3_stream_buffer_t *result_buffers = 1711 new camera3_stream_buffer_t[result.num_output_buffers]; 1712 if (!result_buffers) { 1713 ALOGE("%s: Fatal error: out of memory", __func__); 1714 } 1715 size_t result_buffers_idx = 0; 1716 for (List<RequestedBufferInfo>::iterator j = i->buffers.begin(); 1717 j != i->buffers.end(); j++) { 1718 if (j->buffer) { 1719 for (List<PendingFrameDropInfo>::iterator m = mPendingFrameDropList.begin(); 1720 m != mPendingFrameDropList.end(); m++) { 1721 QCamera3Channel *channel = (QCamera3Channel *)j->buffer->stream->priv; 1722 uint32_t streamID = channel->getStreamID(channel->getStreamTypeMask()); 1723 if((m->stream_ID == streamID) && (m->frame_number==frame_number)) { 1724 j->buffer->status=CAMERA3_BUFFER_STATUS_ERROR; 1725 CDBG("%s: Stream STATUS_ERROR frame_number=%d, streamID=%d", 1726 __func__, frame_number, streamID); 1727 m = mPendingFrameDropList.erase(m); 1728 break; 1729 } 1730 } 1731 1732 for (List<PendingBufferInfo>::iterator k = 1733 mPendingBuffersMap.mPendingBufferList.begin(); 1734 k != mPendingBuffersMap.mPendingBufferList.end(); k++) { 1735 if (k->buffer == j->buffer->buffer) { 1736 CDBG("%s: Found buffer %p in pending buffer List " 1737 "for frame %d, Take it out!!", __func__, 1738 k->buffer, k->frame_number); 1739 mPendingBuffersMap.num_buffers--; 1740 k = mPendingBuffersMap.mPendingBufferList.erase(k); 1741 break; 1742 } 1743 } 1744 1745 result_buffers[result_buffers_idx++] = *(j->buffer); 1746 free(j->buffer); 1747 j->buffer = NULL; 1748 } 1749 } 1750 result.output_buffers = result_buffers; 1751 mCallbackOps->process_capture_result(mCallbackOps, &result); 1752 CDBG("%s: meta frame_number = %d, capture_time = %lld", 1753 __func__, result.frame_number, i->timestamp); 1754 free_camera_metadata((camera_metadata_t *)result.result); 1755 delete[] result_buffers; 1756 } else { 1757 mCallbackOps->process_capture_result(mCallbackOps, &result); 1758 CDBG("%s: meta frame_number = %d, capture_time = %lld", 1759 __func__, result.frame_number, i->timestamp); 1760 free_camera_metadata((camera_metadata_t *)result.result); 1761 } 1762 // erase the element from the list 1763 i = mPendingRequestsList.erase(i); 1764 1765 if (!mPendingReprocessResultList.empty()) { 1766 handlePendingReprocResults(frame_number + 1); 1767 } 1768 } 1769 1770 done_metadata: 1771 for (List<PendingRequestInfo>::iterator i = mPendingRequestsList.begin(); 1772 i != mPendingRequestsList.end() ;i++) { 1773 i->pipeline_depth++; 1774 } 1775 unblockRequestIfNecessary(); 1776 1777 } 1778 1779 /*=========================================================================== 1780 * FUNCTION : handleBufferWithLock 1781 * 1782 * DESCRIPTION: Handles image buffer callback with mMutex lock held. 1783 * 1784 * PARAMETERS : @buffer: image buffer for the callback 1785 * @frame_number: frame number of the image buffer 1786 * 1787 * RETURN : 1788 * 1789 *==========================================================================*/ 1790 void QCamera3HardwareInterface::handleBufferWithLock( 1791 camera3_stream_buffer_t *buffer, uint32_t frame_number) 1792 { 1793 ATRACE_CALL(); 1794 // If the frame number doesn't exist in the pending request list, 1795 // directly send the buffer to the frameworks, and update pending buffers map 1796 // Otherwise, book-keep the buffer. 1797 List<PendingRequestInfo>::iterator i = mPendingRequestsList.begin(); 1798 while (i != mPendingRequestsList.end() && i->frame_number != frame_number){ 1799 i++; 1800 } 1801 if (i == mPendingRequestsList.end()) { 1802 // Verify all pending requests frame_numbers are greater 1803 for (List<PendingRequestInfo>::iterator j = mPendingRequestsList.begin(); 1804 j != mPendingRequestsList.end(); j++) { 1805 if (j->frame_number < frame_number) { 1806 ALOGE("%s: Error: pending frame number %d is smaller than %d", 1807 __func__, j->frame_number, frame_number); 1808 } 1809 } 1810 camera3_capture_result_t result; 1811 memset(&result, 0, sizeof(camera3_capture_result_t)); 1812 result.result = NULL; 1813 result.frame_number = frame_number; 1814 result.num_output_buffers = 1; 1815 result.partial_result = 0; 1816 for (List<PendingFrameDropInfo>::iterator m = mPendingFrameDropList.begin(); 1817 m != mPendingFrameDropList.end(); m++) { 1818 QCamera3Channel *channel = (QCamera3Channel *)buffer->stream->priv; 1819 uint32_t streamID = channel->getStreamID(channel->getStreamTypeMask()); 1820 if((m->stream_ID == streamID) && (m->frame_number==frame_number) ) { 1821 buffer->status=CAMERA3_BUFFER_STATUS_ERROR; 1822 CDBG("%s: Stream STATUS_ERROR frame_number=%d, streamID=%d", 1823 __func__, frame_number, streamID); 1824 m = mPendingFrameDropList.erase(m); 1825 break; 1826 } 1827 } 1828 result.output_buffers = buffer; 1829 CDBG("%s: result frame_number = %d, buffer = %p", 1830 __func__, frame_number, buffer->buffer); 1831 1832 for (List<PendingBufferInfo>::iterator k = 1833 mPendingBuffersMap.mPendingBufferList.begin(); 1834 k != mPendingBuffersMap.mPendingBufferList.end(); k++ ) { 1835 if (k->buffer == buffer->buffer) { 1836 CDBG("%s: Found Frame buffer, take it out from list", 1837 __func__); 1838 1839 mPendingBuffersMap.num_buffers--; 1840 k = mPendingBuffersMap.mPendingBufferList.erase(k); 1841 break; 1842 } 1843 } 1844 CDBG("%s: mPendingBuffersMap.num_buffers = %d", 1845 __func__, mPendingBuffersMap.num_buffers); 1846 1847 mCallbackOps->process_capture_result(mCallbackOps, &result); 1848 } else { 1849 if (i->input_buffer) { 1850 CameraMetadata settings; 1851 camera3_notify_msg_t notify_msg; 1852 memset(¬ify_msg, 0, sizeof(camera3_notify_msg_t)); 1853 nsecs_t capture_time = systemTime(CLOCK_MONOTONIC); 1854 if(i->settings) { 1855 settings = i->settings; 1856 if (settings.exists(ANDROID_SENSOR_TIMESTAMP)) { 1857 capture_time = settings.find(ANDROID_SENSOR_TIMESTAMP).data.i64[0]; 1858 } else { 1859 ALOGE("%s: No timestamp in input settings! Using current one.", 1860 __func__); 1861 } 1862 } else { 1863 ALOGE("%s: Input settings missing!", __func__); 1864 } 1865 1866 notify_msg.type = CAMERA3_MSG_SHUTTER; 1867 notify_msg.message.shutter.frame_number = frame_number; 1868 notify_msg.message.shutter.timestamp = capture_time; 1869 1870 sp<Fence> releaseFence = new Fence(i->input_buffer->release_fence); 1871 int32_t rc = releaseFence->wait(Fence::TIMEOUT_NEVER); 1872 if (rc != OK) { 1873 ALOGE("%s: input buffer fence wait failed %d", __func__, rc); 1874 } 1875 1876 for (List<PendingBufferInfo>::iterator k = 1877 mPendingBuffersMap.mPendingBufferList.begin(); 1878 k != mPendingBuffersMap.mPendingBufferList.end(); k++ ) { 1879 if (k->buffer == buffer->buffer) { 1880 CDBG("%s: Found Frame buffer, take it out from list", 1881 __func__); 1882 1883 mPendingBuffersMap.num_buffers--; 1884 k = mPendingBuffersMap.mPendingBufferList.erase(k); 1885 break; 1886 } 1887 } 1888 CDBG("%s: mPendingBuffersMap.num_buffers = %d", 1889 __func__, mPendingBuffersMap.num_buffers); 1890 1891 bool notifyNow = true; 1892 for (List<PendingRequestInfo>::iterator j = mPendingRequestsList.begin(); 1893 j != mPendingRequestsList.end(); j++) { 1894 if (j->frame_number < frame_number) { 1895 notifyNow = false; 1896 break; 1897 } 1898 } 1899 1900 if (notifyNow) { 1901 camera3_capture_result result; 1902 memset(&result, 0, sizeof(camera3_capture_result)); 1903 result.frame_number = frame_number; 1904 result.result = i->settings; 1905 result.input_buffer = i->input_buffer; 1906 result.num_output_buffers = 1; 1907 result.output_buffers = buffer; 1908 result.partial_result = PARTIAL_RESULT_COUNT; 1909 1910 mCallbackOps->notify(mCallbackOps, ¬ify_msg); 1911 mCallbackOps->process_capture_result(mCallbackOps, &result); 1912 CDBG("%s: Notify reprocess now %d!", __func__, frame_number); 1913 i = mPendingRequestsList.erase(i); 1914 mPendingRequest--; 1915 } else { 1916 // Cache reprocess result for later 1917 PendingReprocessResult pendingResult; 1918 memset(&pendingResult, 0, sizeof(PendingReprocessResult)); 1919 pendingResult.notify_msg = notify_msg; 1920 pendingResult.buffer = *buffer; 1921 pendingResult.frame_number = frame_number; 1922 mPendingReprocessResultList.push_back(pendingResult); 1923 CDBG("%s: Cache reprocess result %d!", __func__, frame_number); 1924 } 1925 } else { 1926 for (List<RequestedBufferInfo>::iterator j = i->buffers.begin(); 1927 j != i->buffers.end(); j++) { 1928 if (j->stream == buffer->stream) { 1929 if (j->buffer != NULL) { 1930 ALOGE("%s: Error: buffer is already set", __func__); 1931 } else { 1932 j->buffer = (camera3_stream_buffer_t *)malloc( 1933 sizeof(camera3_stream_buffer_t)); 1934 *(j->buffer) = *buffer; 1935 CDBG("%s: cache buffer %p at result frame_number %d", 1936 __func__, buffer, frame_number); 1937 } 1938 } 1939 } 1940 } 1941 } 1942 } 1943 1944 /*=========================================================================== 1945 * FUNCTION : unblockRequestIfNecessary 1946 * 1947 * DESCRIPTION: Unblock capture_request if max_buffer hasn't been reached. Note 1948 * that mMutex is held when this function is called. 1949 * 1950 * PARAMETERS : 1951 * 1952 * RETURN : 1953 * 1954 *==========================================================================*/ 1955 void QCamera3HardwareInterface::unblockRequestIfNecessary() 1956 { 1957 // Unblock process_capture_request 1958 pthread_cond_signal(&mRequestCond); 1959 } 1960 1961 /*=========================================================================== 1962 * FUNCTION : processCaptureRequest 1963 * 1964 * DESCRIPTION: process a capture request from camera service 1965 * 1966 * PARAMETERS : 1967 * @request : request from framework to process 1968 * 1969 * RETURN : 1970 * 1971 *==========================================================================*/ 1972 int QCamera3HardwareInterface::processCaptureRequest( 1973 camera3_capture_request_t *request) 1974 { 1975 ATRACE_CALL(); 1976 int rc = NO_ERROR; 1977 int32_t request_id; 1978 CameraMetadata meta; 1979 1980 pthread_mutex_lock(&mMutex); 1981 1982 rc = validateCaptureRequest(request); 1983 if (rc != NO_ERROR) { 1984 ALOGE("%s: incoming request is not valid", __func__); 1985 pthread_mutex_unlock(&mMutex); 1986 return rc; 1987 } 1988 1989 meta = request->settings; 1990 1991 // For first capture request, send capture intent, and 1992 // stream on all streams 1993 if (mFirstRequest) { 1994 1995 /* get eis information for stream configuration */ 1996 cam_is_type_t is_type; 1997 char is_type_value[PROPERTY_VALUE_MAX]; 1998 property_get("camera.is_type", is_type_value, "0"); 1999 is_type = static_cast<cam_is_type_t>(atoi(is_type_value)); 2000 2001 if (meta.exists(ANDROID_CONTROL_CAPTURE_INTENT)) { 2002 int32_t hal_version = CAM_HAL_V3; 2003 uint8_t captureIntent = 2004 meta.find(ANDROID_CONTROL_CAPTURE_INTENT).data.u8[0]; 2005 mCaptureIntent = captureIntent; 2006 memset(mParameters, 0, sizeof(parm_buffer_t)); 2007 AddSetParmEntryToBatch(mParameters, CAM_INTF_PARM_HAL_VERSION, 2008 sizeof(hal_version), &hal_version); 2009 AddSetParmEntryToBatch(mParameters, CAM_INTF_META_CAPTURE_INTENT, 2010 sizeof(captureIntent), &captureIntent); 2011 } 2012 2013 //If EIS is enabled, turn it on for video 2014 //for camera use case, front camcorder and 4k video, no eis 2015 bool setEis = mEisEnable && (gCamCapability[mCameraId]->position == CAM_POSITION_BACK && 2016 (mCaptureIntent == CAMERA3_TEMPLATE_VIDEO_RECORD || 2017 mCaptureIntent == CAMERA3_TEMPLATE_VIDEO_SNAPSHOT)); 2018 int32_t vsMode; 2019 vsMode = (setEis)? DIS_ENABLE: DIS_DISABLE; 2020 rc = AddSetParmEntryToBatch(mParameters, 2021 CAM_INTF_PARM_DIS_ENABLE, 2022 sizeof(vsMode), &vsMode); 2023 2024 //IS type will be 0 unless EIS is supported. If EIS is supported 2025 //it could either be 1 or 4 depending on the stream and video size 2026 if (setEis){ 2027 if (m_bIs4KVideo) { 2028 is_type = IS_TYPE_DIS; 2029 } else { 2030 is_type = IS_TYPE_EIS_2_0; 2031 } 2032 } 2033 2034 for (size_t i = 0; i < request->num_output_buffers; i++) { 2035 const camera3_stream_buffer_t& output = request->output_buffers[i]; 2036 QCamera3Channel *channel = (QCamera3Channel *)output.stream->priv; 2037 /*for livesnapshot stream is_type will be DIS*/ 2038 if (setEis && output.stream->format == HAL_PIXEL_FORMAT_BLOB) { 2039 rc = channel->registerBuffer(output.buffer, 2040 IS_TYPE_DIS, mCaptureIntent); 2041 } else { 2042 rc = channel->registerBuffer(output.buffer, 2043 is_type, mCaptureIntent); 2044 } 2045 if (rc < 0) { 2046 ALOGE("%s: registerBuffer failed", 2047 __func__); 2048 pthread_mutex_unlock(&mMutex); 2049 return -ENODEV; 2050 } 2051 } 2052 2053 /*set the capture intent, hal version and dis enable parameters to the backend*/ 2054 mCameraHandle->ops->set_parms(mCameraHandle->camera_handle, 2055 mParameters); 2056 2057 2058 //First initialize all streams 2059 for (List<stream_info_t *>::iterator it = mStreamInfo.begin(); 2060 it != mStreamInfo.end(); it++) { 2061 QCamera3Channel *channel = (QCamera3Channel *)(*it)->stream->priv; 2062 if (setEis && (*it)->stream->format == HAL_PIXEL_FORMAT_BLOB) { 2063 rc = channel->initialize(IS_TYPE_DIS, mCaptureIntent); 2064 } else { 2065 rc = channel->initialize(is_type, mCaptureIntent); 2066 } 2067 if (NO_ERROR != rc) { 2068 ALOGE("%s : Channel initialization failed %d", __func__, rc); 2069 pthread_mutex_unlock(&mMutex); 2070 return rc; 2071 } 2072 } 2073 2074 if (mRawDumpChannel) { 2075 rc = mRawDumpChannel->initialize(is_type, mCaptureIntent); 2076 if (rc != NO_ERROR) { 2077 ALOGE("%s: Error: Raw Dump Channel init failed", __func__); 2078 pthread_mutex_unlock(&mMutex); 2079 return rc; 2080 } 2081 } 2082 if (mSupportChannel) { 2083 rc = mSupportChannel->initialize(is_type, mCaptureIntent); 2084 if (rc < 0) { 2085 ALOGE("%s: Support channel initialization failed", __func__); 2086 pthread_mutex_unlock(&mMutex); 2087 return rc; 2088 } 2089 } 2090 2091 //Then start them. 2092 CDBG_HIGH("%s: Start META Channel", __func__); 2093 rc = mMetadataChannel->start(); 2094 if (rc < 0) { 2095 ALOGE("%s: META channel start failed", __func__); 2096 pthread_mutex_unlock(&mMutex); 2097 return rc; 2098 } 2099 2100 if (mSupportChannel) { 2101 rc = mSupportChannel->start(); 2102 if (rc < 0) { 2103 ALOGE("%s: Support channel start failed", __func__); 2104 mMetadataChannel->stop(); 2105 pthread_mutex_unlock(&mMutex); 2106 return rc; 2107 } 2108 } 2109 for (List<stream_info_t *>::iterator it = mStreamInfo.begin(); 2110 it != mStreamInfo.end(); it++) { 2111 QCamera3Channel *channel = (QCamera3Channel *)(*it)->stream->priv; 2112 CDBG_HIGH("%s: Start Regular Channel mask=%d", __func__, channel->getStreamTypeMask()); 2113 rc = channel->start(); 2114 if (rc < 0) { 2115 ALOGE("%s: channel start failed", __func__); 2116 pthread_mutex_unlock(&mMutex); 2117 return rc; 2118 } 2119 } 2120 2121 if (mRawDumpChannel) { 2122 CDBG("%s: Starting raw dump stream",__func__); 2123 rc = mRawDumpChannel->start(); 2124 if (rc != NO_ERROR) { 2125 ALOGE("%s: Error Starting Raw Dump Channel", __func__); 2126 for (List<stream_info_t *>::iterator it = mStreamInfo.begin(); 2127 it != mStreamInfo.end(); it++) { 2128 QCamera3Channel *channel = 2129 (QCamera3Channel *)(*it)->stream->priv; 2130 ALOGE("%s: Stopping Regular Channel mask=%d", __func__, 2131 channel->getStreamTypeMask()); 2132 channel->stop(); 2133 } 2134 if (mSupportChannel) 2135 mSupportChannel->stop(); 2136 mMetadataChannel->stop(); 2137 pthread_mutex_unlock(&mMutex); 2138 return rc; 2139 } 2140 } 2141 mWokenUpByDaemon = false; 2142 mPendingRequest = 0; 2143 } 2144 2145 uint32_t frameNumber = request->frame_number; 2146 cam_stream_ID_t streamID; 2147 2148 if (meta.exists(ANDROID_REQUEST_ID)) { 2149 request_id = meta.find(ANDROID_REQUEST_ID).data.i32[0]; 2150 mCurrentRequestId = request_id; 2151 CDBG("%s: Received request with id: %d",__func__, request_id); 2152 } else if (mFirstRequest || mCurrentRequestId == -1){ 2153 ALOGE("%s: Unable to find request id field, \ 2154 & no previous id available", __func__); 2155 return NAME_NOT_FOUND; 2156 } else { 2157 CDBG("%s: Re-using old request id", __func__); 2158 request_id = mCurrentRequestId; 2159 } 2160 2161 CDBG("%s: %d, num_output_buffers = %d input_buffer = %p frame_number = %d", 2162 __func__, __LINE__, 2163 request->num_output_buffers, 2164 request->input_buffer, 2165 frameNumber); 2166 // Acquire all request buffers first 2167 streamID.num_streams = 0; 2168 int blob_request = 0; 2169 uint32_t snapshotStreamId = 0; 2170 for (size_t i = 0; i < request->num_output_buffers; i++) { 2171 const camera3_stream_buffer_t& output = request->output_buffers[i]; 2172 QCamera3Channel *channel = (QCamera3Channel *)output.stream->priv; 2173 sp<Fence> acquireFence = new Fence(output.acquire_fence); 2174 2175 if (output.stream->format == HAL_PIXEL_FORMAT_BLOB) { 2176 //Call function to store local copy of jpeg data for encode params. 2177 blob_request = 1; 2178 snapshotStreamId = channel->getStreamID(channel->getStreamTypeMask()); 2179 } 2180 2181 rc = acquireFence->wait(Fence::TIMEOUT_NEVER); 2182 if (rc != OK) { 2183 ALOGE("%s: fence wait failed %d", __func__, rc); 2184 pthread_mutex_unlock(&mMutex); 2185 return rc; 2186 } 2187 2188 streamID.streamID[streamID.num_streams] = 2189 channel->getStreamID(channel->getStreamTypeMask()); 2190 streamID.num_streams++; 2191 2192 2193 } 2194 2195 if (blob_request && mRawDumpChannel) { 2196 CDBG("%s: Trigger Raw based on blob request if Raw dump is enabled", __func__); 2197 streamID.streamID[streamID.num_streams] = 2198 mRawDumpChannel->getStreamID(mRawDumpChannel->getStreamTypeMask()); 2199 streamID.num_streams++; 2200 } 2201 2202 if(request->input_buffer == NULL) { 2203 rc = setFrameParameters(request, streamID, snapshotStreamId); 2204 if (rc < 0) { 2205 ALOGE("%s: fail to set frame parameters", __func__); 2206 pthread_mutex_unlock(&mMutex); 2207 return rc; 2208 } 2209 } else { 2210 sp<Fence> acquireFence = new Fence(request->input_buffer->acquire_fence); 2211 2212 rc = acquireFence->wait(Fence::TIMEOUT_NEVER); 2213 if (rc != OK) { 2214 ALOGE("%s: input buffer fence wait failed %d", __func__, rc); 2215 pthread_mutex_unlock(&mMutex); 2216 return rc; 2217 } 2218 } 2219 2220 /* Update pending request list and pending buffers map */ 2221 PendingRequestInfo pendingRequest; 2222 pendingRequest.frame_number = frameNumber; 2223 pendingRequest.num_buffers = request->num_output_buffers; 2224 pendingRequest.request_id = request_id; 2225 pendingRequest.blob_request = blob_request; 2226 pendingRequest.bUrgentReceived = 0; 2227 2228 pendingRequest.input_buffer = request->input_buffer; 2229 pendingRequest.settings = request->settings; 2230 pendingRequest.pipeline_depth = 0; 2231 pendingRequest.partial_result_cnt = 0; 2232 extractJpegMetadata(pendingRequest.jpegMetadata, request); 2233 2234 //extract capture intent 2235 if (meta.exists(ANDROID_CONTROL_CAPTURE_INTENT)) { 2236 mCaptureIntent = 2237 meta.find(ANDROID_CONTROL_CAPTURE_INTENT).data.u8[0]; 2238 } 2239 pendingRequest.capture_intent = mCaptureIntent; 2240 2241 for (size_t i = 0; i < request->num_output_buffers; i++) { 2242 RequestedBufferInfo requestedBuf; 2243 requestedBuf.stream = request->output_buffers[i].stream; 2244 requestedBuf.buffer = NULL; 2245 pendingRequest.buffers.push_back(requestedBuf); 2246 2247 // Add to buffer handle the pending buffers list 2248 PendingBufferInfo bufferInfo; 2249 bufferInfo.frame_number = frameNumber; 2250 bufferInfo.buffer = request->output_buffers[i].buffer; 2251 bufferInfo.stream = request->output_buffers[i].stream; 2252 mPendingBuffersMap.mPendingBufferList.push_back(bufferInfo); 2253 mPendingBuffersMap.num_buffers++; 2254 CDBG("%s: frame = %d, buffer = %p, stream = %p, stream format = %d", 2255 __func__, frameNumber, bufferInfo.buffer, bufferInfo.stream, 2256 bufferInfo.stream->format); 2257 } 2258 CDBG("%s: mPendingBuffersMap.num_buffers = %d", 2259 __func__, mPendingBuffersMap.num_buffers); 2260 2261 mPendingRequestsList.push_back(pendingRequest); 2262 2263 if(mFlush) { 2264 pthread_mutex_unlock(&mMutex); 2265 return NO_ERROR; 2266 } 2267 2268 // Notify metadata channel we receive a request 2269 mMetadataChannel->request(NULL, frameNumber); 2270 2271 // Call request on other streams 2272 for (size_t i = 0; i < request->num_output_buffers; i++) { 2273 const camera3_stream_buffer_t& output = request->output_buffers[i]; 2274 QCamera3Channel *channel = (QCamera3Channel *)output.stream->priv; 2275 2276 if (channel == NULL) { 2277 ALOGE("%s: invalid channel pointer for stream", __func__); 2278 continue; 2279 } 2280 2281 if (output.stream->format == HAL_PIXEL_FORMAT_BLOB) { 2282 QCamera3RegularChannel* inputChannel = NULL; 2283 if(request->input_buffer != NULL){ 2284 2285 //Try to get the internal format 2286 inputChannel = (QCamera3RegularChannel*) 2287 request->input_buffer->stream->priv; 2288 if(inputChannel == NULL ){ 2289 ALOGE("%s: failed to get input channel handle", __func__); 2290 pthread_mutex_unlock(&mMutex); 2291 return NO_INIT; 2292 } 2293 metadata_buffer_t reproc_meta; 2294 rc = setReprocParameters(request, &reproc_meta, snapshotStreamId); 2295 if (NO_ERROR == rc) { 2296 rc = channel->request(output.buffer, frameNumber, 2297 request->input_buffer, &reproc_meta); 2298 if (rc < 0) { 2299 ALOGE("%s: Fail to request on picture channel", __func__); 2300 pthread_mutex_unlock(&mMutex); 2301 return rc; 2302 } 2303 } else { 2304 ALOGE("%s: fail to set reproc parameters", __func__); 2305 pthread_mutex_unlock(&mMutex); 2306 return rc; 2307 } 2308 } else 2309 rc = channel->request(output.buffer, frameNumber, 2310 NULL, mParameters); 2311 } else { 2312 CDBG("%s: %d, request with buffer %p, frame_number %d", __func__, 2313 __LINE__, output.buffer, frameNumber); 2314 rc = channel->request(output.buffer, frameNumber); 2315 } 2316 if (rc < 0) 2317 ALOGE("%s: request failed", __func__); 2318 } 2319 2320 if(request->input_buffer == NULL) { 2321 /*set the parameters to backend*/ 2322 mCameraHandle->ops->set_parms(mCameraHandle->camera_handle, mParameters); 2323 } 2324 2325 mFirstRequest = false; 2326 // Added a timed condition wait 2327 struct timespec ts; 2328 uint8_t isValidTimeout = 1; 2329 rc = clock_gettime(CLOCK_REALTIME, &ts); 2330 if (rc < 0) { 2331 isValidTimeout = 0; 2332 ALOGE("%s: Error reading the real time clock!!", __func__); 2333 } 2334 else { 2335 // Make timeout as 5 sec for request to be honored 2336 ts.tv_sec += 5; 2337 } 2338 //Block on conditional variable 2339 2340 mPendingRequest++; 2341 while (mPendingRequest >= MIN_INFLIGHT_REQUESTS) { 2342 if (!isValidTimeout) { 2343 CDBG("%s: Blocking on conditional wait", __func__); 2344 pthread_cond_wait(&mRequestCond, &mMutex); 2345 } 2346 else { 2347 CDBG("%s: Blocking on timed conditional wait", __func__); 2348 rc = pthread_cond_timedwait(&mRequestCond, &mMutex, &ts); 2349 if (rc == ETIMEDOUT) { 2350 rc = -ENODEV; 2351 ALOGE("%s: Unblocked on timeout!!!!", __func__); 2352 break; 2353 } 2354 } 2355 CDBG("%s: Unblocked", __func__); 2356 if (mWokenUpByDaemon) { 2357 mWokenUpByDaemon = false; 2358 if (mPendingRequest < MAX_INFLIGHT_REQUESTS) 2359 break; 2360 } 2361 } 2362 pthread_mutex_unlock(&mMutex); 2363 2364 return rc; 2365 } 2366 2367 /*=========================================================================== 2368 * FUNCTION : dump 2369 * 2370 * DESCRIPTION: 2371 * 2372 * PARAMETERS : 2373 * 2374 * 2375 * RETURN : 2376 *==========================================================================*/ 2377 void QCamera3HardwareInterface::dump(int fd) 2378 { 2379 pthread_mutex_lock(&mMutex); 2380 dprintf(fd, "\n Camera HAL3 information Begin \n"); 2381 2382 dprintf(fd, "\nNumber of pending requests: %d \n", 2383 mPendingRequestsList.size()); 2384 dprintf(fd, "-------+-------------------+-------------+----------+---------------------\n"); 2385 dprintf(fd, " Frame | Number of Buffers | Req Id: | Blob Req | Input buffer present\n"); 2386 dprintf(fd, "-------+-------------------+-------------+----------+---------------------\n"); 2387 for(List<PendingRequestInfo>::iterator i = mPendingRequestsList.begin(); 2388 i != mPendingRequestsList.end(); i++) { 2389 dprintf(fd, " %5d | %17d | %11d | %8d | %p \n", 2390 i->frame_number, i->num_buffers, i->request_id, i->blob_request, 2391 i->input_buffer); 2392 } 2393 dprintf(fd, "\nPending buffer map: Number of buffers: %d\n", 2394 mPendingBuffersMap.num_buffers); 2395 dprintf(fd, "-------+-------------\n"); 2396 dprintf(fd, " Frame | Stream type \n"); 2397 dprintf(fd, "-------+-------------\n"); 2398 for(List<PendingBufferInfo>::iterator i = 2399 mPendingBuffersMap.mPendingBufferList.begin(); 2400 i != mPendingBuffersMap.mPendingBufferList.end(); i++) { 2401 dprintf(fd, " %5d | %11d \n", 2402 i->frame_number, i->stream->stream_type); 2403 } 2404 dprintf(fd, "-------+-------------\n"); 2405 2406 dprintf(fd, "\nPending frame drop list: %d\n", 2407 mPendingFrameDropList.size()); 2408 dprintf(fd, "-------+-----------\n"); 2409 dprintf(fd, " Frame | Stream ID \n"); 2410 dprintf(fd, "-------+-----------\n"); 2411 for(List<PendingFrameDropInfo>::iterator i = mPendingFrameDropList.begin(); 2412 i != mPendingFrameDropList.end(); i++) { 2413 dprintf(fd, " %5d | %9d \n", 2414 i->frame_number, i->stream_ID); 2415 } 2416 dprintf(fd, "-------+-----------\n"); 2417 2418 dprintf(fd, "\n Camera HAL3 information End \n"); 2419 pthread_mutex_unlock(&mMutex); 2420 return; 2421 } 2422 2423 /*=========================================================================== 2424 * FUNCTION : flush 2425 * 2426 * DESCRIPTION: 2427 * 2428 * PARAMETERS : 2429 * 2430 * 2431 * RETURN : 2432 *==========================================================================*/ 2433 int QCamera3HardwareInterface::flush() 2434 { 2435 ATRACE_CALL(); 2436 unsigned int frameNum = 0; 2437 camera3_notify_msg_t notify_msg; 2438 camera3_capture_result_t result; 2439 camera3_stream_buffer_t *pStream_Buf = NULL; 2440 FlushMap flushMap; 2441 2442 CDBG("%s: Unblocking Process Capture Request", __func__); 2443 pthread_mutex_lock(&mMutex); 2444 mFlush = true; 2445 pthread_mutex_unlock(&mMutex); 2446 2447 memset(&result, 0, sizeof(camera3_capture_result_t)); 2448 2449 // Stop the Streams/Channels 2450 for (List<stream_info_t *>::iterator it = mStreamInfo.begin(); 2451 it != mStreamInfo.end(); it++) { 2452 QCamera3Channel *channel = (QCamera3Channel *)(*it)->stream->priv; 2453 channel->stop(); 2454 (*it)->status = INVALID; 2455 } 2456 2457 if (mSupportChannel) { 2458 mSupportChannel->stop(); 2459 } 2460 if (mRawDumpChannel) { 2461 mRawDumpChannel->stop(); 2462 } 2463 if (mMetadataChannel) { 2464 /* If content of mStreamInfo is not 0, there is metadata stream */ 2465 mMetadataChannel->stop(); 2466 } 2467 2468 // Mutex Lock 2469 pthread_mutex_lock(&mMutex); 2470 2471 // Unblock process_capture_request 2472 mPendingRequest = 0; 2473 pthread_cond_signal(&mRequestCond); 2474 2475 List<PendingRequestInfo>::iterator i = mPendingRequestsList.begin(); 2476 frameNum = i->frame_number; 2477 CDBG("%s: Oldest frame num on mPendingRequestsList = %d", 2478 __func__, frameNum); 2479 2480 // Go through the pending buffers and group them depending 2481 // on frame number 2482 for (List<PendingBufferInfo>::iterator k = 2483 mPendingBuffersMap.mPendingBufferList.begin(); 2484 k != mPendingBuffersMap.mPendingBufferList.end();) { 2485 2486 if (k->frame_number < frameNum) { 2487 ssize_t idx = flushMap.indexOfKey(k->frame_number); 2488 if (idx == NAME_NOT_FOUND) { 2489 Vector<PendingBufferInfo> pending; 2490 pending.add(*k); 2491 flushMap.add(k->frame_number, pending); 2492 } else { 2493 Vector<PendingBufferInfo> &pending = 2494 flushMap.editValueFor(k->frame_number); 2495 pending.add(*k); 2496 } 2497 2498 mPendingBuffersMap.num_buffers--; 2499 k = mPendingBuffersMap.mPendingBufferList.erase(k); 2500 } else { 2501 k++; 2502 } 2503 } 2504 2505 for (size_t i = 0; i < flushMap.size(); i++) { 2506 uint32_t frame_number = flushMap.keyAt(i); 2507 const Vector<PendingBufferInfo> &pending = flushMap.valueAt(i); 2508 2509 // Send Error notify to frameworks for each buffer for which 2510 // metadata buffer is already sent 2511 CDBG("%s: Sending ERROR BUFFER for frame %d number of buffer %d", 2512 __func__, frame_number, pending.size()); 2513 2514 pStream_Buf = new camera3_stream_buffer_t[pending.size()]; 2515 if (NULL == pStream_Buf) { 2516 ALOGE("%s: No memory for pending buffers array", __func__); 2517 pthread_mutex_unlock(&mMutex); 2518 return NO_MEMORY; 2519 } 2520 2521 for (size_t j = 0; j < pending.size(); j++) { 2522 const PendingBufferInfo &info = pending.itemAt(j); 2523 notify_msg.type = CAMERA3_MSG_ERROR; 2524 notify_msg.message.error.error_code = CAMERA3_MSG_ERROR_BUFFER; 2525 notify_msg.message.error.error_stream = info.stream; 2526 notify_msg.message.error.frame_number = frame_number; 2527 pStream_Buf[j].acquire_fence = -1; 2528 pStream_Buf[j].release_fence = -1; 2529 pStream_Buf[j].buffer = info.buffer; 2530 pStream_Buf[j].status = CAMERA3_BUFFER_STATUS_ERROR; 2531 pStream_Buf[j].stream = info.stream; 2532 mCallbackOps->notify(mCallbackOps, ¬ify_msg); 2533 CDBG("%s: notify frame_number = %d stream %p", __func__, 2534 frame_number, info.stream); 2535 } 2536 2537 result.result = NULL; 2538 result.frame_number = frame_number; 2539 result.num_output_buffers = pending.size(); 2540 result.output_buffers = pStream_Buf; 2541 mCallbackOps->process_capture_result(mCallbackOps, &result); 2542 2543 delete [] pStream_Buf; 2544 } 2545 2546 CDBG("%s:Sending ERROR REQUEST for all pending requests", __func__); 2547 2548 flushMap.clear(); 2549 for (List<PendingBufferInfo>::iterator k = 2550 mPendingBuffersMap.mPendingBufferList.begin(); 2551 k != mPendingBuffersMap.mPendingBufferList.end();) { 2552 ssize_t idx = flushMap.indexOfKey(k->frame_number); 2553 if (idx == NAME_NOT_FOUND) { 2554 Vector<PendingBufferInfo> pending; 2555 pending.add(*k); 2556 flushMap.add(k->frame_number, pending); 2557 } else { 2558 Vector<PendingBufferInfo> &pending = 2559 flushMap.editValueFor(k->frame_number); 2560 pending.add(*k); 2561 } 2562 2563 mPendingBuffersMap.num_buffers--; 2564 k = mPendingBuffersMap.mPendingBufferList.erase(k); 2565 } 2566 2567 // Go through the pending requests info and send error request to framework 2568 for (size_t i = 0; i < flushMap.size(); i++) { 2569 uint32_t frame_number = flushMap.keyAt(i); 2570 const Vector<PendingBufferInfo> &pending = flushMap.valueAt(i); 2571 CDBG("%s:Sending ERROR REQUEST for frame %d", 2572 __func__, frame_number); 2573 2574 // Send shutter notify to frameworks 2575 notify_msg.type = CAMERA3_MSG_ERROR; 2576 notify_msg.message.error.error_code = CAMERA3_MSG_ERROR_REQUEST; 2577 notify_msg.message.error.error_stream = NULL; 2578 notify_msg.message.error.frame_number = frame_number; 2579 mCallbackOps->notify(mCallbackOps, ¬ify_msg); 2580 2581 pStream_Buf = new camera3_stream_buffer_t[pending.size()]; 2582 if (NULL == pStream_Buf) { 2583 ALOGE("%s: No memory for pending buffers array", __func__); 2584 pthread_mutex_unlock(&mMutex); 2585 return NO_MEMORY; 2586 } 2587 2588 for (size_t j = 0; j < pending.size(); j++) { 2589 const PendingBufferInfo &info = pending.itemAt(j); 2590 pStream_Buf[j].acquire_fence = -1; 2591 pStream_Buf[j].release_fence = -1; 2592 pStream_Buf[j].buffer = info.buffer; 2593 pStream_Buf[j].status = CAMERA3_BUFFER_STATUS_ERROR; 2594 pStream_Buf[j].stream = info.stream; 2595 } 2596 2597 result.num_output_buffers = pending.size(); 2598 result.output_buffers = pStream_Buf; 2599 result.result = NULL; 2600 result.frame_number = frame_number; 2601 mCallbackOps->process_capture_result(mCallbackOps, &result); 2602 delete [] pStream_Buf; 2603 } 2604 2605 /* Reset pending buffer list and requests list */ 2606 mPendingRequestsList.clear(); 2607 /* Reset pending frame Drop list and requests list */ 2608 mPendingFrameDropList.clear(); 2609 2610 flushMap.clear(); 2611 mPendingBuffersMap.num_buffers = 0; 2612 mPendingBuffersMap.mPendingBufferList.clear(); 2613 mPendingReprocessResultList.clear(); 2614 CDBG("%s: Cleared all the pending buffers ", __func__); 2615 2616 mFlush = false; 2617 2618 // Start the Streams/Channels 2619 int rc = NO_ERROR; 2620 if (mMetadataChannel) { 2621 /* If content of mStreamInfo is not 0, there is metadata stream */ 2622 rc = mMetadataChannel->start(); 2623 if (rc < 0) { 2624 ALOGE("%s: META channel start failed", __func__); 2625 pthread_mutex_unlock(&mMutex); 2626 return rc; 2627 } 2628 } 2629 for (List<stream_info_t *>::iterator it = mStreamInfo.begin(); 2630 it != mStreamInfo.end(); it++) { 2631 QCamera3Channel *channel = (QCamera3Channel *)(*it)->stream->priv; 2632 rc = channel->start(); 2633 if (rc < 0) { 2634 ALOGE("%s: channel start failed", __func__); 2635 pthread_mutex_unlock(&mMutex); 2636 return rc; 2637 } 2638 } 2639 if (mSupportChannel) { 2640 rc = mSupportChannel->start(); 2641 if (rc < 0) { 2642 ALOGE("%s: Support channel start failed", __func__); 2643 pthread_mutex_unlock(&mMutex); 2644 return rc; 2645 } 2646 } 2647 if (mRawDumpChannel) { 2648 rc = mRawDumpChannel->start(); 2649 if (rc < 0) { 2650 ALOGE("%s: RAW dump channel start failed", __func__); 2651 pthread_mutex_unlock(&mMutex); 2652 return rc; 2653 } 2654 } 2655 2656 pthread_mutex_unlock(&mMutex); 2657 2658 return 0; 2659 } 2660 2661 /*=========================================================================== 2662 * FUNCTION : captureResultCb 2663 * 2664 * DESCRIPTION: Callback handler for all capture result 2665 * (streams, as well as metadata) 2666 * 2667 * PARAMETERS : 2668 * @metadata : metadata information 2669 * @buffer : actual gralloc buffer to be returned to frameworks. 2670 * NULL if metadata. 2671 * 2672 * RETURN : NONE 2673 *==========================================================================*/ 2674 void QCamera3HardwareInterface::captureResultCb(mm_camera_super_buf_t *metadata_buf, 2675 camera3_stream_buffer_t *buffer, uint32_t frame_number) 2676 { 2677 pthread_mutex_lock(&mMutex); 2678 2679 /* Assume flush() is called before any reprocessing. Send 2680 * notify and result immediately upon receipt of any callback*/ 2681 if (mLoopBackResult) { 2682 /* Send notify */ 2683 camera3_notify_msg_t notify_msg; 2684 notify_msg.type = CAMERA3_MSG_SHUTTER; 2685 notify_msg.message.shutter.frame_number = mLoopBackResult->frame_number; 2686 notify_msg.message.shutter.timestamp = mLoopBackTimestamp; 2687 mCallbackOps->notify(mCallbackOps, ¬ify_msg); 2688 2689 /* Send capture result */ 2690 mCallbackOps->process_capture_result(mCallbackOps, mLoopBackResult); 2691 free_camera_metadata((camera_metadata_t *)mLoopBackResult->result); 2692 free(mLoopBackResult); 2693 mLoopBackResult = NULL; 2694 } 2695 2696 if (metadata_buf) 2697 handleMetadataWithLock(metadata_buf); 2698 else 2699 handleBufferWithLock(buffer, frame_number); 2700 pthread_mutex_unlock(&mMutex); 2701 return; 2702 } 2703 2704 /*=========================================================================== 2705 * FUNCTION : translateFromHalMetadata 2706 * 2707 * DESCRIPTION: 2708 * 2709 * PARAMETERS : 2710 * @metadata : metadata information from callback 2711 * @timestamp: metadata buffer timestamp 2712 * @request_id: request id 2713 * @jpegMetadata: additional jpeg metadata 2714 * 2715 * RETURN : camera_metadata_t* 2716 * metadata in a format specified by fwk 2717 *==========================================================================*/ 2718 camera_metadata_t* 2719 QCamera3HardwareInterface::translateFromHalMetadata( 2720 metadata_buffer_t *metadata, 2721 nsecs_t timestamp, 2722 int32_t request_id, 2723 const CameraMetadata& jpegMetadata, 2724 uint8_t pipeline_depth, 2725 uint8_t capture_intent) 2726 { 2727 CameraMetadata camMetadata; 2728 camera_metadata_t* resultMetadata; 2729 2730 if (jpegMetadata.entryCount()) 2731 camMetadata.append(jpegMetadata); 2732 2733 camMetadata.update(ANDROID_SENSOR_TIMESTAMP, ×tamp, 1); 2734 camMetadata.update(ANDROID_REQUEST_ID, &request_id, 1); 2735 camMetadata.update(ANDROID_REQUEST_PIPELINE_DEPTH, &pipeline_depth, 1); 2736 camMetadata.update(ANDROID_CONTROL_CAPTURE_INTENT, &capture_intent, 1); 2737 2738 if (IS_META_AVAILABLE(CAM_INTF_META_FRAME_NUMBER, metadata)) { 2739 int64_t frame_number = *(uint32_t *) POINTER_OF_META(CAM_INTF_META_FRAME_NUMBER, metadata); 2740 camMetadata.update(ANDROID_SYNC_FRAME_NUMBER, &frame_number, 1); 2741 } 2742 2743 2744 if (IS_META_AVAILABLE(CAM_INTF_PARM_FPS_RANGE, metadata)) { 2745 int32_t fps_range[2]; 2746 cam_fps_range_t * float_range = 2747 (cam_fps_range_t *)POINTER_OF_PARAM(CAM_INTF_PARM_FPS_RANGE, metadata); 2748 fps_range[0] = (int32_t)float_range->min_fps; 2749 fps_range[1] = (int32_t)float_range->max_fps; 2750 camMetadata.update(ANDROID_CONTROL_AE_TARGET_FPS_RANGE, 2751 fps_range, 2); 2752 CDBG("%s: urgent Metadata : ANDROID_CONTROL_AE_TARGET_FPS_RANGE [%d, %d]", 2753 __func__, fps_range[0], fps_range[1]); 2754 } 2755 2756 2757 if (IS_META_AVAILABLE(CAM_INTF_PARM_EXPOSURE_COMPENSATION, metadata)) { 2758 int32_t *expCompensation = 2759 (int32_t *)POINTER_OF_META(CAM_INTF_PARM_EXPOSURE_COMPENSATION, metadata); 2760 camMetadata.update(ANDROID_CONTROL_AE_EXPOSURE_COMPENSATION, 2761 expCompensation, 1); 2762 } 2763 2764 if (IS_META_AVAILABLE(CAM_INTF_PARM_BESTSHOT_MODE, metadata)) { 2765 uint8_t sceneMode = 2766 *((uint32_t *)POINTER_OF_META(CAM_INTF_PARM_BESTSHOT_MODE, metadata)); 2767 uint8_t fwkSceneMode = 2768 (uint8_t)lookupFwkName(SCENE_MODES_MAP, 2769 sizeof(SCENE_MODES_MAP)/ 2770 sizeof(SCENE_MODES_MAP[0]), sceneMode); 2771 camMetadata.update(ANDROID_CONTROL_SCENE_MODE, 2772 &fwkSceneMode, 1); 2773 } 2774 2775 if (IS_META_AVAILABLE(CAM_INTF_PARM_AEC_LOCK, metadata)) { 2776 uint8_t ae_lock = 2777 *((uint32_t *)POINTER_OF_META(CAM_INTF_PARM_AEC_LOCK, metadata)); 2778 camMetadata.update(ANDROID_CONTROL_AE_LOCK, 2779 &ae_lock, 1); 2780 } 2781 2782 if (IS_META_AVAILABLE(CAM_INTF_PARM_AWB_LOCK, metadata)) { 2783 uint8_t awb_lock = 2784 *((uint32_t *)POINTER_OF_META(CAM_INTF_PARM_AWB_LOCK, metadata)); 2785 camMetadata.update(ANDROID_CONTROL_AWB_LOCK, &awb_lock, 1); 2786 } 2787 2788 if (IS_META_AVAILABLE(CAM_INTF_META_FACE_DETECTION, metadata)){ 2789 cam_face_detection_data_t *faceDetectionInfo = 2790 (cam_face_detection_data_t *)POINTER_OF_META(CAM_INTF_META_FACE_DETECTION, metadata); 2791 uint8_t numFaces = faceDetectionInfo->num_faces_detected; 2792 int32_t faceIds[MAX_ROI]; 2793 uint8_t faceScores[MAX_ROI]; 2794 int32_t faceRectangles[MAX_ROI * 4]; 2795 int32_t faceLandmarks[MAX_ROI * 6]; 2796 int j = 0, k = 0; 2797 for (int i = 0; i < numFaces; i++) { 2798 faceIds[i] = faceDetectionInfo->faces[i].face_id; 2799 faceScores[i] = faceDetectionInfo->faces[i].score; 2800 convertToRegions(faceDetectionInfo->faces[i].face_boundary, 2801 faceRectangles+j, -1); 2802 convertLandmarks(faceDetectionInfo->faces[i], faceLandmarks+k); 2803 j+= 4; 2804 k+= 6; 2805 } 2806 if (numFaces <= 0) { 2807 memset(faceIds, 0, sizeof(int32_t) * MAX_ROI); 2808 memset(faceScores, 0, sizeof(uint8_t) * MAX_ROI); 2809 memset(faceRectangles, 0, sizeof(int32_t) * MAX_ROI * 4); 2810 memset(faceLandmarks, 0, sizeof(int32_t) * MAX_ROI * 6); 2811 } 2812 camMetadata.update(ANDROID_STATISTICS_FACE_IDS, faceIds, numFaces); 2813 camMetadata.update(ANDROID_STATISTICS_FACE_SCORES, faceScores, numFaces); 2814 camMetadata.update(ANDROID_STATISTICS_FACE_RECTANGLES, 2815 faceRectangles, numFaces*4); 2816 camMetadata.update(ANDROID_STATISTICS_FACE_LANDMARKS, 2817 faceLandmarks, numFaces*6); 2818 } 2819 if (IS_META_AVAILABLE(CAM_INTF_META_COLOR_CORRECT_MODE, metadata)){ 2820 uint8_t *color_correct_mode = 2821 (uint8_t *)POINTER_OF_META(CAM_INTF_META_COLOR_CORRECT_MODE, metadata); 2822 camMetadata.update(ANDROID_COLOR_CORRECTION_MODE, color_correct_mode, 1); 2823 } 2824 if (IS_META_AVAILABLE(CAM_INTF_META_EDGE_MODE, metadata)) { 2825 cam_edge_application_t *edgeApplication = 2826 (cam_edge_application_t *)POINTER_OF_META(CAM_INTF_META_EDGE_MODE, metadata); 2827 uint8_t edgeStrength = (uint8_t)edgeApplication->sharpness; 2828 camMetadata.update(ANDROID_EDGE_MODE, &(edgeApplication->edge_mode), 1); 2829 camMetadata.update(ANDROID_EDGE_STRENGTH, &edgeStrength, 1); 2830 } 2831 if (IS_META_AVAILABLE(CAM_INTF_META_FLASH_POWER, metadata)) { 2832 uint8_t *flashPower = 2833 (uint8_t *)POINTER_OF_META(CAM_INTF_META_FLASH_POWER, metadata); 2834 camMetadata.update(ANDROID_FLASH_FIRING_POWER, flashPower, 1); 2835 } 2836 if (IS_META_AVAILABLE(CAM_INTF_META_FLASH_FIRING_TIME, metadata)) { 2837 int64_t *flashFiringTime = 2838 (int64_t *)POINTER_OF_META(CAM_INTF_META_FLASH_FIRING_TIME, metadata); 2839 camMetadata.update(ANDROID_FLASH_FIRING_TIME, flashFiringTime, 1); 2840 } 2841 if (IS_META_AVAILABLE(CAM_INTF_META_FLASH_STATE, metadata)) { 2842 uint8_t flashState = 2843 *((uint8_t *)POINTER_OF_META(CAM_INTF_META_FLASH_STATE, metadata)); 2844 if (!gCamCapability[mCameraId]->flash_available) { 2845 flashState = ANDROID_FLASH_STATE_UNAVAILABLE; 2846 } 2847 camMetadata.update(ANDROID_FLASH_STATE, &flashState, 1); 2848 } 2849 if (IS_META_AVAILABLE(CAM_INTF_META_FLASH_MODE, metadata)){ 2850 uint8_t flashMode = *((uint8_t*) 2851 POINTER_OF_META(CAM_INTF_META_FLASH_MODE, metadata)); 2852 uint8_t fwk_flashMode = lookupFwkName(FLASH_MODES_MAP, 2853 sizeof(FLASH_MODES_MAP), flashMode); 2854 camMetadata.update(ANDROID_FLASH_MODE, &fwk_flashMode, 1); 2855 } 2856 if (IS_META_AVAILABLE(CAM_INTF_META_HOTPIXEL_MODE, metadata)) { 2857 uint8_t *hotPixelMode = 2858 (uint8_t *)POINTER_OF_META(CAM_INTF_META_HOTPIXEL_MODE, metadata); 2859 camMetadata.update(ANDROID_HOT_PIXEL_MODE, hotPixelMode, 1); 2860 } 2861 if (IS_META_AVAILABLE(CAM_INTF_META_LENS_APERTURE, metadata)){ 2862 float *lensAperture = 2863 (float *)POINTER_OF_META(CAM_INTF_META_LENS_APERTURE, metadata); 2864 camMetadata.update(ANDROID_LENS_APERTURE , lensAperture, 1); 2865 } 2866 if (IS_META_AVAILABLE(CAM_INTF_META_LENS_FILTERDENSITY, metadata)) { 2867 float *filterDensity = 2868 (float *)POINTER_OF_META(CAM_INTF_META_LENS_FILTERDENSITY, metadata); 2869 camMetadata.update(ANDROID_LENS_FILTER_DENSITY , filterDensity, 1); 2870 } 2871 if (IS_META_AVAILABLE(CAM_INTF_META_LENS_FOCAL_LENGTH, metadata)){ 2872 float *focalLength = 2873 (float *)POINTER_OF_META(CAM_INTF_META_LENS_FOCAL_LENGTH, metadata); 2874 camMetadata.update(ANDROID_LENS_FOCAL_LENGTH, focalLength, 1); 2875 } 2876 2877 if (IS_META_AVAILABLE(CAM_INTF_META_LENS_OPT_STAB_MODE, metadata)) { 2878 uint8_t *opticalStab = 2879 (uint8_t *)POINTER_OF_META(CAM_INTF_META_LENS_OPT_STAB_MODE, metadata); 2880 camMetadata.update(ANDROID_LENS_OPTICAL_STABILIZATION_MODE ,opticalStab, 1); 2881 } 2882 if (IS_META_AVAILABLE(CAM_INTF_PARM_DIS_ENABLE, metadata)) { 2883 uint8_t *vsMode = 2884 (uint8_t *)POINTER_OF_META(CAM_INTF_PARM_DIS_ENABLE, metadata); 2885 camMetadata.update(ANDROID_CONTROL_VIDEO_STABILIZATION_MODE, vsMode, 1); 2886 } 2887 2888 if (IS_META_AVAILABLE(CAM_INTF_META_NOISE_REDUCTION_MODE, metadata)) { 2889 uint8_t *noiseRedMode = 2890 (uint8_t *)POINTER_OF_META(CAM_INTF_META_NOISE_REDUCTION_MODE, metadata); 2891 camMetadata.update(ANDROID_NOISE_REDUCTION_MODE , noiseRedMode, 1); 2892 } 2893 if (IS_META_AVAILABLE(CAM_INTF_META_NOISE_REDUCTION_STRENGTH, metadata)) { 2894 uint8_t *noiseRedStrength = 2895 (uint8_t *)POINTER_OF_META(CAM_INTF_META_NOISE_REDUCTION_STRENGTH, metadata); 2896 camMetadata.update(ANDROID_NOISE_REDUCTION_STRENGTH, noiseRedStrength, 1); 2897 } 2898 if (IS_META_AVAILABLE(CAM_INTF_META_SCALER_CROP_REGION, metadata)) { 2899 cam_crop_region_t *hScalerCropRegion =(cam_crop_region_t *) 2900 POINTER_OF_META(CAM_INTF_META_SCALER_CROP_REGION, metadata); 2901 int32_t scalerCropRegion[4]; 2902 scalerCropRegion[0] = hScalerCropRegion->left; 2903 scalerCropRegion[1] = hScalerCropRegion->top; 2904 scalerCropRegion[2] = hScalerCropRegion->width; 2905 scalerCropRegion[3] = hScalerCropRegion->height; 2906 camMetadata.update(ANDROID_SCALER_CROP_REGION, scalerCropRegion, 4); 2907 } 2908 if (IS_META_AVAILABLE(CAM_INTF_META_SENSOR_EXPOSURE_TIME, metadata)){ 2909 int64_t *sensorExpTime = 2910 (int64_t *)POINTER_OF_META(CAM_INTF_META_SENSOR_EXPOSURE_TIME, metadata); 2911 CDBG("%s: sensorExpTime = %lld", __func__, *sensorExpTime); 2912 camMetadata.update(ANDROID_SENSOR_EXPOSURE_TIME , sensorExpTime, 1); 2913 } 2914 if (IS_META_AVAILABLE(CAM_INTF_META_SENSOR_FRAME_DURATION, metadata)){ 2915 int64_t *sensorFameDuration = 2916 (int64_t *)POINTER_OF_META(CAM_INTF_META_SENSOR_FRAME_DURATION, metadata); 2917 CDBG("%s: sensorFameDuration = %lld", __func__, *sensorFameDuration); 2918 camMetadata.update(ANDROID_SENSOR_FRAME_DURATION, sensorFameDuration, 1); 2919 } 2920 if (IS_META_AVAILABLE(CAM_INTF_META_SENSOR_ROLLING_SHUTTER_SKEW, metadata)){ 2921 int64_t *sensorRollingShutterSkew = 2922 (int64_t *)POINTER_OF_META(CAM_INTF_META_SENSOR_ROLLING_SHUTTER_SKEW, 2923 metadata); 2924 CDBG("%s: sensorRollingShutterSkew = %lld", __func__, *sensorRollingShutterSkew); 2925 camMetadata.update(ANDROID_SENSOR_ROLLING_SHUTTER_SKEW, 2926 sensorRollingShutterSkew, 1); 2927 } 2928 2929 if (IS_META_AVAILABLE(CAM_INTF_META_SENSOR_SENSITIVITY, metadata)){ 2930 int32_t sensorSensitivity = 2931 *((int32_t *)POINTER_OF_META(CAM_INTF_META_SENSOR_SENSITIVITY, metadata)); 2932 CDBG("%s: sensorSensitivity = %d", __func__, sensorSensitivity); 2933 camMetadata.update(ANDROID_SENSOR_SENSITIVITY, &sensorSensitivity, 1); 2934 2935 //calculate the noise profile based on sensitivity 2936 double noise_profile_S = computeNoiseModelEntryS(sensorSensitivity); 2937 double noise_profile_O = computeNoiseModelEntryO(sensorSensitivity); 2938 double noise_profile[2 * gCamCapability[mCameraId]->num_color_channels]; 2939 for (int i = 0; i < 2 * gCamCapability[mCameraId]->num_color_channels; i +=2) { 2940 noise_profile[i] = noise_profile_S; 2941 noise_profile[i+1] = noise_profile_O; 2942 } 2943 CDBG("%s: noise model entry (S, O) is (%f, %f)", __func__, 2944 noise_profile_S, noise_profile_O); 2945 camMetadata.update( ANDROID_SENSOR_NOISE_PROFILE, noise_profile, 2946 2 * gCamCapability[mCameraId]->num_color_channels); 2947 } 2948 2949 2950 if (IS_META_AVAILABLE(CAM_INTF_META_SHADING_MODE, metadata)) { 2951 uint8_t *shadingMode = 2952 (uint8_t *)POINTER_OF_META(CAM_INTF_META_SHADING_MODE, metadata); 2953 camMetadata.update(ANDROID_SHADING_MODE, shadingMode, 1); 2954 } 2955 if (IS_META_AVAILABLE(CAM_INTF_META_STATS_FACEDETECT_MODE, metadata)) { 2956 uint8_t *faceDetectMode = 2957 (uint8_t *)POINTER_OF_META(CAM_INTF_META_STATS_FACEDETECT_MODE, metadata); 2958 uint8_t fwk_faceDetectMode = (uint8_t)lookupFwkName(FACEDETECT_MODES_MAP, 2959 sizeof(FACEDETECT_MODES_MAP)/sizeof(FACEDETECT_MODES_MAP[0]), *faceDetectMode); 2960 camMetadata.update(ANDROID_STATISTICS_FACE_DETECT_MODE, &fwk_faceDetectMode, 1); 2961 } 2962 if (IS_META_AVAILABLE(CAM_INTF_META_STATS_HISTOGRAM_MODE, metadata)) { 2963 uint8_t *histogramMode = 2964 (uint8_t *)POINTER_OF_META(CAM_INTF_META_STATS_HISTOGRAM_MODE, metadata); 2965 camMetadata.update(ANDROID_STATISTICS_HISTOGRAM_MODE, histogramMode, 1); 2966 } 2967 if (IS_META_AVAILABLE(CAM_INTF_META_STATS_SHARPNESS_MAP_MODE, metadata)){ 2968 uint8_t *sharpnessMapMode = 2969 (uint8_t *)POINTER_OF_META(CAM_INTF_META_STATS_SHARPNESS_MAP_MODE, metadata); 2970 camMetadata.update(ANDROID_STATISTICS_SHARPNESS_MAP_MODE, 2971 sharpnessMapMode, 1); 2972 } 2973 if (IS_META_AVAILABLE(CAM_INTF_META_STATS_SHARPNESS_MAP, metadata)){ 2974 cam_sharpness_map_t *sharpnessMap = (cam_sharpness_map_t *) 2975 POINTER_OF_META(CAM_INTF_META_STATS_SHARPNESS_MAP, metadata); 2976 camMetadata.update(ANDROID_STATISTICS_SHARPNESS_MAP, 2977 (int32_t*)sharpnessMap->sharpness, 2978 CAM_MAX_MAP_WIDTH*CAM_MAX_MAP_HEIGHT); 2979 } 2980 if (IS_META_AVAILABLE(CAM_INTF_META_LENS_SHADING_MAP, metadata)) { 2981 cam_lens_shading_map_t *lensShadingMap = (cam_lens_shading_map_t *) 2982 POINTER_OF_META(CAM_INTF_META_LENS_SHADING_MAP, metadata); 2983 int map_height = gCamCapability[mCameraId]->lens_shading_map_size.height; 2984 int map_width = gCamCapability[mCameraId]->lens_shading_map_size.width; 2985 camMetadata.update(ANDROID_STATISTICS_LENS_SHADING_MAP, 2986 (float*)lensShadingMap->lens_shading, 2987 4*map_width*map_height); 2988 } 2989 if (IS_META_AVAILABLE(CAM_INTF_META_TONEMAP_MODE, metadata)) { 2990 uint8_t *toneMapMode = 2991 (uint8_t *)POINTER_OF_META(CAM_INTF_META_TONEMAP_MODE, metadata); 2992 camMetadata.update(ANDROID_TONEMAP_MODE, toneMapMode, 1); 2993 } 2994 if (IS_META_AVAILABLE(CAM_INTF_META_TONEMAP_CURVES, metadata)){ 2995 //Populate CAM_INTF_META_TONEMAP_CURVES 2996 /* ch0 = G, ch 1 = B, ch 2 = R*/ 2997 cam_rgb_tonemap_curves *tonemap = (cam_rgb_tonemap_curves *) 2998 POINTER_OF_META(CAM_INTF_META_TONEMAP_CURVES, metadata); 2999 if (tonemap->tonemap_points_cnt > CAM_MAX_TONEMAP_CURVE_SIZE) { 3000 ALOGE("%s: Fatal: tonemap_points_cnt %d exceeds max value of %d", 3001 __func__, tonemap->tonemap_points_cnt, 3002 CAM_MAX_TONEMAP_CURVE_SIZE); 3003 tonemap->tonemap_points_cnt = CAM_MAX_TONEMAP_CURVE_SIZE; 3004 } 3005 3006 camMetadata.update(ANDROID_TONEMAP_CURVE_GREEN, 3007 (float*)tonemap->curves[0].tonemap_points, 3008 tonemap->tonemap_points_cnt * 2); 3009 3010 camMetadata.update(ANDROID_TONEMAP_CURVE_BLUE, 3011 (float*)tonemap->curves[1].tonemap_points, 3012 tonemap->tonemap_points_cnt * 2); 3013 3014 camMetadata.update(ANDROID_TONEMAP_CURVE_RED, 3015 (float*)tonemap->curves[2].tonemap_points, 3016 tonemap->tonemap_points_cnt * 2); 3017 } 3018 if (IS_META_AVAILABLE(CAM_INTF_META_COLOR_CORRECT_GAINS, metadata)){ 3019 cam_color_correct_gains_t *colorCorrectionGains = (cam_color_correct_gains_t*) 3020 POINTER_OF_META(CAM_INTF_META_COLOR_CORRECT_GAINS, metadata); 3021 camMetadata.update(ANDROID_COLOR_CORRECTION_GAINS, colorCorrectionGains->gains, 4); 3022 } 3023 if (IS_META_AVAILABLE(CAM_INTF_META_COLOR_CORRECT_TRANSFORM, metadata)){ 3024 cam_color_correct_matrix_t *colorCorrectionMatrix = (cam_color_correct_matrix_t*) 3025 POINTER_OF_META(CAM_INTF_META_COLOR_CORRECT_TRANSFORM, metadata); 3026 camMetadata.update(ANDROID_COLOR_CORRECTION_TRANSFORM, 3027 (camera_metadata_rational_t*)colorCorrectionMatrix->transform_matrix, 3*3); 3028 } 3029 if (IS_META_AVAILABLE(CAM_INTF_META_PROFILE_TONE_CURVE, metadata)) { 3030 cam_profile_tone_curve *toneCurve = (cam_profile_tone_curve *) 3031 POINTER_OF_META(CAM_INTF_META_PROFILE_TONE_CURVE, metadata); 3032 if (toneCurve->tonemap_points_cnt > CAM_MAX_TONEMAP_CURVE_SIZE) { 3033 ALOGE("%s: Fatal: tonemap_points_cnt %d exceeds max value of %d", 3034 __func__, toneCurve->tonemap_points_cnt, 3035 CAM_MAX_TONEMAP_CURVE_SIZE); 3036 toneCurve->tonemap_points_cnt = CAM_MAX_TONEMAP_CURVE_SIZE; 3037 } 3038 camMetadata.update(ANDROID_SENSOR_PROFILE_TONE_CURVE, 3039 (float*)toneCurve->curve.tonemap_points, 3040 toneCurve->tonemap_points_cnt * 2); 3041 } 3042 if (IS_META_AVAILABLE(CAM_INTF_META_PRED_COLOR_CORRECT_GAINS, metadata)){ 3043 cam_color_correct_gains_t *predColorCorrectionGains = (cam_color_correct_gains_t*) 3044 POINTER_OF_META(CAM_INTF_META_PRED_COLOR_CORRECT_GAINS, metadata); 3045 camMetadata.update(ANDROID_STATISTICS_PREDICTED_COLOR_GAINS, 3046 predColorCorrectionGains->gains, 4); 3047 } 3048 if (IS_META_AVAILABLE(CAM_INTF_META_PRED_COLOR_CORRECT_TRANSFORM, metadata)){ 3049 cam_color_correct_matrix_t *predColorCorrectionMatrix = (cam_color_correct_matrix_t*) 3050 POINTER_OF_META(CAM_INTF_META_PRED_COLOR_CORRECT_TRANSFORM, metadata); 3051 camMetadata.update(ANDROID_STATISTICS_PREDICTED_COLOR_TRANSFORM, 3052 (camera_metadata_rational_t*)predColorCorrectionMatrix->transform_matrix, 3*3); 3053 } 3054 if (IS_META_AVAILABLE(CAM_INTF_META_OTP_WB_GRGB, metadata)) { 3055 float *otpWbGrGb = (float*) POINTER_OF_META( 3056 CAM_INTF_META_OTP_WB_GRGB, metadata); 3057 camMetadata.update(ANDROID_SENSOR_GREEN_SPLIT, otpWbGrGb, 1); 3058 } 3059 if (IS_META_AVAILABLE(CAM_INTF_META_BLACK_LEVEL_LOCK, metadata)){ 3060 uint8_t *blackLevelLock = (uint8_t*) 3061 POINTER_OF_META(CAM_INTF_META_BLACK_LEVEL_LOCK, metadata); 3062 camMetadata.update(ANDROID_BLACK_LEVEL_LOCK, blackLevelLock, 1); 3063 } 3064 if (IS_META_AVAILABLE(CAM_INTF_META_SCENE_FLICKER, metadata)){ 3065 uint8_t *sceneFlicker = (uint8_t*) 3066 POINTER_OF_META(CAM_INTF_META_SCENE_FLICKER, metadata); 3067 camMetadata.update(ANDROID_STATISTICS_SCENE_FLICKER, sceneFlicker, 1); 3068 } 3069 if (IS_META_AVAILABLE(CAM_INTF_PARM_EFFECT, metadata)) { 3070 uint8_t *effectMode = (uint8_t*) 3071 POINTER_OF_META(CAM_INTF_PARM_EFFECT, metadata); 3072 uint8_t fwk_effectMode = (uint8_t)lookupFwkName(EFFECT_MODES_MAP, 3073 sizeof(EFFECT_MODES_MAP), 3074 *effectMode); 3075 camMetadata.update(ANDROID_CONTROL_EFFECT_MODE, &fwk_effectMode, 1); 3076 } 3077 if (IS_META_AVAILABLE(CAM_INTF_META_TEST_PATTERN_DATA, metadata)) { 3078 cam_test_pattern_data_t *testPatternData = (cam_test_pattern_data_t *) 3079 POINTER_OF_META(CAM_INTF_META_TEST_PATTERN_DATA, metadata); 3080 int32_t fwk_testPatternMode = lookupFwkName(TEST_PATTERN_MAP, 3081 sizeof(TEST_PATTERN_MAP)/sizeof(TEST_PATTERN_MAP[0]), 3082 testPatternData->mode); 3083 camMetadata.update(ANDROID_SENSOR_TEST_PATTERN_MODE, 3084 &fwk_testPatternMode, 1); 3085 int32_t fwk_testPatternData[4]; 3086 fwk_testPatternData[0] = testPatternData->r; 3087 fwk_testPatternData[3] = testPatternData->b; 3088 switch (gCamCapability[mCameraId]->color_arrangement) { 3089 case CAM_FILTER_ARRANGEMENT_RGGB: 3090 case CAM_FILTER_ARRANGEMENT_GRBG: 3091 fwk_testPatternData[1] = testPatternData->gr; 3092 fwk_testPatternData[2] = testPatternData->gb; 3093 break; 3094 case CAM_FILTER_ARRANGEMENT_GBRG: 3095 case CAM_FILTER_ARRANGEMENT_BGGR: 3096 fwk_testPatternData[2] = testPatternData->gr; 3097 fwk_testPatternData[1] = testPatternData->gb; 3098 break; 3099 default: 3100 ALOGE("%s: color arrangement %d is not supported", __func__, 3101 gCamCapability[mCameraId]->color_arrangement); 3102 break; 3103 } 3104 camMetadata.update(ANDROID_SENSOR_TEST_PATTERN_DATA, fwk_testPatternData, 4); 3105 } 3106 if (IS_META_AVAILABLE(CAM_INTF_META_JPEG_GPS_COORDINATES, metadata)) { 3107 double *gps_coords = (double *)POINTER_OF_META( 3108 CAM_INTF_META_JPEG_GPS_COORDINATES, metadata); 3109 camMetadata.update(ANDROID_JPEG_GPS_COORDINATES, gps_coords, 3); 3110 } 3111 if (IS_META_AVAILABLE(CAM_INTF_META_JPEG_GPS_PROC_METHODS, metadata)) { 3112 char *gps_methods = (char *)POINTER_OF_META( 3113 CAM_INTF_META_JPEG_GPS_PROC_METHODS, metadata); 3114 String8 str(gps_methods); 3115 camMetadata.update(ANDROID_JPEG_GPS_PROCESSING_METHOD, str); 3116 } 3117 if (IS_META_AVAILABLE(CAM_INTF_META_JPEG_GPS_TIMESTAMP, metadata)) { 3118 int64_t *gps_timestamp = (int64_t *)POINTER_OF_META( 3119 CAM_INTF_META_JPEG_GPS_TIMESTAMP, metadata); 3120 camMetadata.update(ANDROID_JPEG_GPS_TIMESTAMP, gps_timestamp, 1); 3121 } 3122 if (IS_META_AVAILABLE(CAM_INTF_META_JPEG_ORIENTATION, metadata)) { 3123 int32_t *jpeg_orientation = (int32_t *)POINTER_OF_META( 3124 CAM_INTF_META_JPEG_ORIENTATION, metadata); 3125 camMetadata.update(ANDROID_JPEG_ORIENTATION, jpeg_orientation, 1); 3126 } 3127 if (IS_META_AVAILABLE(CAM_INTF_META_JPEG_QUALITY, metadata)) { 3128 uint8_t *jpeg_quality = (uint8_t *)POINTER_OF_META( 3129 CAM_INTF_META_JPEG_QUALITY, metadata); 3130 camMetadata.update(ANDROID_JPEG_QUALITY, jpeg_quality, 1); 3131 } 3132 if (IS_META_AVAILABLE(CAM_INTF_META_JPEG_THUMB_QUALITY, metadata)) { 3133 uint8_t *thumb_quality = (uint8_t *)POINTER_OF_META( 3134 CAM_INTF_META_JPEG_THUMB_QUALITY, metadata); 3135 camMetadata.update(ANDROID_JPEG_THUMBNAIL_QUALITY, thumb_quality, 1); 3136 } 3137 if (IS_META_AVAILABLE(CAM_INTF_META_JPEG_THUMB_SIZE, metadata)) { 3138 cam_dimension_t *thumb_size = (cam_dimension_t *)POINTER_OF_META( 3139 CAM_INTF_META_JPEG_THUMB_SIZE, metadata); 3140 } 3141 if (IS_META_AVAILABLE(CAM_INTF_META_PRIVATE_DATA, metadata)) { 3142 int32_t *privateData = (int32_t *) 3143 POINTER_OF_META(CAM_INTF_META_PRIVATE_DATA, metadata); 3144 camMetadata.update(QCAMERA3_PRIVATEDATA_REPROCESS, 3145 privateData, MAX_METADATA_PRIVATE_PAYLOAD_SIZE); 3146 } 3147 if (metadata->is_tuning_params_valid) { 3148 uint8_t tuning_meta_data_blob[sizeof(tuning_params_t)]; 3149 uint8_t *data = (uint8_t*)&tuning_meta_data_blob[0]; 3150 metadata->tuning_params.tuning_data_version = TUNING_DATA_VERSION; 3151 3152 3153 memcpy(data, ((uint8_t*)&metadata->tuning_params.tuning_data_version), 3154 sizeof(uint32_t)); 3155 data += sizeof(uint32_t); 3156 3157 memcpy(data, ((uint8_t*)&metadata->tuning_params.tuning_sensor_data_size), 3158 sizeof(uint32_t)); 3159 CDBG("tuning_sensor_data_size %d",(int)(*(int *)data)); 3160 data += sizeof(uint32_t); 3161 3162 memcpy(data, ((uint8_t *)&metadata->tuning_params.tuning_vfe_data_size), 3163 sizeof(uint32_t)); 3164 CDBG("tuning_vfe_data_size %d",(int)(*(int *)data)); 3165 data += sizeof(uint32_t); 3166 3167 memcpy(data, ((uint8_t *)&metadata->tuning_params.tuning_cpp_data_size), 3168 sizeof(uint32_t)); 3169 CDBG("tuning_cpp_data_size %d",(int)(*(int *)data)); 3170 data += sizeof(uint32_t); 3171 3172 memcpy(data, ((uint8_t *)&metadata->tuning_params.tuning_cac_data_size), 3173 sizeof(uint32_t)); 3174 CDBG("tuning_cac_data_size %d",(int)(*(int *)data)); 3175 data += sizeof(uint32_t); 3176 3177 metadata->tuning_params.tuning_mod3_data_size = 0; 3178 memcpy(data, ((uint8_t *)&metadata->tuning_params.tuning_mod3_data_size), 3179 sizeof(uint32_t)); 3180 CDBG("tuning_mod3_data_size %d",(int)(*(int *)data)); 3181 data += sizeof(uint32_t); 3182 3183 memcpy(data, ((uint8_t *)&metadata->tuning_params.data), 3184 metadata->tuning_params.tuning_sensor_data_size); 3185 data += metadata->tuning_params.tuning_sensor_data_size; 3186 3187 memcpy(data, ((uint8_t *)&metadata->tuning_params.data[TUNING_VFE_DATA_OFFSET]), 3188 metadata->tuning_params.tuning_vfe_data_size); 3189 data += metadata->tuning_params.tuning_vfe_data_size; 3190 3191 memcpy(data, ((uint8_t *)&metadata->tuning_params.data[TUNING_CPP_DATA_OFFSET]), 3192 metadata->tuning_params.tuning_cpp_data_size); 3193 data += metadata->tuning_params.tuning_cpp_data_size; 3194 3195 3196 memcpy(data, ((uint8_t *)&metadata->tuning_params.data[TUNING_CAC_DATA_OFFSET]), 3197 metadata->tuning_params.tuning_cac_data_size); 3198 data += metadata->tuning_params.tuning_cac_data_size; 3199 3200 camMetadata.update(QCAMERA3_TUNING_META_DATA_BLOB, 3201 (int32_t*)tuning_meta_data_blob, (data-tuning_meta_data_blob)/sizeof(uint32_t)); 3202 } 3203 if (IS_META_AVAILABLE(CAM_INTF_META_NEUTRAL_COL_POINT, metadata)) { 3204 cam_neutral_col_point_t *neuColPoint = (cam_neutral_col_point_t*) 3205 POINTER_OF_META(CAM_INTF_META_NEUTRAL_COL_POINT, metadata); 3206 camMetadata.update(ANDROID_SENSOR_NEUTRAL_COLOR_POINT, 3207 (camera_metadata_rational_t*)neuColPoint->neutral_col_point, 3); 3208 } 3209 3210 if (IS_META_AVAILABLE(CAM_INTF_META_LENS_SHADING_MAP_MODE, metadata)) { 3211 uint8_t shadingMapMode = 3212 *((uint32_t *)POINTER_OF_META(CAM_INTF_META_LENS_SHADING_MAP_MODE, metadata)); 3213 camMetadata.update(ANDROID_STATISTICS_LENS_SHADING_MAP_MODE, &shadingMapMode, 1); 3214 } 3215 3216 if (IS_META_AVAILABLE(CAM_INTF_META_AEC_ROI, metadata)) { 3217 cam_area_t *hAeRegions = 3218 (cam_area_t *)POINTER_OF_META(CAM_INTF_META_AEC_ROI, metadata); 3219 int32_t aeRegions[5]; 3220 convertToRegions(hAeRegions->rect, aeRegions, hAeRegions->weight); 3221 camMetadata.update(ANDROID_CONTROL_AE_REGIONS, aeRegions, 5); 3222 CDBG("%s: Metadata : ANDROID_CONTROL_AE_REGIONS: FWK: [%d,%d,%d,%d] HAL: [%d,%d,%d,%d]", 3223 __func__, aeRegions[0], aeRegions[1], aeRegions[2], aeRegions[3], 3224 hAeRegions->rect.left, hAeRegions->rect.top, hAeRegions->rect.width, 3225 hAeRegions->rect.height); 3226 } 3227 3228 if (IS_META_AVAILABLE(CAM_INTF_META_AF_ROI, metadata)) { 3229 /*af regions*/ 3230 cam_area_t *hAfRegions = 3231 (cam_area_t *)POINTER_OF_META(CAM_INTF_META_AF_ROI, metadata); 3232 int32_t afRegions[5]; 3233 convertToRegions(hAfRegions->rect, afRegions, hAfRegions->weight); 3234 camMetadata.update(ANDROID_CONTROL_AF_REGIONS, afRegions, 5); 3235 CDBG("%s: Metadata : ANDROID_CONTROL_AF_REGIONS: FWK: [%d,%d,%d,%d] HAL: [%d,%d,%d,%d]", 3236 __func__, afRegions[0], afRegions[1], afRegions[2], afRegions[3], 3237 hAfRegions->rect.left, hAfRegions->rect.top, hAfRegions->rect.width, 3238 hAfRegions->rect.height); 3239 } 3240 3241 if (IS_META_AVAILABLE(CAM_INTF_PARM_ANTIBANDING, metadata)) { 3242 uint8_t hal_ab_mode = 3243 *((uint32_t *)POINTER_OF_META(CAM_INTF_PARM_ANTIBANDING, metadata)); 3244 uint8_t fwk_ab_mode = (uint8_t)lookupFwkName(ANTIBANDING_MODES_MAP, 3245 sizeof(ANTIBANDING_MODES_MAP)/sizeof(ANTIBANDING_MODES_MAP[0]), 3246 hal_ab_mode); 3247 camMetadata.update(ANDROID_CONTROL_AE_ANTIBANDING_MODE, 3248 &fwk_ab_mode, 1); 3249 } 3250 3251 if (IS_META_AVAILABLE(CAM_INTF_META_MODE, metadata)) { 3252 uint8_t mode = 3253 *((uint32_t *)POINTER_OF_META(CAM_INTF_META_MODE, metadata)); 3254 camMetadata.update(ANDROID_CONTROL_MODE, &mode, 1); 3255 } 3256 3257 /* Constant metadata values to be update*/ 3258 uint8_t hotPixelMode = ANDROID_HOT_PIXEL_MODE_FAST; 3259 camMetadata.update(ANDROID_HOT_PIXEL_MODE, &hotPixelMode, 1); 3260 3261 uint8_t hotPixelMapMode = ANDROID_STATISTICS_HOT_PIXEL_MAP_MODE_OFF; 3262 camMetadata.update(ANDROID_STATISTICS_HOT_PIXEL_MAP_MODE, &hotPixelMapMode, 1); 3263 3264 int32_t hotPixelMap[2]; 3265 camMetadata.update(ANDROID_STATISTICS_HOT_PIXEL_MAP, &hotPixelMap[0], 0); 3266 3267 uint8_t vsMode = ANDROID_CONTROL_VIDEO_STABILIZATION_MODE_OFF; 3268 camMetadata.update(ANDROID_CONTROL_VIDEO_STABILIZATION_MODE, &vsMode, 1); 3269 3270 // CDS 3271 if (IS_META_AVAILABLE(CAM_INTF_PARM_CDS_MODE, metadata)) { 3272 cam_cds_mode_type_t *cds = (cam_cds_mode_type_t *) 3273 POINTER_OF_META(CAM_INTF_PARM_CDS_MODE, metadata); 3274 int32_t mode = *cds; 3275 camMetadata.update(QCAMERA3_CDS_MODE, 3276 &mode, 1); 3277 } 3278 3279 // Reprocess crop data 3280 if (IS_META_AVAILABLE(CAM_INTF_META_CROP_DATA, metadata)) { 3281 cam_crop_data_t *crop_data = (cam_crop_data_t *) 3282 POINTER_OF_PARAM(CAM_INTF_META_CROP_DATA, metadata); 3283 uint8_t cnt = crop_data->num_of_streams; 3284 if ((0 < cnt) && (cnt < MAX_NUM_STREAMS)) { 3285 int rc = NO_ERROR; 3286 int32_t *crop = new int32_t[cnt*4]; 3287 if (NULL == crop) { 3288 rc = NO_MEMORY; 3289 } 3290 3291 int32_t *crop_stream_ids = new int32_t[cnt]; 3292 if (NULL == crop_stream_ids) { 3293 rc = NO_MEMORY; 3294 } 3295 3296 if (NO_ERROR == rc) { 3297 int32_t steams_found = 0; 3298 for (size_t i = 0; i < cnt; i++) { 3299 for (List<stream_info_t *>::iterator it = mStreamInfo.begin(); 3300 it != mStreamInfo.end(); it++) { 3301 QCamera3Channel *channel = (QCamera3Channel *)(*it)->stream->priv; 3302 if (NULL != channel) { 3303 if (crop_data->crop_info[i].stream_id == 3304 channel->mStreams[0]->getMyServerID()) { 3305 crop[steams_found*4] = crop_data->crop_info[i].crop.left; 3306 crop[steams_found*4 + 1] = crop_data->crop_info[i].crop.top; 3307 crop[steams_found*4 + 2] = crop_data->crop_info[i].crop.width; 3308 crop[steams_found*4 + 3] = crop_data->crop_info[i].crop.height; 3309 // In a more general case we may want to generate 3310 // unique id depending on width, height, stream, private 3311 // data etc. 3312 crop_stream_ids[steams_found] = (int32_t)(*it)->stream; 3313 steams_found++; 3314 CDBG("%s: Adding reprocess crop data for stream %p %dx%d, %dx%d", 3315 __func__, 3316 (*it)->stream, 3317 crop_data->crop_info[i].crop.left, 3318 crop_data->crop_info[i].crop.top, 3319 crop_data->crop_info[i].crop.width, 3320 crop_data->crop_info[i].crop.height); 3321 break; 3322 } 3323 } 3324 } 3325 } 3326 3327 camMetadata.update(QCAMERA3_CROP_COUNT_REPROCESS, 3328 &steams_found, 1); 3329 camMetadata.update(QCAMERA3_CROP_REPROCESS, 3330 crop, steams_found*4); 3331 camMetadata.update(QCAMERA3_CROP_STREAM_ID_REPROCESS, 3332 crop_stream_ids, steams_found); 3333 } 3334 3335 if (crop) { 3336 delete [] crop; 3337 } 3338 if (crop_stream_ids) { 3339 delete [] crop_stream_ids; 3340 } 3341 } else { 3342 // mm-qcamera-daemon only posts crop_data for streams 3343 // not linked to pproc. So no valid crop metadata is not 3344 // necessarily an error case. 3345 CDBG("%s: No valid crop metadata entries", __func__); 3346 } 3347 } 3348 3349 if (IS_PARAM_AVAILABLE(CAM_INTF_PARM_CAC, metadata)) { 3350 cam_aberration_mode_t *cacMode = (cam_aberration_mode_t *) 3351 POINTER_OF_PARAM(CAM_INTF_PARM_CAC, metadata); 3352 int32_t cac = lookupFwkName(COLOR_ABERRATION_MAP, 3353 sizeof(COLOR_ABERRATION_MAP)/sizeof(COLOR_ABERRATION_MAP[0]), 3354 *cacMode); 3355 if (NAME_NOT_FOUND != cac) { 3356 uint8_t val = (uint8_t) cac; 3357 camMetadata.update(ANDROID_COLOR_CORRECTION_ABERRATION_MODE, 3358 &val, 3359 1); 3360 } else { 3361 ALOGE("%s: Invalid CAC camera parameter: %d", __func__, *cacMode); 3362 } 3363 } 3364 3365 resultMetadata = camMetadata.release(); 3366 return resultMetadata; 3367 } 3368 3369 /*=========================================================================== 3370 * FUNCTION : translateCbUrgentMetadataToResultMetadata 3371 * 3372 * DESCRIPTION: 3373 * 3374 * PARAMETERS : 3375 * @metadata : metadata information from callback 3376 * 3377 * RETURN : camera_metadata_t* 3378 * metadata in a format specified by fwk 3379 *==========================================================================*/ 3380 camera_metadata_t* 3381 QCamera3HardwareInterface::translateCbUrgentMetadataToResultMetadata 3382 (metadata_buffer_t *metadata) 3383 { 3384 CameraMetadata camMetadata; 3385 camera_metadata_t* resultMetadata; 3386 uint8_t aeMode = CAM_AE_MODE_MAX; 3387 int32_t *flashMode = NULL; 3388 int32_t *redeye = NULL; 3389 3390 if (IS_META_AVAILABLE(CAM_INTF_META_AEC_STATE, metadata)) { 3391 uint8_t *ae_state = (uint8_t *) 3392 POINTER_OF_META(CAM_INTF_META_AEC_STATE, metadata); 3393 camMetadata.update(ANDROID_CONTROL_AE_STATE, ae_state, 1); 3394 CDBG("%s: urgent Metadata : ANDROID_CONTROL_AE_STATE", __func__); 3395 } 3396 3397 if (IS_META_AVAILABLE(CAM_INTF_META_AF_STATE, metadata)) { 3398 uint8_t *afState = (uint8_t *) 3399 POINTER_OF_META(CAM_INTF_META_AF_STATE, metadata); 3400 camMetadata.update(ANDROID_CONTROL_AF_STATE, afState, 1); 3401 CDBG("%s: urgent Metadata : ANDROID_CONTROL_AF_STATE %d", __func__, *afState); 3402 } 3403 3404 if (IS_META_AVAILABLE(CAM_INTF_META_LENS_FOCUS_DISTANCE, metadata)) { 3405 float *focusDistance = 3406 (float *)POINTER_OF_META(CAM_INTF_META_LENS_FOCUS_DISTANCE, metadata); 3407 camMetadata.update(ANDROID_LENS_FOCUS_DISTANCE , focusDistance, 1); 3408 } 3409 3410 if (IS_META_AVAILABLE(CAM_INTF_META_LENS_FOCUS_RANGE, metadata)) { 3411 float *focusRange = 3412 (float *)POINTER_OF_META(CAM_INTF_META_LENS_FOCUS_RANGE, metadata); 3413 camMetadata.update(ANDROID_LENS_FOCUS_RANGE , focusRange, 2); 3414 } 3415 3416 if (IS_META_AVAILABLE(CAM_INTF_META_AWB_STATE, metadata)) { 3417 uint8_t *whiteBalanceState = (uint8_t *) 3418 POINTER_OF_META(CAM_INTF_META_AWB_STATE, metadata); 3419 camMetadata.update(ANDROID_CONTROL_AWB_STATE, whiteBalanceState, 1); 3420 CDBG("%s: urgent Metadata : ANDROID_CONTROL_AWB_STATE", __func__); 3421 } 3422 3423 if (IS_META_AVAILABLE(CAM_INTF_META_AEC_PRECAPTURE_TRIGGER, metadata)) { 3424 cam_trigger_t *aecTrigger = 3425 (cam_trigger_t *)POINTER_OF_META(CAM_INTF_META_AEC_PRECAPTURE_TRIGGER, metadata); 3426 camMetadata.update(ANDROID_CONTROL_AE_PRECAPTURE_TRIGGER, 3427 &aecTrigger->trigger, 1); 3428 camMetadata.update(ANDROID_CONTROL_AE_PRECAPTURE_ID, 3429 &aecTrigger->trigger_id, 1); 3430 } 3431 3432 if (IS_META_AVAILABLE(CAM_INTF_PARM_FOCUS_MODE, metadata)) { 3433 uint8_t *focusMode = (uint8_t *) 3434 POINTER_OF_META(CAM_INTF_PARM_FOCUS_MODE, metadata); 3435 uint8_t fwkAfMode = (uint8_t)lookupFwkName(FOCUS_MODES_MAP, 3436 sizeof(FOCUS_MODES_MAP)/sizeof(FOCUS_MODES_MAP[0]), *focusMode); 3437 camMetadata.update(ANDROID_CONTROL_AF_MODE, &fwkAfMode, 1); 3438 } 3439 3440 if (IS_META_AVAILABLE(CAM_INTF_META_AF_TRIGGER, metadata)) { 3441 cam_trigger_t *af_trigger = 3442 (cam_trigger_t *)POINTER_OF_META(CAM_INTF_META_AF_TRIGGER, metadata); 3443 camMetadata.update(ANDROID_CONTROL_AF_TRIGGER, 3444 &af_trigger->trigger, 1); 3445 camMetadata.update(ANDROID_CONTROL_AF_TRIGGER_ID, &af_trigger->trigger_id, 1); 3446 } 3447 3448 if (IS_META_AVAILABLE(CAM_INTF_PARM_WHITE_BALANCE, metadata)) { 3449 uint8_t *whiteBalance = (uint8_t *) 3450 POINTER_OF_META(CAM_INTF_PARM_WHITE_BALANCE, metadata); 3451 uint8_t fwkWhiteBalanceMode = 3452 (uint8_t)lookupFwkName(WHITE_BALANCE_MODES_MAP, 3453 sizeof(WHITE_BALANCE_MODES_MAP)/ 3454 sizeof(WHITE_BALANCE_MODES_MAP[0]), *whiteBalance); 3455 camMetadata.update(ANDROID_CONTROL_AWB_MODE, 3456 &fwkWhiteBalanceMode, 1); 3457 } 3458 3459 if (IS_META_AVAILABLE(CAM_INTF_META_AEC_MODE, metadata)) { 3460 aeMode = *((uint32_t*) POINTER_OF_META(CAM_INTF_META_AEC_MODE, metadata)); 3461 } 3462 if (IS_META_AVAILABLE(CAM_INTF_PARM_LED_MODE, metadata)) { 3463 flashMode = (int32_t*) 3464 POINTER_OF_PARAM(CAM_INTF_PARM_LED_MODE, metadata); 3465 } 3466 if (IS_META_AVAILABLE(CAM_INTF_PARM_REDEYE_REDUCTION, metadata)) { 3467 redeye = (int32_t*) 3468 POINTER_OF_PARAM(CAM_INTF_PARM_REDEYE_REDUCTION, metadata); 3469 } 3470 3471 uint8_t fwk_aeMode; 3472 if (redeye != NULL && *redeye == 1) { 3473 fwk_aeMode = ANDROID_CONTROL_AE_MODE_ON_AUTO_FLASH_REDEYE; 3474 camMetadata.update(ANDROID_CONTROL_AE_MODE, &fwk_aeMode, 1); 3475 } else if (flashMode != NULL && 3476 ((*flashMode == CAM_FLASH_MODE_AUTO)|| 3477 (*flashMode == CAM_FLASH_MODE_ON))) { 3478 fwk_aeMode = (uint8_t)lookupFwkName(AE_FLASH_MODE_MAP, 3479 sizeof(AE_FLASH_MODE_MAP)/sizeof(AE_FLASH_MODE_MAP[0]),*flashMode); 3480 camMetadata.update(ANDROID_CONTROL_AE_MODE, &fwk_aeMode, 1); 3481 } else if (aeMode == CAM_AE_MODE_ON) { 3482 fwk_aeMode = ANDROID_CONTROL_AE_MODE_ON; 3483 camMetadata.update(ANDROID_CONTROL_AE_MODE, &fwk_aeMode, 1); 3484 } else if (aeMode == CAM_AE_MODE_OFF) { 3485 fwk_aeMode = ANDROID_CONTROL_AE_MODE_OFF; 3486 camMetadata.update(ANDROID_CONTROL_AE_MODE, &fwk_aeMode, 1); 3487 } else { 3488 ALOGE("%s: Not enough info to deduce ANDROID_CONTROL_AE_MODE redeye:%p, flashMode:%p, aeMode:%d!!!",__func__, 3489 redeye, flashMode, aeMode); 3490 } 3491 3492 if (IS_META_AVAILABLE(CAM_INTF_META_LENS_STATE, metadata)) { 3493 uint8_t *lensState = (uint8_t *)POINTER_OF_META(CAM_INTF_META_LENS_STATE, metadata); 3494 camMetadata.update(ANDROID_LENS_STATE , lensState, 1); 3495 } 3496 3497 resultMetadata = camMetadata.release(); 3498 return resultMetadata; 3499 } 3500 3501 /*=========================================================================== 3502 * FUNCTION : dumpMetadataToFile 3503 * 3504 * DESCRIPTION: Dumps tuning metadata to file system 3505 * 3506 * PARAMETERS : 3507 * @meta : tuning metadata 3508 * @dumpFrameCount : current dump frame count 3509 * @enabled : Enable mask 3510 * 3511 *==========================================================================*/ 3512 void QCamera3HardwareInterface::dumpMetadataToFile(tuning_params_t &meta, 3513 uint32_t &dumpFrameCount, 3514 int32_t enabled, 3515 const char *type, 3516 uint32_t frameNumber) 3517 { 3518 uint32_t frm_num = 0; 3519 3520 //Some sanity checks 3521 if (meta.tuning_sensor_data_size > TUNING_SENSOR_DATA_MAX) { 3522 ALOGE("%s : Tuning sensor data size bigger than expected %d: %d", 3523 __func__, 3524 meta.tuning_sensor_data_size, 3525 TUNING_SENSOR_DATA_MAX); 3526 return; 3527 } 3528 3529 if (meta.tuning_vfe_data_size > TUNING_VFE_DATA_MAX) { 3530 ALOGE("%s : Tuning VFE data size bigger than expected %d: %d", 3531 __func__, 3532 meta.tuning_vfe_data_size, 3533 TUNING_VFE_DATA_MAX); 3534 return; 3535 } 3536 3537 if (meta.tuning_cpp_data_size > TUNING_CPP_DATA_MAX) { 3538 ALOGE("%s : Tuning CPP data size bigger than expected %d: %d", 3539 __func__, 3540 meta.tuning_cpp_data_size, 3541 TUNING_CPP_DATA_MAX); 3542 return; 3543 } 3544 3545 if (meta.tuning_cac_data_size > TUNING_CAC_DATA_MAX) { 3546 ALOGE("%s : Tuning CAC data size bigger than expected %d: %d", 3547 __func__, 3548 meta.tuning_cac_data_size, 3549 TUNING_CAC_DATA_MAX); 3550 return; 3551 } 3552 // 3553 3554 if(enabled){ 3555 char timeBuf[FILENAME_MAX]; 3556 char buf[FILENAME_MAX]; 3557 memset(buf, 0, sizeof(buf)); 3558 memset(timeBuf, 0, sizeof(timeBuf)); 3559 time_t current_time; 3560 struct tm * timeinfo; 3561 time (¤t_time); 3562 timeinfo = localtime (¤t_time); 3563 strftime (timeBuf, sizeof(timeBuf),"/data/%Y%m%d%H%M%S", timeinfo); 3564 String8 filePath(timeBuf); 3565 snprintf(buf, 3566 sizeof(buf), 3567 "%dm_%s_%d.bin", 3568 dumpFrameCount, 3569 type, 3570 frameNumber); 3571 filePath.append(buf); 3572 int file_fd = open(filePath.string(), O_RDWR | O_CREAT, 0777); 3573 if (file_fd >= 0) { 3574 int written_len = 0; 3575 meta.tuning_data_version = TUNING_DATA_VERSION; 3576 void *data = (void *)((uint8_t *)&meta.tuning_data_version); 3577 written_len += write(file_fd, data, sizeof(uint32_t)); 3578 data = (void *)((uint8_t *)&meta.tuning_sensor_data_size); 3579 CDBG("tuning_sensor_data_size %d",(int)(*(int *)data)); 3580 written_len += write(file_fd, data, sizeof(uint32_t)); 3581 data = (void *)((uint8_t *)&meta.tuning_vfe_data_size); 3582 CDBG("tuning_vfe_data_size %d",(int)(*(int *)data)); 3583 written_len += write(file_fd, data, sizeof(uint32_t)); 3584 data = (void *)((uint8_t *)&meta.tuning_cpp_data_size); 3585 CDBG("tuning_cpp_data_size %d",(int)(*(int *)data)); 3586 written_len += write(file_fd, data, sizeof(uint32_t)); 3587 data = (void *)((uint8_t *)&meta.tuning_cac_data_size); 3588 CDBG("tuning_cac_data_size %d",(int)(*(int *)data)); 3589 written_len += write(file_fd, data, sizeof(uint32_t)); 3590 meta.tuning_mod3_data_size = 0; 3591 data = (void *)((uint8_t *)&meta.tuning_mod3_data_size); 3592 CDBG("tuning_mod3_data_size %d",(int)(*(int *)data)); 3593 written_len += write(file_fd, data, sizeof(uint32_t)); 3594 int total_size = meta.tuning_sensor_data_size; 3595 data = (void *)((uint8_t *)&meta.data); 3596 written_len += write(file_fd, data, total_size); 3597 total_size = meta.tuning_vfe_data_size; 3598 data = (void *)((uint8_t *)&meta.data[TUNING_VFE_DATA_OFFSET]); 3599 written_len += write(file_fd, data, total_size); 3600 total_size = meta.tuning_cpp_data_size; 3601 data = (void *)((uint8_t *)&meta.data[TUNING_CPP_DATA_OFFSET]); 3602 written_len += write(file_fd, data, total_size); 3603 total_size = meta.tuning_cac_data_size; 3604 data = (void *)((uint8_t *)&meta.data[TUNING_CAC_DATA_OFFSET]); 3605 written_len += write(file_fd, data, total_size); 3606 close(file_fd); 3607 }else { 3608 ALOGE("%s: fail to open file for metadata dumping", __func__); 3609 } 3610 } 3611 } 3612 3613 /*=========================================================================== 3614 * FUNCTION : cleanAndSortStreamInfo 3615 * 3616 * DESCRIPTION: helper method to clean up invalid streams in stream_info, 3617 * and sort them such that raw stream is at the end of the list 3618 * This is a workaround for camera daemon constraint. 3619 * 3620 * PARAMETERS : None 3621 * 3622 *==========================================================================*/ 3623 void QCamera3HardwareInterface::cleanAndSortStreamInfo() 3624 { 3625 List<stream_info_t *> newStreamInfo; 3626 3627 /*clean up invalid streams*/ 3628 for (List<stream_info_t*>::iterator it=mStreamInfo.begin(); 3629 it != mStreamInfo.end();) { 3630 if(((*it)->status) == INVALID){ 3631 QCamera3Channel *channel = (QCamera3Channel*)(*it)->stream->priv; 3632 delete channel; 3633 free(*it); 3634 it = mStreamInfo.erase(it); 3635 } else { 3636 it++; 3637 } 3638 } 3639 3640 // Move preview/video/callback/snapshot streams into newList 3641 for (List<stream_info_t *>::iterator it = mStreamInfo.begin(); 3642 it != mStreamInfo.end();) { 3643 if ((*it)->stream->format != HAL_PIXEL_FORMAT_RAW_OPAQUE && 3644 (*it)->stream->format != HAL_PIXEL_FORMAT_RAW10 && 3645 (*it)->stream->format != HAL_PIXEL_FORMAT_RAW16) { 3646 newStreamInfo.push_back(*it); 3647 it = mStreamInfo.erase(it); 3648 } else 3649 it++; 3650 } 3651 // Move raw streams into newList 3652 for (List<stream_info_t *>::iterator it = mStreamInfo.begin(); 3653 it != mStreamInfo.end();) { 3654 newStreamInfo.push_back(*it); 3655 it = mStreamInfo.erase(it); 3656 } 3657 3658 mStreamInfo = newStreamInfo; 3659 } 3660 3661 /*=========================================================================== 3662 * FUNCTION : extractJpegMetadata 3663 * 3664 * DESCRIPTION: helper method to extract Jpeg metadata from capture request. 3665 * JPEG metadata is cached in HAL, and return as part of capture 3666 * result when metadata is returned from camera daemon. 3667 * 3668 * PARAMETERS : @jpegMetadata: jpeg metadata to be extracted 3669 * @request: capture request 3670 * 3671 *==========================================================================*/ 3672 void QCamera3HardwareInterface::extractJpegMetadata( 3673 CameraMetadata& jpegMetadata, 3674 const camera3_capture_request_t *request) 3675 { 3676 CameraMetadata frame_settings; 3677 frame_settings = request->settings; 3678 3679 if (frame_settings.exists(ANDROID_JPEG_GPS_COORDINATES)) 3680 jpegMetadata.update(ANDROID_JPEG_GPS_COORDINATES, 3681 frame_settings.find(ANDROID_JPEG_GPS_COORDINATES).data.d, 3682 frame_settings.find(ANDROID_JPEG_GPS_COORDINATES).count); 3683 3684 if (frame_settings.exists(ANDROID_JPEG_GPS_PROCESSING_METHOD)) 3685 jpegMetadata.update(ANDROID_JPEG_GPS_PROCESSING_METHOD, 3686 frame_settings.find(ANDROID_JPEG_GPS_PROCESSING_METHOD).data.u8, 3687 frame_settings.find(ANDROID_JPEG_GPS_PROCESSING_METHOD).count); 3688 3689 if (frame_settings.exists(ANDROID_JPEG_GPS_TIMESTAMP)) 3690 jpegMetadata.update(ANDROID_JPEG_GPS_TIMESTAMP, 3691 frame_settings.find(ANDROID_JPEG_GPS_TIMESTAMP).data.i64, 3692 frame_settings.find(ANDROID_JPEG_GPS_TIMESTAMP).count); 3693 3694 if (frame_settings.exists(ANDROID_JPEG_ORIENTATION)) 3695 jpegMetadata.update(ANDROID_JPEG_ORIENTATION, 3696 frame_settings.find(ANDROID_JPEG_ORIENTATION).data.i32, 3697 frame_settings.find(ANDROID_JPEG_ORIENTATION).count); 3698 3699 if (frame_settings.exists(ANDROID_JPEG_QUALITY)) 3700 jpegMetadata.update(ANDROID_JPEG_QUALITY, 3701 frame_settings.find(ANDROID_JPEG_QUALITY).data.u8, 3702 frame_settings.find(ANDROID_JPEG_QUALITY).count); 3703 3704 if (frame_settings.exists(ANDROID_JPEG_THUMBNAIL_QUALITY)) 3705 jpegMetadata.update(ANDROID_JPEG_THUMBNAIL_QUALITY, 3706 frame_settings.find(ANDROID_JPEG_THUMBNAIL_QUALITY).data.u8, 3707 frame_settings.find(ANDROID_JPEG_THUMBNAIL_QUALITY).count); 3708 3709 if (frame_settings.exists(ANDROID_JPEG_THUMBNAIL_SIZE)) 3710 jpegMetadata.update(ANDROID_JPEG_THUMBNAIL_SIZE, 3711 frame_settings.find(ANDROID_JPEG_THUMBNAIL_SIZE).data.i32, 3712 frame_settings.find(ANDROID_JPEG_THUMBNAIL_SIZE).count); 3713 } 3714 3715 /*=========================================================================== 3716 * FUNCTION : convertToRegions 3717 * 3718 * DESCRIPTION: helper method to convert from cam_rect_t into int32_t array 3719 * 3720 * PARAMETERS : 3721 * @rect : cam_rect_t struct to convert 3722 * @region : int32_t destination array 3723 * @weight : if we are converting from cam_area_t, weight is valid 3724 * else weight = -1 3725 * 3726 *==========================================================================*/ 3727 void QCamera3HardwareInterface::convertToRegions(cam_rect_t rect, int32_t* region, int weight){ 3728 region[0] = rect.left; 3729 region[1] = rect.top; 3730 region[2] = rect.left + rect.width; 3731 region[3] = rect.top + rect.height; 3732 if (weight > -1) { 3733 region[4] = weight; 3734 } 3735 } 3736 3737 /*=========================================================================== 3738 * FUNCTION : convertFromRegions 3739 * 3740 * DESCRIPTION: helper method to convert from array to cam_rect_t 3741 * 3742 * PARAMETERS : 3743 * @rect : cam_rect_t struct to convert 3744 * @region : int32_t destination array 3745 * @weight : if we are converting from cam_area_t, weight is valid 3746 * else weight = -1 3747 * 3748 *==========================================================================*/ 3749 void QCamera3HardwareInterface::convertFromRegions(cam_area_t* roi, 3750 const camera_metadata_t *settings, 3751 uint32_t tag){ 3752 CameraMetadata frame_settings; 3753 frame_settings = settings; 3754 int32_t x_min = frame_settings.find(tag).data.i32[0]; 3755 int32_t y_min = frame_settings.find(tag).data.i32[1]; 3756 int32_t x_max = frame_settings.find(tag).data.i32[2]; 3757 int32_t y_max = frame_settings.find(tag).data.i32[3]; 3758 roi->weight = frame_settings.find(tag).data.i32[4]; 3759 roi->rect.left = x_min; 3760 roi->rect.top = y_min; 3761 roi->rect.width = x_max - x_min; 3762 roi->rect.height = y_max - y_min; 3763 } 3764 3765 /*=========================================================================== 3766 * FUNCTION : resetIfNeededROI 3767 * 3768 * DESCRIPTION: helper method to reset the roi if it is greater than scaler 3769 * crop region 3770 * 3771 * PARAMETERS : 3772 * @roi : cam_area_t struct to resize 3773 * @scalerCropRegion : cam_crop_region_t region to compare against 3774 * 3775 * 3776 *==========================================================================*/ 3777 bool QCamera3HardwareInterface::resetIfNeededROI(cam_area_t* roi, 3778 const cam_crop_region_t* scalerCropRegion) 3779 { 3780 int32_t roi_x_max = roi->rect.width + roi->rect.left; 3781 int32_t roi_y_max = roi->rect.height + roi->rect.top; 3782 int32_t crop_x_max = scalerCropRegion->width + scalerCropRegion->left; 3783 int32_t crop_y_max = scalerCropRegion->height + scalerCropRegion->top; 3784 3785 /* According to spec weight = 0 is used to indicate roi needs to be disabled 3786 * without having this check the calculations below to validate if the roi 3787 * is inside scalar crop region will fail resulting in the roi not being 3788 * reset causing algorithm to continue to use stale roi window 3789 */ 3790 if (roi->weight == 0) { 3791 return true; 3792 } 3793 3794 if ((roi_x_max < scalerCropRegion->left) || 3795 // right edge of roi window is left of scalar crop's left edge 3796 (roi_y_max < scalerCropRegion->top) || 3797 // bottom edge of roi window is above scalar crop's top edge 3798 (roi->rect.left > crop_x_max) || 3799 // left edge of roi window is beyond(right) of scalar crop's right edge 3800 (roi->rect.top > crop_y_max)){ 3801 // top edge of roi windo is above scalar crop's top edge 3802 return false; 3803 } 3804 if (roi->rect.left < scalerCropRegion->left) { 3805 roi->rect.left = scalerCropRegion->left; 3806 } 3807 if (roi->rect.top < scalerCropRegion->top) { 3808 roi->rect.top = scalerCropRegion->top; 3809 } 3810 if (roi_x_max > crop_x_max) { 3811 roi_x_max = crop_x_max; 3812 } 3813 if (roi_y_max > crop_y_max) { 3814 roi_y_max = crop_y_max; 3815 } 3816 roi->rect.width = roi_x_max - roi->rect.left; 3817 roi->rect.height = roi_y_max - roi->rect.top; 3818 return true; 3819 } 3820 3821 /*=========================================================================== 3822 * FUNCTION : convertLandmarks 3823 * 3824 * DESCRIPTION: helper method to extract the landmarks from face detection info 3825 * 3826 * PARAMETERS : 3827 * @face : cam_rect_t struct to convert 3828 * @landmarks : int32_t destination array 3829 * 3830 * 3831 *==========================================================================*/ 3832 void QCamera3HardwareInterface::convertLandmarks(cam_face_detection_info_t face, int32_t* landmarks) 3833 { 3834 landmarks[0] = face.left_eye_center.x; 3835 landmarks[1] = face.left_eye_center.y; 3836 landmarks[2] = face.right_eye_center.x; 3837 landmarks[3] = face.right_eye_center.y; 3838 landmarks[4] = face.mouth_center.x; 3839 landmarks[5] = face.mouth_center.y; 3840 } 3841 3842 #define DATA_PTR(MEM_OBJ,INDEX) MEM_OBJ->getPtr( INDEX ) 3843 /*=========================================================================== 3844 * FUNCTION : initCapabilities 3845 * 3846 * DESCRIPTION: initialize camera capabilities in static data struct 3847 * 3848 * PARAMETERS : 3849 * @cameraId : camera Id 3850 * 3851 * RETURN : int32_t type of status 3852 * NO_ERROR -- success 3853 * none-zero failure code 3854 *==========================================================================*/ 3855 int QCamera3HardwareInterface::initCapabilities(int cameraId) 3856 { 3857 int rc = 0; 3858 mm_camera_vtbl_t *cameraHandle = NULL; 3859 QCamera3HeapMemory *capabilityHeap = NULL; 3860 3861 cameraHandle = camera_open(cameraId); 3862 if (!cameraHandle) { 3863 ALOGE("%s: camera_open failed", __func__); 3864 rc = -1; 3865 goto open_failed; 3866 } 3867 3868 capabilityHeap = new QCamera3HeapMemory(); 3869 if (capabilityHeap == NULL) { 3870 ALOGE("%s: creation of capabilityHeap failed", __func__); 3871 goto heap_creation_failed; 3872 } 3873 /* Allocate memory for capability buffer */ 3874 rc = capabilityHeap->allocate(1, sizeof(cam_capability_t), false); 3875 if(rc != OK) { 3876 ALOGE("%s: No memory for cappability", __func__); 3877 goto allocate_failed; 3878 } 3879 3880 /* Map memory for capability buffer */ 3881 memset(DATA_PTR(capabilityHeap,0), 0, sizeof(cam_capability_t)); 3882 rc = cameraHandle->ops->map_buf(cameraHandle->camera_handle, 3883 CAM_MAPPING_BUF_TYPE_CAPABILITY, 3884 capabilityHeap->getFd(0), 3885 sizeof(cam_capability_t)); 3886 if(rc < 0) { 3887 ALOGE("%s: failed to map capability buffer", __func__); 3888 goto map_failed; 3889 } 3890 3891 /* Query Capability */ 3892 rc = cameraHandle->ops->query_capability(cameraHandle->camera_handle); 3893 if(rc < 0) { 3894 ALOGE("%s: failed to query capability",__func__); 3895 goto query_failed; 3896 } 3897 gCamCapability[cameraId] = (cam_capability_t *)malloc(sizeof(cam_capability_t)); 3898 if (!gCamCapability[cameraId]) { 3899 ALOGE("%s: out of memory", __func__); 3900 goto query_failed; 3901 } 3902 memcpy(gCamCapability[cameraId], DATA_PTR(capabilityHeap,0), 3903 sizeof(cam_capability_t)); 3904 rc = 0; 3905 3906 query_failed: 3907 cameraHandle->ops->unmap_buf(cameraHandle->camera_handle, 3908 CAM_MAPPING_BUF_TYPE_CAPABILITY); 3909 map_failed: 3910 capabilityHeap->deallocate(); 3911 allocate_failed: 3912 delete capabilityHeap; 3913 heap_creation_failed: 3914 cameraHandle->ops->close_camera(cameraHandle->camera_handle); 3915 cameraHandle = NULL; 3916 open_failed: 3917 return rc; 3918 } 3919 3920 /*=========================================================================== 3921 * FUNCTION : initParameters 3922 * 3923 * DESCRIPTION: initialize camera parameters 3924 * 3925 * PARAMETERS : 3926 * 3927 * RETURN : int32_t type of status 3928 * NO_ERROR -- success 3929 * none-zero failure code 3930 *==========================================================================*/ 3931 int QCamera3HardwareInterface::initParameters() 3932 { 3933 int rc = 0; 3934 3935 //Allocate Set Param Buffer 3936 mParamHeap = new QCamera3HeapMemory(); 3937 rc = mParamHeap->allocate(1, sizeof(metadata_buffer_t), false); 3938 if(rc != OK) { 3939 rc = NO_MEMORY; 3940 ALOGE("Failed to allocate SETPARM Heap memory"); 3941 delete mParamHeap; 3942 mParamHeap = NULL; 3943 return rc; 3944 } 3945 3946 //Map memory for parameters buffer 3947 rc = mCameraHandle->ops->map_buf(mCameraHandle->camera_handle, 3948 CAM_MAPPING_BUF_TYPE_PARM_BUF, 3949 mParamHeap->getFd(0), 3950 sizeof(metadata_buffer_t)); 3951 if(rc < 0) { 3952 ALOGE("%s:failed to map SETPARM buffer",__func__); 3953 rc = FAILED_TRANSACTION; 3954 mParamHeap->deallocate(); 3955 delete mParamHeap; 3956 mParamHeap = NULL; 3957 return rc; 3958 } 3959 3960 mParameters = (metadata_buffer_t*) DATA_PTR(mParamHeap,0); 3961 return rc; 3962 } 3963 3964 /*=========================================================================== 3965 * FUNCTION : deinitParameters 3966 * 3967 * DESCRIPTION: de-initialize camera parameters 3968 * 3969 * PARAMETERS : 3970 * 3971 * RETURN : NONE 3972 *==========================================================================*/ 3973 void QCamera3HardwareInterface::deinitParameters() 3974 { 3975 mCameraHandle->ops->unmap_buf(mCameraHandle->camera_handle, 3976 CAM_MAPPING_BUF_TYPE_PARM_BUF); 3977 3978 mParamHeap->deallocate(); 3979 delete mParamHeap; 3980 mParamHeap = NULL; 3981 3982 mParameters = NULL; 3983 } 3984 3985 /*=========================================================================== 3986 * FUNCTION : calcMaxJpegSize 3987 * 3988 * DESCRIPTION: Calculates maximum jpeg size supported by the cameraId 3989 * 3990 * PARAMETERS : 3991 * 3992 * RETURN : max_jpeg_size 3993 *==========================================================================*/ 3994 int QCamera3HardwareInterface::calcMaxJpegSize(uint8_t camera_id) 3995 { 3996 int32_t max_jpeg_size = 0; 3997 int temp_width, temp_height; 3998 for (int i = 0; i < gCamCapability[camera_id]->picture_sizes_tbl_cnt; i++) { 3999 temp_width = gCamCapability[camera_id]->picture_sizes_tbl[i].width; 4000 temp_height = gCamCapability[camera_id]->picture_sizes_tbl[i].height; 4001 if (temp_width * temp_height > max_jpeg_size ) { 4002 max_jpeg_size = temp_width * temp_height; 4003 } 4004 } 4005 max_jpeg_size = max_jpeg_size * 3/2 + sizeof(camera3_jpeg_blob_t); 4006 return max_jpeg_size; 4007 } 4008 4009 /*=========================================================================== 4010 * FUNCTION : getMaxRawSize 4011 * 4012 * DESCRIPTION: Fetches maximum raw size supported by the cameraId 4013 * 4014 * PARAMETERS : 4015 * 4016 * RETURN : Largest supported Raw Dimension 4017 *==========================================================================*/ 4018 cam_dimension_t QCamera3HardwareInterface::getMaxRawSize(uint8_t camera_id) 4019 { 4020 int max_width = 0; 4021 cam_dimension_t maxRawSize; 4022 4023 memset(&maxRawSize, 0, sizeof(cam_dimension_t)); 4024 for (int i = 0; i < gCamCapability[camera_id]->supported_raw_dim_cnt; i++) { 4025 if (max_width < gCamCapability[camera_id]->raw_dim[i].width) { 4026 max_width = gCamCapability[camera_id]->raw_dim[i].width; 4027 maxRawSize = gCamCapability[camera_id]->raw_dim[i]; 4028 } 4029 } 4030 return maxRawSize; 4031 } 4032 4033 4034 /*=========================================================================== 4035 * FUNCTION : calcMaxJpegDim 4036 * 4037 * DESCRIPTION: Calculates maximum jpeg dimension supported by the cameraId 4038 * 4039 * PARAMETERS : 4040 * 4041 * RETURN : max_jpeg_dim 4042 *==========================================================================*/ 4043 cam_dimension_t QCamera3HardwareInterface::calcMaxJpegDim() 4044 { 4045 cam_dimension_t max_jpeg_dim; 4046 cam_dimension_t curr_jpeg_dim; 4047 max_jpeg_dim.width = 0; 4048 max_jpeg_dim.height = 0; 4049 curr_jpeg_dim.width = 0; 4050 curr_jpeg_dim.height = 0; 4051 for (int i = 0; i < gCamCapability[mCameraId]->picture_sizes_tbl_cnt; i++) { 4052 curr_jpeg_dim.width = gCamCapability[mCameraId]->picture_sizes_tbl[i].width; 4053 curr_jpeg_dim.height = gCamCapability[mCameraId]->picture_sizes_tbl[i].height; 4054 if (curr_jpeg_dim.width * curr_jpeg_dim.height > 4055 max_jpeg_dim.width * max_jpeg_dim.height ) { 4056 max_jpeg_dim.width = curr_jpeg_dim.width; 4057 max_jpeg_dim.height = curr_jpeg_dim.height; 4058 } 4059 } 4060 return max_jpeg_dim; 4061 } 4062 4063 4064 /*=========================================================================== 4065 * FUNCTION : initStaticMetadata 4066 * 4067 * DESCRIPTION: initialize the static metadata 4068 * 4069 * PARAMETERS : 4070 * @cameraId : camera Id 4071 * 4072 * RETURN : int32_t type of status 4073 * 0 -- success 4074 * non-zero failure code 4075 *==========================================================================*/ 4076 int QCamera3HardwareInterface::initStaticMetadata(int cameraId) 4077 { 4078 int rc = 0; 4079 CameraMetadata staticInfo; 4080 4081 bool facingBack = gCamCapability[cameraId]->position == CAM_POSITION_BACK; 4082 if (!facingBack) 4083 gCamCapability[cameraId]->supported_raw_dim_cnt = 0; 4084 4085 /* android.info: hardware level */ 4086 uint8_t supportedHardwareLevel = (facingBack)? ANDROID_INFO_SUPPORTED_HARDWARE_LEVEL_FULL: 4087 ANDROID_INFO_SUPPORTED_HARDWARE_LEVEL_LIMITED; 4088 staticInfo.update(ANDROID_INFO_SUPPORTED_HARDWARE_LEVEL, 4089 &supportedHardwareLevel, 1); 4090 /*HAL 3 only*/ 4091 staticInfo.update(ANDROID_LENS_INFO_MINIMUM_FOCUS_DISTANCE, 4092 &gCamCapability[cameraId]->min_focus_distance, 1); 4093 4094 staticInfo.update(ANDROID_LENS_INFO_HYPERFOCAL_DISTANCE, 4095 &gCamCapability[cameraId]->hyper_focal_distance, 1); 4096 4097 /*should be using focal lengths but sensor doesn't provide that info now*/ 4098 staticInfo.update(ANDROID_LENS_INFO_AVAILABLE_FOCAL_LENGTHS, 4099 &gCamCapability[cameraId]->focal_length, 4100 1); 4101 4102 staticInfo.update(ANDROID_LENS_INFO_AVAILABLE_APERTURES, 4103 gCamCapability[cameraId]->apertures, 4104 gCamCapability[cameraId]->apertures_count); 4105 4106 staticInfo.update(ANDROID_LENS_INFO_AVAILABLE_FILTER_DENSITIES, 4107 gCamCapability[cameraId]->filter_densities, 4108 gCamCapability[cameraId]->filter_densities_count); 4109 4110 4111 staticInfo.update(ANDROID_LENS_INFO_AVAILABLE_OPTICAL_STABILIZATION, 4112 (uint8_t*)gCamCapability[cameraId]->optical_stab_modes, 4113 gCamCapability[cameraId]->optical_stab_modes_count); 4114 4115 staticInfo.update(ANDROID_LENS_POSITION, 4116 gCamCapability[cameraId]->lens_position, 4117 sizeof(gCamCapability[cameraId]->lens_position)/ sizeof(float)); 4118 4119 int32_t lens_shading_map_size[] = {gCamCapability[cameraId]->lens_shading_map_size.width, 4120 gCamCapability[cameraId]->lens_shading_map_size.height}; 4121 staticInfo.update(ANDROID_LENS_INFO_SHADING_MAP_SIZE, 4122 lens_shading_map_size, 4123 sizeof(lens_shading_map_size)/sizeof(int32_t)); 4124 4125 staticInfo.update(ANDROID_SENSOR_INFO_PHYSICAL_SIZE, 4126 gCamCapability[cameraId]->sensor_physical_size, 2); 4127 4128 staticInfo.update(ANDROID_SENSOR_INFO_EXPOSURE_TIME_RANGE, 4129 gCamCapability[cameraId]->exposure_time_range, 2); 4130 4131 staticInfo.update(ANDROID_SENSOR_INFO_MAX_FRAME_DURATION, 4132 &gCamCapability[cameraId]->max_frame_duration, 1); 4133 4134 camera_metadata_rational baseGainFactor = { 4135 gCamCapability[cameraId]->base_gain_factor.numerator, 4136 gCamCapability[cameraId]->base_gain_factor.denominator}; 4137 staticInfo.update(ANDROID_SENSOR_BASE_GAIN_FACTOR, 4138 &baseGainFactor, 1); 4139 4140 staticInfo.update(ANDROID_SENSOR_INFO_COLOR_FILTER_ARRANGEMENT, 4141 (uint8_t*)&gCamCapability[cameraId]->color_arrangement, 1); 4142 4143 int32_t pixel_array_size[] = {gCamCapability[cameraId]->pixel_array_size.width, 4144 gCamCapability[cameraId]->pixel_array_size.height}; 4145 staticInfo.update(ANDROID_SENSOR_INFO_PIXEL_ARRAY_SIZE, 4146 pixel_array_size, 2); 4147 4148 int32_t active_array_size[] = {gCamCapability[cameraId]->active_array_size.left, 4149 gCamCapability[cameraId]->active_array_size.top, 4150 gCamCapability[cameraId]->active_array_size.width, 4151 gCamCapability[cameraId]->active_array_size.height}; 4152 staticInfo.update(ANDROID_SENSOR_INFO_ACTIVE_ARRAY_SIZE, 4153 active_array_size, 4); 4154 4155 staticInfo.update(ANDROID_SENSOR_INFO_WHITE_LEVEL, 4156 &gCamCapability[cameraId]->white_level, 1); 4157 4158 staticInfo.update(ANDROID_SENSOR_BLACK_LEVEL_PATTERN, 4159 gCamCapability[cameraId]->black_level_pattern, 4); 4160 4161 staticInfo.update(ANDROID_FLASH_INFO_CHARGE_DURATION, 4162 &gCamCapability[cameraId]->flash_charge_duration, 1); 4163 4164 staticInfo.update(ANDROID_TONEMAP_MAX_CURVE_POINTS, 4165 &gCamCapability[cameraId]->max_tone_map_curve_points, 1); 4166 4167 int32_t maxFaces = gCamCapability[cameraId]->max_num_roi; 4168 staticInfo.update(ANDROID_STATISTICS_INFO_MAX_FACE_COUNT, 4169 (int32_t*)&maxFaces, 1); 4170 4171 uint8_t timestampSource = ANDROID_SENSOR_INFO_TIMESTAMP_SOURCE_UNKNOWN; 4172 if (0 && gCamCapability[cameraId]->isTimestampCalibrated) { 4173 timestampSource = ANDROID_SENSOR_INFO_TIMESTAMP_SOURCE_REALTIME; 4174 } 4175 staticInfo.update(ANDROID_SENSOR_INFO_TIMESTAMP_SOURCE, 4176 ×tampSource, 1); 4177 4178 staticInfo.update(ANDROID_STATISTICS_INFO_HISTOGRAM_BUCKET_COUNT, 4179 &gCamCapability[cameraId]->histogram_size, 1); 4180 4181 staticInfo.update(ANDROID_STATISTICS_INFO_MAX_HISTOGRAM_COUNT, 4182 &gCamCapability[cameraId]->max_histogram_count, 1); 4183 4184 int32_t sharpness_map_size[] = {gCamCapability[cameraId]->sharpness_map_size.width, 4185 gCamCapability[cameraId]->sharpness_map_size.height}; 4186 4187 staticInfo.update(ANDROID_STATISTICS_INFO_SHARPNESS_MAP_SIZE, 4188 sharpness_map_size, sizeof(sharpness_map_size)/sizeof(int32_t)); 4189 4190 staticInfo.update(ANDROID_STATISTICS_INFO_MAX_SHARPNESS_MAP_VALUE, 4191 &gCamCapability[cameraId]->max_sharpness_map_value, 1); 4192 4193 int32_t scalar_formats[] = { 4194 ANDROID_SCALER_AVAILABLE_FORMATS_RAW_OPAQUE, 4195 ANDROID_SCALER_AVAILABLE_FORMATS_RAW16, 4196 ANDROID_SCALER_AVAILABLE_FORMATS_YCbCr_420_888, 4197 ANDROID_SCALER_AVAILABLE_FORMATS_BLOB, 4198 HAL_PIXEL_FORMAT_RAW10, 4199 HAL_PIXEL_FORMAT_IMPLEMENTATION_DEFINED}; 4200 int scalar_formats_count = sizeof(scalar_formats)/sizeof(int32_t); 4201 staticInfo.update(ANDROID_SCALER_AVAILABLE_FORMATS, 4202 scalar_formats, 4203 scalar_formats_count); 4204 4205 int32_t available_processed_sizes[MAX_SIZES_CNT * 2]; 4206 makeTable(gCamCapability[cameraId]->picture_sizes_tbl, 4207 gCamCapability[cameraId]->picture_sizes_tbl_cnt, 4208 available_processed_sizes); 4209 staticInfo.update(ANDROID_SCALER_AVAILABLE_PROCESSED_SIZES, 4210 available_processed_sizes, 4211 (gCamCapability[cameraId]->picture_sizes_tbl_cnt) * 2); 4212 4213 int32_t available_raw_sizes[MAX_SIZES_CNT * 2]; 4214 makeTable(gCamCapability[cameraId]->raw_dim, 4215 gCamCapability[cameraId]->supported_raw_dim_cnt, 4216 available_raw_sizes); 4217 staticInfo.update(ANDROID_SCALER_AVAILABLE_RAW_SIZES, 4218 available_raw_sizes, 4219 gCamCapability[cameraId]->supported_raw_dim_cnt * 2); 4220 4221 int32_t available_fps_ranges[MAX_SIZES_CNT * 2]; 4222 makeFPSTable(gCamCapability[cameraId]->fps_ranges_tbl, 4223 gCamCapability[cameraId]->fps_ranges_tbl_cnt, 4224 available_fps_ranges); 4225 staticInfo.update(ANDROID_CONTROL_AE_AVAILABLE_TARGET_FPS_RANGES, 4226 available_fps_ranges, (gCamCapability[cameraId]->fps_ranges_tbl_cnt*2) ); 4227 4228 camera_metadata_rational exposureCompensationStep = { 4229 gCamCapability[cameraId]->exp_compensation_step.numerator, 4230 gCamCapability[cameraId]->exp_compensation_step.denominator}; 4231 staticInfo.update(ANDROID_CONTROL_AE_COMPENSATION_STEP, 4232 &exposureCompensationStep, 1); 4233 4234 uint8_t availableVstabModes[] = {ANDROID_CONTROL_VIDEO_STABILIZATION_MODE_OFF}; 4235 staticInfo.update(ANDROID_CONTROL_AVAILABLE_VIDEO_STABILIZATION_MODES, 4236 availableVstabModes, sizeof(availableVstabModes)); 4237 4238 /*HAL 1 and HAL 3 common*/ 4239 float maxZoom = 4; 4240 staticInfo.update(ANDROID_SCALER_AVAILABLE_MAX_DIGITAL_ZOOM, 4241 &maxZoom, 1); 4242 4243 uint8_t croppingType = ANDROID_SCALER_CROPPING_TYPE_FREEFORM; 4244 staticInfo.update(ANDROID_SCALER_CROPPING_TYPE, &croppingType, 1); 4245 4246 int32_t max3aRegions[3] = {/*AE*/1,/*AWB*/ 0,/*AF*/ 1}; 4247 if (gCamCapability[cameraId]->supported_focus_modes_cnt == 1) 4248 max3aRegions[2] = 0; /* AF not supported */ 4249 staticInfo.update(ANDROID_CONTROL_MAX_REGIONS, 4250 max3aRegions, 3); 4251 4252 uint8_t availableFaceDetectModes[] = { 4253 ANDROID_STATISTICS_FACE_DETECT_MODE_OFF, 4254 ANDROID_STATISTICS_FACE_DETECT_MODE_FULL }; 4255 staticInfo.update(ANDROID_STATISTICS_INFO_AVAILABLE_FACE_DETECT_MODES, 4256 availableFaceDetectModes, 4257 sizeof(availableFaceDetectModes)); 4258 4259 int32_t exposureCompensationRange[] = {gCamCapability[cameraId]->exposure_compensation_min, 4260 gCamCapability[cameraId]->exposure_compensation_max}; 4261 staticInfo.update(ANDROID_CONTROL_AE_COMPENSATION_RANGE, 4262 exposureCompensationRange, 4263 sizeof(exposureCompensationRange)/sizeof(int32_t)); 4264 4265 uint8_t lensFacing = (facingBack) ? 4266 ANDROID_LENS_FACING_BACK : ANDROID_LENS_FACING_FRONT; 4267 staticInfo.update(ANDROID_LENS_FACING, &lensFacing, 1); 4268 4269 staticInfo.update(ANDROID_JPEG_AVAILABLE_THUMBNAIL_SIZES, 4270 available_thumbnail_sizes, 4271 sizeof(available_thumbnail_sizes)/sizeof(int32_t)); 4272 4273 /*all sizes will be clubbed into this tag*/ 4274 int32_t available_jpeg_sizes[MAX_SIZES_CNT * 2]; 4275 uint8_t jpeg_sizes_cnt = filterJpegSizes(available_jpeg_sizes, available_processed_sizes, 4276 (gCamCapability[cameraId]->picture_sizes_tbl_cnt) * 2, 4277 MAX_SIZES_CNT * 2, 4278 gCamCapability[cameraId]->active_array_size, 4279 gCamCapability[cameraId]->max_downscale_factor); 4280 /*android.scaler.availableStreamConfigurations*/ 4281 int32_t max_stream_configs_size = 4282 gCamCapability[cameraId]->picture_sizes_tbl_cnt * 4283 sizeof(scalar_formats)/sizeof(int32_t) * 4; 4284 int32_t available_stream_configs[max_stream_configs_size]; 4285 int idx = 0; 4286 for (int j = 0; j < scalar_formats_count; j++) { 4287 switch (scalar_formats[j]) { 4288 case ANDROID_SCALER_AVAILABLE_FORMATS_RAW16: 4289 case ANDROID_SCALER_AVAILABLE_FORMATS_RAW_OPAQUE: 4290 case HAL_PIXEL_FORMAT_RAW10: 4291 for (int i = 0; 4292 i < gCamCapability[cameraId]->supported_raw_dim_cnt; i++) { 4293 available_stream_configs[idx] = scalar_formats[j]; 4294 available_stream_configs[idx+1] = 4295 gCamCapability[cameraId]->raw_dim[i].width; 4296 available_stream_configs[idx+2] = 4297 gCamCapability[cameraId]->raw_dim[i].height; 4298 available_stream_configs[idx+3] = 4299 ANDROID_SCALER_AVAILABLE_STREAM_CONFIGURATIONS_OUTPUT; 4300 idx+=4; 4301 } 4302 break; 4303 case HAL_PIXEL_FORMAT_BLOB: 4304 for (int i = 0; i < jpeg_sizes_cnt/2; i++) { 4305 available_stream_configs[idx] = scalar_formats[j]; 4306 available_stream_configs[idx+1] = available_jpeg_sizes[i*2]; 4307 available_stream_configs[idx+2] = available_jpeg_sizes[i*2+1]; 4308 available_stream_configs[idx+3] = ANDROID_SCALER_AVAILABLE_STREAM_CONFIGURATIONS_OUTPUT; 4309 idx+=4; 4310 } 4311 break; 4312 default: 4313 for (int i = 0; 4314 i < gCamCapability[cameraId]->picture_sizes_tbl_cnt; i++) { 4315 available_stream_configs[idx] = scalar_formats[j]; 4316 available_stream_configs[idx+1] = 4317 gCamCapability[cameraId]->picture_sizes_tbl[i].width; 4318 available_stream_configs[idx+2] = 4319 gCamCapability[cameraId]->picture_sizes_tbl[i].height; 4320 available_stream_configs[idx+3] = 4321 ANDROID_SCALER_AVAILABLE_STREAM_CONFIGURATIONS_OUTPUT; 4322 idx+=4; 4323 } 4324 4325 4326 break; 4327 } 4328 } 4329 staticInfo.update(ANDROID_SCALER_AVAILABLE_STREAM_CONFIGURATIONS, 4330 available_stream_configs, idx); 4331 static const uint8_t hotpixelMode = ANDROID_HOT_PIXEL_MODE_FAST; 4332 staticInfo.update(ANDROID_HOT_PIXEL_MODE, &hotpixelMode, 1); 4333 4334 static const uint8_t hotPixelMapMode = ANDROID_STATISTICS_HOT_PIXEL_MAP_MODE_OFF; 4335 staticInfo.update(ANDROID_STATISTICS_HOT_PIXEL_MAP_MODE, &hotPixelMapMode, 1); 4336 4337 /* android.scaler.availableMinFrameDurations */ 4338 int64_t available_min_durations[max_stream_configs_size]; 4339 idx = 0; 4340 for (int j = 0; j < scalar_formats_count; j++) { 4341 switch (scalar_formats[j]) { 4342 case ANDROID_SCALER_AVAILABLE_FORMATS_RAW16: 4343 case ANDROID_SCALER_AVAILABLE_FORMATS_RAW_OPAQUE: 4344 case HAL_PIXEL_FORMAT_RAW10: 4345 for (int i = 0; 4346 i < gCamCapability[cameraId]->supported_raw_dim_cnt; i++) { 4347 available_min_durations[idx] = scalar_formats[j]; 4348 available_min_durations[idx+1] = 4349 gCamCapability[cameraId]->raw_dim[i].width; 4350 available_min_durations[idx+2] = 4351 gCamCapability[cameraId]->raw_dim[i].height; 4352 available_min_durations[idx+3] = 4353 gCamCapability[cameraId]->raw_min_duration[i]; 4354 idx+=4; 4355 } 4356 break; 4357 default: 4358 for (int i = 0; 4359 i < gCamCapability[cameraId]->picture_sizes_tbl_cnt; i++) { 4360 available_min_durations[idx] = scalar_formats[j]; 4361 available_min_durations[idx+1] = 4362 gCamCapability[cameraId]->picture_sizes_tbl[i].width; 4363 available_min_durations[idx+2] = 4364 gCamCapability[cameraId]->picture_sizes_tbl[i].height; 4365 available_min_durations[idx+3] = 4366 gCamCapability[cameraId]->picture_min_duration[i]; 4367 idx+=4; 4368 } 4369 break; 4370 } 4371 } 4372 staticInfo.update(ANDROID_SCALER_AVAILABLE_MIN_FRAME_DURATIONS, 4373 &available_min_durations[0], idx); 4374 4375 int32_t max_jpeg_size = calcMaxJpegSize(cameraId); 4376 staticInfo.update(ANDROID_JPEG_MAX_SIZE, 4377 &max_jpeg_size, 1); 4378 4379 uint8_t avail_effects[CAM_EFFECT_MODE_MAX]; 4380 size_t size = 0; 4381 for (int i = 0; i < gCamCapability[cameraId]->supported_effects_cnt; i++) { 4382 int32_t val = lookupFwkName(EFFECT_MODES_MAP, 4383 sizeof(EFFECT_MODES_MAP)/sizeof(EFFECT_MODES_MAP[0]), 4384 gCamCapability[cameraId]->supported_effects[i]); 4385 if (val != NAME_NOT_FOUND) { 4386 avail_effects[size] = (uint8_t)val; 4387 size++; 4388 } 4389 } 4390 staticInfo.update(ANDROID_CONTROL_AVAILABLE_EFFECTS, 4391 avail_effects, 4392 size); 4393 4394 uint8_t avail_scene_modes[CAM_SCENE_MODE_MAX]; 4395 uint8_t supported_indexes[CAM_SCENE_MODE_MAX]; 4396 int32_t supported_scene_modes_cnt = 0; 4397 for (int i = 0; i < gCamCapability[cameraId]->supported_scene_modes_cnt; i++) { 4398 int32_t val = lookupFwkName(SCENE_MODES_MAP, 4399 sizeof(SCENE_MODES_MAP)/sizeof(SCENE_MODES_MAP[0]), 4400 gCamCapability[cameraId]->supported_scene_modes[i]); 4401 if (val != NAME_NOT_FOUND) { 4402 avail_scene_modes[supported_scene_modes_cnt] = (uint8_t)val; 4403 supported_indexes[supported_scene_modes_cnt] = i; 4404 supported_scene_modes_cnt++; 4405 } 4406 } 4407 4408 staticInfo.update(ANDROID_CONTROL_AVAILABLE_SCENE_MODES, 4409 avail_scene_modes, 4410 supported_scene_modes_cnt); 4411 4412 uint8_t scene_mode_overrides[CAM_SCENE_MODE_MAX * 3]; 4413 makeOverridesList(gCamCapability[cameraId]->scene_mode_overrides, 4414 supported_scene_modes_cnt, 4415 scene_mode_overrides, 4416 supported_indexes, 4417 cameraId); 4418 staticInfo.update(ANDROID_CONTROL_SCENE_MODE_OVERRIDES, 4419 scene_mode_overrides, 4420 supported_scene_modes_cnt*3); 4421 4422 uint8_t avail_antibanding_modes[CAM_ANTIBANDING_MODE_MAX]; 4423 size = 0; 4424 for (int i = 0; i < gCamCapability[cameraId]->supported_antibandings_cnt; i++) { 4425 int32_t val = lookupFwkName(ANTIBANDING_MODES_MAP, 4426 sizeof(ANTIBANDING_MODES_MAP)/sizeof(ANTIBANDING_MODES_MAP[0]), 4427 gCamCapability[cameraId]->supported_antibandings[i]); 4428 if (val != NAME_NOT_FOUND) { 4429 avail_antibanding_modes[size] = (uint8_t)val; 4430 size++; 4431 } 4432 4433 } 4434 staticInfo.update(ANDROID_CONTROL_AE_AVAILABLE_ANTIBANDING_MODES, 4435 avail_antibanding_modes, 4436 size); 4437 4438 uint8_t avail_abberation_modes[CAM_COLOR_CORRECTION_ABERRATION_MAX]; 4439 size = 0; 4440 if (0 == gCamCapability[cameraId]->aberration_modes_count) { 4441 avail_abberation_modes[0] = 4442 ANDROID_COLOR_CORRECTION_ABERRATION_MODE_OFF; 4443 size++; 4444 } else { 4445 for (size_t i = 0; i < gCamCapability[cameraId]->aberration_modes_count; i++) { 4446 int32_t val = lookupFwkName(COLOR_ABERRATION_MAP, 4447 sizeof(COLOR_ABERRATION_MAP)/sizeof(COLOR_ABERRATION_MAP[0]), 4448 gCamCapability[cameraId]->aberration_modes[i]); 4449 if (val != NAME_NOT_FOUND) { 4450 avail_abberation_modes[size] = (uint8_t)val; 4451 size++; 4452 } else { 4453 ALOGE("%s: Invalid CAC mode %d", __func__, 4454 gCamCapability[cameraId]->aberration_modes[i]); 4455 break; 4456 } 4457 } 4458 4459 } 4460 staticInfo.update(ANDROID_COLOR_CORRECTION_AVAILABLE_ABERRATION_MODES, 4461 avail_abberation_modes, 4462 size); 4463 4464 char cafProp[PROPERTY_VALUE_MAX]; 4465 memset(cafProp, 0, sizeof(cafProp)); 4466 property_get("persist.camera.caf.disable", cafProp, "0"); 4467 uint8_t cafDisabled = atoi(cafProp); 4468 4469 uint8_t avail_af_modes[CAM_FOCUS_MODE_MAX]; 4470 size = 0; 4471 for (int i = 0; i < gCamCapability[cameraId]->supported_focus_modes_cnt; i++) { 4472 if (cafDisabled && 4473 ((gCamCapability[cameraId]->supported_focus_modes[i] 4474 == CAM_FOCUS_MODE_CONTINOUS_PICTURE) || 4475 (gCamCapability[cameraId]->supported_focus_modes[i] 4476 == CAM_FOCUS_MODE_CONTINOUS_VIDEO))) 4477 continue; 4478 4479 int32_t val = lookupFwkName(FOCUS_MODES_MAP, 4480 sizeof(FOCUS_MODES_MAP)/sizeof(FOCUS_MODES_MAP[0]), 4481 gCamCapability[cameraId]->supported_focus_modes[i]); 4482 if (val != NAME_NOT_FOUND) { 4483 avail_af_modes[size] = (uint8_t)val; 4484 size++; 4485 } 4486 } 4487 staticInfo.update(ANDROID_CONTROL_AF_AVAILABLE_MODES, 4488 avail_af_modes, 4489 size); 4490 4491 uint8_t avail_awb_modes[CAM_WB_MODE_MAX]; 4492 size = 0; 4493 for (int i = 0; i < gCamCapability[cameraId]->supported_white_balances_cnt; i++) { 4494 int32_t val = lookupFwkName(WHITE_BALANCE_MODES_MAP, 4495 sizeof(WHITE_BALANCE_MODES_MAP)/sizeof(WHITE_BALANCE_MODES_MAP[0]), 4496 gCamCapability[cameraId]->supported_white_balances[i]); 4497 if (val != NAME_NOT_FOUND) { 4498 avail_awb_modes[size] = (uint8_t)val; 4499 size++; 4500 } 4501 } 4502 staticInfo.update(ANDROID_CONTROL_AWB_AVAILABLE_MODES, 4503 avail_awb_modes, 4504 size); 4505 4506 uint8_t available_flash_levels[CAM_FLASH_FIRING_LEVEL_MAX]; 4507 for (int i = 0; i < gCamCapability[cameraId]->supported_flash_firing_level_cnt; i++) 4508 available_flash_levels[i] = gCamCapability[cameraId]->supported_firing_levels[i]; 4509 4510 staticInfo.update(ANDROID_FLASH_FIRING_POWER, 4511 available_flash_levels, 4512 gCamCapability[cameraId]->supported_flash_firing_level_cnt); 4513 4514 uint8_t flashAvailable; 4515 if (gCamCapability[cameraId]->flash_available) 4516 flashAvailable = ANDROID_FLASH_INFO_AVAILABLE_TRUE; 4517 else 4518 flashAvailable = ANDROID_FLASH_INFO_AVAILABLE_FALSE; 4519 staticInfo.update(ANDROID_FLASH_INFO_AVAILABLE, 4520 &flashAvailable, 1); 4521 4522 uint8_t avail_ae_modes[5]; 4523 size = 0; 4524 for (int i = 0; i < gCamCapability[cameraId]->supported_ae_modes_cnt; i++) { 4525 avail_ae_modes[i] = gCamCapability[cameraId]->supported_ae_modes[i]; 4526 size++; 4527 } 4528 if (flashAvailable) { 4529 avail_ae_modes[size++] = ANDROID_CONTROL_AE_MODE_ON_AUTO_FLASH; 4530 avail_ae_modes[size++] = ANDROID_CONTROL_AE_MODE_ON_ALWAYS_FLASH; 4531 avail_ae_modes[size++] = ANDROID_CONTROL_AE_MODE_ON_AUTO_FLASH_REDEYE; 4532 } 4533 staticInfo.update(ANDROID_CONTROL_AE_AVAILABLE_MODES, 4534 avail_ae_modes, 4535 size); 4536 4537 int32_t sensitivity_range[2]; 4538 sensitivity_range[0] = gCamCapability[cameraId]->sensitivity_range.min_sensitivity; 4539 sensitivity_range[1] = gCamCapability[cameraId]->sensitivity_range.max_sensitivity; 4540 staticInfo.update(ANDROID_SENSOR_INFO_SENSITIVITY_RANGE, 4541 sensitivity_range, 4542 sizeof(sensitivity_range) / sizeof(int32_t)); 4543 4544 staticInfo.update(ANDROID_SENSOR_MAX_ANALOG_SENSITIVITY, 4545 &gCamCapability[cameraId]->max_analog_sensitivity, 4546 1); 4547 4548 int32_t sensor_orientation = (int32_t)gCamCapability[cameraId]->sensor_mount_angle; 4549 staticInfo.update(ANDROID_SENSOR_ORIENTATION, 4550 &sensor_orientation, 4551 1); 4552 4553 int32_t max_output_streams[3] = { 4554 MAX_STALLING_STREAMS, 4555 MAX_PROCESSED_STREAMS, 4556 MAX_RAW_STREAMS}; 4557 staticInfo.update(ANDROID_REQUEST_MAX_NUM_OUTPUT_STREAMS, 4558 max_output_streams, 4559 3); 4560 4561 uint8_t avail_leds = 0; 4562 staticInfo.update(ANDROID_LED_AVAILABLE_LEDS, 4563 &avail_leds, 0); 4564 4565 uint8_t focus_dist_calibrated; 4566 int32_t val = lookupFwkName(FOCUS_CALIBRATION_MAP, 4567 sizeof(FOCUS_CALIBRATION_MAP)/sizeof(FOCUS_CALIBRATION_MAP[0]), 4568 gCamCapability[cameraId]->focus_dist_calibrated); 4569 if (val != NAME_NOT_FOUND) { 4570 focus_dist_calibrated = (uint8_t)val; 4571 staticInfo.update(ANDROID_LENS_INFO_FOCUS_DISTANCE_CALIBRATION, 4572 &focus_dist_calibrated, 1); 4573 } 4574 4575 int32_t avail_testpattern_modes[MAX_TEST_PATTERN_CNT]; 4576 size = 0; 4577 for (int i = 0; i < gCamCapability[cameraId]->supported_test_pattern_modes_cnt; 4578 i++) { 4579 int32_t val = lookupFwkName(TEST_PATTERN_MAP, 4580 sizeof(TEST_PATTERN_MAP)/sizeof(TEST_PATTERN_MAP[0]), 4581 gCamCapability[cameraId]->supported_test_pattern_modes[i]); 4582 if (val != NAME_NOT_FOUND) { 4583 avail_testpattern_modes[size] = val; 4584 size++; 4585 } 4586 } 4587 staticInfo.update(ANDROID_SENSOR_AVAILABLE_TEST_PATTERN_MODES, 4588 avail_testpattern_modes, 4589 size); 4590 4591 uint8_t max_pipeline_depth = MAX_INFLIGHT_REQUESTS + EMPTY_PIPELINE_DELAY + FRAME_SKIP_DELAY; 4592 staticInfo.update(ANDROID_REQUEST_PIPELINE_MAX_DEPTH, 4593 &max_pipeline_depth, 4594 1); 4595 4596 int32_t partial_result_count = PARTIAL_RESULT_COUNT; 4597 staticInfo.update(ANDROID_REQUEST_PARTIAL_RESULT_COUNT, 4598 &partial_result_count, 4599 1); 4600 4601 uint8_t available_capabilities[MAX_AVAILABLE_CAPABILITIES]; 4602 uint8_t available_capabilities_count = 0; 4603 available_capabilities[available_capabilities_count++] = ANDROID_REQUEST_AVAILABLE_CAPABILITIES_BACKWARD_COMPATIBLE; 4604 available_capabilities[available_capabilities_count++] = ANDROID_REQUEST_AVAILABLE_CAPABILITIES_MANUAL_SENSOR; 4605 available_capabilities[available_capabilities_count++] = ANDROID_REQUEST_AVAILABLE_CAPABILITIES_MANUAL_POST_PROCESSING; 4606 available_capabilities[available_capabilities_count++] = ANDROID_REQUEST_AVAILABLE_CAPABILITIES_READ_SENSOR_SETTINGS; 4607 available_capabilities[available_capabilities_count++] = ANDROID_REQUEST_AVAILABLE_CAPABILITIES_BURST_CAPTURE; 4608 if (facingBack) { 4609 available_capabilities[available_capabilities_count++] = ANDROID_REQUEST_AVAILABLE_CAPABILITIES_RAW; 4610 } 4611 staticInfo.update(ANDROID_REQUEST_AVAILABLE_CAPABILITIES, 4612 available_capabilities, 4613 available_capabilities_count); 4614 4615 int32_t max_input_streams = 0; 4616 staticInfo.update(ANDROID_REQUEST_MAX_NUM_INPUT_STREAMS, 4617 &max_input_streams, 4618 1); 4619 4620 int32_t io_format_map[] = {}; 4621 staticInfo.update(ANDROID_SCALER_AVAILABLE_INPUT_OUTPUT_FORMATS_MAP, 4622 io_format_map, 0); 4623 4624 int32_t max_latency = (facingBack)? ANDROID_SYNC_MAX_LATENCY_PER_FRAME_CONTROL:CAM_MAX_SYNC_LATENCY; 4625 staticInfo.update(ANDROID_SYNC_MAX_LATENCY, 4626 &max_latency, 4627 1); 4628 4629 float optical_axis_angle[2]; 4630 optical_axis_angle[0] = 0; //need to verify 4631 optical_axis_angle[1] = 0; //need to verify 4632 staticInfo.update(ANDROID_LENS_OPTICAL_AXIS_ANGLE, 4633 optical_axis_angle, 4634 2); 4635 4636 uint8_t available_hot_pixel_modes[] = {ANDROID_HOT_PIXEL_MODE_FAST}; 4637 staticInfo.update(ANDROID_HOT_PIXEL_AVAILABLE_HOT_PIXEL_MODES, 4638 available_hot_pixel_modes, 4639 1); 4640 4641 uint8_t available_edge_modes[] = {ANDROID_EDGE_MODE_OFF, 4642 ANDROID_EDGE_MODE_FAST}; 4643 staticInfo.update(ANDROID_EDGE_AVAILABLE_EDGE_MODES, 4644 available_edge_modes, 4645 2); 4646 4647 uint8_t available_noise_red_modes[] = {ANDROID_NOISE_REDUCTION_MODE_OFF, 4648 ANDROID_NOISE_REDUCTION_MODE_FAST}; 4649 staticInfo.update(ANDROID_NOISE_REDUCTION_AVAILABLE_NOISE_REDUCTION_MODES, 4650 available_noise_red_modes, 4651 2); 4652 4653 uint8_t available_tonemap_modes[] = {ANDROID_TONEMAP_MODE_CONTRAST_CURVE, 4654 ANDROID_TONEMAP_MODE_FAST}; 4655 staticInfo.update(ANDROID_TONEMAP_AVAILABLE_TONE_MAP_MODES, 4656 available_tonemap_modes, 4657 2); 4658 4659 uint8_t available_hot_pixel_map_modes[] = {ANDROID_STATISTICS_HOT_PIXEL_MAP_MODE_OFF}; 4660 staticInfo.update(ANDROID_STATISTICS_INFO_AVAILABLE_HOT_PIXEL_MAP_MODES, 4661 available_hot_pixel_map_modes, 4662 1); 4663 4664 uint8_t fwkReferenceIlluminant = lookupFwkName(REFERENCE_ILLUMINANT_MAP, 4665 sizeof(REFERENCE_ILLUMINANT_MAP) / sizeof(REFERENCE_ILLUMINANT_MAP[0]), 4666 gCamCapability[cameraId]->reference_illuminant1); 4667 staticInfo.update(ANDROID_SENSOR_REFERENCE_ILLUMINANT1, 4668 &fwkReferenceIlluminant, 1); 4669 4670 fwkReferenceIlluminant = lookupFwkName(REFERENCE_ILLUMINANT_MAP, 4671 sizeof(REFERENCE_ILLUMINANT_MAP) / sizeof(REFERENCE_ILLUMINANT_MAP[0]), 4672 gCamCapability[cameraId]->reference_illuminant2); 4673 staticInfo.update(ANDROID_SENSOR_REFERENCE_ILLUMINANT2, 4674 &fwkReferenceIlluminant, 1); 4675 4676 staticInfo.update(ANDROID_SENSOR_FORWARD_MATRIX1, 4677 (camera_metadata_rational_t*)gCamCapability[cameraId]->forward_matrix1, 4678 3*3); 4679 4680 staticInfo.update(ANDROID_SENSOR_FORWARD_MATRIX2, 4681 (camera_metadata_rational_t*)gCamCapability[cameraId]->forward_matrix2, 4682 3*3); 4683 4684 staticInfo.update(ANDROID_SENSOR_COLOR_TRANSFORM1, 4685 (camera_metadata_rational_t*) gCamCapability[cameraId]->color_transform1, 4686 3*3); 4687 4688 staticInfo.update(ANDROID_SENSOR_COLOR_TRANSFORM2, 4689 (camera_metadata_rational_t*) gCamCapability[cameraId]->color_transform2, 4690 3*3); 4691 4692 staticInfo.update(ANDROID_SENSOR_CALIBRATION_TRANSFORM1, 4693 (camera_metadata_rational_t*) gCamCapability[cameraId]->calibration_transform1, 4694 3*3); 4695 4696 staticInfo.update(ANDROID_SENSOR_CALIBRATION_TRANSFORM2, 4697 (camera_metadata_rational_t*) gCamCapability[cameraId]->calibration_transform2, 4698 3*3); 4699 4700 int32_t request_keys_basic[] = {ANDROID_COLOR_CORRECTION_MODE, 4701 ANDROID_COLOR_CORRECTION_TRANSFORM, ANDROID_COLOR_CORRECTION_GAINS, 4702 ANDROID_COLOR_CORRECTION_ABERRATION_MODE, 4703 ANDROID_CONTROL_AE_ANTIBANDING_MODE, ANDROID_CONTROL_AE_EXPOSURE_COMPENSATION, 4704 ANDROID_CONTROL_AE_LOCK, ANDROID_CONTROL_AE_MODE, 4705 ANDROID_CONTROL_AE_REGIONS, ANDROID_CONTROL_AE_TARGET_FPS_RANGE, 4706 ANDROID_CONTROL_AE_PRECAPTURE_TRIGGER, ANDROID_CONTROL_AF_MODE, 4707 ANDROID_CONTROL_AF_TRIGGER, ANDROID_CONTROL_AWB_LOCK, 4708 ANDROID_CONTROL_AWB_MODE, ANDROID_CONTROL_CAPTURE_INTENT, 4709 ANDROID_CONTROL_EFFECT_MODE, ANDROID_CONTROL_MODE, 4710 ANDROID_CONTROL_SCENE_MODE, ANDROID_CONTROL_VIDEO_STABILIZATION_MODE, 4711 ANDROID_DEMOSAIC_MODE, ANDROID_EDGE_MODE, ANDROID_EDGE_STRENGTH, 4712 ANDROID_FLASH_FIRING_POWER, ANDROID_FLASH_FIRING_TIME, ANDROID_FLASH_MODE, 4713 ANDROID_JPEG_GPS_COORDINATES, 4714 ANDROID_JPEG_GPS_PROCESSING_METHOD, ANDROID_JPEG_GPS_TIMESTAMP, 4715 ANDROID_JPEG_ORIENTATION, ANDROID_JPEG_QUALITY, ANDROID_JPEG_THUMBNAIL_QUALITY, 4716 ANDROID_JPEG_THUMBNAIL_SIZE, ANDROID_LENS_APERTURE, ANDROID_LENS_FILTER_DENSITY, 4717 ANDROID_LENS_FOCAL_LENGTH, ANDROID_LENS_FOCUS_DISTANCE, 4718 ANDROID_LENS_OPTICAL_STABILIZATION_MODE, ANDROID_NOISE_REDUCTION_MODE, 4719 ANDROID_NOISE_REDUCTION_STRENGTH, ANDROID_REQUEST_ID, ANDROID_REQUEST_TYPE, 4720 ANDROID_SCALER_CROP_REGION, ANDROID_SENSOR_EXPOSURE_TIME, 4721 ANDROID_SENSOR_FRAME_DURATION, ANDROID_HOT_PIXEL_MODE, 4722 ANDROID_STATISTICS_HOT_PIXEL_MAP_MODE, 4723 ANDROID_SENSOR_SENSITIVITY, ANDROID_SHADING_MODE, 4724 ANDROID_SHADING_STRENGTH, ANDROID_STATISTICS_FACE_DETECT_MODE, 4725 ANDROID_STATISTICS_HISTOGRAM_MODE, ANDROID_STATISTICS_SHARPNESS_MAP_MODE, 4726 ANDROID_STATISTICS_LENS_SHADING_MAP_MODE, ANDROID_TONEMAP_CURVE_BLUE, 4727 ANDROID_TONEMAP_CURVE_GREEN, ANDROID_TONEMAP_CURVE_RED, ANDROID_TONEMAP_MODE, 4728 ANDROID_BLACK_LEVEL_LOCK }; 4729 4730 size_t request_keys_cnt = 4731 sizeof(request_keys_basic)/sizeof(request_keys_basic[0]); 4732 //NOTE: Please increase available_request_keys array size before 4733 //adding any new entries. 4734 int32_t available_request_keys[request_keys_cnt+1]; 4735 memcpy(available_request_keys, request_keys_basic, 4736 sizeof(request_keys_basic)); 4737 if (gCamCapability[cameraId]->supported_focus_modes_cnt > 1) { 4738 available_request_keys[request_keys_cnt++] = 4739 ANDROID_CONTROL_AF_REGIONS; 4740 } 4741 //NOTE: Please increase available_request_keys array size before 4742 //adding any new entries. 4743 staticInfo.update(ANDROID_REQUEST_AVAILABLE_REQUEST_KEYS, 4744 available_request_keys, request_keys_cnt); 4745 4746 int32_t result_keys_basic[] = {ANDROID_COLOR_CORRECTION_TRANSFORM, 4747 ANDROID_COLOR_CORRECTION_GAINS, ANDROID_CONTROL_AE_MODE, ANDROID_CONTROL_AE_REGIONS, 4748 ANDROID_CONTROL_AE_STATE, ANDROID_CONTROL_AF_MODE, 4749 ANDROID_CONTROL_AF_STATE, ANDROID_CONTROL_AWB_MODE, 4750 ANDROID_CONTROL_AWB_STATE, ANDROID_CONTROL_MODE, ANDROID_EDGE_MODE, 4751 ANDROID_FLASH_FIRING_POWER, ANDROID_FLASH_FIRING_TIME, ANDROID_FLASH_MODE, 4752 ANDROID_FLASH_STATE, ANDROID_JPEG_GPS_COORDINATES, ANDROID_JPEG_GPS_PROCESSING_METHOD, 4753 ANDROID_JPEG_GPS_TIMESTAMP, ANDROID_JPEG_ORIENTATION, ANDROID_JPEG_QUALITY, 4754 ANDROID_JPEG_THUMBNAIL_QUALITY, ANDROID_JPEG_THUMBNAIL_SIZE, ANDROID_LENS_APERTURE, 4755 ANDROID_LENS_FILTER_DENSITY, ANDROID_LENS_FOCAL_LENGTH, ANDROID_LENS_FOCUS_DISTANCE, 4756 ANDROID_LENS_FOCUS_RANGE, ANDROID_LENS_STATE, ANDROID_LENS_OPTICAL_STABILIZATION_MODE, 4757 ANDROID_NOISE_REDUCTION_MODE, ANDROID_REQUEST_ID, 4758 ANDROID_SCALER_CROP_REGION, ANDROID_SHADING_MODE, ANDROID_SENSOR_EXPOSURE_TIME, 4759 ANDROID_SENSOR_FRAME_DURATION, ANDROID_SENSOR_SENSITIVITY, 4760 ANDROID_SENSOR_TIMESTAMP, ANDROID_SENSOR_NEUTRAL_COLOR_POINT, 4761 ANDROID_SENSOR_PROFILE_TONE_CURVE, ANDROID_BLACK_LEVEL_LOCK, ANDROID_TONEMAP_CURVE_BLUE, 4762 ANDROID_TONEMAP_CURVE_GREEN, ANDROID_TONEMAP_CURVE_RED, ANDROID_TONEMAP_MODE, 4763 ANDROID_STATISTICS_FACE_DETECT_MODE, ANDROID_STATISTICS_HISTOGRAM_MODE, 4764 ANDROID_STATISTICS_SHARPNESS_MAP, ANDROID_STATISTICS_SHARPNESS_MAP_MODE, 4765 ANDROID_STATISTICS_PREDICTED_COLOR_GAINS, ANDROID_STATISTICS_PREDICTED_COLOR_TRANSFORM, 4766 ANDROID_STATISTICS_SCENE_FLICKER, ANDROID_STATISTICS_FACE_IDS, 4767 ANDROID_STATISTICS_FACE_LANDMARKS, ANDROID_STATISTICS_FACE_RECTANGLES, 4768 ANDROID_STATISTICS_FACE_SCORES}; 4769 size_t result_keys_cnt = 4770 sizeof(result_keys_basic)/sizeof(result_keys_basic[0]); 4771 //NOTE: Please increase available_result_keys array size before 4772 //adding any new entries. 4773 int32_t available_result_keys[result_keys_cnt+3]; 4774 memcpy(available_result_keys, result_keys_basic, 4775 sizeof(result_keys_basic)); 4776 if (gCamCapability[cameraId]->supported_focus_modes_cnt > 1) { 4777 available_result_keys[result_keys_cnt++] = 4778 ANDROID_CONTROL_AF_REGIONS; 4779 } 4780 if (facingBack) { 4781 available_result_keys[result_keys_cnt++] = ANDROID_SENSOR_NOISE_PROFILE; 4782 available_result_keys[result_keys_cnt++] = ANDROID_SENSOR_GREEN_SPLIT; 4783 } 4784 //NOTE: Please increase available_result_keys array size before 4785 //adding any new entries. 4786 4787 staticInfo.update(ANDROID_REQUEST_AVAILABLE_RESULT_KEYS, 4788 available_result_keys, result_keys_cnt); 4789 4790 int32_t available_characteristics_keys[] = {ANDROID_CONTROL_AE_AVAILABLE_ANTIBANDING_MODES, 4791 ANDROID_CONTROL_AE_AVAILABLE_MODES, ANDROID_CONTROL_AE_AVAILABLE_TARGET_FPS_RANGES, 4792 ANDROID_CONTROL_AE_COMPENSATION_RANGE, ANDROID_CONTROL_AE_COMPENSATION_STEP, 4793 ANDROID_CONTROL_AF_AVAILABLE_MODES, ANDROID_CONTROL_AVAILABLE_EFFECTS, 4794 ANDROID_COLOR_CORRECTION_AVAILABLE_ABERRATION_MODES, 4795 ANDROID_SCALER_CROPPING_TYPE, 4796 ANDROID_SENSOR_INFO_TIMESTAMP_SOURCE, 4797 ANDROID_SYNC_MAX_LATENCY, 4798 ANDROID_CONTROL_AVAILABLE_SCENE_MODES, 4799 ANDROID_CONTROL_AVAILABLE_VIDEO_STABILIZATION_MODES, 4800 ANDROID_CONTROL_AWB_AVAILABLE_MODES, ANDROID_CONTROL_MAX_REGIONS, 4801 ANDROID_CONTROL_SCENE_MODE_OVERRIDES,ANDROID_FLASH_INFO_AVAILABLE, 4802 ANDROID_FLASH_INFO_CHARGE_DURATION, ANDROID_JPEG_AVAILABLE_THUMBNAIL_SIZES, 4803 ANDROID_JPEG_MAX_SIZE, ANDROID_LENS_INFO_AVAILABLE_APERTURES, 4804 ANDROID_LENS_INFO_AVAILABLE_FILTER_DENSITIES, 4805 ANDROID_LENS_INFO_AVAILABLE_FOCAL_LENGTHS, 4806 ANDROID_LENS_INFO_AVAILABLE_OPTICAL_STABILIZATION, 4807 ANDROID_LENS_INFO_HYPERFOCAL_DISTANCE, ANDROID_LENS_INFO_MINIMUM_FOCUS_DISTANCE, 4808 ANDROID_LENS_INFO_SHADING_MAP_SIZE, ANDROID_LENS_INFO_FOCUS_DISTANCE_CALIBRATION, 4809 ANDROID_LENS_FACING, ANDROID_LENS_OPTICAL_AXIS_ANGLE,ANDROID_LENS_POSITION, 4810 ANDROID_REQUEST_MAX_NUM_OUTPUT_STREAMS, ANDROID_REQUEST_MAX_NUM_INPUT_STREAMS, 4811 ANDROID_REQUEST_PIPELINE_MAX_DEPTH, ANDROID_REQUEST_AVAILABLE_CAPABILITIES, 4812 ANDROID_REQUEST_AVAILABLE_REQUEST_KEYS, ANDROID_REQUEST_AVAILABLE_RESULT_KEYS, 4813 ANDROID_REQUEST_AVAILABLE_CHARACTERISTICS_KEYS, ANDROID_REQUEST_PARTIAL_RESULT_COUNT, 4814 ANDROID_SCALER_AVAILABLE_MAX_DIGITAL_ZOOM, 4815 ANDROID_SCALER_AVAILABLE_INPUT_OUTPUT_FORMATS_MAP, 4816 ANDROID_SCALER_AVAILABLE_STREAM_CONFIGURATIONS, 4817 /*ANDROID_SCALER_AVAILABLE_STALL_DURATIONS,*/ 4818 ANDROID_SCALER_AVAILABLE_MIN_FRAME_DURATIONS, ANDROID_SENSOR_FORWARD_MATRIX1, 4819 ANDROID_SENSOR_REFERENCE_ILLUMINANT1, ANDROID_SENSOR_REFERENCE_ILLUMINANT2, 4820 ANDROID_SENSOR_FORWARD_MATRIX2, ANDROID_SENSOR_COLOR_TRANSFORM1, 4821 ANDROID_SENSOR_COLOR_TRANSFORM2, ANDROID_SENSOR_CALIBRATION_TRANSFORM1, 4822 ANDROID_SENSOR_CALIBRATION_TRANSFORM2, ANDROID_SENSOR_INFO_ACTIVE_ARRAY_SIZE, 4823 ANDROID_SENSOR_INFO_SENSITIVITY_RANGE, ANDROID_SENSOR_INFO_COLOR_FILTER_ARRANGEMENT, 4824 ANDROID_SENSOR_INFO_EXPOSURE_TIME_RANGE, ANDROID_SENSOR_INFO_MAX_FRAME_DURATION, 4825 ANDROID_SENSOR_INFO_PHYSICAL_SIZE, ANDROID_SENSOR_INFO_PIXEL_ARRAY_SIZE, 4826 ANDROID_SENSOR_INFO_WHITE_LEVEL, ANDROID_SENSOR_BASE_GAIN_FACTOR, 4827 ANDROID_SENSOR_BLACK_LEVEL_PATTERN, ANDROID_SENSOR_MAX_ANALOG_SENSITIVITY, 4828 ANDROID_SENSOR_ORIENTATION, ANDROID_SENSOR_AVAILABLE_TEST_PATTERN_MODES, 4829 ANDROID_STATISTICS_INFO_AVAILABLE_FACE_DETECT_MODES, 4830 ANDROID_STATISTICS_INFO_HISTOGRAM_BUCKET_COUNT, 4831 ANDROID_STATISTICS_INFO_MAX_FACE_COUNT, ANDROID_STATISTICS_INFO_MAX_HISTOGRAM_COUNT, 4832 ANDROID_STATISTICS_INFO_MAX_SHARPNESS_MAP_VALUE, 4833 ANDROID_STATISTICS_INFO_SHARPNESS_MAP_SIZE, ANDROID_HOT_PIXEL_AVAILABLE_HOT_PIXEL_MODES, 4834 ANDROID_EDGE_AVAILABLE_EDGE_MODES, 4835 ANDROID_NOISE_REDUCTION_AVAILABLE_NOISE_REDUCTION_MODES, 4836 ANDROID_TONEMAP_AVAILABLE_TONE_MAP_MODES, 4837 ANDROID_STATISTICS_INFO_AVAILABLE_HOT_PIXEL_MAP_MODES, 4838 ANDROID_TONEMAP_MAX_CURVE_POINTS, ANDROID_INFO_SUPPORTED_HARDWARE_LEVEL }; 4839 staticInfo.update(ANDROID_REQUEST_AVAILABLE_CHARACTERISTICS_KEYS, 4840 available_characteristics_keys, 4841 sizeof(available_characteristics_keys)/sizeof(int32_t)); 4842 4843 /*available stall durations depend on the hw + sw and will be different for different devices */ 4844 /*have to add for raw after implementation*/ 4845 int32_t stall_formats[] = {HAL_PIXEL_FORMAT_BLOB, ANDROID_SCALER_AVAILABLE_FORMATS_RAW16}; 4846 size_t stall_formats_count = sizeof(stall_formats)/sizeof(int32_t); 4847 4848 size_t available_stall_size = gCamCapability[cameraId]->picture_sizes_tbl_cnt * 4; 4849 int64_t available_stall_durations[available_stall_size]; 4850 idx = 0; 4851 for (uint32_t j = 0; j < stall_formats_count; j++) { 4852 if (stall_formats[j] == HAL_PIXEL_FORMAT_BLOB) { 4853 for (uint32_t i = 0; i < gCamCapability[cameraId]->picture_sizes_tbl_cnt; i++) { 4854 available_stall_durations[idx] = stall_formats[j]; 4855 available_stall_durations[idx+1] = gCamCapability[cameraId]->picture_sizes_tbl[i].width; 4856 available_stall_durations[idx+2] = gCamCapability[cameraId]->picture_sizes_tbl[i].height; 4857 available_stall_durations[idx+3] = gCamCapability[cameraId]->jpeg_stall_durations[i]; 4858 idx+=4; 4859 } 4860 } else { 4861 for (uint32_t i = 0; i < gCamCapability[cameraId]->supported_raw_dim_cnt; i++) { 4862 available_stall_durations[idx] = stall_formats[j]; 4863 available_stall_durations[idx+1] = gCamCapability[cameraId]->raw_dim[i].width; 4864 available_stall_durations[idx+2] = gCamCapability[cameraId]->raw_dim[i].height; 4865 available_stall_durations[idx+3] = gCamCapability[cameraId]->raw16_stall_durations[i]; 4866 idx+=4; 4867 } 4868 } 4869 } 4870 staticInfo.update(ANDROID_SCALER_AVAILABLE_STALL_DURATIONS, 4871 available_stall_durations, 4872 idx); 4873 //QCAMERA3_OPAQUE_RAW 4874 uint8_t raw_format = QCAMERA3_OPAQUE_RAW_FORMAT_LEGACY; 4875 cam_format_t fmt = CAM_FORMAT_BAYER_QCOM_RAW_10BPP_GBRG; 4876 switch (gCamCapability[cameraId]->opaque_raw_fmt) { 4877 case LEGACY_RAW: 4878 if (gCamCapability[cameraId]->white_level == (1<<8)-1) 4879 fmt = CAM_FORMAT_BAYER_QCOM_RAW_8BPP_GBRG; 4880 else if (gCamCapability[cameraId]->white_level == (1<<10)-1) 4881 fmt = CAM_FORMAT_BAYER_QCOM_RAW_10BPP_GBRG; 4882 else if (gCamCapability[cameraId]->white_level == (1<<12)-1) 4883 fmt = CAM_FORMAT_BAYER_QCOM_RAW_12BPP_GBRG; 4884 raw_format = QCAMERA3_OPAQUE_RAW_FORMAT_LEGACY; 4885 break; 4886 case MIPI_RAW: 4887 if (gCamCapability[cameraId]->white_level == (1<<8)-1) 4888 fmt = CAM_FORMAT_BAYER_MIPI_RAW_8BPP_GBRG; 4889 else if (gCamCapability[cameraId]->white_level == (1<<10)-1) 4890 fmt = CAM_FORMAT_BAYER_MIPI_RAW_10BPP_GBRG; 4891 else if (gCamCapability[cameraId]->white_level == (1<<12)-1) 4892 fmt = CAM_FORMAT_BAYER_MIPI_RAW_12BPP_GBRG; 4893 raw_format = QCAMERA3_OPAQUE_RAW_FORMAT_MIPI; 4894 break; 4895 default: 4896 ALOGE("%s: unknown opaque_raw_format %d", __func__, 4897 gCamCapability[cameraId]->opaque_raw_fmt); 4898 break; 4899 } 4900 staticInfo.update(QCAMERA3_OPAQUE_RAW_FORMAT, &raw_format, 1); 4901 4902 if (gCamCapability[cameraId]->supported_raw_dim_cnt) { 4903 int32_t strides[3*gCamCapability[cameraId]->supported_raw_dim_cnt]; 4904 for (size_t i = 0; i < gCamCapability[cameraId]->supported_raw_dim_cnt; i++) { 4905 cam_stream_buf_plane_info_t buf_planes; 4906 strides[i*3] = gCamCapability[cameraId]->raw_dim[i].width; 4907 strides[i*3+1] = gCamCapability[cameraId]->raw_dim[i].height; 4908 mm_stream_calc_offset_raw(fmt, &gCamCapability[cameraId]->raw_dim[i], 4909 &gCamCapability[cameraId]->padding_info, &buf_planes); 4910 strides[i*3+2] = buf_planes.plane_info.mp[0].stride; 4911 } 4912 staticInfo.update(QCAMERA3_OPAQUE_RAW_STRIDES, strides, 4913 3*gCamCapability[cameraId]->supported_raw_dim_cnt); 4914 } 4915 gStaticMetadata[cameraId] = staticInfo.release(); 4916 return rc; 4917 } 4918 4919 /*=========================================================================== 4920 * FUNCTION : makeTable 4921 * 4922 * DESCRIPTION: make a table of sizes 4923 * 4924 * PARAMETERS : 4925 * 4926 * 4927 *==========================================================================*/ 4928 void QCamera3HardwareInterface::makeTable(cam_dimension_t* dimTable, uint8_t size, 4929 int32_t* sizeTable) 4930 { 4931 int j = 0; 4932 for (int i = 0; i < size; i++) { 4933 sizeTable[j] = dimTable[i].width; 4934 sizeTable[j+1] = dimTable[i].height; 4935 j+=2; 4936 } 4937 } 4938 4939 /*=========================================================================== 4940 * FUNCTION : makeFPSTable 4941 * 4942 * DESCRIPTION: make a table of fps ranges 4943 * 4944 * PARAMETERS : 4945 * 4946 *==========================================================================*/ 4947 void QCamera3HardwareInterface::makeFPSTable(cam_fps_range_t* fpsTable, uint8_t size, 4948 int32_t* fpsRangesTable) 4949 { 4950 int j = 0; 4951 for (int i = 0; i < size; i++) { 4952 fpsRangesTable[j] = (int32_t)fpsTable[i].min_fps; 4953 fpsRangesTable[j+1] = (int32_t)fpsTable[i].max_fps; 4954 j+=2; 4955 } 4956 } 4957 4958 /*=========================================================================== 4959 * FUNCTION : makeOverridesList 4960 * 4961 * DESCRIPTION: make a list of scene mode overrides 4962 * 4963 * PARAMETERS : 4964 * 4965 * 4966 *==========================================================================*/ 4967 void QCamera3HardwareInterface::makeOverridesList(cam_scene_mode_overrides_t* overridesTable, 4968 uint8_t size, uint8_t* overridesList, 4969 uint8_t* supported_indexes, 4970 int camera_id) 4971 { 4972 /*daemon will give a list of overrides for all scene modes. 4973 However we should send the fwk only the overrides for the scene modes 4974 supported by the framework*/ 4975 int j = 0, index = 0, supt = 0; 4976 uint8_t focus_override; 4977 for (int i = 0; i < size; i++) { 4978 supt = 0; 4979 index = supported_indexes[i]; 4980 overridesList[j] = gCamCapability[camera_id]->flash_available ? ANDROID_CONTROL_AE_MODE_ON_AUTO_FLASH:ANDROID_CONTROL_AE_MODE_ON; 4981 overridesList[j+1] = (uint8_t)lookupFwkName(WHITE_BALANCE_MODES_MAP, 4982 sizeof(WHITE_BALANCE_MODES_MAP)/sizeof(WHITE_BALANCE_MODES_MAP[0]), 4983 overridesTable[index].awb_mode); 4984 focus_override = (uint8_t)overridesTable[index].af_mode; 4985 for (int k = 0; k < gCamCapability[camera_id]->supported_focus_modes_cnt; k++) { 4986 if (gCamCapability[camera_id]->supported_focus_modes[k] == focus_override) { 4987 supt = 1; 4988 break; 4989 } 4990 } 4991 if (supt) { 4992 overridesList[j+2] = (uint8_t)lookupFwkName(FOCUS_MODES_MAP, 4993 sizeof(FOCUS_MODES_MAP)/sizeof(FOCUS_MODES_MAP[0]), 4994 focus_override); 4995 } else { 4996 overridesList[j+2] = ANDROID_CONTROL_AF_MODE_OFF; 4997 } 4998 j+=3; 4999 } 5000 } 5001 5002 /*=========================================================================== 5003 * FUNCTION : filterJpegSizes 5004 * 5005 * DESCRIPTION: Returns the supported jpeg sizes based on the max dimension that 5006 * could be downscaled to 5007 * 5008 * PARAMETERS : 5009 * 5010 * RETURN : length of jpegSizes array 5011 *==========================================================================*/ 5012 5013 uint8_t QCamera3HardwareInterface::filterJpegSizes(int32_t* jpegSizes, int32_t* processedSizes, 5014 uint8_t processedSizesCnt, 5015 uint8_t maxCount, 5016 cam_rect_t active_array_size, 5017 uint8_t downscale_factor) 5018 { 5019 if (downscale_factor == 0) { 5020 downscale_factor = 1; 5021 } 5022 int32_t min_width = active_array_size.width / downscale_factor; 5023 int32_t min_height = active_array_size.height / downscale_factor; 5024 uint8_t jpegSizesCnt = 0; 5025 if (processedSizesCnt > maxCount) { 5026 processedSizesCnt = maxCount; 5027 } 5028 for (int i = 0; i < processedSizesCnt; i+=2) { 5029 if (processedSizes[i] >= min_width && processedSizes[i+1] >= min_height) { 5030 jpegSizes[jpegSizesCnt] = processedSizes[i]; 5031 jpegSizes[jpegSizesCnt+1] = processedSizes[i+1]; 5032 jpegSizesCnt += 2; 5033 } 5034 } 5035 return jpegSizesCnt; 5036 } 5037 5038 /*=========================================================================== 5039 * FUNCTION : getPreviewHalPixelFormat 5040 * 5041 * DESCRIPTION: convert the format to type recognized by framework 5042 * 5043 * PARAMETERS : format : the format from backend 5044 * 5045 ** RETURN : format recognized by framework 5046 * 5047 *==========================================================================*/ 5048 int32_t QCamera3HardwareInterface::getScalarFormat(int32_t format) 5049 { 5050 int32_t halPixelFormat; 5051 5052 switch (format) { 5053 case CAM_FORMAT_YUV_420_NV12: 5054 halPixelFormat = HAL_PIXEL_FORMAT_YCbCr_420_SP; 5055 break; 5056 case CAM_FORMAT_YUV_420_NV21: 5057 halPixelFormat = HAL_PIXEL_FORMAT_YCrCb_420_SP; 5058 break; 5059 case CAM_FORMAT_YUV_420_NV21_ADRENO: 5060 halPixelFormat = HAL_PIXEL_FORMAT_YCrCb_420_SP_ADRENO; 5061 break; 5062 case CAM_FORMAT_YUV_420_YV12: 5063 halPixelFormat = HAL_PIXEL_FORMAT_YV12; 5064 break; 5065 case CAM_FORMAT_YUV_422_NV16: 5066 case CAM_FORMAT_YUV_422_NV61: 5067 default: 5068 halPixelFormat = HAL_PIXEL_FORMAT_YCrCb_420_SP; 5069 break; 5070 } 5071 return halPixelFormat; 5072 } 5073 /*=========================================================================== 5074 * FUNCTION : computeNoiseModelEntryS 5075 * 5076 * DESCRIPTION: function to map a given sensitivity to the S noise 5077 * model parameters in the DNG noise model. 5078 * 5079 * PARAMETERS : sens : the sensor sensitivity 5080 * 5081 ** RETURN : S (sensor amplification) noise 5082 * 5083 *==========================================================================*/ 5084 5085 double QCamera3HardwareInterface::computeNoiseModelEntryS(int32_t sens) { 5086 double s = 3.738032e-06 * sens + 3.651935e-04; 5087 return s < 0.0 ? 0.0 : s; 5088 } 5089 5090 /*=========================================================================== 5091 * FUNCTION : computeNoiseModelEntryO 5092 * 5093 * DESCRIPTION: function to map a given sensitivity to the O noise 5094 * model parameters in the DNG noise model. 5095 * 5096 * PARAMETERS : sens : the sensor sensitivity 5097 * 5098 ** RETURN : O (sensor readout) noise 5099 * 5100 *==========================================================================*/ 5101 5102 double QCamera3HardwareInterface::computeNoiseModelEntryO(int32_t sens) { 5103 double o = 4.499952e-07 * sens + -2.968624e-04; 5104 return o < 0.0 ? 0.0 : o; 5105 } 5106 5107 /*=========================================================================== 5108 * FUNCTION : getSensorSensitivity 5109 * 5110 * DESCRIPTION: convert iso_mode to an integer value 5111 * 5112 * PARAMETERS : iso_mode : the iso_mode supported by sensor 5113 * 5114 ** RETURN : sensitivity supported by sensor 5115 * 5116 *==========================================================================*/ 5117 int32_t QCamera3HardwareInterface::getSensorSensitivity(int32_t iso_mode) 5118 { 5119 int32_t sensitivity; 5120 5121 switch (iso_mode) { 5122 case CAM_ISO_MODE_100: 5123 sensitivity = 100; 5124 break; 5125 case CAM_ISO_MODE_200: 5126 sensitivity = 200; 5127 break; 5128 case CAM_ISO_MODE_400: 5129 sensitivity = 400; 5130 break; 5131 case CAM_ISO_MODE_800: 5132 sensitivity = 800; 5133 break; 5134 case CAM_ISO_MODE_1600: 5135 sensitivity = 1600; 5136 break; 5137 default: 5138 sensitivity = -1; 5139 break; 5140 } 5141 return sensitivity; 5142 } 5143 5144 /*=========================================================================== 5145 * FUNCTION : AddSetParmEntryToBatch 5146 * 5147 * DESCRIPTION: add set parameter entry into batch 5148 * 5149 * PARAMETERS : 5150 * @p_table : ptr to parameter buffer 5151 * @paramType : parameter type 5152 * @paramLength : length of parameter value 5153 * @paramValue : ptr to parameter value 5154 * 5155 * RETURN : int32_t type of status 5156 * NO_ERROR -- success 5157 * none-zero failure code 5158 *==========================================================================*/ 5159 int32_t QCamera3HardwareInterface::AddSetParmEntryToBatch(parm_buffer_t *p_table, 5160 cam_intf_parm_type_t paramType, 5161 uint32_t paramLength, 5162 void *paramValue) 5163 { 5164 void* dst; 5165 if ((NULL == p_table) || (NULL == paramValue) || 5166 (paramType >= CAM_INTF_PARM_MAX)) { 5167 ALOGE("%s: Invalid p_table: %p, paramValue: %p, param type: %d", 5168 __func__, p_table, paramValue, paramType); 5169 return BAD_VALUE; 5170 } 5171 /************************************************************************* 5172 * Copy contents into entry * 5173 *************************************************************************/ 5174 if (paramLength > get_size_of(paramType)) { 5175 ALOGE("%s: input larger than max entry size, type=%d, length =%d", 5176 __func__, paramType, paramLength); 5177 return BAD_VALUE; 5178 } 5179 dst = get_pointer_of(paramType, p_table); 5180 if(NULL != dst){ 5181 memcpy(dst, paramValue, paramLength); 5182 p_table->is_valid[paramType] = 1; 5183 } 5184 return NO_ERROR; 5185 } 5186 5187 /*=========================================================================== 5188 * FUNCTION : lookupFwkName 5189 * 5190 * DESCRIPTION: In case the enum is not same in fwk and backend 5191 * make sure the parameter is correctly propogated 5192 * 5193 * PARAMETERS : 5194 * @arr : map between the two enums 5195 * @len : len of the map 5196 * @hal_name : name of the hal_parm to map 5197 * 5198 * RETURN : int type of status 5199 * fwk_name -- success 5200 * none-zero failure code 5201 *==========================================================================*/ 5202 int32_t QCamera3HardwareInterface::lookupFwkName(const QCameraMap arr[], 5203 int len, int hal_name) 5204 { 5205 5206 for (int i = 0; i < len; i++) { 5207 if (arr[i].hal_name == hal_name) 5208 return arr[i].fwk_name; 5209 } 5210 5211 /* Not able to find matching framework type is not necessarily 5212 * an error case. This happens when mm-camera supports more attributes 5213 * than the frameworks do */ 5214 CDBG_HIGH("%s: Cannot find matching framework type", __func__); 5215 return NAME_NOT_FOUND; 5216 } 5217 5218 /*=========================================================================== 5219 * FUNCTION : lookupHalName 5220 * 5221 * DESCRIPTION: In case the enum is not same in fwk and backend 5222 * make sure the parameter is correctly propogated 5223 * 5224 * PARAMETERS : 5225 * @arr : map between the two enums 5226 * @len : len of the map 5227 * @fwk_name : name of the hal_parm to map 5228 * 5229 * RETURN : int32_t type of status 5230 * hal_name -- success 5231 * none-zero failure code 5232 *==========================================================================*/ 5233 int8_t QCamera3HardwareInterface::lookupHalName(const QCameraMap arr[], 5234 int len, unsigned int fwk_name) 5235 { 5236 for (int i = 0; i < len; i++) { 5237 if (arr[i].fwk_name == fwk_name) 5238 return arr[i].hal_name; 5239 } 5240 ALOGE("%s: Cannot find matching hal type", __func__); 5241 return NAME_NOT_FOUND; 5242 } 5243 5244 /*=========================================================================== 5245 * FUNCTION : lookupProp 5246 * 5247 * DESCRIPTION: lookup a value by its name 5248 * 5249 * PARAMETERS : 5250 * @attr : map contains <name, value> 5251 * @len : size of the map 5252 * @name : name to be looked up 5253 * 5254 * RETURN : Value if found 5255 * CAM_CDS_MODE_MAX if not found 5256 *==========================================================================*/ 5257 cam_cds_mode_type_t QCamera3HardwareInterface::lookupProp(const QCameraPropMap arr[], 5258 int len, const char *name) 5259 { 5260 if (name) { 5261 for (int i = 0; i < len; i++) { 5262 if (!strcmp(arr[i].desc, name)) { 5263 return arr[i].val; 5264 } 5265 } 5266 } 5267 return CAM_CDS_MODE_MAX; 5268 } 5269 5270 /*=========================================================================== 5271 * FUNCTION : getCapabilities 5272 * 5273 * DESCRIPTION: query camera capabilities 5274 * 5275 * PARAMETERS : 5276 * @cameraId : camera Id 5277 * @info : camera info struct to be filled in with camera capabilities 5278 * 5279 * RETURN : int32_t type of status 5280 * NO_ERROR -- success 5281 * none-zero failure code 5282 *==========================================================================*/ 5283 int QCamera3HardwareInterface::getCamInfo(int cameraId, 5284 struct camera_info *info) 5285 { 5286 ATRACE_CALL(); 5287 int rc = 0; 5288 5289 if (NULL == gCamCapability[cameraId]) { 5290 rc = initCapabilities(cameraId); 5291 if (rc < 0) { 5292 //pthread_mutex_unlock(&g_camlock); 5293 return rc; 5294 } 5295 } 5296 5297 if (NULL == gStaticMetadata[cameraId]) { 5298 rc = initStaticMetadata(cameraId); 5299 if (rc < 0) { 5300 return rc; 5301 } 5302 } 5303 5304 switch(gCamCapability[cameraId]->position) { 5305 case CAM_POSITION_BACK: 5306 info->facing = CAMERA_FACING_BACK; 5307 break; 5308 5309 case CAM_POSITION_FRONT: 5310 info->facing = CAMERA_FACING_FRONT; 5311 break; 5312 5313 default: 5314 ALOGE("%s:Unknown position type for camera id:%d", __func__, cameraId); 5315 rc = -1; 5316 break; 5317 } 5318 5319 5320 info->orientation = gCamCapability[cameraId]->sensor_mount_angle; 5321 info->device_version = CAMERA_DEVICE_API_VERSION_3_2; 5322 info->static_camera_characteristics = gStaticMetadata[cameraId]; 5323 5324 return rc; 5325 } 5326 5327 /*=========================================================================== 5328 * FUNCTION : translateCapabilityToMetadata 5329 * 5330 * DESCRIPTION: translate the capability into camera_metadata_t 5331 * 5332 * PARAMETERS : type of the request 5333 * 5334 * 5335 * RETURN : success: camera_metadata_t* 5336 * failure: NULL 5337 * 5338 *==========================================================================*/ 5339 camera_metadata_t* QCamera3HardwareInterface::translateCapabilityToMetadata(int type) 5340 { 5341 pthread_mutex_lock(&mMutex); 5342 5343 if (mDefaultMetadata[type] != NULL) { 5344 pthread_mutex_unlock(&mMutex); 5345 return mDefaultMetadata[type]; 5346 } 5347 //first time we are handling this request 5348 //fill up the metadata structure using the wrapper class 5349 CameraMetadata settings; 5350 //translate from cam_capability_t to camera_metadata_tag_t 5351 static const uint8_t requestType = ANDROID_REQUEST_TYPE_CAPTURE; 5352 settings.update(ANDROID_REQUEST_TYPE, &requestType, 1); 5353 int32_t defaultRequestID = 0; 5354 settings.update(ANDROID_REQUEST_ID, &defaultRequestID, 1); 5355 5356 /* OIS disable */ 5357 char ois_prop[PROPERTY_VALUE_MAX]; 5358 memset(ois_prop, 0, sizeof(ois_prop)); 5359 property_get("persist.camera.ois.disable", ois_prop, "0"); 5360 uint8_t ois_disable = atoi(ois_prop); 5361 5362 /* OIS/EIS disable */ 5363 char eis_prop[PROPERTY_VALUE_MAX]; 5364 memset(eis_prop, 0, sizeof(eis_prop)); 5365 property_get("camera.eis.enable", eis_prop, "0"); 5366 mEisEnable = atoi(eis_prop); 5367 5368 /* Force video to use OIS */ 5369 char videoOisProp[PROPERTY_VALUE_MAX]; 5370 memset(videoOisProp, 0, sizeof(videoOisProp)); 5371 property_get("persist.camera.ois.video", videoOisProp, "1"); 5372 uint8_t forceVideoOis = atoi(videoOisProp); 5373 5374 uint8_t controlIntent = 0; 5375 uint8_t focusMode; 5376 uint8_t vsMode; 5377 uint8_t optStabMode; 5378 uint8_t cacMode; 5379 vsMode = ANDROID_CONTROL_VIDEO_STABILIZATION_MODE_OFF; 5380 switch (type) { 5381 case CAMERA3_TEMPLATE_PREVIEW: 5382 controlIntent = ANDROID_CONTROL_CAPTURE_INTENT_PREVIEW; 5383 focusMode = ANDROID_CONTROL_AF_MODE_CONTINUOUS_PICTURE; 5384 optStabMode = ANDROID_LENS_OPTICAL_STABILIZATION_MODE_ON; 5385 break; 5386 case CAMERA3_TEMPLATE_STILL_CAPTURE: 5387 controlIntent = ANDROID_CONTROL_CAPTURE_INTENT_STILL_CAPTURE; 5388 focusMode = ANDROID_CONTROL_AF_MODE_CONTINUOUS_PICTURE; 5389 optStabMode = ANDROID_LENS_OPTICAL_STABILIZATION_MODE_ON; 5390 cacMode = ANDROID_COLOR_CORRECTION_ABERRATION_MODE_HIGH_QUALITY; 5391 settings.update(ANDROID_COLOR_CORRECTION_ABERRATION_MODE, &cacMode, 1); 5392 break; 5393 case CAMERA3_TEMPLATE_VIDEO_RECORD: 5394 controlIntent = ANDROID_CONTROL_CAPTURE_INTENT_VIDEO_RECORD; 5395 focusMode = ANDROID_CONTROL_AF_MODE_CONTINUOUS_VIDEO; 5396 optStabMode = ANDROID_LENS_OPTICAL_STABILIZATION_MODE_OFF; 5397 if (forceVideoOis) 5398 optStabMode = ANDROID_LENS_OPTICAL_STABILIZATION_MODE_ON; 5399 break; 5400 case CAMERA3_TEMPLATE_VIDEO_SNAPSHOT: 5401 controlIntent = ANDROID_CONTROL_CAPTURE_INTENT_VIDEO_SNAPSHOT; 5402 focusMode = ANDROID_CONTROL_AF_MODE_CONTINUOUS_VIDEO; 5403 optStabMode = ANDROID_LENS_OPTICAL_STABILIZATION_MODE_OFF; 5404 if (forceVideoOis) 5405 optStabMode = ANDROID_LENS_OPTICAL_STABILIZATION_MODE_ON; 5406 break; 5407 case CAMERA3_TEMPLATE_ZERO_SHUTTER_LAG: 5408 controlIntent = ANDROID_CONTROL_CAPTURE_INTENT_ZERO_SHUTTER_LAG; 5409 focusMode = ANDROID_CONTROL_AF_MODE_CONTINUOUS_PICTURE; 5410 optStabMode = ANDROID_LENS_OPTICAL_STABILIZATION_MODE_ON; 5411 break; 5412 case CAMERA3_TEMPLATE_MANUAL: 5413 controlIntent = ANDROID_CONTROL_CAPTURE_INTENT_MANUAL; 5414 focusMode = ANDROID_CONTROL_AF_MODE_OFF; 5415 optStabMode = ANDROID_LENS_OPTICAL_STABILIZATION_MODE_OFF; 5416 break; 5417 default: 5418 controlIntent = ANDROID_CONTROL_CAPTURE_INTENT_CUSTOM; 5419 optStabMode = ANDROID_LENS_OPTICAL_STABILIZATION_MODE_OFF; 5420 break; 5421 } 5422 settings.update(ANDROID_CONTROL_CAPTURE_INTENT, &controlIntent, 1); 5423 settings.update(ANDROID_CONTROL_VIDEO_STABILIZATION_MODE, &vsMode, 1); 5424 if (gCamCapability[mCameraId]->supported_focus_modes_cnt == 1) { 5425 focusMode = ANDROID_CONTROL_AF_MODE_OFF; 5426 } 5427 settings.update(ANDROID_CONTROL_AF_MODE, &focusMode, 1); 5428 5429 if (gCamCapability[mCameraId]->optical_stab_modes_count == 1 && 5430 gCamCapability[mCameraId]->optical_stab_modes[0] == CAM_OPT_STAB_ON) 5431 optStabMode = ANDROID_LENS_OPTICAL_STABILIZATION_MODE_ON; 5432 else if ((gCamCapability[mCameraId]->optical_stab_modes_count == 1 && 5433 gCamCapability[mCameraId]->optical_stab_modes[0] == CAM_OPT_STAB_OFF) 5434 || ois_disable) 5435 optStabMode = ANDROID_LENS_OPTICAL_STABILIZATION_MODE_OFF; 5436 settings.update(ANDROID_LENS_OPTICAL_STABILIZATION_MODE, &optStabMode, 1); 5437 5438 settings.update(ANDROID_CONTROL_AE_EXPOSURE_COMPENSATION, 5439 &gCamCapability[mCameraId]->exposure_compensation_default, 1); 5440 5441 static const uint8_t aeLock = ANDROID_CONTROL_AE_LOCK_OFF; 5442 settings.update(ANDROID_CONTROL_AE_LOCK, &aeLock, 1); 5443 5444 static const uint8_t awbLock = ANDROID_CONTROL_AWB_LOCK_OFF; 5445 settings.update(ANDROID_CONTROL_AWB_LOCK, &awbLock, 1); 5446 5447 static const uint8_t awbMode = ANDROID_CONTROL_AWB_MODE_AUTO; 5448 settings.update(ANDROID_CONTROL_AWB_MODE, &awbMode, 1); 5449 5450 static const uint8_t controlMode = ANDROID_CONTROL_MODE_AUTO; 5451 settings.update(ANDROID_CONTROL_MODE, &controlMode, 1); 5452 5453 static const uint8_t effectMode = ANDROID_CONTROL_EFFECT_MODE_OFF; 5454 settings.update(ANDROID_CONTROL_EFFECT_MODE, &effectMode, 1); 5455 5456 static const uint8_t sceneMode = ANDROID_CONTROL_SCENE_MODE_FACE_PRIORITY; 5457 settings.update(ANDROID_CONTROL_SCENE_MODE, &sceneMode, 1); 5458 5459 static const uint8_t aeMode = ANDROID_CONTROL_AE_MODE_ON; 5460 settings.update(ANDROID_CONTROL_AE_MODE, &aeMode, 1); 5461 5462 /*flash*/ 5463 static const uint8_t flashMode = ANDROID_FLASH_MODE_OFF; 5464 settings.update(ANDROID_FLASH_MODE, &flashMode, 1); 5465 5466 static const uint8_t flashFiringLevel = CAM_FLASH_FIRING_LEVEL_4; 5467 settings.update(ANDROID_FLASH_FIRING_POWER, 5468 &flashFiringLevel, 1); 5469 5470 /* lens */ 5471 float default_aperture = gCamCapability[mCameraId]->apertures[0]; 5472 settings.update(ANDROID_LENS_APERTURE, &default_aperture, 1); 5473 5474 if (gCamCapability[mCameraId]->filter_densities_count) { 5475 float default_filter_density = gCamCapability[mCameraId]->filter_densities[0]; 5476 settings.update(ANDROID_LENS_FILTER_DENSITY, &default_filter_density, 5477 gCamCapability[mCameraId]->filter_densities_count); 5478 } 5479 5480 float default_focal_length = gCamCapability[mCameraId]->focal_length; 5481 settings.update(ANDROID_LENS_FOCAL_LENGTH, &default_focal_length, 1); 5482 5483 float default_focus_distance = 0; 5484 settings.update(ANDROID_LENS_FOCUS_DISTANCE, &default_focus_distance, 1); 5485 5486 static const uint8_t demosaicMode = ANDROID_DEMOSAIC_MODE_FAST; 5487 settings.update(ANDROID_DEMOSAIC_MODE, &demosaicMode, 1); 5488 5489 static const uint8_t hotpixelMode = ANDROID_HOT_PIXEL_MODE_FAST; 5490 settings.update(ANDROID_HOT_PIXEL_MODE, &hotpixelMode, 1); 5491 5492 static const int32_t testpatternMode = ANDROID_SENSOR_TEST_PATTERN_MODE_OFF; 5493 settings.update(ANDROID_SENSOR_TEST_PATTERN_MODE, &testpatternMode, 1); 5494 5495 static const uint8_t faceDetectMode = ANDROID_STATISTICS_FACE_DETECT_MODE_FULL; 5496 settings.update(ANDROID_STATISTICS_FACE_DETECT_MODE, &faceDetectMode, 1); 5497 5498 static const uint8_t histogramMode = ANDROID_STATISTICS_HISTOGRAM_MODE_OFF; 5499 settings.update(ANDROID_STATISTICS_HISTOGRAM_MODE, &histogramMode, 1); 5500 5501 static const uint8_t sharpnessMapMode = ANDROID_STATISTICS_SHARPNESS_MAP_MODE_OFF; 5502 settings.update(ANDROID_STATISTICS_SHARPNESS_MAP_MODE, &sharpnessMapMode, 1); 5503 5504 static const uint8_t hotPixelMapMode = ANDROID_STATISTICS_HOT_PIXEL_MAP_MODE_OFF; 5505 settings.update(ANDROID_STATISTICS_HOT_PIXEL_MAP_MODE, &hotPixelMapMode, 1); 5506 5507 static const uint8_t blackLevelLock = ANDROID_BLACK_LEVEL_LOCK_OFF; 5508 settings.update(ANDROID_BLACK_LEVEL_LOCK, &blackLevelLock, 1); 5509 5510 /* Exposure time(Update the Min Exposure Time)*/ 5511 int64_t default_exposure_time = gCamCapability[mCameraId]->exposure_time_range[0]; 5512 settings.update(ANDROID_SENSOR_EXPOSURE_TIME, &default_exposure_time, 1); 5513 5514 /* frame duration */ 5515 static const int64_t default_frame_duration = NSEC_PER_33MSEC; 5516 settings.update(ANDROID_SENSOR_FRAME_DURATION, &default_frame_duration, 1); 5517 5518 /* sensitivity */ 5519 static const int32_t default_sensitivity = 100; 5520 settings.update(ANDROID_SENSOR_SENSITIVITY, &default_sensitivity, 1); 5521 5522 /*edge mode*/ 5523 static const uint8_t edge_mode = ANDROID_EDGE_MODE_FAST; 5524 settings.update(ANDROID_EDGE_MODE, &edge_mode, 1); 5525 5526 /*noise reduction mode*/ 5527 static const uint8_t noise_red_mode = ANDROID_NOISE_REDUCTION_MODE_FAST; 5528 settings.update(ANDROID_NOISE_REDUCTION_MODE, &noise_red_mode, 1); 5529 5530 /*color correction mode*/ 5531 static const uint8_t color_correct_mode = ANDROID_COLOR_CORRECTION_MODE_FAST; 5532 settings.update(ANDROID_COLOR_CORRECTION_MODE, &color_correct_mode, 1); 5533 5534 /*transform matrix mode*/ 5535 static const uint8_t tonemap_mode = ANDROID_TONEMAP_MODE_FAST; 5536 settings.update(ANDROID_TONEMAP_MODE, &tonemap_mode, 1); 5537 5538 uint8_t edge_strength = (uint8_t)gCamCapability[mCameraId]->sharpness_ctrl.def_value; 5539 settings.update(ANDROID_EDGE_STRENGTH, &edge_strength, 1); 5540 5541 int32_t scaler_crop_region[4]; 5542 scaler_crop_region[0] = 0; 5543 scaler_crop_region[1] = 0; 5544 scaler_crop_region[2] = gCamCapability[mCameraId]->active_array_size.width; 5545 scaler_crop_region[3] = gCamCapability[mCameraId]->active_array_size.height; 5546 settings.update(ANDROID_SCALER_CROP_REGION, scaler_crop_region, 4); 5547 5548 static const uint8_t antibanding_mode = ANDROID_CONTROL_AE_ANTIBANDING_MODE_AUTO; 5549 settings.update(ANDROID_CONTROL_AE_ANTIBANDING_MODE, &antibanding_mode, 1); 5550 5551 /*focus distance*/ 5552 float focus_distance = 0.0; 5553 settings.update(ANDROID_LENS_FOCUS_DISTANCE, &focus_distance, 1); 5554 5555 /*target fps range: use maximum range for picture, and maximum fixed range for video*/ 5556 float max_range = 0.0; 5557 float max_fixed_fps = 0.0; 5558 int32_t fps_range[2] = {0, 0}; 5559 for (uint32_t i = 0; i < gCamCapability[mCameraId]->fps_ranges_tbl_cnt; 5560 i++) { 5561 float range = gCamCapability[mCameraId]->fps_ranges_tbl[i].max_fps - 5562 gCamCapability[mCameraId]->fps_ranges_tbl[i].min_fps; 5563 if (type == CAMERA3_TEMPLATE_PREVIEW || 5564 type == CAMERA3_TEMPLATE_STILL_CAPTURE || 5565 type == CAMERA3_TEMPLATE_ZERO_SHUTTER_LAG) { 5566 if (range > max_range) { 5567 fps_range[0] = 5568 (int32_t)gCamCapability[mCameraId]->fps_ranges_tbl[i].min_fps; 5569 fps_range[1] = 5570 (int32_t)gCamCapability[mCameraId]->fps_ranges_tbl[i].max_fps; 5571 max_range = range; 5572 } 5573 } else { 5574 if (range < 0.01 && max_fixed_fps < 5575 gCamCapability[mCameraId]->fps_ranges_tbl[i].max_fps) { 5576 fps_range[0] = 5577 (int32_t)gCamCapability[mCameraId]->fps_ranges_tbl[i].min_fps; 5578 fps_range[1] = 5579 (int32_t)gCamCapability[mCameraId]->fps_ranges_tbl[i].max_fps; 5580 max_fixed_fps = gCamCapability[mCameraId]->fps_ranges_tbl[i].max_fps; 5581 } 5582 } 5583 } 5584 settings.update(ANDROID_CONTROL_AE_TARGET_FPS_RANGE, fps_range, 2); 5585 5586 /*precapture trigger*/ 5587 uint8_t precapture_trigger = ANDROID_CONTROL_AE_PRECAPTURE_TRIGGER_IDLE; 5588 settings.update(ANDROID_CONTROL_AE_PRECAPTURE_TRIGGER, &precapture_trigger, 1); 5589 5590 /*af trigger*/ 5591 uint8_t af_trigger = ANDROID_CONTROL_AF_TRIGGER_IDLE; 5592 settings.update(ANDROID_CONTROL_AF_TRIGGER, &af_trigger, 1); 5593 5594 /* ae & af regions */ 5595 int32_t active_region[] = { 5596 gCamCapability[mCameraId]->active_array_size.left, 5597 gCamCapability[mCameraId]->active_array_size.top, 5598 gCamCapability[mCameraId]->active_array_size.left + 5599 gCamCapability[mCameraId]->active_array_size.width, 5600 gCamCapability[mCameraId]->active_array_size.top + 5601 gCamCapability[mCameraId]->active_array_size.height, 5602 0}; 5603 settings.update(ANDROID_CONTROL_AE_REGIONS, active_region, 5); 5604 settings.update(ANDROID_CONTROL_AF_REGIONS, active_region, 5); 5605 5606 /* black level lock */ 5607 uint8_t blacklevel_lock = ANDROID_BLACK_LEVEL_LOCK_OFF; 5608 settings.update(ANDROID_BLACK_LEVEL_LOCK, &blacklevel_lock, 1); 5609 5610 /* face detect mode */ 5611 uint8_t facedetect_mode = ANDROID_STATISTICS_FACE_DETECT_MODE_OFF; 5612 settings.update(ANDROID_STATISTICS_FACE_DETECT_MODE, &facedetect_mode, 1); 5613 5614 /* lens shading map mode */ 5615 uint8_t shadingmap_mode = ANDROID_STATISTICS_LENS_SHADING_MAP_MODE_OFF; 5616 if (CAM_SENSOR_RAW == gCamCapability[mCameraId]->sensor_type.sens_type && 5617 gCamCapability[mCameraId]->supported_raw_dim_cnt > 0) { 5618 shadingmap_mode = ANDROID_STATISTICS_LENS_SHADING_MAP_MODE_ON; 5619 } 5620 settings.update(ANDROID_STATISTICS_LENS_SHADING_MAP_MODE, &shadingmap_mode, 1); 5621 5622 //special defaults for manual template 5623 if (type == CAMERA3_TEMPLATE_MANUAL) { 5624 static const uint8_t manualControlMode = ANDROID_CONTROL_MODE_OFF; 5625 settings.update(ANDROID_CONTROL_MODE, &manualControlMode, 1); 5626 5627 static const uint8_t manualFocusMode = ANDROID_CONTROL_AF_MODE_OFF; 5628 settings.update(ANDROID_CONTROL_AF_MODE, &manualFocusMode, 1); 5629 5630 static const uint8_t manualAeMode = ANDROID_CONTROL_AE_MODE_OFF; 5631 settings.update(ANDROID_CONTROL_AE_MODE, &manualAeMode, 1); 5632 5633 static const uint8_t manualAwbMode = ANDROID_CONTROL_AWB_MODE_OFF; 5634 settings.update(ANDROID_CONTROL_AWB_MODE, &manualAwbMode, 1); 5635 5636 static const uint8_t manualTonemapMode = ANDROID_TONEMAP_MODE_FAST; 5637 settings.update(ANDROID_TONEMAP_MODE, &manualTonemapMode, 1); 5638 5639 static const uint8_t manualColorCorrectMode = ANDROID_COLOR_CORRECTION_MODE_TRANSFORM_MATRIX; 5640 settings.update(ANDROID_COLOR_CORRECTION_MODE, &manualColorCorrectMode, 1); 5641 } 5642 5643 /* CDS default */ 5644 char prop[PROPERTY_VALUE_MAX]; 5645 memset(prop, 0, sizeof(prop)); 5646 property_get("persist.camera.CDS", prop, "Auto"); 5647 cam_cds_mode_type_t cds_mode = CAM_CDS_MODE_AUTO; 5648 cds_mode = lookupProp(CDS_MAP, sizeof(CDS_MAP)/sizeof(QCameraPropMap), prop); 5649 if (CAM_CDS_MODE_MAX == cds_mode) { 5650 cds_mode = CAM_CDS_MODE_AUTO; 5651 } 5652 int32_t mode = cds_mode; 5653 settings.update(QCAMERA3_CDS_MODE, &mode, 1); 5654 5655 mDefaultMetadata[type] = settings.release(); 5656 5657 pthread_mutex_unlock(&mMutex); 5658 return mDefaultMetadata[type]; 5659 } 5660 5661 /*=========================================================================== 5662 * FUNCTION : setFrameParameters 5663 * 5664 * DESCRIPTION: set parameters per frame as requested in the metadata from 5665 * framework 5666 * 5667 * PARAMETERS : 5668 * @request : request that needs to be serviced 5669 * @streamID : Stream ID of all the requested streams 5670 * 5671 * RETURN : success: NO_ERROR 5672 * failure: 5673 *==========================================================================*/ 5674 int QCamera3HardwareInterface::setFrameParameters( 5675 camera3_capture_request_t *request, 5676 cam_stream_ID_t streamID, 5677 uint32_t snapshotStreamId) 5678 { 5679 /*translate from camera_metadata_t type to parm_type_t*/ 5680 int rc = 0; 5681 int32_t hal_version = CAM_HAL_V3; 5682 5683 memset(mParameters, 0, sizeof(parm_buffer_t)); 5684 rc = AddSetParmEntryToBatch(mParameters, CAM_INTF_PARM_HAL_VERSION, 5685 sizeof(hal_version), &hal_version); 5686 if (rc < 0) { 5687 ALOGE("%s: Failed to set hal version in the parameters", __func__); 5688 return BAD_VALUE; 5689 } 5690 5691 /*we need to update the frame number in the parameters*/ 5692 rc = AddSetParmEntryToBatch(mParameters, CAM_INTF_META_FRAME_NUMBER, 5693 sizeof(request->frame_number), &(request->frame_number)); 5694 if (rc < 0) { 5695 ALOGE("%s: Failed to set the frame number in the parameters", __func__); 5696 return BAD_VALUE; 5697 } 5698 5699 /* Update stream id of all the requested buffers */ 5700 rc = AddSetParmEntryToBatch(mParameters, CAM_INTF_META_STREAM_ID, 5701 sizeof(cam_stream_ID_t), &streamID); 5702 5703 if (rc < 0) { 5704 ALOGE("%s: Failed to set stream type mask in the parameters", __func__); 5705 return BAD_VALUE; 5706 } 5707 5708 if(request->settings != NULL){ 5709 rc = translateToHalMetadata(request, mParameters, snapshotStreamId); 5710 } 5711 5712 return rc; 5713 } 5714 5715 /*=========================================================================== 5716 * FUNCTION : setReprocParameters 5717 * 5718 * DESCRIPTION: Translate frameworks metadata to HAL metadata structure, and 5719 * return it. 5720 * 5721 * PARAMETERS : 5722 * @request : request that needs to be serviced 5723 * 5724 * RETURN : success: NO_ERROR 5725 * failure: 5726 *==========================================================================*/ 5727 int32_t QCamera3HardwareInterface::setReprocParameters( 5728 camera3_capture_request_t *request, metadata_buffer_t *reprocParam, 5729 uint32_t snapshotStreamId) 5730 { 5731 /*translate from camera_metadata_t type to parm_type_t*/ 5732 int rc = 0; 5733 5734 if (NULL == request->settings){ 5735 ALOGE("%s: Reprocess settings cannot be NULL", __func__); 5736 return BAD_VALUE; 5737 } 5738 5739 if (NULL == reprocParam) { 5740 ALOGE("%s: Invalid reprocessing metadata buffer", __func__); 5741 return BAD_VALUE; 5742 } 5743 memset(reprocParam, 0, sizeof(metadata_buffer_t)); 5744 5745 /*we need to update the frame number in the parameters*/ 5746 rc = AddSetParmEntryToBatch(reprocParam, CAM_INTF_META_FRAME_NUMBER, 5747 sizeof(request->frame_number), &(request->frame_number)); 5748 if (rc < 0) { 5749 ALOGE("%s: Failed to set the frame number in the parameters", __func__); 5750 return rc; 5751 } 5752 5753 rc = translateToHalMetadata(request, reprocParam, snapshotStreamId); 5754 if (rc < 0) { 5755 ALOGE("%s: Failed to translate reproc request", __func__); 5756 return rc; 5757 } 5758 5759 CameraMetadata frame_settings; 5760 frame_settings = request->settings; 5761 if (frame_settings.exists(QCAMERA3_CROP_COUNT_REPROCESS) && 5762 frame_settings.exists(QCAMERA3_CROP_REPROCESS) && 5763 frame_settings.exists(QCAMERA3_CROP_STREAM_ID_REPROCESS)) { 5764 int32_t *crop_count = 5765 frame_settings.find(QCAMERA3_CROP_COUNT_REPROCESS).data.i32; 5766 int32_t *crop_data = 5767 frame_settings.find(QCAMERA3_CROP_REPROCESS).data.i32; 5768 int32_t *crop_stream_ids = 5769 frame_settings.find(QCAMERA3_CROP_STREAM_ID_REPROCESS).data.i32; 5770 if ((0 < *crop_count) && (*crop_count < MAX_NUM_STREAMS)) { 5771 bool found = false; 5772 int32_t i; 5773 for (i = 0; i < *crop_count; i++) { 5774 if (crop_stream_ids[i] == (int32_t) request->input_buffer->stream) { 5775 found = true; 5776 break; 5777 } 5778 } 5779 5780 if (found) { 5781 cam_crop_data_t crop_meta; 5782 memset(&crop_meta, 0, sizeof(cam_crop_data_t)); 5783 crop_meta.num_of_streams = 1; 5784 crop_meta.crop_info[0].crop.left = crop_data[i*4]; 5785 crop_meta.crop_info[0].crop.top = crop_data[i*4 + 1]; 5786 crop_meta.crop_info[0].crop.width = crop_data[i*4 + 2]; 5787 crop_meta.crop_info[0].crop.height = crop_data[i*4 + 3]; 5788 rc = AddSetParmEntryToBatch(reprocParam, 5789 CAM_INTF_META_CROP_DATA, 5790 sizeof(cam_crop_data_t), &crop_meta); 5791 CDBG("%s: Found reprocess crop data for stream %p %dx%d, %dx%d", 5792 __func__, 5793 request->input_buffer->stream, 5794 crop_meta.crop_info[0].crop.left, 5795 crop_meta.crop_info[0].crop.top, 5796 crop_meta.crop_info[0].crop.width, 5797 crop_meta.crop_info[0].crop.height); 5798 } else { 5799 ALOGE("%s: No matching reprocess input stream found!", __func__); 5800 } 5801 } else { 5802 ALOGE("%s: Invalid reprocess crop count %d!", __func__, *crop_count); 5803 } 5804 } 5805 5806 return rc; 5807 } 5808 5809 /*=========================================================================== 5810 * FUNCTION : translateToHalMetadata 5811 * 5812 * DESCRIPTION: read from the camera_metadata_t and change to parm_type_t 5813 * 5814 * 5815 * PARAMETERS : 5816 * @request : request sent from framework 5817 * 5818 * 5819 * RETURN : success: NO_ERROR 5820 * failure: 5821 *==========================================================================*/ 5822 int QCamera3HardwareInterface::translateToHalMetadata 5823 (const camera3_capture_request_t *request, 5824 metadata_buffer_t *hal_metadata, 5825 uint32_t snapshotStreamId) 5826 { 5827 int rc = 0; 5828 CameraMetadata frame_settings; 5829 frame_settings = request->settings; 5830 5831 /* Do not change the order of the following list unless you know what you are 5832 * doing. 5833 * The order is laid out in such a way that parameters in the front of the table 5834 * may be used to override the parameters later in the table. Examples are: 5835 * 1. META_MODE should precede AEC/AWB/AF MODE 5836 * 2. AEC MODE should preced EXPOSURE_TIME/SENSITIVITY/FRAME_DURATION 5837 * 3. AWB_MODE should precede COLOR_CORRECTION_MODE 5838 * 4. Any mode should precede it's corresponding settings 5839 */ 5840 if (frame_settings.exists(ANDROID_CONTROL_MODE)) { 5841 uint8_t metaMode = frame_settings.find(ANDROID_CONTROL_MODE).data.u8[0]; 5842 rc = AddSetParmEntryToBatch(hal_metadata, CAM_INTF_META_MODE, 5843 sizeof(metaMode), &metaMode); 5844 if (metaMode == ANDROID_CONTROL_MODE_USE_SCENE_MODE) { 5845 camera_metadata_entry entry = frame_settings.find(ANDROID_CONTROL_SCENE_MODE); 5846 if (0 < entry.count) { 5847 uint8_t fwk_sceneMode = entry.data.u8[0]; 5848 uint8_t sceneMode = lookupHalName(SCENE_MODES_MAP, 5849 sizeof(SCENE_MODES_MAP)/sizeof(SCENE_MODES_MAP[0]), 5850 fwk_sceneMode); 5851 rc = AddSetParmEntryToBatch(hal_metadata, CAM_INTF_PARM_BESTSHOT_MODE, 5852 sizeof(sceneMode), &sceneMode); 5853 } 5854 } else if (metaMode == ANDROID_CONTROL_MODE_OFF) { 5855 uint8_t sceneMode = CAM_SCENE_MODE_OFF; 5856 rc = AddSetParmEntryToBatch(hal_metadata, CAM_INTF_PARM_BESTSHOT_MODE, 5857 sizeof(sceneMode), &sceneMode); 5858 } else if (metaMode == ANDROID_CONTROL_MODE_AUTO) { 5859 uint8_t sceneMode = CAM_SCENE_MODE_OFF; 5860 rc = AddSetParmEntryToBatch(hal_metadata, CAM_INTF_PARM_BESTSHOT_MODE, 5861 sizeof(sceneMode), &sceneMode); 5862 } 5863 } 5864 5865 if (frame_settings.exists(ANDROID_CONTROL_AE_MODE)) { 5866 uint8_t fwk_aeMode = 5867 frame_settings.find(ANDROID_CONTROL_AE_MODE).data.u8[0]; 5868 uint8_t aeMode; 5869 int32_t redeye; 5870 5871 if (fwk_aeMode == ANDROID_CONTROL_AE_MODE_OFF ) { 5872 aeMode = CAM_AE_MODE_OFF; 5873 } else { 5874 aeMode = CAM_AE_MODE_ON; 5875 } 5876 if (fwk_aeMode == ANDROID_CONTROL_AE_MODE_ON_AUTO_FLASH_REDEYE) { 5877 redeye = 1; 5878 } else { 5879 redeye = 0; 5880 } 5881 5882 int32_t flashMode = (int32_t)lookupHalName(AE_FLASH_MODE_MAP, 5883 sizeof(AE_FLASH_MODE_MAP), 5884 fwk_aeMode); 5885 rc = AddSetParmEntryToBatch(hal_metadata, CAM_INTF_META_AEC_MODE, 5886 sizeof(aeMode), &aeMode); 5887 rc = AddSetParmEntryToBatch(hal_metadata, CAM_INTF_PARM_LED_MODE, 5888 sizeof(flashMode), &flashMode); 5889 rc = AddSetParmEntryToBatch(hal_metadata, CAM_INTF_PARM_REDEYE_REDUCTION, 5890 sizeof(redeye), &redeye); 5891 } 5892 5893 if (frame_settings.exists(ANDROID_CONTROL_AWB_MODE)) { 5894 uint8_t fwk_whiteLevel = 5895 frame_settings.find(ANDROID_CONTROL_AWB_MODE).data.u8[0]; 5896 uint8_t whiteLevel = lookupHalName(WHITE_BALANCE_MODES_MAP, 5897 sizeof(WHITE_BALANCE_MODES_MAP), 5898 fwk_whiteLevel); 5899 rc = AddSetParmEntryToBatch(hal_metadata, CAM_INTF_PARM_WHITE_BALANCE, 5900 sizeof(whiteLevel), &whiteLevel); 5901 } 5902 5903 if (frame_settings.exists(ANDROID_COLOR_CORRECTION_ABERRATION_MODE)) { 5904 uint8_t fwk_cacMode = 5905 frame_settings.find( 5906 ANDROID_COLOR_CORRECTION_ABERRATION_MODE).data.u8[0]; 5907 int8_t val = lookupHalName(COLOR_ABERRATION_MAP, 5908 sizeof(COLOR_ABERRATION_MAP)/sizeof(COLOR_ABERRATION_MAP[0]), 5909 fwk_cacMode); 5910 if (NAME_NOT_FOUND != val) { 5911 cam_aberration_mode_t cacMode = (cam_aberration_mode_t) val; 5912 rc = AddSetParmEntryToBatch(hal_metadata, CAM_INTF_PARM_CAC, 5913 sizeof(cacMode), &cacMode); 5914 } else { 5915 ALOGE("%s: Invalid framework CAC mode: %d", __func__, fwk_cacMode); 5916 } 5917 } 5918 5919 if (frame_settings.exists(ANDROID_CONTROL_AF_MODE)) { 5920 uint8_t fwk_focusMode = 5921 frame_settings.find(ANDROID_CONTROL_AF_MODE).data.u8[0]; 5922 uint8_t focusMode; 5923 focusMode = lookupHalName(FOCUS_MODES_MAP, 5924 sizeof(FOCUS_MODES_MAP), 5925 fwk_focusMode); 5926 rc = AddSetParmEntryToBatch(hal_metadata, CAM_INTF_PARM_FOCUS_MODE, 5927 sizeof(focusMode), &focusMode); 5928 } 5929 5930 if (frame_settings.exists(ANDROID_LENS_FOCUS_DISTANCE)) { 5931 float focalDistance = frame_settings.find(ANDROID_LENS_FOCUS_DISTANCE).data.f[0]; 5932 rc = AddSetParmEntryToBatch(hal_metadata, 5933 CAM_INTF_META_LENS_FOCUS_DISTANCE, 5934 sizeof(focalDistance), &focalDistance); 5935 } 5936 5937 if (frame_settings.exists(ANDROID_CONTROL_AE_ANTIBANDING_MODE)) { 5938 uint8_t fwk_antibandingMode = 5939 frame_settings.find(ANDROID_CONTROL_AE_ANTIBANDING_MODE).data.u8[0]; 5940 int32_t hal_antibandingMode = lookupHalName(ANTIBANDING_MODES_MAP, 5941 sizeof(ANTIBANDING_MODES_MAP)/sizeof(ANTIBANDING_MODES_MAP[0]), 5942 fwk_antibandingMode); 5943 rc = AddSetParmEntryToBatch(hal_metadata, CAM_INTF_PARM_ANTIBANDING, 5944 sizeof(hal_antibandingMode), &hal_antibandingMode); 5945 } 5946 5947 if (frame_settings.exists(ANDROID_CONTROL_AE_EXPOSURE_COMPENSATION)) { 5948 int32_t expCompensation = frame_settings.find( 5949 ANDROID_CONTROL_AE_EXPOSURE_COMPENSATION).data.i32[0]; 5950 if (expCompensation < gCamCapability[mCameraId]->exposure_compensation_min) 5951 expCompensation = gCamCapability[mCameraId]->exposure_compensation_min; 5952 if (expCompensation > gCamCapability[mCameraId]->exposure_compensation_max) 5953 expCompensation = gCamCapability[mCameraId]->exposure_compensation_max; 5954 rc = AddSetParmEntryToBatch(hal_metadata, CAM_INTF_PARM_EXPOSURE_COMPENSATION, 5955 sizeof(expCompensation), &expCompensation); 5956 } 5957 5958 if (frame_settings.exists(ANDROID_CONTROL_AE_LOCK)) { 5959 uint8_t aeLock = frame_settings.find(ANDROID_CONTROL_AE_LOCK).data.u8[0]; 5960 rc = AddSetParmEntryToBatch(hal_metadata, CAM_INTF_PARM_AEC_LOCK, 5961 sizeof(aeLock), &aeLock); 5962 } 5963 if (frame_settings.exists(ANDROID_CONTROL_AE_TARGET_FPS_RANGE)) { 5964 cam_fps_range_t fps_range; 5965 fps_range.min_fps = 5966 frame_settings.find(ANDROID_CONTROL_AE_TARGET_FPS_RANGE).data.i32[0]; 5967 fps_range.max_fps = 5968 frame_settings.find(ANDROID_CONTROL_AE_TARGET_FPS_RANGE).data.i32[1]; 5969 fps_range.video_min_fps = fps_range.min_fps; 5970 fps_range.video_max_fps = fps_range.max_fps; 5971 rc = AddSetParmEntryToBatch(hal_metadata, CAM_INTF_PARM_FPS_RANGE, 5972 sizeof(fps_range), &fps_range); 5973 } 5974 5975 if (frame_settings.exists(ANDROID_CONTROL_AWB_LOCK)) { 5976 uint8_t awbLock = 5977 frame_settings.find(ANDROID_CONTROL_AWB_LOCK).data.u8[0]; 5978 rc = AddSetParmEntryToBatch(hal_metadata, CAM_INTF_PARM_AWB_LOCK, 5979 sizeof(awbLock), &awbLock); 5980 } 5981 5982 if (frame_settings.exists(ANDROID_CONTROL_EFFECT_MODE)) { 5983 uint8_t fwk_effectMode = 5984 frame_settings.find(ANDROID_CONTROL_EFFECT_MODE).data.u8[0]; 5985 uint8_t effectMode = lookupHalName(EFFECT_MODES_MAP, 5986 sizeof(EFFECT_MODES_MAP), 5987 fwk_effectMode); 5988 rc = AddSetParmEntryToBatch(hal_metadata, CAM_INTF_PARM_EFFECT, 5989 sizeof(effectMode), &effectMode); 5990 } 5991 5992 if (frame_settings.exists(ANDROID_COLOR_CORRECTION_MODE)) { 5993 uint8_t colorCorrectMode = 5994 frame_settings.find(ANDROID_COLOR_CORRECTION_MODE).data.u8[0]; 5995 rc = 5996 AddSetParmEntryToBatch(hal_metadata, CAM_INTF_META_COLOR_CORRECT_MODE, 5997 sizeof(colorCorrectMode), &colorCorrectMode); 5998 } 5999 6000 if (frame_settings.exists(ANDROID_COLOR_CORRECTION_GAINS)) { 6001 cam_color_correct_gains_t colorCorrectGains; 6002 for (int i = 0; i < 4; i++) { 6003 colorCorrectGains.gains[i] = 6004 frame_settings.find(ANDROID_COLOR_CORRECTION_GAINS).data.f[i]; 6005 } 6006 rc = 6007 AddSetParmEntryToBatch(hal_metadata, CAM_INTF_META_COLOR_CORRECT_GAINS, 6008 sizeof(colorCorrectGains), &colorCorrectGains); 6009 } 6010 6011 if (frame_settings.exists(ANDROID_COLOR_CORRECTION_TRANSFORM)) { 6012 cam_color_correct_matrix_t colorCorrectTransform; 6013 cam_rational_type_t transform_elem; 6014 int num = 0; 6015 for (int i = 0; i < 3; i++) { 6016 for (int j = 0; j < 3; j++) { 6017 transform_elem.numerator = 6018 frame_settings.find(ANDROID_COLOR_CORRECTION_TRANSFORM).data.r[num].numerator; 6019 transform_elem.denominator = 6020 frame_settings.find(ANDROID_COLOR_CORRECTION_TRANSFORM).data.r[num].denominator; 6021 colorCorrectTransform.transform_matrix[i][j] = transform_elem; 6022 num++; 6023 } 6024 } 6025 rc = 6026 AddSetParmEntryToBatch(hal_metadata, CAM_INTF_META_COLOR_CORRECT_TRANSFORM, 6027 sizeof(colorCorrectTransform), &colorCorrectTransform); 6028 } 6029 6030 cam_trigger_t aecTrigger; 6031 aecTrigger.trigger = CAM_AEC_TRIGGER_IDLE; 6032 aecTrigger.trigger_id = -1; 6033 if (frame_settings.exists(ANDROID_CONTROL_AE_PRECAPTURE_TRIGGER)&& 6034 frame_settings.exists(ANDROID_CONTROL_AE_PRECAPTURE_ID)) { 6035 aecTrigger.trigger = 6036 frame_settings.find(ANDROID_CONTROL_AE_PRECAPTURE_TRIGGER).data.u8[0]; 6037 aecTrigger.trigger_id = 6038 frame_settings.find(ANDROID_CONTROL_AE_PRECAPTURE_ID).data.i32[0]; 6039 rc = AddSetParmEntryToBatch(hal_metadata, 6040 CAM_INTF_META_AEC_PRECAPTURE_TRIGGER, 6041 sizeof(aecTrigger), &aecTrigger); 6042 } 6043 /*af_trigger must come with a trigger id*/ 6044 if (frame_settings.exists(ANDROID_CONTROL_AF_TRIGGER) && 6045 frame_settings.exists(ANDROID_CONTROL_AF_TRIGGER_ID)) { 6046 cam_trigger_t af_trigger; 6047 af_trigger.trigger = 6048 frame_settings.find(ANDROID_CONTROL_AF_TRIGGER).data.u8[0]; 6049 af_trigger.trigger_id = 6050 frame_settings.find(ANDROID_CONTROL_AF_TRIGGER_ID).data.i32[0]; 6051 rc = AddSetParmEntryToBatch(hal_metadata, 6052 CAM_INTF_META_AF_TRIGGER, sizeof(af_trigger), &af_trigger); 6053 } 6054 6055 if (frame_settings.exists(ANDROID_DEMOSAIC_MODE)) { 6056 int32_t demosaic = 6057 frame_settings.find(ANDROID_DEMOSAIC_MODE).data.u8[0]; 6058 rc = AddSetParmEntryToBatch(hal_metadata, CAM_INTF_META_DEMOSAIC, 6059 sizeof(demosaic), &demosaic); 6060 } 6061 6062 if (frame_settings.exists(ANDROID_EDGE_MODE)) { 6063 cam_edge_application_t edge_application; 6064 edge_application.edge_mode = frame_settings.find(ANDROID_EDGE_MODE).data.u8[0]; 6065 if (edge_application.edge_mode == CAM_EDGE_MODE_OFF) { 6066 edge_application.sharpness = 0; 6067 } else { 6068 if (frame_settings.exists(ANDROID_EDGE_STRENGTH)) { 6069 uint8_t edgeStrength = 6070 frame_settings.find(ANDROID_EDGE_STRENGTH).data.u8[0]; 6071 edge_application.sharpness = (int32_t)edgeStrength; 6072 } else { 6073 edge_application.sharpness = gCamCapability[mCameraId]->sharpness_ctrl.def_value; //default 6074 } 6075 } 6076 rc = AddSetParmEntryToBatch(hal_metadata, CAM_INTF_META_EDGE_MODE, 6077 sizeof(edge_application), &edge_application); 6078 } 6079 6080 if (frame_settings.exists(ANDROID_FLASH_MODE)) { 6081 int32_t respectFlashMode = 1; 6082 if (frame_settings.exists(ANDROID_CONTROL_AE_MODE)) { 6083 uint8_t fwk_aeMode = 6084 frame_settings.find(ANDROID_CONTROL_AE_MODE).data.u8[0]; 6085 if (fwk_aeMode > ANDROID_CONTROL_AE_MODE_ON) { 6086 respectFlashMode = 0; 6087 CDBG_HIGH("%s: AE Mode controls flash, ignore android.flash.mode", 6088 __func__); 6089 } 6090 } 6091 if (respectFlashMode) { 6092 uint8_t flashMode = 6093 frame_settings.find(ANDROID_FLASH_MODE).data.u8[0]; 6094 flashMode = (int32_t)lookupHalName(FLASH_MODES_MAP, 6095 sizeof(FLASH_MODES_MAP), 6096 flashMode); 6097 CDBG_HIGH("%s: flash mode after mapping %d", __func__, flashMode); 6098 // To check: CAM_INTF_META_FLASH_MODE usage 6099 rc = AddSetParmEntryToBatch(hal_metadata, CAM_INTF_PARM_LED_MODE, 6100 sizeof(flashMode), &flashMode); 6101 } 6102 } 6103 6104 if (frame_settings.exists(ANDROID_FLASH_FIRING_POWER)) { 6105 uint8_t flashPower = 6106 frame_settings.find(ANDROID_FLASH_FIRING_POWER).data.u8[0]; 6107 rc = AddSetParmEntryToBatch(hal_metadata, CAM_INTF_META_FLASH_POWER, 6108 sizeof(flashPower), &flashPower); 6109 } 6110 6111 if (frame_settings.exists(ANDROID_FLASH_FIRING_TIME)) { 6112 int64_t flashFiringTime = 6113 frame_settings.find(ANDROID_FLASH_FIRING_TIME).data.i64[0]; 6114 rc = AddSetParmEntryToBatch(hal_metadata, 6115 CAM_INTF_META_FLASH_FIRING_TIME, sizeof(flashFiringTime), &flashFiringTime); 6116 } 6117 6118 if (frame_settings.exists(ANDROID_HOT_PIXEL_MODE)) { 6119 uint8_t hotPixelMode = 6120 frame_settings.find(ANDROID_HOT_PIXEL_MODE).data.u8[0]; 6121 rc = AddSetParmEntryToBatch(hal_metadata, CAM_INTF_META_HOTPIXEL_MODE, 6122 sizeof(hotPixelMode), &hotPixelMode); 6123 } 6124 6125 if (frame_settings.exists(ANDROID_LENS_APERTURE)) { 6126 float lensAperture = 6127 frame_settings.find( ANDROID_LENS_APERTURE).data.f[0]; 6128 rc = AddSetParmEntryToBatch(hal_metadata, CAM_INTF_META_LENS_APERTURE, 6129 sizeof(lensAperture), &lensAperture); 6130 } 6131 6132 if (frame_settings.exists(ANDROID_LENS_FILTER_DENSITY)) { 6133 float filterDensity = 6134 frame_settings.find(ANDROID_LENS_FILTER_DENSITY).data.f[0]; 6135 rc = AddSetParmEntryToBatch(hal_metadata, CAM_INTF_META_LENS_FILTERDENSITY, 6136 sizeof(filterDensity), &filterDensity); 6137 } 6138 6139 if (frame_settings.exists(ANDROID_LENS_FOCAL_LENGTH)) { 6140 float focalLength = 6141 frame_settings.find(ANDROID_LENS_FOCAL_LENGTH).data.f[0]; 6142 rc = AddSetParmEntryToBatch(hal_metadata, 6143 CAM_INTF_META_LENS_FOCAL_LENGTH, 6144 sizeof(focalLength), &focalLength); 6145 } 6146 6147 if (frame_settings.exists(ANDROID_LENS_OPTICAL_STABILIZATION_MODE)) { 6148 uint8_t optStabMode = 6149 frame_settings.find(ANDROID_LENS_OPTICAL_STABILIZATION_MODE).data.u8[0]; 6150 rc = AddSetParmEntryToBatch(hal_metadata, 6151 CAM_INTF_META_LENS_OPT_STAB_MODE, 6152 sizeof(optStabMode), &optStabMode); 6153 } 6154 6155 if (frame_settings.exists(ANDROID_NOISE_REDUCTION_MODE)) { 6156 uint8_t noiseRedMode = 6157 frame_settings.find(ANDROID_NOISE_REDUCTION_MODE).data.u8[0]; 6158 rc = AddSetParmEntryToBatch(hal_metadata, 6159 CAM_INTF_META_NOISE_REDUCTION_MODE, 6160 sizeof(noiseRedMode), &noiseRedMode); 6161 } 6162 6163 if (frame_settings.exists(ANDROID_NOISE_REDUCTION_STRENGTH)) { 6164 uint8_t noiseRedStrength = 6165 frame_settings.find(ANDROID_NOISE_REDUCTION_STRENGTH).data.u8[0]; 6166 rc = AddSetParmEntryToBatch(hal_metadata, 6167 CAM_INTF_META_NOISE_REDUCTION_STRENGTH, 6168 sizeof(noiseRedStrength), &noiseRedStrength); 6169 } 6170 6171 cam_crop_region_t scalerCropRegion; 6172 bool scalerCropSet = false; 6173 if (frame_settings.exists(ANDROID_SCALER_CROP_REGION)) { 6174 scalerCropRegion.left = 6175 frame_settings.find(ANDROID_SCALER_CROP_REGION).data.i32[0]; 6176 scalerCropRegion.top = 6177 frame_settings.find(ANDROID_SCALER_CROP_REGION).data.i32[1]; 6178 scalerCropRegion.width = 6179 frame_settings.find(ANDROID_SCALER_CROP_REGION).data.i32[2]; 6180 scalerCropRegion.height = 6181 frame_settings.find(ANDROID_SCALER_CROP_REGION).data.i32[3]; 6182 rc = AddSetParmEntryToBatch(hal_metadata, 6183 CAM_INTF_META_SCALER_CROP_REGION, 6184 sizeof(scalerCropRegion), &scalerCropRegion); 6185 scalerCropSet = true; 6186 } 6187 6188 if (frame_settings.exists(ANDROID_SENSOR_EXPOSURE_TIME)) { 6189 int64_t sensorExpTime = 6190 frame_settings.find(ANDROID_SENSOR_EXPOSURE_TIME).data.i64[0]; 6191 CDBG("%s: setting sensorExpTime %lld", __func__, sensorExpTime); 6192 rc = AddSetParmEntryToBatch(hal_metadata, 6193 CAM_INTF_META_SENSOR_EXPOSURE_TIME, 6194 sizeof(sensorExpTime), &sensorExpTime); 6195 } 6196 6197 if (frame_settings.exists(ANDROID_SENSOR_FRAME_DURATION)) { 6198 int64_t sensorFrameDuration = 6199 frame_settings.find(ANDROID_SENSOR_FRAME_DURATION).data.i64[0]; 6200 int64_t minFrameDuration = getMinFrameDuration(request); 6201 sensorFrameDuration = MAX(sensorFrameDuration, minFrameDuration); 6202 if (sensorFrameDuration > gCamCapability[mCameraId]->max_frame_duration) 6203 sensorFrameDuration = gCamCapability[mCameraId]->max_frame_duration; 6204 CDBG("%s: clamp sensorFrameDuration to %lld", __func__, sensorFrameDuration); 6205 rc = AddSetParmEntryToBatch(hal_metadata, 6206 CAM_INTF_META_SENSOR_FRAME_DURATION, 6207 sizeof(sensorFrameDuration), &sensorFrameDuration); 6208 } 6209 6210 if (frame_settings.exists(ANDROID_SENSOR_SENSITIVITY)) { 6211 int32_t sensorSensitivity = 6212 frame_settings.find(ANDROID_SENSOR_SENSITIVITY).data.i32[0]; 6213 if (sensorSensitivity < 6214 gCamCapability[mCameraId]->sensitivity_range.min_sensitivity) 6215 sensorSensitivity = 6216 gCamCapability[mCameraId]->sensitivity_range.min_sensitivity; 6217 if (sensorSensitivity > 6218 gCamCapability[mCameraId]->sensitivity_range.max_sensitivity) 6219 sensorSensitivity = 6220 gCamCapability[mCameraId]->sensitivity_range.max_sensitivity; 6221 CDBG("%s: clamp sensorSensitivity to %d", __func__, sensorSensitivity); 6222 rc = AddSetParmEntryToBatch(hal_metadata, 6223 CAM_INTF_META_SENSOR_SENSITIVITY, 6224 sizeof(sensorSensitivity), &sensorSensitivity); 6225 } 6226 6227 if (frame_settings.exists(ANDROID_SHADING_MODE)) { 6228 uint8_t shadingMode = 6229 frame_settings.find(ANDROID_SHADING_MODE).data.u8[0]; 6230 rc = AddSetParmEntryToBatch(hal_metadata, CAM_INTF_META_SHADING_MODE, 6231 sizeof(shadingMode), &shadingMode); 6232 } 6233 6234 if (frame_settings.exists(ANDROID_SHADING_STRENGTH)) { 6235 uint8_t shadingStrength = 6236 frame_settings.find(ANDROID_SHADING_STRENGTH).data.u8[0]; 6237 rc = AddSetParmEntryToBatch(hal_metadata, CAM_INTF_META_SHADING_STRENGTH, 6238 sizeof(shadingStrength), &shadingStrength); 6239 } 6240 6241 if (frame_settings.exists(ANDROID_STATISTICS_FACE_DETECT_MODE)) { 6242 uint8_t fwk_facedetectMode = 6243 frame_settings.find(ANDROID_STATISTICS_FACE_DETECT_MODE).data.u8[0]; 6244 uint8_t facedetectMode = 6245 lookupHalName(FACEDETECT_MODES_MAP, 6246 sizeof(FACEDETECT_MODES_MAP), fwk_facedetectMode); 6247 rc = AddSetParmEntryToBatch(hal_metadata, 6248 CAM_INTF_META_STATS_FACEDETECT_MODE, 6249 sizeof(facedetectMode), &facedetectMode); 6250 } 6251 6252 if (frame_settings.exists(ANDROID_STATISTICS_HISTOGRAM_MODE)) { 6253 uint8_t histogramMode = 6254 frame_settings.find(ANDROID_STATISTICS_HISTOGRAM_MODE).data.u8[0]; 6255 rc = AddSetParmEntryToBatch(hal_metadata, 6256 CAM_INTF_META_STATS_HISTOGRAM_MODE, 6257 sizeof(histogramMode), &histogramMode); 6258 } 6259 6260 if (frame_settings.exists(ANDROID_STATISTICS_SHARPNESS_MAP_MODE)) { 6261 uint8_t sharpnessMapMode = 6262 frame_settings.find(ANDROID_STATISTICS_SHARPNESS_MAP_MODE).data.u8[0]; 6263 rc = AddSetParmEntryToBatch(hal_metadata, 6264 CAM_INTF_META_STATS_SHARPNESS_MAP_MODE, 6265 sizeof(sharpnessMapMode), &sharpnessMapMode); 6266 } 6267 6268 if (frame_settings.exists(ANDROID_TONEMAP_MODE)) { 6269 uint8_t tonemapMode = 6270 frame_settings.find(ANDROID_TONEMAP_MODE).data.u8[0]; 6271 rc = AddSetParmEntryToBatch(hal_metadata, 6272 CAM_INTF_META_TONEMAP_MODE, 6273 sizeof(tonemapMode), &tonemapMode); 6274 } 6275 /* Tonemap curve channels ch0 = G, ch 1 = B, ch 2 = R */ 6276 /*All tonemap channels will have the same number of points*/ 6277 if (frame_settings.exists(ANDROID_TONEMAP_CURVE_GREEN) && 6278 frame_settings.exists(ANDROID_TONEMAP_CURVE_BLUE) && 6279 frame_settings.exists(ANDROID_TONEMAP_CURVE_RED)) { 6280 cam_rgb_tonemap_curves tonemapCurves; 6281 tonemapCurves.tonemap_points_cnt = frame_settings.find(ANDROID_TONEMAP_CURVE_GREEN).count/2; 6282 if (tonemapCurves.tonemap_points_cnt > CAM_MAX_TONEMAP_CURVE_SIZE) { 6283 ALOGE("%s: Fatal: tonemap_points_cnt %d exceeds max value of %d", 6284 __func__, tonemapCurves.tonemap_points_cnt, 6285 CAM_MAX_TONEMAP_CURVE_SIZE); 6286 tonemapCurves.tonemap_points_cnt = CAM_MAX_TONEMAP_CURVE_SIZE; 6287 } 6288 6289 /* ch0 = G*/ 6290 int point = 0; 6291 cam_tonemap_curve_t tonemapCurveGreen; 6292 for (int i = 0; i < tonemapCurves.tonemap_points_cnt ; i++) { 6293 for (int j = 0; j < 2; j++) { 6294 tonemapCurveGreen.tonemap_points[i][j] = 6295 frame_settings.find(ANDROID_TONEMAP_CURVE_GREEN).data.f[point]; 6296 point++; 6297 } 6298 } 6299 tonemapCurves.curves[0] = tonemapCurveGreen; 6300 6301 /* ch 1 = B */ 6302 point = 0; 6303 cam_tonemap_curve_t tonemapCurveBlue; 6304 for (int i = 0; i < tonemapCurves.tonemap_points_cnt; i++) { 6305 for (int j = 0; j < 2; j++) { 6306 tonemapCurveBlue.tonemap_points[i][j] = 6307 frame_settings.find(ANDROID_TONEMAP_CURVE_BLUE).data.f[point]; 6308 point++; 6309 } 6310 } 6311 tonemapCurves.curves[1] = tonemapCurveBlue; 6312 6313 /* ch 2 = R */ 6314 point = 0; 6315 cam_tonemap_curve_t tonemapCurveRed; 6316 for (int i = 0; i < tonemapCurves.tonemap_points_cnt; i++) { 6317 for (int j = 0; j < 2; j++) { 6318 tonemapCurveRed.tonemap_points[i][j] = 6319 frame_settings.find(ANDROID_TONEMAP_CURVE_RED).data.f[point]; 6320 point++; 6321 } 6322 } 6323 tonemapCurves.curves[2] = tonemapCurveRed; 6324 6325 rc = AddSetParmEntryToBatch(hal_metadata, 6326 CAM_INTF_META_TONEMAP_CURVES, 6327 sizeof(tonemapCurves), &tonemapCurves); 6328 } 6329 6330 if (frame_settings.exists(ANDROID_CONTROL_CAPTURE_INTENT)) { 6331 uint8_t captureIntent = 6332 frame_settings.find(ANDROID_CONTROL_CAPTURE_INTENT).data.u8[0]; 6333 rc = AddSetParmEntryToBatch(hal_metadata, CAM_INTF_META_CAPTURE_INTENT, 6334 sizeof(captureIntent), &captureIntent); 6335 } 6336 6337 if (frame_settings.exists(ANDROID_BLACK_LEVEL_LOCK)) { 6338 uint8_t blackLevelLock = 6339 frame_settings.find(ANDROID_BLACK_LEVEL_LOCK).data.u8[0]; 6340 rc = AddSetParmEntryToBatch(hal_metadata, CAM_INTF_META_BLACK_LEVEL_LOCK, 6341 sizeof(blackLevelLock), &blackLevelLock); 6342 } 6343 6344 if (frame_settings.exists(ANDROID_STATISTICS_LENS_SHADING_MAP_MODE)) { 6345 uint8_t lensShadingMapMode = 6346 frame_settings.find(ANDROID_STATISTICS_LENS_SHADING_MAP_MODE).data.u8[0]; 6347 rc = AddSetParmEntryToBatch(hal_metadata, CAM_INTF_META_LENS_SHADING_MAP_MODE, 6348 sizeof(lensShadingMapMode), &lensShadingMapMode); 6349 } 6350 6351 if (frame_settings.exists(ANDROID_CONTROL_AE_REGIONS)) { 6352 cam_area_t roi; 6353 bool reset = true; 6354 convertFromRegions(&roi, request->settings, ANDROID_CONTROL_AE_REGIONS); 6355 if (scalerCropSet) { 6356 reset = resetIfNeededROI(&roi, &scalerCropRegion); 6357 } 6358 if (reset) { 6359 rc = AddSetParmEntryToBatch(hal_metadata, CAM_INTF_META_AEC_ROI, 6360 sizeof(roi), &roi); 6361 } 6362 } 6363 6364 if (frame_settings.exists(ANDROID_CONTROL_AF_REGIONS)) { 6365 cam_area_t roi; 6366 bool reset = true; 6367 convertFromRegions(&roi, request->settings, ANDROID_CONTROL_AF_REGIONS); 6368 if (scalerCropSet) { 6369 reset = resetIfNeededROI(&roi, &scalerCropRegion); 6370 } 6371 if (reset) { 6372 rc = AddSetParmEntryToBatch(hal_metadata, CAM_INTF_META_AF_ROI, 6373 sizeof(roi), &roi); 6374 } 6375 } 6376 6377 // CDS 6378 if (frame_settings.exists(QCAMERA3_CDS_MODE)) { 6379 int32_t* cds = 6380 frame_settings.find(QCAMERA3_CDS_MODE).data.i32; 6381 if ((CAM_CDS_MODE_MAX <= (*cds)) || (0 > (*cds))) { 6382 ALOGE("%s: Invalid CDS mode %d!", __func__, *cds); 6383 } else { 6384 cam_cds_mode_type_t mode = (cam_cds_mode_type_t) *cds; 6385 rc = AddSetParmEntryToBatch(mParameters, CAM_INTF_PARM_CDS_MODE, 6386 sizeof(mode), &mode); 6387 } 6388 } 6389 6390 if (frame_settings.exists(ANDROID_SENSOR_TEST_PATTERN_MODE)) { 6391 cam_test_pattern_data_t testPatternData; 6392 uint32_t fwk_testPatternMode = frame_settings.find(ANDROID_SENSOR_TEST_PATTERN_MODE).data.i32[0]; 6393 uint8_t testPatternMode = lookupHalName(TEST_PATTERN_MAP, 6394 sizeof(TEST_PATTERN_MAP), fwk_testPatternMode); 6395 6396 memset(&testPatternData, 0, sizeof(testPatternData)); 6397 testPatternData.mode = (cam_test_pattern_mode_t)testPatternMode; 6398 if (testPatternMode == CAM_TEST_PATTERN_SOLID_COLOR && 6399 frame_settings.exists(ANDROID_SENSOR_TEST_PATTERN_DATA)) { 6400 int32_t* fwk_testPatternData = frame_settings.find( 6401 ANDROID_SENSOR_TEST_PATTERN_DATA).data.i32; 6402 testPatternData.r = fwk_testPatternData[0]; 6403 testPatternData.b = fwk_testPatternData[3]; 6404 switch (gCamCapability[mCameraId]->color_arrangement) { 6405 case CAM_FILTER_ARRANGEMENT_RGGB: 6406 case CAM_FILTER_ARRANGEMENT_GRBG: 6407 testPatternData.gr = fwk_testPatternData[1]; 6408 testPatternData.gb = fwk_testPatternData[2]; 6409 break; 6410 case CAM_FILTER_ARRANGEMENT_GBRG: 6411 case CAM_FILTER_ARRANGEMENT_BGGR: 6412 testPatternData.gr = fwk_testPatternData[2]; 6413 testPatternData.gb = fwk_testPatternData[1]; 6414 break; 6415 default: 6416 ALOGE("%s: color arrangement %d is not supported", __func__, 6417 gCamCapability[mCameraId]->color_arrangement); 6418 break; 6419 } 6420 } 6421 rc = AddSetParmEntryToBatch(hal_metadata, CAM_INTF_META_TEST_PATTERN_DATA, 6422 sizeof(testPatternData), &testPatternData); 6423 } 6424 6425 if (frame_settings.exists(ANDROID_JPEG_GPS_COORDINATES)) { 6426 double *gps_coords = 6427 frame_settings.find(ANDROID_JPEG_GPS_COORDINATES).data.d; 6428 rc = AddSetParmEntryToBatch(hal_metadata, CAM_INTF_META_JPEG_GPS_COORDINATES, sizeof(double)*3, gps_coords); 6429 } 6430 6431 if (frame_settings.exists(ANDROID_JPEG_GPS_PROCESSING_METHOD)) { 6432 char gps_methods[GPS_PROCESSING_METHOD_SIZE]; 6433 const char *gps_methods_src = (const char *) 6434 frame_settings.find(ANDROID_JPEG_GPS_PROCESSING_METHOD).data.u8; 6435 uint32_t count = frame_settings.find( 6436 ANDROID_JPEG_GPS_PROCESSING_METHOD).count; 6437 memset(gps_methods, '\0', sizeof(gps_methods)); 6438 strncpy(gps_methods, gps_methods_src, sizeof(gps_methods)-1); 6439 rc = AddSetParmEntryToBatch(hal_metadata, CAM_INTF_META_JPEG_GPS_PROC_METHODS, sizeof(gps_methods), gps_methods); 6440 } 6441 6442 if (frame_settings.exists(ANDROID_JPEG_GPS_TIMESTAMP)) { 6443 int64_t gps_timestamp = 6444 frame_settings.find(ANDROID_JPEG_GPS_TIMESTAMP).data.i64[0]; 6445 rc = AddSetParmEntryToBatch(hal_metadata, CAM_INTF_META_JPEG_GPS_TIMESTAMP, sizeof(int64_t), &gps_timestamp); 6446 } 6447 6448 if (frame_settings.exists(ANDROID_JPEG_ORIENTATION)) { 6449 int32_t orientation = 6450 frame_settings.find(ANDROID_JPEG_ORIENTATION).data.i32[0]; 6451 cam_rotation_info_t rotation_info; 6452 if (orientation == 0) { 6453 rotation_info.rotation = ROTATE_0; 6454 } else if (orientation == 90) { 6455 rotation_info.rotation = ROTATE_90; 6456 } else if (orientation == 180) { 6457 rotation_info.rotation = ROTATE_180; 6458 } else if (orientation == 270) { 6459 rotation_info.rotation = ROTATE_270; 6460 } 6461 rotation_info.streamId = snapshotStreamId; 6462 rc = AddSetParmEntryToBatch(hal_metadata, CAM_INTF_META_JPEG_ORIENTATION, sizeof(orientation), &orientation); 6463 rc = AddSetParmEntryToBatch(hal_metadata, CAM_INTF_PARM_ROTATION, sizeof(rotation_info), &rotation_info); 6464 } 6465 6466 if (frame_settings.exists(ANDROID_JPEG_QUALITY)) { 6467 int8_t quality = 6468 frame_settings.find(ANDROID_JPEG_QUALITY).data.u8[0]; 6469 rc = AddSetParmEntryToBatch(hal_metadata, CAM_INTF_META_JPEG_QUALITY, sizeof(quality), &quality); 6470 } 6471 6472 if (frame_settings.exists(ANDROID_JPEG_THUMBNAIL_QUALITY)) { 6473 int8_t thumb_quality = 6474 frame_settings.find(ANDROID_JPEG_THUMBNAIL_QUALITY).data.u8[0]; 6475 rc = AddSetParmEntryToBatch(hal_metadata, CAM_INTF_META_JPEG_THUMB_QUALITY, sizeof(thumb_quality), &thumb_quality); 6476 } 6477 6478 if (frame_settings.exists(ANDROID_JPEG_THUMBNAIL_SIZE)) { 6479 cam_dimension_t dim; 6480 dim.width = frame_settings.find(ANDROID_JPEG_THUMBNAIL_SIZE).data.i32[0]; 6481 dim.height = frame_settings.find(ANDROID_JPEG_THUMBNAIL_SIZE).data.i32[1]; 6482 rc = AddSetParmEntryToBatch(hal_metadata, CAM_INTF_META_JPEG_THUMB_SIZE, sizeof(dim), &dim); 6483 } 6484 6485 // Internal metadata 6486 if (frame_settings.exists(QCAMERA3_PRIVATEDATA_REPROCESS)) { 6487 int32_t* privatedata = 6488 frame_settings.find(QCAMERA3_PRIVATEDATA_REPROCESS).data.i32; 6489 rc = AddSetParmEntryToBatch(hal_metadata, CAM_INTF_META_PRIVATE_DATA, 6490 sizeof(int32_t) * MAX_METADATA_PRIVATE_PAYLOAD_SIZE, privatedata); 6491 } 6492 6493 // EV step 6494 rc = AddSetParmEntryToBatch(hal_metadata, CAM_INTF_PARM_EV_STEP, 6495 sizeof(cam_rational_type_t), &(gCamCapability[mCameraId]->exp_compensation_step)); 6496 6497 return rc; 6498 } 6499 6500 /*=========================================================================== 6501 * FUNCTION : captureResultCb 6502 * 6503 * DESCRIPTION: Callback handler for all channels (streams, as well as metadata) 6504 * 6505 * PARAMETERS : 6506 * @frame : frame information from mm-camera-interface 6507 * @buffer : actual gralloc buffer to be returned to frameworks. NULL if metadata. 6508 * @userdata: userdata 6509 * 6510 * RETURN : NONE 6511 *==========================================================================*/ 6512 void QCamera3HardwareInterface::captureResultCb(mm_camera_super_buf_t *metadata, 6513 camera3_stream_buffer_t *buffer, 6514 uint32_t frame_number, void *userdata) 6515 { 6516 QCamera3HardwareInterface *hw = (QCamera3HardwareInterface *)userdata; 6517 if (hw == NULL) { 6518 ALOGE("%s: Invalid hw %p", __func__, hw); 6519 return; 6520 } 6521 6522 hw->captureResultCb(metadata, buffer, frame_number); 6523 return; 6524 } 6525 6526 6527 /*=========================================================================== 6528 * FUNCTION : initialize 6529 * 6530 * DESCRIPTION: Pass framework callback pointers to HAL 6531 * 6532 * PARAMETERS : 6533 * 6534 * 6535 * RETURN : Success : 0 6536 * Failure: -ENODEV 6537 *==========================================================================*/ 6538 6539 int QCamera3HardwareInterface::initialize(const struct camera3_device *device, 6540 const camera3_callback_ops_t *callback_ops) 6541 { 6542 CDBG("%s: E", __func__); 6543 QCamera3HardwareInterface *hw = 6544 reinterpret_cast<QCamera3HardwareInterface *>(device->priv); 6545 if (!hw) { 6546 ALOGE("%s: NULL camera device", __func__); 6547 return -ENODEV; 6548 } 6549 6550 int rc = hw->initialize(callback_ops); 6551 CDBG("%s: X", __func__); 6552 return rc; 6553 } 6554 6555 /*=========================================================================== 6556 * FUNCTION : configure_streams 6557 * 6558 * DESCRIPTION: 6559 * 6560 * PARAMETERS : 6561 * 6562 * 6563 * RETURN : Success: 0 6564 * Failure: -EINVAL (if stream configuration is invalid) 6565 * -ENODEV (fatal error) 6566 *==========================================================================*/ 6567 6568 int QCamera3HardwareInterface::configure_streams( 6569 const struct camera3_device *device, 6570 camera3_stream_configuration_t *stream_list) 6571 { 6572 CDBG("%s: E", __func__); 6573 QCamera3HardwareInterface *hw = 6574 reinterpret_cast<QCamera3HardwareInterface *>(device->priv); 6575 if (!hw) { 6576 ALOGE("%s: NULL camera device", __func__); 6577 return -ENODEV; 6578 } 6579 int rc = hw->configureStreams(stream_list); 6580 CDBG("%s: X", __func__); 6581 return rc; 6582 } 6583 6584 /*=========================================================================== 6585 * FUNCTION : construct_default_request_settings 6586 * 6587 * DESCRIPTION: Configure a settings buffer to meet the required use case 6588 * 6589 * PARAMETERS : 6590 * 6591 * 6592 * RETURN : Success: Return valid metadata 6593 * Failure: Return NULL 6594 *==========================================================================*/ 6595 const camera_metadata_t* QCamera3HardwareInterface:: 6596 construct_default_request_settings(const struct camera3_device *device, 6597 int type) 6598 { 6599 6600 CDBG("%s: E", __func__); 6601 camera_metadata_t* fwk_metadata = NULL; 6602 QCamera3HardwareInterface *hw = 6603 reinterpret_cast<QCamera3HardwareInterface *>(device->priv); 6604 if (!hw) { 6605 ALOGE("%s: NULL camera device", __func__); 6606 return NULL; 6607 } 6608 6609 fwk_metadata = hw->translateCapabilityToMetadata(type); 6610 6611 CDBG("%s: X", __func__); 6612 return fwk_metadata; 6613 } 6614 6615 /*=========================================================================== 6616 * FUNCTION : process_capture_request 6617 * 6618 * DESCRIPTION: 6619 * 6620 * PARAMETERS : 6621 * 6622 * 6623 * RETURN : 6624 *==========================================================================*/ 6625 int QCamera3HardwareInterface::process_capture_request( 6626 const struct camera3_device *device, 6627 camera3_capture_request_t *request) 6628 { 6629 CDBG("%s: E", __func__); 6630 QCamera3HardwareInterface *hw = 6631 reinterpret_cast<QCamera3HardwareInterface *>(device->priv); 6632 if (!hw) { 6633 ALOGE("%s: NULL camera device", __func__); 6634 return -EINVAL; 6635 } 6636 6637 int rc = hw->processCaptureRequest(request); 6638 CDBG("%s: X", __func__); 6639 return rc; 6640 } 6641 6642 /*=========================================================================== 6643 * FUNCTION : dump 6644 * 6645 * DESCRIPTION: 6646 * 6647 * PARAMETERS : 6648 * 6649 * 6650 * RETURN : 6651 *==========================================================================*/ 6652 6653 void QCamera3HardwareInterface::dump( 6654 const struct camera3_device *device, int fd) 6655 { 6656 /* Log level property is read when "adb shell dumpsys media.camera" is 6657 called so that the log level can be controlled without restarting 6658 the media server */ 6659 getLogLevel(); 6660 6661 CDBG("%s: E", __func__); 6662 QCamera3HardwareInterface *hw = 6663 reinterpret_cast<QCamera3HardwareInterface *>(device->priv); 6664 if (!hw) { 6665 ALOGE("%s: NULL camera device", __func__); 6666 return; 6667 } 6668 6669 hw->dump(fd); 6670 CDBG("%s: X", __func__); 6671 return; 6672 } 6673 6674 /*=========================================================================== 6675 * FUNCTION : flush 6676 * 6677 * DESCRIPTION: 6678 * 6679 * PARAMETERS : 6680 * 6681 * 6682 * RETURN : 6683 *==========================================================================*/ 6684 6685 int QCamera3HardwareInterface::flush( 6686 const struct camera3_device *device) 6687 { 6688 int rc; 6689 CDBG("%s: E", __func__); 6690 QCamera3HardwareInterface *hw = 6691 reinterpret_cast<QCamera3HardwareInterface *>(device->priv); 6692 if (!hw) { 6693 ALOGE("%s: NULL camera device", __func__); 6694 return -EINVAL; 6695 } 6696 6697 rc = hw->flush(); 6698 CDBG("%s: X", __func__); 6699 return rc; 6700 } 6701 6702 /*=========================================================================== 6703 * FUNCTION : close_camera_device 6704 * 6705 * DESCRIPTION: 6706 * 6707 * PARAMETERS : 6708 * 6709 * 6710 * RETURN : 6711 *==========================================================================*/ 6712 int QCamera3HardwareInterface::close_camera_device(struct hw_device_t* device) 6713 { 6714 CDBG("%s: E", __func__); 6715 int ret = NO_ERROR; 6716 QCamera3HardwareInterface *hw = 6717 reinterpret_cast<QCamera3HardwareInterface *>( 6718 reinterpret_cast<camera3_device_t *>(device)->priv); 6719 if (!hw) { 6720 ALOGE("NULL camera device"); 6721 return BAD_VALUE; 6722 } 6723 delete hw; 6724 6725 CDBG("%s: X", __func__); 6726 return ret; 6727 } 6728 6729 /*=========================================================================== 6730 * FUNCTION : getWaveletDenoiseProcessPlate 6731 * 6732 * DESCRIPTION: query wavelet denoise process plate 6733 * 6734 * PARAMETERS : None 6735 * 6736 * RETURN : WNR prcocess plate vlaue 6737 *==========================================================================*/ 6738 cam_denoise_process_type_t QCamera3HardwareInterface::getWaveletDenoiseProcessPlate() 6739 { 6740 char prop[PROPERTY_VALUE_MAX]; 6741 memset(prop, 0, sizeof(prop)); 6742 property_get("persist.denoise.process.plates", prop, "0"); 6743 int processPlate = atoi(prop); 6744 switch(processPlate) { 6745 case 0: 6746 return CAM_WAVELET_DENOISE_YCBCR_PLANE; 6747 case 1: 6748 return CAM_WAVELET_DENOISE_CBCR_ONLY; 6749 case 2: 6750 return CAM_WAVELET_DENOISE_STREAMLINE_YCBCR; 6751 case 3: 6752 return CAM_WAVELET_DENOISE_STREAMLINED_CBCR; 6753 default: 6754 return CAM_WAVELET_DENOISE_STREAMLINE_YCBCR; 6755 } 6756 } 6757 6758 /*=========================================================================== 6759 * FUNCTION : needRotationReprocess 6760 * 6761 * DESCRIPTION: if rotation needs to be done by reprocess in pp 6762 * 6763 * PARAMETERS : none 6764 * 6765 * RETURN : true: needed 6766 * false: no need 6767 *==========================================================================*/ 6768 bool QCamera3HardwareInterface::needRotationReprocess() 6769 { 6770 if ((gCamCapability[mCameraId]->qcom_supported_feature_mask & CAM_QCOM_FEATURE_ROTATION) > 0) { 6771 // current rotation is not zero, and pp has the capability to process rotation 6772 CDBG_HIGH("%s: need do reprocess for rotation", __func__); 6773 return true; 6774 } 6775 6776 return false; 6777 } 6778 6779 /*=========================================================================== 6780 * FUNCTION : needReprocess 6781 * 6782 * DESCRIPTION: if reprocess in needed 6783 * 6784 * PARAMETERS : none 6785 * 6786 * RETURN : true: needed 6787 * false: no need 6788 *==========================================================================*/ 6789 bool QCamera3HardwareInterface::needReprocess(uint32_t postprocess_mask) 6790 { 6791 if (gCamCapability[mCameraId]->min_required_pp_mask > 0) { 6792 // TODO: add for ZSL HDR later 6793 // pp module has min requirement for zsl reprocess, or WNR in ZSL mode 6794 if(postprocess_mask == CAM_QCOM_FEATURE_NONE){ 6795 CDBG_HIGH("%s: need do reprocess for ZSL WNR or min PP reprocess", __func__); 6796 return true; 6797 } else { 6798 CDBG_HIGH("%s: already post processed frame", __func__); 6799 return false; 6800 } 6801 } 6802 return needRotationReprocess(); 6803 } 6804 6805 /*=========================================================================== 6806 * FUNCTION : needJpegRotation 6807 * 6808 * DESCRIPTION: if rotation from jpeg is needed 6809 * 6810 * PARAMETERS : none 6811 * 6812 * RETURN : true: needed 6813 * false: no need 6814 *==========================================================================*/ 6815 bool QCamera3HardwareInterface::needJpegRotation() 6816 { 6817 /*If the pp does not have the ability to do rotation, enable jpeg rotation*/ 6818 if (!(gCamCapability[mCameraId]->qcom_supported_feature_mask & CAM_QCOM_FEATURE_ROTATION)) { 6819 CDBG("%s: Need Jpeg to do the rotation", __func__); 6820 return true; 6821 } 6822 return false; 6823 } 6824 6825 /*=========================================================================== 6826 * FUNCTION : addOfflineReprocChannel 6827 * 6828 * DESCRIPTION: add a reprocess channel that will do reprocess on frames 6829 * coming from input channel 6830 * 6831 * PARAMETERS : 6832 * @config : reprocess configuration 6833 * 6834 * 6835 * RETURN : Ptr to the newly created channel obj. NULL if failed. 6836 *==========================================================================*/ 6837 QCamera3ReprocessChannel *QCamera3HardwareInterface::addOfflineReprocChannel( 6838 const reprocess_config_t &config, QCamera3PicChannel *picChHandle, 6839 metadata_buffer_t *metadata) 6840 { 6841 int32_t rc = NO_ERROR; 6842 QCamera3ReprocessChannel *pChannel = NULL; 6843 6844 pChannel = new QCamera3ReprocessChannel(mCameraHandle->camera_handle, 6845 mCameraHandle->ops, NULL, config.padding, CAM_QCOM_FEATURE_NONE, this, picChHandle); 6846 if (NULL == pChannel) { 6847 ALOGE("%s: no mem for reprocess channel", __func__); 6848 return NULL; 6849 } 6850 6851 rc = pChannel->initialize(IS_TYPE_NONE, mCaptureIntent); 6852 if (rc != NO_ERROR) { 6853 ALOGE("%s: init reprocess channel failed, ret = %d", __func__, rc); 6854 delete pChannel; 6855 return NULL; 6856 } 6857 6858 // pp feature config 6859 cam_pp_feature_config_t pp_config; 6860 memset(&pp_config, 0, sizeof(cam_pp_feature_config_t)); 6861 6862 pp_config.feature_mask |= CAM_QCOM_FEATURE_PP_SUPERSET; 6863 6864 rc = pChannel->addReprocStreamsFromSource(pp_config, 6865 config, 6866 IS_TYPE_NONE, 6867 mMetadataChannel); 6868 6869 if (rc != NO_ERROR) { 6870 delete pChannel; 6871 return NULL; 6872 } 6873 return pChannel; 6874 } 6875 6876 6877 bool QCamera3HardwareInterface::isCACEnabled() { 6878 char prop[PROPERTY_VALUE_MAX]; 6879 memset(prop, 0, sizeof(prop)); 6880 property_get("persist.camera.feature.cac", prop, "0"); 6881 int enableCAC = atoi(prop); 6882 return enableCAC; 6883 } 6884 /*=========================================================================== 6885 * FUNCTION : getLogLevel 6886 * 6887 * DESCRIPTION: Reads the log level property into a variable 6888 * 6889 * PARAMETERS : 6890 * None 6891 * 6892 * RETURN : 6893 * None 6894 *==========================================================================*/ 6895 void QCamera3HardwareInterface::getLogLevel() 6896 { 6897 char prop[PROPERTY_VALUE_MAX]; 6898 6899 property_get("persist.camera.logs", prop, "0"); 6900 gCamHal3LogLevel = atoi(prop); 6901 6902 return; 6903 } 6904 6905 }; //end namespace qcamera 6906