Query actual framerate and exposure from hardware in property getters

Previously, GET_FRAMERATE and GET_EXPOSURE returned only cached values.
Now they query the actual hardware state using:
- is_SetFrameRate() with IS_GET_FRAMERATE for framerate
- is_Exposure() with IS_EXPOSURE_CMD_GET_EXPOSURE for exposure

This matches the pattern used for auto-exposure, auto-gain, and gain-boost
properties, ensuring UDP control commands return real-time hardware values
instead of stale cached values. Critical when auto-exposure is enabled as
the hardware adjusts exposure dynamically.
This commit is contained in:
yair
2025-11-16 21:06:47 +02:00
parent 6e1195c94c
commit 60f77cc884

View File

@@ -334,10 +334,40 @@ gst_idsueyesrc_get_property (GObject * object, guint property_id,
g_value_set_int (value, src->timeout); g_value_set_int (value, src->timeout);
break; break;
case PROP_EXPOSURE: case PROP_EXPOSURE:
g_value_set_double (value, src->exposure); if (src->is_started && src->hCam) {
double current_exposure = 0.0;
INT ret = is_Exposure (src->hCam, IS_EXPOSURE_CMD_GET_EXPOSURE,
&current_exposure, sizeof(double));
if (ret == IS_SUCCESS) {
/* Update cached value to match hardware state */
src->exposure = current_exposure;
g_value_set_double (value, current_exposure);
} else {
GST_WARNING_OBJECT (src, "Failed to query exposure (error %d), returning cached value",
ret);
g_value_set_double (value, src->exposure);
}
} else {
g_value_set_double (value, src->exposure);
}
break; break;
case PROP_FRAMERATE: case PROP_FRAMERATE:
g_value_set_double (value, src->framerate); if (src->is_started && src->hCam) {
double current_fps = 0.0;
/* Query current framerate by calling is_SetFrameRate with IS_GET_FRAMERATE */
INT ret = is_SetFrameRate (src->hCam, IS_GET_FRAMERATE, &current_fps);
if (ret == IS_SUCCESS) {
/* Update cached value to match hardware state */
src->framerate = current_fps;
g_value_set_double (value, current_fps);
} else {
GST_WARNING_OBJECT (src, "Failed to query framerate (error %d), returning cached value",
ret);
g_value_set_double (value, src->framerate);
}
} else {
g_value_set_double (value, src->framerate);
}
break; break;
case PROP_GAIN: case PROP_GAIN:
g_value_set_int (value, src->gain); g_value_set_int (value, src->gain);