|
@@ -129,10 +129,37 @@ find_media_node(libmegapixels_camera *camera, const char *media_name, const char
|
|
|
break;
|
|
|
}
|
|
|
}
|
|
|
- // TODO: find /dev path for this entity
|
|
|
break;
|
|
|
}
|
|
|
}
|
|
|
+ camera->num_handles = 0;
|
|
|
+ for (int i = 0; i < topology.num_links; i++) {
|
|
|
+ if (!(links[i].flags & MEDIA_LNK_FL_INTERFACE_LINK)) {
|
|
|
+ continue;
|
|
|
+ }
|
|
|
+ camera->num_handles++;
|
|
|
+ }
|
|
|
+
|
|
|
+ camera->handles = calloc(camera->num_handles, sizeof(libmegapixels_subdev));
|
|
|
+ int h = 0;
|
|
|
+ for (int i = 0; i < topology.num_links; i++) {
|
|
|
+ if (!(links[i].flags & MEDIA_LNK_FL_INTERFACE_LINK)) {
|
|
|
+ continue;
|
|
|
+ }
|
|
|
+ libmegapixels_subdev *sd;
|
|
|
+ sd = malloc(sizeof(libmegapixels_subdev));
|
|
|
+ camera->handles[h] = sd;
|
|
|
+ camera->handles[h]->entity_id = links[i].sink_id;
|
|
|
+ camera->handles[h]->fd = 0;
|
|
|
+
|
|
|
+ for (int j = 0; j < topology.num_interfaces; j++) {
|
|
|
+ if (links[i].source_id != interfaces[j].id) {
|
|
|
+ continue;
|
|
|
+ }
|
|
|
+ camera->handles[h]->path = find_path_for_devnode(interfaces[j].devnode);
|
|
|
+ }
|
|
|
+ h++;
|
|
|
+ }
|
|
|
|
|
|
close(media_fd);
|
|
|
if (found == 2) {
|
|
@@ -159,6 +186,10 @@ load_camera(libmegapixels_devconfig *config, config_t *cfg, const char *name)
|
|
|
}
|
|
|
libmegapixels_camera *camera;
|
|
|
camera = malloc(sizeof(libmegapixels_camera));
|
|
|
+ camera->sensor_fd = 0;
|
|
|
+ camera->media_fd = 0;
|
|
|
+ camera->video_fd = 0;
|
|
|
+
|
|
|
int res = find_media_node(camera, bridge_driver, sensor_driver);
|
|
|
if (res < 0) {
|
|
|
free(camera);
|
|
@@ -178,7 +209,7 @@ load_camera(libmegapixels_devconfig *config, config_t *cfg, const char *name)
|
|
|
config_setting_t *mode;
|
|
|
|
|
|
int num_modes = config_setting_length(modes);
|
|
|
- camera->modes = malloc(num_modes * sizeof(libmegapixels_mode));
|
|
|
+ camera->modes = malloc(num_modes * sizeof(libmegapixels_mode *));
|
|
|
camera->num_modes = num_modes;
|
|
|
int n = 0;
|
|
|
while (1) {
|
|
@@ -186,31 +217,33 @@ load_camera(libmegapixels_devconfig *config, config_t *cfg, const char *name)
|
|
|
if (mode == NULL) {
|
|
|
break;
|
|
|
}
|
|
|
- if (!config_setting_lookup_int(mode, "Width", &(camera->modes[n].width))) {
|
|
|
+ libmegapixels_mode *mm = malloc(sizeof(libmegapixels_mode));
|
|
|
+ camera->modes[n] = mm;
|
|
|
+ if (!config_setting_lookup_int(mode, "Width", &mm->width)) {
|
|
|
return -1;
|
|
|
}
|
|
|
- if (!config_setting_lookup_int(mode, "Height", &(camera->modes[n].height))) {
|
|
|
+ if (!config_setting_lookup_int(mode, "Height", &mm->height)) {
|
|
|
return -1;
|
|
|
}
|
|
|
- if (!config_setting_lookup_int(mode, "Rate", &(camera->modes[n].rate))) {
|
|
|
+ if (!config_setting_lookup_int(mode, "Rate", &mm->rate)) {
|
|
|
return -1;
|
|
|
}
|
|
|
|
|
|
const char *fmt;
|
|
|
config_setting_lookup_string(mode, "Format", &fmt);
|
|
|
- camera->modes[n].v4l_pixfmt = format_name_to_v4l_pixfmt(fmt);
|
|
|
- camera->modes[n].media_busfmt = format_name_to_media_busfmt(fmt);
|
|
|
+ mm->v4l_pixfmt = format_name_to_v4l_pixfmt(fmt);
|
|
|
+ mm->media_busfmt = format_name_to_media_busfmt(fmt);
|
|
|
|
|
|
|
|
|
- if (!config_setting_lookup_int(mode, "Rotate", &(camera->modes[n].rotation))) {
|
|
|
- camera->modes[n].rotation = 0;
|
|
|
+ if (!config_setting_lookup_int(mode, "Rotate", &mm->rotation)) {
|
|
|
+ mm->rotation = 0;
|
|
|
}
|
|
|
|
|
|
- if (!config_setting_lookup_float(mode, "FocalLength", &(camera->modes[n].focal_length))) {
|
|
|
- camera->modes[n].focal_length = 0.0f;
|
|
|
+ if (!config_setting_lookup_float(mode, "FocalLength", &mm->focal_length)) {
|
|
|
+ mm->focal_length = 0.0f;
|
|
|
}
|
|
|
- if (!config_setting_lookup_float(mode, "FNumber", &(camera->modes[n].f_number))) {
|
|
|
- camera->modes[n].f_number = 0.0f;
|
|
|
+ if (!config_setting_lookup_float(mode, "FNumber", &mm->f_number)) {
|
|
|
+ mm->f_number = 0.0f;
|
|
|
}
|
|
|
|
|
|
config_setting_t *cmds = config_setting_lookup(mode, "Pipeline");
|
|
@@ -223,21 +256,22 @@ load_camera(libmegapixels_devconfig *config, config_t *cfg, const char *name)
|
|
|
}
|
|
|
|
|
|
int num_cmds = config_setting_length(cmds);
|
|
|
- camera->modes[n].cmds = malloc(num_cmds * sizeof(libmegapixels_cmd));
|
|
|
- camera->modes[n].num_cmds = num_cmds;
|
|
|
+ mm->cmds = (libmegapixels_cmd **) calloc(num_cmds, sizeof(libmegapixels_cmd *));
|
|
|
+ mm->num_cmds = num_cmds;
|
|
|
int m = 0;
|
|
|
while (1) {
|
|
|
cmd = config_setting_get_elem(cmds, m);
|
|
|
if (cmd == NULL) {
|
|
|
break;
|
|
|
}
|
|
|
- libmegapixels_cmd *cur = &(camera->modes[n].cmds[m]);
|
|
|
+ libmegapixels_cmd *cur = calloc(1, sizeof(libmegapixels_cmd));
|
|
|
+ mm->cmds[m] = cur;
|
|
|
const char *type;
|
|
|
if (!config_setting_lookup_string(cmd, "Type", &type)) {
|
|
|
break;
|
|
|
}
|
|
|
if (strcmp(type, "Link") == 0) {
|
|
|
- camera->modes[n].cmds[m].type = LIBMEGAPIXELS_CMD_LINK;
|
|
|
+ camera->modes[n]->cmds[m]->type = LIBMEGAPIXELS_CMD_LINK;
|
|
|
if (!config_setting_lookup_string(cmd, "From", &cur->entity_from)) {
|
|
|
fprintf(stderr, "Missing From\n");
|
|
|
break;
|
|
@@ -253,16 +287,16 @@ load_camera(libmegapixels_devconfig *config, config_t *cfg, const char *name)
|
|
|
cur->pad_to = 0;
|
|
|
}
|
|
|
} else if (strcmp(type, "Mode") == 0) {
|
|
|
- camera->modes[n].cmds[m].type = LIBMEGAPIXELS_CMD_MODE;
|
|
|
+ camera->modes[n]->cmds[m]->type = LIBMEGAPIXELS_CMD_MODE;
|
|
|
if (!config_setting_lookup_string(cmd, "Entity", &cur->entity_from)) {
|
|
|
fprintf(stderr, "Missing entity\n");
|
|
|
break;
|
|
|
}
|
|
|
if (!config_setting_lookup_int(cmd, "Width", &cur->width)) {
|
|
|
- cur->width = camera->modes[n].width;
|
|
|
+ cur->width = camera->modes[n]->width;
|
|
|
}
|
|
|
if (!config_setting_lookup_int(cmd, "Height", &cur->height)) {
|
|
|
- cur->height = camera->modes[n].height;
|
|
|
+ cur->height = camera->modes[n]->height;
|
|
|
}
|
|
|
}
|
|
|
m++;
|