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);
}