Print active formats when printing device topology
authorLaurent Pinchart <laurent.pinchart@ideasonboard.com>
Wed, 2 Jun 2010 14:39:13 +0000 (16:39 +0200)
committerLaurent Pinchart <laurent.pinchart@ideasonboard.com>
Wed, 2 Jun 2010 15:06:04 +0000 (17:06 +0200)
When run with the -p argument, print the active format on all subdev
pads.

Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
main.c
media.c
subdev.c
subdev.h

diff --git a/main.c b/main.c
index 164d4e5..b07454a 100644 (file)
--- 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 (file)
--- a/media.c
+++ b/media.c
@@ -32,6 +32,7 @@
 #include <linux/media.h>
 
 #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)
index 949f359..c35b5b4 100644 (file)
--- a/subdev.c
+++ b/subdev.c
 
 #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)
 {
index aeb92d3..c431271 100644 (file)
--- a/subdev.h
+++ b/subdev.h
 
 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);