@@ -483,12 +483,13 @@ public:
return cv4l_ioctl(VIDIOC_ENUM_DV_TIMINGS, &timings);
}
- int enum_fmt(v4l2_fmtdesc &fmt, bool init = false, int index = 0, unsigned type = 0)
+ int enum_fmt(v4l2_fmtdesc &fmt, bool init = false, int index = 0, unsigned type = 0, __u32 mbus_code = 0)
{
if (init) {
memset(&fmt, 0, sizeof(fmt));
fmt.type = type ? type : g_type();
fmt.index = index;
+ fmt.mbus_code = mbus_code;
} else {
fmt.index++;
}
@@ -18,11 +18,16 @@
#include "v4l2-ctl.h"
static struct v4l2_format vfmt; /* set_format/get_format */
+static unsigned mbus_code;
+static unsigned mbus_code_out;
void meta_usage()
{
printf("\nMetadata Formats options:\n"
- " --list-formats-meta display supported metadata capture formats [VIDIOC_ENUM_FMT]\n"
+ " --list-formats-meta [<mbus_code>] display supported metadata capture formats.\n"
+ " <mbus_code> is an optional media bus code, if the device has\n"
+ " capability V4L2_CAP_IO_MC then only formats that support this\n"
+ " media bus code are listed [VIDIOC_ENUM_FMT]\n"
" --get-fmt-meta query the metadata capture format [VIDIOC_G_FMT]\n"
" --set-fmt-meta <f> set the metadata capture format [VIDIOC_S_FMT]\n"
" parameter is either the format index as reported by\n"
@@ -30,7 +35,10 @@ void meta_usage()
" --try-fmt-meta <f> try the metadata capture format [VIDIOC_TRY_FMT]\n"
" parameter is either the format index as reported by\n"
" --list-formats-meta, or the fourcc value as a string\n"
- " --list-formats-meta-out display supported metadata output formats [VIDIOC_ENUM_FMT]\n"
+ " --list-formats-meta-out [<mbus_code>] display supported metadata output formats.\n"
+ " <mbus_code> is an optional media bus code, if the device has\n"
+ " capability V4L2_CAP_IO_MC then only formats that support this\n"
+ " media bus code are listed [VIDIOC_ENUM_FMT]\n"
" --get-fmt-meta-out query the metadata output format [VIDIOC_G_FMT]\n"
" --set-fmt-meta-out <f> set the metadata output format [VIDIOC_S_FMT]\n"
" parameter is either the format index as reported by\n"
@@ -58,6 +66,14 @@ void meta_cmd(int ch, char *optarg)
vfmt.fmt.meta.dataformat = strtol(optarg, 0L, 0);
}
break;
+ case OptListMetaFormats:
+ if (optarg)
+ mbus_code = strtoul(optarg, 0L, 0);
+ break;
+ case OptListMetaOutFormats:
+ if (optarg)
+ mbus_code_out = strtoul(optarg, 0L, 0);
+ break;
}
}
@@ -120,12 +136,12 @@ void meta_list(cv4l_fd &fd)
{
if (options[OptListMetaFormats]) {
printf("ioctl: VIDIOC_ENUM_FMT\n");
- print_video_formats(fd, V4L2_BUF_TYPE_META_CAPTURE);
+ print_video_formats(fd, V4L2_BUF_TYPE_META_CAPTURE, mbus_code);
}
if (options[OptListMetaOutFormats]) {
printf("ioctl: VIDIOC_ENUM_FMT\n");
- print_video_formats(fd, V4L2_BUF_TYPE_META_OUTPUT);
+ print_video_formats(fd, V4L2_BUF_TYPE_META_OUTPUT, mbus_code_out);
}
}
@@ -539,7 +539,7 @@ void overlay_list(cv4l_fd &fd)
{
if (options[OptListOverlayFormats]) {
printf("ioctl: VIDIOC_ENUM_FMT\n");
- print_video_formats(fd, V4L2_BUF_TYPE_VIDEO_OVERLAY);
+ print_video_formats(fd, V4L2_BUF_TYPE_VIDEO_OVERLAY, 0);
}
if (options[OptFindFb])
find_fb(fd.g_fd());
@@ -139,10 +139,10 @@ void sdr_list(cv4l_fd &fd)
{
if (options[OptListSdrFormats]) {
printf("ioctl: VIDIOC_ENUM_FMT\n");
- print_video_formats(fd, V4L2_BUF_TYPE_SDR_CAPTURE);
+ print_video_formats(fd, V4L2_BUF_TYPE_SDR_CAPTURE, 0);
}
if (options[OptListSdrOutFormats]) {
printf("ioctl: VIDIOC_ENUM_FMT\n");
- print_video_formats(fd, V4L2_BUF_TYPE_SDR_OUTPUT);
+ print_video_formats(fd, V4L2_BUF_TYPE_SDR_OUTPUT, 0);
}
}
@@ -23,13 +23,21 @@ static unsigned set_fmts;
static __u32 width, height, pixfmt, field, flags;
static __u32 bytesperline[VIDEO_MAX_PLANES];
static __u32 sizeimage[VIDEO_MAX_PLANES];
+static unsigned mbus_code;
void vidcap_usage()
{
printf("\nVideo Capture Formats options:\n"
- " --list-formats display supported video formats [VIDIOC_ENUM_FMT]\n"
- " --list-formats-ext display supported video formats including frame sizes\n"
- " and intervals\n"
+ " --list-formats [<mbus_code>]\n"
+ " display supported video formats. <mbus_code> is an optional\n"
+ " media bus code, if the device has capability V4L2_CAP_IO_MC\n"
+ " then only formats that support this media bus code are listed\n"
+ " [VIDIOC_ENUM_FMT]\n"
+ " --list-formats-ext [<mbus_code>]\n"
+ " display supported video formats including frame sizes and intervals\n"
+ " <mbus_code> is an optional media bus code, if the device has\n"
+ " capability V4L2_CAP_IO_MC then only formats that support this\n"
+ " media bus code are listed [VIDIOC_ENUM_FMT]\n"
" --list-framesizes <f>\n"
" list supported framesizes for pixelformat <f>\n"
" [VIDIOC_ENUM_FRAMESIZES]\n"
@@ -117,6 +125,11 @@ void vidcap_cmd(int ch, char *optarg)
std::exit(EXIT_FAILURE);
}
break;
+ case OptListFormats:
+ case OptListFormatsExt:
+ if (optarg)
+ mbus_code = strtoul(optarg, 0L, 0);
+ break;
case OptListFrameSizes:
be_pixfmt = strlen(optarg) == 7 && !memcmp(optarg + 4, "-BE", 3);
if (be_pixfmt || strlen(optarg) == 4) {
@@ -298,12 +311,12 @@ void vidcap_list(cv4l_fd &fd)
{
if (options[OptListFormats]) {
printf("ioctl: VIDIOC_ENUM_FMT\n");
- print_video_formats(fd, vidcap_buftype);
+ print_video_formats(fd, vidcap_buftype, mbus_code);
}
if (options[OptListFormatsExt]) {
printf("ioctl: VIDIOC_ENUM_FMT\n");
- print_video_formats_ext(fd, vidcap_buftype);
+ print_video_formats_ext(fd, vidcap_buftype, mbus_code);
}
if (options[OptListFields]) {
@@ -21,14 +21,19 @@ static unsigned set_fmts_out;
static __u32 width, height, pixfmt, field, colorspace, xfer_func, ycbcr, quantization, flags;
static __u32 bytesperline[VIDEO_MAX_PLANES];
static __u32 sizeimage[VIDEO_MAX_PLANES];
+static unsigned mbus_code_out;
void vidout_usage()
{
printf("\nVideo Output Formats options:\n"
- " --list-formats-out display supported video output formats [VIDIOC_ENUM_FMT]\n"
- " --list-formats-out-ext\n"
- " display supported video output formats including frame sizes\n"
- " and intervals\n"
+ " --list-formats-out [<mbus_code>] display supported video output formats.\n"
+ " <mbus_code> is an optional media bus code, if the device has\n"
+ " capability V4L2_CAP_IO_MC then only formats that support this\n"
+ " media bus code are listed [VIDIOC_ENUM_FMT]\n"
+ " --list-formats-out-ext [<mbus_code>] display supported video output formats including\n"
+ " frame sizes and intervals. <mbus_code> is an optional media bus code,\n"
+ " if the device has capability V4L2_CAP_IO_MC then only formats that\n"
+ " support this media bus code are listed [VIDIOC_ENUM_FMT]\n"
" --list-fields-out list supported fields for the current output format\n"
" -X, --get-fmt-video-out\n"
" query the video output format [VIDIOC_G_FMT]\n"
@@ -103,6 +108,11 @@ void vidout_cmd(int ch, char *optarg)
std::exit(EXIT_FAILURE);
}
break;
+ case OptListOutFormats:
+ case OptListOutFormatsExt:
+ if (optarg)
+ mbus_code_out = strtoul(optarg, 0L, 0);
+ break;
}
}
@@ -233,12 +243,12 @@ void vidout_list(cv4l_fd &fd)
{
if (options[OptListOutFormats]) {
printf("ioctl: VIDIOC_ENUM_FMT\n");
- print_video_formats(fd, vidout_buftype);
+ print_video_formats(fd, vidout_buftype, mbus_code_out);
}
if (options[OptListOutFormatsExt]) {
printf("ioctl: VIDIOC_ENUM_FMT\n");
- print_video_formats_ext(fd, vidout_buftype);
+ print_video_formats_ext(fd, vidout_buftype, mbus_code_out);
}
if (options[OptListOutFields]) {
@@ -114,18 +114,18 @@ static struct option long_options[] = {
{"get-freq", no_argument, 0, OptGetFreq},
{"set-freq", required_argument, 0, OptSetFreq},
{"list-standards", no_argument, 0, OptListStandards},
- {"list-formats", no_argument, 0, OptListFormats},
- {"list-formats-ext", no_argument, 0, OptListFormatsExt},
+ {"list-formats", optional_argument, 0, OptListFormats},
+ {"list-formats-ext", optional_argument, 0, OptListFormatsExt},
{"list-fields", no_argument, 0, OptListFields},
{"list-framesizes", required_argument, 0, OptListFrameSizes},
{"list-frameintervals", required_argument, 0, OptListFrameIntervals},
{"list-formats-overlay", no_argument, 0, OptListOverlayFormats},
{"list-formats-sdr", no_argument, 0, OptListSdrFormats},
{"list-formats-sdr-out", no_argument, 0, OptListSdrOutFormats},
- {"list-formats-out", no_argument, 0, OptListOutFormats},
- {"list-formats-out-ext", no_argument, 0, OptListOutFormatsExt},
- {"list-formats-meta", no_argument, 0, OptListMetaFormats},
- {"list-formats-meta-out", no_argument, 0, OptListMetaOutFormats},
+ {"list-formats-out", optional_argument, 0, OptListOutFormats},
+ {"list-formats-out-ext", optional_argument, 0, OptListOutFormatsExt},
+ {"list-formats-meta", optional_argument, 0, OptListMetaFormats},
+ {"list-formats-meta-out", optional_argument, 0, OptListMetaOutFormats},
{"list-subdev-mbus-codes", optional_argument, 0, OptListSubDevMBusCodes},
{"list-subdev-framesizes", required_argument, 0, OptListSubDevFrameSizes},
{"list-subdev-frameintervals", required_argument, 0, OptListSubDevFrameIntervals},
@@ -612,13 +612,16 @@ void print_frmival(const struct v4l2_frmivalenum &frmival, const char *prefix)
}
}
-void print_video_formats(cv4l_fd &fd, __u32 type)
+void print_video_formats(cv4l_fd &fd, __u32 type, unsigned int mbus_code)
{
cv4l_disable_trace dt(fd);
struct v4l2_fmtdesc fmt = {};
+ if (mbus_code && !(capabilities & V4L2_CAP_IO_MC))
+ mbus_code = 0;
+
printf("\tType: %s\n\n", buftype2s(type).c_str());
- if (fd.enum_fmt(fmt, true, 0, type))
+ if (fd.enum_fmt(fmt, true, 0, type, mbus_code))
return;
do {
printf("\t[%d]: '%s' (%s", fmt.index, fcc2s(fmt.pixelformat).c_str(),
@@ -629,15 +632,18 @@ void print_video_formats(cv4l_fd &fd, __u32 type)
} while (!fd.enum_fmt(fmt));
}
-void print_video_formats_ext(cv4l_fd &fd, __u32 type)
+void print_video_formats_ext(cv4l_fd &fd, __u32 type, unsigned int mbus_code)
{
cv4l_disable_trace dt(fd);
struct v4l2_fmtdesc fmt = {};
struct v4l2_frmsizeenum frmsize;
struct v4l2_frmivalenum frmival;
+ if (mbus_code && !(capabilities & V4L2_CAP_IO_MC))
+ mbus_code = 0;
+
printf("\tType: %s\n\n", buftype2s(type).c_str());
- if (fd.enum_fmt(fmt, true, 0, type))
+ if (fd.enum_fmt(fmt, true, 0, type, mbus_code))
return;
do {
printf("\t[%d]: '%s' (%s", fmt.index, fcc2s(fmt.pixelformat).c_str(),
@@ -321,8 +321,8 @@ bool valid_pixel_format(int fd, __u32 pixelformat, bool output, bool mplane);
void print_frmsize(const struct v4l2_frmsizeenum &frmsize, const char *prefix);
void print_frmival(const struct v4l2_frmivalenum &frmival, const char *prefix);
void printfmt(int fd, const struct v4l2_format &vfmt);
-void print_video_formats(cv4l_fd &fd, __u32 type);
-void print_video_formats_ext(cv4l_fd &fd, __u32 type);
+void print_video_formats(cv4l_fd &fd, __u32 type, unsigned int mbus_code);
+void print_video_formats_ext(cv4l_fd &fd, __u32 type, unsigned int mbus_code);
static inline bool subscribe_event(cv4l_fd &fd, __u32 type)
{
Add optional <mbus_code> arg to 'v4l2-ctl --list-formats-*' commands for capture, metadata and output devices. If <mbus_code> is given and the device has capability V4L2_CAP_IO_MC then list only the formats that matches the mbus code. The mbus_code is ignored for devices that don't use it or don't have the V4L2_CAP_IO_MC capability. Signed-off-by: Dafna Hirschfeld <dafna.hirschfeld@collabora.com> --- changes since v2: - using different global vars for different metadata buffer types and changing var name to media_code_out for output dev - space after 'if' - replace 's/if the driver has capability/if the device has capability/' changes since v1: code refactor due to comments from Hans utils/common/cv4l-helpers.h | 3 ++- utils/v4l2-ctl/v4l2-ctl-meta.cpp | 24 ++++++++++++++++++++---- utils/v4l2-ctl/v4l2-ctl-overlay.cpp | 2 +- utils/v4l2-ctl/v4l2-ctl-sdr.cpp | 4 ++-- utils/v4l2-ctl/v4l2-ctl-vidcap.cpp | 23 ++++++++++++++++++----- utils/v4l2-ctl/v4l2-ctl-vidout.cpp | 22 ++++++++++++++++------ utils/v4l2-ctl/v4l2-ctl.cpp | 26 ++++++++++++++++---------- utils/v4l2-ctl/v4l2-ctl.h | 4 ++-- 8 files changed, 77 insertions(+), 31 deletions(-)