v4l2-ctl: Add support for META_OUTPUT buffer type
PATCH v4 1/1 v4l2-ctl: Add support for META_OUTPUT buffer type
Add support for META_OUTPUT buffer type to v4l2-ctl.
Signed-off-by Sakari Ailus <[email protected]>
---
Hi Hans, others,
Here's v4 with the required changed committed.
utils/v4l2-ctl/v4l2-ctl-meta.cpp | 92 ++++++++++++++++++++++++++-------------- utils/v4l2-ctl/v4l2-ctl.cpp | 7 +++ utils/v4l2-ctl/v4l2-ctl.h | 5 +++ 3 files changed, 72 insertions(+), 32 deletions(-)
utils/v4l2-ctl/v4l2-ctl-meta.cpp +60 -32
@@ -21,14 +21,22 @@ static struct v4l2_format vfmt; /* set_format/get_format */ void meta_usage(void) { printf("\nMetadata Formats options:\n" - " --list-formats-meta display supported metadata formats [VIDIOC_ENUM_FMT]\n" - " --get-fmt-meta query the metadata format [VIDIOC_G_FMT]\n" - " --set-fmt-meta <f> set the metadata format [VIDIOC_S_FMT]\n" + " --list-formats-meta display supported metadata capture formats [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" " --list-formats-meta, or the fourcc value as a string\n" - " --try-fmt-meta <f> try the metadata format [VIDIOC_TRY_FMT]\n" + " --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" + " --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" + " --list-formats-meta-out, or the fourcc value as a string\n" + " --try-fmt-meta-out <f> try the metadata output format [VIDIOC_TRY_FMT]\n" + " parameter is either the format index as reported by\n" + " --list-formats-meta-out, or the fourcc value as a string\n" ); }
@@ -37,6 +45,8 @@ void meta_cmd(int ch, char *optarg) switch (ch) { case OptSetMetaFormat: case OptTryMetaFormat: + case OptSetMetaOutFormat: + case OptTryMetaOutFormat: if (strlen(optarg) == 0) { meta_usage(); exit(1);
@@ -50,52 +60,70 @@ void meta_cmd(int ch, char *optarg) } } -void meta_set(cv4l_fd &_fd) +static void __meta_set(cv4l_fd &_fd, bool set, bool _try, __u32 type) { + struct v4l2_format in_vfmt; int fd = _fd.g_fd(); int ret; - if ((options[OptSetMetaFormat] || options[OptTryMetaFormat]) && - v4l_type_is_meta(_fd.g_type())) { - struct v4l2_format in_vfmt; - - in_vfmt.type = _fd.g_type(); - in_vfmt.fmt.meta.dataformat = vfmt.fmt.meta.dataformat; + if (!set && !_try) + return; - if (in_vfmt.fmt.meta.dataformat < 256) { - struct v4l2_fmtdesc fmt; + in_vfmt.type = type; + in_vfmt.fmt.meta.dataformat = vfmt.fmt.meta.dataformat; - fmt.index = in_vfmt.fmt.meta.dataformat; - fmt.type = in_vfmt.type; + if (in_vfmt.fmt.meta.dataformat < 256) { + struct v4l2_fmtdesc fmt; - if (doioctl(fd, VIDIOC_ENUM_FMT, &fmt)) - fmt.pixelformat = 0; + fmt.index = in_vfmt.fmt.meta.dataformat; + fmt.type = in_vfmt.type; - in_vfmt.fmt.meta.dataformat = fmt.pixelformat; - } + if (doioctl(fd, VIDIOC_ENUM_FMT, &fmt)) + fmt.pixelformat = 0; - if (options[OptSetMetaFormat]) - ret = doioctl(fd, VIDIOC_S_FMT, &in_vfmt); - else - ret = doioctl(fd, VIDIOC_TRY_FMT, &in_vfmt); - if (ret == 0 && (verbose || options[OptTryMetaFormat])) - printfmt(fd, in_vfmt); + in_vfmt.fmt.meta.dataformat = fmt.pixelformat; } + + if (set) + ret = doioctl(fd, VIDIOC_S_FMT, &in_vfmt); + else + ret = doioctl(fd, VIDIOC_TRY_FMT, &in_vfmt); + if (ret == 0 && (verbose || _try)) + printfmt(fd, in_vfmt); +} + +void meta_set(cv4l_fd &_fd) +{ + __meta_set(_fd, options[OptSetMetaFormat], options[OptTryMetaFormat], + V4L2_BUF_TYPE_META_CAPTURE); + __meta_set(_fd, options[OptSetMetaOutFormat], + options[OptTryMetaOutFormat], V4L2_BUF_TYPE_META_OUTPUT); +} + +void __meta_get(cv4l_fd &fd, __u32 type) +{ + vfmt.type = type; + if (doioctl(fd.g_fd(), VIDIOC_G_FMT, &vfmt) == 0) + printfmt(fd.g_fd(), vfmt); } void meta_get(cv4l_fd &fd) { - if (options[OptGetMetaFormat] && v4l_type_is_meta(fd.g_type())) { - vfmt.type = fd.g_type(); - if (doioctl(fd.g_fd(), VIDIOC_G_FMT, &vfmt) == 0) - printfmt(fd.g_fd(), vfmt); - } + if (options[OptGetMetaFormat]) + __meta_get(fd, V4L2_BUF_TYPE_META_CAPTURE); + if (options[OptGetMetaOutFormat]) + __meta_get(fd, V4L2_BUF_TYPE_META_OUTPUT); } void meta_list(cv4l_fd &fd) { - if (options[OptListMetaFormats] && v4l_type_is_meta(fd.g_type())) { + if (options[OptListMetaFormats]) { + printf("ioctl: VIDIOC_ENUM_FMT\n"); + print_video_formats(fd, V4L2_BUF_TYPE_META_CAPTURE); + } + + if (options[OptListMetaOutFormats]) { printf("ioctl: VIDIOC_ENUM_FMT\n"); - print_video_formats(fd, fd.g_type()); + print_video_formats(fd, V4L2_BUF_TYPE_META_OUTPUT); } }
utils/v4l2-ctl/v4l2-ctl.cpp +7 -0
@@ -123,6 +123,7 @@ static struct option long_options[] = { {"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-subdev-mbus-codes", optional_argument, 0, OptListSubDevMBusCodes}, {"list-subdev-framesizes", required_argument, 0, OptListSubDevFrameSizes}, {"list-subdev-frameintervals", required_argument, 0, OptListSubDevFrameIntervals},
@@ -175,6 +176,9 @@ static struct option long_options[] = { {"get-fmt-meta", no_argument, 0, OptGetMetaFormat}, {"set-fmt-meta", required_argument, 0, OptSetMetaFormat}, {"try-fmt-meta", required_argument, 0, OptTryMetaFormat}, + {"get-fmt-meta-out", no_argument, 0, OptGetMetaOutFormat}, + {"set-fmt-meta-out", required_argument, 0, OptSetMetaOutFormat}, + {"try-fmt-meta-out", required_argument, 0, OptTryMetaOutFormat}, {"get-subdev-fmt", optional_argument, 0, OptGetSubDevFormat}, {"set-subdev-fmt", required_argument, 0, OptSetSubDevFormat}, {"try-subdev-fmt", required_argument, 0, OptTrySubDevFormat},
@@ -239,6 +243,7 @@ static struct option long_options[] = { {"list-buffers-sdr", no_argument, 0, OptListBuffersSdr}, {"list-buffers-sdr-out", no_argument, 0, OptListBuffersSdrOut}, {"list-buffers-meta", no_argument, 0, OptListBuffersMeta}, + {"list-buffers-meta-out", no_argument, 0, OptListBuffersMetaOut}, {"stream-count", required_argument, 0, OptStreamCount}, {"stream-skip", required_argument, 0, OptStreamSkip}, {"stream-loop", no_argument, 0, OptStreamLoop},
@@ -508,6 +513,7 @@ void printfmt(int fd, const struct v4l2_format &vfmt) printf("\tBuffer Size : %u\n", vfmt.fmt.sdr.buffersize); break; case V4L2_BUF_TYPE_META_CAPTURE: + case V4L2_BUF_TYPE_META_OUTPUT: printf("\tSample Format : '%s'%s\n", fcc2s(vfmt.fmt.meta.dataformat).c_str(), printfmtname(fd, vfmt.type, vfmt.fmt.meta.dataformat).c_str()); printf("\tBuffer Size : %u\n", vfmt.fmt.meta.buffersize);
@@ -1275,6 +1281,7 @@ int main(int argc, char **argv) options[OptGetSdrFormat] = 1; options[OptGetSdrOutFormat] = 1; options[OptGetMetaFormat] = 1; + options[OptGetMetaOutFormat] = 1; options[OptGetFBuf] = 1; options[OptGetCropCap] = 1; options[OptGetOutputCropCap] = 1;
utils/v4l2-ctl/v4l2-ctl.h +5 -0
@@ -90,6 +90,7 @@ enum Option { OptGetSdrFormat, OptGetSdrOutFormat, OptGetMetaFormat, + OptGetMetaOutFormat, OptGetSubDevFormat, OptSetSlicedVbiOutFormat, OptSetOverlayFormat,
@@ -98,6 +99,7 @@ enum Option { OptSetSdrFormat, OptSetSdrOutFormat, OptSetMetaFormat, + OptSetMetaOutFormat, OptSetSubDevFormat, OptTryVideoOutFormat, OptTrySlicedVbiOutFormat,
@@ -109,6 +111,7 @@ enum Option { OptTrySdrFormat, OptTrySdrOutFormat, OptTryMetaFormat, + OptTryMetaOutFormat, OptTrySubDevFormat, OptAll, OptListStandards,
@@ -123,6 +126,7 @@ enum Option { OptListOutFormats, OptListOutFormatsExt, OptListMetaFormats, + OptListMetaOutFormats, OptListSubDevMBusCodes, OptListSubDevFrameSizes, OptListSubDevFrameIntervals,
@@ -206,6 +210,7 @@ enum Option { OptListBuffersSdr, OptListBuffersSdrOut, OptListBuffersMeta, + OptListBuffersMetaOut, OptStreamCount, OptStreamSkip, OptStreamLoop,
Signature · 1 line
2.11.0
Quoted 7 lines · Sakari Ailus
Add support for
META_OUTPUTbuffer type to v4l2-ctl.Signed-off-by Sakari Ailus <[email protected]>---
Hi Hans, others,Here's v4 with the required changed committed.
Much better! Applied.
Thanks,
Hans
Quoted 236 lines
utils/v4l2-ctl/v4l2-ctl-meta.cpp | 92 ++++++++++++++++++++++++++-------------- utils/v4l2-ctl/v4l2-ctl.cpp | 7 +++ utils/v4l2-ctl/v4l2-ctl.h | 5 +++ 3 files changed, 72 insertions(+), 32 deletions(-)utils/v4l2-ctl/v4l2-ctl-meta.cpp +60
-32@@ -21,14 +21,22 @@ static struct v4l2_format vfmt; /* set_format/get_format */ void meta_usage(void) { printf("\nMetadata Formats options:\n" - " --list-formats-meta display supported metadata formats [VIDIOC_ENUM_FMT]\n" - " --get-fmt-meta query the metadata format [VIDIOC_G_FMT]\n" - " --set-fmt-meta <f> set the metadata format [VIDIOC_S_FMT]\n" + " --list-formats-meta display supported metadata capture formats [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" " --list-formats-meta, or the fourcc value as a string\n" - " --try-fmt-meta <f> try the metadata format [VIDIOC_TRY_FMT]\n" + " --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" + " --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" + " --list-formats-meta-out, or the fourcc value as a string\n" + " --try-fmt-meta-out <f> try the metadata output format [VIDIOC_TRY_FMT]\n" + " parameter is either the format index as reported by\n" + " --list-formats-meta-out, or the fourcc value as a string\n" ); }@@ -37,6 +45,8 @@ void meta_cmd(int ch, char *optarg) switch (ch) { case OptSetMetaFormat: case OptTryMetaFormat: + case OptSetMetaOutFormat: + case OptTryMetaOutFormat: if (strlen(optarg) == 0) { meta_usage(); exit(1);@@ -50,52 +60,70 @@ void meta_cmd(int ch, char *optarg) } } -void meta_set(cv4l_fd &_fd) +static void __meta_set(cv4l_fd &_fd, bool set, bool _try, __u32 type) { + struct v4l2_format in_vfmt; int fd = _fd.g_fd(); int ret; - if ((options[OptSetMetaFormat] || options[OptTryMetaFormat]) && - v4l_type_is_meta(_fd.g_type())) { - struct v4l2_format in_vfmt; - - in_vfmt.type = _fd.g_type(); - in_vfmt.fmt.meta.dataformat = vfmt.fmt.meta.dataformat; + if (!set && !_try) + return; - if (in_vfmt.fmt.meta.dataformat < 256) { - struct v4l2_fmtdesc fmt; + in_vfmt.type = type; + in_vfmt.fmt.meta.dataformat = vfmt.fmt.meta.dataformat; - fmt.index = in_vfmt.fmt.meta.dataformat; - fmt.type = in_vfmt.type; + if (in_vfmt.fmt.meta.dataformat < 256) { + struct v4l2_fmtdesc fmt; - if (doioctl(fd, VIDIOC_ENUM_FMT, &fmt)) - fmt.pixelformat = 0; + fmt.index = in_vfmt.fmt.meta.dataformat; + fmt.type = in_vfmt.type; - in_vfmt.fmt.meta.dataformat = fmt.pixelformat; - } + if (doioctl(fd, VIDIOC_ENUM_FMT, &fmt)) + fmt.pixelformat = 0; - if (options[OptSetMetaFormat]) - ret = doioctl(fd, VIDIOC_S_FMT, &in_vfmt); - else - ret = doioctl(fd, VIDIOC_TRY_FMT, &in_vfmt); - if (ret == 0 && (verbose || options[OptTryMetaFormat])) - printfmt(fd, in_vfmt); + in_vfmt.fmt.meta.dataformat = fmt.pixelformat; } + + if (set) + ret = doioctl(fd, VIDIOC_S_FMT, &in_vfmt); + else + ret = doioctl(fd, VIDIOC_TRY_FMT, &in_vfmt); + if (ret == 0 && (verbose || _try)) + printfmt(fd, in_vfmt); +} + +void meta_set(cv4l_fd &_fd) +{ + __meta_set(_fd, options[OptSetMetaFormat], options[OptTryMetaFormat], + V4L2_BUF_TYPE_META_CAPTURE); + __meta_set(_fd, options[OptSetMetaOutFormat], + options[OptTryMetaOutFormat], V4L2_BUF_TYPE_META_OUTPUT); +} + +void __meta_get(cv4l_fd &fd, __u32 type) +{ + vfmt.type = type; + if (doioctl(fd.g_fd(), VIDIOC_G_FMT, &vfmt) == 0) + printfmt(fd.g_fd(), vfmt); } void meta_get(cv4l_fd &fd) { - if (options[OptGetMetaFormat] && v4l_type_is_meta(fd.g_type())) { - vfmt.type = fd.g_type(); - if (doioctl(fd.g_fd(), VIDIOC_G_FMT, &vfmt) == 0) - printfmt(fd.g_fd(), vfmt); - } + if (options[OptGetMetaFormat]) + __meta_get(fd, V4L2_BUF_TYPE_META_CAPTURE); + if (options[OptGetMetaOutFormat]) + __meta_get(fd, V4L2_BUF_TYPE_META_OUTPUT); } void meta_list(cv4l_fd &fd) { - if (options[OptListMetaFormats] && v4l_type_is_meta(fd.g_type())) { + if (options[OptListMetaFormats]) { + printf("ioctl: VIDIOC_ENUM_FMT\n"); + print_video_formats(fd, V4L2_BUF_TYPE_META_CAPTURE); + } + + if (options[OptListMetaOutFormats]) { printf("ioctl: VIDIOC_ENUM_FMT\n"); - print_video_formats(fd, fd.g_type()); + print_video_formats(fd, V4L2_BUF_TYPE_META_OUTPUT); } }utils/v4l2-ctl/v4l2-ctl.cpp +7
-0@@ -123,6 +123,7 @@ static struct option long_options[] = { {"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-subdev-mbus-codes", optional_argument, 0, OptListSubDevMBusCodes}, {"list-subdev-framesizes", required_argument, 0, OptListSubDevFrameSizes}, {"list-subdev-frameintervals", required_argument, 0, OptListSubDevFrameIntervals},@@ -175,6 +176,9 @@ static struct option long_options[] = { {"get-fmt-meta", no_argument, 0, OptGetMetaFormat}, {"set-fmt-meta", required_argument, 0, OptSetMetaFormat}, {"try-fmt-meta", required_argument, 0, OptTryMetaFormat}, + {"get-fmt-meta-out", no_argument, 0, OptGetMetaOutFormat}, + {"set-fmt-meta-out", required_argument, 0, OptSetMetaOutFormat}, + {"try-fmt-meta-out", required_argument, 0, OptTryMetaOutFormat}, {"get-subdev-fmt", optional_argument, 0, OptGetSubDevFormat}, {"set-subdev-fmt", required_argument, 0, OptSetSubDevFormat}, {"try-subdev-fmt", required_argument, 0, OptTrySubDevFormat},@@ -239,6 +243,7 @@ static struct option long_options[] = { {"list-buffers-sdr", no_argument, 0, OptListBuffersSdr}, {"list-buffers-sdr-out", no_argument, 0, OptListBuffersSdrOut}, {"list-buffers-meta", no_argument, 0, OptListBuffersMeta}, + {"list-buffers-meta-out", no_argument, 0, OptListBuffersMetaOut}, {"stream-count", required_argument, 0, OptStreamCount}, {"stream-skip", required_argument, 0, OptStreamSkip}, {"stream-loop", no_argument, 0, OptStreamLoop},@@ -508,6 +513,7 @@ void printfmt(int fd, const struct v4l2_format &vfmt) printf("\tBuffer Size : %u\n", vfmt.fmt.sdr.buffersize); break; case V4L2_BUF_TYPE_META_CAPTURE: + case V4L2_BUF_TYPE_META_OUTPUT: printf("\tSample Format : '%s'%s\n", fcc2s(vfmt.fmt.meta.dataformat).c_str(), printfmtname(fd, vfmt.type, vfmt.fmt.meta.dataformat).c_str()); printf("\tBuffer Size : %u\n", vfmt.fmt.meta.buffersize);@@ -1275,6 +1281,7 @@ int main(int argc, char **argv) options[OptGetSdrFormat] = 1; options[OptGetSdrOutFormat] = 1; options[OptGetMetaFormat] = 1; + options[OptGetMetaOutFormat] = 1; options[OptGetFBuf] = 1; options[OptGetCropCap] = 1; options[OptGetOutputCropCap] = 1;utils/v4l2-ctl/v4l2-ctl.h +5
-0@@ -90,6 +90,7 @@ enum Option { OptGetSdrFormat, OptGetSdrOutFormat, OptGetMetaFormat, + OptGetMetaOutFormat, OptGetSubDevFormat, OptSetSlicedVbiOutFormat, OptSetOverlayFormat,@@ -98,6 +99,7 @@ enum Option { OptSetSdrFormat, OptSetSdrOutFormat, OptSetMetaFormat, + OptSetMetaOutFormat, OptSetSubDevFormat, OptTryVideoOutFormat, OptTrySlicedVbiOutFormat,@@ -109,6 +111,7 @@ enum Option { OptTrySdrFormat, OptTrySdrOutFormat, OptTryMetaFormat, + OptTryMetaOutFormat, OptTrySubDevFormat, OptAll, OptListStandards,@@ -123,6 +126,7 @@ enum Option { OptListOutFormats, OptListOutFormatsExt, OptListMetaFormats, + OptListMetaOutFormats, OptListSubDevMBusCodes, OptListSubDevFrameSizes, OptListSubDevFrameIntervals,@@ -206,6 +210,7 @@ enum Option { OptListBuffersSdr, OptListBuffersSdrOut, OptListBuffersMeta, + OptListBuffersMetaOut, OptStreamCount, OptStreamSkip, OptStreamLoop,