QCamera2: Adds FPS range adjustment based on thermal events
- Four thermal levels are accepted currently. The first will
reset the fps range to its original state configured by the client.
The second halves the maximum FPS. The third will set the maximum
FPS to the minimum and the fourth will switch the range to lowest
supported by the camera.
Change-Id: I1eb3950b71cf0536daae66147d70f1c6702336fa
diff --git a/QCamera2/HAL/QCamera2HWI.cpp b/QCamera2/HAL/QCamera2HWI.cpp
index 7cfd064..cf48f41 100644
--- a/QCamera2/HAL/QCamera2HWI.cpp
+++ b/QCamera2/HAL/QCamera2HWI.cpp
@@ -2103,11 +2103,72 @@
* none-zero failure code
*==========================================================================*/
int QCamera2HardwareInterface::thermalEvtHandle(char *name,
- int threshold,
- int level)
+ int threshold,
+ qcamera_thermal_level_enum_t level)
{
- ALOGI("%s: name: %s, threshold: %d, level: %d", __func__, name, threshold, level);
- return NO_ERROR;
+ int ret = NO_ERROR;
+ cam_fps_range_t adjustedRange;
+ int minFPS, maxFPS;
+
+ mParameters.getPreviewFpsRange(&minFPS, &maxFPS);
+
+ switch(level) {
+ case QCAMERA_THERMAL_NO_ADJUSTMENT:
+ {
+ adjustedRange.min_fps = minFPS/1000.0f;
+ adjustedRange.max_fps = maxFPS/1000.0f;
+ }
+ break;
+ case QCAMERA_THERMAL_SLIGHT_ADJUSTMENT:
+ {
+ adjustedRange.min_fps = minFPS/1000.0f;
+ adjustedRange.max_fps = (maxFPS / 2 ) / 1000.0f;
+ if ( adjustedRange.max_fps < adjustedRange.min_fps ) {
+ adjustedRange.max_fps = adjustedRange.min_fps;
+ }
+ }
+ break;
+ case QCAMERA_THERMAL_BIG_ADJUSTMENT:
+ {
+ adjustedRange.min_fps = minFPS/1000.0f;
+ adjustedRange.max_fps = adjustedRange.min_fps;
+ }
+ break;
+ case QCAMERA_THERMAL_SHUTDOWN:
+ {
+ // Stop Preview?
+ // Set lowest FPS range for now
+ adjustedRange.min_fps = minFPS/1000.0f;
+ adjustedRange.max_fps = maxFPS/1000.0f;
+ for ( int i = 0 ; i < gCamCapability[mCameraId]->fps_ranges_tbl_cnt ; i++ ) {
+ if ( gCamCapability[mCameraId]->fps_ranges_tbl[i].min_fps < adjustedRange.min_fps ) {
+ adjustedRange.min_fps = gCamCapability[mCameraId]->fps_ranges_tbl[i].min_fps;
+ }
+ if ( gCamCapability[mCameraId]->fps_ranges_tbl[i].max_fps < adjustedRange.max_fps ) {
+ adjustedRange.max_fps = gCamCapability[mCameraId]->fps_ranges_tbl[i].max_fps;
+ }
+ }
+ }
+ break;
+ default:
+ {
+ ALOGE("%s: Invalid thermal level %d", __func__, level);
+ return BAD_VALUE;
+ }
+ break;
+ }
+
+ ALOGI("%s: Thermal level %d, threshold %d, FPS range [%3.2f,%3.2f], name %s",
+ __func__,
+ level,
+ threshold,
+ adjustedRange.min_fps,
+ adjustedRange.max_fps,
+ name);
+
+ ret = processAPI(QCAMERA_SM_EVT_THERMAL_NOTIFY, &adjustedRange);
+
+ return ret;
}
/*===========================================================================
@@ -3213,6 +3274,23 @@
}
/*===========================================================================
+ * FUNCTION : updateThermalFPS
+ *
+ * DESCRIPTION: update FPS depending on thermal events
+ *
+ * PARAMETERS :
+ * @fpsRange : adjusted min/max FPS range
+ *
+ * RETURN : int32_t type of status
+ * NO_ERROR -- success
+ * none-zero failure code
+ *==========================================================================*/
+int QCamera2HardwareInterface::updateThermalFPS(cam_fps_range_t *fpsRange)
+{
+ return mParameters.adjustPreviewFpsRange(fpsRange);
+}
+
+/*===========================================================================
* FUNCTION : updateParameters
*
* DESCRIPTION: update parameters
diff --git a/QCamera2/HAL/QCamera2HWI.h b/QCamera2/HAL/QCamera2HWI.h
index f8396de..b29f12f 100644
--- a/QCamera2/HAL/QCamera2HWI.h
+++ b/QCamera2/HAL/QCamera2HWI.h
@@ -135,7 +135,8 @@
// Implementation of QCameraThermalCallback
virtual int thermalEvtHandle(char *name,
- int threshold, int level);
+ int threshold,
+ qcamera_thermal_level_enum_t level);
friend class QCameraStateMachine;
friend class QCameraPostProcessor;
@@ -179,6 +180,8 @@
void unlockAPI();
void signalAPIResult(qcamera_api_result_t *result);
+ int updateThermalFPS(cam_fps_range_t *fpsRange);
+
// update entris to set parameters and check if restart is needed
int updateParameters(const char *parms, bool &needRestart);
// send request to server to set parameters
diff --git a/QCamera2/HAL/QCameraParameters.cpp b/QCamera2/HAL/QCameraParameters.cpp
index 8910d26..d5a6658 100644
--- a/QCamera2/HAL/QCameraParameters.cpp
+++ b/QCamera2/HAL/QCameraParameters.cpp
@@ -2934,6 +2934,50 @@
}
/*===========================================================================
+ * FUNCTION : adjustPreviewFpsRanges
+ *
+ * DESCRIPTION: adjust preview FPS ranges
+ * according to external events
+ *
+ * PARAMETERS :
+ * @minFPS : min FPS value
+ * @maxFPS : max FPS value
+ *
+ * RETURN : int32_t type of status
+ * NO_ERROR -- success
+ * none-zero failure code
+ *==========================================================================*/
+int32_t QCameraParameters::adjustPreviewFpsRange(cam_fps_range_t *fpsRange)
+{
+ if ( fpsRange == NULL ) {
+ return BAD_VALUE;
+ }
+
+ int32_t rc = initBatchUpdate(m_pParamBuf);
+ if ( rc != NO_ERROR ) {
+ ALOGE("%s:Failed to initialize group update table", __func__);
+ return rc;
+ }
+
+ rc = AddSetParmEntryToBatch(m_pParamBuf,
+ CAM_INTF_PARM_FPS_RANGE,
+ sizeof(cam_fps_range_t),
+ fpsRange);
+ if ( rc != NO_ERROR ) {
+ ALOGE("%s: Parameters batch failed",__func__);
+ return rc;
+ }
+
+ rc = commitSetBatch();
+ if ( rc != NO_ERROR ) {
+ ALOGE("%s:Failed to commit batch parameters", __func__);
+ return rc;
+ }
+
+ return rc;
+}
+
+/*===========================================================================
* FUNCTION : setPreviewFpsRanges
*
* DESCRIPTION: set preview FPS ranges
diff --git a/QCamera2/HAL/QCameraParameters.h b/QCamera2/HAL/QCameraParameters.h
index 049243b..84ccaf2 100644
--- a/QCamera2/HAL/QCameraParameters.h
+++ b/QCamera2/HAL/QCameraParameters.h
@@ -375,6 +375,8 @@
cam_focus_mode_type getFocusMode() const {return mFocusMode;};
bool isJpegPictureFormat() {return (mPictureFormat == CAMERA_PICTURE_TYPE_JPEG);};
+ int32_t adjustPreviewFpsRange(cam_fps_range_t *fpsRange);
+
private:
int32_t setPreviewSize(const QCameraParameters& );
int32_t setVideoSize(const QCameraParameters& );
diff --git a/QCamera2/HAL/QCameraStateMachine.cpp b/QCamera2/HAL/QCameraStateMachine.cpp
index daa6c6e..8bc0ede 100644
--- a/QCamera2/HAL/QCameraStateMachine.cpp
+++ b/QCamera2/HAL/QCameraStateMachine.cpp
@@ -1061,7 +1061,9 @@
}
break;
case QCAMERA_SM_EVT_THERMAL_NOTIFY:
- //TODO: Adjust FPS.
+ {
+ rc = m_parent->updateThermalFPS((cam_fps_range_t *) payload);
+ }
break;
case QCAMERA_SM_EVT_JPEG_EVT_NOTIFY:
case QCAMERA_SM_EVT_SNAPSHOT_DONE:
@@ -1604,7 +1606,9 @@
}
break;
case QCAMERA_SM_EVT_THERMAL_NOTIFY:
- //TODO: Adjust FPS
+ {
+ rc = m_parent->updateThermalFPS((cam_fps_range_t *) payload);
+ }
break;
case QCAMERA_SM_EVT_JPEG_EVT_NOTIFY:
case QCAMERA_SM_EVT_SNAPSHOT_DONE:
@@ -1885,7 +1889,9 @@
}
break;
case QCAMERA_SM_EVT_THERMAL_NOTIFY:
- //TODO: Adjust FPS.
+ {
+ rc = m_parent->updateThermalFPS((cam_fps_range_t *) payload);
+ }
break;
default:
ALOGE("%s: cannot handle evt(%d) in state(%d)", __func__, evt, m_state);
@@ -2180,7 +2186,9 @@
}
break;
case QCAMERA_SM_EVT_THERMAL_NOTIFY:
- //TODO: Adjust FPS
+ {
+ rc = m_parent->updateThermalFPS((cam_fps_range_t *) payload);
+ }
break;
default:
ALOGE("%s: cannot handle evt(%d) in state(%d)", __func__, evt, m_state);
diff --git a/QCamera2/HAL/QCameraThermalAdapter.cpp b/QCamera2/HAL/QCameraThermalAdapter.cpp
index e5ae096..14bd7b7 100644
--- a/QCamera2/HAL/QCameraThermalAdapter.cpp
+++ b/QCamera2/HAL/QCameraThermalAdapter.cpp
@@ -137,8 +137,9 @@
int rc = 0;
ALOGV("%s E", __func__);
QCameraThermalAdapter& instance = getInstance();
+ qcamera_thermal_level_enum_t lvl = (qcamera_thermal_level_enum_t) level;
if (instance.mCallback)
- rc = instance.mCallback->thermalEvtHandle(name, threshold, level);
+ rc = instance.mCallback->thermalEvtHandle(name, threshold, lvl);
ALOGV("%s X", __func__);
return rc;
}
diff --git a/QCamera2/HAL/QCameraThermalAdapter.h b/QCamera2/HAL/QCameraThermalAdapter.h
index ca6f1c5..4b37846 100644
--- a/QCamera2/HAL/QCameraThermalAdapter.h
+++ b/QCamera2/HAL/QCameraThermalAdapter.h
@@ -32,11 +32,19 @@
namespace qcamera {
+typedef enum {
+ QCAMERA_THERMAL_NO_ADJUSTMENT = 0,
+ QCAMERA_THERMAL_SLIGHT_ADJUSTMENT,
+ QCAMERA_THERMAL_BIG_ADJUSTMENT,
+ QCAMERA_THERMAL_SHUTDOWN
+} qcamera_thermal_level_enum_t;
+
class QCameraThermalCallback
{
public:
- virtual int thermalEvtHandle(char *name, int threshold,
- int level) = 0;
+ virtual int thermalEvtHandle(char *name,
+ int threshold,
+ qcamera_thermal_level_enum_t level) = 0;
virtual ~QCameraThermalCallback() {}
};