static struct media_pad *v4l2_subdev_parse_pad_format( struct media_device *media, struct v4l2_mbus_framefmt *format, struct v4l2_rect *crop, struct v4l2_rect *compose, struct v4l2_fract *interval, const char *p, char **endp) { struct media_pad *pad; bool first; char *end; int ret; for (; isspace(*p); ++p); pad = media_parse_pad(media, p, &end); if (pad == NULL) { *endp = end; return NULL; } for (p = end; isspace(*p); ++p); if (*p++ != '[') { media_dbg(media, "Expected '['\n"); *endp = (char *)p - 1; return NULL; } for (first = true; ; first = false) { for (; isspace(*p); p++); /* * Backward compatibility: if the first property starts with an * uppercase later, process it as a format description. */ if (strhazit("fmt:", &p) || (first && isupper(*p))) { ret = v4l2_subdev_parse_format(media, format, p, &end); if (ret < 0) { *endp = end; return NULL; } p = end; continue; } /* * Backward compatibility: crop rectangles can be specified * implicitly without the 'crop:' property name. */ if (strhazit("crop:", &p) || *p == '(') { ret = v4l2_subdev_parse_rectangle(media, crop, p, &end); if (ret < 0) { *endp = end; return NULL; } p = end; continue; } if (strhazit("compose:", &p)) { ret = v4l2_subdev_parse_rectangle(media, compose, p, &end); if (ret < 0) { *endp = end; return NULL; } for (p = end; isspace(*p); p++); continue; } if (*p == '@') { ret = v4l2_subdev_parse_frame_interval(media, interval, ++p, &end); if (ret < 0) { *endp = end; return NULL; } p = end; continue; } break; } if (*p != ']') { media_dbg(media, "Expected ']'\n"); *endp = (char *)p; return NULL; } *endp = (char *)p + 1; return pad; }
int main(int argc, char **argv) { struct media_device *media; int ret = -1; if (parse_cmdline(argc, argv)) return EXIT_FAILURE; /* Open the media device and enumerate entities, pads and links. */ if (media_opts.verbose) media = media_open_debug( media_opts.devname, (void (*)(void *, ...))fprintf, stdout); else media = media_open(media_opts.devname); if (media == NULL) { printf("Failed to open %s\n", media_opts.devname); goto out; } if (media_opts.print) { printf("Media controller API version %u.%u.%u\n\n", (media->info.media_version << 16) & 0xff, (media->info.media_version << 8) & 0xff, (media->info.media_version << 0) & 0xff); printf("Media device information\n" "------------------------\n" "driver %s\n" "model %s\n" "serial %s\n" "bus info %s\n" "hw revision 0x%x\n" "driver version %u.%u.%u\n\n", media->info.driver, media->info.model, media->info.serial, media->info.bus_info, media->info.hw_revision, (media->info.driver_version << 16) & 0xff, (media->info.driver_version << 8) & 0xff, (media->info.driver_version << 0) & 0xff); } if (media_opts.entity) { struct media_entity *entity; entity = media_get_entity_by_name(media, media_opts.entity, strlen(media_opts.entity)); if (entity == NULL) { printf("Entity '%s' not found\n", media_opts.entity); goto out; } printf("%s\n", entity->devname); } if (media_opts.pad) { struct media_pad *pad; pad = media_parse_pad(media, media_opts.pad, NULL); if (pad == NULL) { printf("Pad '%s' not found\n", media_opts.pad); goto out; } v4l2_subdev_print_format(pad->entity, pad->index, V4L2_SUBDEV_FORMAT_ACTIVE); } if (media_opts.print || media_opts.print_dot) { media_print_topology(media, media_opts.print_dot); printf("\n"); } if (media_opts.reset) { if (media_opts.verbose) printf("Resetting all links to inactive\n"); ret = media_reset_links(media); if (ret) { printf("Unable to reset links: %s (%d)\n", strerror(-ret), -ret); goto out; } } if (media_opts.links) { ret = media_parse_setup_links(media, media_opts.links); if (ret) { printf("Unable to parse link: %s (%d)\n", strerror(-ret), -ret); goto out; } } if (media_opts.formats) { ret = v4l2_subdev_parse_setup_formats(media, media_opts.formats); if (ret) { printf("Unable to parse format: %s (%d)\n", strerror(-ret), -ret); goto out; } } if (media_opts.interactive) { while (1) { char buffer[32]; char *end; printf("Enter a link to modify or enter to stop\n"); if (fgets(buffer, sizeof buffer, stdin) == NULL) break; if (buffer[0] == '\n') break; ret = media_parse_setup_link(media, buffer, &end); if (ret) printf("Unable to parse link: %s (%d)\n", strerror(-ret), -ret); } } ret = 0; out: if (media) media_close(media); return ret ? EXIT_FAILURE : EXIT_SUCCESS; }