Re: [v4l-utils PATCH v2 5/5] v4l2-ctl: Add --stream-pixformat option

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

 



Hi Dafna,

On 1/21/19 7:56 PM, Dafna Hirschfeld wrote:
> This option sets the capture pixelformat in the
> capture setup sequence.
> If the format is not supported decoding will stop.
> If the option is not given then the default is to set
> the first supported format.

I'm not convinced about this patch. Is there any reason why you can't
reuse the -v option for this?

What I would expect to happen is this:

If a decoder is detected, then -v doesn't set the current capture format
upfront (as happens now), instead it is done when the decoder sends the SOURCE_CHANGE
event. Otherwise it works the same: it takes the current format and updates
the user-specified fields.

That avoids having to add a new option (we have way too many already).

Regards,

	Hans

> 
> Signed-off-by: Dafna Hirschfeld <dafna3@xxxxxxxxx>
> ---
>  utils/v4l2-ctl/v4l2-ctl-streaming.cpp | 37 +++++++++++++++++++++++++
>  utils/v4l2-ctl/v4l2-ctl.cpp           | 39 ++++++++++++++++++---------
>  utils/v4l2-ctl/v4l2-ctl.h             |  2 ++
>  3 files changed, 65 insertions(+), 13 deletions(-)
> 
> diff --git a/utils/v4l2-ctl/v4l2-ctl-streaming.cpp b/utils/v4l2-ctl/v4l2-ctl-streaming.cpp
> index 8d034b85..3e0a449c 100644
> --- a/utils/v4l2-ctl/v4l2-ctl-streaming.cpp
> +++ b/utils/v4l2-ctl/v4l2-ctl-streaming.cpp
> @@ -78,6 +78,7 @@ static unsigned int composed_width;
>  static unsigned int composed_height;
>  static bool support_cap_compose;
>  static bool support_out_crop;
> +static unsigned int cap_pixelformat;
>  static bool in_source_change_event;
>  
>  #define TS_WINDOW 241
> @@ -272,6 +273,10 @@ void streaming_usage(void)
>  	       "  --stream-from <file>\n"
>  	       "                     stream from this file. The default is to generate a pattern.\n"
>  	       "                     If <file> is '-', then the data is read from stdin.\n"
> +	       "  --stream-pixformat <pixformat>\n"
> +	       "                     set the video pixelformat."
> +	       "                     <pixelformat> is either the format index as reported by\n"
> +	       "                     --list-formats-out, or the fourcc value as a string.\n"
>  	       "  --stream-from-hdr <file> stream from this file. Same as --stream-from, but each\n"
>  	       "                     frame is prefixed by a header. Use for compressed data.\n"
>  	       "  --stream-from-host <hostname[:port]>\n"
> @@ -606,8 +611,16 @@ void streaming_cmd(int ch, char *optarg)
>  {
>  	unsigned i;
>  	int speed;
> +	int r;
>  
>  	switch (ch) {
> +	case OptStreamPixformat:
> +		r = parse_pixelfmt(optarg, cap_pixelformat);
> +		if (r) {
> +			streaming_usage();
> +			exit(1);
> +		}
> +		break;
>  	case OptStreamCount:
>  		stream_count = strtoul(optarg, 0L, 0);
>  		break;
> @@ -1853,6 +1866,9 @@ enum stream_type {
>  
>  static int capture_setup(cv4l_fd &fd, cv4l_queue &in)
>  {
> +	v4l2_fmtdesc fmt_desc;
> +	cv4l_fmt fmt;
> +
>  	if (fd.streamoff(in.g_type())) {
>  		fprintf(stderr, "%s: fd.streamoff error\n", __func__);
>  		return -1;
> @@ -1865,6 +1881,27 @@ static int capture_setup(cv4l_fd &fd, cv4l_queue &in)
>  		return -1;
>  	}
>  
> +	if (cap_pixelformat) {
> +		if (fd.enum_fmt(fmt_desc, true, 0, in.g_type())) {
> +			fprintf(stderr, "%s: fd.enum_fmt error\n", __func__);
> +			return -1;
> +		}
> +
> +		do {
> +			if (cap_pixelformat == fmt_desc.pixelformat)
> +				break;
> +		} while (!fd.enum_fmt(fmt_desc));
> +
> +		if (cap_pixelformat != fmt_desc.pixelformat) {
> +			fprintf(stderr, "%s: format from user not supported\n", __func__);
> +			return -1;
> +		}
> +
> +		fd.g_fmt(fmt, in.g_type());
> +		fmt.s_pixelformat(cap_pixelformat);
> +		fd.s_fmt(fmt, in.g_type());
> +	}
> +
>  	if (in.reqbufs(&fd, reqbufs_count_cap)) {
>  		fprintf(stderr, "%s: in.reqbufs %u error\n", __func__,
>  			reqbufs_count_cap);
> diff --git a/utils/v4l2-ctl/v4l2-ctl.cpp b/utils/v4l2-ctl/v4l2-ctl.cpp
> index 1783979d..2cbf519e 100644
> --- a/utils/v4l2-ctl/v4l2-ctl.cpp
> +++ b/utils/v4l2-ctl/v4l2-ctl.cpp
> @@ -238,6 +238,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},
> +	{"stream-pixformat", required_argument, 0, OptStreamPixformat},
>  	{"stream-count", required_argument, 0, OptStreamCount},
>  	{"stream-skip", required_argument, 0, OptStreamSkip},
>  	{"stream-loop", no_argument, 0, OptStreamLoop},
> @@ -722,6 +723,30 @@ __u32 parse_quantization(const char *s)
>  	return V4L2_QUANTIZATION_DEFAULT;
>  }
>  
> +int parse_pixelfmt(char *value,  __u32 &pixelformat)
> +{
> +	int fmts = 0;
> +	bool be_pixfmt;
> +
> +	if(!value)
> +		return -EINVAL;
> +
> +	be_pixfmt = strlen(value) == 7 && !memcmp(value + 4, "-BE", 3);
> +	if (be_pixfmt)
> +		value[4] = 0;
> +	if (strlen(value) == 4) {
> +		pixelformat =
> +			v4l2_fourcc(value[0], value[1],
> +					value[2], value[3]);
> +		if (be_pixfmt)
> +			pixelformat |= 1 << 31;
> +	} else {
> +		pixelformat = strtol(value, 0L, 0);
> +	}
> +	fmts |= FmtPixelFormat;
> +	return 0;
> +}
> +
>  int parse_fmt(char *optarg, __u32 &width, __u32 &height, __u32 &pixelformat,
>  	      __u32 &field, __u32 &colorspace, __u32 &xfer_func, __u32 &ycbcr,
>  	      __u32 &quantization, __u32 &flags, __u32 *bytesperline)
> @@ -729,7 +754,6 @@ int parse_fmt(char *optarg, __u32 &width, __u32 &height, __u32 &pixelformat,
>  	char *value, *subs;
>  	int fmts = 0;
>  	unsigned bpl_index = 0;
> -	bool be_pixfmt;
>  
>  	field = V4L2_FIELD_ANY;
>  	flags = 0;
> @@ -760,18 +784,7 @@ int parse_fmt(char *optarg, __u32 &width, __u32 &height, __u32 &pixelformat,
>  			fmts |= FmtHeight;
>  			break;
>  		case 2:
> -			be_pixfmt = strlen(value) == 7 && !memcmp(value + 4, "-BE", 3);
> -			if (be_pixfmt)
> -				value[4] = 0;
> -			if (strlen(value) == 4) {
> -				pixelformat =
> -					v4l2_fourcc(value[0], value[1],
> -							value[2], value[3]);
> -				if (be_pixfmt)
> -					pixelformat |= 1 << 31;
> -			} else {
> -				pixelformat = strtol(value, 0L, 0);
> -			}
> +			parse_pixelfmt(value, pixelformat);
>  			fmts |= FmtPixelFormat;
>  			break;
>  		case 3:
> diff --git a/utils/v4l2-ctl/v4l2-ctl.h b/utils/v4l2-ctl/v4l2-ctl.h
> index 5a52a0a4..8eee5351 100644
> --- a/utils/v4l2-ctl/v4l2-ctl.h
> +++ b/utils/v4l2-ctl/v4l2-ctl.h
> @@ -205,6 +205,7 @@ enum Option {
>  	OptListBuffersSdr,
>  	OptListBuffersSdrOut,
>  	OptListBuffersMeta,
> +	OptStreamPixformat,
>  	OptStreamCount,
>  	OptStreamSkip,
>  	OptStreamLoop,
> @@ -299,6 +300,7 @@ __u32 parse_xfer_func(const char *s);
>  __u32 parse_ycbcr(const char *s);
>  __u32 parse_hsv(const char *s);
>  __u32 parse_quantization(const char *s);
> +int parse_pixelfmt(char *value,  __u32 &pixelformat);
>  int parse_fmt(char *optarg, __u32 &width, __u32 &height, __u32 &pixelformat,
>  	      __u32 &field, __u32 &colorspace, __u32 &xfer, __u32 &ycbcr,
>  	      __u32 &quantization, __u32 &flags, __u32 *bytesperline);
> 




[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