* [PATCH v4l-utils 0/2] v4l2-tracer: fix expected frame length calculation
@ 2026-03-16 13:22 Sarah Gershuni
2026-03-16 13:22 ` [PATCH v4l-utils 1/2] add plane_bytesperline to trace_context Sarah Gershuni
2026-03-16 13:22 ` [PATCH v4l-utils 2/2] calculate expected length using v4l2-fwht info Sarah Gershuni
0 siblings, 2 replies; 4+ messages in thread
From: Sarah Gershuni @ 2026-03-16 13:22 UTC (permalink / raw)
To: linux-media; +Cc: Sarah Gershuni
This series fixes the calculation of expected frame lengths in v4l2-tracer.
Previously, the calculation assumed that the stride equals the width and that chroma
padding follows the end of the plane, which could result in incorrect lengths.
Patch 1/2: add plane_bytesperline to trace_context
- Introduces `plane_bytesperline` to store the stride of each plane, providing the
necessary data to compute accurate frame lengths.
Patch 2/2: calculate expected length using v4l2-fwht info
- Computes the frame length per plane correctly, fixing previous inaccuracies.
Together, these patches ensure that v4l2-tracer calculates expected frame lengths
accurately for all supported pixel formats.
Signed-off-by: Sarah Gershuni <sarah556726@gmail.com>
Sarah Gershuni (2):
add plane_bytesperline to trace_context
calculate expected length using v4l2-fwht info
utils/v4l2-tracer/trace-helper.cpp | 55 ++++++++++++++++++++++--------
utils/v4l2-tracer/trace.h | 1 +
2 files changed, 42 insertions(+), 14 deletions(-)
--
2.43.0
^ permalink raw reply [flat|nested] 4+ messages in thread
* [PATCH v4l-utils 1/2] add plane_bytesperline to trace_context
2026-03-16 13:22 [PATCH v4l-utils 0/2] v4l2-tracer: fix expected frame length calculation Sarah Gershuni
@ 2026-03-16 13:22 ` Sarah Gershuni
2026-03-16 13:22 ` [PATCH v4l-utils 2/2] calculate expected length using v4l2-fwht info Sarah Gershuni
1 sibling, 0 replies; 4+ messages in thread
From: Sarah Gershuni @ 2026-03-16 13:22 UTC (permalink / raw)
To: linux-media; +Cc: Sarah Gershuni
Add plane_bytesperline array to trace_context to store stride per plane for
multiplanar formats. Update g_fmt_setup_trace to initialize the array.
Signed-off-by: Sarah Gershuni <sarah556726@gmail.com>
---
utils/v4l2-tracer/trace-helper.cpp | 15 +++++++++++++--
utils/v4l2-tracer/trace.h | 1 +
2 files changed, 14 insertions(+), 2 deletions(-)
diff --git a/utils/v4l2-tracer/trace-helper.cpp b/utils/v4l2-tracer/trace-helper.cpp
index 9e5747a2..6c296dbf 100644
--- a/utils/v4l2-tracer/trace-helper.cpp
+++ b/utils/v4l2-tracer/trace-helper.cpp
@@ -399,16 +399,27 @@ void g_fmt_setup_trace(struct v4l2_format *format)
ctx_trace.width = format->fmt.pix.width;
ctx_trace.height = format->fmt.pix.height;
ctx_trace.pixelformat = format->fmt.pix.pixelformat;
+ ctx_trace.plane_bytesperline[0] = format->fmt.pix.bytesperline;
}
if (format->type == V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE) {
ctx_trace.width = format->fmt.pix_mp.width;
ctx_trace.height = format->fmt.pix_mp.height;
ctx_trace.pixelformat = format->fmt.pix_mp.pixelformat;
+
+ for (unsigned i = 0; i < format->fmt.pix_mp.num_planes; i++){
+ ctx_trace.plane_bytesperline[i] = format->fmt.pix_mp.plane_fmt[i].bytesperline;
+ }
}
- if (format->type == V4L2_BUF_TYPE_VIDEO_OUTPUT)
+ if (format->type == V4L2_BUF_TYPE_VIDEO_OUTPUT){
ctx_trace.compression_format = format->fmt.pix.pixelformat;
- if (format->type == V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE)
+ ctx_trace.plane_bytesperline[0] = format->fmt.pix.bytesperline;
+ }
+ if (format->type == V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE){
ctx_trace.compression_format = format->fmt.pix_mp.pixelformat;
+ for (unsigned i = 0; i < format->fmt.pix_mp.num_planes; i++){
+ ctx_trace.plane_bytesperline[i] = format->fmt.pix_mp.plane_fmt[i].bytesperline;
+ }
+ }
}
void s_fmt_setup(struct v4l2_format *format)
diff --git a/utils/v4l2-tracer/trace.h b/utils/v4l2-tracer/trace.h
index a74a5f3f..7f166287 100644
--- a/utils/v4l2-tracer/trace.h
+++ b/utils/v4l2-tracer/trace.h
@@ -32,6 +32,7 @@ struct trace_context {
__u32 pixelformat;
std::string media_device;
__u32 compression_format;
+ __u32 plane_bytesperline[VIDEO_MAX_PLANES];
union {
struct h264_info h264;
} fmt;
--
2.43.0
^ permalink raw reply related [flat|nested] 4+ messages in thread
* [PATCH v4l-utils 2/2] calculate expected length using v4l2-fwht info
2026-03-16 13:22 [PATCH v4l-utils 0/2] v4l2-tracer: fix expected frame length calculation Sarah Gershuni
2026-03-16 13:22 ` [PATCH v4l-utils 1/2] add plane_bytesperline to trace_context Sarah Gershuni
@ 2026-03-16 13:22 ` Sarah Gershuni
2026-03-17 12:10 ` Hans Verkuil
1 sibling, 1 reply; 4+ messages in thread
From: Sarah Gershuni @ 2026-03-16 13:22 UTC (permalink / raw)
To: linux-media; +Cc: Sarah Gershuni
Update get_expected_length_trace to calculate the expected buffer length
based on v4l2_fwht_find_pixfmt info.
Signed-off-by: Sarah Gershuni <sarah556726@gmail.com>
---
utils/v4l2-tracer/trace-helper.cpp | 40 +++++++++++++++++++++---------
1 file changed, 28 insertions(+), 12 deletions(-)
diff --git a/utils/v4l2-tracer/trace-helper.cpp b/utils/v4l2-tracer/trace-helper.cpp
index 6c296dbf..a59d7761 100644
--- a/utils/v4l2-tracer/trace-helper.cpp
+++ b/utils/v4l2-tracer/trace-helper.cpp
@@ -6,6 +6,11 @@
#include "trace.h"
#include <math.h>
+extern "C" {
+#include "codec-v4l2-fwht.h"
+}
+
+
struct trace_context ctx_trace = {};
bool is_video_or_media_device(const char *path)
@@ -233,18 +238,29 @@ void print_buffers_trace(void)
unsigned get_expected_length_trace()
{
- /*
- * TODO: this assumes that the stride is equal to the real width and that the
- * padding follows the end of the chroma plane. It could be improved by
- * following the model in v4l2-ctl-streaming.cpp read_write_padded_frame()
- */
- unsigned expected_length = ctx_trace.width * ctx_trace.height;
- if (ctx_trace.pixelformat == V4L2_PIX_FMT_NV12 || ctx_trace.pixelformat == V4L2_PIX_FMT_YUV420) {
- expected_length *= 3;
- expected_length /= 2;
- expected_length += (expected_length % 2);
- }
- return expected_length;
+ const auto *info = v4l2_fwht_find_pixfmt(ctx_trace.pixelformat);
+ if (!info)
+ return 0;
+
+ unsigned coded_height = ctx_trace.height;
+ unsigned expected = 0;
+
+ for (unsigned plane_idx = 0; plane_idx < info->planes_num; ++plane_idx) {
+ unsigned stride = ctx_trace.plane_bytesperline[plane_idx];
+
+ bool is_chroma = (plane_idx == 1 || plane_idx == 2);
+ unsigned h_div = is_chroma ? info->height_div : 1;
+
+ if (info->planes_num == 3 && plane_idx == 1)
+ stride /= 2;
+
+ if (plane_idx == 1 &&
+ (info->id == V4L2_PIX_FMT_NV24 || info->id == V4L2_PIX_FMT_NV42))
+ stride *= 2;
+
+ expected += stride * (coded_height / h_div);
+ }
+ return expected;
}
void s_ext_ctrls_setup(struct v4l2_ext_controls *ext_controls)
--
2.43.0
^ permalink raw reply related [flat|nested] 4+ messages in thread
* Re: [PATCH v4l-utils 2/2] calculate expected length using v4l2-fwht info
2026-03-16 13:22 ` [PATCH v4l-utils 2/2] calculate expected length using v4l2-fwht info Sarah Gershuni
@ 2026-03-17 12:10 ` Hans Verkuil
0 siblings, 0 replies; 4+ messages in thread
From: Hans Verkuil @ 2026-03-17 12:10 UTC (permalink / raw)
To: Sarah Gershuni, linux-media
Hi Sarah,
On 16/03/2026 14:22, Sarah Gershuni wrote:
> Update get_expected_length_trace to calculate the expected buffer length
> based on v4l2_fwht_find_pixfmt info.
>
> Signed-off-by: Sarah Gershuni <sarah556726@gmail.com>
> ---
> utils/v4l2-tracer/trace-helper.cpp | 40 +++++++++++++++++++++---------
> 1 file changed, 28 insertions(+), 12 deletions(-)
>
> diff --git a/utils/v4l2-tracer/trace-helper.cpp b/utils/v4l2-tracer/trace-helper.cpp
> index 6c296dbf..a59d7761 100644
> --- a/utils/v4l2-tracer/trace-helper.cpp
> +++ b/utils/v4l2-tracer/trace-helper.cpp
> @@ -6,6 +6,11 @@
> #include "trace.h"
> #include <math.h>
>
> +extern "C" {
> +#include "codec-v4l2-fwht.h"
> +}
> +
> +
> struct trace_context ctx_trace = {};
>
> bool is_video_or_media_device(const char *path)
> @@ -233,18 +238,29 @@ void print_buffers_trace(void)
>
> unsigned get_expected_length_trace()
> {
> - /*
> - * TODO: this assumes that the stride is equal to the real width and that the
> - * padding follows the end of the chroma plane. It could be improved by
> - * following the model in v4l2-ctl-streaming.cpp read_write_padded_frame()
> - */
> - unsigned expected_length = ctx_trace.width * ctx_trace.height;
> - if (ctx_trace.pixelformat == V4L2_PIX_FMT_NV12 || ctx_trace.pixelformat == V4L2_PIX_FMT_YUV420) {
> - expected_length *= 3;
> - expected_length /= 2;
> - expected_length += (expected_length % 2);
> - }
> - return expected_length;
> + const auto *info = v4l2_fwht_find_pixfmt(ctx_trace.pixelformat);
> + if (!info)
> + return 0;
> +
> + unsigned coded_height = ctx_trace.height;
> + unsigned expected = 0;
> +
> + for (unsigned plane_idx = 0; plane_idx < info->planes_num; ++plane_idx) {
> + unsigned stride = ctx_trace.plane_bytesperline[plane_idx];
Ah, this does not work. All the pixelformats that v4l2_fwht_find_pixfmt knows are
all single buffer formats, i.e. all planes are combined in a single buffer.
So there is also just one bytesperline value.
I know, it's very confusing: the _MPLANE buffer types should really be called
_MBUFFER in hindsight. I.e. each plane has its own buffer as opposed to
concatenating all planes in a single buffer.
I'm not sure what problem you are attempting to fix, but I don't think this does
what you want it to do.
Although patch 1/2 looks fine, I'll drop both patches since it makes no sense
in combination with this patch.
It really only makes sense for multiplanar pixelformats like V4L2_PIX_FMT_NV12M,
V4L2_PIX_FMT_YUV420M, etc., but that's not what this second patch deals with.
Regards,
Hans
> +
> + bool is_chroma = (plane_idx == 1 || plane_idx == 2);
> + unsigned h_div = is_chroma ? info->height_div : 1;
> +
> + if (info->planes_num == 3 && plane_idx == 1)
> + stride /= 2;
> +
> + if (plane_idx == 1 &&
> + (info->id == V4L2_PIX_FMT_NV24 || info->id == V4L2_PIX_FMT_NV42))
> + stride *= 2;
> +
> + expected += stride * (coded_height / h_div);
> + }
> + return expected;
> }
>
> void s_ext_ctrls_setup(struct v4l2_ext_controls *ext_controls)
^ permalink raw reply [flat|nested] 4+ messages in thread
end of thread, other threads:[~2026-03-17 12:10 UTC | newest]
Thread overview: 4+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2026-03-16 13:22 [PATCH v4l-utils 0/2] v4l2-tracer: fix expected frame length calculation Sarah Gershuni
2026-03-16 13:22 ` [PATCH v4l-utils 1/2] add plane_bytesperline to trace_context Sarah Gershuni
2026-03-16 13:22 ` [PATCH v4l-utils 2/2] calculate expected length using v4l2-fwht info Sarah Gershuni
2026-03-17 12:10 ` Hans Verkuil
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox