[PATCH 2/3] v4l2: printings for all buf types
Edgar Kaziahmedov
edos at linux.com
Wed Mar 29 20:55:43 UTC 2017
* v4l2.c: add meaningful and informative printings for all
v4l2 buf types in the 'print_v4l2_format_fmt' routine,
implementation print_v4l2_clip routine to print the clips field
in case of the overlay type buf
* xlat/v4l2_vbi_flags.in: new flags for and V4L2_BUF_TYPE_VBI*
* xlat/v4l2_sliced_flags.in: new flags for V4L2_BUF_TYPE_SLICED*
Signed-off-by: Edgar Kaziahmedov <edos at linux.com>
---
v4l2.c | 107 ++++++++++++++++++++++++++++++++++++----------
xlat/v4l2_sliced_flags.in | 6 +++
xlat/v4l2_vbi_flags.in | 6 +++
3 files changed, 97 insertions(+), 22 deletions(-)
create mode 100644 xlat/v4l2_sliced_flags.in
create mode 100644 xlat/v4l2_vbi_flags.in
diff --git a/v4l2.c b/v4l2.c
index 637e8788..879f1728 100644
--- a/v4l2.c
+++ b/v4l2.c
@@ -30,6 +30,7 @@
#include "defs.h"
#include DEF_MPERS_TYPE(struct_v4l2_buffer)
+#include DEF_MPERS_TYPE(struct_v4l2_clip)
#include DEF_MPERS_TYPE(struct_v4l2_create_buffers)
#include DEF_MPERS_TYPE(struct_v4l2_ext_control)
#include DEF_MPERS_TYPE(struct_v4l2_ext_controls)
@@ -44,6 +45,7 @@
#include <linux/videodev2.h>
typedef struct v4l2_buffer struct_v4l2_buffer;
+typedef struct v4l2_clip struct_v4l2_clip;
typedef struct v4l2_create_buffers struct_v4l2_create_buffers;
typedef struct v4l2_ext_control struct_v4l2_ext_control;
typedef struct v4l2_ext_controls struct_v4l2_ext_controls;
@@ -200,10 +202,22 @@ print_v4l2_fmtdesc(struct tcb *const tcp, const kernel_ulong_t arg)
#include "xlat/v4l2_fields.h"
#include "xlat/v4l2_colorspaces.h"
+#include "xlat/v4l2_vbi_flags.h"
+#include "xlat/v4l2_sliced_flags.h"
-static void
-print_v4l2_format_fmt(const char *prefix, const struct_v4l2_format *f)
+static bool
+print_v4l2_clip(struct tcb *tcp, void *elem_buf, size_t elem_size, void* data)
+{
+ const struct_v4l2_clip *p = elem_buf;
+ tprintf(FMT_RECT, ARGS_RECT(p->c));
+ return true;
+}
+
+static bool
+print_v4l2_format_fmt(struct tcb *const tcp, const char *prefix,
+ const struct_v4l2_format *f)
{
+ bool ret = true;
switch (f->type) {
case V4L2_BUF_TYPE_VIDEO_CAPTURE:
case V4L2_BUF_TYPE_VIDEO_OUTPUT:
@@ -244,42 +258,88 @@ print_v4l2_format_fmt(const char *prefix, const struct_v4l2_format *f)
f->fmt.pix_mp.plane_fmt[i].sizeimage,
f->fmt.pix_mp.plane_fmt[i].bytesperline);
}
- tprintf("], num_planes=%u}", (unsigned) f->fmt.pix_mp.num_planes);
+ tprintf("], num_planes=%u}",
+ (unsigned) f->fmt.pix_mp.num_planes);
break;
}
#endif
-
- /* TODO: Complete this switch statement */
-#if 0
- case V4L2_BUF_TYPE_VIDEO_OVERLAY:
-#if HAVE_DECL_V4L2_BUF_TYPE_VIDEO_OUTPUT_OVERLAY
+ /* OUTPUT_OVERLAY since Linux 2.6.22 */
case V4L2_BUF_TYPE_VIDEO_OUTPUT_OVERLAY:
-#endif
+ case V4L2_BUF_TYPE_VIDEO_OVERLAY: {
+ struct_v4l2_clip clip;
tprints(prefix);
- tprints("fmt.win={???}");
+ tprintf("fmt.win={left=%d, top=%d, width=%u, height=%u, field=",
+ ARGS_RECT(f->fmt.win.w));
+ printxval(v4l2_fields, f->fmt.win.field, "V4L2_FIELD_???");
+ tprintf(", chromakey=%#x, clips=", f->fmt.win.chromakey);
+ ret = print_array(tcp, ptr_to_kulong(f->fmt.win.clips),
+ f->fmt.win.clipcount, &clip, sizeof(clip),
+ umoven_or_printaddr, print_v4l2_clip, 0);
+ tprintf(", clipcount=%u, bitmap=", f->fmt.win.clipcount);
+ printaddr(ptr_to_kulong(f->fmt.win.bitmap));
+ tprintf(", global_alpha=%#x}", f->fmt.win.global_alpha);
break;
-
+ }
+ /* both since Linux 2.5.46 */
case V4L2_BUF_TYPE_VBI_CAPTURE:
case V4L2_BUF_TYPE_VBI_OUTPUT:
tprints(prefix);
- tprints("fmt.vbi={???}");
+ tprintf("fmt.vbi={sampling_rate=%u, offset=%u, "
+ "samples_per_line=%u, sample_format=",
+ f->fmt.vbi.sampling_rate, f->fmt.vbi.offset,
+ f->fmt.vbi.samples_per_line);
+ print_pixelformat(f->fmt.vbi.sample_format);
+ tprintf(", start=[%u, %u], count=[%u, %u], ",
+ f->fmt.vbi.start[0], f->fmt.vbi.start[1],
+ f->fmt.vbi.count[0], f->fmt.vbi.count[1]);
+ tprints("flags=");
+ printxval(v4l2_vbi_flags, f->fmt.vbi.flags, "V4L2_VBI_???");
+ tprintf("}");
break;
-
+ /* both since Linux 2.5.46 */
case V4L2_BUF_TYPE_SLICED_VBI_CAPTURE:
- case V4L2_BUF_TYPE_SLICED_VBI_OUTPUT:
+ case V4L2_BUF_TYPE_SLICED_VBI_OUTPUT: {
+ unsigned int i, j;
+
tprints(prefix);
- tprints("fmt.sliced={???}");
+ tprints("fmt.sliced={service_set=");
+ printxval(v4l2_sliced_flags, f->fmt.sliced.service_set,
+ "V4L2_SLICED_???");
+ tprintf(", io_size=%u, service_lines=[",
+ f->fmt.sliced.io_size);
+ for (i = 0; i < ARRAY_SIZE(f->fmt.sliced.service_lines); i++) {
+ if (i > 0)
+ tprints(", ");
+ tprints("[");
+ for (j = 0;
+ j < ARRAY_SIZE(f->fmt.sliced.service_lines[0]);
+ j++) {
+ if (j > 0)
+ tprints(", ");
+ tprintf("%#x",
+ f->fmt.sliced.service_lines[i][j]);
+ }
+ tprints("]");
+ }
+ tprintf("]}");
break;
-
+ }
+ /* since Linux 4.4 */
+#if HAVE_DECL_V4L2_BUF_TYPE_SDR_OUTPUT
+ case V4L2_BUF_TYPE_SDR_OUTPUT:
+#endif
+ /* since Linux 3.15 */
#if HAVE_DECL_V4L2_BUF_TYPE_SDR_CAPTURE
case V4L2_BUF_TYPE_SDR_CAPTURE:
- case V4L2_BUF_TYPE_SDR_OUTPUT:
tprints(prefix);
- tprints("fmt.sdr={???}");
+ tprints("fmt.sdr={pixelformat=");
+ print_pixelformat(f->fmt.sdr.pixelformat);
+ tprintf(", buffersize=%u}",
+ f->fmt.sdr.buffersize);
break;
#endif
-#endif
}
+ return ret;
}
static int
@@ -296,11 +356,14 @@ print_v4l2_format(struct tcb *const tcp, const kernel_ulong_t arg,
printxval(v4l2_buf_types, f.type, "V4L2_BUF_TYPE_???");
if (is_get)
return 0;
- print_v4l2_format_fmt(", ", &f);
+ if (!print_v4l2_format_fmt(tcp, ", ", &f)) {
+ tprints("}");
+ return RVAL_DECODED | 1;
+ }
} else {
if (!syserror(tcp) && !umove(tcp, arg, &f)) {
const char *delim = is_get ? ", " : " => ";
- print_v4l2_format_fmt(delim, &f);
+ print_v4l2_format_fmt(tcp, delim, &f);
}
tprints("}");
}
@@ -822,7 +885,7 @@ print_v4l2_create_buffers(struct tcb *const tcp, const kernel_ulong_t arg)
tprints(", format={type=");
printxval(v4l2_buf_types, b.format.type,
"V4L2_BUF_TYPE_???");
- print_v4l2_format_fmt(", ",
+ print_v4l2_format_fmt(tcp, ", ",
(struct_v4l2_format *) &b.format);
tprints("}}");
return 0;
diff --git a/xlat/v4l2_sliced_flags.in b/xlat/v4l2_sliced_flags.in
new file mode 100644
index 00000000..baff2e26
--- /dev/null
+++ b/xlat/v4l2_sliced_flags.in
@@ -0,0 +1,6 @@
+V4L2_SLICED_TELETEXT_B
+V4L2_SLICED_VPS
+V4L2_SLICED_CAPTION_525
+V4L2_SLICED_WSS_625
+V4L2_SLICED_VBI_525
+V4L2_SLICED_VBI_625
diff --git a/xlat/v4l2_vbi_flags.in b/xlat/v4l2_vbi_flags.in
new file mode 100644
index 00000000..b367e606
--- /dev/null
+++ b/xlat/v4l2_vbi_flags.in
@@ -0,0 +1,6 @@
+V4L2_VBI_UNSYNC
+V4L2_VBI_INTERLACED
+V4L2_VBI_ITU_525_F1_START
+V4L2_VBI_ITU_525_F2_START
+V4L2_VBI_ITU_625_F1_START
+V4L2_VBI_ITU_625_F2_START
--
2.11.0
More information about the Strace-devel
mailing list