Add field support for the media bus format field
authorLaurent Pinchart <laurent.pinchart@ideasonboard.com>
Tue, 20 May 2014 14:54:27 +0000 (16:54 +0200)
committerLaurent Pinchart <laurent.pinchart@ideasonboard.com>
Wed, 4 Jun 2014 10:35:15 +0000 (12:35 +0200)
Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
src/main.c
src/v4l2subdev.c
src/v4l2subdev.h

index 6f980b4..57618d6 100644 (file)
@@ -63,6 +63,9 @@ static void v4l2_subdev_print_format(struct media_entity *entity,
               v4l2_subdev_pixelcode_to_string(format.code),
               format.width, format.height);
 
               v4l2_subdev_pixelcode_to_string(format.code),
               format.width, format.height);
 
+       if (format.field)
+               printf(" field:%s", v4l2_subdev_field_to_string(format.field));
+
        ret = v4l2_subdev_get_selection(entity, &rect, pad,
                                        V4L2_SEL_TGT_CROP_BOUNDS,
                                        which);
        ret = v4l2_subdev_get_selection(entity, &rect, pad,
                                        V4L2_SEL_TGT_CROP_BOUNDS,
                                        which);
index 6c7f9ec..f55de9d 100644 (file)
@@ -401,6 +401,24 @@ static struct media_pad *v4l2_subdev_parse_pad_format(
                        continue;
                }
 
                        continue;
                }
 
+               if (strhazit("field:", &p)) {
+                       enum v4l2_field field;
+
+                       for (end = (char *)p; isalpha(*end) || *end == '-'; ++end);
+
+                       field = v4l2_subdev_string_to_field(p, end - p);
+                       if (field == (enum v4l2_field)-1) {
+                               media_dbg(media, "Invalid field value '%*s'\n", end - p, p);
+                               *endp = (char *)p;
+                               return NULL;
+                       }
+
+                       format->field = field;
+
+                       p = end;
+                       continue;
+               }
+
                /*
                 * Backward compatibility: crop rectangles can be specified
                 * implicitly without the 'crop:' property name.
                /*
                 * Backward compatibility: crop rectangles can be specified
                 * implicitly without the 'crop:' property name.
@@ -683,3 +701,47 @@ enum v4l2_mbus_pixelcode v4l2_subdev_string_to_pixelcode(const char *string,
 
        return mbus_formats[i].code;
 }
 
        return mbus_formats[i].code;
 }
+
+static struct {
+       const char *name;
+       enum v4l2_field field;
+} fields[] = {
+       { "any", V4L2_FIELD_ANY },
+       { "none", V4L2_FIELD_NONE },
+       { "top", V4L2_FIELD_TOP },
+       { "bottom", V4L2_FIELD_BOTTOM },
+       { "interlaced", V4L2_FIELD_INTERLACED },
+       { "seq-tb", V4L2_FIELD_SEQ_TB },
+       { "seq-bt", V4L2_FIELD_SEQ_BT },
+       { "alternate", V4L2_FIELD_ALTERNATE },
+       { "interlaced-tb", V4L2_FIELD_INTERLACED_TB },
+       { "interlaced-bt", V4L2_FIELD_INTERLACED_BT },
+};
+
+const char *v4l2_subdev_field_to_string(enum v4l2_field field)
+{
+       unsigned int i;
+
+       for (i = 0; i < ARRAY_SIZE(fields); ++i) {
+               if (fields[i].field == field)
+                       return fields[i].name;
+       }
+
+       return "unknown";
+}
+
+enum v4l2_field v4l2_subdev_string_to_field(const char *string,
+                                           unsigned int length)
+{
+       unsigned int i;
+
+       for (i = 0; i < ARRAY_SIZE(fields); ++i) {
+               if (strncmp(fields[i].name, string, length) == 0)
+                       break;
+       }
+
+       if (i == ARRAY_SIZE(fields))
+               return (enum v4l2_field)-1;
+
+       return fields[i].field;
+}
index 5d55482..4589739 100644 (file)
@@ -194,7 +194,7 @@ const char *v4l2_subdev_pixelcode_to_string(enum v4l2_mbus_pixelcode code);
 /**
  * @brief Parse string to media bus pixel code.
  * @param string - input string
 /**
  * @brief Parse string to media bus pixel code.
  * @param string - input string
- * @param lenght - length of the string
+ * @param length - length of the string
  *
  * Parse human readable string @a string to an media bus pixel code.
  *
  *
  * Parse human readable string @a string to an media bus pixel code.
  *
@@ -202,4 +202,27 @@ const char *v4l2_subdev_pixelcode_to_string(enum v4l2_mbus_pixelcode code);
  */
 enum v4l2_mbus_pixelcode v4l2_subdev_string_to_pixelcode(const char *string,
                                                         unsigned int length);
  */
 enum v4l2_mbus_pixelcode v4l2_subdev_string_to_pixelcode(const char *string,
                                                         unsigned int length);
+
+/**
+ * @brief Convert a field order to string.
+ * @param field - field order
+ *
+ * Convert field order @a field to a human-readable string.
+ *
+ * @return A pointer to a string on success, NULL on failure.
+ */
+const char *v4l2_subdev_field_to_string(enum v4l2_field field);
+
+/**
+ * @brief Parse string to field order.
+ * @param string - input string
+ * @param length - length of the string
+ *
+ * Parse human readable string @a string to field order.
+ *
+ * @return field order on success, -1 on failure.
+ */
+enum v4l2_field v4l2_subdev_string_to_field(const char *string,
+                                           unsigned int length);
+
 #endif
 #endif