Closed cmorlok closed 8 years ago
I really don't understand what's going wrong. This is what it looks like in CM13.0:
V CameraWrapper: camera_set_parameters: params:
...
D CameraParams: scene-mode: hdr
...
D QCameraParameters: int32_t qcamera::QCameraParameters::setPreviewSize(const qcamera::QCameraParameters&): Requested preview size 1280 x 960
D QCameraParameters: int32_t qcamera::QCameraParameters::setVideoSize(const qcamera::QCameraParameters&): Requested video size 1920 x 1080
D QCameraParameters: int32_t qcamera::QCameraParameters::setPictureSize(const qcamera::QCameraParameters&): Requested picture size 4160 x 3120
D QCameraParameters: void qcamera::QCameraParameters::updateViewAngles(): Final horizViewAngle 54.799999, vertViewAngle 42.500000
D QCameraParameters: Param m_bNoDisplayMode = 0
D QCameraParameters: int32_t qcamera::QCameraParameters::setPreviewFpsRange(const qcamera::QCameraParameters&): FpsRange Values:(7500, 30330)
D QCameraParameters: int32_t qcamera::QCameraParameters::setPreviewFpsRange(const qcamera::QCameraParameters&): Requested FpsRange Values:(7500, 30330)
D QCameraParameters: HFR mode is OFF
D QCameraParameters: int32_t qcamera::QCameraParameters::setFssr(const qcamera::QCameraParameters&): FSSR is not supported
D QCameraParameters: int32_t qcamera::QCameraParameters::setMultiTouchFocus(const qcamera::QCameraParameters&): multi-touch focus is not supported
D QCameraParameters: int32_t qcamera::QCameraParameters::setNumOfSnapshot(): nBurstNum = 1, nExpnum = 1
V CameraWrapper: camera_get_parameters->B73271B8->B731FFA8
...
D CameraParams: scene-mode: auto
and this is what it should look like (from CM12.1):
D QCameraParameters: int32_t qcamera::QCameraParameters::setPreviewSize(const qcamera::QCameraParameters&): Requested preview size 1280 x 960
D QCameraParameters: int32_t qcamera::QCameraParameters::setVideoSize(const qcamera::QCameraParameters&): Requested video size 1920 x 1080
D QCameraParameters: int32_t qcamera::QCameraParameters::setPictureSize(const qcamera::QCameraParameters&): Requested picture size 4160 x 3120
D QCameraParameters: void qcamera::QCameraParameters::updateViewAngles(): Final horizViewAngle 54.799999, vertViewAngle 42.500000
D QCameraParameters: Param m_bNoDisplayMode = 0
D QCameraParameters: int32_t qcamera::QCameraParameters::setPreviewFpsRange(const qcamera::QCameraParameters&): FpsRange Values:(7500, 30330)
D QCameraParameters: int32_t qcamera::QCameraParameters::setPreviewFpsRange(const qcamera::QCameraParameters&): Requested FpsRange Values:(7500, 30330)
D QCameraParameters: HFR mode is OFF
D QCameraParameters: int32_t qcamera::QCameraParameters::setSceneMode(const qcamera::QCameraParameters&): S/W HDR Enabled
D QCameraParameters: int32_t qcamera::QCameraParameters::setSceneMode(const qcamera::QCameraParameters&): scene mode changed between HDR and non-HDR, need restart
D QCameraParameters: int32_t qcamera::QCameraParameters::setSceneMode(const char*): Setting SceneMode hdr
E QCameraParameters: int32_t qcamera::QCameraParameters::setAEBracket(const qcamera::QCameraParameters&): scene mode is HDR, overwrite AE bracket setting to off
D QCameraParameters: int32_t qcamera::QCameraParameters::setAEBracket(const char*), EXP_BRACKETING_OFF
D QCameraParameters: int32_t qcamera::QCameraParameters::setFssr(const qcamera::QCameraParameters&): FSSR is not supported
D QCameraParameters: int32_t qcamera::QCameraParameters::setMultiTouchFocus(const qcamera::QCameraParameters&): multi-touch focus is not supported
The set_parameters
function calls all the QCameraParameters::set
functions in the log. The interesting one is QCameraParameters::setSceneMode(const QCameraParameters& params)
. According to the reference (https://www.codeaurora.org/cgit/quic/la/platform/hardware/qcom/camera/tree/QCamera2/HAL/QCameraParameters.cpp?h=LA.BR.1.1.3_rb1.45#n3081) this is:
int32_t QCameraParameters::setSceneMode(const QCameraParameters& params)
{
int rc = NO_ERROR;
const char *str = params.get(KEY_SCENE_MODE);
const char *prev_str = get(KEY_SCENE_MODE);
CDBG("%s: str - %s, prev_str - %s",__func__, str, prev_str);
if (str != NULL) {
if (prev_str == NULL ||
strcmp(str, prev_str) != 0) {
if(strcmp(str, SCENE_MODE_AUTO) == 0) {
m_bSceneTransitionAuto = true;
}
if (strcmp(str, SCENE_MODE_HDR) == 0) {
// If HDR is set from client and the feature is
// not enabled in the backend, ignore it.
if (m_pCapability->qcom_supported_feature_mask &
CAM_QCOM_FEATURE_SENSOR_HDR) {
CDBG_HIGH("%s: Sensor HDR mode Enabled",__func__);
m_bSensorHDREnabled = true;
m_bHDREnabled = false;
} else if (m_pCapability->qcom_supported_feature_mask &
CAM_QCOM_FEATURE_HDR) {
CDBG_HIGH("%s: S/W HDR Enabled",__func__);
m_bSensorHDREnabled = false;
m_bHDREnabled = true;
} else {
m_bSensorHDREnabled = false;
m_bHDREnabled = false;
return NO_ERROR;
}
} else {
m_bHDREnabled = false;
if (m_bSensorHDREnabled) {
m_bSensorHDREnabled = false;
m_bNeedRestart = true;
setSensorSnapshotHDR(VALUE_OFF);
}
}
if (m_bSensorHDREnabled) {
setSensorSnapshotHDR(VALUE_ON);
m_bNeedRestart = true;
} else if ((m_bHDREnabled) ||
((prev_str != NULL) && (strcmp(prev_str, SCENE_MODE_HDR) == 0))) {
CDBG_HIGH("%s: scene mode changed between HDR and non-HDR, need restart", __func__);
m_bNeedRestart = true;
}
rc = setSceneMode(str);
}
}
if (m_bHDREnabled) {
str = params.get(KEY_QC_HDR_NEED_1X);
prev_str = get(KEY_QC_HDR_NEED_1X);
if (str != NULL) {
if (prev_str == NULL ||
strcmp(str, prev_str) != 0) {
rc = setHDRNeed1x(str);
}
}
}
return rc;
}
int32_t QCameraParameters::setSceneMode(const char *sceneModeStr)
{
if (sceneModeStr != NULL) {
int32_t value = lookupAttr(SCENE_MODES_MAP, PARAM_MAP_SIZE(SCENE_MODES_MAP), sceneModeStr);
if (value != NAME_NOT_FOUND) {
CDBG_HIGH("%s: Setting SceneMode %s", __func__, sceneModeStr);
updateParamEntry(KEY_SCENE_MODE, sceneModeStr);
if (m_bSensorHDREnabled) {
// Incase of HW HDR mode, we do not update the same as Best shot mode.
CDBG("%s: H/W HDR mode enabled. Do not set Best Shot Mode", __func__);
return NO_ERROR;
}
int32_t rc = AddSetParmEntryToBatch(m_pParamBuf,
CAM_INTF_PARM_BESTSHOT_MODE,
sizeof(value),
&value);
return rc;
}
}
ALOGE("%s: Invalid Secene Mode: %s",
__func__, (sceneModeStr == NULL) ? "NULL" : sceneModeStr);
return BAD_VALUE;
}
The function first checks if the scene mode has changed. If so, it always calls setSceneMode(str)
which always produces output. But on CM13.1 I cannot see any setSceneMode
entry in logcat, so the mode is never changed and stays on auto
forever.
I missed one important thing: while CM12.1 is still using the 3.2.2/3.2.6 camera blobs, CM13.0 is updated to 3.2.7. I will have to compare again with stock 3.2.7 instead of CM12.1.
The critical logcat entry is here:
E mm-camera-img: hdr_comp_load:1756] Error opening hdr library
E hdr : Cannot load hdr lib in module_hdr_lib_load
E hdr : Cannot load library in hdr module
E mm-camera-img: module_imglib_create_topology:649] Can not init the module hdr
The blobs libmmcamera_hdr_lib.so and libmmcamera_hdr_gb_lib.so are not compatible with M. They would have to be shimmed, but I didn't find what exactly cause the error.
I have replaced those blobs by the ones from Wileyfox Storm (build and linked against M by Cyngn, see https://github.com/cmorlok/proprietary_vendor_bq/commit/70eb14fb5bfedfe867e154b962b92fa5e0fceed3). Now HDR is working with GoogleCamera and Snap.
Hi @cmorlok ,
Thanks for the awesome work finding it! :)
I will check if we can use our camera blobs or not asap.
Greetings
I tried to compare the L and the M blobs from Wileyfox, but I don't see any external reference which has changed. I also tried to shim L's VectorImpl.cpp (which is needed for camera blobs on some other devices), but that didn't help either.
Fixed in cm-13.0-20160228-UNOFFICIAL-piccolo .
This issue was moved to bq-dev/android_device_bq_piccolo#53
I have compared the logcats while taking HDR pictures in CM12.1 and CM13.0 (using GoogleCamera 2.5). It seems like the HDR scene mode isn't enabled at all. I will extend the camera wrapper to see more details.