From 0700edb0d8fb3965cc80a2c30b101cab35d0b93f Mon Sep 17 00:00:00 2001 From: Laurent Pinchart Date: Wed, 2 Jun 2010 16:39:13 +0200 Subject: Print active formats when printing device topology When run with the -p argument, print the active format on all subdev pads. Signed-off-by: Laurent Pinchart --- main.c | 35 ++++------------------------------- media.c | 39 ++++++++++++++++++++++++++++++++++++++- subdev.c | 39 +++++++++++++++++++++++++++++++++++++++ subdev.h | 4 ++++ 4 files changed, 85 insertions(+), 32 deletions(-) diff --git a/main.c b/main.c index 164d4e5..b07454a 100644 --- a/main.c +++ b/main.c @@ -39,7 +39,6 @@ #include "media.h" #include "options.h" #include "subdev.h" -#include "tools.h" /* ----------------------------------------------------------------------------- * Links setup @@ -175,43 +174,17 @@ static int setup_links(struct media_device *media, const char *p) * Formats setup */ -static struct { - const char *name; - enum v4l2_mbus_pixelcode code; -} mbus_formats[] = { - { "YUYV", V4L2_MBUS_FMT_YUYV16_1X16 }, - { "UYVY", V4L2_MBUS_FMT_UYVY16_1X16 }, - { "SGRBG10", V4L2_MBUS_FMT_SGRBG10_1X10 }, - { "SGRBG10_DPCM8", V4L2_MBUS_FMT_SGRBG10_DPCM8_1X8 }, -}; - -static const char *pixelcode_to_string(enum v4l2_mbus_pixelcode code) -{ - unsigned int i; - - for (i = 0; i < ARRAY_SIZE(mbus_formats); ++i) { - if (mbus_formats[i].code == code) - return mbus_formats[i].name; - } - - return "unknown"; -} - static int parse_format(struct v4l2_mbus_framefmt *format, const char *p, char **endp) { + enum v4l2_mbus_pixelcode code; unsigned int width, height; - unsigned int i; char *end; for (; isspace(*p); ++p); for (end = (char *)p; !isspace(*end) && *end != '\0'; ++end); - for (i = 0; i < ARRAY_SIZE(mbus_formats); ++i) { - if (strncmp(mbus_formats[i].name, p, end - p) == 0) - break; - } - - if (i == ARRAY_SIZE(mbus_formats)) + code = string_to_pixelcode(p, end - p); + if (code == (enum v4l2_mbus_pixelcode)-1) return -EINVAL; for (p = end; isspace(*p); ++p); @@ -226,7 +199,7 @@ static int parse_format(struct v4l2_mbus_framefmt *format, const char *p, char * memset(format, 0, sizeof(*format)); format->width = width; format->height = height; - format->code = mbus_formats[i].code; + format->code = code; return 0; } diff --git a/media.c b/media.c index b2d0ec1..f20f061 100644 --- a/media.c +++ b/media.c @@ -32,6 +32,7 @@ #include #include "media.h" +#include "subdev.h" #include "tools.h" static const char *media_entity_type_to_string(unsigned type) @@ -85,6 +86,26 @@ static const char *media_entity_subtype_to_string(unsigned type, unsigned subtyp } } +static const char *media_pad_type_to_string(unsigned type) +{ + static const struct { + __u32 type; + const char *name; + } types[] = { + { MEDIA_PAD_TYPE_INPUT, "Input" }, + { MEDIA_PAD_TYPE_OUTPUT, "Output" }, + }; + + unsigned int i; + + for (i = 0; i < ARRAY_SIZE(types); i++) { + if (types[i].type == type) + return types[i].name; + } + + return "Unknown"; +} + /* * media_entity_remote_pad - */ @@ -276,6 +297,7 @@ static void media_print_topology_text(struct media_device *media) { unsigned int i, j, k; unsigned int padding; + int ret; printf("Device topology\n"); @@ -293,6 +315,21 @@ static void media_print_topology_text(struct media_device *media) printf("%*cdevice node name %s\n", padding, ' ', entity->devname); for (j = 0; j < entity->info.pads; j++) { + struct media_entity_pad *pad = &entity->pads[j]; + struct v4l2_mbus_framefmt format; + + printf("\tpad%u: %s", j, media_pad_type_to_string(pad->type)); + + if (entity->info.type == MEDIA_ENTITY_TYPE_SUBDEV) { + ret = v4l2_subdev_get_format(entity, &format, j, + V4L2_SUBDEV_FORMAT_ACTIVE); + if (ret == 0) + printf(" [%s %ux%u]", pixelcode_to_string(format.code), + format.width, format.height); + } + + printf("\n"); + for (k = 0; k < entity->info.links; k++) { struct media_entity_link *link = &entity->links[k]; @@ -300,7 +337,7 @@ static void media_print_topology_text(struct media_device *media) link->source->index != j) continue; - printf("\tpad%u -> '%s':pad%u [", link->source->index, + printf("\t\t-> '%s':pad%u [", link->sink->entity->info.name, link->sink->index); if (link->flags & MEDIA_LINK_FLAG_IMMUTABLE) diff --git a/subdev.c b/subdev.c index 949f359..c35b5b4 100644 --- a/subdev.c +++ b/subdev.c @@ -31,6 +31,45 @@ #include "media.h" #include "subdev.h" +#include "tools.h" + +static struct { + const char *name; + enum v4l2_mbus_pixelcode code; +} mbus_formats[] = { + { "YUYV", V4L2_MBUS_FMT_YUYV16_1X16 }, + { "UYVY", V4L2_MBUS_FMT_UYVY16_1X16 }, + { "SGRBG10", V4L2_MBUS_FMT_SGRBG10_1X10 }, + { "SGRBG10_DPCM8", V4L2_MBUS_FMT_SGRBG10_DPCM8_1X8 }, +}; + +const char *pixelcode_to_string(enum v4l2_mbus_pixelcode code) +{ + unsigned int i; + + for (i = 0; i < ARRAY_SIZE(mbus_formats); ++i) { + if (mbus_formats[i].code == code) + return mbus_formats[i].name; + } + + return "unknown"; +} + +enum v4l2_mbus_pixelcode string_to_pixelcode(const char *string, + unsigned int length) +{ + unsigned int i; + + for (i = 0; i < ARRAY_SIZE(mbus_formats); ++i) { + if (strncmp(mbus_formats[i].name, string, length) == 0) + break; + } + + if (i == ARRAY_SIZE(mbus_formats)) + return (enum v4l2_mbus_pixelcode)-1; + + return mbus_formats[i].code; +} static int v4l2_subdev_open(struct media_entity *entity) { diff --git a/subdev.h b/subdev.h index aeb92d3..c431271 100644 --- a/subdev.h +++ b/subdev.h @@ -24,6 +24,10 @@ struct media_entity; +const char *pixelcode_to_string(enum v4l2_mbus_pixelcode code); +enum v4l2_mbus_pixelcode string_to_pixelcode(const char *string, + unsigned int length); + int v4l2_subdev_get_format(struct media_entity *entity, struct v4l2_mbus_framefmt *format, unsigned int pad, enum v4l2_subdev_format which); -- cgit v1.2.3