Re: [v4l-utils PATCH 4/6] v4l2-ctl: Introduce capture_setup

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

 



On 01/20/2019 12:15 PM, Dafna Hirschfeld wrote:
> Add function capture_setup that implements the
> capture setup sequence.
> 
> Signed-off-by: Dafna Hirschfeld <dafna3@xxxxxxxxx>
> ---
>  utils/v4l2-ctl/v4l2-ctl-streaming.cpp | 58 +++++++++++++++++++++++----
>  1 file changed, 50 insertions(+), 8 deletions(-)
> 
> diff --git a/utils/v4l2-ctl/v4l2-ctl-streaming.cpp b/utils/v4l2-ctl/v4l2-ctl-streaming.cpp
> index fc204304..cd20dec7 100644
> --- a/utils/v4l2-ctl/v4l2-ctl-streaming.cpp
> +++ b/utils/v4l2-ctl/v4l2-ctl-streaming.cpp
> @@ -1836,6 +1836,48 @@ enum stream_type {
>  	OUT,
>  };
>  
> +static int capture_setup(cv4l_fd &fd, cv4l_queue &in)
> +{
> +	struct v4l2_fmtdesc fmt_desc;
> +	cv4l_fmt fmt;
> +
> +	if (fd.streamoff(in.g_type())) {
> +		fprintf(stderr, "%s: fd.streamoff error\n", __func__);
> +		return -1;
> +	}
> +	get_cap_compose_rect(fd);
> +
> +	/* release any buffer allocated */
> +	if (in.reqbufs(&fd)) {
> +		fprintf(stderr, "%s: in.reqbufs 0 error\n", __func__);
> +		return -1;
> +	}
> +
> +	if (fd.enum_fmt(fmt_desc, true, 0, in.g_type())) {
> +		fprintf(stderr, "%s: fd.enum_fmt error\n", __func__);
> +		return -1;
> +	}
> +
> +	fd.g_fmt(fmt, in.g_type());
> +	fmt.s_pixelformat(fmt_desc.pixelformat);

This isn't what I would expect. First try to keep the current pixelformat,
and only if that doesn't work do you pick a new format from the available
formats.

In fact, I don't think you need to do anything here at all since the driver
will update the format if needed on a resolution change.

Regards,

	Hans

> +	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);
> +		return -1;
> +	}
> +	if (in.obtain_bufs(&fd) || in.queue_all(&fd)) {
> +		fprintf(stderr, "%s: in.obtain_bufs error\n", __func__);
> +		return -1;
> +	}
> +	if (fd.streamon(in.g_type())) {
> +		fprintf(stderr, "%s: fd.streamon error\n", __func__);
> +		return -1;
> +	}
> +	return 0;
> +}
> +
>  static void streaming_set_m2m(cv4l_fd &fd)
>  {
>  	int fd_flags = fcntl(fd.g_fd(), F_GETFL);
> @@ -1900,21 +1942,21 @@ static void streaming_set_m2m(cv4l_fd &fd)
>  		}
>  	}
>  
> -	if (in.reqbufs(&fd, reqbufs_count_cap) ||
> -	    out.reqbufs(&fd, reqbufs_count_out))
> +	if (out.reqbufs(&fd, reqbufs_count_out))
>  		goto done;
>  
> -	if (in.obtain_bufs(&fd) ||
> -	    in.queue_all(&fd) ||
> -	    do_setup_out_buffers(fd, out, file[OUT], true))
> +	if (do_setup_out_buffers(fd, out, file[OUT], true))
>  		goto done;
>  
> -	fps_ts[CAP].determine_field(fd.g_fd(), in.g_type());
> -	fps_ts[OUT].determine_field(fd.g_fd(), out.g_type());
> +	if (fd.streamon(out.g_type()))
> +		goto done;
>  
> -	if (fd.streamon(in.g_type()) || fd.streamon(out.g_type()))
> +	if (capture_setup(fd, in))
>  		goto done;
>  
> +	fps_ts[CAP].determine_field(fd.g_fd(), in.g_type());
> +	fps_ts[OUT].determine_field(fd.g_fd(), out.g_type());
> +
>  	while (stream_sleep == 0)
>  		sleep(100);
>  
> 




[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