Re: [yavta PATCH v2 1/1] v4l2-ctl: Add support for META_OUTPUT buffer type

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



Hi Hans,

On Thu, Jan 24, 2019 at 09:44:13AM +0100, Hans Verkuil wrote:
> Note: the subject it wrong, it's v4l-utils, not yavta.

Oops, my bad. I must have been thinking of yavta when writing that. :-)

And thanks for the review.

> 
> On 1/22/19 1:05 PM, Sakari Ailus wrote:
> > Add support for META_OUTPUT buffer type to v4l2-ctl.
> > 
> > Signed-off-by: Sakari Ailus <sakari.ailus@xxxxxxxxxxxxxxx>
> > ---
> > Hi Hans,
> > 
> > Here's an update for the meta output buffer type in v4l2-ctl.
> > 
> > Since v1:
> > 
> > - Merge help text for meta and meta out buffer types
> > 
> > - Unify implementation for meta format handling
> > 
> >  utils/v4l2-ctl/v4l2-ctl-meta.cpp | 71 ++++++++++++++++++++++++++++++++++++----
> >  utils/v4l2-ctl/v4l2-ctl.cpp      |  7 ++++
> >  utils/v4l2-ctl/v4l2-ctl.h        |  5 +++
> >  3 files changed, 76 insertions(+), 7 deletions(-)
> > 
> > diff --git a/utils/v4l2-ctl/v4l2-ctl-meta.cpp b/utils/v4l2-ctl/v4l2-ctl-meta.cpp
> > index 37c91940a8..f4aa434937 100644
> > --- a/utils/v4l2-ctl/v4l2-ctl-meta.cpp
> > +++ b/utils/v4l2-ctl/v4l2-ctl-meta.cpp
> > @@ -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);
> > @@ -55,8 +65,38 @@ void meta_set(cv4l_fd &_fd)
> >  	int fd = _fd.g_fd();
> >  	int ret;
> >  
> > +	if (!v4l_type_is_meta(_fd.g_type()))
> > +		return;
> > +
> >  	if ((options[OptSetMetaFormat] || options[OptTryMetaFormat]) &&
> > -	    v4l_type_is_meta(_fd.g_type())) {
> > +	    v4l_type_is_capture(_fd.g_type())) {
> > +		struct v4l2_format in_vfmt;
> > +
> > +		in_vfmt.type = _fd.g_type();
> > +		in_vfmt.fmt.meta.dataformat = vfmt.fmt.meta.dataformat;
> > +
> > +		if (in_vfmt.fmt.meta.dataformat < 256) {
> > +			struct v4l2_fmtdesc fmt;
> > +
> > +			fmt.index = in_vfmt.fmt.meta.dataformat;
> > +			fmt.type = in_vfmt.type;
> > +
> > +			if (doioctl(fd, VIDIOC_ENUM_FMT, &fmt))
> > +				fmt.pixelformat = 0;
> > +
> > +			in_vfmt.fmt.meta.dataformat = fmt.pixelformat;
> > +		}
> > +
> > +		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);
> 
> This is exactly the same code for meta output. Why not just do:
> 
>   	if ((options[OptSetMetaFormat] || options[OptTryMetaFormat] ||
> 	     options[OptSetMetaOutFormat] || options[OptTryMetaOutFormat]) &&
> 	    v4l_type_is_meta(_fd.g_type())
> 
> You can add tests for capture/output if you like, but it is not really necessary.

Ack, I'll fix that.

> 
> 
> > +	}
> > +
> > +	if ((options[OptSetMetaOutFormat] || options[OptTryMetaOutFormat]) &&
> > +	    v4l_type_is_output(_fd.g_type())) {
> >  		struct v4l2_format in_vfmt;
> >  
> >  		in_vfmt.type = _fd.g_type();
> > @@ -85,7 +125,16 @@ void meta_set(cv4l_fd &_fd)
> >  
> >  void meta_get(cv4l_fd &fd)
> >  {
> > -	if (options[OptGetMetaFormat] && v4l_type_is_meta(fd.g_type())) {
> > +	if (!v4l_type_is_meta(fd.g_type()))
> > +		return;
> > +
> > +	if (options[OptGetMetaFormat] && v4l_type_is_capture(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[OptGetMetaOutFormat] && v4l_type_is_output(fd.g_type())) {
> >  		vfmt.type = fd.g_type();
> >  		if (doioctl(fd.g_fd(), VIDIOC_G_FMT, &vfmt) == 0)
> >  			printfmt(fd.g_fd(), vfmt);
> > @@ -94,7 +143,15 @@ void meta_get(cv4l_fd &fd)
> >  
> >  void meta_list(cv4l_fd &fd)
> >  {
> > -	if (options[OptListMetaFormats] && v4l_type_is_meta(fd.g_type())) {
> > +	if (!v4l_type_is_meta(fd.g_type()))
> > +		return;
> > +
> > +	if (options[OptListMetaFormats] && v4l_type_is_capture(fd.g_type())) {
> > +		printf("ioctl: VIDIOC_ENUM_FMT\n");
> > +		print_video_formats(fd, fd.g_type());
> > +	}
> > +
> > +	if (options[OptListMetaOutFormats] && v4l_type_is_output(fd.g_type())) {
> >  		printf("ioctl: VIDIOC_ENUM_FMT\n");
> >  		print_video_formats(fd, fd.g_type());
> >  	}
> 
> Same for these two functions: the same code works for both meta capture and output.
> 
> To be honest, I would really like to completely rework the way v4l2-ctl handles this.
> There are way too many options to list, get, set, try formats. But you really don't
> need to specify the type (video, meta, sdr, vbi, etc) as that can be determined
> automatically.

As long as a video node supports a single type only. Aren't there cases
that need multiple types? Vbi?

> 
> But let's get this done first, and then I'll take another look at this.
> 
> Regards,
> 
> 	Hans
> 
> 
> > diff --git a/utils/v4l2-ctl/v4l2-ctl.cpp b/utils/v4l2-ctl/v4l2-ctl.cpp
> > index 1783979d76..ffac8716d0 100644
> > --- a/utils/v4l2-ctl/v4l2-ctl.cpp
> > +++ b/utils/v4l2-ctl/v4l2-ctl.cpp
> > @@ -122,6 +122,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},
> > @@ -174,6 +175,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},
> > @@ -238,6 +242,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},
> > @@ -507,6 +512,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);
> > @@ -1247,6 +1253,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;
> > diff --git a/utils/v4l2-ctl/v4l2-ctl.h b/utils/v4l2-ctl/v4l2-ctl.h
> > index 5a52a0a48f..fc51cd1b97 100644
> > --- a/utils/v4l2-ctl/v4l2-ctl.h
> > +++ b/utils/v4l2-ctl/v4l2-ctl.h
> > @@ -89,6 +89,7 @@ enum Option {
> >  	OptGetSdrFormat,
> >  	OptGetSdrOutFormat,
> >  	OptGetMetaFormat,
> > +	OptGetMetaOutFormat,
> >  	OptGetSubDevFormat,
> >  	OptSetSlicedVbiOutFormat,
> >  	OptSetOverlayFormat,
> > @@ -97,6 +98,7 @@ enum Option {
> >  	OptSetSdrFormat,
> >  	OptSetSdrOutFormat,
> >  	OptSetMetaFormat,
> > +	OptSetMetaOutFormat,
> >  	OptSetSubDevFormat,
> >  	OptTryVideoOutFormat,
> >  	OptTrySlicedVbiOutFormat,
> > @@ -108,6 +110,7 @@ enum Option {
> >  	OptTrySdrFormat,
> >  	OptTrySdrOutFormat,
> >  	OptTryMetaFormat,
> > +	OptTryMetaOutFormat,
> >  	OptTrySubDevFormat,
> >  	OptAll,
> >  	OptListStandards,
> > @@ -122,6 +125,7 @@ enum Option {
> >  	OptListOutFormats,
> >  	OptListOutFormatsExt,
> >  	OptListMetaFormats,
> > +	OptListMetaOutFormats,
> >  	OptListSubDevMBusCodes,
> >  	OptListSubDevFrameSizes,
> >  	OptListSubDevFrameIntervals,
> > @@ -205,6 +209,7 @@ enum Option {
> >  	OptListBuffersSdr,
> >  	OptListBuffersSdrOut,
> >  	OptListBuffersMeta,
> > +	OptListBuffersMetaOut,
> >  	OptStreamCount,
> >  	OptStreamSkip,
> >  	OptStreamLoop,
> > 
> 

-- 
Sakari Ailus
sakari.ailus@xxxxxxxxxxxxxxx



[Index of Archives]     [Linux Input]     [Video for Linux]     [Gstreamer Embedded]     [Mplayer Users]     [Linux USB Devel]     [Linux Audio Users]     [Linux Kernel]     [Linux SCSI]     [Yosemite Backpacking]

  Powered by Linux