@@ -82,6 +82,7 @@ static unsigned int composed_height;
static bool support_cap_compose;
static bool support_out_crop;
static bool in_source_change_event;
+static bool is_stateless;
static __u64 last_fwht_bf_ts;
static fwht_cframe_hdr last_fwht_hdr;
@@ -1234,7 +1235,7 @@ static int do_setup_out_buffers(cv4l_fd &fd, cv4l_queue &q, FILE *fin, bool qbuf
if (fin && !fill_buffer_from_file(fd, q, buf, fmt, fin))
return QUEUE_STOPPED;
- if (fmt.g_pixelformat() == V4L2_PIX_FMT_FWHT_STATELESS) {
+ if (is_stateless) {
int media_fd = mi_get_media_fd(fd.g_fd());
if (media_fd < 0) {
@@ -1268,7 +1269,7 @@ static int do_setup_out_buffers(cv4l_fd &fd, cv4l_queue &q, FILE *fin, bool qbuf
if (!--stream_count)
return QUEUE_STOPPED;
}
- if (fmt.g_pixelformat() == V4L2_PIX_FMT_FWHT_STATELESS) {
+ if (is_stateless) {
set_fwht_req_by_idx(i, &last_fwht_hdr,
last_fwht_bf_ts, buf.g_timestamp_ns());
last_fwht_bf_ts = buf.g_timestamp_ns();
@@ -1530,7 +1531,7 @@ static int do_handle_out(cv4l_fd &fd, cv4l_queue &q, FILE *fin, cv4l_buffer *cap
(u8 *)q.g_dataptr(buf.g_index(), j));
}
- if (fmt.g_pixelformat() == V4L2_PIX_FMT_FWHT_STATELESS) {
+ if (is_stateless) {
if (ioctl(buf.g_request_fd(), MEDIA_REQUEST_IOC_REINIT, NULL)) {
fprintf(stderr, "Unable to reinit media request: %s\n",
strerror(errno));
@@ -1551,7 +1552,7 @@ static int do_handle_out(cv4l_fd &fd, cv4l_queue &q, FILE *fin, cv4l_buffer *cap
fprintf(stderr, "%s: failed: %s\n", "VIDIOC_QBUF", strerror(errno));
return QUEUE_ERROR;
}
- if (fmt.g_pixelformat() == V4L2_PIX_FMT_FWHT_STATELESS) {
+ if (is_stateless) {
if (!set_fwht_req_by_fd(&last_fwht_hdr, buf.g_request_fd(), last_fwht_bf_ts,
buf.g_timestamp_ns())) {
fprintf(stderr, "%s: request for fd %d does not exist\n",
@@ -2392,7 +2393,12 @@ static void stateless_m2m(cv4l_fd &fd, cv4l_queue &in, cv4l_queue &out,
unsigned count[2] = { 0, 0 };
int fd_flags = fcntl(fd.g_fd(), F_GETFL);
bool stopped = false;
+ enum codec_type codec_type = get_codec_type(fd);
+ if (codec_type == ENCODER) {
+ last_fwht_hdr.width = htonl(cropped_width);
+ last_fwht_hdr.height = htonl(cropped_height);
+ }
if (out.reqbufs(&fd, reqbufs_count_out)) {
fprintf(stderr, "%s: out.reqbufs failed\n", __func__);
return;
@@ -2576,7 +2582,9 @@ static void streaming_set_m2m(cv4l_fd &fd, cv4l_fd &exp_fd)
if (out.export_bufs(&exp_fd, exp_fd.g_type()))
goto done;
}
- if (fmt[OUT].g_pixelformat() == V4L2_PIX_FMT_FWHT_STATELESS)
+ is_stateless = fmt[OUT].g_pixelformat() == V4L2_PIX_FMT_FWHT_STATELESS ||
+ fmt[CAP].g_pixelformat() == V4L2_PIX_FMT_FWHT_STATELESS;
+ if (is_stateless)
stateless_m2m(fd, in, out, file[CAP], file[OUT], fmt[CAP], fmt[OUT], exp_fd_p);
else
stateful_m2m(fd, in, out, file[CAP], file[OUT], fmt[CAP], fmt[OUT], exp_fd_p);
adjust the code to support both encoder and decoder for stateless fwht Signed-off-by: Dafna Hirschfeld <dafna3@gmail.com> --- utils/v4l2-ctl/v4l2-ctl-streaming.cpp | 18 +++++++++++++----- 1 file changed, 13 insertions(+), 5 deletions(-)