mirror of
https://gitlab.freedesktop.org/pipewire/pipewire.git
synced 2025-10-29 05:40:27 -04:00
spa: libcamera: source: separate type info generation
Add a new function `control_details_to_pod()` that builds a `SPA_TYPE_OBJECT_PropInfo` object describing a libcamera control.
This commit is contained in:
parent
3c759ae293
commit
cc187b035b
1 changed files with 67 additions and 61 deletions
|
|
@ -740,6 +740,69 @@ uint32_t prop_id_to_control(uint32_t prop_id)
|
||||||
return SPA_ID_INVALID;
|
return SPA_ID_INVALID;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
[[nodiscard]]
|
||||||
|
spa_pod *control_details_to_pod(spa_pod_builder& b,
|
||||||
|
const libcamera::ControlId& cid, const libcamera::ControlInfo& cinfo)
|
||||||
|
{
|
||||||
|
auto id = control_to_prop_id(cid.id());
|
||||||
|
spa_pod_frame f;
|
||||||
|
|
||||||
|
spa_pod_builder_push_object(&b, &f, SPA_TYPE_OBJECT_PropInfo, SPA_PARAM_PropInfo);
|
||||||
|
spa_pod_builder_add(&b,
|
||||||
|
SPA_PROP_INFO_id, SPA_POD_Id(id),
|
||||||
|
SPA_PROP_INFO_description, SPA_POD_String(cid.name().c_str()),
|
||||||
|
0);
|
||||||
|
|
||||||
|
switch (cid.type()) {
|
||||||
|
case ControlTypeBool: {
|
||||||
|
bool def;
|
||||||
|
if (cinfo.def().isNone())
|
||||||
|
def = cinfo.min().get<bool>();
|
||||||
|
else
|
||||||
|
def = cinfo.def().get<bool>();
|
||||||
|
|
||||||
|
spa_pod_builder_add(&b,
|
||||||
|
SPA_PROP_INFO_type, SPA_POD_CHOICE_Bool(
|
||||||
|
def),
|
||||||
|
0);
|
||||||
|
} break;
|
||||||
|
case ControlTypeFloat: {
|
||||||
|
float min = cinfo.min().get<float>();
|
||||||
|
float max = cinfo.max().get<float>();
|
||||||
|
float def;
|
||||||
|
|
||||||
|
if (cinfo.def().isNone())
|
||||||
|
def = (min + max) / 2;
|
||||||
|
else
|
||||||
|
def = cinfo.def().get<float>();
|
||||||
|
|
||||||
|
spa_pod_builder_add(&b,
|
||||||
|
SPA_PROP_INFO_type, SPA_POD_CHOICE_RANGE_Float(
|
||||||
|
def, min, max),
|
||||||
|
0);
|
||||||
|
} break;
|
||||||
|
case ControlTypeInteger32: {
|
||||||
|
int32_t min = cinfo.min().get<int32_t>();
|
||||||
|
int32_t max = cinfo.max().get<int32_t>();
|
||||||
|
int32_t def;
|
||||||
|
|
||||||
|
if (cinfo.def().isNone())
|
||||||
|
def = (min + max) / 2;
|
||||||
|
else
|
||||||
|
def = cinfo.def().get<int32_t>();
|
||||||
|
|
||||||
|
spa_pod_builder_add(&b,
|
||||||
|
SPA_PROP_INFO_type, SPA_POD_CHOICE_RANGE_Int(
|
||||||
|
def, min, max),
|
||||||
|
0);
|
||||||
|
} break;
|
||||||
|
default:
|
||||||
|
return nullptr;
|
||||||
|
}
|
||||||
|
|
||||||
|
return reinterpret_cast<spa_pod *>(spa_pod_builder_pop(&b, &f));
|
||||||
|
}
|
||||||
|
|
||||||
int
|
int
|
||||||
spa_libcamera_enum_controls(struct impl *impl, struct port *port, int seq,
|
spa_libcamera_enum_controls(struct impl *impl, struct port *port, int seq,
|
||||||
uint32_t start, uint32_t offset, uint32_t num,
|
uint32_t start, uint32_t offset, uint32_t num,
|
||||||
|
|
@ -748,13 +811,10 @@ spa_libcamera_enum_controls(struct impl *impl, struct port *port, int seq,
|
||||||
const ControlInfoMap &info = impl->camera->controls();
|
const ControlInfoMap &info = impl->camera->controls();
|
||||||
uint8_t buffer[1024];
|
uint8_t buffer[1024];
|
||||||
struct spa_pod_builder b = { 0 };
|
struct spa_pod_builder b = { 0 };
|
||||||
struct spa_pod_frame f[2];
|
|
||||||
struct spa_result_node_params result;
|
struct spa_result_node_params result;
|
||||||
struct spa_pod *ctrl;
|
struct spa_pod *ctrl;
|
||||||
uint32_t count = 0, skip, id;
|
uint32_t count = 0, skip;
|
||||||
int res;
|
int res;
|
||||||
const ControlId *ctrl_id;
|
|
||||||
ControlInfo ctrl_info;
|
|
||||||
|
|
||||||
result.id = SPA_PARAM_PropInfo;
|
result.id = SPA_PARAM_PropInfo;
|
||||||
result.next = start;
|
result.next = start;
|
||||||
|
|
@ -767,70 +827,16 @@ spa_libcamera_enum_controls(struct impl *impl, struct port *port, int seq,
|
||||||
next:
|
next:
|
||||||
it++;
|
it++;
|
||||||
}
|
}
|
||||||
|
|
||||||
result.index = result.next++;
|
result.index = result.next++;
|
||||||
if (it == info.end())
|
if (it == info.end())
|
||||||
goto enum_end;
|
goto enum_end;
|
||||||
|
|
||||||
ctrl_id = it->first;
|
|
||||||
ctrl_info = it->second;
|
|
||||||
|
|
||||||
id = control_to_prop_id(ctrl_id->id());
|
|
||||||
|
|
||||||
spa_pod_builder_init(&b, buffer, sizeof(buffer));
|
spa_pod_builder_init(&b, buffer, sizeof(buffer));
|
||||||
spa_pod_builder_push_object(&b, &f[0], SPA_TYPE_OBJECT_PropInfo, SPA_PARAM_PropInfo);
|
|
||||||
spa_pod_builder_add(&b,
|
|
||||||
SPA_PROP_INFO_id, SPA_POD_Id(id),
|
|
||||||
SPA_PROP_INFO_description, SPA_POD_String(ctrl_id->name().c_str()),
|
|
||||||
0);
|
|
||||||
|
|
||||||
switch (ctrl_id->type()) {
|
ctrl = control_details_to_pod(b, *it->first, it->second);
|
||||||
case ControlTypeBool: {
|
if (!ctrl)
|
||||||
bool def;
|
|
||||||
if (ctrl_info.def().isNone())
|
|
||||||
def = ctrl_info.min().get<bool>();
|
|
||||||
else
|
|
||||||
def = ctrl_info.def().get<bool>();
|
|
||||||
|
|
||||||
spa_pod_builder_add(&b,
|
|
||||||
SPA_PROP_INFO_type, SPA_POD_CHOICE_Bool(
|
|
||||||
def),
|
|
||||||
0);
|
|
||||||
} break;
|
|
||||||
case ControlTypeFloat: {
|
|
||||||
float min = ctrl_info.min().get<float>();
|
|
||||||
float max = ctrl_info.max().get<float>();
|
|
||||||
float def;
|
|
||||||
|
|
||||||
if (ctrl_info.def().isNone())
|
|
||||||
def = (min + max) / 2;
|
|
||||||
else
|
|
||||||
def = ctrl_info.def().get<float>();
|
|
||||||
|
|
||||||
spa_pod_builder_add(&b,
|
|
||||||
SPA_PROP_INFO_type, SPA_POD_CHOICE_RANGE_Float(
|
|
||||||
def, min, max),
|
|
||||||
0);
|
|
||||||
} break;
|
|
||||||
case ControlTypeInteger32: {
|
|
||||||
int32_t min = ctrl_info.min().get<int32_t>();
|
|
||||||
int32_t max = ctrl_info.max().get<int32_t>();
|
|
||||||
int32_t def;
|
|
||||||
|
|
||||||
if (ctrl_info.def().isNone())
|
|
||||||
def = (min + max) / 2;
|
|
||||||
else
|
|
||||||
def = ctrl_info.def().get<int32_t>();
|
|
||||||
|
|
||||||
spa_pod_builder_add(&b,
|
|
||||||
SPA_PROP_INFO_type, SPA_POD_CHOICE_RANGE_Int(
|
|
||||||
def, min, max),
|
|
||||||
0);
|
|
||||||
} break;
|
|
||||||
default:
|
|
||||||
goto next;
|
goto next;
|
||||||
}
|
|
||||||
|
|
||||||
ctrl = (struct spa_pod*) spa_pod_builder_pop(&b, &f[0]);
|
|
||||||
|
|
||||||
if (spa_pod_filter(&b, &result.param, ctrl, filter) < 0)
|
if (spa_pod_filter(&b, &result.param, ctrl, filter) < 0)
|
||||||
goto next;
|
goto next;
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue