k4a_result_t CMFCameraReader::GetCameraControlCapabilities()

in src/color/mfcamerareader.cpp [547:703]


k4a_result_t CMFCameraReader::GetCameraControlCapabilities(const k4a_color_control_command_t command,
                                                           color_control_cap_t *capabilities)
{
    HRESULT hr = S_OK;
    bool supportAuto = false;
    LONG minValue = 0;
    LONG maxValue = 0;
    ULONG stepValue = 0;
    LONG defaultValue = 0;
    k4a_color_control_mode_t defaultMode = K4A_COLOR_CONTROL_MODE_MANUAL;
    RETURN_VALUE_IF_ARG(K4A_RESULT_FAILED, capabilities == NULL);

    switch (command)
    {
    case K4A_COLOR_CONTROL_EXPOSURE_TIME_ABSOLUTE:
    {
        hr = GetCameraControlCap(PROPSETID_VIDCAP_CAMERACONTROL,
                                 KSPROPERTY_CAMERACONTROL_EXPOSURE,
                                 &supportAuto,
                                 &minValue,
                                 &maxValue,
                                 &stepValue,
                                 &defaultValue);

        // Convert KSProperty exposure time value to micro-second unit
        minValue = MapMfExponentToK4a(minValue);
        maxValue = MapMfExponentToK4a(maxValue);
        defaultValue = MapMfExponentToK4a(defaultValue);
        defaultMode = K4A_COLOR_CONTROL_MODE_AUTO;

        // Windows KsProperty uses exposure time value as log base 2 seconds, which is not linear.
        // But K4A color control API allow to use micro sec unit exposure time.
        // Set step value to 1.
        stepValue = 1;
    }
    break;
    case K4A_COLOR_CONTROL_BRIGHTNESS:
    {
        hr = GetCameraControlCap(PROPSETID_VIDCAP_VIDEOPROCAMP,
                                 KSPROPERTY_VIDEOPROCAMP_BRIGHTNESS,
                                 &supportAuto,
                                 &minValue,
                                 &maxValue,
                                 &stepValue,
                                 &defaultValue);
    }
    break;
    case K4A_COLOR_CONTROL_CONTRAST:
    {
        hr = GetCameraControlCap(PROPSETID_VIDCAP_VIDEOPROCAMP,
                                 KSPROPERTY_VIDEOPROCAMP_CONTRAST,
                                 &supportAuto,
                                 &minValue,
                                 &maxValue,
                                 &stepValue,
                                 &defaultValue);
    }
    break;
    case K4A_COLOR_CONTROL_SATURATION:
    {
        hr = GetCameraControlCap(PROPSETID_VIDCAP_VIDEOPROCAMP,
                                 KSPROPERTY_VIDEOPROCAMP_SATURATION,
                                 &supportAuto,
                                 &minValue,
                                 &maxValue,
                                 &stepValue,
                                 &defaultValue);
    }
    break;
    case K4A_COLOR_CONTROL_SHARPNESS:
    {
        hr = GetCameraControlCap(PROPSETID_VIDCAP_VIDEOPROCAMP,
                                 KSPROPERTY_VIDEOPROCAMP_SHARPNESS,
                                 &supportAuto,
                                 &minValue,
                                 &maxValue,
                                 &stepValue,
                                 &defaultValue);
    }
    break;
    case K4A_COLOR_CONTROL_WHITEBALANCE:
    {
        hr = GetCameraControlCap(PROPSETID_VIDCAP_VIDEOPROCAMP,
                                 KSPROPERTY_VIDEOPROCAMP_WHITEBALANCE,
                                 &supportAuto,
                                 &minValue,
                                 &maxValue,
                                 &stepValue,
                                 &defaultValue);

        defaultMode = K4A_COLOR_CONTROL_MODE_AUTO;
    }
    break;
    case K4A_COLOR_CONTROL_BACKLIGHT_COMPENSATION:
    {
        hr = GetCameraControlCap(PROPSETID_VIDCAP_VIDEOPROCAMP,
                                 KSPROPERTY_VIDEOPROCAMP_BACKLIGHT_COMPENSATION,
                                 &supportAuto,
                                 &minValue,
                                 &maxValue,
                                 &stepValue,
                                 &defaultValue);
    }
    break;
    case K4A_COLOR_CONTROL_GAIN:
    {
        hr = GetCameraControlCap(PROPSETID_VIDCAP_VIDEOPROCAMP,
                                 KSPROPERTY_VIDEOPROCAMP_GAIN,
                                 &supportAuto,
                                 &minValue,
                                 &maxValue,
                                 &stepValue,
                                 &defaultValue);
    }
    break;
    case K4A_COLOR_CONTROL_POWERLINE_FREQUENCY:
    {
        hr = GetCameraControlCap(PROPSETID_VIDCAP_VIDEOPROCAMP,
                                 KSPROPERTY_VIDEOPROCAMP_POWERLINE_FREQUENCY,
                                 &supportAuto,
                                 &minValue,
                                 &maxValue,
                                 &stepValue,
                                 &defaultValue);
    }
    break;
    case K4A_COLOR_CONTROL_AUTO_EXPOSURE_PRIORITY:
    {
        supportAuto = false;
        minValue = 0;
        maxValue = 0;
        stepValue = 0;
        defaultValue = 0;
        LOG_WARNING("K4A_COLOR_CONTROL_AUTO_EXPOSURE_PRIORITY is deprecated and does nothing.");
    }
    break;
    default:
        return K4A_RESULT_FAILED;
    }

    if (SUCCEEDED(hr))
    {
        capabilities->supportAuto = supportAuto;
        capabilities->minValue = minValue;
        capabilities->maxValue = maxValue;
        capabilities->stepValue = stepValue;
        capabilities->defaultValue = defaultValue;
        capabilities->defaultMode = defaultMode;
        capabilities->valid = true;
    }

    if (FAILED(hr))
    {
        LOG_ERROR("Failing command %u with HRESULT:%08X", command, hr);
    }
    return k4aResultFromHRESULT(hr);
}