piccolo-dev / android_device_bq_piccolo

Android device configuration for the bq Aquaris M5
19 stars 8 forks source link

HDR doesn't work #53

Closed cmorlok closed 8 years ago

cmorlok commented 8 years ago

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.

cmorlok commented 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.

cmorlok commented 8 years ago

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.

cmorlok commented 8 years ago

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.

Kra1o5 commented 8 years ago

Hi @cmorlok ,

Thanks for the awesome work finding it! :)

I will check if we can use our camera blobs or not asap.

Greetings

cmorlok commented 8 years ago

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.

Kra1o5 commented 8 years ago

Fixed in cm-13.0-20160228-UNOFFICIAL-piccolo .

stucki commented 8 years ago

This issue was moved to bq-dev/android_device_bq_piccolo#53