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