The commit adds meaningful and informative printings for all
v4l2 buf types in the 'print_v4l2_format_fmt' routine.

Signed-off-by: Edgar Kaziahmedov <e...@linux.com>
---
 v4l2.c | 110 +++++++++++++++++++++++++++++++++++++++++++++++++++--------------
 1 file changed, 86 insertions(+), 24 deletions(-)

diff --git a/v4l2.c b/v4l2.c
index 637e8788..c7127961 100644
--- a/v4l2.c
+++ b/v4l2.c
@@ -51,6 +51,7 @@ typedef struct v4l2_format struct_v4l2_format;
 typedef struct v4l2_framebuffer struct_v4l2_framebuffer;
 typedef struct v4l2_input struct_v4l2_input;
 typedef struct v4l2_standard struct_v4l2_standard;
+typedef struct v4l2_clip struct_v4l2_clip;
 
 #include MPERS_DEFS
 
@@ -200,10 +201,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:
@@ -220,8 +233,8 @@ print_v4l2_format_fmt(const char *prefix, const 
struct_v4l2_format *f)
                tprints("}");
                break;
 #if HAVE_DECL_V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE
-       case V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE:
-       case V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE: {
+       case V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE:
+       case V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE: {
                unsigned int i, max;
 
                tprints(prefix);
@@ -244,42 +257,89 @@ 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
-       case V4L2_BUF_TYPE_VIDEO_OUTPUT_OVERLAY:
-#endif
+       case V4L2_BUF_TYPE_VIDEO_OVERLAY:
+       case V4L2_BUF_TYPE_VIDEO_OUTPUT_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_ignore_syserror,
+                                 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;
-
+       }
+#endif
+#if HAVE_DECL_V4L2_BUF_TYPE_VBI_CAPTURE
        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(", reserved=%#x,%#x}", f->fmt.vbi.reserved[0],
+                       f->fmt.vbi.reserved[1]);
                break;
-
+#endif
+#if HAVE_DECL_V4L2_BUF_TYPE_SLICED_VBI_CAPTURE
        case V4L2_BUF_TYPE_SLICED_VBI_CAPTURE:
-       case V4L2_BUF_TYPE_SLICED_VBI_OUTPUT:
+       case V4L2_BUF_TYPE_SLICED_VBI_OUTPUT: {
+               unsigned int i;
+
                tprints(prefix);
-               tprints("fmt.sliced={???}");
-               break;
+               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);
+               /* I'm sorry for this magic constant, but standard headers
+                * doesn't contain the corresponding define for
+                * v4l2_sliced_vbi_format
+               */
+               for (i = 0; i < 24; i++) {
+                       if (i > 0)
+                               tprints(", ");
+                       tprintf("{line[%u]=%#x, %#x}", i,
+                               f->fmt.sliced.service_lines[0][i],
+                               f->fmt.sliced.service_lines[1][i]);
+               }
+               tprintf("], reserved=%#x,%#x}",
+                       f->fmt.sliced.reserved[0],
+                       f->fmt.sliced.reserved[1]);
 
+               break;
+       }
+#endif
 #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
@@ -287,7 +347,7 @@ print_v4l2_format(struct tcb *const tcp, const 
kernel_ulong_t arg,
                  const bool is_get)
 {
        struct_v4l2_format f;
-
+       bool fail = false;
        if (entering(tcp)) {
                tprints(", ");
                if (umove_or_printaddr(tcp, arg, &f))
@@ -296,14 +356,16 @@ 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);
+               fail = !print_v4l2_format_fmt(tcp, ", ", &f);
        } else {
                if (!syserror(tcp) && !umove(tcp, arg, &f)) {
                        const char *delim = is_get ? ", " : " => ";
-                       print_v4l2_format_fmt(delim, &f);
+                       fail = !print_v4l2_format_fmt(tcp, delim, &f);
                }
                tprints("}");
        }
+       if (fail)
+               return RVAL_DECODED | 1;
        return 1;
 }
 
@@ -822,7 +884,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;
-- 
2.11.0


------------------------------------------------------------------------------
Check out the vibrant tech community on one of the world's most
engaging tech sites, Slashdot.org! http://sdm.link/slashdot
_______________________________________________
Strace-devel mailing list
Strace-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/strace-devel

Reply via email to