v4l2-utils: read/write full frame from/to file for m2m non codec driver
Commit Message
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
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
@@ -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);