diff mbox series

v4l2-utils: read/write full frame from/to file for m2m non codec driver

Message ID 20220321230048.372594-1-xavier.roumegue@oss.nxp.com
State New
Headers show
Series v4l2-utils: read/write full frame from/to file for m2m non codec driver | expand

Commit Message

Xavier Roumegue (OSS) March 21, 2022, 11 p.m. UTC
In case of m2m operations with a non codec capable driver, the entire
frame should be read/written from/to the file while writing/reading the
output/capture buffer in case of crop/compose operations.

fixes: d1b18e65fbdf (v4l2-ctl: Add support for crop and compose selection in streaming)

Signed-off-by: Xavier Roumegue <xavier.roumegue@oss.nxp.com>
---
 utils/v4l2-ctl/v4l2-ctl-streaming.cpp | 17 +++++++++++++----
 1 file changed, 13 insertions(+), 4 deletions(-)

Comments

Hans Verkuil April 26, 2022, 6:10 a.m. UTC | #1
On 22/03/2022 00:00, Xavier Roumegue wrote:
> In case of m2m operations with a non codec capable driver, the entire
> frame should be read/written from/to the file while writing/reading the
> output/capture buffer in case of crop/compose operations.
> 
> fixes: d1b18e65fbdf (v4l2-ctl: Add support for crop and compose selection in streaming)
> 
> Signed-off-by: Xavier Roumegue <xavier.roumegue@oss.nxp.com>
> ---
>  utils/v4l2-ctl/v4l2-ctl-streaming.cpp | 17 +++++++++++++----
>  1 file changed, 13 insertions(+), 4 deletions(-)
> 
> diff --git a/utils/v4l2-ctl/v4l2-ctl-streaming.cpp b/utils/v4l2-ctl/v4l2-ctl-streaming.cpp
> index 7f6482d6..ae0fa127 100644
> --- a/utils/v4l2-ctl/v4l2-ctl-streaming.cpp
> +++ b/utils/v4l2-ctl/v4l2-ctl-streaming.cpp
> @@ -89,6 +89,8 @@ enum codec_type {
>  	DECODER
>  };
>  
> +static enum codec_type codec_type;
> +
>  #define QUEUE_ERROR -1
>  #define QUEUE_STOPPED -2
>  
> @@ -352,7 +354,7 @@ void streaming_usage()
>  	       	V4L_STREAM_PORT);
>  }
>  
> -static enum codec_type get_codec_type(cv4l_fd &fd)
> +static enum codec_type _get_codec_type(cv4l_fd &fd)

Why change the function name?

I would just change the return type to void and have this
function set codec_type.

The behavior is then similar to get_cap_compose_rect/get_out_crop_rect.

Those two functions really should have a void return type as well since
they always return 0. Bonus points for making that change in a separate
patch.

>  {
>  	cv4l_disable_trace dt(fd);
>  	struct v4l2_fmtdesc fmt_desc = {};
> @@ -394,6 +396,11 @@ static enum codec_type get_codec_type(cv4l_fd &fd)
>  	return NOT_CODEC;
>  }
>  
> +static void get_codec_type(cv4l_fd &fd)
> +{
> +    codec_type = _get_codec_type(fd);
> +}
> +
>  static int get_cap_compose_rect(cv4l_fd &fd)
>  {
>  	cv4l_disable_trace dt(fd);
> @@ -1109,7 +1116,8 @@ restart:
>  		if (fmt.g_pixelformat() == V4L2_PIX_FMT_FWHT_STATELESS)
>  			res = read_fwht_frame(fmt, static_cast<unsigned char *>(buf), fin,
>  					      sz, expected_len, buf_len);
> -		else if (support_out_crop && v4l2_fwht_find_pixfmt(fmt.g_pixelformat()))
> +		else if (codec_type != NOT_CODEC && support_out_crop
> +				&& v4l2_fwht_find_pixfmt(fmt.g_pixelformat()))

Please move the && to the end of the previous line.

>  			res = read_write_padded_frame(fmt, static_cast<unsigned char *>(buf),
>  						      fin, sz, expected_len, buf_len, true);
>  		else
> @@ -1369,7 +1377,8 @@ static void write_buffer_to_file(cv4l_fd &fd, cv4l_queue &q, cv4l_buffer &buf,
>  		}
>  		if (host_fd_to >= 0)
>  			sz = fwrite(comp_ptr[j] + offset, 1, used, fout);
> -		else if (support_cap_compose && v4l2_fwht_find_pixfmt(fmt.g_pixelformat()))
> +		else if (codec_type != NOT_CODEC && support_cap_compose
> +				&& v4l2_fwht_find_pixfmt(fmt.g_pixelformat()))

Ditto.

>  			read_write_padded_frame(fmt, static_cast<u8 *>(q.g_dataptr(buf.g_index(), j)) + offset,
>  						fout, sz, used, used, false);
>  		else
> @@ -2262,7 +2271,6 @@ static void stateful_m2m(cv4l_fd &fd, cv4l_queue &in, cv4l_queue &out,
>  
>  	bool have_eos = subscribe_event(fd, V4L2_EVENT_EOS);
>  	bool is_encoder = false;
> -	enum codec_type codec_type = get_codec_type(fd);
>  	bool ignore_count_skip = codec_type == ENCODER;
>  
>  	if (have_eos) {
> @@ -2868,6 +2876,7 @@ void streaming_set(cv4l_fd &fd, cv4l_fd &out_fd, cv4l_fd &exp_fd)
>  
>  	get_cap_compose_rect(fd);
>  	get_out_crop_rect(fd);
> +	get_codec_type(fd);
>  
>  	if (do_cap && do_out && out_fd.g_fd() < 0)
>  		streaming_set_m2m(fd, exp_fd);

Regards,

	Hans
diff mbox series

Patch

diff --git a/utils/v4l2-ctl/v4l2-ctl-streaming.cpp b/utils/v4l2-ctl/v4l2-ctl-streaming.cpp
index 7f6482d6..ae0fa127 100644
--- a/utils/v4l2-ctl/v4l2-ctl-streaming.cpp
+++ b/utils/v4l2-ctl/v4l2-ctl-streaming.cpp
@@ -89,6 +89,8 @@  enum codec_type {
 	DECODER
 };
 
+static enum codec_type codec_type;
+
 #define QUEUE_ERROR -1
 #define QUEUE_STOPPED -2
 
@@ -352,7 +354,7 @@  void streaming_usage()
 	       	V4L_STREAM_PORT);
 }
 
-static enum codec_type get_codec_type(cv4l_fd &fd)
+static enum codec_type _get_codec_type(cv4l_fd &fd)
 {
 	cv4l_disable_trace dt(fd);
 	struct v4l2_fmtdesc fmt_desc = {};
@@ -394,6 +396,11 @@  static enum codec_type get_codec_type(cv4l_fd &fd)
 	return NOT_CODEC;
 }
 
+static void get_codec_type(cv4l_fd &fd)
+{
+    codec_type = _get_codec_type(fd);
+}
+
 static int get_cap_compose_rect(cv4l_fd &fd)
 {
 	cv4l_disable_trace dt(fd);
@@ -1109,7 +1116,8 @@  restart:
 		if (fmt.g_pixelformat() == V4L2_PIX_FMT_FWHT_STATELESS)
 			res = read_fwht_frame(fmt, static_cast<unsigned char *>(buf), fin,
 					      sz, expected_len, buf_len);
-		else if (support_out_crop && v4l2_fwht_find_pixfmt(fmt.g_pixelformat()))
+		else if (codec_type != NOT_CODEC && support_out_crop
+				&& v4l2_fwht_find_pixfmt(fmt.g_pixelformat()))
 			res = read_write_padded_frame(fmt, static_cast<unsigned char *>(buf),
 						      fin, sz, expected_len, buf_len, true);
 		else
@@ -1369,7 +1377,8 @@  static void write_buffer_to_file(cv4l_fd &fd, cv4l_queue &q, cv4l_buffer &buf,
 		}
 		if (host_fd_to >= 0)
 			sz = fwrite(comp_ptr[j] + offset, 1, used, fout);
-		else if (support_cap_compose && v4l2_fwht_find_pixfmt(fmt.g_pixelformat()))
+		else if (codec_type != NOT_CODEC && support_cap_compose
+				&& v4l2_fwht_find_pixfmt(fmt.g_pixelformat()))
 			read_write_padded_frame(fmt, static_cast<u8 *>(q.g_dataptr(buf.g_index(), j)) + offset,
 						fout, sz, used, used, false);
 		else
@@ -2262,7 +2271,6 @@  static void stateful_m2m(cv4l_fd &fd, cv4l_queue &in, cv4l_queue &out,
 
 	bool have_eos = subscribe_event(fd, V4L2_EVENT_EOS);
 	bool is_encoder = false;
-	enum codec_type codec_type = get_codec_type(fd);
 	bool ignore_count_skip = codec_type == ENCODER;
 
 	if (have_eos) {
@@ -2868,6 +2876,7 @@  void streaming_set(cv4l_fd &fd, cv4l_fd &out_fd, cv4l_fd &exp_fd)
 
 	get_cap_compose_rect(fd);
 	get_out_crop_rect(fd);
+	get_codec_type(fd);
 
 	if (do_cap && do_out && out_fd.g_fd() < 0)
 		streaming_set_m2m(fd, exp_fd);