diff mbox series

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

Message ID 20190120111520.114305-5-dafna3@gmail.com (mailing list archive)
State New, archived
Headers show
Series Support for source change in m2m decoder | expand

Commit Message

Dafna Hirschfeld Jan. 20, 2019, 11:15 a.m. UTC
Add function capture_setup that implements the
capture setup sequence.

Signed-off-by: Dafna Hirschfeld <dafna3@gmail.com>
---
 utils/v4l2-ctl/v4l2-ctl-streaming.cpp | 58 +++++++++++++++++++++++----
 1 file changed, 50 insertions(+), 8 deletions(-)

Comments

Hans Verkuil Jan. 21, 2019, 9:50 a.m. UTC | #1
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@gmail.com>
> ---
>  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);
>  
>
diff mbox series

Patch

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);
+	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);