diff --git a/camera/QCamera2/HAL/QCamera2HWI.cpp b/camera/QCamera2/HAL/QCamera2HWI.cpp index fda921202c8e87549075bf87be70fa1fd731ed2b..087dea98e63d8852d0e36d016347e5b6d4da2e13 100644 --- a/camera/QCamera2/HAL/QCamera2HWI.cpp +++ b/camera/QCamera2/HAL/QCamera2HWI.cpp @@ -113,7 +113,7 @@ camera_device_ops_t QCamera2HardwareInterface::mCameraOps = { .release = QCamera2HardwareInterface::release, .dump = QCamera2HardwareInterface::dump, }; - +uint32_t QCamera2HardwareInterface::sessionId[] = {0xDEADBEEF, 0xDEADBEEF, 0xDEADBEEF}; /*=========================================================================== * FUNCTION : set_preview_window * @@ -1979,7 +1979,8 @@ int QCamera2HardwareInterface::openCamera() memset(value, 0, sizeof(value)); property_get("persist.camera.depth.focus.cb", value, "1"); bDepthAFCallbacks = atoi(value); - + mCameraHandle->ops->get_session_id(mCameraHandle->camera_handle, + &sessionId[mCameraId]); return NO_ERROR; error_exit3: @@ -2227,7 +2228,7 @@ int QCamera2HardwareInterface::closeCamera() mCameraOpened = false; // Reset Stream config info - mParameters.setStreamConfigure(false, false, true); + mParameters.setStreamConfigure(false, false, true, sessionId); // deinit Parameters mParameters.deinit(); @@ -2632,7 +2633,11 @@ uint8_t QCamera2HardwareInterface::getBufNumRequired(cam_stream_type_t stream_ty if (is4k2kResolution(&dim)) { //get additional buffer count property_get("vidc.enc.dcvs.extra-buff-count", value, "0"); - bufferCnt += atoi(value); + persist_cnt = atoi(value); + if (persist_cnt >= 0 && + persist_cnt < CAM_MAX_NUM_BUFS_PER_STREAM) { + bufferCnt += persist_cnt; + } } } break; @@ -2686,7 +2691,7 @@ uint8_t QCamera2HardwareInterface::getBufNumRequired(cam_stream_type_t stream_ty } LOGH("Buffer count = %d for stream type = %d", bufferCnt, stream_type); - if (CAM_MAX_NUM_BUFS_PER_STREAM < bufferCnt) { + if (bufferCnt < 0 || CAM_MAX_NUM_BUFS_PER_STREAM < bufferCnt) { LOGW("Buffer count %d for stream type %d exceeds limit %d", bufferCnt, stream_type, CAM_MAX_NUM_BUFS_PER_STREAM); return CAM_MAX_NUM_BUFS_PER_STREAM; @@ -4877,7 +4882,7 @@ int32_t QCamera2HardwareInterface::declareSnapshotStreams() int rc = NO_ERROR; // Update stream info configuration - rc = mParameters.setStreamConfigure(true, mLongshotEnabled, false); + rc = mParameters.setStreamConfigure(true, mLongshotEnabled, false, sessionId); if (rc != NO_ERROR) { LOGE("setStreamConfigure failed %d", rc); return rc; @@ -8193,7 +8198,7 @@ int32_t QCamera2HardwareInterface::preparePreview() int32_t rc = NO_ERROR; LOGI("E"); - rc = mParameters.setStreamConfigure(false, false, false); + rc = mParameters.setStreamConfigure(false, false, false, sessionId); if (rc != NO_ERROR) { LOGE("setStreamConfigure failed %d", rc); return rc; diff --git a/camera/QCamera2/HAL/QCamera2HWI.h b/camera/QCamera2/HAL/QCamera2HWI.h index 161f0691555253ebe70cd4da4ac50e1f1ffdbc30..5e9e38d8dcba0959cc8d2353e06885865c1e1a74 100644 --- a/camera/QCamera2/HAL/QCamera2HWI.h +++ b/camera/QCamera2/HAL/QCamera2HWI.h @@ -279,7 +279,7 @@ public: virtual QCameraHeapMemory *allocateMiscBuf(cam_stream_info_t *streamInfo); virtual QCameraMemory *allocateStreamUserBuf(cam_stream_info_t *streamInfo); virtual void waitForDeferredAlloc(cam_stream_type_t stream_type); - + static uint32_t sessionId[MM_CAMERA_MAX_NUM_SENSORS]; // Implementation of QCameraThermalCallback virtual int thermalEvtHandle(qcamera_thermal_level_enum_t *level, void *userdata, void *data); diff --git a/camera/QCamera2/HAL/QCameraMem.cpp b/camera/QCamera2/HAL/QCameraMem.cpp old mode 100644 new mode 100755 index 5d88fbd13f3d82557657122785f4debb1f89f15c..6bddd0cf38563bc8a2dbf51b7eab918e2cb29042 --- a/camera/QCamera2/HAL/QCameraMem.cpp +++ b/camera/QCamera2/HAL/QCameraMem.cpp @@ -652,7 +652,7 @@ int QCameraMemoryPool::findBufferLocked( size_t size, bool cached, cam_stream_type_t streamType) { int rc = NAME_NOT_FOUND; - + size_t alignsize = (size + 4095U) & (~4095U); if (mPools[streamType].empty()) { return NAME_NOT_FOUND; } @@ -660,7 +660,7 @@ int QCameraMemoryPool::findBufferLocked( List<struct QCameraMemory::QCameraMemInfo>::iterator it = mPools[streamType].begin(); if (streamType == CAM_STREAM_TYPE_OFFLINE_PROC) { for( ; it != mPools[streamType].end() ; it++) { - if( ((*it).size == size) && + if( ((*it).size == alignsize) && ((*it).heap_id == heap_id) && ((*it).cached == cached) ) { memInfo = *it; diff --git a/camera/QCamera2/HAL/QCameraParameters.cpp b/camera/QCamera2/HAL/QCameraParameters.cpp index 59d99d55b9eb990ac9c3ed1d17379a0d4d006f7a..7830330bcfd49fec5c5e2ceba17a46ad34b4a0f0 100644 --- a/camera/QCamera2/HAL/QCameraParameters.cpp +++ b/camera/QCamera2/HAL/QCameraParameters.cpp @@ -213,6 +213,9 @@ const char QCameraParameters::KEY_QC_INSTANT_AEC_SUPPORTED_MODES[] = "instant-ae const char QCameraParameters::KEY_QC_INSTANT_CAPTURE_SUPPORTED_MODES[] = "instant-capture-values"; const char QCameraParameters::KEY_QC_LED_CALIBRATION_MODES[] = "led-calibration-mode"; +const char QCameraParameters::KEY_QC_DUAL_CAMERA_MODE[] = "dual-camera-mode"; +const char QCameraParameters::KEY_QC_DUAL_CAMERA_ID[] = "dual-camera-id"; +const char QCameraParameters::KEY_QC_DUAL_CAMERA_MAIN_CAMERA[] = "dual-camera-main-camera"; // Values for effect settings. const char QCameraParameters::EFFECT_EMBOSS[] = "emboss"; const char QCameraParameters::EFFECT_SKETCH[] = "sketch"; @@ -991,7 +994,10 @@ QCameraParameters::QCameraParameters() mAecFrameBound(0), mAecSkipDisplayFrameBound(0), m_bQuadraCfa(false), - m_bSmallJpegSize(false) + m_bSmallJpegSize(false), + m_bDualCameraMode(false), + mDualCamId(0), + m_bMainCamera(false) { char value[PROPERTY_VALUE_MAX]; // TODO: may move to parameter instead of sysprop @@ -1124,7 +1130,10 @@ QCameraParameters::QCameraParameters(const String8 ¶ms) mAecFrameBound(0), mAecSkipDisplayFrameBound(0), m_bQuadraCfa(false), - m_bSmallJpegSize(false) + m_bSmallJpegSize(false), + m_bDualCameraMode(false), + mDualCamId(0), + m_bMainCamera(false) { memset(&m_LiveSnapshotSize, 0, sizeof(m_LiveSnapshotSize)); memset(&m_default_fps_range, 0, sizeof(m_default_fps_range)); @@ -5280,6 +5289,7 @@ int32_t QCameraParameters::updateParameters(const String8& p, if ((rc = setLongshotParam(params))) final_rc = rc; if ((rc = setLedCalibration(params))) final_rc = rc; + if ((rc = setDualCameraMode(params))) final_rc = rc; setQuadraCfa(params); setVideoBatchSize(); @@ -6139,7 +6149,10 @@ int32_t QCameraParameters::initDefaultParameters() // Set default burst number set(KEY_QC_SNAPSHOT_BURST_NUM, 0); set(KEY_QC_NUM_RETRO_BURST_PER_SHUTTER, 0); - + // Set default dual camera info + set(KEY_QC_DUAL_CAMERA_MODE,VALUE_OFF); + set(KEY_QC_DUAL_CAMERA_ID,0); + set(KEY_QC_DUAL_CAMERA_MAIN_CAMERA,VALUE_FALSE); //Get RAM size and disable features which are memory rich struct sysinfo info; sysinfo(&info); @@ -6391,7 +6404,7 @@ void QCameraParameters::deinit() m_pCamOpsTbl->camera_handle, CAM_MAPPING_BUF_TYPE_PARM_BUF); - if (m_relCamSyncInfo.sync_control == CAM_SYNC_RELATED_SENSORS_ON) { + if (m_relCamSyncInfo.sync_control == CAM_SYNC_RELATED_SENSORS_ON || m_bDualCameraMode) { m_pCamOpsTbl->ops->unmap_buf( m_pCamOpsTbl->camera_handle, CAM_MAPPING_BUF_TYPE_SYNC_RELATED_SENSORS_BUF); @@ -13089,7 +13102,6 @@ bool QCameraParameters::sendStreamConfigInfo(cam_stream_size_info_t &stream_conf LOGE("Failed to initialize group update table"); return BAD_TYPE; } - if (ADD_SET_PARAM_ENTRY_TO_BATCH(m_pParamBuf, CAM_INTF_META_STREAM_INFO, stream_config_info)) { LOGE("Failed to update table"); @@ -13119,7 +13131,7 @@ bool QCameraParameters::sendStreamConfigInfo(cam_stream_size_info_t &stream_conf * none-zero failure code *==========================================================================*/ bool QCameraParameters::setStreamConfigure(bool isCapture, - bool previewAsPostview, bool resetConfig) { + bool previewAsPostview, bool resetConfig, uint32_t* sessionId) { int32_t rc = NO_ERROR; cam_stream_size_info_t stream_config_info; @@ -13407,8 +13419,67 @@ bool QCameraParameters::setStreamConfigure(bool isCapture, stream_config_info.sub_format_type[k], stream_config_info.is_type[k]); } - + if (m_bMainCamera && m_bDualCameraMode){ + stream_config_info.sync_type = CAM_TYPE_MAIN; + } else if (m_bDualCameraMode){ + stream_config_info.sync_type = CAM_TYPE_AUX; + } rc = sendStreamConfigInfo(stream_config_info); + if (m_bDualCameraMode) { + if (m_pRelCamSyncHeap == NULL) { + m_pRelCamSyncHeap = new QCameraHeapMemory(QCAMERA_ION_USE_CACHE); + rc = m_pRelCamSyncHeap->allocate(1, + sizeof(cam_sync_related_sensors_event_info_t), NON_SECURE); + if(rc != OK) { + rc = NO_MEMORY; + LOGE("Failed to allocate Related cam sync Heap memory"); + delete m_pRelCamSyncHeap; + m_pRelCamSyncHeap = NULL; + return rc; + } + + //Map memory for related cam sync buffer + rc = m_pCamOpsTbl->ops->map_buf(m_pCamOpsTbl->camera_handle, + CAM_MAPPING_BUF_TYPE_SYNC_RELATED_SENSORS_BUF, + m_pRelCamSyncHeap->getFd(0), + sizeof(cam_sync_related_sensors_event_info_t), + (cam_sync_related_sensors_event_info_t*)DATA_PTR(m_pRelCamSyncHeap,0)); + if(rc < 0) { + LOGE("failed to map Related cam sync buffer"); + rc = FAILED_TRANSACTION; + m_pRelCamSyncHeap->deallocate(); + delete m_pRelCamSyncHeap; + m_pRelCamSyncHeap = NULL; + return rc; + } + m_pRelCamSyncBuf = + (cam_sync_related_sensors_event_info_t*) DATA_PTR(m_pRelCamSyncHeap,0); + } + if (!resetConfig) { + m_pRelCamSyncBuf->sync_control = CAM_SYNC_RELATED_SENSORS_ON; + } else { + m_pRelCamSyncBuf->sync_control = CAM_SYNC_RELATED_SENSORS_OFF; + } + if (m_bMainCamera){ + m_pRelCamSyncBuf->mode = CAM_MODE_PRIMARY; + m_pRelCamSyncBuf->type = CAM_TYPE_MAIN; + m_pRelCamSyncBuf->related_sensor_session_id = sessionId[mDualCamId]; + } else { + m_pRelCamSyncBuf->mode = CAM_MODE_SECONDARY; + m_pRelCamSyncBuf->type = CAM_TYPE_AUX; + m_pRelCamSyncBuf->related_sensor_session_id = sessionId[mDualCamId]; + } + rc = m_pCamOpsTbl->ops->sync_related_sensors( + m_pCamOpsTbl->camera_handle, m_pRelCamSyncBuf); + if(rc < 0) { + LOGE("failed to send sync command"); + rc = FAILED_TRANSACTION; + m_pRelCamSyncHeap->deallocate(); + delete m_pRelCamSyncHeap; + m_pRelCamSyncHeap = NULL; + return rc; + } + } updateSnapshotPpMask(stream_config_info); return rc; } @@ -14735,6 +14806,43 @@ int32_t QCameraParameters::setLedCalibration( return NO_ERROR; } +/*=========================================================================== + * FUNCTION : setDualCameraMode + * + * DESCRIPTION: set dual led calibration + * + * PARAMETERS : + * @params : user setting parameters + * + * RETURN : int32_t type of status + * NO_ERROR -- success + * none-zero failure code + *==========================================================================*/ +int32_t QCameraParameters::setDualCameraMode(const QCameraParameters& params) +{ + const char *str = params.get(KEY_QC_DUAL_CAMERA_MODE); + const char *prev_str = get(KEY_QC_DUAL_CAMERA_MODE); + int value; + + if (str != NULL) { + if (prev_str == NULL || strcmp(str, prev_str) != 0) { + value = lookupAttr(ON_OFF_MODES_MAP, PARAM_MAP_SIZE(ON_OFF_MODES_MAP), + str); + m_bDualCameraMode = value; + } + } + if (m_bDualCameraMode) { + mDualCamId = params.getInt(KEY_QC_DUAL_CAMERA_ID); + str = params.get(KEY_QC_DUAL_CAMERA_MAIN_CAMERA); + prev_str = get(KEY_QC_DUAL_CAMERA_MAIN_CAMERA); + if (prev_str == NULL || strcmp(str, prev_str) != 0) { + value = lookupAttr(TRUE_FALSE_MODES_MAP, PARAM_MAP_SIZE(TRUE_FALSE_MODES_MAP), + str); + m_bMainCamera = value; + } + } + return NO_ERROR; +} /*=========================================================================== * FUNCTION : setLedCalibration diff --git a/camera/QCamera2/HAL/QCameraParameters.h b/camera/QCamera2/HAL/QCameraParameters.h index d814f460eac867d22f1879b51ffe563a40dab570..072c2d430832bb4b4db0b62d89d51b0cd14f3e9b 100644 --- a/camera/QCamera2/HAL/QCameraParameters.h +++ b/camera/QCamera2/HAL/QCameraParameters.h @@ -335,6 +335,11 @@ private: //Longshot static const char KEY_QC_LONGSHOT_SUPPORTED[]; + // Dual camera mode + static const char KEY_QC_DUAL_CAMERA_MODE[]; + static const char KEY_QC_DUAL_CAMERA_ID[]; + static const char KEY_QC_DUAL_CAMERA_MAIN_CAMERA[]; + //ZSL+HDR static const char KEY_QC_ZSL_HDR_SUPPORTED[]; @@ -758,7 +763,8 @@ public: const char *getASDStateString(cam_auto_scene_t scene); bool isHDRThumbnailProcessNeeded() { return m_bHDRThumbnailProcessNeeded; }; void setMinPpMask(cam_feature_mask_t min_pp_mask) { m_nMinRequiredPpMask = min_pp_mask; }; - bool setStreamConfigure(bool isCapture, bool previewAsPostview, bool resetConfig); + bool setStreamConfigure(bool isCapture, bool previewAsPostview, bool resetConfig, + uint32_t* sessionId); int32_t addOnlineRotation(uint32_t rotation, uint32_t streamId, int32_t device_rotation); uint8_t getNumOfExtraBuffersForImageProc(); uint8_t getNumOfExtraBuffersForVideo(); @@ -976,6 +982,7 @@ private: int32_t setSecureMode(const QCameraParameters& ); int32_t setCacheVideoBuffers(const QCameraParameters& params); int32_t setCustomParams(const QCameraParameters& params); + int32_t setDualCameraMode(const QCameraParameters& params); int32_t setAutoExposure(const char *autoExp); int32_t setPreviewFpsRange(int min_fps,int max_fps, int vid_min_fps,int vid_max_fps); @@ -1253,6 +1260,9 @@ private: uint8_t mAecSkipDisplayFrameBound; bool m_bQuadraCfa; bool m_bSmallJpegSize; + bool m_bDualCameraMode; + int32_t mDualCamId; + bool m_bMainCamera; }; }; // namespace qcamera diff --git a/camera/QCamera2/HAL/QCameraParametersIntf.cpp b/camera/QCamera2/HAL/QCameraParametersIntf.cpp index 5b3f99fecee54d6a112d46efa6c688d4f8233dcf..adaff86cd78e79a4a76d6c35e787ef12df67bd1d 100644 --- a/camera/QCamera2/HAL/QCameraParametersIntf.cpp +++ b/camera/QCamera2/HAL/QCameraParametersIntf.cpp @@ -796,12 +796,12 @@ void QCameraParametersIntf::setMinPpMask(cam_feature_mask_t min_pp_mask) } bool QCameraParametersIntf::setStreamConfigure(bool isCapture, - bool previewAsPostview, bool resetConfig) + bool previewAsPostview, bool resetConfig, uint32_t* sessionId) { Mutex::Autolock lock(mLock); CHECK_PARAM_INTF(mImpl); return mImpl->setStreamConfigure(isCapture, - previewAsPostview, resetConfig); + previewAsPostview, resetConfig, sessionId); } int32_t QCameraParametersIntf::addOnlineRotation(uint32_t rotation, diff --git a/camera/QCamera2/HAL/QCameraParametersIntf.h b/camera/QCamera2/HAL/QCameraParametersIntf.h index 9053d4d89b310181293b3e16517142fe2989cc7c..520c378df3d701884ba8be36c5006e00080cac22 100644 --- a/camera/QCamera2/HAL/QCameraParametersIntf.h +++ b/camera/QCamera2/HAL/QCameraParametersIntf.h @@ -194,7 +194,7 @@ public: bool isHDRThumbnailProcessNeeded(); void setMinPpMask(cam_feature_mask_t min_pp_mask); bool setStreamConfigure(bool isCapture, - bool previewAsPostview, bool resetConfig); + bool previewAsPostview, bool resetConfig, uint32_t* sessionId); int32_t addOnlineRotation(uint32_t rotation, uint32_t streamId, int32_t device_rotation); uint8_t getNumOfExtraBuffersForImageProc();