From patchwork Sat Nov 7 21:22:21 2015 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Sakari Ailus X-Patchwork-Id: 7576371 Return-Path: X-Original-To: patchwork-linux-media@patchwork.kernel.org Delivered-To: patchwork-parsemail@patchwork1.web.kernel.org Received: from mail.kernel.org (mail.kernel.org [198.145.29.136]) by patchwork1.web.kernel.org (Postfix) with ESMTP id 68E9C9F1AF for ; Sat, 7 Nov 2015 21:23:50 +0000 (UTC) Received: from mail.kernel.org (localhost [127.0.0.1]) by mail.kernel.org (Postfix) with ESMTP id 6D409205E8 for ; Sat, 7 Nov 2015 21:23:49 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by mail.kernel.org (Postfix) with ESMTP id 02A38205EE for ; Sat, 7 Nov 2015 21:23:48 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1752723AbbKGVXq (ORCPT ); Sat, 7 Nov 2015 16:23:46 -0500 Received: from mga11.intel.com ([192.55.52.93]:16498 "EHLO mga11.intel.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1752557AbbKGVXo (ORCPT ); Sat, 7 Nov 2015 16:23:44 -0500 Received: from fmsmga003.fm.intel.com ([10.253.24.29]) by fmsmga102.fm.intel.com with ESMTP; 07 Nov 2015 13:23:45 -0800 X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="5.20,258,1444719600"; d="scan'208";a="596006955" Received: from paasikivi.fi.intel.com ([10.237.72.42]) by FMSMGA003.fm.intel.com with ESMTP; 07 Nov 2015 13:23:42 -0800 Received: from nauris.fi.intel.com (nauris.localdomain [192.168.240.2]) by paasikivi.fi.intel.com (Postfix) with ESMTP id E6659208F9; Sat, 7 Nov 2015 23:23:11 +0200 (EET) Received: by nauris.fi.intel.com (Postfix, from userid 1000) id 291D320225; Sat, 7 Nov 2015 23:22:31 +0200 (EET) From: Sakari Ailus To: linux-media@vger.kernel.org Cc: laurent.pinchart@ideasonboard.com, hverkuil@xs4all.nl Subject: [v4l-utils PATCH 2/2] media-ctl: Add field support for the media bus format Date: Sat, 7 Nov 2015 23:22:21 +0200 Message-Id: <1446931341-29254-3-git-send-email-sakari.ailus@linux.intel.com> X-Mailer: git-send-email 2.1.0.231.g7484e3b In-Reply-To: <1446931341-29254-1-git-send-email-sakari.ailus@linux.intel.com> References: <1446931341-29254-1-git-send-email-sakari.ailus@linux.intel.com> Sender: linux-media-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-media@vger.kernel.org X-Spam-Status: No, score=-6.9 required=5.0 tests=BAYES_00, RCVD_IN_DNSWL_HI, T_RP_MATCHES_RCVD, UNPARSEABLE_RELAY autolearn=unavailable version=3.3.1 X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on mail.kernel.org X-Virus-Scanned: ClamAV using ClamSMTP From: Laurent Pinchart Signed-off-by: Laurent Pinchart Use strncasecmp() instead of strncmp() when comparing field names and add documentation on setting the field value. Wrap a few lines as well. Signed-off-by: Sakari Ailus --- utils/media-ctl/libv4l2subdev.c | 64 +++++++++++++++++++++++++++++++++++++++++ utils/media-ctl/media-ctl.c | 3 ++ utils/media-ctl/options.c | 12 +++++++- utils/media-ctl/v4l2subdev.h | 25 +++++++++++++++- 4 files changed, 102 insertions(+), 2 deletions(-) diff --git a/utils/media-ctl/libv4l2subdev.c b/utils/media-ctl/libv4l2subdev.c index 8015330..949eeff 100644 --- a/utils/media-ctl/libv4l2subdev.c +++ b/utils/media-ctl/libv4l2subdev.c @@ -473,6 +473,26 @@ static struct media_pad *v4l2_subdev_parse_pad_format( 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. @@ -755,3 +775,47 @@ enum v4l2_mbus_pixelcode v4l2_subdev_string_to_pixelcode(const char *string, 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 (strncasecmp(fields[i].name, string, length) == 0) + break; + } + + if (i == ARRAY_SIZE(fields)) + return (enum v4l2_field)-1; + + return fields[i].field; +} diff --git a/utils/media-ctl/media-ctl.c b/utils/media-ctl/media-ctl.c index d3f6e04..3002fb7 100644 --- a/utils/media-ctl/media-ctl.c +++ b/utils/media-ctl/media-ctl.c @@ -90,6 +90,9 @@ static void v4l2_subdev_print_format(struct media_entity *entity, 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); diff --git a/utils/media-ctl/options.c b/utils/media-ctl/options.c index ffaffcd..75d7ad7 100644 --- a/utils/media-ctl/options.c +++ b/utils/media-ctl/options.c @@ -24,7 +24,10 @@ #include #include +#include + #include "options.h" +#include "v4l2subdev.h" #define MEDIA_DEVNAME_DEFAULT "/dev/media0" @@ -34,6 +37,8 @@ struct media_options media_opts = { static void usage(const char *argv0) { + unsigned int i; + printf("%s [options]\n", argv0); printf("-d, --device dev Media device name (default: %s)\n", MEDIA_DEVNAME_DEFAULT); printf("-e, --entity name Print the device name associated with the given entity\n"); @@ -58,7 +63,7 @@ static void usage(const char *argv0) printf("\tv4l2-properties = v4l2-property { ',' v4l2-property } ;\n"); printf("\tv4l2-property = v4l2-mbusfmt | v4l2-crop | v4l2-interval\n"); printf("\t | v4l2-compose | v4l2-interval ;\n"); - printf("\tv4l2-mbusfmt = 'fmt:' fcc '/' size ;\n"); + printf("\tv4l2-mbusfmt = 'fmt:' fcc '/' size ; { 'field:' v4l2-field ; }\n"); printf("\tv4l2-crop = 'crop:' rectangle ;\n"); printf("\tv4l2-compose = 'compose:' rectangle ;\n"); printf("\tv4l2-interval = '@' numerator '/' denominator ;\n"); @@ -76,6 +81,11 @@ static void usage(const char *argv0) printf("\theight Image height in pixels\n"); printf("\tnumerator Frame interval numerator\n"); printf("\tdenominator Frame interval denominator\n"); + printf("\tv4l2-field One of the following:\n"); + + for (i = V4L2_FIELD_ANY; i <= V4L2_FIELD_INTERLACED_BT; i++) + printf("\t %s\n", + v4l2_subdev_field_to_string(i)); } #define OPT_PRINT_DOT 256 diff --git a/utils/media-ctl/v4l2subdev.h b/utils/media-ctl/v4l2subdev.h index 4961308..104e420 100644 --- a/utils/media-ctl/v4l2subdev.h +++ b/utils/media-ctl/v4l2subdev.h @@ -248,7 +248,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 - * @param lenght - length of the string + * @param length - length of the string * * Parse human readable string @a string to an media bus pixel code. * @@ -256,4 +256,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); + +/** + * @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