+#include "xlat/v4l2_device_capabilities_flags.h"
+
+static int
+print_v4l2_capability(struct tcb *const tcp, const kernel_ulong_t arg)
+{
+ struct v4l2_capability caps;
+
+ if (entering(tcp))
+ return 0;
+ tprints(", ");
+ if (umove_or_printaddr(tcp, arg, &caps))
+ return 1;
+ tprints("{driver=");
+ print_quoted_string((const char *) caps.driver,
+ sizeof(caps.driver), QUOTE_0_TERMINATED);
+ tprints(", card=");
+ print_quoted_string((const char *) caps.card,
+ sizeof(caps.card), QUOTE_0_TERMINATED);
+ tprints(", bus_info=");
+ print_quoted_string((const char *) caps.bus_info,
+ sizeof(caps.bus_info), QUOTE_0_TERMINATED);
+ tprintf(", version=%u.%u.%u, capabilities=",
+ (caps.version >> 16) & 0xFF,
+ (caps.version >> 8) & 0xFF,
+ caps.version & 0xFF);
+ printflags(v4l2_device_capabilities_flags, caps.capabilities,
+ "V4L2_CAP_???");
+#ifdef V4L2_CAP_DEVICE_CAPS
+ tprints(", device_caps=");
+ printflags(v4l2_device_capabilities_flags, caps.device_caps,
+ "V4L2_CAP_???");
+#endif
+ tprints("}");
+ return 1;
+}
+
+#include "xlat/v4l2_buf_types.h"
+#include "xlat/v4l2_format_description_flags.h"
+
+static int
+print_v4l2_fmtdesc(struct tcb *const tcp, const kernel_ulong_t arg)
+{
+ struct v4l2_fmtdesc f;
+
+ if (entering(tcp)) {
+ tprints(", ");
+ if (umove_or_printaddr(tcp, arg, &f))
+ return RVAL_DECODED | 1;
+ tprintf("{index=%u, type=", f.index);
+ printxval(v4l2_buf_types, f.type, "V4L2_BUF_TYPE_???");
+ return 0;
+ }
+
+ if (!syserror(tcp) && !umove(tcp, arg, &f)) {
+ tprints(", flags=");
+ printflags(v4l2_format_description_flags, f.flags,
+ "V4L2_FMT_FLAG_???");
+ tprints(", description=");
+ print_quoted_string((const char *) f.description,
+ sizeof(f.description),
+ QUOTE_0_TERMINATED);
+ tprints(", pixelformat=");
+ print_pixelformat(f.pixelformat);
+ }
+ tprints("}");
+ return 1;
+}
+
+#include "xlat/v4l2_fields.h"
+#include "xlat/v4l2_colorspaces.h"
+
+static void
+print_v4l2_format_fmt(const char *prefix, const struct_v4l2_format *f)